Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 6 from a total of 6 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Add On Chain Sig... | 12878302 | 1287 days ago | IN | 0 ETH | 0.01410493 | ||||
Set Latest Signe... | 12860790 | 1290 days ago | IN | 0 ETH | 0.0018186 | ||||
Set Latest Signe... | 12828985 | 1295 days ago | IN | 0 ETH | 0.0019052 | ||||
Set Latest Signe... | 12823220 | 1296 days ago | IN | 0 ETH | 0.00157179 | ||||
Set Latest Signe... | 12809873 | 1298 days ago | IN | 0 ETH | 0.00107155 | ||||
Safe Mint | 12809482 | 1298 days ago | IN | 0 ETH | 0.00419902 |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
BitSig
Compiler Version
v0.8.6+commit.11564f7e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-07-11 */ // File: @openzeppelin/contracts/utils/introspection/IERC165.sol pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 tokenId) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external; } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/utils/Address.sol pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/utils/Context.sol pragma solidity ^0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File: @openzeppelin/contracts/utils/Strings.sol pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant alphabet = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = alphabet[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping (uint256 => address) private _owners; // Mapping owner address to token count mapping (address => uint256) private _balances; // Mapping from token ID to approved address mapping (uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping (address => mapping (address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor (string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ''; } /** * @dev Base URI for computing {tokenURI}. Empty by default, can be overriden * in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require(_msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom(address from, address to, uint256 tokenId) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer(address from, address to, uint256 tokenId, bytes memory _data) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint(address to, uint256 tokenId, bytes memory _data) internal virtual { _mint(to, tokenId); require(_checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer(address from, address to, uint256 tokenId) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { // solhint-disable-next-line no-inline-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. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual { } } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol pragma solidity ^0.8.0; /** * @dev ERC721 token with storage based token URI management. */ abstract contract ERC721URIStorage is ERC721 { using Strings for uint256; // Optional mapping for token URIs mapping (uint256 => string) private _tokenURIs; /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721URIStorage: URI query for nonexistent token"); string memory _tokenURI = _tokenURIs[tokenId]; string memory base = _baseURI(); // If there is no base URI, return the token URI. if (bytes(base).length == 0) { return _tokenURI; } // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked). if (bytes(_tokenURI).length > 0) { return string(abi.encodePacked(base, _tokenURI)); } return super.tokenURI(tokenId); } /** * @dev Sets `_tokenURI` as the tokenURI of `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual { require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token"); _tokenURIs[tokenId] = _tokenURI; } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual override { super._burn(tokenId); if (bytes(_tokenURIs[tokenId]).length != 0) { delete _tokenURIs[tokenId]; } } } // File: @openzeppelin/contracts/security/Pausable.sol pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor () { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // File: @openzeppelin/contracts/access/Ownable.sol pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Burnable.sol pragma solidity ^0.8.0; /** * @title ERC721 Burnable Token * @dev ERC721 Token that can be irreversibly burned (destroyed). */ abstract contract ERC721Burnable is Context, ERC721 { /** * @dev Burns `tokenId`. See {ERC721-_burn}. * * Requirements: * * - The caller must own `tokenId` or be an approved operator. */ function burn(uint256 tokenId) public virtual { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved"); _burn(tokenId); } } // File: @openzeppelin/contracts/utils/math/SafeMath.sol pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } // File: src/contracts/BitSig.sol pragma solidity ^0.8.0; // SPDX-License-Identifier: MIT /** * * , __ * /|/ \o () o * | __/ _|_ /\ __, * | \| | / \| / | * |(__/|_/|_//(__/|_/\_/|/ * /| * \| * **/ contract BitSig is ERC721Burnable, ERC721URIStorage, Pausable, Ownable { using SafeMath for uint256; uint256 public tokensMinted; mapping(uint256 => address) public tokenCreator; // Who created the token. mapping(uint256 => string) public tokenCreatorMessage; // Optional message that token creator can add to be on chain. mapping(uint256 => uint256) public tokenCreatorRoyalty; // Royalty given for token creator (0-100). mapping(uint256 => uint256) public signersRoyalty; // Royalty given to signers pool (0-100). mapping(uint256 => uint256) public VIPSignersRoyalty; // Royalty given to VIP Signers pool (0-100). mapping(uint256 => uint256) public maxNumberSigners; // Max number of signers for the token. mapping(uint256 => address[]) public VIPSigners; // VIP signers have their own reserved royalty pool. mapping(uint256 => uint256[]) public VIPSignerPercentages; // What percentage of the VIPSignersRoyalty each VIP signer gets. // This points to the latest known head of the signers ipfs linked list. // Not necessaily the latest, but the latest that the blockchain knows of. mapping(uint256 => string) public signersLink; // Link to something that shows proof of signers having been paid. // This is most likely a transaction hash but can be something else mapping(uint256 => string) public paidSignersProof; // Community links exist as a standalone decentrilized system to maintain the head // of the signers linked list. // Community members can sign and submit their versions of the signatures list. // The token owner can then accept one of those links as being the valid one. // Without this, if the centrilized system of keeping track of signatures goes down then // there will be no place for signers to add their off-chain signatures. mapping(uint256 => string[]) public signersCommunityLinks; // Have the signers be on-chain instead of off-chain on ipfs. // For use when there are less signers and higher security is needed. // A lot more expensive to store signers in contract. // onlyOwnerAddsOnChainSigs regulates if only the token owner can add on chain signers, or anybody can. mapping(uint256 => address[]) public onChainTokenSigners; mapping(uint256 => mapping(address => string)) public onChainTokenSignerMessage; mapping(uint256 => mapping(address => string)) public onChainTokenSignerSignatureHash; mapping(uint256 => bool) public onlyOwnerAddsOnChainSigs; // If false, anyone can sign the token on-chain. // External NFTs can be wrapped by BitSig NFTs. // The owner of the BitSig NFT must also own the external NFT to wrap it. // With this, a BitSig NFT can act as a signing layer over any existing NFT. mapping(uint256 => address) public wrappedNFTAddress; // Contract address of wrapped NFT mapping(uint256 => uint256) public wrappedNFTId; // Token ID of wrapped NFT mapping(bytes32 => uint256) public wrappedNFTs; // Hash of address and tokenID to BitSig tokenID // Events event SignersLinkSet (uint256 date, string indexed link, address indexed sender, uint256 indexed tokenId); event PaidSignersProofSet (uint256 date, string indexed proof, address indexed sender, uint256 indexed tokenId); event VIPSignersSet (uint256 date, address indexed sender, uint256 indexed tokenId); event SignersCommunityLinkAdd (uint256 date, string indexed link, address indexed sender, uint256 indexed tokenId); event AcceptedSignersCommunityLink (uint256 date, string indexed link, address indexed sender, uint256 indexed tokenId); event DeletedAllSignersCommunityLinks (uint256 date, address indexed sender, uint256 indexed tokenId); event OnlyOwnerAddsOnChainSigsSet (uint256 date, address indexed sender, uint256 indexed tokenId); event OnChainSignaturesAdded (uint256 date, address indexed sender, uint256 indexed tokenId); event ExternalNFTWrapped (uint256 date, uint256 indexed tokenId, address indexed externalTokenAddress, uint256 indexed externalTokenId); constructor() ERC721("BitSig", "BITSIG") {} function pause() public onlyOwner { _pause(); } function unpause() public onlyOwner { _unpause(); } function safeMint(uint256 _tokenId, uint256 _tokenCreatorRoyalty, uint256 _signersRoyalty, uint256 _VIPSignersRoyalty, uint256 _maxNumberSigners, bool _onlyOwnerAddsOnChainSigs, string memory tokenURI_, string memory _tokenCreatorMessage) public whenNotPaused { require(_tokenCreatorRoyalty >= 0 && _signersRoyalty >= 0 && _VIPSignersRoyalty >= 0, "Royalty must not be less than 0"); require(_signersRoyalty.add(_VIPSignersRoyalty).add(_tokenCreatorRoyalty) <= 100, "Royalties add up to over 100"); require(_maxNumberSigners >= 0, "Max number of signers must not be negative."); require(!_exists(_tokenId), "Token ID already exists."); tokensMinted+=1; tokenCreator[_tokenId] = msg.sender; tokenCreatorRoyalty[_tokenId] = _tokenCreatorRoyalty; signersRoyalty[_tokenId] = _signersRoyalty; VIPSignersRoyalty[_tokenId] = _VIPSignersRoyalty; maxNumberSigners[_tokenId] = _maxNumberSigners; onlyOwnerAddsOnChainSigs[_tokenId] = _onlyOwnerAddsOnChainSigs; tokenCreatorMessage[_tokenId] = _tokenCreatorMessage; _safeMint(msg.sender, _tokenId); _setTokenURI(_tokenId, tokenURI_); } // Minting can be done by another contract which can set the tokenCreator . function safeMint(uint256 _tokenId, address _tokenOwner, uint256 _tokenCreatorRoyalty, uint256 _signersRoyalty, uint256 _VIPSignersRoyalty, uint256 _maxNumberSigners, bool _onlyOwnerAddsOnChainSigs, string memory tokenURI_, string memory _tokenCreatorMessage) public whenNotPaused { require(_tokenCreatorRoyalty >= 0 && _signersRoyalty >= 0 && _VIPSignersRoyalty >= 0, "Royalty must not be less than 0"); require(_signersRoyalty.add(_VIPSignersRoyalty).add(_tokenCreatorRoyalty) <= 100, "Royalties add up to over 100"); require(_maxNumberSigners >= 0, "Max number of signers must not be negative."); require(!_exists(_tokenId), "Token ID already exists."); tokensMinted+=1; tokenCreatorRoyalty[_tokenId] = _tokenCreatorRoyalty; signersRoyalty[_tokenId] = _signersRoyalty; VIPSignersRoyalty[_tokenId] = _VIPSignersRoyalty; maxNumberSigners[_tokenId] = _maxNumberSigners; onlyOwnerAddsOnChainSigs[_tokenId] = _onlyOwnerAddsOnChainSigs; tokenCreatorMessage[_tokenId] = _tokenCreatorMessage; _safeMint(msg.sender, _tokenId); _setTokenURI(_tokenId, tokenURI_); tokenCreator[_tokenId] = _tokenOwner; safeTransferFrom(msg.sender, _tokenOwner, _tokenId); } function _beforeTokenTransfer(address from, address to, uint256 _tokenId) internal whenNotPaused override { super._beforeTokenTransfer(from, to, _tokenId); } function _burn(uint256 _tokenId) internal override(ERC721, ERC721URIStorage) { require(msg.sender == ownerOf(_tokenId)); super._burn(_tokenId); } function tokenURI(uint256 _tokenId) public view override(ERC721, ERC721URIStorage) returns (string memory) { return super.tokenURI(_tokenId); } // Holds the last known link to the "head" with the latest signers. The signing pages form a sort of linked list // where the latest one has the link of the previous. To ensure that the linked list of signer versions is the // right one, set the latest one here. Then the blockchain history can be used to verify that the linked list is // the correct one. function setLatestSignersLink(string memory _link, uint256 _tokenId) public whenNotPaused { require(_isApprovedOrOwner(msg.sender, _tokenId), "Only owner or approved address can modify."); signersLink[_tokenId] = _link; emit SignersLinkSet(block.timestamp, _link, msg.sender, _tokenId); } // Once the token is transfered, it won't hold value in the eyes of the community unless its new owner // submits the proof of the signers having been paid. function setPaidSignersProof(string memory _proof, uint256 _tokenId) public whenNotPaused { require(_isApprovedOrOwner(msg.sender, _tokenId), "Only owner or approved address can modify."); paidSignersProof[_tokenId] = _proof; emit PaidSignersProofSet(block.timestamp, _proof, msg.sender, _tokenId); } function setVIPSigners(address[] memory signers, uint256[] memory percentages, uint256 _tokenId) public whenNotPaused { require(_isApprovedOrOwner(msg.sender, _tokenId), "Only owner or approved address can modify."); require(signers.length == percentages.length, "Signers length doesn't match percentages length."); uint256 total = 0; // verify that percentages add up to 100 for (uint i = 0; i < percentages.length; i++) { require(percentages[i] >= 0, "Percentage is under 0"); total = total.add(percentages[i]); } require(total == 100, "Percentages don't add up to 100"); VIPSigners[_tokenId] = signers; VIPSignerPercentages[_tokenId] = percentages; emit VIPSignersSet(block.timestamp, msg.sender, _tokenId); } function addToSignersCommunityLink(string memory _link, uint256 _tokenId) public whenNotPaused { signersCommunityLinks[_tokenId].push(_link); emit SignersCommunityLinkAdd(block.timestamp, _link, msg.sender, _tokenId); } // Accepts one of the signers community links and deletes the rest. function acceptASignersCommunityLink(uint256 index, uint256 _tokenId) public whenNotPaused { require(_isApprovedOrOwner(msg.sender, _tokenId), "Only owner or approved address can modify."); require(index < signersCommunityLinks[_tokenId].length, "Index not valid"); signersLink[_tokenId] = signersCommunityLinks[_tokenId][index]; delete signersCommunityLinks[_tokenId]; emit AcceptedSignersCommunityLink(block.timestamp, signersLink[_tokenId], msg.sender, _tokenId); } function deleteAllSignersCommunityLinks(uint256 _tokenId) public whenNotPaused { require(_isApprovedOrOwner(msg.sender, _tokenId), "Only owner or approved address can modify."); delete signersCommunityLinks[_tokenId]; emit DeletedAllSignersCommunityLinks(block.timestamp, msg.sender, _tokenId); } // Sets if only the owner can add to the on chain signatures. function setOnlyOwnerAddsOnChainSigs(bool approvalNeeded, uint256 _tokenId) public whenNotPaused { require(_isApprovedOrOwner(msg.sender, _tokenId), "Only owner or approved address can modify."); onlyOwnerAddsOnChainSigs[_tokenId] = approvalNeeded; emit OnlyOwnerAddsOnChainSigsSet(block.timestamp, msg.sender, _tokenId); } function addOnChainSignatures(address[] memory signers, string[] memory messages, string[] memory signatureHashes, uint256 _tokenId) public whenNotPaused { if (onlyOwnerAddsOnChainSigs[_tokenId]) { require(_isApprovedOrOwner(msg.sender, _tokenId), "Only owner or approved address can add on chain signatures."); } require(onChainTokenSigners[_tokenId].length + signers.length <= maxNumberSigners[_tokenId], "Max number of signers exceeded."); require(signers.length == messages.length && signers.length == signatureHashes.length, "Length of arrays must be equal."); for (uint i=0; i < signers.length; i++) { bytes memory emptyStringTest = bytes(onChainTokenSignerSignatureHash[_tokenId][signers[i]]); if (emptyStringTest.length == 0) { onChainTokenSigners[_tokenId].push(signers[i]); onChainTokenSignerMessage[_tokenId][signers[i]] = messages[i]; onChainTokenSignerSignatureHash[_tokenId][signers[i]] = signatureHashes[i]; emit OnChainSignaturesAdded(block.timestamp, msg.sender, _tokenId); } } } // Wraps an external NFT. // Require that this NFT isn't in array of external NFTs already connected. // Require that the msg.sender is the owner of of the external token. function wrapExternalNFT(uint256 _tokenId, address _externalNftContractAddress, uint256 _externalTokenId ) public whenNotPaused { require(msg.sender == ownerOf(_tokenId), "Only owner can connect."); bytes32 tokenHash = keccak256(abi.encodePacked(_externalNftContractAddress, _externalTokenId)); require(wrappedNFTs[tokenHash] == 0, "External NFT is already connected to some BitSig token."); ERC721 token_contract = ERC721(_externalNftContractAddress); require(token_contract.ownerOf(_externalTokenId) == ownerOf(_tokenId), "Owner of external NFT must also own this NFT."); require(wrappedNFTAddress[_tokenId] == address(0) && wrappedNFTId[_tokenId] == 0, "Token must not already be connected."); wrappedNFTs[tokenHash] = _tokenId; wrappedNFTAddress[_tokenId] = _externalNftContractAddress; wrappedNFTId[_tokenId] = _externalTokenId; emit ExternalNFTWrapped(block.timestamp, _tokenId, _externalNftContractAddress, _externalTokenId); } function getOnChainSigners(uint256 _tokenId) public view returns (address[] memory) { return onChainTokenSigners[_tokenId]; } function getVIPSigners(uint256 _tokenId) public view returns (address[] memory) { return VIPSigners[_tokenId]; } function getVIPSignerPercentages(uint256 _tokenId) public view returns (uint256[] memory) { return VIPSignerPercentages[_tokenId]; } function getSignersCommunityLinks(uint256 _tokenId) public view returns (string[] memory) { return signersCommunityLinks[_tokenId]; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"date","type":"uint256"},{"indexed":true,"internalType":"string","name":"link","type":"string"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"AcceptedSignersCommunityLink","type":"event"},{"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":false,"internalType":"uint256","name":"date","type":"uint256"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"DeletedAllSignersCommunityLinks","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"date","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"externalTokenAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"externalTokenId","type":"uint256"}],"name":"ExternalNFTWrapped","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"date","type":"uint256"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"OnChainSignaturesAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"date","type":"uint256"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"OnlyOwnerAddsOnChainSigsSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"date","type":"uint256"},{"indexed":true,"internalType":"string","name":"proof","type":"string"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"PaidSignersProofSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"date","type":"uint256"},{"indexed":true,"internalType":"string","name":"link","type":"string"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"SignersCommunityLinkAdd","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"date","type":"uint256"},{"indexed":true,"internalType":"string","name":"link","type":"string"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"SignersLinkSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"date","type":"uint256"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"VIPSignersSet","type":"event"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"VIPSignerPercentages","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"VIPSigners","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"VIPSignersRoyalty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"acceptASignersCommunityLink","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"string[]","name":"messages","type":"string[]"},{"internalType":"string[]","name":"signatureHashes","type":"string[]"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"addOnChainSignatures","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_link","type":"string"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"addToSignersCommunityLink","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"deleteAllSignersCommunityLinks","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getOnChainSigners","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getSignersCommunityLinks","outputs":[{"internalType":"string[]","name":"","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getVIPSignerPercentages","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getVIPSigners","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"maxNumberSigners","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"onChainTokenSignerMessage","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"onChainTokenSignerSignatureHash","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"onChainTokenSigners","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"onlyOwnerAddsOnChainSigs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"","type":"uint256"}],"name":"paidSignersProof","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_tokenCreatorRoyalty","type":"uint256"},{"internalType":"uint256","name":"_signersRoyalty","type":"uint256"},{"internalType":"uint256","name":"_VIPSignersRoyalty","type":"uint256"},{"internalType":"uint256","name":"_maxNumberSigners","type":"uint256"},{"internalType":"bool","name":"_onlyOwnerAddsOnChainSigs","type":"bool"},{"internalType":"string","name":"tokenURI_","type":"string"},{"internalType":"string","name":"_tokenCreatorMessage","type":"string"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"_tokenOwner","type":"address"},{"internalType":"uint256","name":"_tokenCreatorRoyalty","type":"uint256"},{"internalType":"uint256","name":"_signersRoyalty","type":"uint256"},{"internalType":"uint256","name":"_VIPSignersRoyalty","type":"uint256"},{"internalType":"uint256","name":"_maxNumberSigners","type":"uint256"},{"internalType":"bool","name":"_onlyOwnerAddsOnChainSigs","type":"bool"},{"internalType":"string","name":"tokenURI_","type":"string"},{"internalType":"string","name":"_tokenCreatorMessage","type":"string"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_link","type":"string"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"setLatestSignersLink","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"approvalNeeded","type":"bool"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"setOnlyOwnerAddsOnChainSigs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_proof","type":"string"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"setPaidSignersProof","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"uint256[]","name":"percentages","type":"uint256[]"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"setVIPSigners","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"signersCommunityLinks","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"signersLink","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"signersRoyalty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"","type":"uint256"}],"name":"tokenCreator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenCreatorMessage","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenCreatorRoyalty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"_externalNftContractAddress","type":"address"},{"internalType":"uint256","name":"_externalTokenId","type":"uint256"}],"name":"wrapExternalNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"wrappedNFTAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"wrappedNFTId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"wrappedNFTs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040518060400160405280600681526020016542697453696760d01b8152506040518060400160405280600681526020016542495453494760d01b815250816000908051906020019062000068929190620000d2565b5080516200007e906001906020840190620000d2565b5050600780546001600160a81b0319163361010081029190911790915560405190915081906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350620001b5565b828054620000e09062000178565b90600052602060002090601f0160209004810192826200010457600085556200014f565b82601f106200011f57805160ff19168380011785556200014f565b828001600101855582156200014f579182015b828111156200014f57825182559160200191906001019062000132565b506200015d92915062000161565b5090565b5b808211156200015d576000815560010162000162565b600181811c908216806200018d57607f821691505b60208210811415620001af57634e487b7160e01b600052602260045260246000fd5b50919050565b614a6a80620001c56000396000f3fe608060405234801561001057600080fd5b50600436106103625760003560e01c80638456cb59116101c8578063b88d4fde11610104578063d08a9431116100a2578063e99a99411161007c578063e99a9941146107ee578063f2fde38b1461080e578063f40efad414610821578063fe56ac571461083457600080fd5b8063d08a94311461077f578063d2dfc46d1461079f578063e985e9c5146107b257600080fd5b8063bad85b82116100de578063bad85b8214610726578063c059721a14610739578063c8125b041461074c578063c87b56dd1461076c57600080fd5b8063b88d4fde146106ed578063b9bcbe6114610700578063bac1ff721461071357600080fd5b80639bebfefa11610171578063a22dc16a1161014b578063a22dc16a146106a1578063a24df559146106b4578063a3d79364146106c7578063a8c0e647146106da57600080fd5b80639bebfefa1461065b578063a14263001461066e578063a22cb4651461068e57600080fd5b80638dfa3d4d116101a25780638dfa3d4d1461061757806395d89b411461062a5780639bc8883f1461063257600080fd5b80638456cb59146105e657806389b756d2146105ee5780638da5cb5b1461060157600080fd5b806340ff45b6116102a257806356ae57f4116102405780636352211e1161021a5780636352211e146105af5780636de9f32b146105c257806370a08231146105cb578063715018a6146105de57600080fd5b806356ae57f414610571578063582719ab146105845780635c975abb146105a457600080fd5b8063487faea91161027c578063487faea9146105155780634d6a3619146105285780634e27aa2f1461053b578063511f9e451461054e57600080fd5b806340ff45b6146104cf57806342842e0e146104ef57806342966c681461050257600080fd5b80631f9b26d11161030f578063388b1d76116102e9578063388b1d761461046b5780633f4ba83a1461048b5780633fa0e0ba1461049357806340c1a064146104a657600080fd5b80631f9b26d1146104255780632161ec9d1461043857806323b872dd1461045857600080fd5b8063081812fc11610340578063081812fc146103d2578063095ea7b3146103fd5780631dfd34351461041257600080fd5b806301ffc9a71461036757806305b74b0e1461038f57806306fdde03146103bd575b600080fd5b61037a6103753660046142ca565b610847565b60405190151581526020015b60405180910390f35b6103af61039d3660046142b1565b600d6020526000908152604090205481565b604051908152602001610386565b6103c561092c565b604051610386919061479f565b6103e56103e03660046142b1565b6109be565b6040516001600160a01b039091168152602001610386565b61041061040b36600461410f565b610a69565b005b6104106104203660046142b1565b610b9b565b6103c56104333660046142b1565b610cbb565b6103af6104463660046142b1565b600e6020526000908152604090205481565b610410610466366004614019565b610d55565b6103af6104793660046142b1565b600b6020526000908152604090205481565b610410610ddd565b6103e56104a136600461444d565b610e47565b6103e56104b43660046142b1565b6009602052600090815260409020546001600160a01b031681565b6104e26104dd3660046142b1565b610e7f565b6040516103869190614767565b6104106104fd366004614019565b610ee1565b6104106105103660046142b1565b610efc565b6103c56105233660046142b1565b610f83565b610410610536366004614304565b610f9c565b6104106105493660046141cb565b6110e3565b61037a61055c3660046142b1565b60176020526000908152604090205460ff1681565b6103e561057f36600461444d565b6113ae565b6105976105923660046142b1565b6113ca565b604051610386919061469a565b60075460ff1661037a565b6103e56105bd3660046142b1565b611435565b6103af60085481565b6103af6105d9366004613fa6565b6114c0565b61041061155a565b610410611621565b6103c56105fc366004614349565b611689565b60075461010090046001600160a01b03166103e5565b6103c5610625366004614349565b6116ad565b6103c56116d1565b6103e56106403660046142b1565b6018602052600090815260409020546001600160a01b031681565b61041061066936600461446f565b6116e0565b61068161067c3660046142b1565b6118be565b60405161038691906146e7565b61041061069c3660046140da565b6119aa565b6104106106af36600461413b565b611a70565b6104106106c236600461444d565b611ed8565b6104106106d5366004614304565b6120c2565b6104106106e8366004614395565b612201565b6104106106fb36600461405a565b6123f3565b6103c561070e36600461444d565b612481565b6105976107213660046142b1565b6124b9565b610410610734366004614295565b612523565b61041061074736600461436e565b612641565b6103af61075a3660046142b1565b600c6020526000908152604090205481565b6103c561077a3660046142b1565b612a47565b6103af61078d3660046142b1565b601a6020526000908152604090205481565b6103c56107ad3660046142b1565b612a52565b61037a6107c0366004613fe0565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b6103af6107fc3660046142b1565b60196020526000908152604090205481565b61041061081c366004613fa6565b612a6b565b6103af61082f36600461444d565b612bc5565b610410610842366004614304565b612bf6565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd0000000000000000000000000000000000000000000000000000000014806108da57507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061092657507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b60606000805461093b90614894565b80601f016020809104026020016040519081016040528092919081815260200182805461096790614894565b80156109b45780601f10610989576101008083540402835291602001916109b4565b820191906000526020600020905b81548152906001019060200180831161099757829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610a4d5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610a7482611435565b9050806001600160a01b0316836001600160a01b03161415610afe5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610a44565b336001600160a01b0382161480610b1a5750610b1a81336107c0565b610b8c5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610a44565b610b968383612ccc565b505050565b60075460ff1615610bee5760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610a44565b610bf83382612d52565b610c6a5760405162461bcd60e51b815260206004820152602a60248201527f4f6e6c79206f776e6572206f7220617070726f7665642061646472657373206360448201527f616e206d6f646966792e000000000000000000000000000000000000000000006064820152608401610a44565b6000818152601360205260408120610c8191613bbe565b604051428152819033907f17810fed5f7e4e09bab8415197c15c4327a6de1f89b76b3f04334743c86b106f9060200160405180910390a350565b60116020526000908152604090208054610cd490614894565b80601f0160208091040260200160405190810160405280929190818152602001828054610d0090614894565b8015610d4d5780601f10610d2257610100808354040283529160200191610d4d565b820191906000526020600020905b815481529060010190602001808311610d3057829003601f168201915b505050505081565b610d60335b82612d52565b610dd25760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610a44565b610b96838383612e5a565b6007546001600160a01b03610100909104163314610e3d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a44565b610e4561304a565b565b600f6020528160005260406000208181548110610e6357600080fd5b6000918252602090912001546001600160a01b03169150829050565b600081815260106020908152604091829020805483518184028101840190945280845260609392830182828015610ed557602002820191906000526020600020905b815481526020019060010190808311610ec1575b50505050509050919050565b610b96838383604051806020016040528060008152506123f3565b610f0533610d5a565b610f775760405162461bcd60e51b815260206004820152603060248201527f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f766564000000000000000000000000000000006064820152608401610a44565b610f80816130e6565b50565b60126020526000908152604090208054610cd490614894565b60075460ff1615610fef5760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610a44565b610ff93382612d52565b61106b5760405162461bcd60e51b815260206004820152602a60248201527f4f6e6c79206f776e6572206f7220617070726f7665642061646472657373206360448201527f616e206d6f646966792e000000000000000000000000000000000000000000006064820152608401610a44565b6000818152601260209081526040909120835161108a92850190613bdc565b5080336001600160a01b0316836040516110a4919061455e565b604051908190038120428252907f1edbd98d50ddbd07f6d469d931007d63d5b83fb0474ab22b268a46dbbf83c622906020015b60405180910390a45050565b60075460ff16156111365760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610a44565b6111403382612d52565b6111b25760405162461bcd60e51b815260206004820152602a60248201527f4f6e6c79206f776e6572206f7220617070726f7665642061646472657373206360448201527f616e206d6f646966792e000000000000000000000000000000000000000000006064820152608401610a44565b81518351146112295760405162461bcd60e51b815260206004820152603060248201527f5369676e657273206c656e67746820646f65736e2774206d617463682070657260448201527f63656e7461676573206c656e6774682e000000000000000000000000000000006064820152608401610a44565b6000805b83518110156112e057600084828151811061124a5761124a614993565b602002602001015110156112a05760405162461bcd60e51b815260206004820152601560248201527f50657263656e7461676520697320756e646572203000000000000000000000006044820152606401610a44565b6112cc8482815181106112b5576112b5614993565b60200260200101518361311590919063ffffffff16565b9150806112d8816148e8565b91505061122d565b50806064146113315760405162461bcd60e51b815260206004820152601f60248201527f50657263656e746167657320646f6e27742061646420757020746f20313030006044820152606401610a44565b6000828152600f60209081526040909120855161135092870190613c60565b506000828152601060209081526040909120845161137092860190613ccd565b50604051428152829033907f3618f3a59837b68d822d75e40037d588fea6d80178b6e4bda53afaee24af7a049060200160405180910390a350505050565b60146020528160005260406000208181548110610e6357600080fd5b6000818152600f6020908152604091829020805483518184028101840190945280845260609392830182828015610ed557602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161140c5750505050509050919050565b6000818152600260205260408120546001600160a01b0316806109265760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e00000000000000000000000000000000000000000000006064820152608401610a44565b60006001600160a01b03821661153e5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610a44565b506001600160a01b031660009081526003602052604090205490565b6007546001600160a01b036101009091041633146115ba5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a44565b60075460405160009161010090046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600780547fffffffffffffffffffffff0000000000000000000000000000000000000000ff169055565b6007546001600160a01b036101009091041633146116815760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a44565b610e45613128565b601560209081526000928352604080842090915290825290208054610cd490614894565b601660209081526000928352604080842090915290825290208054610cd490614894565b60606001805461093b90614894565b60075460ff16156117335760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610a44565b6064611749886117438989613115565b90613115565b11156117975760405162461bcd60e51b815260206004820152601c60248201527f526f79616c746965732061646420757020746f206f76657220313030000000006044820152606401610a44565b6000888152600260205260409020546001600160a01b0316156117fc5760405162461bcd60e51b815260206004820152601860248201527f546f6b656e20494420616c7265616479206578697374732e00000000000000006044820152606401610a44565b60016008600082825461180f9190614825565b9091555050600088815260096020908152604080832080547fffffffffffffffffffffffff00000000000000000000000000000000000000001633179055600b82528083208a9055600c8252808320899055600d8252808320889055600e825280832087905560178252808320805487151560ff19909116179055600a8252909120825161189f92840190613bdc565b506118aa33896131b0565b6118b488836131ce565b5050505050505050565b606060136000838152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b8282101561199f57838290600052602060002001805461191290614894565b80601f016020809104026020016040519081016040528092919081815260200182805461193e90614894565b801561198b5780601f106119605761010080835404028352916020019161198b565b820191906000526020600020905b81548152906001019060200180831161196e57829003601f168201915b5050505050815260200190600101906118f3565b505050509050919050565b6001600160a01b038216331415611a035760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610a44565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191015b60405180910390a35050565b60075460ff1615611ac35760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610a44565b60008181526017602052604090205460ff1615611b5657611ae43382612d52565b611b565760405162461bcd60e51b815260206004820152603b60248201527f4f6e6c79206f776e6572206f7220617070726f7665642061646472657373206360448201527f616e20616464206f6e20636861696e207369676e6174757265732e00000000006064820152608401610a44565b6000818152600e602090815260408083205487516014909352922054611b7c9190614825565b1115611bca5760405162461bcd60e51b815260206004820152601f60248201527f4d6178206e756d626572206f66207369676e6572732065786365656465642e006044820152606401610a44565b82518451148015611bdc575081518451145b611c285760405162461bcd60e51b815260206004820152601f60248201527f4c656e677468206f6620617272617973206d75737420626520657175616c2e006044820152606401610a44565b60005b8451811015611ed157600082815260166020526040812086518290889085908110611c5857611c58614993565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000208054611c8b90614894565b80601f0160208091040260200160405190810160405280929190818152602001828054611cb790614894565b8015611d045780601f10611cd957610100808354040283529160200191611d04565b820191906000526020600020905b815481529060010190602001808311611ce757829003601f168201915b50505050509050805160001415611ebe5760008381526014602052604090208651879084908110611d3757611d37614993565b60209081029190910181015182546001810184556000938452919092200180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039092169190911790558451859083908110611d9e57611d9e614993565b6020026020010151601560008581526020019081526020016000206000888581518110611dcd57611dcd614993565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000209080519060200190611e08929190613bdc565b50838281518110611e1b57611e1b614993565b6020026020010151601660008581526020019081526020016000206000888581518110611e4a57611e4a614993565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000209080519060200190611e85929190613bdc565b50604051428152839033907fab5920b5ea4c7d901ab47ba5e3aa706b5cfdcef05e43a5cdb723e75eb4dc06429060200160405180910390a35b5080611ec9816148e8565b915050611c2b565b5050505050565b60075460ff1615611f2b5760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610a44565b611f353382612d52565b611fa75760405162461bcd60e51b815260206004820152602a60248201527f4f6e6c79206f776e6572206f7220617070726f7665642061646472657373206360448201527f616e206d6f646966792e000000000000000000000000000000000000000000006064820152608401610a44565b60008181526013602052604090205482106120045760405162461bcd60e51b815260206004820152600f60248201527f496e646578206e6f742076616c696400000000000000000000000000000000006044820152606401610a44565b600081815260136020526040902080548390811061202457612024614993565b60009182526020808320848452601190915260409092209101805461204890614894565b612053929190613d07565b50600081815260136020526040812061206b91613bbe565b6000818152601160205260409081902090518291339161208b91906145a9565b604051908190038120428252907f3233bc0b5fcb53ab38f6984267df8df5531d5cff3770a799fde52cc0dc268c6f906020016110d7565b60075460ff16156121155760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610a44565b61211f3382612d52565b6121915760405162461bcd60e51b815260206004820152602a60248201527f4f6e6c79206f776e6572206f7220617070726f7665642061646472657373206360448201527f616e206d6f646966792e000000000000000000000000000000000000000000006064820152608401610a44565b600081815260116020908152604090912083516121b092850190613bdc565b5080336001600160a01b0316836040516121ca919061455e565b604051908190038120428252907f1bf3aee8b30dbac5155216c2dfba2cd6c0d9169bae4bcc32a8883e4f695570c6906020016110d7565b60075460ff16156122545760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610a44565b6064612264886117438989613115565b11156122b25760405162461bcd60e51b815260206004820152601c60248201527f526f79616c746965732061646420757020746f206f76657220313030000000006044820152606401610a44565b6000898152600260205260409020546001600160a01b0316156123175760405162461bcd60e51b815260206004820152601860248201527f546f6b656e20494420616c7265616479206578697374732e00000000000000006044820152606401610a44565b60016008600082825461232a9190614825565b90915550506000898152600b602090815260408083208a9055600c8252808320899055600d8252808320889055600e825280832087905560178252808320805460ff1916871515179055600a8252909120825161238992840190613bdc565b50612394338a6131b0565b61239e89836131ce565b600089815260096020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038a161790556123e833898b610ee1565b505050505050505050565b6123fd3383612d52565b61246f5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610a44565b61247b84848484613277565b50505050565b6013602052816000526040600020818154811061249d57600080fd5b90600052602060002001600091509150508054610cd490614894565b600081815260146020908152604091829020805483518184028101840190945280845260609392830182828015610ed5576020028201919060005260206000209081546001600160a01b0316815260019091019060200180831161140c5750505050509050919050565b60075460ff16156125765760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610a44565b6125803382612d52565b6125f25760405162461bcd60e51b815260206004820152602a60248201527f4f6e6c79206f776e6572206f7220617070726f7665642061646472657373206360448201527f616e206d6f646966792e000000000000000000000000000000000000000000006064820152608401610a44565b600081815260176020908152604091829020805460ff19168515151790559051428152829133917fc9b4aacc0a711a75b9342c103bf2ece3b69733681cc5d6900ba8208820a748189101611a64565b60075460ff16156126945760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610a44565b61269d83611435565b6001600160a01b0316336001600160a01b0316146126fd5760405162461bcd60e51b815260206004820152601760248201527f4f6e6c79206f776e65722063616e20636f6e6e6563742e0000000000000000006044820152606401610a44565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606084901b16602082015260348101829052600090605401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000818152601a909352912054909150156127f25760405162461bcd60e51b815260206004820152603760248201527f45787465726e616c204e465420697320616c726561647920636f6e6e6563746560448201527f6420746f20736f6d652042697453696720746f6b656e2e0000000000000000006064820152608401610a44565b826127fc85611435565b6040517f6352211e000000000000000000000000000000000000000000000000000000008152600481018590526001600160a01b0391821691831690636352211e9060240160206040518083038186803b15801561285957600080fd5b505afa15801561286d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128919190613fc3565b6001600160a01b03161461290d5760405162461bcd60e51b815260206004820152602d60248201527f4f776e6572206f662065787465726e616c204e4654206d75737420616c736f2060448201527f6f776e2074686973204e46542e000000000000000000000000000000000000006064820152608401610a44565b6000858152601860205260409020546001600160a01b031615801561293e5750600085815260196020526040902054155b6129af5760405162461bcd60e51b8152602060048201526024808201527f546f6b656e206d757374206e6f7420616c726561647920626520636f6e6e656360448201527f7465642e000000000000000000000000000000000000000000000000000000006064820152608401610a44565b6000828152601a602090815260408083208890558783526018825280832080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03891690811790915560198352928190208690555142815285929188917ffd79267c9b2222d9f5ddd56c09e4b349fce0e5f493920768e836959490a0e042910160405180910390a45050505050565b606061092682613300565b600a6020526000908152604090208054610cd490614894565b6007546001600160a01b03610100909104163314612acb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a44565b6001600160a01b038116612b475760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610a44565b6007546040516001600160a01b0380841692610100900416907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600780546001600160a01b03909216610100027fffffffffffffffffffffff0000000000000000000000000000000000000000ff909216919091179055565b60106020528160005260406000208181548110612be157600080fd5b90600052602060002001600091509150505481565b60075460ff1615612c495760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610a44565b600081815260136020908152604082208054600181018255908352918190208451612c7b939190910191850190613bdc565b5080336001600160a01b031683604051612c95919061455e565b604051908190038120428252907f5b996eb46629905850eef813a20550291b6158c18c935d4807822ef9b7fe8883906020016110d7565b600081815260046020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0384169081179091558190612d1982611435565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316612ddc5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610a44565b6000612de783611435565b9050806001600160a01b0316846001600160a01b03161480612e225750836001600160a01b0316612e17846109be565b6001600160a01b0316145b80612e5257506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316612e6d82611435565b6001600160a01b031614612ee95760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e00000000000000000000000000000000000000000000006064820152608401610a44565b6001600160a01b038216612f645760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610a44565b612f6f83838361348b565b612f7a600082612ccc565b6001600160a01b0383166000908152600360205260408120805460019290612fa3908490614851565b90915550506001600160a01b0382166000908152600360205260408120805460019290612fd1908490614825565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60075460ff1661309c5760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610a44565b6007805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6130ef81611435565b6001600160a01b0316336001600160a01b03161461310c57600080fd5b610f80816134de565b60006131218284614825565b9392505050565b60075460ff161561317b5760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610a44565b6007805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586130c93390565b6131ca82826040518060200160405280600081525061351e565b5050565b6000828152600260205260409020546001600160a01b03166132585760405162461bcd60e51b815260206004820152602e60248201527f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60448201527f6578697374656e7420746f6b656e0000000000000000000000000000000000006064820152608401610a44565b60008281526006602090815260409091208251610b9692840190613bdc565b613282848484612e5a565b61328e848484846135a7565b61247b5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610a44565b6000818152600260205260409020546060906001600160a01b031661338d5760405162461bcd60e51b815260206004820152603160248201527f45524337323155524953746f726167653a2055524920717565727920666f722060448201527f6e6f6e6578697374656e7420746f6b656e0000000000000000000000000000006064820152608401610a44565b600082815260066020526040812080546133a690614894565b80601f01602080910402602001604051908101604052809291908181526020018280546133d290614894565b801561341f5780601f106133f45761010080835404028352916020019161341f565b820191906000526020600020905b81548152906001019060200180831161340257829003601f168201915b50505050509050600061343d60408051602081019091526000815290565b9050805160001415613450575092915050565b81511561348257808260405160200161346a92919061457a565b60405160208183030381529060405292505050919050565b612e5284613772565b60075460ff1615610b965760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610a44565b6134e781613867565b6000818152600660205260409020805461350090614894565b159050610f80576000818152600660205260408120610f8091613d82565b6135288383613926565b61353560008484846135a7565b610b965760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610a44565b60006001600160a01b0384163b15613767576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063150b7a029061360490339089908890889060040161465e565b602060405180830381600087803b15801561361e57600080fd5b505af192505050801561366c575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252613669918101906142e7565b60015b61371c573d80801561369a576040519150601f19603f3d011682016040523d82523d6000602084013e61369f565b606091505b5080516137145760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610a44565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050612e52565b506001949350505050565b6000818152600260205260409020546060906001600160a01b03166137ff5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006064820152608401610a44565b600061381660408051602081019091526000815290565b905060008151116138365760405180602001604052806000815250613121565b8061384084613a8c565b60405160200161385192919061457a565b6040516020818303038152906040529392505050565b600061387282611435565b90506138808160008461348b565b61388b600083612ccc565b6001600160a01b03811660009081526003602052604081208054600192906138b4908490614851565b909155505060008281526002602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6001600160a01b03821661397c5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610a44565b6000818152600260205260409020546001600160a01b0316156139e15760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610a44565b6139ed6000838361348b565b6001600160a01b0382166000908152600360205260408120805460019290613a16908490614825565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b606081613acc57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115613af65780613ae0816148e8565b9150613aef9050600a8361483d565b9150613ad0565b60008167ffffffffffffffff811115613b1157613b116149c2565b6040519080825280601f01601f191660200182016040528015613b3b576020820181803683370190505b5090505b8415612e5257613b50600183614851565b9150613b5d600a86614921565b613b68906030614825565b60f81b818381518110613b7d57613b7d614993565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350613bb7600a8661483d565b9450613b3f565b5080546000825590600052602060002090810190610f809190613dbc565b828054613be890614894565b90600052602060002090601f016020900481019282613c0a5760008555613c50565b82601f10613c2357805160ff1916838001178555613c50565b82800160010185558215613c50579182015b82811115613c50578251825591602001919060010190613c35565b50613c5c929150613dd9565b5090565b828054828255906000526020600020908101928215613c50579160200282015b82811115613c5057825182547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03909116178255602090920191600190910190613c80565b828054828255906000526020600020908101928215613c505791602002820182811115613c50578251825591602001919060010190613c35565b828054613d1390614894565b90600052602060002090601f016020900481019282613d355760008555613c50565b82601f10613d465780548555613c50565b82800160010185558215613c5057600052602060002091601f016020900482015b82811115613c50578254825591600101919060010190613d67565b508054613d8e90614894565b6000825580601f10613d9e575050565b601f016020900490600052602060002090810190610f809190613dd9565b80821115613c5c576000613dd08282613d82565b50600101613dbc565b5b80821115613c5c5760008155600101613dda565b600067ffffffffffffffff831115613e0857613e086149c2565b613e3960207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f860116016147b2565b9050828152838383011115613e4d57600080fd5b828260208301376000602084830101529392505050565b600082601f830112613e7557600080fd5b81356020613e8a613e8583614801565b6147b2565b80838252828201915082860187848660051b8901011115613eaa57600080fd5b60005b85811015613ed2578135613ec0816149f1565b84529284019290840190600101613ead565b5090979650505050505050565b600082601f830112613ef057600080fd5b81356020613f00613e8583614801565b80838252828201915082860187848660051b8901011115613f2057600080fd5b6000805b86811015613f6357823567ffffffffffffffff811115613f42578283fd5b613f508b88838d0101613f86565b8652509385019391850191600101613f24565b509198975050505050505050565b80358015158114613f8157600080fd5b919050565b600082601f830112613f9757600080fd5b61312183833560208501613dee565b600060208284031215613fb857600080fd5b8135613121816149f1565b600060208284031215613fd557600080fd5b8151613121816149f1565b60008060408385031215613ff357600080fd5b8235613ffe816149f1565b9150602083013561400e816149f1565b809150509250929050565b60008060006060848603121561402e57600080fd5b8335614039816149f1565b92506020840135614049816149f1565b929592945050506040919091013590565b6000806000806080858703121561407057600080fd5b843561407b816149f1565b9350602085013561408b816149f1565b925060408501359150606085013567ffffffffffffffff8111156140ae57600080fd5b8501601f810187136140bf57600080fd5b6140ce87823560208401613dee565b91505092959194509250565b600080604083850312156140ed57600080fd5b82356140f8816149f1565b915061410660208401613f71565b90509250929050565b6000806040838503121561412257600080fd5b823561412d816149f1565b946020939093013593505050565b6000806000806080858703121561415157600080fd5b843567ffffffffffffffff8082111561416957600080fd5b61417588838901613e64565b9550602087013591508082111561418b57600080fd5b61419788838901613edf565b945060408701359150808211156141ad57600080fd5b506141ba87828801613edf565b949793965093946060013593505050565b6000806000606084860312156141e057600080fd5b833567ffffffffffffffff808211156141f857600080fd5b61420487838801613e64565b945060209150818601358181111561421b57600080fd5b86019050601f8101871361422e57600080fd5b803561423c613e8582614801565b8082825284820191508484018a868560051b870101111561425c57600080fd5b600094505b8385101561427f578035835260019490940193918501918501614261565b5096999698505050506040949094013593505050565b600080604083850312156142a857600080fd5b61412d83613f71565b6000602082840312156142c357600080fd5b5035919050565b6000602082840312156142dc57600080fd5b813561312181614a06565b6000602082840312156142f957600080fd5b815161312181614a06565b6000806040838503121561431757600080fd5b823567ffffffffffffffff81111561432e57600080fd5b61433a85828601613f86565b95602094909401359450505050565b6000806040838503121561435c57600080fd5b82359150602083013561400e816149f1565b60008060006060848603121561438357600080fd5b833592506020840135614049816149f1565b60008060008060008060008060006101208a8c0312156143b457600080fd5b8935985060208a01356143c6816149f1565b975060408a0135965060608a0135955060808a0135945060a08a013593506143f060c08b01613f71565b925060e08a013567ffffffffffffffff8082111561440d57600080fd5b6144198d838e01613f86565b93506101008c013591508082111561443057600080fd5b5061443d8c828d01613f86565b9150509295985092959850929598565b6000806040838503121561446057600080fd5b50508035926020909101359150565b600080600080600080600080610100898b03121561448c57600080fd5b88359750602089013596506040890135955060608901359450608089013593506144b860a08a01613f71565b925060c089013567ffffffffffffffff808211156144d557600080fd5b6144e18c838d01613f86565b935060e08b01359150808211156144f757600080fd5b506145048b828c01613f86565b9150509295985092959890939650565b6000815180845261452c816020860160208601614868565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60008251614570818460208701614868565b9190910192915050565b6000835161458c818460208801614868565b8351908301906145a0818360208801614868565b01949350505050565b600080835481600182811c9150808316806145c557607f831692505b60208084108214156145fe577f4e487b710000000000000000000000000000000000000000000000000000000086526022600452602486fd5b818015614612576001811461462357614650565b60ff19861689528489019650614650565b60008a81526020902060005b868110156146485781548b82015290850190830161462f565b505084890196505b509498975050505050505050565b60006001600160a01b038087168352808616602084015250836040830152608060608301526146906080830184614514565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156146db5783516001600160a01b0316835292840192918401916001016146b6565b50909695505050505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561475a577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0888603018452614748858351614514565b9450928501929085019060010161470e565b5092979650505050505050565b6020808252825182820181905260009190848201906040850190845b818110156146db57835183529284019291840191600101614783565b6020815260006131216020830184614514565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156147f9576147f96149c2565b604052919050565b600067ffffffffffffffff82111561481b5761481b6149c2565b5060051b60200190565b6000821982111561483857614838614935565b500190565b60008261484c5761484c614964565b500490565b60008282101561486357614863614935565b500390565b60005b8381101561488357818101518382015260200161486b565b8381111561247b5750506000910152565b600181811c908216806148a857607f821691505b602082108114156148e2577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561491a5761491a614935565b5060010190565b60008261493057614930614964565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6001600160a01b0381168114610f8057600080fd5b7fffffffff0000000000000000000000000000000000000000000000000000000081168114610f8057600080fdfea2646970667358221220a445ea9fd580d5f478bb074fecd0d2e23bd687b104a9bab076e6fb67b4371c6264736f6c63430008060033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106103625760003560e01c80638456cb59116101c8578063b88d4fde11610104578063d08a9431116100a2578063e99a99411161007c578063e99a9941146107ee578063f2fde38b1461080e578063f40efad414610821578063fe56ac571461083457600080fd5b8063d08a94311461077f578063d2dfc46d1461079f578063e985e9c5146107b257600080fd5b8063bad85b82116100de578063bad85b8214610726578063c059721a14610739578063c8125b041461074c578063c87b56dd1461076c57600080fd5b8063b88d4fde146106ed578063b9bcbe6114610700578063bac1ff721461071357600080fd5b80639bebfefa11610171578063a22dc16a1161014b578063a22dc16a146106a1578063a24df559146106b4578063a3d79364146106c7578063a8c0e647146106da57600080fd5b80639bebfefa1461065b578063a14263001461066e578063a22cb4651461068e57600080fd5b80638dfa3d4d116101a25780638dfa3d4d1461061757806395d89b411461062a5780639bc8883f1461063257600080fd5b80638456cb59146105e657806389b756d2146105ee5780638da5cb5b1461060157600080fd5b806340ff45b6116102a257806356ae57f4116102405780636352211e1161021a5780636352211e146105af5780636de9f32b146105c257806370a08231146105cb578063715018a6146105de57600080fd5b806356ae57f414610571578063582719ab146105845780635c975abb146105a457600080fd5b8063487faea91161027c578063487faea9146105155780634d6a3619146105285780634e27aa2f1461053b578063511f9e451461054e57600080fd5b806340ff45b6146104cf57806342842e0e146104ef57806342966c681461050257600080fd5b80631f9b26d11161030f578063388b1d76116102e9578063388b1d761461046b5780633f4ba83a1461048b5780633fa0e0ba1461049357806340c1a064146104a657600080fd5b80631f9b26d1146104255780632161ec9d1461043857806323b872dd1461045857600080fd5b8063081812fc11610340578063081812fc146103d2578063095ea7b3146103fd5780631dfd34351461041257600080fd5b806301ffc9a71461036757806305b74b0e1461038f57806306fdde03146103bd575b600080fd5b61037a6103753660046142ca565b610847565b60405190151581526020015b60405180910390f35b6103af61039d3660046142b1565b600d6020526000908152604090205481565b604051908152602001610386565b6103c561092c565b604051610386919061479f565b6103e56103e03660046142b1565b6109be565b6040516001600160a01b039091168152602001610386565b61041061040b36600461410f565b610a69565b005b6104106104203660046142b1565b610b9b565b6103c56104333660046142b1565b610cbb565b6103af6104463660046142b1565b600e6020526000908152604090205481565b610410610466366004614019565b610d55565b6103af6104793660046142b1565b600b6020526000908152604090205481565b610410610ddd565b6103e56104a136600461444d565b610e47565b6103e56104b43660046142b1565b6009602052600090815260409020546001600160a01b031681565b6104e26104dd3660046142b1565b610e7f565b6040516103869190614767565b6104106104fd366004614019565b610ee1565b6104106105103660046142b1565b610efc565b6103c56105233660046142b1565b610f83565b610410610536366004614304565b610f9c565b6104106105493660046141cb565b6110e3565b61037a61055c3660046142b1565b60176020526000908152604090205460ff1681565b6103e561057f36600461444d565b6113ae565b6105976105923660046142b1565b6113ca565b604051610386919061469a565b60075460ff1661037a565b6103e56105bd3660046142b1565b611435565b6103af60085481565b6103af6105d9366004613fa6565b6114c0565b61041061155a565b610410611621565b6103c56105fc366004614349565b611689565b60075461010090046001600160a01b03166103e5565b6103c5610625366004614349565b6116ad565b6103c56116d1565b6103e56106403660046142b1565b6018602052600090815260409020546001600160a01b031681565b61041061066936600461446f565b6116e0565b61068161067c3660046142b1565b6118be565b60405161038691906146e7565b61041061069c3660046140da565b6119aa565b6104106106af36600461413b565b611a70565b6104106106c236600461444d565b611ed8565b6104106106d5366004614304565b6120c2565b6104106106e8366004614395565b612201565b6104106106fb36600461405a565b6123f3565b6103c561070e36600461444d565b612481565b6105976107213660046142b1565b6124b9565b610410610734366004614295565b612523565b61041061074736600461436e565b612641565b6103af61075a3660046142b1565b600c6020526000908152604090205481565b6103c561077a3660046142b1565b612a47565b6103af61078d3660046142b1565b601a6020526000908152604090205481565b6103c56107ad3660046142b1565b612a52565b61037a6107c0366004613fe0565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b6103af6107fc3660046142b1565b60196020526000908152604090205481565b61041061081c366004613fa6565b612a6b565b6103af61082f36600461444d565b612bc5565b610410610842366004614304565b612bf6565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd0000000000000000000000000000000000000000000000000000000014806108da57507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061092657507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b60606000805461093b90614894565b80601f016020809104026020016040519081016040528092919081815260200182805461096790614894565b80156109b45780601f10610989576101008083540402835291602001916109b4565b820191906000526020600020905b81548152906001019060200180831161099757829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610a4d5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610a7482611435565b9050806001600160a01b0316836001600160a01b03161415610afe5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610a44565b336001600160a01b0382161480610b1a5750610b1a81336107c0565b610b8c5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610a44565b610b968383612ccc565b505050565b60075460ff1615610bee5760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610a44565b610bf83382612d52565b610c6a5760405162461bcd60e51b815260206004820152602a60248201527f4f6e6c79206f776e6572206f7220617070726f7665642061646472657373206360448201527f616e206d6f646966792e000000000000000000000000000000000000000000006064820152608401610a44565b6000818152601360205260408120610c8191613bbe565b604051428152819033907f17810fed5f7e4e09bab8415197c15c4327a6de1f89b76b3f04334743c86b106f9060200160405180910390a350565b60116020526000908152604090208054610cd490614894565b80601f0160208091040260200160405190810160405280929190818152602001828054610d0090614894565b8015610d4d5780601f10610d2257610100808354040283529160200191610d4d565b820191906000526020600020905b815481529060010190602001808311610d3057829003601f168201915b505050505081565b610d60335b82612d52565b610dd25760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610a44565b610b96838383612e5a565b6007546001600160a01b03610100909104163314610e3d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a44565b610e4561304a565b565b600f6020528160005260406000208181548110610e6357600080fd5b6000918252602090912001546001600160a01b03169150829050565b600081815260106020908152604091829020805483518184028101840190945280845260609392830182828015610ed557602002820191906000526020600020905b815481526020019060010190808311610ec1575b50505050509050919050565b610b96838383604051806020016040528060008152506123f3565b610f0533610d5a565b610f775760405162461bcd60e51b815260206004820152603060248201527f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f766564000000000000000000000000000000006064820152608401610a44565b610f80816130e6565b50565b60126020526000908152604090208054610cd490614894565b60075460ff1615610fef5760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610a44565b610ff93382612d52565b61106b5760405162461bcd60e51b815260206004820152602a60248201527f4f6e6c79206f776e6572206f7220617070726f7665642061646472657373206360448201527f616e206d6f646966792e000000000000000000000000000000000000000000006064820152608401610a44565b6000818152601260209081526040909120835161108a92850190613bdc565b5080336001600160a01b0316836040516110a4919061455e565b604051908190038120428252907f1edbd98d50ddbd07f6d469d931007d63d5b83fb0474ab22b268a46dbbf83c622906020015b60405180910390a45050565b60075460ff16156111365760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610a44565b6111403382612d52565b6111b25760405162461bcd60e51b815260206004820152602a60248201527f4f6e6c79206f776e6572206f7220617070726f7665642061646472657373206360448201527f616e206d6f646966792e000000000000000000000000000000000000000000006064820152608401610a44565b81518351146112295760405162461bcd60e51b815260206004820152603060248201527f5369676e657273206c656e67746820646f65736e2774206d617463682070657260448201527f63656e7461676573206c656e6774682e000000000000000000000000000000006064820152608401610a44565b6000805b83518110156112e057600084828151811061124a5761124a614993565b602002602001015110156112a05760405162461bcd60e51b815260206004820152601560248201527f50657263656e7461676520697320756e646572203000000000000000000000006044820152606401610a44565b6112cc8482815181106112b5576112b5614993565b60200260200101518361311590919063ffffffff16565b9150806112d8816148e8565b91505061122d565b50806064146113315760405162461bcd60e51b815260206004820152601f60248201527f50657263656e746167657320646f6e27742061646420757020746f20313030006044820152606401610a44565b6000828152600f60209081526040909120855161135092870190613c60565b506000828152601060209081526040909120845161137092860190613ccd565b50604051428152829033907f3618f3a59837b68d822d75e40037d588fea6d80178b6e4bda53afaee24af7a049060200160405180910390a350505050565b60146020528160005260406000208181548110610e6357600080fd5b6000818152600f6020908152604091829020805483518184028101840190945280845260609392830182828015610ed557602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161140c5750505050509050919050565b6000818152600260205260408120546001600160a01b0316806109265760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e00000000000000000000000000000000000000000000006064820152608401610a44565b60006001600160a01b03821661153e5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610a44565b506001600160a01b031660009081526003602052604090205490565b6007546001600160a01b036101009091041633146115ba5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a44565b60075460405160009161010090046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600780547fffffffffffffffffffffff0000000000000000000000000000000000000000ff169055565b6007546001600160a01b036101009091041633146116815760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a44565b610e45613128565b601560209081526000928352604080842090915290825290208054610cd490614894565b601660209081526000928352604080842090915290825290208054610cd490614894565b60606001805461093b90614894565b60075460ff16156117335760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610a44565b6064611749886117438989613115565b90613115565b11156117975760405162461bcd60e51b815260206004820152601c60248201527f526f79616c746965732061646420757020746f206f76657220313030000000006044820152606401610a44565b6000888152600260205260409020546001600160a01b0316156117fc5760405162461bcd60e51b815260206004820152601860248201527f546f6b656e20494420616c7265616479206578697374732e00000000000000006044820152606401610a44565b60016008600082825461180f9190614825565b9091555050600088815260096020908152604080832080547fffffffffffffffffffffffff00000000000000000000000000000000000000001633179055600b82528083208a9055600c8252808320899055600d8252808320889055600e825280832087905560178252808320805487151560ff19909116179055600a8252909120825161189f92840190613bdc565b506118aa33896131b0565b6118b488836131ce565b5050505050505050565b606060136000838152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b8282101561199f57838290600052602060002001805461191290614894565b80601f016020809104026020016040519081016040528092919081815260200182805461193e90614894565b801561198b5780601f106119605761010080835404028352916020019161198b565b820191906000526020600020905b81548152906001019060200180831161196e57829003601f168201915b5050505050815260200190600101906118f3565b505050509050919050565b6001600160a01b038216331415611a035760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610a44565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191015b60405180910390a35050565b60075460ff1615611ac35760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610a44565b60008181526017602052604090205460ff1615611b5657611ae43382612d52565b611b565760405162461bcd60e51b815260206004820152603b60248201527f4f6e6c79206f776e6572206f7220617070726f7665642061646472657373206360448201527f616e20616464206f6e20636861696e207369676e6174757265732e00000000006064820152608401610a44565b6000818152600e602090815260408083205487516014909352922054611b7c9190614825565b1115611bca5760405162461bcd60e51b815260206004820152601f60248201527f4d6178206e756d626572206f66207369676e6572732065786365656465642e006044820152606401610a44565b82518451148015611bdc575081518451145b611c285760405162461bcd60e51b815260206004820152601f60248201527f4c656e677468206f6620617272617973206d75737420626520657175616c2e006044820152606401610a44565b60005b8451811015611ed157600082815260166020526040812086518290889085908110611c5857611c58614993565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000208054611c8b90614894565b80601f0160208091040260200160405190810160405280929190818152602001828054611cb790614894565b8015611d045780601f10611cd957610100808354040283529160200191611d04565b820191906000526020600020905b815481529060010190602001808311611ce757829003601f168201915b50505050509050805160001415611ebe5760008381526014602052604090208651879084908110611d3757611d37614993565b60209081029190910181015182546001810184556000938452919092200180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039092169190911790558451859083908110611d9e57611d9e614993565b6020026020010151601560008581526020019081526020016000206000888581518110611dcd57611dcd614993565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000209080519060200190611e08929190613bdc565b50838281518110611e1b57611e1b614993565b6020026020010151601660008581526020019081526020016000206000888581518110611e4a57611e4a614993565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000209080519060200190611e85929190613bdc565b50604051428152839033907fab5920b5ea4c7d901ab47ba5e3aa706b5cfdcef05e43a5cdb723e75eb4dc06429060200160405180910390a35b5080611ec9816148e8565b915050611c2b565b5050505050565b60075460ff1615611f2b5760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610a44565b611f353382612d52565b611fa75760405162461bcd60e51b815260206004820152602a60248201527f4f6e6c79206f776e6572206f7220617070726f7665642061646472657373206360448201527f616e206d6f646966792e000000000000000000000000000000000000000000006064820152608401610a44565b60008181526013602052604090205482106120045760405162461bcd60e51b815260206004820152600f60248201527f496e646578206e6f742076616c696400000000000000000000000000000000006044820152606401610a44565b600081815260136020526040902080548390811061202457612024614993565b60009182526020808320848452601190915260409092209101805461204890614894565b612053929190613d07565b50600081815260136020526040812061206b91613bbe565b6000818152601160205260409081902090518291339161208b91906145a9565b604051908190038120428252907f3233bc0b5fcb53ab38f6984267df8df5531d5cff3770a799fde52cc0dc268c6f906020016110d7565b60075460ff16156121155760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610a44565b61211f3382612d52565b6121915760405162461bcd60e51b815260206004820152602a60248201527f4f6e6c79206f776e6572206f7220617070726f7665642061646472657373206360448201527f616e206d6f646966792e000000000000000000000000000000000000000000006064820152608401610a44565b600081815260116020908152604090912083516121b092850190613bdc565b5080336001600160a01b0316836040516121ca919061455e565b604051908190038120428252907f1bf3aee8b30dbac5155216c2dfba2cd6c0d9169bae4bcc32a8883e4f695570c6906020016110d7565b60075460ff16156122545760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610a44565b6064612264886117438989613115565b11156122b25760405162461bcd60e51b815260206004820152601c60248201527f526f79616c746965732061646420757020746f206f76657220313030000000006044820152606401610a44565b6000898152600260205260409020546001600160a01b0316156123175760405162461bcd60e51b815260206004820152601860248201527f546f6b656e20494420616c7265616479206578697374732e00000000000000006044820152606401610a44565b60016008600082825461232a9190614825565b90915550506000898152600b602090815260408083208a9055600c8252808320899055600d8252808320889055600e825280832087905560178252808320805460ff1916871515179055600a8252909120825161238992840190613bdc565b50612394338a6131b0565b61239e89836131ce565b600089815260096020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038a161790556123e833898b610ee1565b505050505050505050565b6123fd3383612d52565b61246f5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610a44565b61247b84848484613277565b50505050565b6013602052816000526040600020818154811061249d57600080fd5b90600052602060002001600091509150508054610cd490614894565b600081815260146020908152604091829020805483518184028101840190945280845260609392830182828015610ed5576020028201919060005260206000209081546001600160a01b0316815260019091019060200180831161140c5750505050509050919050565b60075460ff16156125765760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610a44565b6125803382612d52565b6125f25760405162461bcd60e51b815260206004820152602a60248201527f4f6e6c79206f776e6572206f7220617070726f7665642061646472657373206360448201527f616e206d6f646966792e000000000000000000000000000000000000000000006064820152608401610a44565b600081815260176020908152604091829020805460ff19168515151790559051428152829133917fc9b4aacc0a711a75b9342c103bf2ece3b69733681cc5d6900ba8208820a748189101611a64565b60075460ff16156126945760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610a44565b61269d83611435565b6001600160a01b0316336001600160a01b0316146126fd5760405162461bcd60e51b815260206004820152601760248201527f4f6e6c79206f776e65722063616e20636f6e6e6563742e0000000000000000006044820152606401610a44565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606084901b16602082015260348101829052600090605401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000818152601a909352912054909150156127f25760405162461bcd60e51b815260206004820152603760248201527f45787465726e616c204e465420697320616c726561647920636f6e6e6563746560448201527f6420746f20736f6d652042697453696720746f6b656e2e0000000000000000006064820152608401610a44565b826127fc85611435565b6040517f6352211e000000000000000000000000000000000000000000000000000000008152600481018590526001600160a01b0391821691831690636352211e9060240160206040518083038186803b15801561285957600080fd5b505afa15801561286d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128919190613fc3565b6001600160a01b03161461290d5760405162461bcd60e51b815260206004820152602d60248201527f4f776e6572206f662065787465726e616c204e4654206d75737420616c736f2060448201527f6f776e2074686973204e46542e000000000000000000000000000000000000006064820152608401610a44565b6000858152601860205260409020546001600160a01b031615801561293e5750600085815260196020526040902054155b6129af5760405162461bcd60e51b8152602060048201526024808201527f546f6b656e206d757374206e6f7420616c726561647920626520636f6e6e656360448201527f7465642e000000000000000000000000000000000000000000000000000000006064820152608401610a44565b6000828152601a602090815260408083208890558783526018825280832080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03891690811790915560198352928190208690555142815285929188917ffd79267c9b2222d9f5ddd56c09e4b349fce0e5f493920768e836959490a0e042910160405180910390a45050505050565b606061092682613300565b600a6020526000908152604090208054610cd490614894565b6007546001600160a01b03610100909104163314612acb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a44565b6001600160a01b038116612b475760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610a44565b6007546040516001600160a01b0380841692610100900416907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600780546001600160a01b03909216610100027fffffffffffffffffffffff0000000000000000000000000000000000000000ff909216919091179055565b60106020528160005260406000208181548110612be157600080fd5b90600052602060002001600091509150505481565b60075460ff1615612c495760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610a44565b600081815260136020908152604082208054600181018255908352918190208451612c7b939190910191850190613bdc565b5080336001600160a01b031683604051612c95919061455e565b604051908190038120428252907f5b996eb46629905850eef813a20550291b6158c18c935d4807822ef9b7fe8883906020016110d7565b600081815260046020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0384169081179091558190612d1982611435565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316612ddc5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610a44565b6000612de783611435565b9050806001600160a01b0316846001600160a01b03161480612e225750836001600160a01b0316612e17846109be565b6001600160a01b0316145b80612e5257506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316612e6d82611435565b6001600160a01b031614612ee95760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e00000000000000000000000000000000000000000000006064820152608401610a44565b6001600160a01b038216612f645760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610a44565b612f6f83838361348b565b612f7a600082612ccc565b6001600160a01b0383166000908152600360205260408120805460019290612fa3908490614851565b90915550506001600160a01b0382166000908152600360205260408120805460019290612fd1908490614825565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60075460ff1661309c5760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610a44565b6007805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6130ef81611435565b6001600160a01b0316336001600160a01b03161461310c57600080fd5b610f80816134de565b60006131218284614825565b9392505050565b60075460ff161561317b5760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610a44565b6007805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586130c93390565b6131ca82826040518060200160405280600081525061351e565b5050565b6000828152600260205260409020546001600160a01b03166132585760405162461bcd60e51b815260206004820152602e60248201527f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60448201527f6578697374656e7420746f6b656e0000000000000000000000000000000000006064820152608401610a44565b60008281526006602090815260409091208251610b9692840190613bdc565b613282848484612e5a565b61328e848484846135a7565b61247b5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610a44565b6000818152600260205260409020546060906001600160a01b031661338d5760405162461bcd60e51b815260206004820152603160248201527f45524337323155524953746f726167653a2055524920717565727920666f722060448201527f6e6f6e6578697374656e7420746f6b656e0000000000000000000000000000006064820152608401610a44565b600082815260066020526040812080546133a690614894565b80601f01602080910402602001604051908101604052809291908181526020018280546133d290614894565b801561341f5780601f106133f45761010080835404028352916020019161341f565b820191906000526020600020905b81548152906001019060200180831161340257829003601f168201915b50505050509050600061343d60408051602081019091526000815290565b9050805160001415613450575092915050565b81511561348257808260405160200161346a92919061457a565b60405160208183030381529060405292505050919050565b612e5284613772565b60075460ff1615610b965760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610a44565b6134e781613867565b6000818152600660205260409020805461350090614894565b159050610f80576000818152600660205260408120610f8091613d82565b6135288383613926565b61353560008484846135a7565b610b965760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610a44565b60006001600160a01b0384163b15613767576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063150b7a029061360490339089908890889060040161465e565b602060405180830381600087803b15801561361e57600080fd5b505af192505050801561366c575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252613669918101906142e7565b60015b61371c573d80801561369a576040519150601f19603f3d011682016040523d82523d6000602084013e61369f565b606091505b5080516137145760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610a44565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050612e52565b506001949350505050565b6000818152600260205260409020546060906001600160a01b03166137ff5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006064820152608401610a44565b600061381660408051602081019091526000815290565b905060008151116138365760405180602001604052806000815250613121565b8061384084613a8c565b60405160200161385192919061457a565b6040516020818303038152906040529392505050565b600061387282611435565b90506138808160008461348b565b61388b600083612ccc565b6001600160a01b03811660009081526003602052604081208054600192906138b4908490614851565b909155505060008281526002602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6001600160a01b03821661397c5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610a44565b6000818152600260205260409020546001600160a01b0316156139e15760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610a44565b6139ed6000838361348b565b6001600160a01b0382166000908152600360205260408120805460019290613a16908490614825565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b606081613acc57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115613af65780613ae0816148e8565b9150613aef9050600a8361483d565b9150613ad0565b60008167ffffffffffffffff811115613b1157613b116149c2565b6040519080825280601f01601f191660200182016040528015613b3b576020820181803683370190505b5090505b8415612e5257613b50600183614851565b9150613b5d600a86614921565b613b68906030614825565b60f81b818381518110613b7d57613b7d614993565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350613bb7600a8661483d565b9450613b3f565b5080546000825590600052602060002090810190610f809190613dbc565b828054613be890614894565b90600052602060002090601f016020900481019282613c0a5760008555613c50565b82601f10613c2357805160ff1916838001178555613c50565b82800160010185558215613c50579182015b82811115613c50578251825591602001919060010190613c35565b50613c5c929150613dd9565b5090565b828054828255906000526020600020908101928215613c50579160200282015b82811115613c5057825182547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03909116178255602090920191600190910190613c80565b828054828255906000526020600020908101928215613c505791602002820182811115613c50578251825591602001919060010190613c35565b828054613d1390614894565b90600052602060002090601f016020900481019282613d355760008555613c50565b82601f10613d465780548555613c50565b82800160010185558215613c5057600052602060002091601f016020900482015b82811115613c50578254825591600101919060010190613d67565b508054613d8e90614894565b6000825580601f10613d9e575050565b601f016020900490600052602060002090810190610f809190613dd9565b80821115613c5c576000613dd08282613d82565b50600101613dbc565b5b80821115613c5c5760008155600101613dda565b600067ffffffffffffffff831115613e0857613e086149c2565b613e3960207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f860116016147b2565b9050828152838383011115613e4d57600080fd5b828260208301376000602084830101529392505050565b600082601f830112613e7557600080fd5b81356020613e8a613e8583614801565b6147b2565b80838252828201915082860187848660051b8901011115613eaa57600080fd5b60005b85811015613ed2578135613ec0816149f1565b84529284019290840190600101613ead565b5090979650505050505050565b600082601f830112613ef057600080fd5b81356020613f00613e8583614801565b80838252828201915082860187848660051b8901011115613f2057600080fd5b6000805b86811015613f6357823567ffffffffffffffff811115613f42578283fd5b613f508b88838d0101613f86565b8652509385019391850191600101613f24565b509198975050505050505050565b80358015158114613f8157600080fd5b919050565b600082601f830112613f9757600080fd5b61312183833560208501613dee565b600060208284031215613fb857600080fd5b8135613121816149f1565b600060208284031215613fd557600080fd5b8151613121816149f1565b60008060408385031215613ff357600080fd5b8235613ffe816149f1565b9150602083013561400e816149f1565b809150509250929050565b60008060006060848603121561402e57600080fd5b8335614039816149f1565b92506020840135614049816149f1565b929592945050506040919091013590565b6000806000806080858703121561407057600080fd5b843561407b816149f1565b9350602085013561408b816149f1565b925060408501359150606085013567ffffffffffffffff8111156140ae57600080fd5b8501601f810187136140bf57600080fd5b6140ce87823560208401613dee565b91505092959194509250565b600080604083850312156140ed57600080fd5b82356140f8816149f1565b915061410660208401613f71565b90509250929050565b6000806040838503121561412257600080fd5b823561412d816149f1565b946020939093013593505050565b6000806000806080858703121561415157600080fd5b843567ffffffffffffffff8082111561416957600080fd5b61417588838901613e64565b9550602087013591508082111561418b57600080fd5b61419788838901613edf565b945060408701359150808211156141ad57600080fd5b506141ba87828801613edf565b949793965093946060013593505050565b6000806000606084860312156141e057600080fd5b833567ffffffffffffffff808211156141f857600080fd5b61420487838801613e64565b945060209150818601358181111561421b57600080fd5b86019050601f8101871361422e57600080fd5b803561423c613e8582614801565b8082825284820191508484018a868560051b870101111561425c57600080fd5b600094505b8385101561427f578035835260019490940193918501918501614261565b5096999698505050506040949094013593505050565b600080604083850312156142a857600080fd5b61412d83613f71565b6000602082840312156142c357600080fd5b5035919050565b6000602082840312156142dc57600080fd5b813561312181614a06565b6000602082840312156142f957600080fd5b815161312181614a06565b6000806040838503121561431757600080fd5b823567ffffffffffffffff81111561432e57600080fd5b61433a85828601613f86565b95602094909401359450505050565b6000806040838503121561435c57600080fd5b82359150602083013561400e816149f1565b60008060006060848603121561438357600080fd5b833592506020840135614049816149f1565b60008060008060008060008060006101208a8c0312156143b457600080fd5b8935985060208a01356143c6816149f1565b975060408a0135965060608a0135955060808a0135945060a08a013593506143f060c08b01613f71565b925060e08a013567ffffffffffffffff8082111561440d57600080fd5b6144198d838e01613f86565b93506101008c013591508082111561443057600080fd5b5061443d8c828d01613f86565b9150509295985092959850929598565b6000806040838503121561446057600080fd5b50508035926020909101359150565b600080600080600080600080610100898b03121561448c57600080fd5b88359750602089013596506040890135955060608901359450608089013593506144b860a08a01613f71565b925060c089013567ffffffffffffffff808211156144d557600080fd5b6144e18c838d01613f86565b935060e08b01359150808211156144f757600080fd5b506145048b828c01613f86565b9150509295985092959890939650565b6000815180845261452c816020860160208601614868565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60008251614570818460208701614868565b9190910192915050565b6000835161458c818460208801614868565b8351908301906145a0818360208801614868565b01949350505050565b600080835481600182811c9150808316806145c557607f831692505b60208084108214156145fe577f4e487b710000000000000000000000000000000000000000000000000000000086526022600452602486fd5b818015614612576001811461462357614650565b60ff19861689528489019650614650565b60008a81526020902060005b868110156146485781548b82015290850190830161462f565b505084890196505b509498975050505050505050565b60006001600160a01b038087168352808616602084015250836040830152608060608301526146906080830184614514565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156146db5783516001600160a01b0316835292840192918401916001016146b6565b50909695505050505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561475a577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0888603018452614748858351614514565b9450928501929085019060010161470e565b5092979650505050505050565b6020808252825182820181905260009190848201906040850190845b818110156146db57835183529284019291840191600101614783565b6020815260006131216020830184614514565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156147f9576147f96149c2565b604052919050565b600067ffffffffffffffff82111561481b5761481b6149c2565b5060051b60200190565b6000821982111561483857614838614935565b500190565b60008261484c5761484c614964565b500490565b60008282101561486357614863614935565b500390565b60005b8381101561488357818101518382015260200161486b565b8381111561247b5750506000910152565b600181811c908216806148a857607f821691505b602082108114156148e2577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561491a5761491a614935565b5060010190565b60008261493057614930614964565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6001600160a01b0381168114610f8057600080fd5b7fffffffff0000000000000000000000000000000000000000000000000000000081168114610f8057600080fdfea2646970667358221220a445ea9fd580d5f478bb074fecd0d2e23bd687b104a9bab076e6fb67b4371c6264736f6c63430008060033
Deployed Bytecode Sourcemap
46977:14324:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20530:292;;;;;;:::i;:::-;;:::i;:::-;;;17697:14:1;;17690:22;17672:41;;17660:2;17645:18;20530:292:0;;;;;;;;47571:52;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;32527:25:1;;;32515:2;32500:18;47571:52:0;32482:76:1;21462:100:0;;;:::i;:::-;;;;;;;:::i;22922:221::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;14760:55:1;;;14742:74;;14730:2;14715:18;22922:221:0;14697:125:1;22459:397:0;;;;;;:::i;:::-;;:::i;:::-;;57515:328;;;;;;:::i;:::-;;:::i;48206:45::-;;;;;;:::i;:::-;;:::i;47682:51::-;;;;;;:::i;:::-;;;;;;;;;;;;;;23812:305;;;;;;:::i;:::-;;:::i;47355:54::-;;;;;;:::i;:::-;;;;;;;;;;;;;;51359:65;;;:::i;47793:47::-;;;;;;:::i;:::-;;:::i;47136:::-;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;47136:47:0;;;60993:146;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;24188:151::-;;;;;;:::i;:::-;;:::i;39260:245::-;;;;;;:::i;:::-;;:::i;48409:50::-;;;;;;:::i;:::-;;:::i;55482:332::-;;;;;;:::i;:::-;;:::i;55822:824::-;;;;;;:::i;:::-;;:::i;49558:56::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;49317;;;;;;:::i;:::-;;:::i;60855:126::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;35326:86::-;35397:7;;;;35326:86;;21156:239;;;;;;:::i;:::-;;:::i;47096:27::-;;;;;;20886:208;;;;;;:::i;:::-;;:::i;38253:148::-;;;:::i;51290:61::-;;;:::i;49380:79::-;;;;;;:::i;:::-;;:::i;37602:87::-;37675:6;;;;;-1:-1:-1;;;;;37675:6:0;37602:87;;49466:85;;;;;;:::i;:::-;;:::i;21631:104::-;;;:::i;49890:52::-;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;49890:52:0;;;51436:1225;;;;;;:::i;:::-;;:::i;61151:147::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;23215:295::-;;;;;;:::i;:::-;;:::i;58289:1175::-;;;;;;:::i;:::-;;:::i;56985:518::-;;;;;;:::i;:::-;;:::i;54983:320::-;;;;;;:::i;:::-;;:::i;52754:1319::-;;;;;;:::i;:::-;;:::i;24410:285::-;;;;;;:::i;:::-;;:::i;48937:57::-;;;;;;:::i;:::-;;:::i;60704:139::-;;;;;;:::i;:::-;;:::i;57922:355::-;;;;;;:::i;:::-;;:::i;59663:1029::-;;;;;;:::i;:::-;;:::i;47464:49::-;;;;;;:::i;:::-;;;;;;;;;;;;;;54436:157;;;;;;:::i;:::-;;:::i;50078:46::-;;;;;;:::i;:::-;;;;;;;;;;;;;;47227:53;;;;;;:::i;:::-;;:::i;23581:164::-;;;;;;:::i;:::-;-1:-1:-1;;;;;23702:25:0;;;23678:4;23702:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;23581:164;49988:47;;;;;;:::i;:::-;;;;;;;;;;;;;;38556:244;;;;;;:::i;:::-;;:::i;47911:57::-;;;;;;:::i;:::-;;:::i;56658:242::-;;;;;;:::i;:::-;;:::i;20530:292::-;20632:4;20656:40;;;20671:25;20656:40;;:105;;-1:-1:-1;20713:48:0;;;20728:33;20713:48;20656:105;:158;;;-1:-1:-1;19156:25:0;19141:40;;;;20778:36;20649:165;20530:292;-1:-1:-1;;20530:292:0:o;21462:100::-;21516:13;21549:5;21542:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21462:100;:::o;22922:221::-;22998:7;26251:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26251:16:0;23018:73;;;;-1:-1:-1;;;23018:73:0;;26701:2:1;23018:73:0;;;26683:21:1;26740:2;26720:18;;;26713:30;26779:34;26759:18;;;26752:62;26850:14;26830:18;;;26823:42;26882:19;;23018:73:0;;;;;;;;;-1:-1:-1;23111:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;23111:24:0;;22922:221::o;22459:397::-;22540:13;22556:23;22571:7;22556:14;:23::i;:::-;22540:39;;22604:5;-1:-1:-1;;;;;22598:11:0;:2;-1:-1:-1;;;;;22598:11:0;;;22590:57;;;;-1:-1:-1;;;22590:57:0;;29011:2:1;22590:57:0;;;28993:21:1;29050:2;29030:18;;;29023:30;29089:34;29069:18;;;29062:62;29160:3;29140:18;;;29133:31;29181:19;;22590:57:0;28983:223:1;22590:57:0;15910:10;-1:-1:-1;;;;;22668:21:0;;;;:62;;-1:-1:-1;22693:37:0;22710:5;15910:10;23581:164;:::i;22693:37::-;22660:154;;;;-1:-1:-1;;;22660:154:0;;23025:2:1;22660:154:0;;;23007:21:1;23064:2;23044:18;;;23037:30;23103:34;23083:18;;;23076:62;23174:26;23154:18;;;23147:54;23218:19;;22660:154:0;22997:246:1;22660:154:0;22827:21;22836:2;22840:7;22827:8;:21::i;:::-;22529:327;22459:397;;:::o;57515:328::-;35397:7;;;;35651:9;35643:38;;;;-1:-1:-1;;;35643:38:0;;22680:2:1;35643:38:0;;;22662:21:1;22719:2;22699:18;;;22692:30;22758:18;22738;;;22731:46;22794:18;;35643:38:0;22652:166:1;35643:38:0;57613:40:::1;57632:10;57644:8;57613:18;:40::i;:::-;57605:95;;;::::0;-1:-1:-1;;;57605:95:0;;29773:2:1;57605:95:0::1;::::0;::::1;29755:21:1::0;29812:2;29792:18;;;29785:30;29851:34;29831:18;;;29824:62;29922:12;29902:18;;;29895:40;29952:19;;57605:95:0::1;29745:232:1::0;57605:95:0::1;57718:31;::::0;;;:21:::1;:31;::::0;;;;57711:38:::1;::::0;::::1;:::i;:::-;57765:70;::::0;57797:15:::1;32527:25:1::0;;57826:8:0;;57814:10:::1;::::0;57765:70:::1;::::0;32515:2:1;32500:18;57765:70:0::1;;;;;;;57515:328:::0;:::o;48206:45::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;23812:305::-;23973:41;15910:10;23992:12;24006:7;23973:18;:41::i;:::-;23965:103;;;;-1:-1:-1;;;23965:103:0;;30184:2:1;23965:103:0;;;30166:21:1;30223:2;30203:18;;;30196:30;30262:34;30242:18;;;30235:62;30333:19;30313:18;;;30306:47;30370:19;;23965:103:0;30156:239:1;23965:103:0;24081:28;24091:4;24097:2;24101:7;24081:9;:28::i;51359:65::-;37675:6;;-1:-1:-1;;;;;37675:6:0;;;;;15910:10;37822:23;37814:68;;;;-1:-1:-1;;;37814:68:0;;27114:2:1;37814:68:0;;;27096:21:1;;;27133:18;;;27126:30;27192:34;27172:18;;;27165:62;27244:18;;37814:68:0;27086:182:1;37814:68:0;51406:10:::1;:8;:10::i;:::-;51359:65::o:0;47793:47::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;47793:47:0;;-1:-1:-1;47793:47:0;;-1:-1:-1;47793:47:0:o;60993:146::-;61101:30;;;;:20;:30;;;;;;;;;61094:37;;;;;;;;;;;;;;;;;61065:16;;61094:37;;;61101:30;61094:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60993:146;;;:::o;24188:151::-;24292:39;24309:4;24315:2;24319:7;24292:39;;;;;;;;;;;;:16;:39::i;39260:245::-;39378:41;15910:10;39397:12;15830:98;39378:41;39370:102;;;;-1:-1:-1;;;39370:102:0;;31738:2:1;39370:102:0;;;31720:21:1;31777:2;31757:18;;;31750:30;31816:34;31796:18;;;31789:62;31887:18;31867;;;31860:46;31923:19;;39370:102:0;31710:238:1;39370:102:0;39483:14;39489:7;39483:5;:14::i;:::-;39260:245;:::o;48409:50::-;;;;;;;;;;;;;;;;:::i;55482:332::-;35397:7;;;;35651:9;35643:38;;;;-1:-1:-1;;;35643:38:0;;22680:2:1;35643:38:0;;;22662:21:1;22719:2;22699:18;;;22692:30;22758:18;22738;;;22731:46;22794:18;;35643:38:0;22652:166:1;35643:38:0;55591:40:::1;55610:10;55622:8;55591:18;:40::i;:::-;55583:95;;;::::0;-1:-1:-1;;;55583:95:0;;29773:2:1;55583:95:0::1;::::0;::::1;29755:21:1::0;29812:2;29792:18;;;29785:30;29851:34;29831:18;;;29824:62;29922:12;29902:18;;;29895:40;29952:19;;55583:95:0::1;29745:232:1::0;55583:95:0::1;55689:26;::::0;;;:16:::1;:26;::::0;;;;;;;:35;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;55797:8;55785:10;-1:-1:-1::0;;;;;55740:66:0::1;55777:6;55740:66;;;;;;:::i;:::-;;::::0;;;;::::1;::::0;;55760:15:::1;32527:25:1::0;;55740:66:0;::::1;::::0;32515:2:1;32500:18;55740:66:0::1;;;;;;;;55482:332:::0;;:::o;55822:824::-;35397:7;;;;35651:9;35643:38;;;;-1:-1:-1;;;35643:38:0;;22680:2:1;35643:38:0;;;22662:21:1;22719:2;22699:18;;;22692:30;22758:18;22738;;;22731:46;22794:18;;35643:38:0;22652:166:1;35643:38:0;55959:40:::1;55978:10;55990:8;55959:18;:40::i;:::-;55951:95;;;::::0;-1:-1:-1;;;55951:95:0;;29773:2:1;55951:95:0::1;::::0;::::1;29755:21:1::0;29812:2;29792:18;;;29785:30;29851:34;29831:18;;;29824:62;29922:12;29902:18;;;29895:40;29952:19;;55951:95:0::1;29745:232:1::0;55951:95:0::1;56083:11;:18;56065:7;:14;:36;56057:97;;;::::0;-1:-1:-1;;;56057:97:0;;24686:2:1;56057:97:0::1;::::0;::::1;24668:21:1::0;24725:2;24705:18;;;24698:30;24764:34;24744:18;;;24737:62;24835:18;24815;;;24808:46;24871:19;;56057:97:0::1;24658:238:1::0;56057:97:0::1;56165:13;56239:6:::0;56234:174:::1;56255:11;:18;56251:1;:22;56234:174;;;56321:1;56303:11;56315:1;56303:14;;;;;;;;:::i;:::-;;;;;;;:19;;56295:53;;;::::0;-1:-1:-1;;;56295:53:0;;28661:2:1;56295:53:0::1;::::0;::::1;28643:21:1::0;28700:2;28680:18;;;28673:30;28739:23;28719:18;;;28712:51;28780:18;;56295:53:0::1;28633:171:1::0;56295:53:0::1;56371:25;56381:11;56393:1;56381:14;;;;;;;;:::i;:::-;;;;;;;56371:5;:9;;:25;;;;:::i;:::-;56363:33:::0;-1:-1:-1;56275:3:0;::::1;::::0;::::1;:::i;:::-;;;;56234:174;;;;56426:5;56435:3;56426:12;56418:56;;;::::0;-1:-1:-1;;;56418:56:0;;29413:2:1;56418:56:0::1;::::0;::::1;29395:21:1::0;29452:2;29432:18;;;29425:30;29491:33;29471:18;;;29464:61;29542:18;;56418:56:0::1;29385:181:1::0;56418:56:0::1;56485:20;::::0;;;:10:::1;:20;::::0;;;;;;;:30;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;56526:30:0::1;::::0;;;:20:::1;:30;::::0;;;;;;;:44;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;56586:52:0::1;::::0;56600:15:::1;32527:25:1::0;;56629:8:0;;56617:10:::1;::::0;56586:52:::1;::::0;32515:2:1;32500:18;56586:52:0::1;;;;;;;55940:706;55822:824:::0;;;:::o;49317:56::-;;;;;;;;;;;;;;;;;;;;60855:126;60953:20;;;;:10;:20;;;;;;;;;60946:27;;;;;;;;;;;;;;;;;60917:16;;60946:27;;;60953:20;60946:27;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;60946:27:0;;;;;;;;;;;;;;;;;;;;;;60855:126;;;:::o;21156:239::-;21228:7;21264:16;;;:7;:16;;;;;;-1:-1:-1;;;;;21264:16:0;21299:19;21291:73;;;;-1:-1:-1;;;21291:73:0;;23861:2:1;21291:73:0;;;23843:21:1;23900:2;23880:18;;;23873:30;23939:34;23919:18;;;23912:62;24010:11;23990:18;;;23983:39;24039:19;;21291:73:0;23833:231:1;20886:208:0;20958:7;-1:-1:-1;;;;;20986:19:0;;20978:74;;;;-1:-1:-1;;;20978:74:0;;23450:2:1;20978:74:0;;;23432:21:1;23489:2;23469:18;;;23462:30;23528:34;23508:18;;;23501:62;23599:12;23579:18;;;23572:40;23629:19;;20978:74:0;23422:232:1;20978:74:0;-1:-1:-1;;;;;;21070:16:0;;;;;:9;:16;;;;;;;20886:208::o;38253:148::-;37675:6;;-1:-1:-1;;;;;37675:6:0;;;;;15910:10;37822:23;37814:68;;;;-1:-1:-1;;;37814:68:0;;27114:2:1;37814:68:0;;;27096:21:1;;;27133:18;;;27126:30;27192:34;27172:18;;;27165:62;27244:18;;37814:68:0;27086:182:1;37814:68:0;38344:6:::1;::::0;38323:40:::1;::::0;38360:1:::1;::::0;38344:6:::1;::::0;::::1;-1:-1:-1::0;;;;;38344:6:0::1;::::0;38323:40:::1;::::0;38360:1;;38323:40:::1;38374:6;:19:::0;;;::::1;::::0;;38253:148::o;51290:61::-;37675:6;;-1:-1:-1;;;;;37675:6:0;;;;;15910:10;37822:23;37814:68;;;;-1:-1:-1;;;37814:68:0;;27114:2:1;37814:68:0;;;27096:21:1;;;27133:18;;;27126:30;27192:34;27172:18;;;27165:62;27244:18;;37814:68:0;27086:182:1;37814:68:0;51335:8:::1;:6;:8::i;49380:79::-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;49466:85::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;21631:104::-;21687:13;21720:7;21713:14;;;;;:::i;51436:1225::-;35397:7;;;;35651:9;35643:38;;;;-1:-1:-1;;;35643:38:0;;22680:2:1;35643:38:0;;;22662:21:1;22719:2;22699:18;;;22692:30;22758:18;22738;;;22731:46;22794:18;;35643:38:0;22652:166:1;35643:38:0;51916:3:::1;51847:65;51891:20:::0;51847:39:::1;:15:::0;51867:18;51847:19:::1;:39::i;:::-;:43:::0;::::1;:65::i;:::-;:72;;51839:113;;;::::0;-1:-1:-1;;;51839:113:0;;18843:2:1;51839:113:0::1;::::0;::::1;18825:21:1::0;18882:2;18862:18;;;18855:30;18921;18901:18;;;18894:58;18969:18;;51839:113:0::1;18815:178:1::0;51839:113:0::1;26227:4:::0;26251:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26251:16:0;:30;52052:55:::1;;;::::0;-1:-1:-1;;;52052:55:0;;21502:2:1;52052:55:0::1;::::0;::::1;21484:21:1::0;21541:2;21521:18;;;21514:30;21580:26;21560:18;;;21553:54;21624:18;;52052:55:0::1;21474:174:1::0;52052:55:0::1;52142:1;52128:12;;:15;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;52154:22:0::1;::::0;;;:12:::1;:22;::::0;;;;;;;:35;;;::::1;52179:10;52154:35;::::0;;52200:19:::1;:29:::0;;;;;:52;;;52263:14:::1;:24:::0;;;;;:42;;;52316:17:::1;:27:::0;;;;;:48;;;52375:16:::1;:26:::0;;;;;:46;;;52432:24:::1;:34:::0;;;;;:62;;;::::1;;-1:-1:-1::0;;52432:62:0;;::::1;;::::0;;52505:19:::1;:29:::0;;;;;:52;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;52578:31;52588:10;52600:8;52578:9;:31::i;:::-;52620:33;52633:8;52643:9;52620:12;:33::i;:::-;51436:1225:::0;;;;;;;;:::o;61151:147::-;61224:15;61259:21;:31;61281:8;61259:31;;;;;;;;;;;61252:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61151:147;;;:::o;23215:295::-;-1:-1:-1;;;;;23318:24:0;;15910:10;23318:24;;23310:62;;;;-1:-1:-1;;;23310:62:0;;21148:2:1;23310:62:0;;;21130:21:1;21187:2;21167:18;;;21160:30;21226:27;21206:18;;;21199:55;21271:18;;23310:62:0;21120:175:1;23310:62:0;15910:10;23385:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;23385:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;23385:53:0;;;;;;;;;;23454:48;;17672:41:1;;;23385:42:0;;15910:10;23454:48;;17645:18:1;23454:48:0;;;;;;;;23215:295;;:::o;58289:1175::-;35397:7;;;;35651:9;35643:38;;;;-1:-1:-1;;;35643:38:0;;22680:2:1;35643:38:0;;;22662:21:1;22719:2;22699:18;;;22692:30;22758:18;22738;;;22731:46;22794:18;;35643:38:0;22652:166:1;35643:38:0;58458:34:::1;::::0;;;:24:::1;:34;::::0;;;;;::::1;;58454:179;;;58517:40;58536:10;58548:8;58517:18;:40::i;:::-;58509:112;;;::::0;-1:-1:-1;;;58509:112:0;;32155:2:1;58509:112:0::1;::::0;::::1;32137:21:1::0;32194:2;32174:18;;;32167:30;32233:34;32213:18;;;32206:62;32304:29;32284:18;;;32277:57;32351:19;;58509:112:0::1;32127:249:1::0;58509:112:0::1;58708:26;::::0;;;:16:::1;:26;::::0;;;;;;;;58690:14;;58651:19:::1;:29:::0;;;;;:36;:53:::1;::::0;58690:14;58651:53:::1;:::i;:::-;:83;;58643:127;;;::::0;-1:-1:-1;;;58643:127:0;;28301:2:1;58643:127:0::1;::::0;::::1;28283:21:1::0;28340:2;28320:18;;;28313:30;28379:33;28359:18;;;28352:61;28430:18;;58643:127:0::1;28273:181:1::0;58643:127:0::1;58807:8;:15;58789:7;:14;:33;:77;;;;;58844:15;:22;58826:7;:14;:40;58789:77;58781:121;;;::::0;-1:-1:-1;;;58781:121:0;;30602:2:1;58781:121:0::1;::::0;::::1;30584:21:1::0;30641:2;30621:18;;;30614:30;30680:33;30660:18;;;30653:61;30731:18;;58781:121:0::1;30574:181:1::0;58781:121:0::1;58918:6;58913:544;58932:7;:14;58928:1;:18;58913:544;;;58968:28;59005:41:::0;;;:31:::1;:41;::::0;;;;59047:10;;58968:28;;59047:7;;59055:1;;59047:10;::::1;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;59005:53:0::1;-1:-1:-1::0;;;;;59005:53:0::1;;;;;;;;;;;;58968:91;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59078:15;:22;59104:1;59078:27;59074:372;;;59126:29;::::0;;;:19:::1;:29;::::0;;;;59161:10;;:7;;59169:1;;59161:10;::::1;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;59126:46;;::::1;::::0;::::1;::::0;;-1:-1:-1;59126:46:0;;;;;;;::::1;::::0;;;::::1;-1:-1:-1::0;;;;;59126:46:0;;::::1;::::0;;;::::1;::::0;;59241:11;;;;59250:1;;59241:11;::::1;;;;;:::i;:::-;;;;;;;59191:25;:35;59217:8;59191:35;;;;;;;;;;;:47;59227:7;59235:1;59227:10;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;59191:47:0::1;-1:-1:-1::0;;;;;59191:47:0::1;;;;;;;;;;;;:61;;;;;;;;;;;;:::i;:::-;;59327:15;59343:1;59327:18;;;;;;;;:::i;:::-;;;;;;;59271:31;:41;59303:8;59271:41;;;;;;;;;;;:53;59313:7;59321:1;59313:10;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;59271:53:0::1;-1:-1:-1::0;;;;;59271:53:0::1;;;;;;;;;;;;:74;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;59369:61:0::1;::::0;59392:15:::1;32527:25:1::0;;59421:8:0;;59409:10:::1;::::0;59369:61:::1;::::0;32515:2:1;32500:18;59369:61:0::1;;;;;;;59074:372;-1:-1:-1::0;58948:3:0;::::1;::::0;::::1;:::i;:::-;;;;58913:544;;;;58289:1175:::0;;;;:::o;56985:518::-;35397:7;;;;35651:9;35643:38;;;;-1:-1:-1;;;35643:38:0;;22680:2:1;35643:38:0;;;22662:21:1;22719:2;22699:18;;;22692:30;22758:18;22738;;;22731:46;22794:18;;35643:38:0;22652:166:1;35643:38:0;57095:40:::1;57114:10;57126:8;57095:18;:40::i;:::-;57087:95;;;::::0;-1:-1:-1;;;57087:95:0;;29773:2:1;57087:95:0::1;::::0;::::1;29755:21:1::0;29812:2;29792:18;;;29785:30;29851:34;29831:18;;;29824:62;29922:12;29902:18;;;29895:40;29952:19;;57087:95:0::1;29745:232:1::0;57087:95:0::1;57209:31;::::0;;;:21:::1;:31;::::0;;;;:38;57201:46;::::1;57193:74;;;::::0;-1:-1:-1;;;57193:74:0;;18499:2:1;57193:74:0::1;::::0;::::1;18481:21:1::0;18538:2;18518:18;;;18511:30;18577:17;18557:18;;;18550:45;18612:18;;57193:74:0::1;18471:165:1::0;57193:74:0::1;57302:31;::::0;;;:21:::1;:31;::::0;;;;:38;;57334:5;;57302:38;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;57278:21;;;:11:::1;:21:::0;;;;;;;57302:38;::::1;57278:62:::0;;::::1;::::0;::::1;:::i;:::-;;;;;;:::i;:::-;-1:-1:-1::0;57358:31:0::1;::::0;;;:21:::1;:31;::::0;;;;57351:38:::1;::::0;::::1;:::i;:::-;57451:21;::::0;;;:11:::1;:21;::::0;;;;;;57405:90;;57486:8;;57474:10:::1;::::0;57405:90:::1;::::0;57451:21;57405:90:::1;:::i;:::-;;::::0;;;;::::1;::::0;;57434:15:::1;32527:25:1::0;;57405:90:0;::::1;::::0;32515:2:1;32500:18;57405:90:0::1;32482:76:1::0;54983:320:0;35397:7;;;;35651:9;35643:38;;;;-1:-1:-1;;;35643:38:0;;22680:2:1;35643:38:0;;;22662:21:1;22719:2;22699:18;;;22692:30;22758:18;22738;;;22731:46;22794:18;;35643:38:0;22652:166:1;35643:38:0;55092:40:::1;55111:10;55123:8;55092:18;:40::i;:::-;55084:95;;;::::0;-1:-1:-1;;;55084:95:0;;29773:2:1;55084:95:0::1;::::0;::::1;29755:21:1::0;29812:2;29792:18;;;29785:30;29851:34;29831:18;;;29824:62;29922:12;29902:18;;;29895:40;29952:19;;55084:95:0::1;29745:232:1::0;55084:95:0::1;55190:21;::::0;;;:11:::1;:21;::::0;;;;;;;:29;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;55286:8;55274:10;-1:-1:-1::0;;;;;55235:60:0::1;55267:5;55235:60;;;;;;:::i;:::-;;::::0;;;;::::1;::::0;;55250:15:::1;32527:25:1::0;;55235:60:0;::::1;::::0;32515:2:1;32500:18;55235:60:0::1;32482:76:1::0;52754:1319:0;35397:7;;;;35651:9;35643:38;;;;-1:-1:-1;;;35643:38:0;;22680:2:1;35643:38:0;;;22662:21:1;22719:2;22699:18;;;22692:30;22758:18;22738;;;22731:46;22794:18;;35643:38:0;22652:166:1;35643:38:0;53255:3:::1;53186:65;53230:20:::0;53186:39:::1;:15:::0;53206:18;53186:19:::1;:39::i;:65::-;:72;;53178:113;;;::::0;-1:-1:-1;;;53178:113:0;;18843:2:1;53178:113:0::1;::::0;::::1;18825:21:1::0;18882:2;18862:18;;;18855:30;18921;18901:18;;;18894:58;18969:18;;53178:113:0::1;18815:178:1::0;53178:113:0::1;26227:4:::0;26251:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26251:16:0;:30;53391:55:::1;;;::::0;-1:-1:-1;;;53391:55:0;;21502:2:1;53391:55:0::1;::::0;::::1;21484:21:1::0;21541:2;21521:18;;;21514:30;21580:26;21560:18;;;21553:54;21624:18;;53391:55:0::1;21474:174:1::0;53391:55:0::1;53481:1;53467:12;;:15;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;53493:29:0::1;::::0;;;:19:::1;:29;::::0;;;;;;;:52;;;53556:14:::1;:24:::0;;;;;:42;;;53609:17:::1;:27:::0;;;;;:48;;;53668:16:::1;:26:::0;;;;;:46;;;53725:24:::1;:34:::0;;;;;:62;;-1:-1:-1;;53725:62:0::1;::::0;::::1;;;::::0;;53798:19:::1;:29:::0;;;;;:52;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;53871:31;53881:10;53893:8;53871:9;:31::i;:::-;53913:33;53926:8;53936:9;53913:12;:33::i;:::-;53967:22;::::0;;;:12:::1;:22;::::0;;;;:36;;;::::1;-1:-1:-1::0;;;;;53967:36:0;::::1;;::::0;;54014:51:::1;54031:10;53967:36:::0;:22;54014:16:::1;:51::i;:::-;52754:1319:::0;;;;;;;;;:::o;24410:285::-;24542:41;15910:10;24575:7;24542:18;:41::i;:::-;24534:103;;;;-1:-1:-1;;;24534:103:0;;30184:2:1;24534:103:0;;;30166:21:1;30223:2;30203:18;;;30196:30;30262:34;30242:18;;;30235:62;30333:19;30313:18;;;30306:47;30370:19;;24534:103:0;30156:239:1;24534:103:0;24648:39;24662:4;24668:2;24672:7;24681:5;24648:13;:39::i;:::-;24410:285;;;;:::o;48937:57::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;60704:139::-;60806:29;;;;:19;:29;;;;;;;;;60799:36;;;;;;;;;;;;;;;;;60770:16;;60799:36;;;60806:29;60799:36;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;60799:36:0;;;;;;;;;;;;;;;;;;;;;;60704:139;;;:::o;57922:355::-;35397:7;;;;35651:9;35643:38;;;;-1:-1:-1;;;35643:38:0;;22680:2:1;35643:38:0;;;22662:21:1;22719:2;22699:18;;;22692:30;22758:18;22738;;;22731:46;22794:18;;35643:38:0;22652:166:1;35643:38:0;58038:40:::1;58057:10;58069:8;58038:18;:40::i;:::-;58030:95;;;::::0;-1:-1:-1;;;58030:95:0;;29773:2:1;58030:95:0::1;::::0;::::1;29755:21:1::0;29812:2;29792:18;;;29785:30;29851:34;29831:18;;;29824:62;29922:12;29902:18;;;29895:40;29952:19;;58030:95:0::1;29745:232:1::0;58030:95:0::1;58136:34;::::0;;;:24:::1;:34;::::0;;;;;;;;:51;;-1:-1:-1;;58136:51:0::1;::::0;::::1;;;::::0;;58203:66;;58231:15:::1;32527:25:1::0;;58136:34:0;;58248:10:::1;::::0;58203:66:::1;::::0;32500:18:1;58203:66:0::1;32482:76:1::0;59663:1029:0;35397:7;;;;35651:9;35643:38;;;;-1:-1:-1;;;35643:38:0;;22680:2:1;35643:38:0;;;22662:21:1;22719:2;22699:18;;;22692:30;22758:18;22738;;;22731:46;22794:18;;35643:38:0;22652:166:1;35643:38:0;59824:17:::1;59832:8;59824:7;:17::i;:::-;-1:-1:-1::0;;;;;59810:31:0::1;:10;-1:-1:-1::0;;;;;59810:31:0::1;;59802:67;;;::::0;-1:-1:-1;;;59802:67:0;;30962:2:1;59802:67:0::1;::::0;::::1;30944:21:1::0;31001:2;30981:18;;;30974:30;31040:25;31020:18;;;31013:53;31083:18;;59802:67:0::1;30934:173:1::0;59802:67:0::1;59910:63;::::0;12477:66:1;12464:2;12460:15;;;12456:88;59910:63:0::1;::::0;::::1;12444:101:1::0;12561:12;;;12554:28;;;59880:17:0::1;::::0;12598:12:1;;59910:63:0::1;::::0;;;;;::::1;::::0;;;;;;59900:74;;59910:63:::1;59900:74:::0;;::::1;::::0;59993:22:::1;::::0;;;:11:::1;:22:::0;;;;;;59900:74;;-1:-1:-1;59993:27:0;59985:95:::1;;;::::0;-1:-1:-1;;;59985:95:0;;31314:2:1;59985:95:0::1;::::0;::::1;31296:21:1::0;31353:2;31333:18;;;31326:30;31392:34;31372:18;;;31365:62;31463:25;31443:18;;;31436:53;31506:19;;59985:95:0::1;31286:245:1::0;59985:95:0::1;60122:27:::0;60213:17:::1;60221:8:::0;60213:7:::1;:17::i;:::-;60169:40;::::0;;;;::::1;::::0;::::1;32527:25:1::0;;;-1:-1:-1;;;;;60169:61:0;;::::1;::::0;:22;::::1;::::0;::::1;::::0;32500:18:1;;60169:40:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;60169:61:0::1;;60161:119;;;::::0;-1:-1:-1;;;60161:119:0;;25103:2:1;60161:119:0::1;::::0;::::1;25085:21:1::0;25142:2;25122:18;;;25115:30;25181:34;25161:18;;;25154:62;25252:15;25232:18;;;25225:43;25285:19;;60161:119:0::1;25075:235:1::0;60161:119:0::1;60338:1;60299:27:::0;;;:17:::1;:27;::::0;;;;;-1:-1:-1;;;;;60299:27:0::1;:41:::0;:72;::::1;;;-1:-1:-1::0;60344:22:0::1;::::0;;;:12:::1;:22;::::0;;;;;:27;60299:72:::1;60291:121;;;::::0;-1:-1:-1;;;60291:121:0;;25517:2:1;60291:121:0::1;::::0;::::1;25499:21:1::0;25556:2;25536:18;;;25529:30;25595:34;25575:18;;;25568:62;25666:6;25646:18;;;25639:34;25690:19;;60291:121:0::1;25489:226:1::0;60291:121:0::1;60423:22;::::0;;;:11:::1;:22;::::0;;;;;;;:33;;;60467:27;;;:17:::1;:27:::0;;;;;:57;;;::::1;-1:-1:-1::0;;;;;60467:57:0;::::1;::::0;;::::1;::::0;;;60535:12:::1;:22:::0;;;;;;:41;;;60592:92;60611:15:::1;32527:25:1::0;;60535:41:0;;60467:57;60423:33;;60592:92:::1;::::0;32500:18:1;60592:92:0::1;;;;;;;59791:901;;59663:1029:::0;;;:::o;54436:157::-;54528:13;54561:24;54576:8;54561:14;:24::i;47227:53::-;;;;;;;;;;;;;;;;:::i;38556:244::-;37675:6;;-1:-1:-1;;;;;37675:6:0;;;;;15910:10;37822:23;37814:68;;;;-1:-1:-1;;;37814:68:0;;27114:2:1;37814:68:0;;;27096:21:1;;;27133:18;;;27126:30;27192:34;27172:18;;;27165:62;27244:18;;37814:68:0;27086:182:1;37814:68:0;-1:-1:-1;;;;;38645:22:0;::::1;38637:73;;;::::0;-1:-1:-1;;;38637:73:0;;19619:2:1;38637:73:0::1;::::0;::::1;19601:21:1::0;19658:2;19638:18;;;19631:30;19697:34;19677:18;;;19670:62;19768:8;19748:18;;;19741:36;19794:19;;38637:73:0::1;19591:228:1::0;38637:73:0::1;38747:6;::::0;38726:38:::1;::::0;-1:-1:-1;;;;;38726:38:0;;::::1;::::0;38747:6:::1;::::0;::::1;;::::0;38726:38:::1;::::0;;;::::1;38775:6;:17:::0;;-1:-1:-1;;;;;38775:17:0;;::::1;;;::::0;;;::::1;::::0;;;::::1;::::0;;38556:244::o;47911:57::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;56658:242::-;35397:7;;;;35651:9;35643:38;;;;-1:-1:-1;;;35643:38:0;;22680:2:1;35643:38:0;;;22662:21:1;22719:2;22699:18;;;22692:30;22758:18;22738;;;22731:46;22794:18;;35643:38:0;22652:166:1;35643:38:0;56764:31:::1;::::0;;;:21:::1;:31;::::0;;;;;;:43;;::::1;::::0;::::1;::::0;;;;;;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;56883:8;56871:10;-1:-1:-1::0;;;;;56823:69:0::1;56864:5;56823:69;;;;;;:::i;:::-;;::::0;;;;::::1;::::0;;56847:15:::1;32527:25:1::0;;56823:69:0;::::1;::::0;32515:2:1;32500:18;56823:69:0::1;32482:76:1::0;30039:174:0;30114:24;;;;:15;:24;;;;;:29;;;;-1:-1:-1;;;;;30114:29:0;;;;;;;;:24;;30168:23;30114:24;30168:14;:23::i;:::-;-1:-1:-1;;;;;30159:46:0;;;;;;;;;;;30039:174;;:::o;26456:348::-;26549:4;26251:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26251:16:0;26566:73;;;;-1:-1:-1;;;26566:73:0;;21855:2:1;26566:73:0;;;21837:21:1;21894:2;21874:18;;;21867:30;21933:34;21913:18;;;21906:62;22004:14;21984:18;;;21977:42;22036:19;;26566:73:0;21827:234:1;26566:73:0;26650:13;26666:23;26681:7;26666:14;:23::i;:::-;26650:39;;26719:5;-1:-1:-1;;;;;26708:16:0;:7;-1:-1:-1;;;;;26708:16:0;;:51;;;;26752:7;-1:-1:-1;;;;;26728:31:0;:20;26740:7;26728:11;:20::i;:::-;-1:-1:-1;;;;;26728:31:0;;26708:51;:87;;;-1:-1:-1;;;;;;23702:25:0;;;23678:4;23702:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;26763:32;26700:96;26456:348;-1:-1:-1;;;;26456:348:0:o;29377:544::-;29502:4;-1:-1:-1;;;;;29475:31:0;:23;29490:7;29475:14;:23::i;:::-;-1:-1:-1;;;;;29475:31:0;;29467:85;;;;-1:-1:-1;;;29467:85:0;;27475:2:1;29467:85:0;;;27457:21:1;27514:2;27494:18;;;27487:30;27553:34;27533:18;;;27526:62;27624:11;27604:18;;;27597:39;27653:19;;29467:85:0;27447:231:1;29467:85:0;-1:-1:-1;;;;;29571:16:0;;29563:65;;;;-1:-1:-1;;;29563:65:0;;20383:2:1;29563:65:0;;;20365:21:1;20422:2;20402:18;;;20395:30;20461:34;20441:18;;;20434:62;20532:6;20512:18;;;20505:34;20556:19;;29563:65:0;20355:226:1;29563:65:0;29641:39;29662:4;29668:2;29672:7;29641:20;:39::i;:::-;29745:29;29762:1;29766:7;29745:8;:29::i;:::-;-1:-1:-1;;;;;29787:15:0;;;;;;:9;:15;;;;;:20;;29806:1;;29787:15;:20;;29806:1;;29787:20;:::i;:::-;;;;-1:-1:-1;;;;;;;29818:13:0;;;;;;:9;:13;;;;;:18;;29835:1;;29818:13;:18;;29835:1;;29818:18;:::i;:::-;;;;-1:-1:-1;;29847:16:0;;;;:7;:16;;;;;;:21;;;;-1:-1:-1;;;;;29847:21:0;;;;;;;;;29886:27;;29847:16;;29886:27;;;;;;;29377:544;;;:::o;36385:120::-;35397:7;;;;35921:41;;;;-1:-1:-1;;;35921:41:0;;18150:2:1;35921:41:0;;;18132:21:1;18189:2;18169:18;;;18162:30;18228:22;18208:18;;;18201:50;18268:18;;35921:41:0;18122:170:1;35921:41:0;36444:7:::1;:15:::0;;-1:-1:-1;;36444:15:0::1;::::0;;36475:22:::1;15910:10:::0;36484:12:::1;36475:22;::::0;-1:-1:-1;;;;;14760:55:1;;;14742:74;;14730:2;14715:18;36475:22:0::1;;;;;;;36385:120::o:0;54260:168::-;54370:17;54378:8;54370:7;:17::i;:::-;-1:-1:-1;;;;;54356:31:0;:10;-1:-1:-1;;;;;54356:31:0;;54348:40;;;;;;54399:21;54411:8;54399:11;:21::i;42300:98::-;42358:7;42385:5;42389:1;42385;:5;:::i;:::-;42378:12;42300:98;-1:-1:-1;;;42300:98:0:o;36126:118::-;35397:7;;;;35651:9;35643:38;;;;-1:-1:-1;;;35643:38:0;;22680:2:1;35643:38:0;;;22662:21:1;22719:2;22699:18;;;22692:30;22758:18;22738;;;22731:46;22794:18;;35643:38:0;22652:166:1;35643:38:0;36186:7:::1;:14:::0;;-1:-1:-1;;36186:14:0::1;36196:4;36186:14;::::0;;36216:20:::1;36223:12;15910:10:::0;;15830:98;27146:110;27222:26;27232:2;27236:7;27222:26;;;;;;;;;;;;:9;:26::i;:::-;27146:110;;:::o;33596:217::-;26227:4;26251:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26251:16:0;33688:75;;;;-1:-1:-1;;;33688:75:0;;24271:2:1;33688:75:0;;;24253:21:1;24310:2;24290:18;;;24283:30;24349:34;24329:18;;;24322:62;24420:16;24400:18;;;24393:44;24454:19;;33688:75:0;24243:236:1;33688:75:0;33774:19;;;;:10;:19;;;;;;;;:31;;;;;;;;:::i;25577:272::-;25691:28;25701:4;25707:2;25711:7;25691:9;:28::i;:::-;25738:48;25761:4;25767:2;25771:7;25780:5;25738:22;:48::i;:::-;25730:111;;;;-1:-1:-1;;;25730:111:0;;19200:2:1;25730:111:0;;;19182:21:1;19239:2;19219:18;;;19212:30;19278:34;19258:18;;;19251:62;19349:20;19329:18;;;19322:48;19387:19;;25730:111:0;19172:240:1;32761:679:0;26227:4;26251:16;;;:7;:16;;;;;;32834:13;;-1:-1:-1;;;;;26251:16:0;32860:78;;;;-1:-1:-1;;;32860:78:0;;26283:2:1;32860:78:0;;;26265:21:1;26322:2;26302:18;;;26295:30;26361:34;26341:18;;;26334:62;26432:19;26412:18;;;26405:47;26469:19;;32860:78:0;26255:239:1;32860:78:0;32951:23;32977:19;;;:10;:19;;;;;32951:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33007:18;33028:10;22380:9;;;;;;;;;-1:-1:-1;22380:9:0;;;22303:94;33028:10;33007:31;;33120:4;33114:18;33136:1;33114:23;33110:72;;;-1:-1:-1;33161:9:0;32761:679;-1:-1:-1;;32761:679:0:o;33110:72::-;33286:23;;:27;33282:108;;33361:4;33367:9;33344:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;33330:48;;;;32761:679;;;:::o;33282:108::-;33409:23;33424:7;33409:14;:23::i;54081:171::-;35397:7;;;;35651:9;35643:38;;;;-1:-1:-1;;;35643:38:0;;22680:2:1;35643:38:0;;;22662:21:1;22719:2;22699:18;;;22692:30;22758:18;22738;;;22731:46;22794:18;;35643:38:0;22652:166:1;34042:206:0;34111:20;34123:7;34111:11;:20::i;:::-;34154:19;;;;:10;:19;;;;;34148:33;;;;;:::i;:::-;:38;;-1:-1:-1;34144:97:0;;34210:19;;;;:10;:19;;;;;34203:26;;;:::i;27483:250::-;27579:18;27585:2;27589:7;27579:5;:18::i;:::-;27616:54;27647:1;27651:2;27655:7;27664:5;27616:22;:54::i;:::-;27608:117;;;;-1:-1:-1;;;27608:117:0;;19200:2:1;27608:117:0;;;19182:21:1;19239:2;19219:18;;;19212:30;19278:34;19258:18;;;19251:62;19349:20;19329:18;;;19322:48;19387:19;;27608:117:0;19172:240:1;30778:843:0;30899:4;-1:-1:-1;;;;;30925:13:0;;8318:20;8357:8;30921:693;;30961:72;;;;;-1:-1:-1;;;;;30961:36:0;;;;;:72;;15910:10;;31012:4;;31018:7;;31027:5;;30961:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30961:72:0;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;30957:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31207:13:0;;31203:341;;31250:60;;-1:-1:-1;;;31250:60:0;;19200:2:1;31250:60:0;;;19182:21:1;19239:2;19219:18;;;19212:30;19278:34;19258:18;;;19251:62;19349:20;19329:18;;;19322:48;19387:19;;31250:60:0;19172:240:1;31203:341:0;31494:6;31488:13;31479:6;31475:2;31471:15;31464:38;30957:602;31084:55;;31094:45;31084:55;;-1:-1:-1;31077:62:0;;30921:693;-1:-1:-1;31598:4:0;30778:843;;;;;;:::o;21806:360::-;26227:4;26251:16;;;:7;:16;;;;;;21879:13;;-1:-1:-1;;;;;26251:16:0;21905:76;;;;-1:-1:-1;;;21905:76:0;;27885:2:1;21905:76:0;;;27867:21:1;27924:2;27904:18;;;27897:30;27963:34;27943:18;;;27936:62;28034:17;28014:18;;;28007:45;28069:19;;21905:76:0;27857:237:1;21905:76:0;21994:21;22018:10;22380:9;;;;;;;;;-1:-1:-1;22380:9:0;;;22303:94;22018:10;21994:34;;22070:1;22052:7;22046:21;:25;:112;;;;;;;;;;;;;;;;;22111:7;22120:18;:7;:16;:18::i;:::-;22094:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;22039:119;21806:360;-1:-1:-1;;;21806:360:0:o;28680:::-;28740:13;28756:23;28771:7;28756:14;:23::i;:::-;28740:39;;28792:48;28813:5;28828:1;28832:7;28792:20;:48::i;:::-;28881:29;28898:1;28902:7;28881:8;:29::i;:::-;-1:-1:-1;;;;;28923:16:0;;;;;;:9;:16;;;;;:21;;28943:1;;28923:16;:21;;28943:1;;28923:21;:::i;:::-;;;;-1:-1:-1;;28962:16:0;;;;:7;:16;;;;;;28955:23;;;;;;28996:36;28970:7;;28962:16;-1:-1:-1;;;;;28996:36:0;;;;;28962:16;;28996:36;28729:311;28680:360;:::o;28069:382::-;-1:-1:-1;;;;;28149:16:0;;28141:61;;;;-1:-1:-1;;;28141:61:0;;25922:2:1;28141:61:0;;;25904:21:1;;;25941:18;;;25934:30;26000:34;25980:18;;;25973:62;26052:18;;28141:61:0;25894:182:1;28141:61:0;26227:4;26251:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26251:16:0;:30;28213:58;;;;-1:-1:-1;;;28213:58:0;;20026:2:1;28213:58:0;;;20008:21:1;20065:2;20045:18;;;20038:30;20104;20084:18;;;20077:58;20152:18;;28213:58:0;19998:178:1;28213:58:0;28284:45;28313:1;28317:2;28321:7;28284:20;:45::i;:::-;-1:-1:-1;;;;;28342:13:0;;;;;;:9;:13;;;;;:18;;28359:1;;28342:13;:18;;28359:1;;28342:18;:::i;:::-;;;;-1:-1:-1;;28371:16:0;;;;:7;:16;;;;;;:21;;;;-1:-1:-1;;;;;28371:21:0;;;;;;;;28410:33;;28371:16;;;28410:33;;28371:16;;28410:33;28069:382;;:::o;16481:723::-;16537:13;16758:10;16754:53;;-1:-1:-1;;16785:10:0;;;;;;;;;;;;;;;;;;16481:723::o;16754:53::-;16832:5;16817:12;16873:78;16880:9;;16873:78;;16906:8;;;;:::i;:::-;;-1:-1:-1;16929:10:0;;-1:-1:-1;16937:2:0;16929:10;;:::i;:::-;;;16873:78;;;16961:19;16993:6;16983:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16983:17:0;;16961:39;;17011:154;17018:10;;17011:154;;17045:11;17055:1;17045:11;;:::i;:::-;;-1:-1:-1;17114:10:0;17122:2;17114:5;:10;:::i;:::-;17101:24;;:2;:24;:::i;:::-;17088:39;;17071:6;17078;17071:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;17142:11:0;17151:2;17142:11;;:::i;:::-;;;17011:154;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;14:465:1;78:5;112:18;104:6;101:30;98:2;;;134:18;;:::i;:::-;172:116;282:4;213:66;208:2;200:6;196:15;192:88;188:99;172:116;:::i;:::-;163:125;;311:6;304:5;297:21;351:3;342:6;337:3;333:16;330:25;327:2;;;368:1;365;358:12;327:2;417:6;412:3;405:4;398:5;394:16;381:43;471:1;464:4;455:6;448:5;444:18;440:29;433:40;88:391;;;;;:::o;484:748::-;538:5;591:3;584:4;576:6;572:17;568:27;558:2;;609:1;606;599:12;558:2;645:6;632:20;671:4;695:60;711:43;751:2;711:43;:::i;:::-;695:60;:::i;:::-;777:3;801:2;796:3;789:15;829:2;824:3;820:12;813:19;;864:2;856:6;852:15;916:3;911:2;905;902:1;898:10;890:6;886:23;882:32;879:41;876:2;;;933:1;930;923:12;876:2;955:1;965:238;979:2;976:1;973:9;965:238;;;1050:3;1037:17;1067:31;1092:5;1067:31;:::i;:::-;1111:18;;1149:12;;;;1181;;;;997:1;990:9;965:238;;;-1:-1:-1;1221:5:1;;548:684;-1:-1:-1;;;;;;;548:684:1:o;1237:856::-;1290:5;1343:3;1336:4;1328:6;1324:17;1320:27;1310:2;;1361:1;1358;1351:12;1310:2;1397:6;1384:20;1423:4;1447:60;1463:43;1503:2;1463:43;:::i;1447:60::-;1529:3;1553:2;1548:3;1541:15;1581:2;1576:3;1572:12;1565:19;;1616:2;1608:6;1604:15;1668:3;1663:2;1657;1654:1;1650:10;1642:6;1638:23;1634:32;1631:41;1628:2;;;1685:1;1682;1675:12;1628:2;1707:1;1728;1738:326;1754:2;1749:3;1746:11;1738:326;;;1835:3;1822:17;1871:18;1858:11;1855:35;1852:2;;;1903:1;1900;1893:12;1852:2;1932:57;1985:3;1980:2;1966:11;1958:6;1954:24;1950:33;1932:57;:::i;:::-;1920:70;;-1:-1:-1;2010:12:1;;;;2042;;;;1776:1;1767:11;1738:326;;;-1:-1:-1;2082:5:1;;1300:793;-1:-1:-1;;;;;;;;1300:793:1:o;2098:160::-;2163:20;;2219:13;;2212:21;2202:32;;2192:2;;2248:1;2245;2238:12;2192:2;2144:114;;;:::o;2263:221::-;2306:5;2359:3;2352:4;2344:6;2340:17;2336:27;2326:2;;2377:1;2374;2367:12;2326:2;2399:79;2474:3;2465:6;2452:20;2445:4;2437:6;2433:17;2399:79;:::i;2489:247::-;2548:6;2601:2;2589:9;2580:7;2576:23;2572:32;2569:2;;;2617:1;2614;2607:12;2569:2;2656:9;2643:23;2675:31;2700:5;2675:31;:::i;2741:251::-;2811:6;2864:2;2852:9;2843:7;2839:23;2835:32;2832:2;;;2880:1;2877;2870:12;2832:2;2912:9;2906:16;2931:31;2956:5;2931:31;:::i;2997:388::-;3065:6;3073;3126:2;3114:9;3105:7;3101:23;3097:32;3094:2;;;3142:1;3139;3132:12;3094:2;3181:9;3168:23;3200:31;3225:5;3200:31;:::i;:::-;3250:5;-1:-1:-1;3307:2:1;3292:18;;3279:32;3320:33;3279:32;3320:33;:::i;:::-;3372:7;3362:17;;;3084:301;;;;;:::o;3390:456::-;3467:6;3475;3483;3536:2;3524:9;3515:7;3511:23;3507:32;3504:2;;;3552:1;3549;3542:12;3504:2;3591:9;3578:23;3610:31;3635:5;3610:31;:::i;:::-;3660:5;-1:-1:-1;3717:2:1;3702:18;;3689:32;3730:33;3689:32;3730:33;:::i;:::-;3494:352;;3782:7;;-1:-1:-1;;;3836:2:1;3821:18;;;;3808:32;;3494:352::o;3851:794::-;3946:6;3954;3962;3970;4023:3;4011:9;4002:7;3998:23;3994:33;3991:2;;;4040:1;4037;4030:12;3991:2;4079:9;4066:23;4098:31;4123:5;4098:31;:::i;:::-;4148:5;-1:-1:-1;4205:2:1;4190:18;;4177:32;4218:33;4177:32;4218:33;:::i;:::-;4270:7;-1:-1:-1;4324:2:1;4309:18;;4296:32;;-1:-1:-1;4379:2:1;4364:18;;4351:32;4406:18;4395:30;;4392:2;;;4438:1;4435;4428:12;4392:2;4461:22;;4514:4;4506:13;;4502:27;-1:-1:-1;4492:2:1;;4543:1;4540;4533:12;4492:2;4566:73;4631:7;4626:2;4613:16;4608:2;4604;4600:11;4566:73;:::i;:::-;4556:83;;;3981:664;;;;;;;:::o;4650:315::-;4715:6;4723;4776:2;4764:9;4755:7;4751:23;4747:32;4744:2;;;4792:1;4789;4782:12;4744:2;4831:9;4818:23;4850:31;4875:5;4850:31;:::i;:::-;4900:5;-1:-1:-1;4924:35:1;4955:2;4940:18;;4924:35;:::i;:::-;4914:45;;4734:231;;;;;:::o;4970:315::-;5038:6;5046;5099:2;5087:9;5078:7;5074:23;5070:32;5067:2;;;5115:1;5112;5105:12;5067:2;5154:9;5141:23;5173:31;5198:5;5173:31;:::i;:::-;5223:5;5275:2;5260:18;;;;5247:32;;-1:-1:-1;;;5057:228:1:o;5290:908::-;5471:6;5479;5487;5495;5548:3;5536:9;5527:7;5523:23;5519:33;5516:2;;;5565:1;5562;5555:12;5516:2;5605:9;5592:23;5634:18;5675:2;5667:6;5664:14;5661:2;;;5691:1;5688;5681:12;5661:2;5714:61;5767:7;5758:6;5747:9;5743:22;5714:61;:::i;:::-;5704:71;;5828:2;5817:9;5813:18;5800:32;5784:48;;5857:2;5847:8;5844:16;5841:2;;;5873:1;5870;5863:12;5841:2;5896:62;5950:7;5939:8;5928:9;5924:24;5896:62;:::i;:::-;5886:72;;6011:2;6000:9;5996:18;5983:32;5967:48;;6040:2;6030:8;6027:16;6024:2;;;6056:1;6053;6046:12;6024:2;;6079:62;6133:7;6122:8;6111:9;6107:24;6079:62;:::i;:::-;5506:692;;;;-1:-1:-1;6069:72:1;;6188:2;6173:18;6160:32;;-1:-1:-1;;;5506:692:1:o;6203:1217::-;6330:6;6338;6346;6399:2;6387:9;6378:7;6374:23;6370:32;6367:2;;;6415:1;6412;6405:12;6367:2;6455:9;6442:23;6484:18;6525:2;6517:6;6514:14;6511:2;;;6541:1;6538;6531:12;6511:2;6564:61;6617:7;6608:6;6597:9;6593:22;6564:61;:::i;:::-;6554:71;;6644:2;6634:12;;6699:2;6688:9;6684:18;6671:32;6728:2;6718:8;6715:16;6712:2;;;6744:1;6741;6734:12;6712:2;6767:24;;;-1:-1:-1;6822:4:1;6814:13;;6810:27;-1:-1:-1;6800:2:1;;6851:1;6848;6841:12;6800:2;6887;6874:16;6910:60;6926:43;6966:2;6926:43;:::i;6910:60::-;6992:3;7016:2;7011:3;7004:15;7044:2;7039:3;7035:12;7028:19;;7075:2;7071;7067:11;7123:7;7118:2;7112;7109:1;7105:10;7101:2;7097:19;7093:28;7090:41;7087:2;;;7144:1;7141;7134:12;7087:2;7166:1;7157:10;;7176:163;7190:2;7187:1;7184:9;7176:163;;;7247:17;;7235:30;;7208:1;7201:9;;;;;7285:12;;;;7317;;7176:163;;;-1:-1:-1;6357:1063:1;;7358:5;;-1:-1:-1;;;;7410:2:1;7395:18;;;;7382:32;;-1:-1:-1;;;6357:1063:1:o;7425:248::-;7490:6;7498;7551:2;7539:9;7530:7;7526:23;7522:32;7519:2;;;7567:1;7564;7557:12;7519:2;7590:26;7606:9;7590:26;:::i;7678:180::-;7737:6;7790:2;7778:9;7769:7;7765:23;7761:32;7758:2;;;7806:1;7803;7796:12;7758:2;-1:-1:-1;7829:23:1;;7748:110;-1:-1:-1;7748:110:1:o;7863:245::-;7921:6;7974:2;7962:9;7953:7;7949:23;7945:32;7942:2;;;7990:1;7987;7980:12;7942:2;8029:9;8016:23;8048:30;8072:5;8048:30;:::i;8113:249::-;8182:6;8235:2;8223:9;8214:7;8210:23;8206:32;8203:2;;;8251:1;8248;8241:12;8203:2;8283:9;8277:16;8302:30;8326:5;8302:30;:::i;8367:390::-;8445:6;8453;8506:2;8494:9;8485:7;8481:23;8477:32;8474:2;;;8522:1;8519;8512:12;8474:2;8562:9;8549:23;8595:18;8587:6;8584:30;8581:2;;;8627:1;8624;8617:12;8581:2;8650:50;8692:7;8683:6;8672:9;8668:22;8650:50;:::i;:::-;8640:60;8747:2;8732:18;;;;8719:32;;-1:-1:-1;;;;8464:293:1:o;8947:315::-;9015:6;9023;9076:2;9064:9;9055:7;9051:23;9047:32;9044:2;;;9092:1;9089;9082:12;9044:2;9128:9;9115:23;9105:33;;9188:2;9177:9;9173:18;9160:32;9201:31;9226:5;9201:31;:::i;9267:383::-;9344:6;9352;9360;9413:2;9401:9;9392:7;9388:23;9384:32;9381:2;;;9429:1;9426;9419:12;9381:2;9465:9;9452:23;9442:33;;9525:2;9514:9;9510:18;9497:32;9538:31;9563:5;9538:31;:::i;9655:1092::-;9803:6;9811;9819;9827;9835;9843;9851;9859;9867;9920:3;9908:9;9899:7;9895:23;9891:33;9888:2;;;9937:1;9934;9927:12;9888:2;9973:9;9960:23;9950:33;;10033:2;10022:9;10018:18;10005:32;10046:31;10071:5;10046:31;:::i;:::-;10096:5;-1:-1:-1;10148:2:1;10133:18;;10120:32;;-1:-1:-1;10199:2:1;10184:18;;10171:32;;-1:-1:-1;10250:3:1;10235:19;;10222:33;;-1:-1:-1;10302:3:1;10287:19;;10274:33;;-1:-1:-1;10326:36:1;10357:3;10342:19;;10326:36;:::i;:::-;10316:46;;10413:3;10402:9;10398:19;10385:33;10437:18;10478:2;10470:6;10467:14;10464:2;;;10494:1;10491;10484:12;10464:2;10517:50;10559:7;10550:6;10539:9;10535:22;10517:50;:::i;:::-;10507:60;;10620:3;10609:9;10605:19;10592:33;10576:49;;10650:2;10640:8;10637:16;10634:2;;;10666:1;10663;10656:12;10634:2;;10689:52;10733:7;10722:8;10711:9;10707:24;10689:52;:::i;:::-;10679:62;;;9878:869;;;;;;;;;;;:::o;10752:248::-;10820:6;10828;10881:2;10869:9;10860:7;10856:23;10852:32;10849:2;;;10897:1;10894;10887:12;10849:2;-1:-1:-1;;10920:23:1;;;10990:2;10975:18;;;10962:32;;-1:-1:-1;10839:161:1:o;11005:956::-;11144:6;11152;11160;11168;11176;11184;11192;11200;11253:3;11241:9;11232:7;11228:23;11224:33;11221:2;;;11270:1;11267;11260:12;11221:2;11306:9;11293:23;11283:33;;11363:2;11352:9;11348:18;11335:32;11325:42;;11414:2;11403:9;11399:18;11386:32;11376:42;;11465:2;11454:9;11450:18;11437:32;11427:42;;11516:3;11505:9;11501:19;11488:33;11478:43;;11540:36;11571:3;11560:9;11556:19;11540:36;:::i;:::-;11530:46;;11627:3;11616:9;11612:19;11599:33;11651:18;11692:2;11684:6;11681:14;11678:2;;;11708:1;11705;11698:12;11678:2;11731:50;11773:7;11764:6;11753:9;11749:22;11731:50;:::i;:::-;11721:60;;11834:3;11823:9;11819:19;11806:33;11790:49;;11864:2;11854:8;11851:16;11848:2;;;11880:1;11877;11870:12;11848:2;;11903:52;11947:7;11936:8;11925:9;11921:24;11903:52;:::i;:::-;11893:62;;;11211:750;;;;;;;;;;;:::o;11966:316::-;12007:3;12045:5;12039:12;12072:6;12067:3;12060:19;12088:63;12144:6;12137:4;12132:3;12128:14;12121:4;12114:5;12110:16;12088:63;:::i;:::-;12196:2;12184:15;12201:66;12180:88;12171:98;;;;12271:4;12167:109;;12015:267;-1:-1:-1;;12015:267:1:o;12621:276::-;12752:3;12790:6;12784:13;12806:53;12852:6;12847:3;12840:4;12832:6;12828:17;12806:53;:::i;:::-;12875:16;;;;;12760:137;-1:-1:-1;;12760:137:1:o;12902:470::-;13081:3;13119:6;13113:13;13135:53;13181:6;13176:3;13169:4;13161:6;13157:17;13135:53;:::i;:::-;13251:13;;13210:16;;;;13273:57;13251:13;13210:16;13307:4;13295:17;;13273:57;:::i;:::-;13346:20;;13089:283;-1:-1:-1;;;;13089:283:1:o;13377:1214::-;13505:3;13534:1;13567:6;13561:13;13597:3;13619:1;13647:9;13643:2;13639:18;13629:28;;13707:2;13696:9;13692:18;13729;13719:2;;13773:4;13765:6;13761:17;13751:27;;13719:2;13799;13847;13839:6;13836:14;13816:18;13813:38;13810:2;;;13886:77;13881:3;13874:90;13987:4;13984:1;13977:15;14017:4;14012:3;14005:17;13810:2;14048:18;14075:162;;;;14251:1;14246:320;;;;14041:525;;14075:162;-1:-1:-1;;14112:9:1;14108:82;14103:3;14096:95;14220:6;14215:3;14211:16;14204:23;;14075:162;;14246:320;33163:1;33156:14;;;33200:4;33187:18;;14341:1;14355:165;14369:6;14366:1;14363:13;14355:165;;;14447:14;;14434:11;;;14427:35;14490:16;;;;14384:10;;14355:165;;;14359:3;;14549:6;14544:3;14540:16;14533:23;;14041:525;-1:-1:-1;14582:3:1;;13513:1078;-1:-1:-1;;;;;;;;13513:1078:1:o;14827:511::-;15021:4;-1:-1:-1;;;;;15131:2:1;15123:6;15119:15;15108:9;15101:34;15183:2;15175:6;15171:15;15166:2;15155:9;15151:18;15144:43;;15223:6;15218:2;15207:9;15203:18;15196:34;15266:3;15261:2;15250:9;15246:18;15239:31;15287:45;15327:3;15316:9;15312:19;15304:6;15287:45;:::i;:::-;15279:53;15030:308;-1:-1:-1;;;;;;15030:308:1:o;15343:681::-;15514:2;15566:21;;;15636:13;;15539:18;;;15658:22;;;15485:4;;15514:2;15737:15;;;;15711:2;15696:18;;;15485:4;15780:218;15794:6;15791:1;15788:13;15780:218;;;15859:13;;-1:-1:-1;;;;;15855:62:1;15843:75;;15973:15;;;;15938:12;;;;15816:1;15809:9;15780:218;;;-1:-1:-1;16015:3:1;;15494:530;-1:-1:-1;;;;;;15494:530:1:o;16029:861::-;16191:4;16220:2;16260;16249:9;16245:18;16290:2;16279:9;16272:21;16313:6;16348;16342:13;16379:6;16371;16364:22;16417:2;16406:9;16402:18;16395:25;;16479:2;16469:6;16466:1;16462:14;16451:9;16447:30;16443:39;16429:53;;16517:2;16509:6;16505:15;16538:1;16548:313;16562:6;16559:1;16556:13;16548:313;;;16651:66;16639:9;16631:6;16627:22;16623:95;16618:3;16611:108;16742:39;16774:6;16765;16759:13;16742:39;:::i;:::-;16732:49;-1:-1:-1;16839:12:1;;;;16804:15;;;;16584:1;16577:9;16548:313;;;-1:-1:-1;16878:6:1;;16200:690;-1:-1:-1;;;;;;;16200:690:1:o;16895:632::-;17066:2;17118:21;;;17188:13;;17091:18;;;17210:22;;;17037:4;;17066:2;17289:15;;;;17263:2;17248:18;;;17037:4;17332:169;17346:6;17343:1;17340:13;17332:169;;;17407:13;;17395:26;;17476:15;;;;17441:12;;;;17368:1;17361:9;17332:169;;17724:219;17873:2;17862:9;17855:21;17836:4;17893:44;17933:2;17922:9;17918:18;17910:6;17893:44;:::i;32563:334::-;32634:2;32628:9;32690:2;32680:13;;32695:66;32676:86;32664:99;;32793:18;32778:34;;32814:22;;;32775:62;32772:2;;;32840:18;;:::i;:::-;32876:2;32869:22;32608:289;;-1:-1:-1;32608:289:1:o;32902:183::-;32962:4;32995:18;32987:6;32984:30;32981:2;;;33017:18;;:::i;:::-;-1:-1:-1;33062:1:1;33058:14;33074:4;33054:25;;32971:114::o;33216:128::-;33256:3;33287:1;33283:6;33280:1;33277:13;33274:2;;;33293:18;;:::i;:::-;-1:-1:-1;33329:9:1;;33264:80::o;33349:120::-;33389:1;33415;33405:2;;33420:18;;:::i;:::-;-1:-1:-1;33454:9:1;;33395:74::o;33474:125::-;33514:4;33542:1;33539;33536:8;33533:2;;;33547:18;;:::i;:::-;-1:-1:-1;33584:9:1;;33523:76::o;33604:258::-;33676:1;33686:113;33700:6;33697:1;33694:13;33686:113;;;33776:11;;;33770:18;33757:11;;;33750:39;33722:2;33715:10;33686:113;;;33817:6;33814:1;33811:13;33808:2;;;-1:-1:-1;;33852:1:1;33834:16;;33827:27;33657:205::o;33867:437::-;33946:1;33942:12;;;;33989;;;34010:2;;34064:4;34056:6;34052:17;34042:27;;34010:2;34117;34109:6;34106:14;34086:18;34083:38;34080:2;;;34154:77;34151:1;34144:88;34255:4;34252:1;34245:15;34283:4;34280:1;34273:15;34080:2;;33922:382;;;:::o;34309:195::-;34348:3;34379:66;34372:5;34369:77;34366:2;;;34449:18;;:::i;:::-;-1:-1:-1;34496:1:1;34485:13;;34356:148::o;34509:112::-;34541:1;34567;34557:2;;34572:18;;:::i;:::-;-1:-1:-1;34606:9:1;;34547:74::o;34626:184::-;34678:77;34675:1;34668:88;34775:4;34772:1;34765:15;34799:4;34796:1;34789:15;34815:184;34867:77;34864:1;34857:88;34964:4;34961:1;34954:15;34988:4;34985:1;34978:15;35004:184;35056:77;35053:1;35046:88;35153:4;35150:1;35143:15;35177:4;35174:1;35167:15;35193:184;35245:77;35242:1;35235:88;35342:4;35339:1;35332:15;35366:4;35363:1;35356:15;35382:154;-1:-1:-1;;;;;35461:5:1;35457:54;35450:5;35447:65;35437:2;;35526:1;35523;35516:12;35541:177;35626:66;35619:5;35615:78;35608:5;35605:89;35595:2;;35708:1;35705;35698:12
Swarm Source
ipfs://a445ea9fd580d5f478bb074fecd0d2e23bd687b104a9bab076e6fb67b4371c62
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.