Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
0 OM
Holders
570
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 OMLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
OmniMonke
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.8.4; //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@Q&Rdq6qKDWQ@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@QRXt<~'` ._^cag@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@k*, `!jQ@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@U; ,}Q@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@g; 'w@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@i ~Q@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@L '*Ij}i~ :@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@k 7@@@@@@@D =@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@! k@@@@@@@@ `Q@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@; k@@@@@@@@ `Q@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@; k@@@@@@@@ `Q@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@t^^^^^^^^^^^^;~'` k@@@@@@@@ `Q@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@QUz+:'` k@@@@@@@@ '@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@K?' k@@@@@@@@ X@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@b; k@@@@@@@@ f@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@Q; k@@@@@@@@ =Q@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@Q' k@@@@@@@@ `;5Q@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@7 k@@@@@@@@ ,~|ZQ@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@; k@@@@@@@@ `',;><<<<<<<<<<<?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@; k@@@@@@@@ `Q@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@; k@@@@@@@@ `Q@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@! k@@@@@@@@ `Q@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@f y@@@@@@@Q ~@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@; +obDdhL` `Q@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@? :Q@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@a' `L@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@k; ,YQ@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@QP>' `;}Q@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@Rj7^,` `';iZWQ@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@Q#RdqAAKDWQ@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ import "../token/onft/extension/UniversalONFT.sol"; import "@openzeppelin/contracts/utils/Strings.sol"; /// @title A LayerZero UniversalONFT example /// @notice You can use this to mint ONFT and send nftIds across chain. /// Each contract deployed to a chain should carefully set a `_startMintIndex` and a `_maxMint` /// value to set a range of allowed mintable nftIds (so that no two chains can mint the same id!) contract OmniMonke is UniversalONFT { constructor( address _layerZeroEndpoint, uint _startMintId, uint _endMintId, uint _startTimestamp ) UniversalONFT("OmniMonke", "OM", _layerZeroEndpoint, _startMintId, _endMintId, _startTimestamp) {} }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8; import ".././ONFT.sol"; /// @title Interface of the UniversalONFT standard contract UniversalONFT is ONFT { uint public nextMintId; uint public maxMintId; uint public immutable startTimestamp; uint public immutable maxPerTx = 3; /// @notice Constructor for the UniversalONFT /// @param _name the name of the token /// @param _symbol the token symbol /// @param _layerZeroEndpoint handles message transmission across chains /// @param _startMintId the starting mint number on this chain /// @param _endMintId the max number of mints on this chain constructor( string memory _name, string memory _symbol, address _layerZeroEndpoint, uint _startMintId, uint _endMintId, uint _startTimestamp ) ONFT(_name, _symbol, _layerZeroEndpoint) { nextMintId = _startMintId; maxMintId = _endMintId; startTimestamp = _startTimestamp; } /// @notice Mint your ONFT function mint() external payable { require(nextMintId <= maxMintId, "ONFT: Max Mint limit reached"); require(block.timestamp >= startTimestamp, "ONFT: Mint not started"); require(balanceOf(msg.sender) < maxPerTx, "ONFT: Only 3 per wallet"); uint newId = nextMintId; nextMintId++; _safeMint(msg.sender, newId); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IONFT.sol"; import "../../lzApp/NonblockingLzApp.sol"; import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; // NOTE: this ONFT contract has no minting logic. // must implement your own minting logic in child classes contract ONFT is IONFT, NonblockingLzApp, ERC721 { string public baseTokenURI; constructor( string memory _name, string memory _symbol, address _lzEndpoint ) ERC721(_name, _symbol) NonblockingLzApp(_lzEndpoint) {} function sendFrom( address _from, uint16 _dstChainId, bytes calldata _toAddress, uint _tokenId, address payable _refundAddress, address _zroPaymentAddress, bytes calldata _adapterParam ) external payable virtual override { _send(_from, _dstChainId, _toAddress, _tokenId, _refundAddress, _zroPaymentAddress, _adapterParam); } function send( uint16 _dstChainId, bytes calldata _toAddress, uint _tokenId, address payable _refundAddress, address _zroPaymentAddress, bytes calldata _adapterParam ) external payable virtual override { _send(_msgSender(), _dstChainId, _toAddress, _tokenId, _refundAddress, _zroPaymentAddress, _adapterParam); } function _send( address _from, uint16 _dstChainId, bytes memory _toAddress, uint _tokenId, address payable _refundAddress, address _zroPaymentAddress, bytes calldata _adapterParam ) internal virtual { require(_isApprovedOrOwner(_msgSender(), _tokenId), "ERC721: transfer caller is not owner nor approved"); _beforeSend(_from, _dstChainId, _toAddress, _tokenId); bytes memory payload = abi.encode(_toAddress, _tokenId); _lzSend(_dstChainId, payload, _refundAddress, _zroPaymentAddress, _adapterParam); uint64 nonce = lzEndpoint.getOutboundNonce(_dstChainId, address(this)); emit SendToChain(_from, _dstChainId, _toAddress, _tokenId, nonce); _afterSend(_from, _dstChainId, _toAddress, _tokenId); } function _nonblockingLzReceive( uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload ) internal virtual override { _beforeReceive(_srcChainId, _srcAddress, _payload); // decode and load the toAddress (bytes memory toAddress, uint tokenId) = abi.decode(_payload, (bytes, uint)); address localToAddress; assembly { localToAddress := mload(add(toAddress, 20)) } // if the toAddress is 0x0, burn it or it will get cached if (localToAddress == address(0x0)) localToAddress == address(0xdEaD); _afterReceive(_srcChainId, localToAddress, tokenId); emit ReceiveFromChain(_srcChainId, localToAddress, tokenId, _nonce); } function _beforeSend( address, /* _from */ uint16, /* _dstChainId */ bytes memory, /* _toAddress */ uint _tokenId ) internal virtual { _burn(_tokenId); } function _afterSend( address, /* _from */ uint16, /* _dstChainId */ bytes memory, /* _toAddress */ uint /* _tokenId */ ) internal virtual {} function _beforeReceive( uint16, /* _srcChainId */ bytes memory, /* _srcAddress */ bytes memory /* _payload */ ) internal virtual {} function _afterReceive( uint16, /* _srcChainId */ address _toAddress, uint _tokenId ) internal virtual { _safeMint(_toAddress, _tokenId); } function setBaseURI(string memory _baseTokenURI) public onlyOwner { baseTokenURI = _baseTokenURI; } function _baseURI() internal view override returns (string memory) { return baseTokenURI; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "@openzeppelin/contracts/token/ERC721/IERC721.sol"; /** * @dev Interface of the ONFT standard */ interface IONFT is IERC721 { /** * @dev send token `_tokenId` to (`_dstChainId`, `_toAddress`) * `_toAddress` can be any size depending on the `dstChainId`. * `_zroPaymentAddress` set to address(0x0) if not paying in ZRO (LayerZero Token) * `_adapterParam` is a flexible bytes array to indicate messaging adapter services */ function send(uint16 _dstChainId, bytes calldata _toAddress, uint _tokenId, address payable _refundAddress, address _zroPaymentAddress, bytes calldata _adapterParam) external payable; /** * @dev send token `_tokenId` to (`_dstChainId`, `_toAddress`) from `_from` * `_toAddress` can be any size depending on the `dstChainId`. * `_zroPaymentAddress` set to address(0x0) if not paying in ZRO (LayerZero Token) * `_adapterParam` is a flexible bytes array to indicate messaging adapter services */ function sendFrom(address _from, uint16 _dstChainId, bytes calldata _toAddress, uint _tokenId, address payable _refundAddress, address _zroPaymentAddress, bytes calldata _adapterParam) external payable; /** * @dev Emitted when `_tokenId` are moved from the `_sender` to (`_dstChainId`, `_toAddress`) * `_nonce` is the outbound nonce from */ event SendToChain(address indexed _sender, uint16 indexed _dstChainId, bytes indexed _toAddress, uint _tokenId, uint64 _nonce); /** * @dev Emitted when `_tokenId` are sent from `_srcChainId` to the `_toAddress` at this chain. `_nonce` is the inbound nonce. */ event ReceiveFromChain(uint16 _srcChainId, address _toAddress, uint _tokenId, uint64 _nonce); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./LzApp.sol"; /* * the default LayerZero messaging behaviour is blocking, i.e. any failed message will block the channel * this abstract class try-catch all fail messages and store locally for future retry. hence, non-blocking * NOTE: if the srcAddress is not configured properly, it will still block the message pathway from (srcChainId, srcAddress) */ abstract contract NonblockingLzApp is LzApp { constructor(address _endpoint) LzApp(_endpoint) {} mapping(uint16 => mapping(bytes => mapping(uint => bytes32))) public failedMessages; event MessageFailed(uint16 _srcChainId, bytes _srcAddress, uint64 _nonce, bytes _payload); // overriding the virtual function in LzReceiver function _blockingLzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) internal virtual override { // try-catch all errors/exceptions try this.nonblockingLzReceive(_srcChainId, _srcAddress, _nonce, _payload) { // do nothing } catch { // error / exception failedMessages[_srcChainId][_srcAddress][_nonce] = keccak256(_payload); emit MessageFailed(_srcChainId, _srcAddress, _nonce, _payload); } } function nonblockingLzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) public virtual { // only internal transaction require(_msgSender() == address(this), "LzReceiver: caller must be Bridge."); _nonblockingLzReceive(_srcChainId, _srcAddress, _nonce, _payload); } //@notice override this function function _nonblockingLzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) internal virtual; function retryMessage(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes calldata _payload) external payable virtual { // assert there is message to retry bytes32 payloadHash = failedMessages[_srcChainId][_srcAddress][_nonce]; require(payloadHash != bytes32(0), "LzReceiver: no stored message"); require(keccak256(_payload) == payloadHash, "LzReceiver: invalid payload"); // clear the stored message failedMessages[_srcChainId][_srcAddress][_nonce] = bytes32(0); // execute the message. revert if it fails again this.nonblockingLzReceive(_srcChainId, _srcAddress, _nonce, _payload); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; import "./IERC721.sol"; import "./IERC721Receiver.sol"; import "./extensions/IERC721Metadata.sol"; import "../../utils/Address.sol"; import "../../utils/Context.sol"; import "../../utils/Strings.sol"; import "../../utils/introspection/ERC165.sol"; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: 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); _afterTokenTransfer(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); _afterTokenTransfer(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 from incorrect owner"); 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); _afterTokenTransfer(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 Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, 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; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "@openzeppelin/contracts/access/Ownable.sol"; import "../interfaces/ILayerZeroReceiver.sol"; import "../interfaces/ILayerZeroUserApplicationConfig.sol"; import "../interfaces/ILayerZeroEndpoint.sol"; /* * a generic LzReceiver implementation */ abstract contract LzApp is Ownable, ILayerZeroReceiver, ILayerZeroUserApplicationConfig { ILayerZeroEndpoint internal immutable lzEndpoint; mapping(uint16 => bytes) internal trustedRemoteLookup; event SetTrustedRemote(uint16 _srcChainId, bytes _srcAddress); constructor(address _endpoint) { lzEndpoint = ILayerZeroEndpoint(_endpoint); } function lzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) external override { // lzReceive must be called by the endpoint for security require(_msgSender() == address(lzEndpoint)); // if will still block the message pathway from (srcChainId, srcAddress). should not receive message from untrusted remote. require(_srcAddress.length == trustedRemoteLookup[_srcChainId].length && keccak256(_srcAddress) == keccak256(trustedRemoteLookup[_srcChainId]), "LzReceiver: invalid source sending contract"); _blockingLzReceive(_srcChainId, _srcAddress, _nonce, _payload); } // abstract function - the default behaviour of LayerZero is blocking. See: NonblockingLzApp if you dont need to enforce ordered messaging function _blockingLzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) internal virtual; function _lzSend(uint16 _dstChainId, bytes memory _payload, address payable _refundAddress, address _zroPaymentAddress, bytes memory _adapterParam) internal { require(trustedRemoteLookup[_dstChainId].length != 0, "LzSend: destination chain is not a trusted source."); lzEndpoint.send{value: msg.value}(_dstChainId, trustedRemoteLookup[_dstChainId], _payload, _refundAddress, _zroPaymentAddress, _adapterParam); } //---------------------------UserApplication config---------------------------------------- function getConfig(uint16, uint16 _chainId, address, uint _configType) external view returns (bytes memory) { return lzEndpoint.getConfig(lzEndpoint.getSendVersion(address(this)), _chainId, address(this), _configType); } // generic config for LayerZero user Application function setConfig(uint16 _version, uint16 _chainId, uint _configType, bytes calldata _config) external override onlyOwner { lzEndpoint.setConfig(_version, _chainId, _configType, _config); } function setSendVersion(uint16 _version) external override onlyOwner { lzEndpoint.setSendVersion(_version); } function setReceiveVersion(uint16 _version) external override onlyOwner { lzEndpoint.setReceiveVersion(_version); } function forceResumeReceive(uint16 _srcChainId, bytes calldata _srcAddress) external override onlyOwner { lzEndpoint.forceResumeReceive(_srcChainId, _srcAddress); } // allow owner to set it multiple times. function setTrustedRemote(uint16 _srcChainId, bytes calldata _srcAddress) external onlyOwner { trustedRemoteLookup[_srcChainId] = _srcAddress; emit SetTrustedRemote(_srcChainId, _srcAddress); } function isTrustedRemote(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (bool) { bytes memory trustedSource = trustedRemoteLookup[_srcChainId]; return keccak256(trustedSource) == keccak256(_srcAddress); } //--------------------------- VIEW FUNCTION ---------------------------------------- // interacting with the LayerZero Endpoint and remote contracts function getTrustedRemote(uint16 _chainId) external view returns (bytes memory) { return trustedRemoteLookup[_chainId]; } function getLzEndpoint() external view returns (address) { return address(lzEndpoint); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT pragma solidity >=0.5.0; interface ILayerZeroReceiver { // @notice LayerZero endpoint will invoke this function to deliver the message on the destination // @param _srcChainId - the source endpoint identifier // @param _srcAddress - the source sending contract address from the source chain // @param _nonce - the ordered message nonce // @param _payload - the signed payload is the UA bytes has encoded to be sent function lzReceive(uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes calldata _payload) external; }
// SPDX-License-Identifier: MIT pragma solidity >=0.5.0; interface ILayerZeroUserApplicationConfig { // @notice set the configuration of the LayerZero messaging library of the specified version // @param _version - messaging library version // @param _chainId - the chainId for the pending config change // @param _configType - type of configuration. every messaging library has its own convention. // @param _config - configuration in the bytes. can encode arbitrary content. function setConfig(uint16 _version, uint16 _chainId, uint _configType, bytes calldata _config) external; // @notice set the send() LayerZero messaging library version to _version // @param _version - new messaging library version function setSendVersion(uint16 _version) external; // @notice set the lzReceive() LayerZero messaging library version to _version // @param _version - new messaging library version function setReceiveVersion(uint16 _version) external; // @notice Only when the UA needs to resume the message flow in blocking mode and clear the stored payload // @param _srcChainId - the chainId of the source chain // @param _srcAddress - the contract address of the source contract at the source chain function forceResumeReceive(uint16 _srcChainId, bytes calldata _srcAddress) external; }
// SPDX-License-Identifier: MIT pragma solidity >=0.5.0; import "./ILayerZeroUserApplicationConfig.sol"; interface ILayerZeroEndpoint is ILayerZeroUserApplicationConfig { // @notice send a LayerZero message to the specified address at a LayerZero endpoint. // @param _dstChainId - the destination chain identifier // @param _destination - the address on destination chain (in bytes). address length/format may vary by chains // @param _payload - a custom bytes payload to send to the destination contract // @param _refundAddress - if the source transaction is cheaper than the amount of value passed, refund the additional amount to this address // @param _zroPaymentAddress - the address of the ZRO token holder who would pay for the transaction // @param _adapterParams - parameters for custom functionality. e.g. receive airdropped native gas from the relayer on destination function send(uint16 _dstChainId, bytes calldata _destination, bytes calldata _payload, address payable _refundAddress, address _zroPaymentAddress, bytes calldata _adapterParams) external payable; // @notice used by the messaging library to publish verified payload // @param _srcChainId - the source chain identifier // @param _srcAddress - the source contract (as bytes) at the source chain // @param _dstAddress - the address on destination chain // @param _nonce - the unbound message ordering nonce // @param _gasLimit - the gas limit for external contract execution // @param _payload - verified payload to send to the destination contract function receivePayload(uint16 _srcChainId, bytes calldata _srcAddress, address _dstAddress, uint64 _nonce, uint _gasLimit, bytes calldata _payload) external; // @notice get the inboundNonce of a lzApp from a source chain which could be EVM or non-EVM chain // @param _srcChainId - the source chain identifier // @param _srcAddress - the source chain contract address function getInboundNonce(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (uint64); // @notice get the outboundNonce from this source chain which, consequently, is always an EVM // @param _srcAddress - the source chain contract address function getOutboundNonce(uint16 _dstChainId, address _srcAddress) external view returns (uint64); // @notice gets a quote in source native gas, for the amount that send() requires to pay for message delivery // @param _dstChainId - the destination chain identifier // @param _userApplication - the user app address on this EVM chain // @param _payload - the custom message to send over LayerZero // @param _payInZRO - if false, user app pays the protocol fee in native token // @param _adapterParam - parameters for the adapter service, e.g. send some dust native token to dstChain function estimateFees(uint16 _dstChainId, address _userApplication, bytes calldata _payload, bool _payInZRO, bytes calldata _adapterParam) external view returns (uint nativeFee, uint zroFee); // @notice get this Endpoint's immutable source identifier function getChainId() external view returns (uint16); // @notice the interface to retry failed message on this Endpoint destination // @param _srcChainId - the source chain identifier // @param _srcAddress - the source chain contract address // @param _payload - the payload to be retried function retryPayload(uint16 _srcChainId, bytes calldata _srcAddress, bytes calldata _payload) external; // @notice query if any STORED payload (message blocking) at the endpoint. // @param _srcChainId - the source chain identifier // @param _srcAddress - the source chain contract address function hasStoredPayload(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (bool); // @notice query if the _libraryAddress is valid for sending msgs. // @param _userApplication - the user app address on this EVM chain function getSendLibraryAddress(address _userApplication) external view returns (address); // @notice query if the _libraryAddress is valid for receiving msgs. // @param _userApplication - the user app address on this EVM chain function getReceiveLibraryAddress(address _userApplication) external view returns (address); // @notice query if the non-reentrancy guard for send() is on // @return true if the guard is on. false otherwise function isSendingPayload() external view returns (bool); // @notice query if the non-reentrancy guard for receive() is on // @return true if the guard is on. false otherwise function isReceivingPayload() external view returns (bool); // @notice get the configuration of the LayerZero messaging library of the specified version // @param _version - messaging library version // @param _chainId - the chainId for the pending config change // @param _userApplication - the contract address of the user application // @param _configType - type of configuration. every messaging library has its own convention. function getConfig(uint16 _version, uint16 _chainId, address _userApplication, uint _configType) external view returns (bytes memory); // @notice get the send() LayerZero messaging library version // @param _userApplication - the contract address of the user application function getSendVersion(address _userApplication) external view returns (uint16); // @notice get the lzReceive() LayerZero messaging library version // @param _userApplication - the contract address of the user application function getReceiveVersion(address _userApplication) external view returns (uint16); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; import "../IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
{ "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } }, "metadata": { "useLiteralContent": true } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_layerZeroEndpoint","type":"address"},{"internalType":"uint256","name":"_startMintId","type":"uint256"},{"internalType":"uint256","name":"_endMintId","type":"uint256"},{"internalType":"uint256","name":"_startTimestamp","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"indexed":false,"internalType":"uint64","name":"_nonce","type":"uint64"},{"indexed":false,"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"MessageFailed","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":"uint16","name":"_srcChainId","type":"uint16"},{"indexed":false,"internalType":"address","name":"_toAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"uint64","name":"_nonce","type":"uint64"}],"name":"ReceiveFromChain","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_sender","type":"address"},{"indexed":true,"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"indexed":true,"internalType":"bytes","name":"_toAddress","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"uint64","name":"_nonce","type":"uint64"}],"name":"SendToChain","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"_srcAddress","type":"bytes"}],"name":"SetTrustedRemote","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"failedMessages","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"}],"name":"forceResumeReceive","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":"uint16","name":"","type":"uint16"},{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"_configType","type":"uint256"}],"name":"getConfig","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLzEndpoint","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"}],"name":"getTrustedRemote","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"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":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"}],"name":"isTrustedRemote","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"lzReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxMintId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextMintId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"nonblockingLzReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"retryMessage","outputs":[],"stateMutability":"payable","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":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"bytes","name":"_toAddress","type":"bytes"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address payable","name":"_refundAddress","type":"address"},{"internalType":"address","name":"_zroPaymentAddress","type":"address"},{"internalType":"bytes","name":"_adapterParam","type":"bytes"}],"name":"send","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"bytes","name":"_toAddress","type":"bytes"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address payable","name":"_refundAddress","type":"address"},{"internalType":"address","name":"_zroPaymentAddress","type":"address"},{"internalType":"bytes","name":"_adapterParam","type":"bytes"}],"name":"sendFrom","outputs":[],"stateMutability":"payable","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":"_baseTokenURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_version","type":"uint16"},{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"uint256","name":"_configType","type":"uint256"},{"internalType":"bytes","name":"_config","type":"bytes"}],"name":"setConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_version","type":"uint16"}],"name":"setReceiveVersion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_version","type":"uint16"}],"name":"setSendVersion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"}],"name":"setTrustedRemote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startTimestamp","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":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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"}]
Contract Creation Code
60e0604052600360c0908152503480156200001957600080fd5b5060405162005d4138038062005d4183398181016040528101906200003f919062000316565b6040518060400160405280600981526020017f4f6d6e694d6f6e6b6500000000000000000000000000000000000000000000008152506040518060400160405280600281526020017f4f4d0000000000000000000000000000000000000000000000000000000000008152508585858585858582828280620000d6620000ca6200016c60201b60201c565b6200017460201b60201c565b8073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b81525050505081600390805190602001906200012792919062000238565b5080600490805190602001906200014092919062000238565b50505050505082600a8190555081600b819055508060a081815250505050505050505050505062000459565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200024690620003c0565b90600052602060002090601f0160209004810192826200026a5760008555620002b6565b82601f106200028557805160ff1916838001178555620002b6565b82800160010185558215620002b6579182015b82811115620002b557825182559160200191906001019062000298565b5b509050620002c59190620002c9565b5090565b5b80821115620002e4576000816000905550600101620002ca565b5090565b600081519050620002f98162000425565b92915050565b60008151905062000310816200043f565b92915050565b600080600080608085870312156200032d57600080fd5b60006200033d87828801620002e8565b94505060206200035087828801620002ff565b93505060406200036387828801620002ff565b92505060606200037687828801620002ff565b91505092959194509250565b60006200038f8262000396565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006002820490506001821680620003d957607f821691505b60208210811415620003f057620003ef620003f6565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b620004308162000382565b81146200043c57600080fd5b50565b6200044a81620003b6565b81146200045657600080fd5b50565b60805160601c60a05160c051615868620004d960003960008181610fae01526120ec015260008181610f4b0152611c880152600081816108c301528181610bcf01528181610e76015281816112140152818161196701528181611c5c01528181611f8601528181611fc2015281816127f40152612f4f01526158686000f3fe6080604052600436106102245760003560e01c8063715018a611610123578063d547cfb7116100ab578063eb8d72b71161006f578063eb8d72b7146107eb578063eed33cef14610814578063f2fde38b14610830578063f5ecbdbc14610859578063f968adbe1461089657610224565b8063d547cfb714610702578063dacbcbe21461072d578063e1d4c87014610758578063e6fd48bc14610783578063e985e9c5146107ae57610224565b8063a22cb465116100f2578063a22cb4651461062e578063b88d4fde14610657578063c87b56dd14610680578063cbed8b9c146106bd578063d1deba1f146106e657610224565b8063715018a6146105845780638da5cb5b1461059b5780638ee74912146105c657806395d89b411461060357610224565b80633d8b38f6116101b15780636352211e116101755780636352211e1461047957806366ad5c8a146104b657806369b41f95146104df5780636aa99da31461051c57806370a082311461054757610224565b80633d8b38f6146103a557806342842e0e146103e257806342d65a8d1461040b578063519056361461043457806355f804b31461045057610224565b8063081812fc116101f8578063081812fc146102e3578063095ea7b31461032057806310ddb137146103495780631249c58b1461037257806323b872dd1461037c57610224565b80621d35671461022957806301ffc9a71461025257806306fdde031461028f57806307e0db17146102ba575b600080fd5b34801561023557600080fd5b50610250600480360381019061024b9190613e72565b6108c1565b005b34801561025e57600080fd5b5061027960048036038101906102749190613ade565b6109dd565b60405161028691906146e2565b60405180910390f35b34801561029b57600080fd5b506102a4610abf565b6040516102b1919061476a565b60405180910390f35b3480156102c657600080fd5b506102e160048036038101906102dc9190613c06565b610b51565b005b3480156102ef57600080fd5b5061030a60048036038101906103059190613fe8565b610c5b565b604051610317919061467b565b60405180910390f35b34801561032c57600080fd5b5061034760048036038101906103429190613aa2565b610ce0565b005b34801561035557600080fd5b50610370600480360381019061036b9190613c06565b610df8565b005b61037a610f02565b005b34801561038857600080fd5b506103a3600480360381019061039e91906138c6565b611042565b005b3480156103b157600080fd5b506103cc60048036038101906103c79190613c58565b6110a2565b6040516103d991906146e2565b60405180910390f35b3480156103ee57600080fd5b50610409600480360381019061040491906138c6565b611176565b005b34801561041757600080fd5b50610432600480360381019061042d9190613c58565b611196565b005b61044e600480360381019061044991906139cc565b6112a6565b005b34801561045c57600080fd5b5061047760048036038101906104729190613bc5565b611305565b005b34801561048557600080fd5b506104a0600480360381019061049b9190613fe8565b61139b565b6040516104ad919061467b565b60405180910390f35b3480156104c257600080fd5b506104dd60048036038101906104d89190613e72565b61144d565b005b3480156104eb57600080fd5b5061050660048036038101906105019190613c06565b6114d4565b6040516105139190614718565b60405180910390f35b34801561052857600080fd5b50610531611581565b60405161053e9190614cf8565b60405180910390f35b34801561055357600080fd5b5061056e60048036038101906105699190613861565b611587565b60405161057b9190614cf8565b60405180910390f35b34801561059057600080fd5b5061059961163f565b005b3480156105a757600080fd5b506105b06116c7565b6040516105bd919061467b565b60405180910390f35b3480156105d257600080fd5b506105ed60048036038101906105e89190613d73565b6116f0565b6040516105fa91906146fd565b60405180910390f35b34801561060f57600080fd5b50610618611738565b604051610625919061476a565b60405180910390f35b34801561063a57600080fd5b5061065560048036038101906106509190613990565b6117ca565b005b34801561066357600080fd5b5061067e60048036038101906106799190613915565b6117e0565b005b34801561068c57600080fd5b506106a760048036038101906106a29190613fe8565b611842565b6040516106b4919061476a565b60405180910390f35b3480156106c957600080fd5b506106e460048036038101906106df9190613f68565b6118e9565b005b61070060048036038101906106fb9190613dda565b6119ff565b005b34801561070e57600080fd5b50610717611bca565b604051610724919061476a565b60405180910390f35b34801561073957600080fd5b50610742611c58565b60405161074f919061467b565b60405180910390f35b34801561076457600080fd5b5061076d611c80565b60405161077a9190614cf8565b60405180910390f35b34801561078f57600080fd5b50610798611c86565b6040516107a59190614cf8565b60405180910390f35b3480156107ba57600080fd5b506107d560048036038101906107d0919061388a565b611caa565b6040516107e291906146e2565b60405180910390f35b3480156107f757600080fd5b50610812600480360381019061080d9190613c58565b611d3e565b005b61082e60048036038101906108299190613cb0565b611e25565b005b34801561083c57600080fd5b5061085760048036038101906108529190613861565b611e8a565b005b34801561086557600080fd5b50610880600480360381019061087b9190613f05565b611f82565b60405161088d9190614718565b60405180910390f35b3480156108a257600080fd5b506108ab6120ea565b6040516108b89190614cf8565b60405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1661090061210e565b73ffffffffffffffffffffffffffffffffffffffff161461092057600080fd5b600160008561ffff1661ffff168152602001908152602001600020805461094690614fd5565b9050835114801561098c5750600160008561ffff1661ffff16815260200190815260200160002060405161097a9190614640565b60405180910390208380519060200120145b6109cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c29061480c565b60405180910390fd5b6109d784848484612116565b50505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610aa857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610ab85750610ab78261222b565b5b9050919050565b606060038054610ace90614fd5565b80601f0160208091040260200160405190810160405280929190818152602001828054610afa90614fd5565b8015610b475780601f10610b1c57610100808354040283529160200191610b47565b820191906000526020600020905b815481529060010190602001808311610b2a57829003601f168201915b5050505050905090565b610b5961210e565b73ffffffffffffffffffffffffffffffffffffffff16610b776116c7565b73ffffffffffffffffffffffffffffffffffffffff1614610bcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc4906149ac565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166307e0db17826040518263ffffffff1660e01b8152600401610c269190614a8c565b600060405180830381600087803b158015610c4057600080fd5b505af1158015610c54573d6000803e3d6000fd5b5050505050565b6000610c6682612295565b610ca5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9c9061496c565b60405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ceb8261139b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5390614a0c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d7b61210e565b73ffffffffffffffffffffffffffffffffffffffff161480610daa5750610da981610da461210e565b611caa565b5b610de9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de0906148ac565b60405180910390fd5b610df38383612301565b505050565b610e0061210e565b73ffffffffffffffffffffffffffffffffffffffff16610e1e6116c7565b73ffffffffffffffffffffffffffffffffffffffff1614610e74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6b906149ac565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166310ddb137826040518263ffffffff1660e01b8152600401610ecd9190614a8c565b600060405180830381600087803b158015610ee757600080fd5b505af1158015610efb573d6000803e3d6000fd5b5050505050565b600b54600a541115610f49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4090614a6c565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000421015610fac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa390614a4c565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000610fd633611587565b10611016576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100d906149ec565b60405180910390fd5b6000600a549050600a600081548092919061103090615038565b919050555061103f33826123ba565b50565b61105361104d61210e565b826123d8565b611092576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108990614a2c565b60405180910390fd5b61109d8383836124b6565b505050565b600080600160008661ffff1661ffff16815260200190815260200160002080546110cb90614fd5565b80601f01602080910402602001604051908101604052809291908181526020018280546110f790614fd5565b80156111445780601f1061111957610100808354040283529160200191611144565b820191906000526020600020905b81548152906001019060200180831161112757829003601f168201915b50505050509050838360405161115b929190614610565b60405180910390208180519060200120149150509392505050565b611191838383604051806020016040528060008152506117e0565b505050565b61119e61210e565b73ffffffffffffffffffffffffffffffffffffffff166111bc6116c7565b73ffffffffffffffffffffffffffffffffffffffff1614611212576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611209906149ac565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166342d65a8d8484846040518463ffffffff1660e01b815260040161126f93929190614b15565b600060405180830381600087803b15801561128957600080fd5b505af115801561129d573d6000803e3d6000fd5b50505050505050565b6112fa898989898080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050888888888861271d565b505050505050505050565b61130d61210e565b73ffffffffffffffffffffffffffffffffffffffff1661132b6116c7565b73ffffffffffffffffffffffffffffffffffffffff1614611381576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611378906149ac565b60405180910390fd5b80600990805190602001906113979291906134cf565b5050565b6000806005600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611444576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143b906148ec565b60405180910390fd5b80915050919050565b3073ffffffffffffffffffffffffffffffffffffffff1661146c61210e565b73ffffffffffffffffffffffffffffffffffffffff16146114c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b99061482c565b60405180910390fd5b6114ce84848484612922565b50505050565b6060600160008361ffff1661ffff16815260200190815260200160002080546114fc90614fd5565b80601f016020809104026020016040519081016040528092919081815260200182805461152890614fd5565b80156115755780601f1061154a57610100808354040283529160200191611575565b820191906000526020600020905b81548152906001019060200180831161155857829003601f168201915b50505050509050919050565b600a5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ef906148cc565b60405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61164761210e565b73ffffffffffffffffffffffffffffffffffffffff166116656116c7565b73ffffffffffffffffffffffffffffffffffffffff16146116bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b2906149ac565b60405180910390fd5b6116c560006129a2565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60026020528260005260406000208280516020810182018051848252602083016020850120818352809550505050505060205280600052604060002060009250925050505481565b60606004805461174790614fd5565b80601f016020809104026020016040519081016040528092919081815260200182805461177390614fd5565b80156117c05780601f10611795576101008083540402835291602001916117c0565b820191906000526020600020905b8154815290600101906020018083116117a357829003601f168201915b5050505050905090565b6117dc6117d561210e565b8383612a66565b5050565b6117f16117eb61210e565b836123d8565b611830576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182790614a2c565b60405180910390fd5b61183c84848484612bd3565b50505050565b606061184d82612295565b61188c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611883906149cc565b60405180910390fd5b6000611896612c2f565b905060008151116118b657604051806020016040528060008152506118e1565b806118c084612cc1565b6040516020016118d1929190614657565b6040516020818303038152906040525b915050919050565b6118f161210e565b73ffffffffffffffffffffffffffffffffffffffff1661190f6116c7565b73ffffffffffffffffffffffffffffffffffffffff1614611965576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195c906149ac565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663cbed8b9c86868686866040518663ffffffff1660e01b81526004016119c6959493929190614caa565b600060405180830381600087803b1580156119e057600080fd5b505af11580156119f4573d6000803e3d6000fd5b505050505050505050565b6000600260008761ffff1661ffff16815260200190815260200160002085604051611a2a9190614629565b908152602001604051809103902060008567ffffffffffffffff1681526020019081526020016000205490506000801b811415611a9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a939061498c565b60405180910390fd5b808383604051611aad929190614610565b604051809103902014611af5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aec9061494c565b60405180910390fd5b6000801b600260008861ffff1661ffff16815260200190815260200160002086604051611b229190614629565b908152602001604051809103902060008667ffffffffffffffff168152602001908152602001600020819055503073ffffffffffffffffffffffffffffffffffffffff166366ad5c8a87878787876040518663ffffffff1660e01b8152600401611b90959493929190614b47565b600060405180830381600087803b158015611baa57600080fd5b505af1158015611bbe573d6000803e3d6000fd5b50505050505050505050565b60098054611bd790614fd5565b80601f0160208091040260200160405190810160405280929190818152602001828054611c0390614fd5565b8015611c505780601f10611c2557610100808354040283529160200191611c50565b820191906000526020600020905b815481529060010190602001808311611c3357829003601f168201915b505050505081565b60007f0000000000000000000000000000000000000000000000000000000000000000905090565b600b5481565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611d4661210e565b73ffffffffffffffffffffffffffffffffffffffff16611d646116c7565b73ffffffffffffffffffffffffffffffffffffffff1614611dba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db1906149ac565b60405180910390fd5b8181600160008661ffff1661ffff1681526020019081526020016000209190611de4929190613555565b507ffa41487ad5d6728f0b19276fa1eddc16558578f5109fc39d2dc33c3230470dab838383604051611e1893929190614b15565b60405180910390a1505050565b611e80611e3061210e565b8989898080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050888888888861271d565b5050505050505050565b611e9261210e565b73ffffffffffffffffffffffffffffffffffffffff16611eb06116c7565b73ffffffffffffffffffffffffffffffffffffffff1614611f06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611efd906149ac565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611f76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6d906147ac565b60405180910390fd5b611f7f816129a2565b50565b60607f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663f5ecbdbc7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663096568f6306040518263ffffffff1660e01b8152600401612019919061467b565b60206040518083038186803b15801561203157600080fd5b505afa158015612045573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120699190613c2f565b8630866040518563ffffffff1660e01b815260040161208b9493929190614c65565b60006040518083038186803b1580156120a357600080fd5b505afa1580156120b7573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906120e09190613b30565b9050949350505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600033905090565b3073ffffffffffffffffffffffffffffffffffffffff166366ad5c8a858585856040518563ffffffff1660e01b81526004016121559493929190614b9c565b600060405180830381600087803b15801561216f57600080fd5b505af1925050508015612180575060015b612224578080519060200120600260008661ffff1661ffff168152602001908152602001600020846040516121b59190614629565b908152602001604051809103902060008467ffffffffffffffff168152602001908152602001600020819055507fe6f254030bcb01ffd20558175c13fcaed6d1520be7becee4c961b65f79243b0d848484846040516122179493929190614b9c565b60405180910390a1612225565b5b50505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166005600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816007600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166123748361139b565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6123d4828260405180602001604052806000815250612e6e565b5050565b60006123e382612295565b612422576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124199061488c565b60405180910390fd5b600061242d8361139b565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061249c57508373ffffffffffffffffffffffffffffffffffffffff1661248484610c5b565b73ffffffffffffffffffffffffffffffffffffffff16145b806124ad57506124ac8185611caa565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166124d68261139b565b73ffffffffffffffffffffffffffffffffffffffff161461252c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612523906147cc565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561259c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125939061484c565b60405180910390fd5b6125a7838383612ec9565b6125b2600082612301565b6001600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126029190614ead565b925050819055506001600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126599190614e26565b92505081905550816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612718838383612ece565b505050565b61272e61272861210e565b866123d8565b61276d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276490614a2c565b60405180910390fd5b61277988888888612ed3565b6000868660405160200161278e92919061473a565b60405160208183030381529060405290506127f08882878787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612ee2565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16637a1457488a306040518363ffffffff1660e01b815260040161284d929190614aa7565b60206040518083038186803b15801561286557600080fd5b505afa158015612879573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061289d9190614011565b9050876040516128ad9190614629565b60405180910390208961ffff168b73ffffffffffffffffffffffffffffffffffffffff167f024797cc77ce15dc717112d54fb1df125fdfd8c81344fb046c5e074427ce15438a85604051612902929190614d13565b60405180910390a46129168a8a8a8a613004565b50505050505050505050565b61292d84848361300a565b600080828060200190518101906129449190613b71565b9150915060006014830151905061295c87828461300f565b7fd4d39d20f72eabd06c301e516d54653dfc9116de62c1d54bf1cb48cf3b42a7db878284886040516129919493929190614ad0565b60405180910390a150505050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612ad5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612acc9061486c565b60405180910390fd5b80600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612bc691906146e2565b60405180910390a3505050565b612bde8484846124b6565b612bea8484848461301e565b612c29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c209061478c565b60405180910390fd5b50505050565b606060098054612c3e90614fd5565b80601f0160208091040260200160405190810160405280929190818152602001828054612c6a90614fd5565b8015612cb75780601f10612c8c57610100808354040283529160200191612cb7565b820191906000526020600020905b815481529060010190602001808311612c9a57829003601f168201915b5050505050905090565b60606000821415612d09576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612e69565b600082905060005b60008214612d3b578080612d2490615038565b915050600a82612d349190614e7c565b9150612d11565b60008167ffffffffffffffff811115612d7d577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612daf5781602001600182028036833780820191505090505b5090505b60008514612e6257600182612dc89190614ead565b9150600a85612dd79190615081565b6030612de39190614e26565b60f81b818381518110612e1f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612e5b9190614e7c565b9450612db3565b8093505050505b919050565b612e7883836131b5565b612e85600084848461301e565b612ec4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ebb9061478c565b60405180910390fd5b505050565b505050565b505050565b612edc8161338f565b50505050565b6000600160008761ffff1661ffff1681526020019081526020016000208054612f0a90614fd5565b90501415612f4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f449061490c565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663c58031003487600160008a61ffff1661ffff168152602001908152602001600020888888886040518863ffffffff1660e01b8152600401612fcb96959493929190614bef565b6000604051808303818588803b158015612fe457600080fd5b505af1158015612ff8573d6000803e3d6000fd5b50505050505050505050565b50505050565b505050565b61301982826123ba565b505050565b600061303f8473ffffffffffffffffffffffffffffffffffffffff166134ac565b156131a8578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261306861210e565b8786866040518563ffffffff1660e01b815260040161308a9493929190614696565b602060405180830381600087803b1580156130a457600080fd5b505af19250505080156130d557506040513d601f19601f820116820180604052508101906130d29190613b07565b60015b613158573d8060008114613105576040519150601f19603f3d011682016040523d82523d6000602084013e61310a565b606091505b50600081511415613150576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131479061478c565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506131ad565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613225576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161321c9061492c565b60405180910390fd5b61322e81612295565b1561326e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613265906147ec565b60405180910390fd5b61327a60008383612ec9565b6001600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546132ca9190614e26565b92505081905550816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461338b60008383612ece565b5050565b600061339a8261139b565b90506133a881600084612ec9565b6133b3600083612301565b6001600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546134039190614ead565b925050819055506005600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46134a881600084612ece565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b8280546134db90614fd5565b90600052602060002090601f0160209004810192826134fd5760008555613544565b82601f1061351657805160ff1916838001178555613544565b82800160010185558215613544579182015b82811115613543578251825591602001919060010190613528565b5b50905061355191906135db565b5090565b82805461356190614fd5565b90600052602060002090601f01602090048101928261358357600085556135ca565b82601f1061359c57803560ff19168380011785556135ca565b828001600101855582156135ca579182015b828111156135c95782358255916020019190600101906135ae565b5b5090506135d791906135db565b5090565b5b808211156135f45760008160009055506001016135dc565b5090565b600061360b61360684614d61565b614d3c565b90508281526020810184848401111561362357600080fd5b61362e848285614f93565b509392505050565b600061364961364484614d61565b614d3c565b90508281526020810184848401111561366157600080fd5b61366c848285614fa2565b509392505050565b600061368761368284614d92565b614d3c565b90508281526020810184848401111561369f57600080fd5b6136aa848285614f93565b509392505050565b6000813590506136c181615791565b92915050565b6000813590506136d6816157a8565b92915050565b6000813590506136eb816157bf565b92915050565b600081359050613700816157d6565b92915050565b600081519050613715816157d6565b92915050565b60008083601f84011261372d57600080fd5b8235905067ffffffffffffffff81111561374657600080fd5b60208301915083600182028301111561375e57600080fd5b9250929050565b600082601f83011261377657600080fd5b81356137868482602086016135f8565b91505092915050565b600082601f8301126137a057600080fd5b81516137b0848260208601613636565b91505092915050565b600082601f8301126137ca57600080fd5b81356137da848260208601613674565b91505092915050565b6000813590506137f2816157ed565b92915050565b600081519050613807816157ed565b92915050565b60008135905061381c81615804565b92915050565b60008151905061383181615804565b92915050565b6000813590506138468161581b565b92915050565b60008151905061385b8161581b565b92915050565b60006020828403121561387357600080fd5b6000613881848285016136b2565b91505092915050565b6000806040838503121561389d57600080fd5b60006138ab858286016136b2565b92505060206138bc858286016136b2565b9150509250929050565b6000806000606084860312156138db57600080fd5b60006138e9868287016136b2565b93505060206138fa868287016136b2565b925050604061390b8682870161380d565b9150509250925092565b6000806000806080858703121561392b57600080fd5b6000613939878288016136b2565b945050602061394a878288016136b2565b935050604061395b8782880161380d565b925050606085013567ffffffffffffffff81111561397857600080fd5b61398487828801613765565b91505092959194509250565b600080604083850312156139a357600080fd5b60006139b1858286016136b2565b92505060206139c2858286016136dc565b9150509250929050565b600080600080600080600080600060e08a8c0312156139ea57600080fd5b60006139f88c828d016136b2565b9950506020613a098c828d016137e3565b98505060408a013567ffffffffffffffff811115613a2657600080fd5b613a328c828d0161371b565b97509750506060613a458c828d0161380d565b9550506080613a568c828d016136c7565b94505060a0613a678c828d016136b2565b93505060c08a013567ffffffffffffffff811115613a8457600080fd5b613a908c828d0161371b565b92509250509295985092959850929598565b60008060408385031215613ab557600080fd5b6000613ac3858286016136b2565b9250506020613ad48582860161380d565b9150509250929050565b600060208284031215613af057600080fd5b6000613afe848285016136f1565b91505092915050565b600060208284031215613b1957600080fd5b6000613b2784828501613706565b91505092915050565b600060208284031215613b4257600080fd5b600082015167ffffffffffffffff811115613b5c57600080fd5b613b688482850161378f565b91505092915050565b60008060408385031215613b8457600080fd5b600083015167ffffffffffffffff811115613b9e57600080fd5b613baa8582860161378f565b9250506020613bbb85828601613822565b9150509250929050565b600060208284031215613bd757600080fd5b600082013567ffffffffffffffff811115613bf157600080fd5b613bfd848285016137b9565b91505092915050565b600060208284031215613c1857600080fd5b6000613c26848285016137e3565b91505092915050565b600060208284031215613c4157600080fd5b6000613c4f848285016137f8565b91505092915050565b600080600060408486031215613c6d57600080fd5b6000613c7b868287016137e3565b935050602084013567ffffffffffffffff811115613c9857600080fd5b613ca48682870161371b565b92509250509250925092565b60008060008060008060008060c0898b031215613ccc57600080fd5b6000613cda8b828c016137e3565b985050602089013567ffffffffffffffff811115613cf757600080fd5b613d038b828c0161371b565b97509750506040613d168b828c0161380d565b9550506060613d278b828c016136c7565b9450506080613d388b828c016136b2565b93505060a089013567ffffffffffffffff811115613d5557600080fd5b613d618b828c0161371b565b92509250509295985092959890939650565b600080600060608486031215613d8857600080fd5b6000613d96868287016137e3565b935050602084013567ffffffffffffffff811115613db357600080fd5b613dbf86828701613765565b9250506040613dd08682870161380d565b9150509250925092565b600080600080600060808688031215613df257600080fd5b6000613e00888289016137e3565b955050602086013567ffffffffffffffff811115613e1d57600080fd5b613e2988828901613765565b9450506040613e3a88828901613837565b935050606086013567ffffffffffffffff811115613e5757600080fd5b613e638882890161371b565b92509250509295509295909350565b60008060008060808587031215613e8857600080fd5b6000613e96878288016137e3565b945050602085013567ffffffffffffffff811115613eb357600080fd5b613ebf87828801613765565b9350506040613ed087828801613837565b925050606085013567ffffffffffffffff811115613eed57600080fd5b613ef987828801613765565b91505092959194509250565b60008060008060808587031215613f1b57600080fd5b6000613f29878288016137e3565b9450506020613f3a878288016137e3565b9350506040613f4b878288016136b2565b9250506060613f5c8782880161380d565b91505092959194509250565b600080600080600060808688031215613f8057600080fd5b6000613f8e888289016137e3565b9550506020613f9f888289016137e3565b9450506040613fb08882890161380d565b935050606086013567ffffffffffffffff811115613fcd57600080fd5b613fd98882890161371b565b92509250509295509295909350565b600060208284031215613ffa57600080fd5b60006140088482850161380d565b91505092915050565b60006020828403121561402357600080fd5b60006140318482850161384c565b91505092915050565b61404381614ef3565b82525050565b61405281614ee1565b82525050565b61406181614f05565b82525050565b61407081614f11565b82525050565b60006140828385614dee565b935061408f838584614f93565b6140988361516e565b840190509392505050565b60006140af8385614dff565b93506140bc838584614f93565b82840190509392505050565b60006140d382614dd8565b6140dd8185614dee565b93506140ed818560208601614fa2565b6140f68161516e565b840191505092915050565b600061410c82614dd8565b6141168185614dff565b9350614126818560208601614fa2565b80840191505092915050565b6000815461413f81614fd5565b6141498186614dee565b945060018216600081146141645760018114614176576141a9565b60ff19831686526020860193506141a9565b61417f85614dc3565b60005b838110156141a157815481890152600182019150602081019050614182565b808801955050505b50505092915050565b600081546141bf81614fd5565b6141c98186614dff565b945060018216600081146141e457600181146141f557614228565b60ff19831686528186019350614228565b6141fe85614dc3565b60005b8381101561422057815481890152600182019150602081019050614201565b838801955050505b50505092915050565b600061423c82614de3565b6142468185614e0a565b9350614256818560208601614fa2565b61425f8161516e565b840191505092915050565b600061427582614de3565b61427f8185614e1b565b935061428f818560208601614fa2565b80840191505092915050565b60006142a8603283614e0a565b91506142b38261517f565b604082019050919050565b60006142cb602683614e0a565b91506142d6826151ce565b604082019050919050565b60006142ee602583614e0a565b91506142f98261521d565b604082019050919050565b6000614311601c83614e0a565b915061431c8261526c565b602082019050919050565b6000614334602b83614e0a565b915061433f82615295565b604082019050919050565b6000614357602283614e0a565b9150614362826152e4565b604082019050919050565b600061437a602483614e0a565b915061438582615333565b604082019050919050565b600061439d601983614e0a565b91506143a882615382565b602082019050919050565b60006143c0602c83614e0a565b91506143cb826153ab565b604082019050919050565b60006143e3603883614e0a565b91506143ee826153fa565b604082019050919050565b6000614406602a83614e0a565b915061441182615449565b604082019050919050565b6000614429602983614e0a565b915061443482615498565b604082019050919050565b600061444c603283614e0a565b9150614457826154e7565b604082019050919050565b600061446f602083614e0a565b915061447a82615536565b602082019050919050565b6000614492601b83614e0a565b915061449d8261555f565b602082019050919050565b60006144b5602c83614e0a565b91506144c082615588565b604082019050919050565b60006144d8601d83614e0a565b91506144e3826155d7565b602082019050919050565b60006144fb602083614e0a565b915061450682615600565b602082019050919050565b600061451e602f83614e0a565b915061452982615629565b604082019050919050565b6000614541601783614e0a565b915061454c82615678565b602082019050919050565b6000614564602183614e0a565b915061456f826156a1565b604082019050919050565b6000614587603183614e0a565b9150614592826156f0565b604082019050919050565b60006145aa601683614e0a565b91506145b58261573f565b602082019050919050565b60006145cd601c83614e0a565b91506145d882615768565b602082019050919050565b6145ec81614f47565b82525050565b6145fb81614f75565b82525050565b61460a81614f7f565b82525050565b600061461d8284866140a3565b91508190509392505050565b60006146358284614101565b915081905092915050565b600061464c82846141b2565b915081905092915050565b6000614663828561426a565b915061466f828461426a565b91508190509392505050565b60006020820190506146906000830184614049565b92915050565b60006080820190506146ab6000830187614049565b6146b86020830186614049565b6146c560408301856145f2565b81810360608301526146d781846140c8565b905095945050505050565b60006020820190506146f76000830184614058565b92915050565b60006020820190506147126000830184614067565b92915050565b6000602082019050818103600083015261473281846140c8565b905092915050565b6000604082019050818103600083015261475481856140c8565b905061476360208301846145f2565b9392505050565b600060208201905081810360008301526147848184614231565b905092915050565b600060208201905081810360008301526147a58161429b565b9050919050565b600060208201905081810360008301526147c5816142be565b9050919050565b600060208201905081810360008301526147e5816142e1565b9050919050565b6000602082019050818103600083015261480581614304565b9050919050565b6000602082019050818103600083015261482581614327565b9050919050565b600060208201905081810360008301526148458161434a565b9050919050565b600060208201905081810360008301526148658161436d565b9050919050565b6000602082019050818103600083015261488581614390565b9050919050565b600060208201905081810360008301526148a5816143b3565b9050919050565b600060208201905081810360008301526148c5816143d6565b9050919050565b600060208201905081810360008301526148e5816143f9565b9050919050565b600060208201905081810360008301526149058161441c565b9050919050565b600060208201905081810360008301526149258161443f565b9050919050565b6000602082019050818103600083015261494581614462565b9050919050565b6000602082019050818103600083015261496581614485565b9050919050565b60006020820190508181036000830152614985816144a8565b9050919050565b600060208201905081810360008301526149a5816144cb565b9050919050565b600060208201905081810360008301526149c5816144ee565b9050919050565b600060208201905081810360008301526149e581614511565b9050919050565b60006020820190508181036000830152614a0581614534565b9050919050565b60006020820190508181036000830152614a2581614557565b9050919050565b60006020820190508181036000830152614a458161457a565b9050919050565b60006020820190508181036000830152614a658161459d565b9050919050565b60006020820190508181036000830152614a85816145c0565b9050919050565b6000602082019050614aa160008301846145e3565b92915050565b6000604082019050614abc60008301856145e3565b614ac96020830184614049565b9392505050565b6000608082019050614ae560008301876145e3565b614af26020830186614049565b614aff60408301856145f2565b614b0c6060830184614601565b95945050505050565b6000604082019050614b2a60008301866145e3565b8181036020830152614b3d818486614076565b9050949350505050565b6000608082019050614b5c60008301886145e3565b8181036020830152614b6e81876140c8565b9050614b7d6040830186614601565b8181036060830152614b90818486614076565b90509695505050505050565b6000608082019050614bb160008301876145e3565b8181036020830152614bc381866140c8565b9050614bd26040830185614601565b8181036060830152614be481846140c8565b905095945050505050565b600060c082019050614c0460008301896145e3565b8181036020830152614c168188614132565b90508181036040830152614c2a81876140c8565b9050614c39606083018661403a565b614c466080830185614049565b81810360a0830152614c5881846140c8565b9050979650505050505050565b6000608082019050614c7a60008301876145e3565b614c8760208301866145e3565b614c946040830185614049565b614ca160608301846145f2565b95945050505050565b6000608082019050614cbf60008301886145e3565b614ccc60208301876145e3565b614cd960408301866145f2565b8181036060830152614cec818486614076565b90509695505050505050565b6000602082019050614d0d60008301846145f2565b92915050565b6000604082019050614d2860008301856145f2565b614d356020830184614601565b9392505050565b6000614d46614d57565b9050614d528282615007565b919050565b6000604051905090565b600067ffffffffffffffff821115614d7c57614d7b61513f565b5b614d858261516e565b9050602081019050919050565b600067ffffffffffffffff821115614dad57614dac61513f565b5b614db68261516e565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614e3182614f75565b9150614e3c83614f75565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614e7157614e706150b2565b5b828201905092915050565b6000614e8782614f75565b9150614e9283614f75565b925082614ea257614ea16150e1565b5b828204905092915050565b6000614eb882614f75565b9150614ec383614f75565b925082821015614ed657614ed56150b2565b5b828203905092915050565b6000614eec82614f55565b9050919050565b6000614efe82614f55565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b82818337600083830152505050565b60005b83811015614fc0578082015181840152602081019050614fa5565b83811115614fcf576000848401525b50505050565b60006002820490506001821680614fed57607f821691505b6020821081141561500157615000615110565b5b50919050565b6150108261516e565b810181811067ffffffffffffffff8211171561502f5761502e61513f565b5b80604052505050565b600061504382614f75565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615076576150756150b2565b5b600182019050919050565b600061508c82614f75565b915061509783614f75565b9250826150a7576150a66150e1565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4c7a52656365697665723a20696e76616c696420736f757263652073656e646960008201527f6e6720636f6e7472616374000000000000000000000000000000000000000000602082015250565b7f4c7a52656365697665723a2063616c6c6572206d75737420626520427269646760008201527f652e000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4c7a53656e643a2064657374696e6174696f6e20636861696e206973206e6f7460008201527f2061207472757374656420736f757263652e0000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4c7a52656365697665723a20696e76616c6964207061796c6f61640000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4c7a52656365697665723a206e6f2073746f726564206d657373616765000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4f4e46543a204f6e6c792033207065722077616c6c6574000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f4f4e46543a204d696e74206e6f74207374617274656400000000000000000000600082015250565b7f4f4e46543a204d6178204d696e74206c696d6974207265616368656400000000600082015250565b61579a81614ee1565b81146157a557600080fd5b50565b6157b181614ef3565b81146157bc57600080fd5b50565b6157c881614f05565b81146157d357600080fd5b50565b6157df81614f1b565b81146157ea57600080fd5b50565b6157f681614f47565b811461580157600080fd5b50565b61580d81614f75565b811461581857600080fd5b50565b61582481614f7f565b811461582f57600080fd5b5056fea264697066735822122008b089baf84f694369b26223bb76cc72847efe6a2a0e47546b97c6f4fcaa94e864736f6c6343000804003300000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd675000000000000000000000000000000000000000000000000000000000000054600000000000000000000000000000000000000000000000000000000000009f5000000000000000000000000000000000000000000000000000000006266c580
Deployed Bytecode
0x6080604052600436106102245760003560e01c8063715018a611610123578063d547cfb7116100ab578063eb8d72b71161006f578063eb8d72b7146107eb578063eed33cef14610814578063f2fde38b14610830578063f5ecbdbc14610859578063f968adbe1461089657610224565b8063d547cfb714610702578063dacbcbe21461072d578063e1d4c87014610758578063e6fd48bc14610783578063e985e9c5146107ae57610224565b8063a22cb465116100f2578063a22cb4651461062e578063b88d4fde14610657578063c87b56dd14610680578063cbed8b9c146106bd578063d1deba1f146106e657610224565b8063715018a6146105845780638da5cb5b1461059b5780638ee74912146105c657806395d89b411461060357610224565b80633d8b38f6116101b15780636352211e116101755780636352211e1461047957806366ad5c8a146104b657806369b41f95146104df5780636aa99da31461051c57806370a082311461054757610224565b80633d8b38f6146103a557806342842e0e146103e257806342d65a8d1461040b578063519056361461043457806355f804b31461045057610224565b8063081812fc116101f8578063081812fc146102e3578063095ea7b31461032057806310ddb137146103495780631249c58b1461037257806323b872dd1461037c57610224565b80621d35671461022957806301ffc9a71461025257806306fdde031461028f57806307e0db17146102ba575b600080fd5b34801561023557600080fd5b50610250600480360381019061024b9190613e72565b6108c1565b005b34801561025e57600080fd5b5061027960048036038101906102749190613ade565b6109dd565b60405161028691906146e2565b60405180910390f35b34801561029b57600080fd5b506102a4610abf565b6040516102b1919061476a565b60405180910390f35b3480156102c657600080fd5b506102e160048036038101906102dc9190613c06565b610b51565b005b3480156102ef57600080fd5b5061030a60048036038101906103059190613fe8565b610c5b565b604051610317919061467b565b60405180910390f35b34801561032c57600080fd5b5061034760048036038101906103429190613aa2565b610ce0565b005b34801561035557600080fd5b50610370600480360381019061036b9190613c06565b610df8565b005b61037a610f02565b005b34801561038857600080fd5b506103a3600480360381019061039e91906138c6565b611042565b005b3480156103b157600080fd5b506103cc60048036038101906103c79190613c58565b6110a2565b6040516103d991906146e2565b60405180910390f35b3480156103ee57600080fd5b50610409600480360381019061040491906138c6565b611176565b005b34801561041757600080fd5b50610432600480360381019061042d9190613c58565b611196565b005b61044e600480360381019061044991906139cc565b6112a6565b005b34801561045c57600080fd5b5061047760048036038101906104729190613bc5565b611305565b005b34801561048557600080fd5b506104a0600480360381019061049b9190613fe8565b61139b565b6040516104ad919061467b565b60405180910390f35b3480156104c257600080fd5b506104dd60048036038101906104d89190613e72565b61144d565b005b3480156104eb57600080fd5b5061050660048036038101906105019190613c06565b6114d4565b6040516105139190614718565b60405180910390f35b34801561052857600080fd5b50610531611581565b60405161053e9190614cf8565b60405180910390f35b34801561055357600080fd5b5061056e60048036038101906105699190613861565b611587565b60405161057b9190614cf8565b60405180910390f35b34801561059057600080fd5b5061059961163f565b005b3480156105a757600080fd5b506105b06116c7565b6040516105bd919061467b565b60405180910390f35b3480156105d257600080fd5b506105ed60048036038101906105e89190613d73565b6116f0565b6040516105fa91906146fd565b60405180910390f35b34801561060f57600080fd5b50610618611738565b604051610625919061476a565b60405180910390f35b34801561063a57600080fd5b5061065560048036038101906106509190613990565b6117ca565b005b34801561066357600080fd5b5061067e60048036038101906106799190613915565b6117e0565b005b34801561068c57600080fd5b506106a760048036038101906106a29190613fe8565b611842565b6040516106b4919061476a565b60405180910390f35b3480156106c957600080fd5b506106e460048036038101906106df9190613f68565b6118e9565b005b61070060048036038101906106fb9190613dda565b6119ff565b005b34801561070e57600080fd5b50610717611bca565b604051610724919061476a565b60405180910390f35b34801561073957600080fd5b50610742611c58565b60405161074f919061467b565b60405180910390f35b34801561076457600080fd5b5061076d611c80565b60405161077a9190614cf8565b60405180910390f35b34801561078f57600080fd5b50610798611c86565b6040516107a59190614cf8565b60405180910390f35b3480156107ba57600080fd5b506107d560048036038101906107d0919061388a565b611caa565b6040516107e291906146e2565b60405180910390f35b3480156107f757600080fd5b50610812600480360381019061080d9190613c58565b611d3e565b005b61082e60048036038101906108299190613cb0565b611e25565b005b34801561083c57600080fd5b5061085760048036038101906108529190613861565b611e8a565b005b34801561086557600080fd5b50610880600480360381019061087b9190613f05565b611f82565b60405161088d9190614718565b60405180910390f35b3480156108a257600080fd5b506108ab6120ea565b6040516108b89190614cf8565b60405180910390f35b7f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd67573ffffffffffffffffffffffffffffffffffffffff1661090061210e565b73ffffffffffffffffffffffffffffffffffffffff161461092057600080fd5b600160008561ffff1661ffff168152602001908152602001600020805461094690614fd5565b9050835114801561098c5750600160008561ffff1661ffff16815260200190815260200160002060405161097a9190614640565b60405180910390208380519060200120145b6109cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c29061480c565b60405180910390fd5b6109d784848484612116565b50505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610aa857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610ab85750610ab78261222b565b5b9050919050565b606060038054610ace90614fd5565b80601f0160208091040260200160405190810160405280929190818152602001828054610afa90614fd5565b8015610b475780601f10610b1c57610100808354040283529160200191610b47565b820191906000526020600020905b815481529060010190602001808311610b2a57829003601f168201915b5050505050905090565b610b5961210e565b73ffffffffffffffffffffffffffffffffffffffff16610b776116c7565b73ffffffffffffffffffffffffffffffffffffffff1614610bcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc4906149ac565b60405180910390fd5b7f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd67573ffffffffffffffffffffffffffffffffffffffff166307e0db17826040518263ffffffff1660e01b8152600401610c269190614a8c565b600060405180830381600087803b158015610c4057600080fd5b505af1158015610c54573d6000803e3d6000fd5b5050505050565b6000610c6682612295565b610ca5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9c9061496c565b60405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ceb8261139b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5390614a0c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d7b61210e565b73ffffffffffffffffffffffffffffffffffffffff161480610daa5750610da981610da461210e565b611caa565b5b610de9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de0906148ac565b60405180910390fd5b610df38383612301565b505050565b610e0061210e565b73ffffffffffffffffffffffffffffffffffffffff16610e1e6116c7565b73ffffffffffffffffffffffffffffffffffffffff1614610e74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6b906149ac565b60405180910390fd5b7f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd67573ffffffffffffffffffffffffffffffffffffffff166310ddb137826040518263ffffffff1660e01b8152600401610ecd9190614a8c565b600060405180830381600087803b158015610ee757600080fd5b505af1158015610efb573d6000803e3d6000fd5b5050505050565b600b54600a541115610f49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4090614a6c565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000006266c580421015610fac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa390614a4c565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000003610fd633611587565b10611016576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100d906149ec565b60405180910390fd5b6000600a549050600a600081548092919061103090615038565b919050555061103f33826123ba565b50565b61105361104d61210e565b826123d8565b611092576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108990614a2c565b60405180910390fd5b61109d8383836124b6565b505050565b600080600160008661ffff1661ffff16815260200190815260200160002080546110cb90614fd5565b80601f01602080910402602001604051908101604052809291908181526020018280546110f790614fd5565b80156111445780601f1061111957610100808354040283529160200191611144565b820191906000526020600020905b81548152906001019060200180831161112757829003601f168201915b50505050509050838360405161115b929190614610565b60405180910390208180519060200120149150509392505050565b611191838383604051806020016040528060008152506117e0565b505050565b61119e61210e565b73ffffffffffffffffffffffffffffffffffffffff166111bc6116c7565b73ffffffffffffffffffffffffffffffffffffffff1614611212576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611209906149ac565b60405180910390fd5b7f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd67573ffffffffffffffffffffffffffffffffffffffff166342d65a8d8484846040518463ffffffff1660e01b815260040161126f93929190614b15565b600060405180830381600087803b15801561128957600080fd5b505af115801561129d573d6000803e3d6000fd5b50505050505050565b6112fa898989898080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050888888888861271d565b505050505050505050565b61130d61210e565b73ffffffffffffffffffffffffffffffffffffffff1661132b6116c7565b73ffffffffffffffffffffffffffffffffffffffff1614611381576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611378906149ac565b60405180910390fd5b80600990805190602001906113979291906134cf565b5050565b6000806005600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611444576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143b906148ec565b60405180910390fd5b80915050919050565b3073ffffffffffffffffffffffffffffffffffffffff1661146c61210e565b73ffffffffffffffffffffffffffffffffffffffff16146114c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b99061482c565b60405180910390fd5b6114ce84848484612922565b50505050565b6060600160008361ffff1661ffff16815260200190815260200160002080546114fc90614fd5565b80601f016020809104026020016040519081016040528092919081815260200182805461152890614fd5565b80156115755780601f1061154a57610100808354040283529160200191611575565b820191906000526020600020905b81548152906001019060200180831161155857829003601f168201915b50505050509050919050565b600a5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ef906148cc565b60405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61164761210e565b73ffffffffffffffffffffffffffffffffffffffff166116656116c7565b73ffffffffffffffffffffffffffffffffffffffff16146116bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b2906149ac565b60405180910390fd5b6116c560006129a2565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60026020528260005260406000208280516020810182018051848252602083016020850120818352809550505050505060205280600052604060002060009250925050505481565b60606004805461174790614fd5565b80601f016020809104026020016040519081016040528092919081815260200182805461177390614fd5565b80156117c05780601f10611795576101008083540402835291602001916117c0565b820191906000526020600020905b8154815290600101906020018083116117a357829003601f168201915b5050505050905090565b6117dc6117d561210e565b8383612a66565b5050565b6117f16117eb61210e565b836123d8565b611830576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182790614a2c565b60405180910390fd5b61183c84848484612bd3565b50505050565b606061184d82612295565b61188c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611883906149cc565b60405180910390fd5b6000611896612c2f565b905060008151116118b657604051806020016040528060008152506118e1565b806118c084612cc1565b6040516020016118d1929190614657565b6040516020818303038152906040525b915050919050565b6118f161210e565b73ffffffffffffffffffffffffffffffffffffffff1661190f6116c7565b73ffffffffffffffffffffffffffffffffffffffff1614611965576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195c906149ac565b60405180910390fd5b7f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd67573ffffffffffffffffffffffffffffffffffffffff1663cbed8b9c86868686866040518663ffffffff1660e01b81526004016119c6959493929190614caa565b600060405180830381600087803b1580156119e057600080fd5b505af11580156119f4573d6000803e3d6000fd5b505050505050505050565b6000600260008761ffff1661ffff16815260200190815260200160002085604051611a2a9190614629565b908152602001604051809103902060008567ffffffffffffffff1681526020019081526020016000205490506000801b811415611a9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a939061498c565b60405180910390fd5b808383604051611aad929190614610565b604051809103902014611af5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aec9061494c565b60405180910390fd5b6000801b600260008861ffff1661ffff16815260200190815260200160002086604051611b229190614629565b908152602001604051809103902060008667ffffffffffffffff168152602001908152602001600020819055503073ffffffffffffffffffffffffffffffffffffffff166366ad5c8a87878787876040518663ffffffff1660e01b8152600401611b90959493929190614b47565b600060405180830381600087803b158015611baa57600080fd5b505af1158015611bbe573d6000803e3d6000fd5b50505050505050505050565b60098054611bd790614fd5565b80601f0160208091040260200160405190810160405280929190818152602001828054611c0390614fd5565b8015611c505780601f10611c2557610100808354040283529160200191611c50565b820191906000526020600020905b815481529060010190602001808311611c3357829003601f168201915b505050505081565b60007f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd675905090565b600b5481565b7f000000000000000000000000000000000000000000000000000000006266c58081565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611d4661210e565b73ffffffffffffffffffffffffffffffffffffffff16611d646116c7565b73ffffffffffffffffffffffffffffffffffffffff1614611dba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db1906149ac565b60405180910390fd5b8181600160008661ffff1661ffff1681526020019081526020016000209190611de4929190613555565b507ffa41487ad5d6728f0b19276fa1eddc16558578f5109fc39d2dc33c3230470dab838383604051611e1893929190614b15565b60405180910390a1505050565b611e80611e3061210e565b8989898080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050888888888861271d565b5050505050505050565b611e9261210e565b73ffffffffffffffffffffffffffffffffffffffff16611eb06116c7565b73ffffffffffffffffffffffffffffffffffffffff1614611f06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611efd906149ac565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611f76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6d906147ac565b60405180910390fd5b611f7f816129a2565b50565b60607f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd67573ffffffffffffffffffffffffffffffffffffffff1663f5ecbdbc7f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd67573ffffffffffffffffffffffffffffffffffffffff1663096568f6306040518263ffffffff1660e01b8152600401612019919061467b565b60206040518083038186803b15801561203157600080fd5b505afa158015612045573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120699190613c2f565b8630866040518563ffffffff1660e01b815260040161208b9493929190614c65565b60006040518083038186803b1580156120a357600080fd5b505afa1580156120b7573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906120e09190613b30565b9050949350505050565b7f000000000000000000000000000000000000000000000000000000000000000381565b600033905090565b3073ffffffffffffffffffffffffffffffffffffffff166366ad5c8a858585856040518563ffffffff1660e01b81526004016121559493929190614b9c565b600060405180830381600087803b15801561216f57600080fd5b505af1925050508015612180575060015b612224578080519060200120600260008661ffff1661ffff168152602001908152602001600020846040516121b59190614629565b908152602001604051809103902060008467ffffffffffffffff168152602001908152602001600020819055507fe6f254030bcb01ffd20558175c13fcaed6d1520be7becee4c961b65f79243b0d848484846040516122179493929190614b9c565b60405180910390a1612225565b5b50505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166005600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816007600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166123748361139b565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6123d4828260405180602001604052806000815250612e6e565b5050565b60006123e382612295565b612422576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124199061488c565b60405180910390fd5b600061242d8361139b565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061249c57508373ffffffffffffffffffffffffffffffffffffffff1661248484610c5b565b73ffffffffffffffffffffffffffffffffffffffff16145b806124ad57506124ac8185611caa565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166124d68261139b565b73ffffffffffffffffffffffffffffffffffffffff161461252c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612523906147cc565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561259c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125939061484c565b60405180910390fd5b6125a7838383612ec9565b6125b2600082612301565b6001600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126029190614ead565b925050819055506001600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126599190614e26565b92505081905550816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612718838383612ece565b505050565b61272e61272861210e565b866123d8565b61276d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276490614a2c565b60405180910390fd5b61277988888888612ed3565b6000868660405160200161278e92919061473a565b60405160208183030381529060405290506127f08882878787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612ee2565b60007f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd67573ffffffffffffffffffffffffffffffffffffffff16637a1457488a306040518363ffffffff1660e01b815260040161284d929190614aa7565b60206040518083038186803b15801561286557600080fd5b505afa158015612879573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061289d9190614011565b9050876040516128ad9190614629565b60405180910390208961ffff168b73ffffffffffffffffffffffffffffffffffffffff167f024797cc77ce15dc717112d54fb1df125fdfd8c81344fb046c5e074427ce15438a85604051612902929190614d13565b60405180910390a46129168a8a8a8a613004565b50505050505050505050565b61292d84848361300a565b600080828060200190518101906129449190613b71565b9150915060006014830151905061295c87828461300f565b7fd4d39d20f72eabd06c301e516d54653dfc9116de62c1d54bf1cb48cf3b42a7db878284886040516129919493929190614ad0565b60405180910390a150505050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612ad5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612acc9061486c565b60405180910390fd5b80600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612bc691906146e2565b60405180910390a3505050565b612bde8484846124b6565b612bea8484848461301e565b612c29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c209061478c565b60405180910390fd5b50505050565b606060098054612c3e90614fd5565b80601f0160208091040260200160405190810160405280929190818152602001828054612c6a90614fd5565b8015612cb75780601f10612c8c57610100808354040283529160200191612cb7565b820191906000526020600020905b815481529060010190602001808311612c9a57829003601f168201915b5050505050905090565b60606000821415612d09576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612e69565b600082905060005b60008214612d3b578080612d2490615038565b915050600a82612d349190614e7c565b9150612d11565b60008167ffffffffffffffff811115612d7d577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612daf5781602001600182028036833780820191505090505b5090505b60008514612e6257600182612dc89190614ead565b9150600a85612dd79190615081565b6030612de39190614e26565b60f81b818381518110612e1f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612e5b9190614e7c565b9450612db3565b8093505050505b919050565b612e7883836131b5565b612e85600084848461301e565b612ec4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ebb9061478c565b60405180910390fd5b505050565b505050565b505050565b612edc8161338f565b50505050565b6000600160008761ffff1661ffff1681526020019081526020016000208054612f0a90614fd5565b90501415612f4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f449061490c565b60405180910390fd5b7f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd67573ffffffffffffffffffffffffffffffffffffffff1663c58031003487600160008a61ffff1661ffff168152602001908152602001600020888888886040518863ffffffff1660e01b8152600401612fcb96959493929190614bef565b6000604051808303818588803b158015612fe457600080fd5b505af1158015612ff8573d6000803e3d6000fd5b50505050505050505050565b50505050565b505050565b61301982826123ba565b505050565b600061303f8473ffffffffffffffffffffffffffffffffffffffff166134ac565b156131a8578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261306861210e565b8786866040518563ffffffff1660e01b815260040161308a9493929190614696565b602060405180830381600087803b1580156130a457600080fd5b505af19250505080156130d557506040513d601f19601f820116820180604052508101906130d29190613b07565b60015b613158573d8060008114613105576040519150601f19603f3d011682016040523d82523d6000602084013e61310a565b606091505b50600081511415613150576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131479061478c565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506131ad565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613225576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161321c9061492c565b60405180910390fd5b61322e81612295565b1561326e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613265906147ec565b60405180910390fd5b61327a60008383612ec9565b6001600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546132ca9190614e26565b92505081905550816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461338b60008383612ece565b5050565b600061339a8261139b565b90506133a881600084612ec9565b6133b3600083612301565b6001600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546134039190614ead565b925050819055506005600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46134a881600084612ece565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b8280546134db90614fd5565b90600052602060002090601f0160209004810192826134fd5760008555613544565b82601f1061351657805160ff1916838001178555613544565b82800160010185558215613544579182015b82811115613543578251825591602001919060010190613528565b5b50905061355191906135db565b5090565b82805461356190614fd5565b90600052602060002090601f01602090048101928261358357600085556135ca565b82601f1061359c57803560ff19168380011785556135ca565b828001600101855582156135ca579182015b828111156135c95782358255916020019190600101906135ae565b5b5090506135d791906135db565b5090565b5b808211156135f45760008160009055506001016135dc565b5090565b600061360b61360684614d61565b614d3c565b90508281526020810184848401111561362357600080fd5b61362e848285614f93565b509392505050565b600061364961364484614d61565b614d3c565b90508281526020810184848401111561366157600080fd5b61366c848285614fa2565b509392505050565b600061368761368284614d92565b614d3c565b90508281526020810184848401111561369f57600080fd5b6136aa848285614f93565b509392505050565b6000813590506136c181615791565b92915050565b6000813590506136d6816157a8565b92915050565b6000813590506136eb816157bf565b92915050565b600081359050613700816157d6565b92915050565b600081519050613715816157d6565b92915050565b60008083601f84011261372d57600080fd5b8235905067ffffffffffffffff81111561374657600080fd5b60208301915083600182028301111561375e57600080fd5b9250929050565b600082601f83011261377657600080fd5b81356137868482602086016135f8565b91505092915050565b600082601f8301126137a057600080fd5b81516137b0848260208601613636565b91505092915050565b600082601f8301126137ca57600080fd5b81356137da848260208601613674565b91505092915050565b6000813590506137f2816157ed565b92915050565b600081519050613807816157ed565b92915050565b60008135905061381c81615804565b92915050565b60008151905061383181615804565b92915050565b6000813590506138468161581b565b92915050565b60008151905061385b8161581b565b92915050565b60006020828403121561387357600080fd5b6000613881848285016136b2565b91505092915050565b6000806040838503121561389d57600080fd5b60006138ab858286016136b2565b92505060206138bc858286016136b2565b9150509250929050565b6000806000606084860312156138db57600080fd5b60006138e9868287016136b2565b93505060206138fa868287016136b2565b925050604061390b8682870161380d565b9150509250925092565b6000806000806080858703121561392b57600080fd5b6000613939878288016136b2565b945050602061394a878288016136b2565b935050604061395b8782880161380d565b925050606085013567ffffffffffffffff81111561397857600080fd5b61398487828801613765565b91505092959194509250565b600080604083850312156139a357600080fd5b60006139b1858286016136b2565b92505060206139c2858286016136dc565b9150509250929050565b600080600080600080600080600060e08a8c0312156139ea57600080fd5b60006139f88c828d016136b2565b9950506020613a098c828d016137e3565b98505060408a013567ffffffffffffffff811115613a2657600080fd5b613a328c828d0161371b565b97509750506060613a458c828d0161380d565b9550506080613a568c828d016136c7565b94505060a0613a678c828d016136b2565b93505060c08a013567ffffffffffffffff811115613a8457600080fd5b613a908c828d0161371b565b92509250509295985092959850929598565b60008060408385031215613ab557600080fd5b6000613ac3858286016136b2565b9250506020613ad48582860161380d565b9150509250929050565b600060208284031215613af057600080fd5b6000613afe848285016136f1565b91505092915050565b600060208284031215613b1957600080fd5b6000613b2784828501613706565b91505092915050565b600060208284031215613b4257600080fd5b600082015167ffffffffffffffff811115613b5c57600080fd5b613b688482850161378f565b91505092915050565b60008060408385031215613b8457600080fd5b600083015167ffffffffffffffff811115613b9e57600080fd5b613baa8582860161378f565b9250506020613bbb85828601613822565b9150509250929050565b600060208284031215613bd757600080fd5b600082013567ffffffffffffffff811115613bf157600080fd5b613bfd848285016137b9565b91505092915050565b600060208284031215613c1857600080fd5b6000613c26848285016137e3565b91505092915050565b600060208284031215613c4157600080fd5b6000613c4f848285016137f8565b91505092915050565b600080600060408486031215613c6d57600080fd5b6000613c7b868287016137e3565b935050602084013567ffffffffffffffff811115613c9857600080fd5b613ca48682870161371b565b92509250509250925092565b60008060008060008060008060c0898b031215613ccc57600080fd5b6000613cda8b828c016137e3565b985050602089013567ffffffffffffffff811115613cf757600080fd5b613d038b828c0161371b565b97509750506040613d168b828c0161380d565b9550506060613d278b828c016136c7565b9450506080613d388b828c016136b2565b93505060a089013567ffffffffffffffff811115613d5557600080fd5b613d618b828c0161371b565b92509250509295985092959890939650565b600080600060608486031215613d8857600080fd5b6000613d96868287016137e3565b935050602084013567ffffffffffffffff811115613db357600080fd5b613dbf86828701613765565b9250506040613dd08682870161380d565b9150509250925092565b600080600080600060808688031215613df257600080fd5b6000613e00888289016137e3565b955050602086013567ffffffffffffffff811115613e1d57600080fd5b613e2988828901613765565b9450506040613e3a88828901613837565b935050606086013567ffffffffffffffff811115613e5757600080fd5b613e638882890161371b565b92509250509295509295909350565b60008060008060808587031215613e8857600080fd5b6000613e96878288016137e3565b945050602085013567ffffffffffffffff811115613eb357600080fd5b613ebf87828801613765565b9350506040613ed087828801613837565b925050606085013567ffffffffffffffff811115613eed57600080fd5b613ef987828801613765565b91505092959194509250565b60008060008060808587031215613f1b57600080fd5b6000613f29878288016137e3565b9450506020613f3a878288016137e3565b9350506040613f4b878288016136b2565b9250506060613f5c8782880161380d565b91505092959194509250565b600080600080600060808688031215613f8057600080fd5b6000613f8e888289016137e3565b9550506020613f9f888289016137e3565b9450506040613fb08882890161380d565b935050606086013567ffffffffffffffff811115613fcd57600080fd5b613fd98882890161371b565b92509250509295509295909350565b600060208284031215613ffa57600080fd5b60006140088482850161380d565b91505092915050565b60006020828403121561402357600080fd5b60006140318482850161384c565b91505092915050565b61404381614ef3565b82525050565b61405281614ee1565b82525050565b61406181614f05565b82525050565b61407081614f11565b82525050565b60006140828385614dee565b935061408f838584614f93565b6140988361516e565b840190509392505050565b60006140af8385614dff565b93506140bc838584614f93565b82840190509392505050565b60006140d382614dd8565b6140dd8185614dee565b93506140ed818560208601614fa2565b6140f68161516e565b840191505092915050565b600061410c82614dd8565b6141168185614dff565b9350614126818560208601614fa2565b80840191505092915050565b6000815461413f81614fd5565b6141498186614dee565b945060018216600081146141645760018114614176576141a9565b60ff19831686526020860193506141a9565b61417f85614dc3565b60005b838110156141a157815481890152600182019150602081019050614182565b808801955050505b50505092915050565b600081546141bf81614fd5565b6141c98186614dff565b945060018216600081146141e457600181146141f557614228565b60ff19831686528186019350614228565b6141fe85614dc3565b60005b8381101561422057815481890152600182019150602081019050614201565b838801955050505b50505092915050565b600061423c82614de3565b6142468185614e0a565b9350614256818560208601614fa2565b61425f8161516e565b840191505092915050565b600061427582614de3565b61427f8185614e1b565b935061428f818560208601614fa2565b80840191505092915050565b60006142a8603283614e0a565b91506142b38261517f565b604082019050919050565b60006142cb602683614e0a565b91506142d6826151ce565b604082019050919050565b60006142ee602583614e0a565b91506142f98261521d565b604082019050919050565b6000614311601c83614e0a565b915061431c8261526c565b602082019050919050565b6000614334602b83614e0a565b915061433f82615295565b604082019050919050565b6000614357602283614e0a565b9150614362826152e4565b604082019050919050565b600061437a602483614e0a565b915061438582615333565b604082019050919050565b600061439d601983614e0a565b91506143a882615382565b602082019050919050565b60006143c0602c83614e0a565b91506143cb826153ab565b604082019050919050565b60006143e3603883614e0a565b91506143ee826153fa565b604082019050919050565b6000614406602a83614e0a565b915061441182615449565b604082019050919050565b6000614429602983614e0a565b915061443482615498565b604082019050919050565b600061444c603283614e0a565b9150614457826154e7565b604082019050919050565b600061446f602083614e0a565b915061447a82615536565b602082019050919050565b6000614492601b83614e0a565b915061449d8261555f565b602082019050919050565b60006144b5602c83614e0a565b91506144c082615588565b604082019050919050565b60006144d8601d83614e0a565b91506144e3826155d7565b602082019050919050565b60006144fb602083614e0a565b915061450682615600565b602082019050919050565b600061451e602f83614e0a565b915061452982615629565b604082019050919050565b6000614541601783614e0a565b915061454c82615678565b602082019050919050565b6000614564602183614e0a565b915061456f826156a1565b604082019050919050565b6000614587603183614e0a565b9150614592826156f0565b604082019050919050565b60006145aa601683614e0a565b91506145b58261573f565b602082019050919050565b60006145cd601c83614e0a565b91506145d882615768565b602082019050919050565b6145ec81614f47565b82525050565b6145fb81614f75565b82525050565b61460a81614f7f565b82525050565b600061461d8284866140a3565b91508190509392505050565b60006146358284614101565b915081905092915050565b600061464c82846141b2565b915081905092915050565b6000614663828561426a565b915061466f828461426a565b91508190509392505050565b60006020820190506146906000830184614049565b92915050565b60006080820190506146ab6000830187614049565b6146b86020830186614049565b6146c560408301856145f2565b81810360608301526146d781846140c8565b905095945050505050565b60006020820190506146f76000830184614058565b92915050565b60006020820190506147126000830184614067565b92915050565b6000602082019050818103600083015261473281846140c8565b905092915050565b6000604082019050818103600083015261475481856140c8565b905061476360208301846145f2565b9392505050565b600060208201905081810360008301526147848184614231565b905092915050565b600060208201905081810360008301526147a58161429b565b9050919050565b600060208201905081810360008301526147c5816142be565b9050919050565b600060208201905081810360008301526147e5816142e1565b9050919050565b6000602082019050818103600083015261480581614304565b9050919050565b6000602082019050818103600083015261482581614327565b9050919050565b600060208201905081810360008301526148458161434a565b9050919050565b600060208201905081810360008301526148658161436d565b9050919050565b6000602082019050818103600083015261488581614390565b9050919050565b600060208201905081810360008301526148a5816143b3565b9050919050565b600060208201905081810360008301526148c5816143d6565b9050919050565b600060208201905081810360008301526148e5816143f9565b9050919050565b600060208201905081810360008301526149058161441c565b9050919050565b600060208201905081810360008301526149258161443f565b9050919050565b6000602082019050818103600083015261494581614462565b9050919050565b6000602082019050818103600083015261496581614485565b9050919050565b60006020820190508181036000830152614985816144a8565b9050919050565b600060208201905081810360008301526149a5816144cb565b9050919050565b600060208201905081810360008301526149c5816144ee565b9050919050565b600060208201905081810360008301526149e581614511565b9050919050565b60006020820190508181036000830152614a0581614534565b9050919050565b60006020820190508181036000830152614a2581614557565b9050919050565b60006020820190508181036000830152614a458161457a565b9050919050565b60006020820190508181036000830152614a658161459d565b9050919050565b60006020820190508181036000830152614a85816145c0565b9050919050565b6000602082019050614aa160008301846145e3565b92915050565b6000604082019050614abc60008301856145e3565b614ac96020830184614049565b9392505050565b6000608082019050614ae560008301876145e3565b614af26020830186614049565b614aff60408301856145f2565b614b0c6060830184614601565b95945050505050565b6000604082019050614b2a60008301866145e3565b8181036020830152614b3d818486614076565b9050949350505050565b6000608082019050614b5c60008301886145e3565b8181036020830152614b6e81876140c8565b9050614b7d6040830186614601565b8181036060830152614b90818486614076565b90509695505050505050565b6000608082019050614bb160008301876145e3565b8181036020830152614bc381866140c8565b9050614bd26040830185614601565b8181036060830152614be481846140c8565b905095945050505050565b600060c082019050614c0460008301896145e3565b8181036020830152614c168188614132565b90508181036040830152614c2a81876140c8565b9050614c39606083018661403a565b614c466080830185614049565b81810360a0830152614c5881846140c8565b9050979650505050505050565b6000608082019050614c7a60008301876145e3565b614c8760208301866145e3565b614c946040830185614049565b614ca160608301846145f2565b95945050505050565b6000608082019050614cbf60008301886145e3565b614ccc60208301876145e3565b614cd960408301866145f2565b8181036060830152614cec818486614076565b90509695505050505050565b6000602082019050614d0d60008301846145f2565b92915050565b6000604082019050614d2860008301856145f2565b614d356020830184614601565b9392505050565b6000614d46614d57565b9050614d528282615007565b919050565b6000604051905090565b600067ffffffffffffffff821115614d7c57614d7b61513f565b5b614d858261516e565b9050602081019050919050565b600067ffffffffffffffff821115614dad57614dac61513f565b5b614db68261516e565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614e3182614f75565b9150614e3c83614f75565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614e7157614e706150b2565b5b828201905092915050565b6000614e8782614f75565b9150614e9283614f75565b925082614ea257614ea16150e1565b5b828204905092915050565b6000614eb882614f75565b9150614ec383614f75565b925082821015614ed657614ed56150b2565b5b828203905092915050565b6000614eec82614f55565b9050919050565b6000614efe82614f55565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b82818337600083830152505050565b60005b83811015614fc0578082015181840152602081019050614fa5565b83811115614fcf576000848401525b50505050565b60006002820490506001821680614fed57607f821691505b6020821081141561500157615000615110565b5b50919050565b6150108261516e565b810181811067ffffffffffffffff8211171561502f5761502e61513f565b5b80604052505050565b600061504382614f75565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615076576150756150b2565b5b600182019050919050565b600061508c82614f75565b915061509783614f75565b9250826150a7576150a66150e1565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4c7a52656365697665723a20696e76616c696420736f757263652073656e646960008201527f6e6720636f6e7472616374000000000000000000000000000000000000000000602082015250565b7f4c7a52656365697665723a2063616c6c6572206d75737420626520427269646760008201527f652e000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4c7a53656e643a2064657374696e6174696f6e20636861696e206973206e6f7460008201527f2061207472757374656420736f757263652e0000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4c7a52656365697665723a20696e76616c6964207061796c6f61640000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4c7a52656365697665723a206e6f2073746f726564206d657373616765000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4f4e46543a204f6e6c792033207065722077616c6c6574000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f4f4e46543a204d696e74206e6f74207374617274656400000000000000000000600082015250565b7f4f4e46543a204d6178204d696e74206c696d6974207265616368656400000000600082015250565b61579a81614ee1565b81146157a557600080fd5b50565b6157b181614ef3565b81146157bc57600080fd5b50565b6157c881614f05565b81146157d357600080fd5b50565b6157df81614f1b565b81146157ea57600080fd5b50565b6157f681614f47565b811461580157600080fd5b50565b61580d81614f75565b811461581857600080fd5b50565b61582481614f7f565b811461582f57600080fd5b5056fea264697066735822122008b089baf84f694369b26223bb76cc72847efe6a2a0e47546b97c6f4fcaa94e864736f6c63430008040033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd675000000000000000000000000000000000000000000000000000000000000054600000000000000000000000000000000000000000000000000000000000009f5000000000000000000000000000000000000000000000000000000006266c580
-----Decoded View---------------
Arg [0] : _layerZeroEndpoint (address): 0x66A71Dcef29A0fFBDBE3c6a460a3B5BC225Cd675
Arg [1] : _startMintId (uint256): 1350
Arg [2] : _endMintId (uint256): 2549
Arg [3] : _startTimestamp (uint256): 1650902400
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd675
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000546
Arg [2] : 00000000000000000000000000000000000000000000000000000000000009f5
Arg [3] : 000000000000000000000000000000000000000000000000000000006266c580
Deployed Bytecode Sourcemap
5281:278:10:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;685:652:14;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1570:300:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2488:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2654:121:14;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3999:217:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3537:401;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2781:127:14;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1043:365:18;;;:::i;:::-;;4726:330:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3360:247:14;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5122:179:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2914:176:14;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;546:396:17;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3676:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2191:235:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1295:334:15;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3771:133:14;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;174:22:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1929:205:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1668:101:0;;;;;;;;;;;;;:::i;:::-;;1036:85;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;531:83:15;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2650:102:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4283:153;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5367:320;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2818:329;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2446:202:14;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1810:668:15;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;345:26:17;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3910:100:14;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;202:21:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;229:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4502:162:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3141:213:14;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;948:376:17;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1918:198:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2155:232:14;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;271:34:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;685:652:14;913:10;889:35;;:12;:10;:12::i;:::-;:35;;;881:44;;;;;;1097:19;:32;1117:11;1097:32;;;;;;;;;;;;;;;:39;;;;;:::i;:::-;;;1075:11;:18;:61;:134;;;;;1176:19;:32;1196:11;1176:32;;;;;;;;;;;;;;;1166:43;;;;;;:::i;:::-;;;;;;;;1150:11;1140:22;;;;;;:69;1075:134;1067:190;;;;;;;;;;;;:::i;:::-;;;;;;;;;1268:62;1287:11;1300;1313:6;1321:8;1268:18;:62::i;:::-;685:652;;;;:::o;1570:300:1:-;1672:4;1722:25;1707:40;;;:11;:40;;;;:104;;;;1778:33;1763:48;;;:11;:48;;;;1707:104;:156;;;;1827:36;1851:11;1827:23;:36::i;:::-;1707:156;1688:175;;1570:300;;;:::o;2488:98::-;2542:13;2574:5;2567:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2488:98;:::o;2654:121:14:-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2733:10:14::1;:25;;;2759:8;2733:35;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;2654:121:::0;:::o;3999:217:1:-;4075:7;4102:16;4110:7;4102;:16::i;:::-;4094:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4185:15;:24;4201:7;4185:24;;;;;;;;;;;;;;;;;;;;;4178:31;;3999:217;;;:::o;3537:401::-;3617:13;3633:23;3648:7;3633:14;:23::i;:::-;3617:39;;3680:5;3674:11;;:2;:11;;;;3666:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;3771:5;3755:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;3780:37;3797:5;3804:12;:10;:12::i;:::-;3780:16;:37::i;:::-;3755:62;3734:165;;;;;;;;;;;;:::i;:::-;;;;;;;;;3910:21;3919:2;3923:7;3910:8;:21::i;:::-;3537:401;;;:::o;2781:127:14:-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2863:10:14::1;:28;;;2892:8;2863:38;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;2781:127:::0;:::o;1043:365:18:-;1108:9;;1094:10;;:23;;1086:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;1187:14;1168:15;:33;;1160:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1270:8;1246:21;1256:10;1246:9;:21::i;:::-;:32;1238:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1317:10;1330;;1317:23;;1350:10;;:12;;;;;;;;;:::i;:::-;;;;;;1373:28;1383:10;1395:5;1373:9;:28::i;:::-;1043:365;:::o;4726:330:1:-;4915:41;4934:12;:10;:12::i;:::-;4948:7;4915:18;:41::i;:::-;4907:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5021:28;5031:4;5037:2;5041:7;5021:9;:28::i;:::-;4726:330;;;:::o;3360:247:14:-;3456:4;3472:26;3501:19;:32;3521:11;3501:32;;;;;;;;;;;;;;;3472:61;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3588:11;;3578:22;;;;;;;:::i;:::-;;;;;;;;3560:13;3550:24;;;;;;:50;3543:57;;;3360:247;;;;;:::o;5122:179:1:-;5255:39;5272:4;5278:2;5282:7;5255:39;;;;;;;;;;;;:16;:39::i;:::-;5122:179;;;:::o;2914:176:14:-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3028:10:14::1;:29;;;3058:11;3071;;3028:55;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;2914:176:::0;;;:::o;546:396:17:-;837:98;843:5;850:11;863:10;;837:98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;875:8;885:14;901:18;921:13;;837:5;:98::i;:::-;546:396;;;;;;;;;:::o;3676:111::-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3767:13:17::1;3752:12;:28;;;;;;;;;;;;:::i;:::-;;3676:111:::0;:::o;2191:235:1:-;2263:7;2282:13;2298:7;:16;2306:7;2298:16;;;;;;;;;;;;;;;;;;;;;2282:32;;2349:1;2332:19;;:5;:19;;;;2324:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2414:5;2407:12;;;2191:235;;;:::o;1295:334:15:-;1503:4;1479:29;;:12;:10;:12::i;:::-;:29;;;1471:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;1557:65;1579:11;1592;1605:6;1613:8;1557:21;:65::i;:::-;1295:334;;;;:::o;3771:133:14:-;3837:12;3868:19;:29;3888:8;3868:29;;;;;;;;;;;;;;;3861:36;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3771:133;;;:::o;174:22:18:-;;;;:::o;1929:205:1:-;2001:7;2045:1;2028:19;;:5;:19;;;;2020:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;2111:9;:16;2121:5;2111:16;;;;;;;;;;;;;;;;2104:23;;1929:205;;;:::o;1668:101:0:-;1259:12;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1732:30:::1;1759:1;1732:18;:30::i;:::-;1668:101::o:0;1036:85::-;1082:7;1108:6;;;;;;;;;;;1101:13;;1036:85;:::o;531:83:15:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2650:102:1:-;2706:13;2738:7;2731:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2650:102;:::o;4283:153::-;4377:52;4396:12;:10;:12::i;:::-;4410:8;4420;4377:18;:52::i;:::-;4283:153;;:::o;5367:320::-;5536:41;5555:12;:10;:12::i;:::-;5569:7;5536:18;:41::i;:::-;5528:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5641:39;5655:4;5661:2;5665:7;5674:5;5641:13;:39::i;:::-;5367:320;;;;:::o;2818:329::-;2891:13;2924:16;2932:7;2924;:16::i;:::-;2916:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;3003:21;3027:10;:8;:10::i;:::-;3003:34;;3078:1;3060:7;3054:21;:25;:86;;;;;;;;;;;;;;;;;3106:7;3115:18;:7;:16;:18::i;:::-;3089:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3054:86;3047:93;;;2818:329;;;:::o;2446:202:14:-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2579:10:14::1;:20;;;2600:8;2610;2620:11;2633:7;;2579:62;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;2446:202:::0;;;;;:::o;1810:668:15:-;1997:19;2019:14;:27;2034:11;2019:27;;;;;;;;;;;;;;;2047:11;2019:40;;;;;;:::i;:::-;;;;;;;;;;;;;:48;2060:6;2019:48;;;;;;;;;;;;;;1997:70;;2108:1;2100:10;;2085:11;:25;;2077:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;2185:11;2172:8;;2162:19;;;;;;;:::i;:::-;;;;;;;;:34;2154:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;2333:1;2325:10;;2274:14;:27;2289:11;2274:27;;;;;;;;;;;;;;;2302:11;2274:40;;;;;;:::i;:::-;;;;;;;;;;;;;:48;2315:6;2274:48;;;;;;;;;;;;;:61;;;;2402:4;:25;;;2428:11;2441;2454:6;2462:8;;2402:69;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1810:668;;;;;;:::o;345:26:17:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3910:100:14:-;3958:7;3992:10;3977:26;;3910:100;:::o;202:21:18:-;;;;:::o;229:36::-;;;:::o;4502:162:1:-;4599:4;4622:18;:25;4641:5;4622:25;;;;;;;;;;;;;;;:35;4648:8;4622:35;;;;;;;;;;;;;;;;;;;;;;;;;4615:42;;4502:162;;;;:::o;3141:213:14:-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3279:11:14::1;;3244:19;:32;3264:11;3244:32;;;;;;;;;;;;;;;:46;;;;;;;:::i;:::-;;3305:42;3322:11;3335;;3305:42;;;;;;;;:::i;:::-;;;;;;;;3141:213:::0;;;:::o;948:376:17:-;1212:105;1218:12;:10;:12::i;:::-;1232:11;1245:10;;1212:105;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1257:8;1267:14;1283:18;1303:13;;1212:5;:105::i;:::-;948:376;;;;;;;;:::o;1918:198:0:-;1259:12;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2026:1:::1;2006:22;;:8;:22;;;;1998:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2081:28;2100:8;2081:18;:28::i;:::-;1918:198:::0;:::o;2155:232:14:-;2249:12;2280:10;:20;;;2301:10;:25;;;2335:4;2301:40;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2343:8;2361:4;2368:11;2280:100;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2273:107;;2155:232;;;;;;:::o;271:34:18:-;;;:::o;640:96:6:-;693:7;719:10;712:17;;640:96;:::o;770:519:15:-;965:4;:25;;;991:11;1004;1017:6;1025:8;965:69;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;961:322;;1187:8;1177:19;;;;;;1126:14;:27;1141:11;1126:27;;;;;;;;;;;;;;;1154:11;1126:40;;;;;;:::i;:::-;;;;;;;;;;;;;:48;1167:6;1126:48;;;;;;;;;;;;;:70;;;;1215:57;1229:11;1242;1255:6;1263:8;1215:57;;;;;;;;;:::i;:::-;;;;;;;;961:322;;;;770:519;;;;:::o;829:155:8:-;914:4;952:25;937:40;;;:11;:40;;;;930:47;;829:155;;;:::o;7159:125:1:-;7224:4;7275:1;7247:30;;:7;:16;7255:7;7247:16;;;;;;;;;;;;;;;;;;;;;:30;;;;7240:37;;7159:125;;;:::o;11168:171::-;11269:2;11242:15;:24;11258:7;11242:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;11324:7;11320:2;11286:46;;11295:23;11310:7;11295:14;:23::i;:::-;11286:46;;;;;;;;;;;;11168:171;;:::o;8116:108::-;8191:26;8201:2;8205:7;8191:26;;;;;;;;;;;;:9;:26::i;:::-;8116:108;;:::o;7442:344::-;7535:4;7559:16;7567:7;7559;:16::i;:::-;7551:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7634:13;7650:23;7665:7;7650:14;:23::i;:::-;7634:39;;7702:5;7691:16;;:7;:16;;;:51;;;;7735:7;7711:31;;:20;7723:7;7711:11;:20::i;:::-;:31;;;7691:51;:87;;;;7746:32;7763:5;7770:7;7746:16;:32::i;:::-;7691:87;7683:96;;;7442:344;;;;:::o;10452:605::-;10606:4;10579:31;;:23;10594:7;10579:14;:23::i;:::-;:31;;;10571:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;10684:1;10670:16;;:2;:16;;;;10662:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;10738:39;10759:4;10765:2;10769:7;10738:20;:39::i;:::-;10839:29;10856:1;10860:7;10839:8;:29::i;:::-;10898:1;10879:9;:15;10889:4;10879:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;10926:1;10909:9;:13;10919:2;10909:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;10956:2;10937:7;:16;10945:7;10937:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;10993:7;10989:2;10974:27;;10983:4;10974:27;;;;;;;;;;;;11012:38;11032:4;11038:2;11042:7;11012:19;:38::i;:::-;10452:605;;;:::o;1330:817:17:-;1607:42;1626:12;:10;:12::i;:::-;1640:8;1607:18;:42::i;:::-;1599:104;;;;;;;;;;;;:::i;:::-;;;;;;;;;1713:53;1725:5;1732:11;1745:10;1757:8;1713:11;:53::i;:::-;1777:20;1811:10;1823:8;1800:32;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1777:55;;1842:80;1850:11;1863:7;1872:14;1888:18;1908:13;;1842:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:7;:80::i;:::-;1933:12;1948:10;:27;;;1976:11;1997:4;1948:55;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1933:70;;2050:10;2018:60;;;;;;:::i;:::-;;;;;;;;2037:11;2018:60;;2030:5;2018:60;;;2062:8;2072:5;2018:60;;;;;;;:::i;:::-;;;;;;;;2088:52;2099:5;2106:11;2119:10;2131:8;2088:10;:52::i;:::-;1330:817;;;;;;;;;;:::o;2153:777::-;2342:50;2357:11;2370;2383:8;2342:14;:50::i;:::-;2445:22;2469:12;2496:8;2485:35;;;;;;;;;;;;:::i;:::-;2444:76;;;;2530:22;2624:2;2613:9;2609:18;2603:25;2585:43;;2794:51;2808:11;2821:14;2837:7;2794:13;:51::i;:::-;2861:62;2878:11;2891:14;2907:7;2916:6;2861:62;;;;;;;;;:::i;:::-;;;;;;;;2153:777;;;;;;;:::o;2270:187:0:-;2343:16;2362:6;;;;;;;;;;;2343:25;;2387:8;2378:6;;:17;;;;;;;;;;;;;;;;;;2441:8;2410:40;;2431:8;2410:40;;;;;;;;;;;;2270:187;;:::o;11474:307:1:-;11624:8;11615:17;;:5;:17;;;;11607:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;11710:8;11672:18;:25;11691:5;11672:25;;;;;;;;;;;;;;;:35;11698:8;11672:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;11755:8;11733:41;;11748:5;11733:41;;;11765:8;11733:41;;;;;;:::i;:::-;;;;;;;;11474:307;;;:::o;6549:::-;6700:28;6710:4;6716:2;6720:7;6700:9;:28::i;:::-;6746:48;6769:4;6775:2;6779:7;6788:5;6746:22;:48::i;:::-;6738:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;6549:307;;;;:::o;3793:103:17:-;3845:13;3877:12;3870:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3793:103;:::o;328:703:7:-;384:13;610:1;601:5;:10;597:51;;;627:10;;;;;;;;;;;;;;;;;;;;;597:51;657:12;672:5;657:20;;687:14;711:75;726:1;718:4;:9;711:75;;743:8;;;;;:::i;:::-;;;;773:2;765:10;;;;;:::i;:::-;;;711:75;;;795:19;827:6;817:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;795:39;;844:150;860:1;851:5;:10;844:150;;887:1;877:11;;;;;:::i;:::-;;;953:2;945:5;:10;;;;:::i;:::-;932:2;:24;;;;:::i;:::-;919:39;;902:6;909;902:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;981:2;972:11;;;;;:::i;:::-;;;844:150;;;1017:6;1003:21;;;;;328:703;;;;:::o;8445:311:1:-;8570:18;8576:2;8580:7;8570:5;:18::i;:::-;8619:54;8650:1;8654:2;8658:7;8667:5;8619:22;:54::i;:::-;8598:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;8445:311;;;:::o;13668:122::-;;;;:::o;14162:121::-;;;;:::o;2936:201:17:-;3115:15;3121:8;3115:5;:15::i;:::-;2936:201;;;;:::o;1621:432:14:-;1839:1;1796:19;:32;1816:11;1796:32;;;;;;;;;;;;;;;:39;;;;;:::i;:::-;;;:44;;1788:107;;;;;;;;;;;;:::i;:::-;;;;;;;;;1905:10;:15;;;1928:9;1939:11;1952:19;:32;1972:11;1952:32;;;;;;;;;;;;;;;1986:8;1996:14;2012:18;2032:13;1905:141;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1621:432;;;;;:::o;3143:176:17:-;;;;;:::o;3325:160::-;;;;:::o;3491:179::-;3632:31;3642:10;3654:8;3632:9;:31::i;:::-;3491:179;;;:::o;12334:778:1:-;12484:4;12504:15;:2;:13;;;:15::i;:::-;12500:606;;;12555:2;12539:36;;;12576:12;:10;:12::i;:::-;12590:4;12596:7;12605:5;12539:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;12535:519;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12795:1;12778:6;:13;:18;12774:266;;;12820:60;;;;;;;;;;:::i;:::-;;;;;;;;12774:266;12992:6;12986:13;12977:6;12973:2;12969:15;12962:38;12535:519;12671:41;;;12661:51;;;:6;:51;;;;12654:58;;;;;12500:606;13091:4;13084:11;;12334:778;;;;;;;:::o;9078:427::-;9171:1;9157:16;;:2;:16;;;;9149:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;9229:16;9237:7;9229;:16::i;:::-;9228:17;9220:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;9289:45;9318:1;9322:2;9326:7;9289:20;:45::i;:::-;9362:1;9345:9;:13;9355:2;9345:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;9392:2;9373:7;:16;9381:7;9373:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;9435:7;9431:2;9410:33;;9427:1;9410:33;;;;;;;;;;;;9454:44;9482:1;9486:2;9490:7;9454:19;:44::i;:::-;9078:427;;:::o;9722:406::-;9781:13;9797:23;9812:7;9797:14;:23::i;:::-;9781:39;;9831:48;9852:5;9867:1;9871:7;9831:20;:48::i;:::-;9917:29;9934:1;9938:7;9917:8;:29::i;:::-;9977:1;9957:9;:16;9967:5;9957:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;9995:7;:16;10003:7;9995:16;;;;;;;;;;;;9988:23;;;;;;;;;;;10055:7;10051:1;10027:36;;10036:5;10027:36;;;;;;;;;;;;10074:47;10094:5;10109:1;10113:7;10074:19;:47::i;:::-;9722:406;;:::o;1175:320:5:-;1235:4;1487:1;1465:7;:19;;;:23;1458:30;;1175:320;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:19:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:352::-;444:5;469:65;485:48;526:6;485:48;:::i;:::-;469:65;:::i;:::-;460:74;;557:6;550:5;543:21;595:4;588:5;584:16;633:3;624:6;619:3;615:16;612:25;609:2;;;650:1;647;640:12;609:2;663:39;695:6;690:3;685;663:39;:::i;:::-;450:258;;;;;;:::o;714:345::-;792:5;817:66;833:49;875:6;833:49;:::i;:::-;817:66;:::i;:::-;808:75;;906:6;899:5;892:21;944:4;937:5;933:16;982:3;973:6;968:3;964:16;961:25;958:2;;;999:1;996;989:12;958:2;1012:41;1046:6;1041:3;1036;1012:41;:::i;:::-;798:261;;;;;;:::o;1065:139::-;1111:5;1149:6;1136:20;1127:29;;1165:33;1192:5;1165:33;:::i;:::-;1117:87;;;;:::o;1210:155::-;1264:5;1302:6;1289:20;1280:29;;1318:41;1353:5;1318:41;:::i;:::-;1270:95;;;;:::o;1371:133::-;1414:5;1452:6;1439:20;1430:29;;1468:30;1492:5;1468:30;:::i;:::-;1420:84;;;;:::o;1510:137::-;1555:5;1593:6;1580:20;1571:29;;1609:32;1635:5;1609:32;:::i;:::-;1561:86;;;;:::o;1653:141::-;1709:5;1740:6;1734:13;1725:22;;1756:32;1782:5;1756:32;:::i;:::-;1715:79;;;;:::o;1813:351::-;1870:8;1880:6;1930:3;1923:4;1915:6;1911:17;1907:27;1897:2;;1948:1;1945;1938:12;1897:2;1984:6;1971:20;1961:30;;2014:18;2006:6;2003:30;2000:2;;;2046:1;2043;2036:12;2000:2;2083:4;2075:6;2071:17;2059:29;;2137:3;2129:4;2121:6;2117:17;2107:8;2103:32;2100:41;2097:2;;;2154:1;2151;2144:12;2097:2;1887:277;;;;;:::o;2183:271::-;2238:5;2287:3;2280:4;2272:6;2268:17;2264:27;2254:2;;2305:1;2302;2295:12;2254:2;2345:6;2332:20;2370:78;2444:3;2436:6;2429:4;2421:6;2417:17;2370:78;:::i;:::-;2361:87;;2244:210;;;;;:::o;2473:286::-;2539:5;2588:3;2581:4;2573:6;2569:17;2565:27;2555:2;;2606:1;2603;2596:12;2555:2;2639:6;2633:13;2664:89;2749:3;2741:6;2734:4;2726:6;2722:17;2664:89;:::i;:::-;2655:98;;2545:214;;;;;:::o;2779:273::-;2835:5;2884:3;2877:4;2869:6;2865:17;2861:27;2851:2;;2902:1;2899;2892:12;2851:2;2942:6;2929:20;2967:79;3042:3;3034:6;3027:4;3019:6;3015:17;2967:79;:::i;:::-;2958:88;;2841:211;;;;;:::o;3058:137::-;3103:5;3141:6;3128:20;3119:29;;3157:32;3183:5;3157:32;:::i;:::-;3109:86;;;;:::o;3201:141::-;3257:5;3288:6;3282:13;3273:22;;3304:32;3330:5;3304:32;:::i;:::-;3263:79;;;;:::o;3348:139::-;3394:5;3432:6;3419:20;3410:29;;3448:33;3475:5;3448:33;:::i;:::-;3400:87;;;;:::o;3493:143::-;3550:5;3581:6;3575:13;3566:22;;3597:33;3624:5;3597:33;:::i;:::-;3556:80;;;;:::o;3642:137::-;3687:5;3725:6;3712:20;3703:29;;3741:32;3767:5;3741:32;:::i;:::-;3693:86;;;;:::o;3785:141::-;3841:5;3872:6;3866:13;3857:22;;3888:32;3914:5;3888:32;:::i;:::-;3847:79;;;;:::o;3932:262::-;3991:6;4040:2;4028:9;4019:7;4015:23;4011:32;4008:2;;;4056:1;4053;4046:12;4008:2;4099:1;4124:53;4169:7;4160:6;4149:9;4145:22;4124:53;:::i;:::-;4114:63;;4070:117;3998:196;;;;:::o;4200:407::-;4268:6;4276;4325:2;4313:9;4304:7;4300:23;4296:32;4293:2;;;4341:1;4338;4331:12;4293:2;4384:1;4409:53;4454:7;4445:6;4434:9;4430:22;4409:53;:::i;:::-;4399:63;;4355:117;4511:2;4537:53;4582:7;4573:6;4562:9;4558:22;4537:53;:::i;:::-;4527:63;;4482:118;4283:324;;;;;:::o;4613:552::-;4690:6;4698;4706;4755:2;4743:9;4734:7;4730:23;4726:32;4723:2;;;4771:1;4768;4761:12;4723:2;4814:1;4839:53;4884:7;4875:6;4864:9;4860:22;4839:53;:::i;:::-;4829:63;;4785:117;4941:2;4967:53;5012:7;5003:6;4992:9;4988:22;4967:53;:::i;:::-;4957:63;;4912:118;5069:2;5095:53;5140:7;5131:6;5120:9;5116:22;5095:53;:::i;:::-;5085:63;;5040:118;4713:452;;;;;:::o;5171:809::-;5266:6;5274;5282;5290;5339:3;5327:9;5318:7;5314:23;5310:33;5307:2;;;5356:1;5353;5346:12;5307:2;5399:1;5424:53;5469:7;5460:6;5449:9;5445:22;5424:53;:::i;:::-;5414:63;;5370:117;5526:2;5552:53;5597:7;5588:6;5577:9;5573:22;5552:53;:::i;:::-;5542:63;;5497:118;5654:2;5680:53;5725:7;5716:6;5705:9;5701:22;5680:53;:::i;:::-;5670:63;;5625:118;5810:2;5799:9;5795:18;5782:32;5841:18;5833:6;5830:30;5827:2;;;5873:1;5870;5863:12;5827:2;5901:62;5955:7;5946:6;5935:9;5931:22;5901:62;:::i;:::-;5891:72;;5753:220;5297:683;;;;;;;:::o;5986:401::-;6051:6;6059;6108:2;6096:9;6087:7;6083:23;6079:32;6076:2;;;6124:1;6121;6114:12;6076:2;6167:1;6192:53;6237:7;6228:6;6217:9;6213:22;6192:53;:::i;:::-;6182:63;;6138:117;6294:2;6320:50;6362:7;6353:6;6342:9;6338:22;6320:50;:::i;:::-;6310:60;;6265:115;6066:321;;;;;:::o;6393:1412::-;6535:6;6543;6551;6559;6567;6575;6583;6591;6599;6648:3;6636:9;6627:7;6623:23;6619:33;6616:2;;;6665:1;6662;6655:12;6616:2;6708:1;6733:53;6778:7;6769:6;6758:9;6754:22;6733:53;:::i;:::-;6723:63;;6679:117;6835:2;6861:52;6905:7;6896:6;6885:9;6881:22;6861:52;:::i;:::-;6851:62;;6806:117;6990:2;6979:9;6975:18;6962:32;7021:18;7013:6;7010:30;7007:2;;;7053:1;7050;7043:12;7007:2;7089:64;7145:7;7136:6;7125:9;7121:22;7089:64;:::i;:::-;7071:82;;;;6933:230;7202:2;7228:53;7273:7;7264:6;7253:9;7249:22;7228:53;:::i;:::-;7218:63;;7173:118;7330:3;7357:61;7410:7;7401:6;7390:9;7386:22;7357:61;:::i;:::-;7347:71;;7301:127;7467:3;7494:53;7539:7;7530:6;7519:9;7515:22;7494:53;:::i;:::-;7484:63;;7438:119;7624:3;7613:9;7609:19;7596:33;7656:18;7648:6;7645:30;7642:2;;;7688:1;7685;7678:12;7642:2;7724:64;7780:7;7771:6;7760:9;7756:22;7724:64;:::i;:::-;7706:82;;;;7567:231;6606:1199;;;;;;;;;;;:::o;7811:407::-;7879:6;7887;7936:2;7924:9;7915:7;7911:23;7907:32;7904:2;;;7952:1;7949;7942:12;7904:2;7995:1;8020:53;8065:7;8056:6;8045:9;8041:22;8020:53;:::i;:::-;8010:63;;7966:117;8122:2;8148:53;8193:7;8184:6;8173:9;8169:22;8148:53;:::i;:::-;8138:63;;8093:118;7894:324;;;;;:::o;8224:260::-;8282:6;8331:2;8319:9;8310:7;8306:23;8302:32;8299:2;;;8347:1;8344;8337:12;8299:2;8390:1;8415:52;8459:7;8450:6;8439:9;8435:22;8415:52;:::i;:::-;8405:62;;8361:116;8289:195;;;;:::o;8490:282::-;8559:6;8608:2;8596:9;8587:7;8583:23;8579:32;8576:2;;;8624:1;8621;8614:12;8576:2;8667:1;8692:63;8747:7;8738:6;8727:9;8723:22;8692:63;:::i;:::-;8682:73;;8638:127;8566:206;;;;:::o;8778:388::-;8857:6;8906:2;8894:9;8885:7;8881:23;8877:32;8874:2;;;8922:1;8919;8912:12;8874:2;8986:1;8975:9;8971:17;8965:24;9016:18;9008:6;9005:30;9002:2;;;9048:1;9045;9038:12;9002:2;9076:73;9141:7;9132:6;9121:9;9117:22;9076:73;:::i;:::-;9066:83;;8936:223;8864:302;;;;:::o;9172:544::-;9260:6;9268;9317:2;9305:9;9296:7;9292:23;9288:32;9285:2;;;9333:1;9330;9323:12;9285:2;9397:1;9386:9;9382:17;9376:24;9427:18;9419:6;9416:30;9413:2;;;9459:1;9456;9449:12;9413:2;9487:73;9552:7;9543:6;9532:9;9528:22;9487:73;:::i;:::-;9477:83;;9347:223;9609:2;9635:64;9691:7;9682:6;9671:9;9667:22;9635:64;:::i;:::-;9625:74;;9580:129;9275:441;;;;;:::o;9722:375::-;9791:6;9840:2;9828:9;9819:7;9815:23;9811:32;9808:2;;;9856:1;9853;9846:12;9808:2;9927:1;9916:9;9912:17;9899:31;9957:18;9949:6;9946:30;9943:2;;;9989:1;9986;9979:12;9943:2;10017:63;10072:7;10063:6;10052:9;10048:22;10017:63;:::i;:::-;10007:73;;9870:220;9798:299;;;;:::o;10103:260::-;10161:6;10210:2;10198:9;10189:7;10185:23;10181:32;10178:2;;;10226:1;10223;10216:12;10178:2;10269:1;10294:52;10338:7;10329:6;10318:9;10314:22;10294:52;:::i;:::-;10284:62;;10240:116;10168:195;;;;:::o;10369:282::-;10438:6;10487:2;10475:9;10466:7;10462:23;10458:32;10455:2;;;10503:1;10500;10493:12;10455:2;10546:1;10571:63;10626:7;10617:6;10606:9;10602:22;10571:63;:::i;:::-;10561:73;;10517:127;10445:206;;;;:::o;10657:536::-;10735:6;10743;10751;10800:2;10788:9;10779:7;10775:23;10771:32;10768:2;;;10816:1;10813;10806:12;10768:2;10859:1;10884:52;10928:7;10919:6;10908:9;10904:22;10884:52;:::i;:::-;10874:62;;10830:116;11013:2;11002:9;10998:18;10985:32;11044:18;11036:6;11033:30;11030:2;;;11076:1;11073;11066:12;11030:2;11112:64;11168:7;11159:6;11148:9;11144:22;11112:64;:::i;:::-;11094:82;;;;10956:230;10758:435;;;;;:::o;11199:1266::-;11332:6;11340;11348;11356;11364;11372;11380;11388;11437:3;11425:9;11416:7;11412:23;11408:33;11405:2;;;11454:1;11451;11444:12;11405:2;11497:1;11522:52;11566:7;11557:6;11546:9;11542:22;11522:52;:::i;:::-;11512:62;;11468:116;11651:2;11640:9;11636:18;11623:32;11682:18;11674:6;11671:30;11668:2;;;11714:1;11711;11704:12;11668:2;11750:64;11806:7;11797:6;11786:9;11782:22;11750:64;:::i;:::-;11732:82;;;;11594:230;11863:2;11889:53;11934:7;11925:6;11914:9;11910:22;11889:53;:::i;:::-;11879:63;;11834:118;11991:2;12017:61;12070:7;12061:6;12050:9;12046:22;12017:61;:::i;:::-;12007:71;;11962:126;12127:3;12154:53;12199:7;12190:6;12179:9;12175:22;12154:53;:::i;:::-;12144:63;;12098:119;12284:3;12273:9;12269:19;12256:33;12316:18;12308:6;12305:30;12302:2;;;12348:1;12345;12338:12;12302:2;12384:64;12440:7;12431:6;12420:9;12416:22;12384:64;:::i;:::-;12366:82;;;;12227:231;11395:1070;;;;;;;;;;;:::o;12471:661::-;12556:6;12564;12572;12621:2;12609:9;12600:7;12596:23;12592:32;12589:2;;;12637:1;12634;12627:12;12589:2;12680:1;12705:52;12749:7;12740:6;12729:9;12725:22;12705:52;:::i;:::-;12695:62;;12651:116;12834:2;12823:9;12819:18;12806:32;12865:18;12857:6;12854:30;12851:2;;;12897:1;12894;12887:12;12851:2;12925:62;12979:7;12970:6;12959:9;12955:22;12925:62;:::i;:::-;12915:72;;12777:220;13036:2;13062:53;13107:7;13098:6;13087:9;13083:22;13062:53;:::i;:::-;13052:63;;13007:118;12579:553;;;;;:::o;13138:936::-;13242:6;13250;13258;13266;13274;13323:3;13311:9;13302:7;13298:23;13294:33;13291:2;;;13340:1;13337;13330:12;13291:2;13383:1;13408:52;13452:7;13443:6;13432:9;13428:22;13408:52;:::i;:::-;13398:62;;13354:116;13537:2;13526:9;13522:18;13509:32;13568:18;13560:6;13557:30;13554:2;;;13600:1;13597;13590:12;13554:2;13628:62;13682:7;13673:6;13662:9;13658:22;13628:62;:::i;:::-;13618:72;;13480:220;13739:2;13765:52;13809:7;13800:6;13789:9;13785:22;13765:52;:::i;:::-;13755:62;;13710:117;13894:2;13883:9;13879:18;13866:32;13925:18;13917:6;13914:30;13911:2;;;13957:1;13954;13947:12;13911:2;13993:64;14049:7;14040:6;14029:9;14025:22;13993:64;:::i;:::-;13975:82;;;;13837:230;13281:793;;;;;;;;:::o;14080:916::-;14182:6;14190;14198;14206;14255:3;14243:9;14234:7;14230:23;14226:33;14223:2;;;14272:1;14269;14262:12;14223:2;14315:1;14340:52;14384:7;14375:6;14364:9;14360:22;14340:52;:::i;:::-;14330:62;;14286:116;14469:2;14458:9;14454:18;14441:32;14500:18;14492:6;14489:30;14486:2;;;14532:1;14529;14522:12;14486:2;14560:62;14614:7;14605:6;14594:9;14590:22;14560:62;:::i;:::-;14550:72;;14412:220;14671:2;14697:52;14741:7;14732:6;14721:9;14717:22;14697:52;:::i;:::-;14687:62;;14642:117;14826:2;14815:9;14811:18;14798:32;14857:18;14849:6;14846:30;14843:2;;;14889:1;14886;14879:12;14843:2;14917:62;14971:7;14962:6;14951:9;14947:22;14917:62;:::i;:::-;14907:72;;14769:220;14213:783;;;;;;;:::o;15002:694::-;15086:6;15094;15102;15110;15159:3;15147:9;15138:7;15134:23;15130:33;15127:2;;;15176:1;15173;15166:12;15127:2;15219:1;15244:52;15288:7;15279:6;15268:9;15264:22;15244:52;:::i;:::-;15234:62;;15190:116;15345:2;15371:52;15415:7;15406:6;15395:9;15391:22;15371:52;:::i;:::-;15361:62;;15316:117;15472:2;15498:53;15543:7;15534:6;15523:9;15519:22;15498:53;:::i;:::-;15488:63;;15443:118;15600:2;15626:53;15671:7;15662:6;15651:9;15647:22;15626:53;:::i;:::-;15616:63;;15571:118;15117:579;;;;;;;:::o;15702:825::-;15797:6;15805;15813;15821;15829;15878:3;15866:9;15857:7;15853:23;15849:33;15846:2;;;15895:1;15892;15885:12;15846:2;15938:1;15963:52;16007:7;15998:6;15987:9;15983:22;15963:52;:::i;:::-;15953:62;;15909:116;16064:2;16090:52;16134:7;16125:6;16114:9;16110:22;16090:52;:::i;:::-;16080:62;;16035:117;16191:2;16217:53;16262:7;16253:6;16242:9;16238:22;16217:53;:::i;:::-;16207:63;;16162:118;16347:2;16336:9;16332:18;16319:32;16378:18;16370:6;16367:30;16364:2;;;16410:1;16407;16400:12;16364:2;16446:64;16502:7;16493:6;16482:9;16478:22;16446:64;:::i;:::-;16428:82;;;;16290:230;15836:691;;;;;;;;:::o;16533:262::-;16592:6;16641:2;16629:9;16620:7;16616:23;16612:32;16609:2;;;16657:1;16654;16647:12;16609:2;16700:1;16725:53;16770:7;16761:6;16750:9;16746:22;16725:53;:::i;:::-;16715:63;;16671:117;16599:196;;;;:::o;16801:282::-;16870:6;16919:2;16907:9;16898:7;16894:23;16890:32;16887:2;;;16935:1;16932;16925:12;16887:2;16978:1;17003:63;17058:7;17049:6;17038:9;17034:22;17003:63;:::i;:::-;16993:73;;16949:127;16877:206;;;;:::o;17089:142::-;17192:32;17218:5;17192:32;:::i;:::-;17187:3;17180:45;17170:61;;:::o;17237:118::-;17324:24;17342:5;17324:24;:::i;:::-;17319:3;17312:37;17302:53;;:::o;17361:109::-;17442:21;17457:5;17442:21;:::i;:::-;17437:3;17430:34;17420:50;;:::o;17476:118::-;17563:24;17581:5;17563:24;:::i;:::-;17558:3;17551:37;17541:53;;:::o;17622:301::-;17718:3;17739:70;17802:6;17797:3;17739:70;:::i;:::-;17732:77;;17819:43;17855:6;17850:3;17843:5;17819:43;:::i;:::-;17887:29;17909:6;17887:29;:::i;:::-;17882:3;17878:39;17871:46;;17722:201;;;;;:::o;17951:314::-;18065:3;18086:88;18167:6;18162:3;18086:88;:::i;:::-;18079:95;;18184:43;18220:6;18215:3;18208:5;18184:43;:::i;:::-;18252:6;18247:3;18243:16;18236:23;;18069:196;;;;;:::o;18271:360::-;18357:3;18385:38;18417:5;18385:38;:::i;:::-;18439:70;18502:6;18497:3;18439:70;:::i;:::-;18432:77;;18518:52;18563:6;18558:3;18551:4;18544:5;18540:16;18518:52;:::i;:::-;18595:29;18617:6;18595:29;:::i;:::-;18590:3;18586:39;18579:46;;18361:270;;;;;:::o;18637:373::-;18741:3;18769:38;18801:5;18769:38;:::i;:::-;18823:88;18904:6;18899:3;18823:88;:::i;:::-;18816:95;;18920:52;18965:6;18960:3;18953:4;18946:5;18942:16;18920:52;:::i;:::-;18997:6;18992:3;18988:16;18981:23;;18745:265;;;;;:::o;19038:798::-;19121:3;19158:5;19152:12;19187:36;19213:9;19187:36;:::i;:::-;19239:70;19302:6;19297:3;19239:70;:::i;:::-;19232:77;;19340:1;19329:9;19325:17;19356:1;19351:135;;;;19500:1;19495:335;;;;19318:512;;19351:135;19435:4;19431:9;19420;19416:25;19411:3;19404:38;19471:4;19466:3;19462:14;19455:21;;19351:135;;19495:335;19562:37;19593:5;19562:37;:::i;:::-;19621:1;19635:154;19649:6;19646:1;19643:13;19635:154;;;19723:7;19717:14;19713:1;19708:3;19704:11;19697:35;19773:1;19764:7;19760:15;19749:26;;19671:4;19668:1;19664:12;19659:17;;19635:154;;;19818:1;19813:3;19809:11;19802:18;;19502:328;;19318:512;;19125:711;;;;;;:::o;19864:841::-;19965:3;20002:5;19996:12;20031:36;20057:9;20031:36;:::i;:::-;20083:88;20164:6;20159:3;20083:88;:::i;:::-;20076:95;;20202:1;20191:9;20187:17;20218:1;20213:137;;;;20364:1;20359:340;;;;20180:519;;20213:137;20297:4;20293:9;20282;20278:25;20273:3;20266:38;20333:6;20328:3;20324:16;20317:23;;20213:137;;20359:340;20426:37;20457:5;20426:37;:::i;:::-;20485:1;20499:154;20513:6;20510:1;20507:13;20499:154;;;20587:7;20581:14;20577:1;20572:3;20568:11;20561:35;20637:1;20628:7;20624:15;20613:26;;20535:4;20532:1;20528:12;20523:17;;20499:154;;;20682:6;20677:3;20673:16;20666:23;;20366:333;;20180:519;;19969:736;;;;;;:::o;20711:364::-;20799:3;20827:39;20860:5;20827:39;:::i;:::-;20882:71;20946:6;20941:3;20882:71;:::i;:::-;20875:78;;20962:52;21007:6;21002:3;20995:4;20988:5;20984:16;20962:52;:::i;:::-;21039:29;21061:6;21039:29;:::i;:::-;21034:3;21030:39;21023:46;;20803:272;;;;;:::o;21081:377::-;21187:3;21215:39;21248:5;21215:39;:::i;:::-;21270:89;21352:6;21347:3;21270:89;:::i;:::-;21263:96;;21368:52;21413:6;21408:3;21401:4;21394:5;21390:16;21368:52;:::i;:::-;21445:6;21440:3;21436:16;21429:23;;21191:267;;;;;:::o;21464:366::-;21606:3;21627:67;21691:2;21686:3;21627:67;:::i;:::-;21620:74;;21703:93;21792:3;21703:93;:::i;:::-;21821:2;21816:3;21812:12;21805:19;;21610:220;;;:::o;21836:366::-;21978:3;21999:67;22063:2;22058:3;21999:67;:::i;:::-;21992:74;;22075:93;22164:3;22075:93;:::i;:::-;22193:2;22188:3;22184:12;22177:19;;21982:220;;;:::o;22208:366::-;22350:3;22371:67;22435:2;22430:3;22371:67;:::i;:::-;22364:74;;22447:93;22536:3;22447:93;:::i;:::-;22565:2;22560:3;22556:12;22549:19;;22354:220;;;:::o;22580:366::-;22722:3;22743:67;22807:2;22802:3;22743:67;:::i;:::-;22736:74;;22819:93;22908:3;22819:93;:::i;:::-;22937:2;22932:3;22928:12;22921:19;;22726:220;;;:::o;22952:366::-;23094:3;23115:67;23179:2;23174:3;23115:67;:::i;:::-;23108:74;;23191:93;23280:3;23191:93;:::i;:::-;23309:2;23304:3;23300:12;23293:19;;23098:220;;;:::o;23324:366::-;23466:3;23487:67;23551:2;23546:3;23487:67;:::i;:::-;23480:74;;23563:93;23652:3;23563:93;:::i;:::-;23681:2;23676:3;23672:12;23665:19;;23470:220;;;:::o;23696:366::-;23838:3;23859:67;23923:2;23918:3;23859:67;:::i;:::-;23852:74;;23935:93;24024:3;23935:93;:::i;:::-;24053:2;24048:3;24044:12;24037:19;;23842:220;;;:::o;24068:366::-;24210:3;24231:67;24295:2;24290:3;24231:67;:::i;:::-;24224:74;;24307:93;24396:3;24307:93;:::i;:::-;24425:2;24420:3;24416:12;24409:19;;24214:220;;;:::o;24440:366::-;24582:3;24603:67;24667:2;24662:3;24603:67;:::i;:::-;24596:74;;24679:93;24768:3;24679:93;:::i;:::-;24797:2;24792:3;24788:12;24781:19;;24586:220;;;:::o;24812:366::-;24954:3;24975:67;25039:2;25034:3;24975:67;:::i;:::-;24968:74;;25051:93;25140:3;25051:93;:::i;:::-;25169:2;25164:3;25160:12;25153:19;;24958:220;;;:::o;25184:366::-;25326:3;25347:67;25411:2;25406:3;25347:67;:::i;:::-;25340:74;;25423:93;25512:3;25423:93;:::i;:::-;25541:2;25536:3;25532:12;25525:19;;25330:220;;;:::o;25556:366::-;25698:3;25719:67;25783:2;25778:3;25719:67;:::i;:::-;25712:74;;25795:93;25884:3;25795:93;:::i;:::-;25913:2;25908:3;25904:12;25897:19;;25702:220;;;:::o;25928:366::-;26070:3;26091:67;26155:2;26150:3;26091:67;:::i;:::-;26084:74;;26167:93;26256:3;26167:93;:::i;:::-;26285:2;26280:3;26276:12;26269:19;;26074:220;;;:::o;26300:366::-;26442:3;26463:67;26527:2;26522:3;26463:67;:::i;:::-;26456:74;;26539:93;26628:3;26539:93;:::i;:::-;26657:2;26652:3;26648:12;26641:19;;26446:220;;;:::o;26672:366::-;26814:3;26835:67;26899:2;26894:3;26835:67;:::i;:::-;26828:74;;26911:93;27000:3;26911:93;:::i;:::-;27029:2;27024:3;27020:12;27013:19;;26818:220;;;:::o;27044:366::-;27186:3;27207:67;27271:2;27266:3;27207:67;:::i;:::-;27200:74;;27283:93;27372:3;27283:93;:::i;:::-;27401:2;27396:3;27392:12;27385:19;;27190:220;;;:::o;27416:366::-;27558:3;27579:67;27643:2;27638:3;27579:67;:::i;:::-;27572:74;;27655:93;27744:3;27655:93;:::i;:::-;27773:2;27768:3;27764:12;27757:19;;27562:220;;;:::o;27788:366::-;27930:3;27951:67;28015:2;28010:3;27951:67;:::i;:::-;27944:74;;28027:93;28116:3;28027:93;:::i;:::-;28145:2;28140:3;28136:12;28129:19;;27934:220;;;:::o;28160:366::-;28302:3;28323:67;28387:2;28382:3;28323:67;:::i;:::-;28316:74;;28399:93;28488:3;28399:93;:::i;:::-;28517:2;28512:3;28508:12;28501:19;;28306:220;;;:::o;28532:366::-;28674:3;28695:67;28759:2;28754:3;28695:67;:::i;:::-;28688:74;;28771:93;28860:3;28771:93;:::i;:::-;28889:2;28884:3;28880:12;28873:19;;28678:220;;;:::o;28904:366::-;29046:3;29067:67;29131:2;29126:3;29067:67;:::i;:::-;29060:74;;29143:93;29232:3;29143:93;:::i;:::-;29261:2;29256:3;29252:12;29245:19;;29050:220;;;:::o;29276:366::-;29418:3;29439:67;29503:2;29498:3;29439:67;:::i;:::-;29432:74;;29515:93;29604:3;29515:93;:::i;:::-;29633:2;29628:3;29624:12;29617:19;;29422:220;;;:::o;29648:366::-;29790:3;29811:67;29875:2;29870:3;29811:67;:::i;:::-;29804:74;;29887:93;29976:3;29887:93;:::i;:::-;30005:2;30000:3;29996:12;29989:19;;29794:220;;;:::o;30020:366::-;30162:3;30183:67;30247:2;30242:3;30183:67;:::i;:::-;30176:74;;30259:93;30348:3;30259:93;:::i;:::-;30377:2;30372:3;30368:12;30361:19;;30166:220;;;:::o;30392:115::-;30477:23;30494:5;30477:23;:::i;:::-;30472:3;30465:36;30455:52;;:::o;30513:118::-;30600:24;30618:5;30600:24;:::i;:::-;30595:3;30588:37;30578:53;;:::o;30637:115::-;30722:23;30739:5;30722:23;:::i;:::-;30717:3;30710:36;30700:52;;:::o;30758:291::-;30898:3;30920:103;31019:3;31010:6;31002;30920:103;:::i;:::-;30913:110;;31040:3;31033:10;;30902:147;;;;;:::o;31055:271::-;31185:3;31207:93;31296:3;31287:6;31207:93;:::i;:::-;31200:100;;31317:3;31310:10;;31189:137;;;;:::o;31332:265::-;31459:3;31481:90;31567:3;31558:6;31481:90;:::i;:::-;31474:97;;31588:3;31581:10;;31463:134;;;;:::o;31603:435::-;31783:3;31805:95;31896:3;31887:6;31805:95;:::i;:::-;31798:102;;31917:95;32008:3;31999:6;31917:95;:::i;:::-;31910:102;;32029:3;32022:10;;31787:251;;;;;:::o;32044:222::-;32137:4;32175:2;32164:9;32160:18;32152:26;;32188:71;32256:1;32245:9;32241:17;32232:6;32188:71;:::i;:::-;32142:124;;;;:::o;32272:640::-;32467:4;32505:3;32494:9;32490:19;32482:27;;32519:71;32587:1;32576:9;32572:17;32563:6;32519:71;:::i;:::-;32600:72;32668:2;32657:9;32653:18;32644:6;32600:72;:::i;:::-;32682;32750:2;32739:9;32735:18;32726:6;32682:72;:::i;:::-;32801:9;32795:4;32791:20;32786:2;32775:9;32771:18;32764:48;32829:76;32900:4;32891:6;32829:76;:::i;:::-;32821:84;;32472:440;;;;;;;:::o;32918:210::-;33005:4;33043:2;33032:9;33028:18;33020:26;;33056:65;33118:1;33107:9;33103:17;33094:6;33056:65;:::i;:::-;33010:118;;;;:::o;33134:222::-;33227:4;33265:2;33254:9;33250:18;33242:26;;33278:71;33346:1;33335:9;33331:17;33322:6;33278:71;:::i;:::-;33232:124;;;;:::o;33362:309::-;33473:4;33511:2;33500:9;33496:18;33488:26;;33560:9;33554:4;33550:20;33546:1;33535:9;33531:17;33524:47;33588:76;33659:4;33650:6;33588:76;:::i;:::-;33580:84;;33478:193;;;;:::o;33677:419::-;33816:4;33854:2;33843:9;33839:18;33831:26;;33903:9;33897:4;33893:20;33889:1;33878:9;33874:17;33867:47;33931:76;34002:4;33993:6;33931:76;:::i;:::-;33923:84;;34017:72;34085:2;34074:9;34070:18;34061:6;34017:72;:::i;:::-;33821:275;;;;;:::o;34102:313::-;34215:4;34253:2;34242:9;34238:18;34230:26;;34302:9;34296:4;34292:20;34288:1;34277:9;34273:17;34266:47;34330:78;34403:4;34394:6;34330:78;:::i;:::-;34322:86;;34220:195;;;;:::o;34421:419::-;34587:4;34625:2;34614:9;34610:18;34602:26;;34674:9;34668:4;34664:20;34660:1;34649:9;34645:17;34638:47;34702:131;34828:4;34702:131;:::i;:::-;34694:139;;34592:248;;;:::o;34846:419::-;35012:4;35050:2;35039:9;35035:18;35027:26;;35099:9;35093:4;35089:20;35085:1;35074:9;35070:17;35063:47;35127:131;35253:4;35127:131;:::i;:::-;35119:139;;35017:248;;;:::o;35271:419::-;35437:4;35475:2;35464:9;35460:18;35452:26;;35524:9;35518:4;35514:20;35510:1;35499:9;35495:17;35488:47;35552:131;35678:4;35552:131;:::i;:::-;35544:139;;35442:248;;;:::o;35696:419::-;35862:4;35900:2;35889:9;35885:18;35877:26;;35949:9;35943:4;35939:20;35935:1;35924:9;35920:17;35913:47;35977:131;36103:4;35977:131;:::i;:::-;35969:139;;35867:248;;;:::o;36121:419::-;36287:4;36325:2;36314:9;36310:18;36302:26;;36374:9;36368:4;36364:20;36360:1;36349:9;36345:17;36338:47;36402:131;36528:4;36402:131;:::i;:::-;36394:139;;36292:248;;;:::o;36546:419::-;36712:4;36750:2;36739:9;36735:18;36727:26;;36799:9;36793:4;36789:20;36785:1;36774:9;36770:17;36763:47;36827:131;36953:4;36827:131;:::i;:::-;36819:139;;36717:248;;;:::o;36971:419::-;37137:4;37175:2;37164:9;37160:18;37152:26;;37224:9;37218:4;37214:20;37210:1;37199:9;37195:17;37188:47;37252:131;37378:4;37252:131;:::i;:::-;37244:139;;37142:248;;;:::o;37396:419::-;37562:4;37600:2;37589:9;37585:18;37577:26;;37649:9;37643:4;37639:20;37635:1;37624:9;37620:17;37613:47;37677:131;37803:4;37677:131;:::i;:::-;37669:139;;37567:248;;;:::o;37821:419::-;37987:4;38025:2;38014:9;38010:18;38002:26;;38074:9;38068:4;38064:20;38060:1;38049:9;38045:17;38038:47;38102:131;38228:4;38102:131;:::i;:::-;38094:139;;37992:248;;;:::o;38246:419::-;38412:4;38450:2;38439:9;38435:18;38427:26;;38499:9;38493:4;38489:20;38485:1;38474:9;38470:17;38463:47;38527:131;38653:4;38527:131;:::i;:::-;38519:139;;38417:248;;;:::o;38671:419::-;38837:4;38875:2;38864:9;38860:18;38852:26;;38924:9;38918:4;38914:20;38910:1;38899:9;38895:17;38888:47;38952:131;39078:4;38952:131;:::i;:::-;38944:139;;38842:248;;;:::o;39096:419::-;39262:4;39300:2;39289:9;39285:18;39277:26;;39349:9;39343:4;39339:20;39335:1;39324:9;39320:17;39313:47;39377:131;39503:4;39377:131;:::i;:::-;39369:139;;39267:248;;;:::o;39521:419::-;39687:4;39725:2;39714:9;39710:18;39702:26;;39774:9;39768:4;39764:20;39760:1;39749:9;39745:17;39738:47;39802:131;39928:4;39802:131;:::i;:::-;39794:139;;39692:248;;;:::o;39946:419::-;40112:4;40150:2;40139:9;40135:18;40127:26;;40199:9;40193:4;40189:20;40185:1;40174:9;40170:17;40163:47;40227:131;40353:4;40227:131;:::i;:::-;40219:139;;40117:248;;;:::o;40371:419::-;40537:4;40575:2;40564:9;40560:18;40552:26;;40624:9;40618:4;40614:20;40610:1;40599:9;40595:17;40588:47;40652:131;40778:4;40652:131;:::i;:::-;40644:139;;40542:248;;;:::o;40796:419::-;40962:4;41000:2;40989:9;40985:18;40977:26;;41049:9;41043:4;41039:20;41035:1;41024:9;41020:17;41013:47;41077:131;41203:4;41077:131;:::i;:::-;41069:139;;40967:248;;;:::o;41221:419::-;41387:4;41425:2;41414:9;41410:18;41402:26;;41474:9;41468:4;41464:20;41460:1;41449:9;41445:17;41438:47;41502:131;41628:4;41502:131;:::i;:::-;41494:139;;41392:248;;;:::o;41646:419::-;41812:4;41850:2;41839:9;41835:18;41827:26;;41899:9;41893:4;41889:20;41885:1;41874:9;41870:17;41863:47;41927:131;42053:4;41927:131;:::i;:::-;41919:139;;41817:248;;;:::o;42071:419::-;42237:4;42275:2;42264:9;42260:18;42252:26;;42324:9;42318:4;42314:20;42310:1;42299:9;42295:17;42288:47;42352:131;42478:4;42352:131;:::i;:::-;42344:139;;42242:248;;;:::o;42496:419::-;42662:4;42700:2;42689:9;42685:18;42677:26;;42749:9;42743:4;42739:20;42735:1;42724:9;42720:17;42713:47;42777:131;42903:4;42777:131;:::i;:::-;42769:139;;42667:248;;;:::o;42921:419::-;43087:4;43125:2;43114:9;43110:18;43102:26;;43174:9;43168:4;43164:20;43160:1;43149:9;43145:17;43138:47;43202:131;43328:4;43202:131;:::i;:::-;43194:139;;43092:248;;;:::o;43346:419::-;43512:4;43550:2;43539:9;43535:18;43527:26;;43599:9;43593:4;43589:20;43585:1;43574:9;43570:17;43563:47;43627:131;43753:4;43627:131;:::i;:::-;43619:139;;43517:248;;;:::o;43771:419::-;43937:4;43975:2;43964:9;43960:18;43952:26;;44024:9;44018:4;44014:20;44010:1;43999:9;43995:17;43988:47;44052:131;44178:4;44052:131;:::i;:::-;44044:139;;43942:248;;;:::o;44196:419::-;44362:4;44400:2;44389:9;44385:18;44377:26;;44449:9;44443:4;44439:20;44435:1;44424:9;44420:17;44413:47;44477:131;44603:4;44477:131;:::i;:::-;44469:139;;44367:248;;;:::o;44621:218::-;44712:4;44750:2;44739:9;44735:18;44727:26;;44763:69;44829:1;44818:9;44814:17;44805:6;44763:69;:::i;:::-;44717:122;;;;:::o;44845:328::-;44964:4;45002:2;44991:9;44987:18;44979:26;;45015:69;45081:1;45070:9;45066:17;45057:6;45015:69;:::i;:::-;45094:72;45162:2;45151:9;45147:18;45138:6;45094:72;:::i;:::-;44969:204;;;;;:::o;45179:545::-;45352:4;45390:3;45379:9;45375:19;45367:27;;45404:69;45470:1;45459:9;45455:17;45446:6;45404:69;:::i;:::-;45483:72;45551:2;45540:9;45536:18;45527:6;45483:72;:::i;:::-;45565;45633:2;45622:9;45618:18;45609:6;45565:72;:::i;:::-;45647:70;45713:2;45702:9;45698:18;45689:6;45647:70;:::i;:::-;45357:367;;;;;;;:::o;45730:435::-;45877:4;45915:2;45904:9;45900:18;45892:26;;45928:69;45994:1;45983:9;45979:17;45970:6;45928:69;:::i;:::-;46044:9;46038:4;46034:20;46029:2;46018:9;46014:18;46007:48;46072:86;46153:4;46144:6;46136;46072:86;:::i;:::-;46064:94;;45882:283;;;;;;:::o;46171:739::-;46390:4;46428:3;46417:9;46413:19;46405:27;;46442:69;46508:1;46497:9;46493:17;46484:6;46442:69;:::i;:::-;46558:9;46552:4;46548:20;46543:2;46532:9;46528:18;46521:48;46586:76;46657:4;46648:6;46586:76;:::i;:::-;46578:84;;46672:70;46738:2;46727:9;46723:18;46714:6;46672:70;:::i;:::-;46789:9;46783:4;46779:20;46774:2;46763:9;46759:18;46752:48;46817:86;46898:4;46889:6;46881;46817:86;:::i;:::-;46809:94;;46395:515;;;;;;;;:::o;46916:719::-;47125:4;47163:3;47152:9;47148:19;47140:27;;47177:69;47243:1;47232:9;47228:17;47219:6;47177:69;:::i;:::-;47293:9;47287:4;47283:20;47278:2;47267:9;47263:18;47256:48;47321:76;47392:4;47383:6;47321:76;:::i;:::-;47313:84;;47407:70;47473:2;47462:9;47458:18;47449:6;47407:70;:::i;:::-;47524:9;47518:4;47514:20;47509:2;47498:9;47494:18;47487:48;47552:76;47623:4;47614:6;47552:76;:::i;:::-;47544:84;;47130:505;;;;;;;:::o;47641:1058::-;47939:4;47977:3;47966:9;47962:19;47954:27;;47991:69;48057:1;48046:9;48042:17;48033:6;47991:69;:::i;:::-;48107:9;48101:4;48097:20;48092:2;48081:9;48077:18;48070:48;48135:73;48203:4;48194:6;48135:73;:::i;:::-;48127:81;;48255:9;48249:4;48245:20;48240:2;48229:9;48225:18;48218:48;48283:76;48354:4;48345:6;48283:76;:::i;:::-;48275:84;;48369:88;48453:2;48442:9;48438:18;48429:6;48369:88;:::i;:::-;48467:73;48535:3;48524:9;48520:19;48511:6;48467:73;:::i;:::-;48588:9;48582:4;48578:20;48572:3;48561:9;48557:19;48550:49;48616:76;48687:4;48678:6;48616:76;:::i;:::-;48608:84;;47944:755;;;;;;;;;:::o;48705:545::-;48878:4;48916:3;48905:9;48901:19;48893:27;;48930:69;48996:1;48985:9;48981:17;48972:6;48930:69;:::i;:::-;49009:70;49075:2;49064:9;49060:18;49051:6;49009:70;:::i;:::-;49089:72;49157:2;49146:9;49142:18;49133:6;49089:72;:::i;:::-;49171;49239:2;49228:9;49224:18;49215:6;49171:72;:::i;:::-;48883:367;;;;;;;:::o;49256:652::-;49457:4;49495:3;49484:9;49480:19;49472:27;;49509:69;49575:1;49564:9;49560:17;49551:6;49509:69;:::i;:::-;49588:70;49654:2;49643:9;49639:18;49630:6;49588:70;:::i;:::-;49668:72;49736:2;49725:9;49721:18;49712:6;49668:72;:::i;:::-;49787:9;49781:4;49777:20;49772:2;49761:9;49757:18;49750:48;49815:86;49896:4;49887:6;49879;49815:86;:::i;:::-;49807:94;;49462:446;;;;;;;;:::o;49914:222::-;50007:4;50045:2;50034:9;50030:18;50022:26;;50058:71;50126:1;50115:9;50111:17;50102:6;50058:71;:::i;:::-;50012:124;;;;:::o;50142:328::-;50261:4;50299:2;50288:9;50284:18;50276:26;;50312:71;50380:1;50369:9;50365:17;50356:6;50312:71;:::i;:::-;50393:70;50459:2;50448:9;50444:18;50435:6;50393:70;:::i;:::-;50266:204;;;;;:::o;50476:129::-;50510:6;50537:20;;:::i;:::-;50527:30;;50566:33;50594:4;50586:6;50566:33;:::i;:::-;50517:88;;;:::o;50611:75::-;50644:6;50677:2;50671:9;50661:19;;50651:35;:::o;50692:307::-;50753:4;50843:18;50835:6;50832:30;50829:2;;;50865:18;;:::i;:::-;50829:2;50903:29;50925:6;50903:29;:::i;:::-;50895:37;;50987:4;50981;50977:15;50969:23;;50758:241;;;:::o;51005:308::-;51067:4;51157:18;51149:6;51146:30;51143:2;;;51179:18;;:::i;:::-;51143:2;51217:29;51239:6;51217:29;:::i;:::-;51209:37;;51301:4;51295;51291:15;51283:23;;51072:241;;;:::o;51319:140::-;51367:4;51390:3;51382:11;;51413:3;51410:1;51403:14;51447:4;51444:1;51434:18;51426:26;;51372:87;;;:::o;51465:98::-;51516:6;51550:5;51544:12;51534:22;;51523:40;;;:::o;51569:99::-;51621:6;51655:5;51649:12;51639:22;;51628:40;;;:::o;51674:168::-;51757:11;51791:6;51786:3;51779:19;51831:4;51826:3;51822:14;51807:29;;51769:73;;;;:::o;51848:147::-;51949:11;51986:3;51971:18;;51961:34;;;;:::o;52001:169::-;52085:11;52119:6;52114:3;52107:19;52159:4;52154:3;52150:14;52135:29;;52097:73;;;;:::o;52176:148::-;52278:11;52315:3;52300:18;;52290:34;;;;:::o;52330:305::-;52370:3;52389:20;52407:1;52389:20;:::i;:::-;52384:25;;52423:20;52441:1;52423:20;:::i;:::-;52418:25;;52577:1;52509:66;52505:74;52502:1;52499:81;52496:2;;;52583:18;;:::i;:::-;52496:2;52627:1;52624;52620:9;52613:16;;52374:261;;;;:::o;52641:185::-;52681:1;52698:20;52716:1;52698:20;:::i;:::-;52693:25;;52732:20;52750:1;52732:20;:::i;:::-;52727:25;;52771:1;52761:2;;52776:18;;:::i;:::-;52761:2;52818:1;52815;52811:9;52806:14;;52683:143;;;;:::o;52832:191::-;52872:4;52892:20;52910:1;52892:20;:::i;:::-;52887:25;;52926:20;52944:1;52926:20;:::i;:::-;52921:25;;52965:1;52962;52959:8;52956:2;;;52970:18;;:::i;:::-;52956:2;53015:1;53012;53008:9;53000:17;;52877:146;;;;:::o;53029:96::-;53066:7;53095:24;53113:5;53095:24;:::i;:::-;53084:35;;53074:51;;;:::o;53131:104::-;53176:7;53205:24;53223:5;53205:24;:::i;:::-;53194:35;;53184:51;;;:::o;53241:90::-;53275:7;53318:5;53311:13;53304:21;53293:32;;53283:48;;;:::o;53337:77::-;53374:7;53403:5;53392:16;;53382:32;;;:::o;53420:149::-;53456:7;53496:66;53489:5;53485:78;53474:89;;53464:105;;;:::o;53575:89::-;53611:7;53651:6;53644:5;53640:18;53629:29;;53619:45;;;:::o;53670:126::-;53707:7;53747:42;53740:5;53736:54;53725:65;;53715:81;;;:::o;53802:77::-;53839:7;53868:5;53857:16;;53847:32;;;:::o;53885:101::-;53921:7;53961:18;53954:5;53950:30;53939:41;;53929:57;;;:::o;53992:154::-;54076:6;54071:3;54066;54053:30;54138:1;54129:6;54124:3;54120:16;54113:27;54043:103;;;:::o;54152:307::-;54220:1;54230:113;54244:6;54241:1;54238:13;54230:113;;;54329:1;54324:3;54320:11;54314:18;54310:1;54305:3;54301:11;54294:39;54266:2;54263:1;54259:10;54254:15;;54230:113;;;54361:6;54358:1;54355:13;54352:2;;;54441:1;54432:6;54427:3;54423:16;54416:27;54352:2;54201:258;;;;:::o;54465:320::-;54509:6;54546:1;54540:4;54536:12;54526:22;;54593:1;54587:4;54583:12;54614:18;54604:2;;54670:4;54662:6;54658:17;54648:27;;54604:2;54732;54724:6;54721:14;54701:18;54698:38;54695:2;;;54751:18;;:::i;:::-;54695:2;54516:269;;;;:::o;54791:281::-;54874:27;54896:4;54874:27;:::i;:::-;54866:6;54862:40;55004:6;54992:10;54989:22;54968:18;54956:10;54953:34;54950:62;54947:2;;;55015:18;;:::i;:::-;54947:2;55055:10;55051:2;55044:22;54834:238;;;:::o;55078:233::-;55117:3;55140:24;55158:5;55140:24;:::i;:::-;55131:33;;55186:66;55179:5;55176:77;55173:2;;;55256:18;;:::i;:::-;55173:2;55303:1;55296:5;55292:13;55285:20;;55121:190;;;:::o;55317:176::-;55349:1;55366:20;55384:1;55366:20;:::i;:::-;55361:25;;55400:20;55418:1;55400:20;:::i;:::-;55395:25;;55439:1;55429:2;;55444:18;;:::i;:::-;55429:2;55485:1;55482;55478:9;55473:14;;55351:142;;;;:::o;55499:180::-;55547:77;55544:1;55537:88;55644:4;55641:1;55634:15;55668:4;55665:1;55658:15;55685:180;55733:77;55730:1;55723:88;55830:4;55827:1;55820:15;55854:4;55851:1;55844:15;55871:180;55919:77;55916:1;55909:88;56016:4;56013:1;56006:15;56040:4;56037:1;56030:15;56057:180;56105:77;56102:1;56095:88;56202:4;56199:1;56192:15;56226:4;56223:1;56216:15;56243:102;56284:6;56335:2;56331:7;56326:2;56319:5;56315:14;56311:28;56301:38;;56291:54;;;:::o;56351:237::-;56491:34;56487:1;56479:6;56475:14;56468:58;56560:20;56555:2;56547:6;56543:15;56536:45;56457:131;:::o;56594:225::-;56734:34;56730:1;56722:6;56718:14;56711:58;56803:8;56798:2;56790:6;56786:15;56779:33;56700:119;:::o;56825:224::-;56965:34;56961:1;56953:6;56949:14;56942:58;57034:7;57029:2;57021:6;57017:15;57010:32;56931:118;:::o;57055:178::-;57195:30;57191:1;57183:6;57179:14;57172:54;57161:72;:::o;57239:230::-;57379:34;57375:1;57367:6;57363:14;57356:58;57448:13;57443:2;57435:6;57431:15;57424:38;57345:124;:::o;57475:221::-;57615:34;57611:1;57603:6;57599:14;57592:58;57684:4;57679:2;57671:6;57667:15;57660:29;57581:115;:::o;57702:223::-;57842:34;57838:1;57830:6;57826:14;57819:58;57911:6;57906:2;57898:6;57894:15;57887:31;57808:117;:::o;57931:175::-;58071:27;58067:1;58059:6;58055:14;58048:51;58037:69;:::o;58112:231::-;58252:34;58248:1;58240:6;58236:14;58229:58;58321:14;58316:2;58308:6;58304:15;58297:39;58218:125;:::o;58349:243::-;58489:34;58485:1;58477:6;58473:14;58466:58;58558:26;58553:2;58545:6;58541:15;58534:51;58455:137;:::o;58598:229::-;58738:34;58734:1;58726:6;58722:14;58715:58;58807:12;58802:2;58794:6;58790:15;58783:37;58704:123;:::o;58833:228::-;58973:34;58969:1;58961:6;58957:14;58950:58;59042:11;59037:2;59029:6;59025:15;59018:36;58939:122;:::o;59067:237::-;59207:34;59203:1;59195:6;59191:14;59184:58;59276:20;59271:2;59263:6;59259:15;59252:45;59173:131;:::o;59310:182::-;59450:34;59446:1;59438:6;59434:14;59427:58;59416:76;:::o;59498:177::-;59638:29;59634:1;59626:6;59622:14;59615:53;59604:71;:::o;59681:231::-;59821:34;59817:1;59809:6;59805:14;59798:58;59890:14;59885:2;59877:6;59873:15;59866:39;59787:125;:::o;59918:179::-;60058:31;60054:1;60046:6;60042:14;60035:55;60024:73;:::o;60103:182::-;60243:34;60239:1;60231:6;60227:14;60220:58;60209:76;:::o;60291:234::-;60431:34;60427:1;60419:6;60415:14;60408:58;60500:17;60495:2;60487:6;60483:15;60476:42;60397:128;:::o;60531:173::-;60671:25;60667:1;60659:6;60655:14;60648:49;60637:67;:::o;60710:220::-;60850:34;60846:1;60838:6;60834:14;60827:58;60919:3;60914:2;60906:6;60902:15;60895:28;60816:114;:::o;60936:236::-;61076:34;61072:1;61064:6;61060:14;61053:58;61145:19;61140:2;61132:6;61128:15;61121:44;61042:130;:::o;61178:172::-;61318:24;61314:1;61306:6;61302:14;61295:48;61284:66;:::o;61356:178::-;61496:30;61492:1;61484:6;61480:14;61473:54;61462:72;:::o;61540:122::-;61613:24;61631:5;61613:24;:::i;:::-;61606:5;61603:35;61593:2;;61652:1;61649;61642:12;61593:2;61583:79;:::o;61668:138::-;61749:32;61775:5;61749:32;:::i;:::-;61742:5;61739:43;61729:2;;61796:1;61793;61786:12;61729:2;61719:87;:::o;61812:116::-;61882:21;61897:5;61882:21;:::i;:::-;61875:5;61872:32;61862:2;;61918:1;61915;61908:12;61862:2;61852:76;:::o;61934:120::-;62006:23;62023:5;62006:23;:::i;:::-;61999:5;61996:34;61986:2;;62044:1;62041;62034:12;61986:2;61976:78;:::o;62060:120::-;62132:23;62149:5;62132:23;:::i;:::-;62125:5;62122:34;62112:2;;62170:1;62167;62160:12;62112:2;62102:78;:::o;62186:122::-;62259:24;62277:5;62259:24;:::i;:::-;62252:5;62249:35;62239:2;;62298:1;62295;62288:12;62239:2;62229:79;:::o;62314:120::-;62386:23;62403:5;62386:23;:::i;:::-;62379:5;62376:34;62366:2;;62424:1;62421;62414:12;62366:2;62356:78;:::o
Swarm Source
ipfs://08b089baf84f694369b26223bb76cc72847efe6a2a0e47546b97c6f4fcaa94e8
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.