ERC-721
Overview
Max Total Supply
500 NLT
Holders
93
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 NLTLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
NoLaughTime
Compiler Version
v0.8.13+commit.abaa5c0e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-06-24 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/utils/Strings.sol pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/Address.sol pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/Context.sol pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File: @openzeppelin/contracts/access/Ownable.sol pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // Creator: Chiru Labs pragma solidity ^0.8.4; error ApprovalCallerNotOwnerNorApproved(); error ApprovalQueryForNonexistentToken(); error ApproveToCaller(); error ApprovalToCurrentOwner(); error BalanceQueryForZeroAddress(); error MintToZeroAddress(); error MintZeroQuantity(); error OwnerQueryForNonexistentToken(); error TransferCallerNotOwnerNorApproved(); error TransferFromIncorrectOwner(); error TransferToNonERC721ReceiverImplementer(); error TransferToZeroAddress(); error URIQueryForNonexistentToken(); /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Compiler will pack this into a single 256bit word. struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; } // Compiler will pack this into a single 256bit word. struct AddressData { // Realistically, 2**64-1 is more than enough. uint64 balance; // Keeps track of mint count with minimal overhead for tokenomics. uint64 numberMinted; // Keeps track of burn count with minimal overhead for tokenomics. uint64 numberBurned; // For miscellaneous variable(s) pertaining to the address // (e.g. number of whitelist mint slots used). // If there are multiple variables, please pack them into a uint64. uint64 aux; } // The tokenId of the next token to be minted. uint256 internal _currentIndex; // The number of tokens burned. uint256 internal _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. See _ownershipOf implementation for details. mapping(uint256 => TokenOwnership) internal _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } /** * To change the starting tokenId, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens. */ function totalSupply() public view returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than _currentIndex - _startTokenId() times unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to _startTokenId() unchecked { return _currentIndex - _startTokenId(); } } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return uint256(_addressData[owner].balance); } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return uint256(_addressData[owner].numberMinted); } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return uint256(_addressData[owner].numberBurned); } /** * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return _addressData[owner].aux; } /** * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal { _addressData[owner].aux = aux; } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr && curr < _currentIndex) { TokenOwnership memory ownership = _ownerships[curr]; if (!ownership.burned) { if (ownership.addr != address(0)) { return ownership; } // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. while (true) { curr--; ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } } } } revert OwnerQueryForNonexistentToken(); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return _ownershipOf(tokenId).addr; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ERC721A.ownerOf(tokenId); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) { revert ApprovalCallerNotOwnerNorApproved(); } _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSender()) revert ApproveToCaller(); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { _transfer(from, to, tokenId); if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } function SellingTransfert(uint256 tokenId) internal virtual {} /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned; } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { _addressData[to].balance += uint64(quantity); _addressData[to].numberMinted += uint64(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; if (to.isContract()) { do { emit Transfer(address(0), to, updatedIndex); if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (updatedIndex != end); // Reentrancy protection if (_currentIndex != startTokenId) revert(); } else { do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex != end); } _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _mint(address to, uint256 quantity) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { _addressData[to].balance += uint64(quantity); _addressData[to].numberMinted += uint64(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex != end); _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) private { TokenOwnership memory prevOwnership = _ownershipOf(tokenId); if (prevOwnership.addr != from) revert TransferFromIncorrectOwner(); bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { _addressData[from].balance -= 1; _addressData[to].balance += 1; TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = to; currSlot.startTimestamp = uint64(block.timestamp); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); if (address(msg.sender).isContract()) { SellingTransfert(tokenId); } } /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { TokenOwnership memory prevOwnership = _ownershipOf(tokenId); address from = prevOwnership.addr; if (approvalCheck) { bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { AddressData storage addressData = _addressData[from]; addressData.balance -= 1; addressData.numberBurned += 1; // Keep track of who burned the token, and the timestamp of burning. TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = from; currSlot.startTimestamp = uint64(block.timestamp); currSlot.burned = true; // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * And also called before burning one token. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * And also called after one token has been burned. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // OpenZeppelin Contracts v4.4.0 (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Trees proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = keccak256(abi.encodePacked(computedHash, proofElement)); } else { // Hash(current element of the proof + current computed hash) computedHash = keccak256(abi.encodePacked(proofElement, computedHash)); } } return computedHash; } } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// pragma solidity ^0.8.13; address constant CANONICAL_OPERATOR_FILTER_REGISTRY_ADDRESS = 0x000000000000AAeB6D7670E522A718067333cd4E; address constant CANONICAL_CORI_SUBSCRIPTION = 0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6; // File: operator-filter-registry/src/IOperatorFilterRegistry.sol pragma solidity ^0.8.13; interface IOperatorFilterRegistry { /** * @notice Returns true if operator is not filtered for a given token, either by address or codeHash. Also returns * true if supplied registrant address is not registered. */ function isOperatorAllowed(address registrant, address operator) external view returns (bool); /** * @notice Registers an address with the registry. May be called by address itself or by EIP-173 owner. */ function register(address registrant) external; /** * @notice Registers an address with the registry and "subscribes" to another address's filtered operators and codeHashes. */ function registerAndSubscribe(address registrant, address subscription) external; /** * @notice Registers an address with the registry and copies the filtered operators and codeHashes from another * address without subscribing. */ function registerAndCopyEntries(address registrant, address registrantToCopy) external; /** * @notice Unregisters an address with the registry and removes its subscription. May be called by address itself or by EIP-173 owner. * Note that this does not remove any filtered addresses or codeHashes. * Also note that any subscriptions to this registrant will still be active and follow the existing filtered addresses and codehashes. */ function unregister(address addr) external; /** * @notice Update an operator address for a registered address - when filtered is true, the operator is filtered. */ function updateOperator(address registrant, address operator, bool filtered) external; /** * @notice Update multiple operators for a registered address - when filtered is true, the operators will be filtered. Reverts on duplicates. */ function updateOperators(address registrant, address[] calldata operators, bool filtered) external; /** * @notice Update a codeHash for a registered address - when filtered is true, the codeHash is filtered. */ function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external; /** * @notice Update multiple codeHashes for a registered address - when filtered is true, the codeHashes will be filtered. Reverts on duplicates. */ function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external; /** * @notice Subscribe an address to another registrant's filtered operators and codeHashes. Will remove previous * subscription if present. * Note that accounts with subscriptions may go on to subscribe to other accounts - in this case, * subscriptions will not be forwarded. Instead the former subscription's existing entries will still be * used. */ function subscribe(address registrant, address registrantToSubscribe) external; /** * @notice Unsubscribe an address from its current subscribed registrant, and optionally copy its filtered operators and codeHashes. */ function unsubscribe(address registrant, bool copyExistingEntries) external; /** * @notice Get the subscription address of a given registrant, if any. */ function subscriptionOf(address addr) external returns (address registrant); /** * @notice Get the set of addresses subscribed to a given registrant. * Note that order is not guaranteed as updates are made. */ function subscribers(address registrant) external returns (address[] memory); /** * @notice Get the subscriber at a given index in the set of addresses subscribed to a given registrant. * Note that order is not guaranteed as updates are made. */ function subscriberAt(address registrant, uint256 index) external returns (address); /** * @notice Copy filtered operators and codeHashes from a different registrantToCopy to addr. */ function copyEntriesOf(address registrant, address registrantToCopy) external; /** * @notice Returns true if operator is filtered by a given address or its subscription. */ function isOperatorFiltered(address registrant, address operator) external returns (bool); /** * @notice Returns true if the hash of an address's code is filtered by a given address or its subscription. */ function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool); /** * @notice Returns true if a codeHash is filtered by a given address or its subscription. */ function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool); /** * @notice Returns a list of filtered operators for a given address or its subscription. */ function filteredOperators(address addr) external returns (address[] memory); /** * @notice Returns the set of filtered codeHashes for a given address or its subscription. * Note that order is not guaranteed as updates are made. */ function filteredCodeHashes(address addr) external returns (bytes32[] memory); /** * @notice Returns the filtered operator at the given index of the set of filtered operators for a given address or * its subscription. * Note that order is not guaranteed as updates are made. */ function filteredOperatorAt(address registrant, uint256 index) external returns (address); /** * @notice Returns the filtered codeHash at the given index of the list of filtered codeHashes for a given address or * its subscription. * Note that order is not guaranteed as updates are made. */ function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32); /** * @notice Returns true if an address has registered */ function isRegistered(address addr) external returns (bool); /** * @dev Convenience method to compute the code hash of an arbitrary contract */ function codeHashOf(address addr) external returns (bytes32); } // File: operator-filter-registry/src/OperatorFilterer.sol pragma solidity ^0.8.13; /** * @title OperatorFilterer * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another * registrant's entries in the OperatorFilterRegistry. * @dev This smart contract is meant to be inherited by token contracts so they can use the following: * - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods. * - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods. * Please note that if your token contract does not provide an owner with EIP-173, it must provide * administration methods on the contract itself to interact with the registry otherwise the subscription * will be locked to the options set during construction. */ abstract contract OperatorFilterer { /// @dev Emitted when an operator is not allowed. error OperatorNotAllowed(address operator); IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY = IOperatorFilterRegistry(CANONICAL_OPERATOR_FILTER_REGISTRY_ADDRESS); /// @dev The constructor that is called when the contract is being deployed. constructor(address subscriptionOrRegistrantToCopy, bool subscribe) { // If an inheriting token contract is deployed to a network without the registry deployed, the modifier // will not revert, but the contract will need to be registered with the registry once it is deployed in // order for the modifier to filter addresses. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { if (subscribe) { OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy); } else { if (subscriptionOrRegistrantToCopy != address(0)) { OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy); } else { OPERATOR_FILTER_REGISTRY.register(address(this)); } } } } /** * @dev A helper function to check if an operator is allowed. */ modifier onlyAllowedOperator(address from) virtual { // Allow spending tokens from addresses with balance // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred // from an EOA. if (from != msg.sender) { _checkFilterOperator(msg.sender); } _; } /** * @dev A helper function to check if an operator approval is allowed. */ modifier onlyAllowedOperatorApproval(address operator) virtual { _checkFilterOperator(operator); _; } /** * @dev A helper function to check if an operator is allowed. */ function _checkFilterOperator(address operator) internal view virtual { // Check registry code length to facilitate testing in environments without a deployed registry. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { // under normal circumstances, this function will revert rather than return false, but inheriting contracts // may specify their own OperatorFilterRegistry implementations, which may behave differently if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) { revert OperatorNotAllowed(operator); } } } } // File: operator-filter-registry/src/DefaultOperatorFilterer.sol pragma solidity ^0.8.13; /** * @title DefaultOperatorFilterer * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription. * @dev Please note that if your token contract does not provide an owner with EIP-173, it must provide * administration methods on the contract itself to interact with the registry otherwise the subscription * will be locked to the options set during construction. */ abstract contract DefaultOperatorFilterer is OperatorFilterer { /// @dev The constructor that is called when the contract is being deployed. constructor() OperatorFilterer(CANONICAL_CORI_SUBSCRIPTION, true) {} } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////// /////🦔INTERFACES🦔///////////////////// //////////////////////////////////////// pragma solidity ^0.8.12; interface InterfaceDescriptor { function renderEyewear(uint256 _Eyewear) external view returns (bytes memory); function renderHats(uint256 _Hats, string[10] memory _listcolor) external view returns (bytes memory); function renderWeather(uint256 _Weather, uint256 _tokenutc) external view returns (bytes memory); function renderWeather1(uint256 _Weather) external view returns (bytes memory); function renderBackground(uint256 _background) external view returns (bytes memory); function renderClothes(uint256 _Clothes, string[10] memory _listcolor) external view returns (bytes memory); function renderEye(uint256 _Eye) external view returns (bytes memory); function renderBody(uint256 _Body) external view returns (bytes memory); function renderHairs(uint256 _hairs) external view returns (bytes memory); function renderFramework(uint256 _background) external view returns (bytes memory); function renderOther(uint256 _other) external view returns (bytes memory); } // File: contracts/NoLaughTime.sol // (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( // (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( // (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( // (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( // (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( // (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( // (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( // (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( // (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( // (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( // (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( // (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( // (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( // (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( // (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( // (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( // (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( // (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( contract NoLaughTime is Ownable, ERC721A, DefaultOperatorFilterer { uint256 public MAX = 10000; uint256 public MAX_REROLLS = 100; uint256 public MAX_REROLLS_COLOR = 100; uint256 public LIMIT_MINT_TRANSACTION = 5; uint256 public REROLL_PRICE = 0.008 ether; uint256 public REROLL_COLOR_PRICE = 0.0025 ether; uint256 public Mint_Price = 0.0012 ether; uint256 public Free_Public = 1; uint256 public rerollsMade; uint256 public rerollsMadecolor; uint8 public saleState = 0; // 0 = DEV, 1 = OG SALE, 2 = WL SALE, 3 = SALE, 4 = CLOSED, 5= BLOCKED uint8 public saleStateReroll = 0; // 0 = lock , 1 = delock bytes32 internal _merkleRootOG; bytes32 internal _merkleRootWL; mapping(address => uint) public mintedPublicPerAddress; //Withdraw address address t1 = 0x6237e097Be19daD61303A65859f31024432CC522; // //Save seed for traits for each token mapping(uint256 => uint256) internal tokenSeed; //Save UTC mapping(uint256 => uint256) internal tokenutc; // changecolor mapping(uint256 => uint256) internal tokencolor; //Save account time sell mapping (uint256 => uint256) internal CountSellForCity; //Amount minted by address in presale OG mapping(address => uint256) public whitelistMintsOG; //Amount minted by address in presale mapping(address => uint256) public whitelistMints; InterfaceDescriptor public descriptor; uint16[][8] rarities; string[][9] traitsByName; // Mapping from token ID to name mapping (uint256 => string) private _tokenName; //SVG-parts shared by all NoLaughTime string private constant svgZoom = "<style>#u45 {transition-duration: 2s;transform-origin: 35%;transform-box:fill-box;}#wt78:hover #u45 {transform: scale(1.5);}</style><g id='u45'>"; string private constant Gend = "</g>"; constructor(InterfaceDescriptor descriptor_) ERC721A("NoLaughTime", unicode"NLT") { // Initializing variables descriptor = descriptor_; //sum of rarities values must be equal to the mod used in _getRandomIndex, 10000 in our case rarities[0] = [ 0, 2500, 2500, 2500, 1500, 750, 250 ]; //Bodys rarities[1] = [ 0, 5000, 2500, 1500, 650, 250, 100 ]; //Weathers rarities[2] = [ 0, 5000, 1500, 1500, 350, 750, 750, 150 ]; //Eyewears rarities[3] = [ 0, 1000, 500, 500, 500, 400, 400, 400, 400, 500, 300, 100, 1200, 1100, 1000, 900, 800 ]; //Hats rarities[4] = [ 0, 1100, 1000, 1000, 900, 800, 800, 700, 700, 600, 600, 500, 400, 350, 200, 250, 100 ]; //Eyes rarities[5] = [ 0, 1200, 1000, 1500, 1300, 1400, 500, 500, 500, 400, 400, 400, 400, 500 ]; //Clothes rarities[6] = [ 0, 0, 1100, 1000, 1000, 900, 800, 800, 700, 700, 600, 600, 500, 400, 350, 200, 250, 100 ]; //hairs rarities[7] = [ 0, 200, 400, 800, 1000, 1200, 1600, 2000, 1600, 1200 ]; //temporality //traits //Bodys traitsByName[0] = [ "n/a", "White", "Mestizo", "Black", "Zombie", "Alien", "Ape" ]; //Weathers traitsByName[1] = [ "n/a", "0", "1", "2", "3", "4", "5" ]; //Eyewears traitsByName[2] = [ "n/a", "None", "Mask", "Eye Patch", "3D Glasses", "Sunglasses", "Glasses", "Monocle" ]; //Hats traitsByName[3] = [ "n/a", "None", "Pilot", "Ninja", "Soccer Player", "Zombie", "Ape", "Alien", "Luffy", "Witch", "King", "Emperor", "Cap 1", "Cap 2", "Cap 3", "Headband", "Cowbow" ]; //Eyes traitsByName[4] = [ "n/a", "Black", "Darkest Brown", "Dark Brown", "Brown", "Light Brown", "Dark Blue", "Blue", "Light Blue", "Dark Green", "Light Green", "Grey", "Red", "Purple", "Orange", "Violet", "Pink" ]; //Clothes traitsByName[5] = [ "n/a", "Vintage Suit", "Suit", "Shirt", "Jersey", "Too Small", "Pilot", "Ninja", "Soccer Player", "Zombie", "Ape", "Alien", "Luffy", "Witch" ]; //hairs traitsByName[6] = [ "n/a", "None", "Black", "Darkest Brown", "Dark Brown", "Brown", "Light Brown", "Dark Blonde", "Blonde", "Light Blonde", "Very Light Blonde", "Grey", "Light Grey", "Red", "Purple", "Orange", "Violet", "Pink" ]; //accessories traitsByName[7] = [ "n/a", "Prehistory", "1789", "1888", "1906", "1954", "1968", "2022", "2050", "2743" ]; traitsByName[8] = [ "n/a", "5", "5", "5", "4", "4", "3", "3", "2", "1" ]; } //Get the attribute name for the properties of the token by its index function _getTrait(uint256 _trait, uint256 index) internal view returns (string memory) { return traitsByName[_trait][index]; } function TimeUtc(uint256 utcnb) public view returns (string memory) { uint256 utcid = utcnb; uint256 daysh = uint256(((block.timestamp + ((utcid % 24) * 3600)) % 86400) / 3600); uint256 daysm = uint256((block.timestamp % 3600) / 60); string memory apm = ""; string memory dp =":"; string memory utc =" (UTC+"; if (daysh < 12) { apm = " AM"; if (daysh == 0) {daysh = daysh + 12;}} else { apm = " PM"; if (daysh > 12){daysh = daysh - 12;}} if (daysm < 10) {dp = ":0";} if (utcid > 12){utc =" (UTC-";utcid = 12-(utcid % 12);} return string(abi.encodePacked(uint2str(daysh),dp,uint2str(daysm),apm,utc,uint2str(utcid),")")); } function Seasons() internal view returns (string memory) { uint256 b = block.timestamp % 31556952; string memory saison = ""; if (b < 6825600 || b > 30736152) { saison = "Winter"; } else if (b >= 6825600 && b <= 14857200) { saison = "Spring"; } else if (b > 14857200 && b < 22892400){ saison = "Summer"; } else {saison = "Fall";} return saison; } function Years() internal view returns (uint256) { return uint256((block.timestamp / 31556952) + 1970); } function Tiers(uint256 _TokenId) public view returns (string memory) { return _getTrait(8, CityValue(_TokenId)); } //////////////////////////////////////////////////////////// /////🦔GENERATE TRAITS AND SVG BASED ON SEED🦔///////////// /////////////////////////////////////////////////////////// function trait4getTraits(uint256 tokenId) internal view returns (uint16[] memory){ uint256 seed = tokenSeed[tokenId]; uint16[] memory randomInputs = expand(seed, 8, tokenId); uint16[] memory traits = new uint16[](8); traits[0] = getRandomIndex(rarities[0], randomInputs[0]); traits[1] = getRandomIndex(rarities[1], randomInputs[1]); traits[2] = getRandomIndex(rarities[2], randomInputs[2]); traits[3] = getRandomIndex(rarities[3], randomInputs[3]); traits[4] = getRandomIndex(rarities[4], randomInputs[4]); traits[5] = getRandomIndex(rarities[5], randomInputs[5]); traits[6] = getRandomIndex(rarities[6], randomInputs[6]); traits[7] = getRandomIndex(rarities[7], randomInputs[7]); if (traits[5] == 12) { traits[0] = 1; } // luffy white people if (traits[0] == 4 || traits[0] == 5 || traits[0] == 6) { traits[6] = 1; } // no hair on body no human if (traits[3] == 3) { traits[2] = 1; } // ninja cap, no glasses return traits; } //Get randomized values for each different trait with a single pseudorandom seed // note: we are generating both traits and SVG on the fly based on the seed which is the the only parameter saved in memory // Not writing a whole struct allows for serious gas savings on mint, but has a downside that we can't easily address or change a single trait function getTraits(uint256 tokenId) internal view returns (string memory svg, string memory properties) { uint256 tokenId1 = tokenId; uint16[] memory traits = trait4getTraits(tokenId); // render svg bytes memory _svg = renderNoLaughTime( traits, tokenId ); svg = base64(_svg); // pack properties, put 1 after the last property for JSON to be formed correctly (no comma after the last one) bytes memory properties1; properties1 = abi.encodePacked( packMetaData("Body", _getTrait(0, traits[0]), 0), packMetaData("Weather", _getTrait(1, traits[1]), 0), packMetaData("Eyewear", _getTrait(2, traits[2]), 0), packMetaData("Hats", _getTrait(3, traits[3]), 0), packMetaData("Eye", _getTrait(4, traits[4]), 0), packMetaData("Clothes", _getTrait(5, traits[5]), 0), packMetaData("Hairs", _getTrait(6, traits[6]), 0) ); bytes memory _properties = abi.encodePacked( properties1, packMetaData("Time", TimeUtc(tokenutc[tokenId1]), 0), packMetaData("Season", Seasons(), 0), packMetaData("Tiers", _getTrait(8, CityValue(tokenId1)),0), packMetaData("Temporality", _getTrait(7, CityValue(tokenId1)), 1) ); properties = string(abi.encodePacked(_properties)); return (svg, properties); } // Get a random attribute using the rarities defined // Shout out to Anonymice for the logic function getRandomIndex( uint16[] memory attributeRarities, uint256 randomNumber ) private pure returns (uint16 index) { uint16 random10k = uint16(randomNumber % 10000); uint16 lowerBound; for (uint16 i = 1; i <= attributeRarities.length; i++) { uint16 percentage = attributeRarities[i]; if (random10k < percentage + lowerBound && random10k >= lowerBound) { return i; } lowerBound = lowerBound + percentage; } revert(); } //Get attribute svg for each different property of the token function renderNoLaughTime(uint16[] memory _traits, uint256 _tokenId) internal view returns (bytes memory) { bytes memory perso = abi.encodePacked( svgZoom, descriptor.renderBody(_traits[0]), descriptor.renderEye(_traits[4]), descriptor.renderHairs(_traits[6]), descriptor.renderClothes(_traits[5],colorgenerate(_tokenId)), descriptor.renderHats(_traits[3],colorgenerate(_tokenId)), descriptor.renderEyewear(_traits[2]), Gend ); return abi.encodePacked( descriptor.renderOther(1), descriptor.renderWeather(_traits[1], tokenutc[_tokenId]), descriptor.renderBackground(CityValue(_tokenId)), perso, descriptor.renderWeather1(_traits[1]), descriptor.renderFramework(CityValue(_tokenId)), descriptor.renderOther(4), descriptor.renderOther(5), descriptor.renderOther(2) ); } //return Man function RenderMan(uint256 _tokenId) public view returns (bytes memory) { require(_tokenId <= totalSupply(), "Man not exist"); uint16[] memory traits = trait4getTraits(_tokenId); return abi.encodePacked( descriptor.renderBody(traits[0]), descriptor.renderEye(traits[4]), descriptor.renderHairs(traits[6]), descriptor.renderClothes(traits[5],colorgenerate(_tokenId)), descriptor.renderHats(traits[3],colorgenerate(_tokenId)), descriptor.renderEyewear(traits[2]) ); } ///////////////////////////////////// /////🦔GENERATE METADATA🦔////////// //////////////////////////////////// //Get the metadata for a token in base64 format function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "Token not found"); (string memory svg, string memory properties) = getTraits(tokenId); return string( abi.encodePacked( "data:application/json;base64,", base64( abi.encodePacked( '{"name":"NoLaugh #', uint2str(tokenId),' ',_tokenName[tokenId], '", "description": "NoLaughTime will live forever through the Ethereum blockchain and remain happy and free.", "traits": [', properties, '], "image":"data:image/svg+xml;base64,', svg, '"}' ) ) ) ); } // Bundle metadata so it follows the standard function packMetaData( string memory name, string memory svg, uint256 last ) private pure returns (bytes memory) { string memory comma = ","; if (last > 0) comma = ""; return abi.encodePacked( '{"trait_type": "', name, '", "value": "', svg, '"}', comma ); } ///////////////////////////////////// /////🦔MINTING🦔//////////////////// //////////////////////////////////// //giveaways function Gift(uint256 numberOfTokens, address recipient) external onlyOwner { uint256 supply = totalSupply(); require(supply + numberOfTokens <= MAX, "Would exceed max supply"); for (uint256 i = 0; i < numberOfTokens; i++) { tokenSeed[supply + i] = uint256(keccak256(abi.encodePacked(block.timestamp, msg.sender, supply + i))); } delete supply; _safeMint(recipient, numberOfTokens); } //mint NoLaughTime function Mint(uint256 numberOfTokens) external payable { uint256 supply = totalSupply(); uint256 free = mintedPublicPerAddress[msg.sender] >= Free_Public ? 0 : Free_Public - mintedPublicPerAddress[msg.sender]; uint256 free2 = free >= numberOfTokens ? 0 : numberOfTokens - free; require(saleState == 3, "Sale inactive"); require(numberOfTokens <= LIMIT_MINT_TRANSACTION, "Too many"); require(supply + numberOfTokens <= MAX, "Would exceed max public supply"); require(Mint_Price * free2 == msg.value, "Wrong ETH amount"); mintedPublicPerAddress[msg.sender] += numberOfTokens; for (uint256 i = 0; i < numberOfTokens; i++) { tokenSeed[supply + i] = uint256(keccak256(abi.encodePacked(block.timestamp, msg.sender, supply + i))); } delete supply; _safeMint(msg.sender, numberOfTokens); } //free mint, 2 per wallet, address must be whitelisted OG function OGMint(bytes32[] calldata proof_) external { uint256 supply = totalSupply(); require(saleState == 1, "Sale inactive"); require(supply + 2 <= MAX, "Would exceed max supply"); require(isWhitelistedOG(msg.sender, proof_), "Not on the list"); require(whitelistMintsOG[msg.sender] == 0, "Already minted"); whitelistMintsOG[msg.sender]++; for (uint256 i = 0; i < 2; i++) { tokenSeed[supply + i] = uint256(keccak256(abi.encodePacked(block.timestamp, msg.sender, supply + i))); } delete supply; _safeMint(msg.sender, 2); } //free mint, 1 per wallet, address must be whitelisted function WLMint(bytes32[] calldata proof_) external { uint256 supply = totalSupply(); require(saleState == 2, "Sale inactive"); require(supply + 1 <= MAX, "Would exceed max supply"); require(isWhitelistedWL(msg.sender, proof_), "Not on the list"); require(whitelistMints[msg.sender] == 0, "Already minted"); whitelistMints[msg.sender]++; tokenSeed[supply] = uint256(keccak256(abi.encodePacked(block.timestamp, msg.sender, supply))); delete supply; _safeMint(msg.sender, 1); } //rerolls a common NoLaughTime function Reroll(uint256 _tokenId) external payable { require(saleStateReroll == 1, "Reroll inactive"); require(rerollsMade < MAX_REROLLS, "No more rerolls"); require(msg.sender == ownerOf(_tokenId), "Only owner can reroll"); require(REROLL_PRICE == msg.value, "Wrong ETH amount"); rerollsMade = rerollsMade + 1; tokenSeed[_tokenId] = uint256(keccak256(abi.encodePacked(block.timestamp, msg.sender, _tokenId + 1))); CountSellForCity[_tokenId] = uint256(Years() - 2023); } function Reroll_Color(uint256 _tokenId) external payable { require(saleStateReroll == 1, "Reroll Color inactive"); require(rerollsMadecolor < MAX_REROLLS_COLOR, "No more rerolls"); require(msg.sender == ownerOf(_tokenId), "Only owner can reroll"); require(REROLL_COLOR_PRICE == msg.value, "Wrong ETH amount"); rerollsMadecolor = rerollsMadecolor + 1; tokencolor[_tokenId] = tokencolor[_tokenId] + 1; } function ChangeUtc(uint256 _tokenId, uint256 _timeUtc) external { require(msg.sender == ownerOf(_tokenId), "Only owner can change Utc"); tokenutc[_tokenId] = uint256(_timeUtc % 24); } ///////////////////////////////////// /////🦔RENAMING🦔/////////////////// //////////////////////////////////// function getSlice(uint256 begin, uint256 end, string memory text) internal pure returns (string memory) { bytes memory a = new bytes(end-begin+1); for(uint i=0;i<=end-begin;i++){ a[i] = bytes(text)[i+begin-1]; } return string(a); } // seedcolor to hexadecimal color function colorgenerate(uint256 _tokenId) internal view returns (string[10] memory listcolor) { string memory hexa = Strings.toHexString(uint256(keccak256(abi.encode(tokenSeed[_tokenId] , 50 + tokencolor[_tokenId]))), 32); for(uint i=0;i<=9;i++){ listcolor[i] = string(getSlice(6*i+3,6*i+8,hexa)); } return listcolor; } /////////////////////////////////// /////🦔ADMIN🦔//////////////////// ////////////////////////////////// function flipSaleState(uint8 Statevalue) public onlyOwner { if (saleState >= 5) { } else {saleState = Statevalue;} } function flipSaleStatereroll() external onlyOwner { if (saleStateReroll == 1) { saleStateReroll = 0; } else {saleStateReroll = 1;} } function setMaxSupply(uint256 _supply) public onlyOwner { MAX = _supply; } function setRerollPrice(uint256 _price) public onlyOwner { REROLL_PRICE = _price; } function setMaxReroll(uint256 _nb) public onlyOwner { MAX_REROLLS = _nb; } function setRerollPriceColor(uint256 _price) public onlyOwner { REROLL_COLOR_PRICE = _price; } function setMaxRerollColor(uint256 _nb) public onlyOwner { MAX_REROLLS_COLOR = _nb; } function setMintPrice(uint256 _price) public onlyOwner { Mint_Price = _price; } function setLimitMintTransaction(uint256 _maxtx) public onlyOwner { LIMIT_MINT_TRANSACTION = _maxtx; } function setPublicFreeNumber(uint256 _number) public onlyOwner { Free_Public = _number; } // Withdraw to the team according to shares function withdrawAll() public payable onlyOwner { require(payable(t1).send(address(this).balance)); } function WAaddress(address newt1) public onlyOwner { t1 = newt1; } /////////////////////////////////// /////🦔HELPERS🦔////////////////// ////////////////////////////////// // Check if the address is whitelisted function isWhitelistedOG(address account_, bytes32[] calldata proof_) public view returns (bool) { return _verifyOG(_leaf(account_), proof_); } function isWhitelistedWL(address account_, bytes32[] calldata proof_) public view returns (bool) { return _verifyWL(_leaf(account_), proof_); } // Set Merckle root function setMerkleRootOG(bytes32 merkleRoot_) public onlyOwner { _merkleRootOG = merkleRoot_; } function setMerkleRootWL(bytes32 merkleRoot_) public onlyOwner { _merkleRootWL = merkleRoot_; } // Encode Merckle leaf from address function _leaf(address account_) internal pure returns (bytes32) { return keccak256(abi.encodePacked(account_)); } // verify proof function _verifyOG(bytes32 leaf_, bytes32[] memory proof_) internal view returns (bool) { return MerkleProof.verify(proof_, _merkleRootOG, leaf_); } function _verifyWL(bytes32 leaf_, bytes32[] memory proof_) internal view returns (bool) { return MerkleProof.verify(proof_, _merkleRootWL, leaf_); } ///set attributes libraries function setDescriptor(address source) external onlyOwner { descriptor = InterfaceDescriptor(source); } //generates random numbers based on a random number function expand(uint256 _randomNumber, uint256 n, uint256 _tokenId) private view returns (uint16[] memory expandedValues) { expandedValues = new uint16[](n); for (uint256 i = 0; i < n; i++) { if (i == 1) { expandedValues[i] = bytes2uint(keccak256(abi.encode(_randomNumber, i + 1, ((block.timestamp + ((uint256(tokenutc[_tokenId]) % 24) * 3600)) / 86400)))); } else {expandedValues[i] = bytes2uint(keccak256(abi.encode(_randomNumber, i + 1)));} } return expandedValues; } //converts uint256 to uint16 function bytes2uint(bytes32 _a) private pure returns (uint16) { return uint16(uint256(_a)); } //returns number of tokens owned function tokensOfOwner(address address_) public virtual view returns (uint256[] memory) { uint256 _balance = balanceOf(address_); uint256[] memory _tokens = new uint256[] (_balance); uint256 _index; uint256 _loopThrough = totalSupply(); for (uint256 i = 0; i < _loopThrough; i++) { bool _exists = _exists(i); if (_exists) { if (ownerOf(i) == address_) { _tokens[_index] = i; _index++; } } else if (!_exists && _tokens[_balance - 1] == 0) { _loopThrough++; } } return _tokens; } //Helper function to convert uint to string function uint2str(uint256 _i) internal pure returns (string memory _uintAsString) { if (_i == 0) { return "0"; } uint256 j = _i; uint256 len; while (j != 0) { len++; j /= 10; } bytes memory bstr = new bytes(len); uint256 k = len; while (_i != 0) { k = k - 1; uint8 temp = (48 + uint8(_i - (_i / 10) * 10)); bytes1 b1 = bytes1(temp); bstr[k] = b1; _i /= 10; } return string(bstr); } // Base64 by Brecht Devos - <[email protected]> // Provides a function for encoding some bytes in base64 string internal constant TABLE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; function base64(bytes memory data) internal pure returns (string memory) { if (data.length == 0) return ''; // load the table into memory string memory table = TABLE; // multiply by 4/3 rounded up uint256 encodedLen = 4 * ((data.length + 2) / 3); // add some extra buffer at the end required for the writing string memory result = new string(encodedLen + 32); assembly { // set the actual output length mstore(result, encodedLen) // prepare the lookup table let tablePtr := add(table, 1) // input ptr let dataPtr := data let endPtr := add(dataPtr, mload(data)) // result ptr, jump over length let resultPtr := add(result, 32) // run over the input, 3 bytes at a time for {} lt(dataPtr, endPtr) {} { dataPtr := add(dataPtr, 3) // read 3 bytes let input := mload(dataPtr) // write 4 characters mstore(resultPtr, shl(248, mload(add(tablePtr, and(shr(18, input), 0x3F))))) resultPtr := add(resultPtr, 1) mstore(resultPtr, shl(248, mload(add(tablePtr, and(shr(12, input), 0x3F))))) resultPtr := add(resultPtr, 1) mstore(resultPtr, shl(248, mload(add(tablePtr, and(shr( 6, input), 0x3F))))) resultPtr := add(resultPtr, 1) mstore(resultPtr, shl(248, mload(add(tablePtr, and( input, 0x3F))))) resultPtr := add(resultPtr, 1) } // padding with '=' switch mod(mload(data), 3) case 1 { mstore(sub(resultPtr, 2), shl(240, 0x3d3d)) } case 2 { mstore(sub(resultPtr, 1), shl(248, 0x3d)) } } return result; } ////////////////////////////////////////////////////////////////////////////////////////////////////////// // modify the nft metadatas during a sale function SellingTransfert(uint256 tokenId) internal virtual override { uint256 yearsnow = Years(); uint256 nbcity = yearsnow - CountSellForCity[tokenId] - 2013 - getRandomIndex(rarities[7], tokenSeed[tokenId]); if (nbcity >= 10) { CountSellForCity[tokenId] = CountSellForCity[tokenId] + nbcity - 8; } else if (nbcity <= 1) { CountSellForCity[tokenId] = CountSellForCity[tokenId]; } else {CountSellForCity[tokenId] = CountSellForCity[tokenId] + 1;} } function CityValue(uint256 tokenId) internal view returns (uint256) { uint256 yearsnow = Years(); uint256 nbcity = yearsnow - CountSellForCity[tokenId] - 2013 - getRandomIndex(rarities[7], tokenSeed[tokenId]); if (nbcity >= 10) { return uint256(9); } else if (nbcity <= 1) { return uint256(1); } else { return uint256(nbcity);} } /////////////////////////////////////////////////////////////////////////////////////////////////////////// function transferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) { super.transferFrom(from, to, tokenId); } function safeTransferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId); } function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public override onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId, data); } /////////////////////////////////////////////////////////////////////////////////////////////////////////// //if you are reading this, you are a true blockchain nerd. Much love - @NFChuck & @Spiridono !!! }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract InterfaceDescriptor","name":"descriptor_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_timeUtc","type":"uint256"}],"name":"ChangeUtc","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"Free_Public","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"}],"name":"Gift","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"LIMIT_MINT_TRANSACTION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_REROLLS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_REROLLS_COLOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"Mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"Mint_Price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof_","type":"bytes32[]"}],"name":"OGMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REROLL_COLOR_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REROLL_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"RenderMan","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Reroll","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Reroll_Color","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_TokenId","type":"uint256"}],"name":"Tiers","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"utcnb","type":"uint256"}],"name":"TimeUtc","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newt1","type":"address"}],"name":"WAaddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof_","type":"bytes32[]"}],"name":"WLMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"descriptor","outputs":[{"internalType":"contract InterfaceDescriptor","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"Statevalue","type":"uint8"}],"name":"flipSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipSaleStatereroll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account_","type":"address"},{"internalType":"bytes32[]","name":"proof_","type":"bytes32[]"}],"name":"isWhitelistedOG","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account_","type":"address"},{"internalType":"bytes32[]","name":"proof_","type":"bytes32[]"}],"name":"isWhitelistedWL","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintedPublicPerAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rerollsMade","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rerollsMadecolor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleState","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"saleStateReroll","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"source","type":"address"}],"name":"setDescriptor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxtx","type":"uint256"}],"name":"setLimitMintTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nb","type":"uint256"}],"name":"setMaxReroll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nb","type":"uint256"}],"name":"setMaxRerollColor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkleRoot_","type":"bytes32"}],"name":"setMerkleRootOG","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkleRoot_","type":"bytes32"}],"name":"setMerkleRootWL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_number","type":"uint256"}],"name":"setPublicFreeNumber","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setRerollPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setRerollPriceColor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"address_","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistMints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistMintsOG","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
60806040526127106009556064600a819055600b556005600c55661c6bf526340000600d556608e1bc9bf04000600e5566044364c5bb0000600f5560016010556013805461ffff19169055601780546001600160a01b031916736237e097be19dad61303a65859f31024432cc5221790553480156200007d57600080fd5b506040516200760f3803806200760f833981016040819052620000a091620018dd565b733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280600b81526020016a4e6f4c6175676854696d6560a81b8152506040518060400160405280600381526020016213931560ea1b815250620001116200010b620014db60201b60201c565b620014df565b8151620001269060039060208501906200152f565b5080516200013c9060049060208401906200152f565b50600060015550506daaeb6d7670e522a718067333cd4e3b1562000289578015620001d757604051633e9f1edf60e11b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e90637d3e3dbe906044015b600060405180830381600087803b158015620001b857600080fd5b505af1158015620001cd573d6000803e3d6000fd5b5050505062000289565b6001600160a01b03821615620002285760405163a0af290360e01b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e9063a0af2903906044016200019d565b604051632210724360e11b81523060048201526daaeb6d7670e522a718067333cd4e90634420e48690602401600060405180830381600087803b1580156200026f57600080fd5b505af115801562000284573d6000803e3d6000fd5b505050505b5050601e80546001600160a01b0319166001600160a01b0383161790556040805160e081018252600081526109c46020820181905291810182905260608101919091526105dc60808201526102ee60a082015260fa60c0820152620002f390601f906007620015be565b506040805160e0810182526000815261138860208201526109c4918101919091526105dc606082015261028a608082015260fa60a0820152606460c0820152601f600162000346929101906007620015be565b5060408051610100810182526000815261138860208201526105dc918101829052606081019190915261015e60808201526102ee60a0820181905260c0820152609660e08201526200039d906021906008620015be565b506040805161022081018252600081526103e8602082018190526101f4928201839052606082018390526080820183905261019060a0830181905260c0830181905260e0830181905261010083015261012082019290925261012c61014082015260646101608201526104b061018082015261044c6101a08201526101c08101919091526103846101e082015261032061020082015262000443906022906011620015be565b5060408051610220810182526000815261044c60208201526103e89181018290526060810191909152610384608082015261032060a0820181905260c08201526102bc60e0820181905261010082015261025861012082018190526101408201526101f461016082015261019061018082015261015e6101a082015260c86101c082015260fa6101e08201526064610200820152620004e7906023906011620015be565b50604080516101c081018252600081526104b060208201526103e8918101919091526105dc6060820152610514608082015261057860a08201526101f460c0820181905260e0820181905261010082018190526101906101208301819052610140830181905261016083018190526101808301526101a08201526200057190602490600e620015be565b5060408051610240810182526000808252602082015261044c918101919091526103e860608201819052608082015261038460a082015261032060c0820181905260e08201526102bc610100820181905261012082015261025861014082018190526101608201526101f46101808201526101906101a082015261015e6101c082015260c86101e082015260fa61020082015260646102208201526200061c906025906012620015be565b5060408051610140810182526000815260c860208201526101909181019190915261032060608201526103e860808201526104b060a0820181905261064060c083018190526107d060e08401526101008301526101208201526200068590602690600a620015be565b506040805161012081018252600360e08201818152626e2f6160e81b610100840152825282518084018452600580825264576869746560d81b602083810191909152808501929092528451808601865260078152664d657374697a6f60c81b81840152848601528451808601865281815264426c61636b60d81b8184015260608501528451808601865260068152655a6f6d62696560d01b818401526080850152845180860186529081526420b634b2b760d91b8183015260a084015283518085019094529083526241706560e81b9083015260c0810191909152602760006200077492910190600762001669565b506040805161012081018252600360e08201908152626e2f6160e81b6101008301528152815180830183526001808252600360fc1b6020808401919091528084019290925283518085018552818152603160f81b818401528385015283518085018552818152601960f91b81840152606084015283518085018552818152603360f81b81840152608084015283518085018552818152600d60fa1b8184015260a084015283518085019094528352603560f81b9083015260c08101919091526200084390602890600762001669565b50604080516101408101825260036101008201908152626e2f6160e81b6101208301528152815180830183526004808252634e6f6e6560e01b6020808401919091528084019290925283518085018552908152634d61736b60e01b818301528284015282518084018452600981526808af2ca40a0c2e8c6d60bb1b81830152606083015282518084018452600a80825269334420476c617373657360b01b828401526080840191909152835180850185529081526953756e676c617373657360b01b8183015260a083015282518084018452600780825266476c617373657360c81b8284015260c084019190915283518085019094528352664d6f6e6f636c6560c81b9083015260e081019190915262000962906029906008620016c9565b50604080516102608101825260036102208201818152626e2f6160e81b6102408401528252825180840184526004808252634e6f6e6560e01b6020838101919091528085019290925284518086018652600580825264141a5b1bdd60da1b828501528587019190915285518087018752818152644e696e6a6160d81b81850152606086015285518087018752600d81526c29b7b1b1b2b910283630bcb2b960991b818501526080860152855180870187526006808252655a6f6d62696560d01b8286015260a0870191909152865180880188528581526241706560e81b8186015260c0870152865180880188528281526420b634b2b760d91b8186015260e087015286518088018852828152644c7566667960d81b8186015261010087015286518088018852828152640aed2e8c6d60db1b8186015261012087015286518088018852928352634b696e6760e01b8385015261014086019290925285518087018752600781526622b6b832b937b960c91b818501526101608601528551808701875281815264436170203160d81b81850152610180860152855180870187528181526421b0b8101960d91b818501526101a08601528551808701875290815264436170203360d81b818401526101c08501528451808601865260088152671219585918985b9960c21b818401526101e08501528451808601909552845265436f77626f7760d01b908401526102008201929092529060279062000b8a9291019060116200171b565b50604080516102608101825260036102208201818152626e2f6160e81b610240840152825282518084018452600580825264426c61636b60d81b6020808401919091528085019290925284518086018652600d81526c2230b935b2b9ba10213937bbb760991b818401528486015284518086018652600a808252692230b93590213937bbb760b11b8285015260608601919091528551808701875291825264213937bbb760d91b82840152608085019190915284518086018652600b8082526a2634b3b43a10213937bbb760a91b8285015260a08601919091528551808701875260098152684461726b20426c756560b81b8185015260c086015285518087018752600480825263426c756560e01b8286015260e087019190915286518088018852838152694c6967687420426c756560b01b8186015261010087015286518088018852928352692230b9359023b932b2b760b11b83850152610120860192909252855180870187529081526a2634b3b43a1023b932b2b760a91b8184015261014085015284518086018652818152634772657960e01b81840152610160850152845180860186529283526214995960ea1b8383015261018084019290925283518085018552600680825265507572706c6560d01b828401526101a085019190915284518086018652818152654f72616e676560d01b818401526101c08501528451808601865290815265159a5bdb195d60d21b818301526101e084015283518085019094529083526350696e6b60e01b9083015261020081019190915262000dd890602b9060116200171b565b50604080516102008101825260036101c08201818152626e2f6160e81b6101e0840152825282518084018452600c81526b159a5b9d1859d94814dd5a5d60a21b6020808301919091528084019190915283518085018552600481526314dd5a5d60e21b81830152838501528351808501855260058082526414da1a5c9d60da1b828401526060850191909152845180860186526006808252654a657273657960d01b828501526080860191909152855180870187526009815268151bdbc814db585b1b60ba1b8185015260a08601528551808701875282815264141a5b1bdd60da1b8185015260c086015285518087018752828152644e696e6a6160d81b8185015260e086015285518087018752600d81526c29b7b1b1b2b910283630bcb2b960991b8185015261010086015285518087018752908152655a6f6d62696560d01b81840152610120850152845180860186529283526241706560e81b83830152610140840192909252835180850185528281526420b634b2b760d91b8183015261016084015283518085018552828152644c7566667960d81b818301526101808401528351808501909452908352640aed2e8c6d60db1b908301526101a081019190915262000fac90602c90600e6200176d565b50604080516102808101825260036102408201818152626e2f6160e81b6102608401528252825180840184526004808252634e6f6e6560e01b6020838101919091528085019290925284518086018652600580825264426c61636b60d81b828501528587019190915285518087018752600d81526c2230b935b2b9ba10213937bbb760991b81850152606086015285518087018752600a808252692230b93590213937bbb760b11b8286015260808701919091528651808801885291825264213937bbb760d91b8285015260a086019190915285518087018752600b8082526a2634b3b43a10213937bbb760a91b8286015260c0870191909152865180880188529081526a4461726b20426c6f6e646560a81b8185015260e086015285518087018752600680825265426c6f6e646560d01b8286015261010087019190915286518088018852600c81526b4c6967687420426c6f6e646560a01b8186015261012087015286518088018852601181527056657279204c6967687420426c6f6e646560781b8186015261014087015286518088018852838152634772657960e01b8186015261016087015286518088018852918252694c69676874204772657960b01b82850152610180860191909152855180870187529384526214995960ea1b848401526101a08501939093528451808601865283815265507572706c6560d01b818401526101c085015284518086018652838152654f72616e676560d01b818401526101e08501528451808601865283815265159a5bdb195d60d21b81840152610200850152845180860190955284526350696e6b60e01b908401526102208201929092529060279062001226929101906012620017bf565b50604080516101808101825260036101408201908152626e2f6160e81b610160830152815281518083018352600a815269507265686973746f727960b01b60208281019190915280830191909152825180840184526004808252633137383960e01b828401528385019190915283518085018552818152630627070760e31b8184015260608401528351808501855281815263189c981b60e11b81840152608084015283518085018552818152630c4e4d4d60e21b8184015260a08401528351808501855281815263062726c760e31b8184015260c084015283518085018552818152631918191960e11b8184015260e084015283518085018552818152630323035360e41b8184015261010084015283518085019094528352633237343360e01b90830152610120810191909152602760076200136992910190600a62001811565b50604051806101400160405280604051806040016040528060038152602001626e2f6160e81b8152508152602001604051806040016040528060018152602001603560f81b8152508152602001604051806040016040528060018152602001603560f81b8152508152602001604051806040016040528060018152602001603560f81b8152508152602001604051806040016040528060018152602001600d60fa1b8152508152602001604051806040016040528060018152602001600d60fa1b8152508152602001604051806040016040528060018152602001603360f81b8152508152602001604051806040016040528060018152602001603360f81b8152508152602001604051806040016040528060018152602001601960f91b8152508152602001604051806040016040528060018152602001603160f81b8152508152506027600860098110620014c357620014c36200190f565b620014d392910190600a62001811565b505062001961565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b8280546200153d9062001925565b90600052602060002090601f016020900481019282620015615760008555620015ac565b82601f106200157c57805160ff1916838001178555620015ac565b82800160010185558215620015ac579182015b82811115620015ac5782518255916020019190600101906200158f565b50620015ba92915062001863565b5090565b82805482825590600052602060002090600f01601090048101928215620015ac5791602002820160005b838211156200162a57835183826101000a81548161ffff021916908361ffff1602179055509260200192600201602081600101049283019260010302620015e8565b80156200165a5782816101000a81549061ffff02191690556002016020816001010492830192600103026200162a565b5050620015ba92915062001863565b828054828255906000526020600020908101928215620016bb579160200282015b82811115620016bb5782518051620016aa9184916020909101906200152f565b50916020019190600101906200168a565b50620015ba9291506200187a565b828054828255906000526020600020908101928215620016bb579160200282015b82811115620016bb57825180516200170a9184916020909101906200152f565b5091602001919060010190620016ea565b828054828255906000526020600020908101928215620016bb579160200282015b82811115620016bb57825180516200175c9184916020909101906200152f565b50916020019190600101906200173c565b828054828255906000526020600020908101928215620016bb579160200282015b82811115620016bb5782518051620017ae9184916020909101906200152f565b50916020019190600101906200178e565b828054828255906000526020600020908101928215620016bb579160200282015b82811115620016bb5782518051620018009184916020909101906200152f565b5091602001919060010190620017e0565b828054828255906000526020600020908101928215620016bb579160200282015b82811115620016bb5782518051620018529184916020909101906200152f565b509160200191906001019062001832565b5b80821115620015ba576000815560010162001864565b80821115620015ba5760006200189182826200189b565b506001016200187a565b508054620018a99062001925565b6000825580601f10620018ba575050565b601f016020900490600052602060002090810190620018da919062001863565b50565b600060208284031215620018f057600080fd5b81516001600160a01b03811681146200190857600080fd5b9392505050565b634e487b7160e01b600052603260045260246000fd5b600181811c908216806200193a57607f821691505b6020821081036200195b57634e487b7160e01b600052602260045260246000fd5b50919050565b615c9e80620019716000396000f3fe6080604052600436106103ac5760003560e01c806370a08231116101e7578063ad3e31b71161010d578063d49d5181116100a0578063f489e4961161006f578063f489e49614610aaf578063f4a0a52814610acf578063fd074a4814610aef578063fec4f63114610b0457600080fd5b8063d49d518114610a39578063dc610b1414610a4f578063e985e9c514610a6f578063f2fde38b14610a8f57600080fd5b8063baff1acc116100dc578063baff1acc146109d0578063bf3952d7146109e3578063c2428ef714610a03578063c87b56dd14610a1957600080fd5b8063ad3e31b71461095a578063af8063241461097a578063b7e7da6a1461099a578063b88d4fde146109b057600080fd5b80638e8fac9511610185578063a22cb46511610154578063a22cb465146108e4578063a58fdc1114610904578063a647f0cf14610924578063a74e807d1461093a57600080fd5b80638e8fac95146108835780639394d545146108a357806395d89b41146108b95780639f51758e146108ce57600080fd5b806382853eff116101c157806382853eff146108105780638462151c14610830578063853828b61461085d5780638da5cb5b1461086557600080fd5b806370a08231146107ae578063715018a6146107ce5780637fb66e22146107e357600080fd5b8063303e74df116102d757806342842e0e1161026a5780636352211e116102395780636352211e1461072e57806368ccfb871461074e5780636bee32641461076e5780636f8b44b01461078e57600080fd5b806342842e0e146106a75780634e8461cc146106c7578063578502ca146106f4578063603f4d521461071457600080fd5b80633ab2616d116102a65780633ab2616d1461062f5780633d5810e6146106455780633f794f251461066557806341f434341461068557600080fd5b8063303e74df146105ab57806334452fc9146105cb57806334b2196b146105de57806338e71675146105fe57600080fd5b806308d49f821161034f57806318160ddd1161031e57806318160ddd146105465780631a99dbb51461055f57806323b872dd14610575578063240c387c1461059557600080fd5b806308d49f82146104d0578063095ea7b3146104e65780630f2cc11d1461050657806312e7a1bf1461052657600080fd5b806301ffc9a71161038b57806301ffc9a71461043357806306fdde03146104635780630788370314610485578063081812fc1461049857600080fd5b80628af2e6146103b15780630186d137146103f157806301b9a39714610413575b600080fd5b3480156103bd57600080fd5b506103de6103cc366004614d40565b601d6020526000908152604090205481565b6040519081526020015b60405180910390f35b3480156103fd57600080fd5b5061041161040c366004614da6565b610b24565b005b34801561041f57600080fd5b5061041161042e366004614d40565b610ccf565b34801561043f57600080fd5b5061045361044e366004614dfd565b610d1b565b60405190151581526020016103e8565b34801561046f57600080fd5b50610478610d6d565b6040516103e89190614e72565b610411610493366004614e85565b610dff565b3480156104a457600080fd5b506104b86104b3366004614e85565b611006565b6040516001600160a01b0390911681526020016103e8565b3480156104dc57600080fd5b506103de600a5481565b3480156104f257600080fd5b50610411610501366004614e9e565b61104a565b34801561051257600080fd5b50610453610521366004614ec8565b6110d2565b34801561053257600080fd5b50610411610541366004614f1a565b611121565b34801561055257600080fd5b50600254600154036103de565b34801561056b57600080fd5b506103de600b5481565b34801561058157600080fd5b50610411610590366004614f3d565b61116e565b3480156105a157600080fd5b506103de600e5481565b3480156105b757600080fd5b50601e546104b8906001600160a01b031681565b6104116105d9366004614e85565b611193565b3480156105ea57600080fd5b506104116105f9366004614f79565b6112ea565b34801561060a57600080fd5b5060135461061d90610100900460ff1681565b60405160ff90911681526020016103e8565b34801561063b57600080fd5b506103de60105481565b34801561065157600080fd5b50610478610660366004614e85565b611374565b34801561067157600080fd5b50610411610680366004614e85565b6117a6565b34801561069157600080fd5b506104b86daaeb6d7670e522a718067333cd4e81565b3480156106b357600080fd5b506104116106c2366004614f3d565b6117d5565b3480156106d357600080fd5b506103de6106e2366004614d40565b601c6020526000908152604090205481565b34801561070057600080fd5b5061041161070f366004614e85565b6117fa565b34801561072057600080fd5b5060135461061d9060ff1681565b34801561073a57600080fd5b506104b8610749366004614e85565b611829565b34801561075a57600080fd5b50610411610769366004614d40565b61183b565b34801561077a57600080fd5b50610411610789366004614e85565b611887565b34801561079a57600080fd5b506104116107a9366004614e85565b6118b6565b3480156107ba57600080fd5b506103de6107c9366004614d40565b6118e5565b3480156107da57600080fd5b50610411611933565b3480156107ef57600080fd5b506103de6107fe366004614d40565b60166020526000908152604090205481565b34801561081c57600080fd5b5061041161082b366004614da6565b611969565b34801561083c57600080fd5b5061085061084b366004614d40565b611ac8565b6040516103e89190614f9b565b610411611c01565b34801561087157600080fd5b506000546001600160a01b03166104b8565b34801561088f57600080fd5b5061041161089e366004614e85565b611c5c565b3480156108af57600080fd5b506103de600c5481565b3480156108c557600080fd5b50610478611c8b565b3480156108da57600080fd5b506103de600d5481565b3480156108f057600080fd5b506104116108ff366004614fed565b611c9a565b34801561091057600080fd5b5061041161091f366004614e85565b611d2f565b34801561093057600080fd5b506103de60115481565b34801561094657600080fd5b50610411610955366004614e85565b611d5e565b34801561096657600080fd5b50610411610975366004614e85565b611d8d565b34801561098657600080fd5b50610411610995366004615024565b611dbc565b3480156109a657600080fd5b506103de600f5481565b3480156109bc57600080fd5b506104116109cb3660046150bd565b611ea4565b6104116109de366004614e85565b611ed1565b3480156109ef57600080fd5b506104786109fe366004614e85565b612061565b348015610a0f57600080fd5b506103de60125481565b348015610a2557600080fd5b50610478610a34366004614e85565b612076565b348015610a4557600080fd5b506103de60095481565b348015610a5b57600080fd5b50610453610a6a366004614ec8565b61213b565b348015610a7b57600080fd5b50610453610a8a366004615167565b612182565b348015610a9b57600080fd5b50610411610aaa366004614d40565b6121b0565b348015610abb57600080fd5b50610411610aca366004614e85565b612248565b348015610adb57600080fd5b50610411610aea366004614e85565b612277565b348015610afb57600080fd5b506104116122a6565b348015610b1057600080fd5b50610478610b1f366004614e85565b612300565b6000610b336002546001540390565b60135490915060ff16600114610b645760405162461bcd60e51b8152600401610b5b90615191565b60405180910390fd5b600954610b728260026151ce565b1115610b905760405162461bcd60e51b8152600401610b5b906151e6565b610b9b3384846110d2565b610bd95760405162461bcd60e51b815260206004820152600f60248201526e139bdd081bdb881d1a19481b1a5cdd608a1b6044820152606401610b5b565b336000908152601c602052604090205415610c275760405162461bcd60e51b815260206004820152600e60248201526d105b1c9958591e481b5a5b9d195960921b6044820152606401610b5b565b336000908152601c60205260408120805491610c428361521d565b919050555060005b6002811015610cba574233610c5f83856151ce565b604051602001610c7193929190615236565b60408051601f19818403018152919052805160209091012060186000610c9784866151ce565b815260208101919091526040016000205580610cb28161521d565b915050610c4a565b5060009050610cca3360026124cf565b505050565b6000546001600160a01b03163314610cf95760405162461bcd60e51b8152600401610b5b9061525e565b601e80546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160e01b031982166380ac58cd60e01b1480610d4c57506001600160e01b03198216635b5e139f60e01b145b80610d6757506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060038054610d7c90615293565b80601f0160208091040260200160405190810160405280929190818152602001828054610da890615293565b8015610df55780601f10610dca57610100808354040283529160200191610df5565b820191906000526020600020905b815481529060010190602001808311610dd857829003601f168201915b5050505050905090565b6000610e0e6002546001540390565b60105433600090815260166020526040812054929350911015610e4d5733600090815260166020526040902054601054610e4891906152cd565b610e50565b60005b9050600083821015610e6b57610e6682856152cd565b610e6e565b60005b60135490915060ff16600314610e965760405162461bcd60e51b8152600401610b5b90615191565b600c54841115610ed35760405162461bcd60e51b8152602060048201526008602482015267546f6f206d616e7960c01b6044820152606401610b5b565b600954610ee085856151ce565b1115610f2e5760405162461bcd60e51b815260206004820152601e60248201527f576f756c6420657863656564206d6178207075626c696320737570706c7900006044820152606401610b5b565b3481600f54610f3d91906152e4565b14610f5a5760405162461bcd60e51b8152600401610b5b90615303565b3360009081526016602052604081208054869290610f799084906151ce565b90915550600090505b84811015610ff1574233610f9683876151ce565b604051602001610fa893929190615236565b60408051601f19818403018152919052805160209091012060186000610fce84886151ce565b815260208101919091526040016000205580610fe98161521d565b915050610f82565b506000925061100033856124cf565b50505050565b6000611011826124ed565b61102e576040516333d1c03960e21b815260040160405180910390fd5b506000908152600760205260409020546001600160a01b031690565b600061105582611829565b9050806001600160a01b0316836001600160a01b0316036110895760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b038216148015906110a957506110a78133612182565b155b156110c7576040516367d9dca160e11b815260040160405180910390fd5b610cca838383612519565b60006111196110e085612575565b8484808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506125b492505050565b949350505050565b6000546001600160a01b0316331461114b5760405162461bcd60e51b8152600401610b5b9061525e565b601354600560ff909116101561116b576013805460ff191660ff83161790555b50565b826001600160a01b038116331461118857611188336125ca565b611000848484612683565b60135460ff610100909104166001146111e65760405162461bcd60e51b81526020600482015260156024820152745265726f6c6c20436f6c6f7220696e61637469766560581b6044820152606401610b5b565b600b546012541061122b5760405162461bcd60e51b815260206004820152600f60248201526e4e6f206d6f7265207265726f6c6c7360881b6044820152606401610b5b565b61123481611829565b6001600160a01b0316336001600160a01b03161461128c5760405162461bcd60e51b815260206004820152601560248201527413db9b1e481bdddb995c8818d85b881c995c9bdb1b605a1b6044820152606401610b5b565b34600e54146112ad5760405162461bcd60e51b8152600401610b5b90615303565b6012546112bb9060016151ce565b6012556000818152601a60205260409020546112d89060016151ce565b6000918252601a602052604090912055565b6112f382611829565b6001600160a01b0316336001600160a01b0316146113535760405162461bcd60e51b815260206004820152601960248201527f4f6e6c79206f776e65722063616e206368616e676520557463000000000000006044820152606401610b5b565b61135e601882615343565b6000928352601960205260409092209190915550565b60606113836002546001540390565b8211156113c25760405162461bcd60e51b815260206004820152600d60248201526c13585b881b9bdd08195e1a5cdd609a1b6044820152606401610b5b565b60006113cd8361268e565b601e5481519192506001600160a01b031690631020bb629083906000906113f6576113f6615357565b60200260200101516040518263ffffffff1660e01b8152600401611424919061ffff91909116815260200190565b600060405180830381865afa158015611441573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611469919081019061536d565b601e5482516001600160a01b039091169063b7fd9bfe908490600490811061149357611493615357565b60200260200101516040518263ffffffff1660e01b81526004016114c1919061ffff91909116815260200190565b600060405180830381865afa1580156114de573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611506919081019061536d565b601e5483516001600160a01b0390911690637760d266908590600690811061153057611530615357565b60200260200101516040518263ffffffff1660e01b815260040161155e919061ffff91909116815260200190565b600060405180830381865afa15801561157b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526115a3919081019061536d565b601e5484516001600160a01b03909116906369e2321390869060059081106115cd576115cd615357565b60200260200101516115de89612dc5565b6040518363ffffffff1660e01b81526004016115fb9291906153e3565b600060405180830381865afa158015611618573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611640919081019061536d565b601e5485516001600160a01b0390911690633bf9045c908790600390811061166a5761166a615357565b602002602001015161167b8a612dc5565b6040518363ffffffff1660e01b81526004016116989291906153e3565b600060405180830381865afa1580156116b5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526116dd919081019061536d565b601e5486516001600160a01b03909116906353dbb7c7908890600290811061170757611707615357565b60200260200101516040518263ffffffff1660e01b8152600401611735919061ffff91909116815260200190565b600060405180830381865afa158015611752573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261177a919081019061536d565b60405160200161178f9695949392919061545b565b604051602081830303815290604052915050919050565b6000546001600160a01b031633146117d05760405162461bcd60e51b8152600401610b5b9061525e565b601055565b826001600160a01b03811633146117ef576117ef336125ca565b611000848484612e9b565b6000546001600160a01b031633146118245760405162461bcd60e51b8152600401610b5b9061525e565b600a55565b600061183482612eb6565b5192915050565b6000546001600160a01b031633146118655760405162461bcd60e51b8152600401610b5b9061525e565b601780546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146118b15760405162461bcd60e51b8152600401610b5b9061525e565b600b55565b6000546001600160a01b031633146118e05760405162461bcd60e51b8152600401610b5b9061525e565b600955565b60006001600160a01b03821661190e576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600660205260409020546001600160401b031690565b6000546001600160a01b0316331461195d5760405162461bcd60e51b8152600401610b5b9061525e565b6119676000612fd0565b565b60006119786002546001540390565b60135490915060ff166002146119a05760405162461bcd60e51b8152600401610b5b90615191565b6009546119ae8260016151ce565b11156119cc5760405162461bcd60e51b8152600401610b5b906151e6565b6119d733848461213b565b611a155760405162461bcd60e51b815260206004820152600f60248201526e139bdd081bdb881d1a19481b1a5cdd608a1b6044820152606401610b5b565b336000908152601d602052604090205415611a635760405162461bcd60e51b815260206004820152600e60248201526d105b1c9958591e481b5a5b9d195960921b6044820152606401610b5b565b336000908152601d60205260408120805491611a7e8361521d565b9190505550423382604051602001611a9893929190615236565b60408051601f19818403018152918152815160209283012060009384526018909252822055610cca3360016124cf565b60606000611ad5836118e5565b90506000816001600160401b03811115611af157611af1615050565b604051908082528060200260200182016040528015611b1a578160200160208202803683370190505b509050600080611b2d6002546001540390565b905060005b81811015611bf6576000611b45826124ed565b90508015611b9f57876001600160a01b0316611b6083611829565b6001600160a01b031603611b9a5781858581518110611b8157611b81615357565b602090810291909101015283611b968161521d565b9450505b611be3565b80158015611bd0575084611bb46001886152cd565b81518110611bc457611bc4615357565b60200260200101516000145b15611be35782611bdf8161521d565b9350505b5080611bee8161521d565b915050611b32565b509195945050505050565b6000546001600160a01b03163314611c2b5760405162461bcd60e51b8152600401610b5b9061525e565b6017546040516001600160a01b03909116904780156108fc02916000818181858888f1935050505061196757600080fd5b6000546001600160a01b03163314611c865760405162461bcd60e51b8152600401610b5b9061525e565b600e55565b606060048054610d7c90615293565b336001600160a01b03831603611cc35760405163b06307db60e01b815260040160405180910390fd5b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000546001600160a01b03163314611d595760405162461bcd60e51b8152600401610b5b9061525e565b601455565b6000546001600160a01b03163314611d885760405162461bcd60e51b8152600401610b5b9061525e565b600c55565b6000546001600160a01b03163314611db75760405162461bcd60e51b8152600401610b5b9061525e565b601555565b6000546001600160a01b03163314611de65760405162461bcd60e51b8152600401610b5b9061525e565b6000611df56002546001540390565b600954909150611e0584836151ce565b1115611e235760405162461bcd60e51b8152600401610b5b906151e6565b60005b83811015611e95574233611e3a83856151ce565b604051602001611e4c93929190615236565b60408051601f19818403018152919052805160209091012060186000611e7284866151ce565b815260208101919091526040016000205580611e8d8161521d565b915050611e26565b5060009050610cca82846124cf565b836001600160a01b0381163314611ebe57611ebe336125ca565b611eca85858585613020565b5050505050565b60135460ff61010090910416600114611f1e5760405162461bcd60e51b815260206004820152600f60248201526e5265726f6c6c20696e61637469766560881b6044820152606401610b5b565b600a5460115410611f635760405162461bcd60e51b815260206004820152600f60248201526e4e6f206d6f7265207265726f6c6c7360881b6044820152606401610b5b565b611f6c81611829565b6001600160a01b0316336001600160a01b031614611fc45760405162461bcd60e51b815260206004820152601560248201527413db9b1e481bdddb995c8818d85b881c995c9bdb1b605a1b6044820152606401610b5b565b34600d5414611fe55760405162461bcd60e51b8152600401610b5b90615303565b601154611ff39060016151ce565b60115542336120038360016151ce565b60405160200161201593929190615236565b60408051601f198184030181529181528151602092830120600084815260189093529120556107e761204561306b565b61204f91906152cd565b6000918252601b602052604090912055565b6060610d6760086120718461308c565b613190565b6060612081826124ed565b6120bf5760405162461bcd60e51b815260206004820152600f60248201526e151bdad95b881b9bdd08199bdd5b99608a1b6044820152606401610b5b565b6000806120cb84613252565b915091506121136120db85613573565b60008681526030602090815260409182902091516120ff93929186918891016154da565b60405160208183030381529060405261369e565b60405160200161212391906156b5565b60405160208183030381529060405292505050919050565b600061111961214985612575565b84848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061380492505050565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b6000546001600160a01b031633146121da5760405162461bcd60e51b8152600401610b5b9061525e565b6001600160a01b03811661223f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b5b565b61116b81612fd0565b6000546001600160a01b031633146122725760405162461bcd60e51b8152600401610b5b9061525e565b600d55565b6000546001600160a01b031633146122a15760405162461bcd60e51b8152600401610b5b9061525e565b600f55565b6000546001600160a01b031633146122d05760405162461bcd60e51b8152600401610b5b9061525e565b601354610100900460ff166001036122ef576013805461ff0019169055565b6013805461ff001916610100179055565b6060816000610e1062015180612317601885615343565b61232390610e106152e4565b61232d90426151ce565b6123379190615343565b61234191906156fa565b90506000603c612353610e1042615343565b61235d91906156fa565b6040805160208082018352600082528251808401845260018152601d60f91b818301528351808501909452600684526520285554432b60d01b918401919091529293509190600c8510156123e4576040518060400160405280600381526020016220414d60e81b8152509250846000036123df576123dc85600c6151ce565b94505b612419565b6040518060400160405280600381526020016220504d60e81b8152509250600c85111561241957612416600c866152cd565b94505b600a841015612440576040518060400160405280600281526020016103a360f41b81525091505b600c861115612480575060408051808201909152600681526520285554432d60d01b6020820152612472600c87615343565b61247d90600c6152cd565b95505b61248985613573565b8261249386613573565b858461249e8b613573565b6040516020016124b39695949392919061570e565b6040516020818303038152906040529650505050505050919050565b6124e9828260405180602001604052806000815250613813565b5050565b600060015482108015610d67575050600090815260056020526040902054600160e01b900460ff161590565b60008281526007602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6040516bffffffffffffffffffffffff19606083901b166020820152600090603401604051602081830303815290604052805190602001209050919050565b60006125c382601454856139d9565b9392505050565b6daaeb6d7670e522a718067333cd4e3b1561116b57604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015612637573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061265b9190615796565b61116b57604051633b79c77360e21b81526001600160a01b0382166004820152602401610b5b565b610cca8383836139ef565b6000818152601860205260408120546060916126ac82600886613be5565b60408051600880825261012082019092529192506000919060208201610100803683375050601f80546040805160208084028201810190925282815294955061277194935083018282801561274857602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff168152602001906002019060208260010104928301926001038202915080841161270f5790505b50505050508360008151811061276057612760615357565b602002602001015161ffff16613d57565b8160008151811061278457612784615357565b61ffff92909216602092830291909101820152805460408051828402810184019091528181526128209290918282018282801561280857602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff16815260200190600201906020826001010492830192600103820291508084116127cf5790505b50505050508360018151811061276057612760615357565b8160018151811061283357612833615357565b61ffff929092166020928302919091018201526021805460408051828502810185019091528181526128d293909291908301828280156128ba57602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff16815260200190600201906020826001010492830192600103820291508084116128815790505b50505050508360028151811061276057612760615357565b816002815181106128e5576128e5615357565b61ffff92909216602092830291909101820152602280546040805182850281018501909152818152612984939092919083018282801561296c57602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff16815260200190600201906020826001010492830192600103820291508084116129335790505b50505050508360038151811061276057612760615357565b8160038151811061299757612997615357565b61ffff92909216602092830291909101820152602380546040805182850281018501909152818152612a369390929190830182828015612a1e57602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff16815260200190600201906020826001010492830192600103820291508084116129e55790505b50505050508360048151811061276057612760615357565b81600481518110612a4957612a49615357565b61ffff92909216602092830291909101820152602480546040805182850281018501909152818152612ae89390929190830182828015612ad057602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff1681526020019060020190602082600101049283019260010382029150808411612a975790505b50505050508360058151811061276057612760615357565b81600581518110612afb57612afb615357565b61ffff92909216602092830291909101820152602580546040805182850281018501909152818152612b9a9390929190830182828015612b8257602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff1681526020019060020190602082600101049283019260010382029150808411612b495790505b50505050508360068151811061276057612760615357565b81600681518110612bad57612bad615357565b61ffff92909216602092830291909101820152602680546040805182850281018501909152818152612c4c9390929190830182828015612c3457602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff1681526020019060020190602082600101049283019260010382029150808411612bfb5790505b50505050508360078151811061276057612760615357565b81600781518110612c5f57612c5f615357565b602002602001019061ffff16908161ffff168152505080600581518110612c8857612c88615357565b602002602001015161ffff16600c03612cc757600181600081518110612cb057612cb0615357565b602002602001019061ffff16908161ffff16815250505b80600081518110612cda57612cda615357565b602002602001015161ffff1660041480612d12575080600081518110612d0257612d02615357565b602002602001015161ffff166005145b80612d3b575080600081518110612d2b57612d2b615357565b602002602001015161ffff166006145b15612d6c57600181600681518110612d5557612d55615357565b602002602001019061ffff16908161ffff16815250505b80600381518110612d7f57612d7f615357565b602002602001015161ffff1660030361111957600181600281518110612da757612da7615357565b602002602001019061ffff16908161ffff1681525050949350505050565b612dcd614cfc565b600082815260186020908152604080832054601a909252822054612e299190612df79060326151ce565b6040805160208101939093528201526060016040516020818303038152906040528051906020012060001c6020613dfb565b905060005b60098111612e9457612e6b612e448260066152e4565b612e4f9060036151ce565b612e5a8360066152e4565b612e659060086151ce565b84613f96565b8382600a8110612e7d57612e7d615357565b602002015280612e8c8161521d565b915050612e2e565b5050919050565b610cca83838360405180602001604052806000815250611ea4565b604080516060810182526000808252602082018190529181019190915281600154811015612fb757600081815260056020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff16151591810182905290612fb55780516001600160a01b031615612f4c579392505050565b5060001901600081815260056020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff1615159281019290925215612fb0579392505050565b612f4c565b505b604051636f96cda160e11b815260040160405180910390fd5b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b61302b8484846139ef565b6001600160a01b0383163b1515801561304d575061304b84848484614073565b155b15611000576040516368d2bf6b60e11b815260040160405180910390fd5b600061307b6301e18558426156fa565b613087906107b26151ce565b905090565b60008061309761306b565b90506000613130601f60070180548060200260200160405190810160405280929190818152602001828054801561311557602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff16815260200190600201906020826001010492830192600103820291508084116130dc5790505b5050506000888152601860205260409020549150613d579050565b61ffff166107dd601b6000878152602001908152602001600020548461315691906152cd565b61316091906152cd565b61316a91906152cd565b9050600a811061317e575060099392505050565b600181116125c3575060019392505050565b6060602783600981106131a5576131a5615357565b0182815481106131b7576131b7615357565b9060005260206000200180546131cc90615293565b80601f01602080910402602001604051908101604052809291908181526020018280546131f890615293565b80156132455780601f1061321a57610100808354040283529160200191613245565b820191906000526020600020905b81548152906001019060200180831161322857829003601f168201915b5050505050905092915050565b6060808260006132618261268e565b9050600061326f828761415e565b905061327a8161369e565b945060606132ce60405180604001604052806004815260200163426f647960e01b8152506132c76000866000815181106132b6576132b6615357565b602002602001015161ffff16613190565b60006149ab565b613309604051806040016040528060078152602001662bb2b0ba3432b960c91b8152506132c76001876001815181106132b6576132b6615357565b6133446040518060400160405280600781526020016622bcb2bbb2b0b960c91b8152506132c76002886002815181106132b6576132b6615357565b61337c604051806040016040528060048152602001634861747360e01b8152506132c76003896003815181106132b6576132b6615357565b6133b36040518060400160405280600381526020016245796560e81b8152506132c760048a6004815181106132b6576132b6615357565b6133ee60405180604001604052806007815260200166436c6f7468657360c81b8152506132c760058b6005815181106132b6576132b6615357565b61342760405180604001604052806005815260200164486169727360d81b8152506132c760068c6006815181106132b6576132b6615357565b60405160200161343d97969594939291906157b3565b604051602081830303815290604052905060008161348d6040518060400160405280600481526020016354696d6560e01b8152506132c7601960008a815260200190815260200160002054612300565b6134b76040518060400160405280600681526020016529b2b0b9b7b760d11b8152506132c7614a0b565b6134e660405180604001604052806005815260200164546965727360d81b8152506132c760086120718c61308c565b6135226040518060400160405280600b81526020016a54656d706f72616c69747960a81b81525061351b60076120718d61308c565b60016149ab565b604051602001613536959493929190615845565b60405160208183030381529060405290508060405160200161355891906158b0565b60405160208183030381529060405295505050505050915091565b60608160000361359a5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156135c457806135ae8161521d565b91506135bd9050600a836156fa565b915061359e565b6000816001600160401b038111156135de576135de615050565b6040519080825280601f01601f191660200182016040528015613608576020820181803683370190505b509050815b85156136955761361e6001826152cd565b9050600061362d600a886156fa565b61363890600a6152e4565b61364290886152cd565b61364d9060306158cc565b905060008160f81b90508084848151811061366a5761366a615357565b60200101906001600160f81b031916908160001a90535061368c600a896156fa565b9750505061360d565b50949350505050565b606081516000036136bd57505060408051602081019091526000815290565b6000604051806060016040528060408152602001615c2960409139905060006003845160026136ec91906151ce565b6136f691906156fa565b6137019060046152e4565b905060006137108260206151ce565b6001600160401b0381111561372757613727615050565b6040519080825280601f01601f191660200182016040528015613751576020820181803683370190505b509050818152600183018586518101602084015b818310156137bf5760039283018051603f601282901c811687015160f890811b8552600c83901c8216880151811b6001860152600683901c8216880151811b60028601529116860151901b93820193909352600401613765565b6003895106600181146137d957600281146137ea576137f6565b613d3d60f01b6001198301526137f6565b603d60f81b6000198301525b509398975050505050505050565b60006125c382601554856139d9565b6001546001600160a01b03841661383c57604051622e076360e81b815260040160405180910390fd5b8260000361385d5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038416600081815260066020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168b0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168b01811690920217909155858452600590925290912080546001600160e01b0319168317600160a01b42909316929092029190911790558190818501903b15613985575b60405182906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a461394e6000878480600101955087614073565b61396b576040516368d2bf6b60e11b815260040160405180910390fd5b80820361390357826001541461398057600080fd5b6139ca565b5b6040516001830192906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808203613986575b50600155611000600085838684565b6000826139e68584614b08565b14949350505050565b60006139fa82612eb6565b9050836001600160a01b031681600001516001600160a01b031614613a315760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0386161480613a4f5750613a4f8533612182565b80613a6a575033613a5f84611006565b6001600160a01b0316145b905080613a8a57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038416613ab157604051633a954ecd60e21b815260040160405180910390fd5b613abd60008487612519565b6001600160a01b038581166000908152600660209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600590945282852080546001600160e01b031916909417600160a01b42909216919091021783558701808452922080549193909116613b91576001548214613b9157805460208601516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4333b15611eca57611eca83614bac565b6060826001600160401b03811115613bff57613bff615050565b604051908082528060200260200182016040528015613c28578160200160208202803683370190505b50905060005b83811015613d4f5780600103613cee57613cc185613c4d8360016151ce565b6000868152601960205260409020546201518090613c6d90601890615343565b613c7990610e106152e4565b613c8390426151ce565b613c8d91906156fa565b60408051602081019490945283019190915260608201526080015b6040516020818303038152906040528051906020012090565b828281518110613cd357613cd3615357565b602002602001019061ffff16908161ffff1681525050613d3d565b613d1485613cfd8360016151ce565b604080516020810193909352820152606001613ca8565b828281518110613d2657613d26615357565b602002602001019061ffff16908161ffff16815250505b80613d478161521d565b915050613c2e565b509392505050565b600080613d6661271084615343565b9050600060015b85518161ffff1611613df5576000868261ffff1681518110613d9157613d91615357565b602002602001015190508281613da791906158f1565b61ffff168461ffff16108015613dc557508261ffff168461ffff1610155b15613dd557509250610d67915050565b613ddf81846158f1565b9250508080613ded90615917565b915050613d6d565b50600080fd5b60606000613e0a8360026152e4565b613e159060026151ce565b6001600160401b03811115613e2c57613e2c615050565b6040519080825280601f01601f191660200182016040528015613e56576020820181803683370190505b509050600360fc1b81600081518110613e7157613e71615357565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110613ea057613ea0615357565b60200101906001600160f81b031916908160001a9053506000613ec48460026152e4565b613ecf9060016151ce565b90505b6001811115613f47576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110613f0357613f03615357565b1a60f81b828281518110613f1957613f19615357565b60200101906001600160f81b031916908160001a90535060049490941c93613f4081615938565b9050613ed2565b5083156125c35760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610b5b565b60606000613fa485856152cd565b613faf9060016151ce565b6001600160401b03811115613fc657613fc6615050565b6040519080825280601f01601f191660200182016040528015613ff0576020820181803683370190505b50905060005b61400086866152cd565b81116136955783600161401388846151ce565b61401d91906152cd565b8151811061402d5761402d615357565b602001015160f81c60f81b82828151811061404a5761404a615357565b60200101906001600160f81b031916908160001a9053508061406b8161521d565b915050613ff6565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906140a890339089908890889060040161594f565b6020604051808303816000875af19250505080156140e3575060408051601f3d908101601f191682019092526140e09181019061598c565b60015b614141573d808015614111576040519150601f19603f3d011682016040523d82523d6000602084013e614116565b606091505b508051600003614139576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b606060006040518060c0016040528060908152602001615b9960909139601e5485516001600160a01b0390911690631020bb629087906000906141a3576141a3615357565b60200260200101516040518263ffffffff1660e01b81526004016141d1919061ffff91909116815260200190565b600060405180830381865afa1580156141ee573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052614216919081019061536d565b601e5486516001600160a01b039091169063b7fd9bfe908890600490811061424057614240615357565b60200260200101516040518263ffffffff1660e01b815260040161426e919061ffff91909116815260200190565b600060405180830381865afa15801561428b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526142b3919081019061536d565b601e5487516001600160a01b0390911690637760d26690899060069081106142dd576142dd615357565b60200260200101516040518263ffffffff1660e01b815260040161430b919061ffff91909116815260200190565b600060405180830381865afa158015614328573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052614350919081019061536d565b601e5488516001600160a01b03909116906369e23213908a90600590811061437a5761437a615357565b602002602001015161438b8a612dc5565b6040518363ffffffff1660e01b81526004016143a89291906153e3565b600060405180830381865afa1580156143c5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526143ed919081019061536d565b601e5489516001600160a01b0390911690633bf9045c908b90600390811061441757614417615357565b60200260200101516144288b612dc5565b6040518363ffffffff1660e01b81526004016144459291906153e3565b600060405180830381865afa158015614462573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261448a919081019061536d565b601e548a516001600160a01b03909116906353dbb7c7908c9060029081106144b4576144b4615357565b60200260200101516040518263ffffffff1660e01b81526004016144e2919061ffff91909116815260200190565b600060405180830381865afa1580156144ff573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052614527919081019061536d565b604051806040016040528060048152602001631e17b39f60e11b81525060405160200161455b9897969594939291906159a9565b60408051808303601f1901815290829052601e54631b7f794d60e11b8352600160048401529092506001600160a01b0316906336fef29a90602401600060405180830381865afa1580156145b3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526145db919081019061536d565b601e5485516001600160a01b039091169063c209f2ae908790600190811061460557614605615357565b602002602001015160196000888152602001908152602001600020546040518363ffffffff1660e01b815260040161464d92919061ffff929092168252602082015260400190565b600060405180830381865afa15801561466a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052614692919081019061536d565b601e546001600160a01b03166384740dde6146ac8761308c565b6040518263ffffffff1660e01b81526004016146ca91815260200190565b600060405180830381865afa1580156146e7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261470f919081019061536d565b601e54875185916001600160a01b03169063940f4897908a90600190811061473957614739615357565b60200260200101516040518263ffffffff1660e01b8152600401614767919061ffff91909116815260200190565b600060405180830381865afa158015614784573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526147ac919081019061536d565b601e546001600160a01b0316630672e85a6147c68a61308c565b6040518263ffffffff1660e01b81526004016147e491815260200190565b600060405180830381865afa158015614801573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052614829919081019061536d565b601e54604051631b7f794d60e11b81526004808201526001600160a01b03909116906336fef29a90602401600060405180830381865afa158015614871573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052614899919081019061536d565b601e54604051631b7f794d60e11b8152600560048201526001600160a01b03909116906336fef29a90602401600060405180830381865afa1580156148e2573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261490a919081019061536d565b601e54604051631b7f794d60e11b8152600260048201526001600160a01b03909116906336fef29a90602401600060405180830381865afa158015614953573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261497b919081019061536d565b60405160200161499399989796959493929190615a4e565b60405160208183030381529060405291505092915050565b6040805180820190915260018152600b60fa1b602082015260609082156149dd57506040805160208101909152600081525b8484826040516020016149f293929190615b0f565b6040516020818303038152906040529150509392505050565b60606000614a1d6301e1855842615343565b60408051602081019091526000815290915062682680821080614a4357506301d4ff1882115b15614a6b57506040805180820190915260068152652bb4b73a32b960d11b6020820152610d67565b626826808210158015614a81575062e2b3f08211155b15614aa95750604080518082019091526006815265537072696e6760d01b6020820152610d67565b62e2b3f082118015614abe575063015d4f7082105b15614ae6575060408051808201909152600681526529bab6b6b2b960d11b6020820152610d67565b5060408051808201909152600481526311985b1b60e21b602082015292915050565b600081815b8451811015613d4f576000858281518110614b2a57614b2a615357565b60200260200101519050808311614b6c576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250614b99565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b5080614ba48161521d565b915050614b0d565b6000614bb661306b565b90506000614c4f601f600701805480602002602001604051908101604052809291908181526020018280548015614c3457602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff1681526020019060020190602082600101049283019260010382029150808411614bfb5790505b5050506000878152601860205260409020549150613d579050565b61ffff166107dd601b60008681526020019081526020016000205484614c7591906152cd565b614c7f91906152cd565b614c8991906152cd565b9050600a8110614cce576000838152601b6020526040902054600890614cb09083906151ce565b614cba91906152cd565b6000848152601b6020526040902055505050565b60018111614ce2575050600052601b602052565b6000838152601b6020526040902054614cba9060016151ce565b604051806101400160405280600a905b6060815260200190600190039081614d0c5790505090565b80356001600160a01b0381168114614d3b57600080fd5b919050565b600060208284031215614d5257600080fd5b6125c382614d24565b60008083601f840112614d6d57600080fd5b5081356001600160401b03811115614d8457600080fd5b6020830191508360208260051b8501011115614d9f57600080fd5b9250929050565b60008060208385031215614db957600080fd5b82356001600160401b03811115614dcf57600080fd5b614ddb85828601614d5b565b90969095509350505050565b6001600160e01b03198116811461116b57600080fd5b600060208284031215614e0f57600080fd5b81356125c381614de7565b60005b83811015614e35578181015183820152602001614e1d565b838111156110005750506000910152565b60008151808452614e5e816020860160208601614e1a565b601f01601f19169290920160200192915050565b6020815260006125c36020830184614e46565b600060208284031215614e9757600080fd5b5035919050565b60008060408385031215614eb157600080fd5b614eba83614d24565b946020939093013593505050565b600080600060408486031215614edd57600080fd5b614ee684614d24565b925060208401356001600160401b03811115614f0157600080fd5b614f0d86828701614d5b565b9497909650939450505050565b600060208284031215614f2c57600080fd5b813560ff811681146125c357600080fd5b600080600060608486031215614f5257600080fd5b614f5b84614d24565b9250614f6960208501614d24565b9150604084013590509250925092565b60008060408385031215614f8c57600080fd5b50508035926020909101359150565b6020808252825182820181905260009190848201906040850190845b81811015614fd357835183529284019291840191600101614fb7565b50909695505050505050565b801515811461116b57600080fd5b6000806040838503121561500057600080fd5b61500983614d24565b9150602083013561501981614fdf565b809150509250929050565b6000806040838503121561503757600080fd5b8235915061504760208401614d24565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561508e5761508e615050565b604052919050565b60006001600160401b038211156150af576150af615050565b50601f01601f191660200190565b600080600080608085870312156150d357600080fd5b6150dc85614d24565b93506150ea60208601614d24565b92506040850135915060608501356001600160401b0381111561510c57600080fd5b8501601f8101871361511d57600080fd5b803561513061512b82615096565b615066565b81815288602083850101111561514557600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b6000806040838503121561517a57600080fd5b61518383614d24565b915061504760208401614d24565b6020808252600d908201526c53616c6520696e61637469766560981b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600082198211156151e1576151e16151b8565b500190565b60208082526017908201527f576f756c6420657863656564206d617820737570706c79000000000000000000604082015260600190565b60006001820161522f5761522f6151b8565b5060010190565b92835260609190911b6bffffffffffffffffffffffff19166020830152603482015260540190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c908216806152a757607f821691505b6020821081036152c757634e487b7160e01b600052602260045260246000fd5b50919050565b6000828210156152df576152df6151b8565b500390565b60008160001904831182151516156152fe576152fe6151b8565b500290565b60208082526010908201526f15dc9bdb99c811551208185b5bdd5b9d60821b604082015260600190565b634e487b7160e01b600052601260045260246000fd5b6000826153525761535261532d565b500690565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561537f57600080fd5b81516001600160401b0381111561539557600080fd5b8201601f810184136153a657600080fd5b80516153b461512b82615096565b8181528560208385010111156153c957600080fd5b6153da826020830160208601614e1a565b95945050505050565b61ffff831681526040602080830182905260009161018084019190840185845b600a81101561543257603f19878603018352615420858351614e46565b94509183019190830190600101615403565b5092979650505050505050565b60008151615451818560208601614e1a565b9290920192915050565b60008751602061546e8285838d01614e1a565b8851918401916154818184848d01614e1a565b88519201916154938184848c01614e1a565b87519201916154a58184848b01614e1a565b86519201916154b78184848a01614e1a565b85519201916154c98184848901614e1a565b919091019998505050505050505050565b717b226e616d65223a224e6f4c61756768202360701b8152845160009060206155098260128601838b01614e1a565b600160fd1b6012928501928301528654601390600090600181811c908083168061553457607f831692505b868310810361555157634e487b7160e01b85526022600452602485fd5b808015615565576001811461557a576155ab565b60ff19851689880152838901870195506155ab565b60008e81526020902060005b858110156155a15781548b82018a0152908401908901615586565b505086848a010195505b50507f222c20226465736372697074696f6e223a20224e6f4c6175676854696d652077845250507f696c6c206c69766520666f7265766572207468726f75676820746865204574686020830152507f657265756d20626c6f636b636861696e20616e642072656d61696e206861707060408201527f7920616e6420667265652e222c2022747261697473223a205b0000000000000060608201526156a761569961569361565b607985018c61543f565b7f5d2c2022696d616765223a22646174613a696d6167652f7376672b786d6c3b62815265185cd94d8d0b60d21b602082015260260190565b8961543f565b61227d60f01b815260020190565b9a9950505050505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008152600082516156ed81601d850160208701614e1a565b91909101601d0192915050565b6000826157095761570961532d565b500490565b6000875160206157218285838d01614e1a565b8851918401916157348184848d01614e1a565b88519201916157468184848c01614e1a565b87519201916157588184848b01614e1a565b865192019161576a8184848a01614e1a565b855192019161577c8184848901614e1a565b602960f81b92019182525060010198975050505050505050565b6000602082840312156157a857600080fd5b81516125c381614fdf565b6000885160206157c68285838e01614e1a565b8951918401916157d98184848e01614e1a565b89519201916157eb8184848d01614e1a565b88519201916157fd8184848c01614e1a565b875192019161580f8184848b01614e1a565b86519201916158218184848a01614e1a565b85519201916158338184848901614e1a565b919091019a9950505050505050505050565b60008651615857818460208b01614e1a565b86519083019061586b818360208b01614e1a565b865191019061587e818360208a01614e1a565b8551910190615891818360208901614e1a565b84519101906158a4818360208801614e1a565b01979650505050505050565b600082516158c2818460208701614e1a565b9190910192915050565b600060ff821660ff84168060ff038211156158e9576158e96151b8565b019392505050565b600061ffff80831681851680830382111561590e5761590e6151b8565b01949350505050565b600061ffff80831681810361592e5761592e6151b8565b6001019392505050565b600081615947576159476151b8565b506000190190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061598290830184614e46565b9695505050505050565b60006020828403121561599e57600080fd5b81516125c381614de7565b6000895160206159bc8285838f01614e1a565b8a51918401916159cf8184848f01614e1a565b8a519201916159e18184848e01614e1a565b89519201916159f38184848d01614e1a565b8851920191615a058184848c01614e1a565b8751920191615a178184848b01614e1a565b8651920191615a298184848a01614e1a565b8551920191615a3b8184848901614e1a565b919091019b9a5050505050505050505050565b60008a51615a60818460208f01614e1a565b8a51615a728183860160208f01614e1a565b8a519184010190615a87818360208e01614e1a565b8951615a998183850160208e01614e1a565b8951929091010190615aaf818360208c01614e1a565b8751615ac18183850160208c01614e1a565b8751929091010190615ad7818360208a01614e1a565b8551615ae98183850160208a01614e1a565b8551929091010190615aff818360208801614e1a565b019b9a5050505050505050505050565b6f3d913a3930b4ba2fba3cb832911d101160811b81528351600090615b3b816010850160208901614e1a565b6c111610113b30b63ab2911d101160991b6010918401918201528451615b6881601d840160208901614e1a565b61227d60f01b601d92909101918201528351615b8b81601f840160208801614e1a565b01601f019594505050505056fe3c7374796c653e23753435207b7472616e736974696f6e2d6475726174696f6e3a2032733b7472616e73666f726d2d6f726967696e3a203335253b7472616e73666f726d2d626f783a66696c6c2d626f783b7d23777437383a686f7665722023753435207b7472616e73666f726d3a207363616c6528312e35293b7d3c2f7374796c653e3c672069643d27753435273e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220206da47c9c7e07cc461c8a56d59f95b9978ac3505502b0099ecf1d497ff53fc664736f6c634300080d00330000000000000000000000004ab96cd0b4c40de069550a271a74795b0570cd59
Deployed Bytecode
0x6080604052600436106103ac5760003560e01c806370a08231116101e7578063ad3e31b71161010d578063d49d5181116100a0578063f489e4961161006f578063f489e49614610aaf578063f4a0a52814610acf578063fd074a4814610aef578063fec4f63114610b0457600080fd5b8063d49d518114610a39578063dc610b1414610a4f578063e985e9c514610a6f578063f2fde38b14610a8f57600080fd5b8063baff1acc116100dc578063baff1acc146109d0578063bf3952d7146109e3578063c2428ef714610a03578063c87b56dd14610a1957600080fd5b8063ad3e31b71461095a578063af8063241461097a578063b7e7da6a1461099a578063b88d4fde146109b057600080fd5b80638e8fac9511610185578063a22cb46511610154578063a22cb465146108e4578063a58fdc1114610904578063a647f0cf14610924578063a74e807d1461093a57600080fd5b80638e8fac95146108835780639394d545146108a357806395d89b41146108b95780639f51758e146108ce57600080fd5b806382853eff116101c157806382853eff146108105780638462151c14610830578063853828b61461085d5780638da5cb5b1461086557600080fd5b806370a08231146107ae578063715018a6146107ce5780637fb66e22146107e357600080fd5b8063303e74df116102d757806342842e0e1161026a5780636352211e116102395780636352211e1461072e57806368ccfb871461074e5780636bee32641461076e5780636f8b44b01461078e57600080fd5b806342842e0e146106a75780634e8461cc146106c7578063578502ca146106f4578063603f4d521461071457600080fd5b80633ab2616d116102a65780633ab2616d1461062f5780633d5810e6146106455780633f794f251461066557806341f434341461068557600080fd5b8063303e74df146105ab57806334452fc9146105cb57806334b2196b146105de57806338e71675146105fe57600080fd5b806308d49f821161034f57806318160ddd1161031e57806318160ddd146105465780631a99dbb51461055f57806323b872dd14610575578063240c387c1461059557600080fd5b806308d49f82146104d0578063095ea7b3146104e65780630f2cc11d1461050657806312e7a1bf1461052657600080fd5b806301ffc9a71161038b57806301ffc9a71461043357806306fdde03146104635780630788370314610485578063081812fc1461049857600080fd5b80628af2e6146103b15780630186d137146103f157806301b9a39714610413575b600080fd5b3480156103bd57600080fd5b506103de6103cc366004614d40565b601d6020526000908152604090205481565b6040519081526020015b60405180910390f35b3480156103fd57600080fd5b5061041161040c366004614da6565b610b24565b005b34801561041f57600080fd5b5061041161042e366004614d40565b610ccf565b34801561043f57600080fd5b5061045361044e366004614dfd565b610d1b565b60405190151581526020016103e8565b34801561046f57600080fd5b50610478610d6d565b6040516103e89190614e72565b610411610493366004614e85565b610dff565b3480156104a457600080fd5b506104b86104b3366004614e85565b611006565b6040516001600160a01b0390911681526020016103e8565b3480156104dc57600080fd5b506103de600a5481565b3480156104f257600080fd5b50610411610501366004614e9e565b61104a565b34801561051257600080fd5b50610453610521366004614ec8565b6110d2565b34801561053257600080fd5b50610411610541366004614f1a565b611121565b34801561055257600080fd5b50600254600154036103de565b34801561056b57600080fd5b506103de600b5481565b34801561058157600080fd5b50610411610590366004614f3d565b61116e565b3480156105a157600080fd5b506103de600e5481565b3480156105b757600080fd5b50601e546104b8906001600160a01b031681565b6104116105d9366004614e85565b611193565b3480156105ea57600080fd5b506104116105f9366004614f79565b6112ea565b34801561060a57600080fd5b5060135461061d90610100900460ff1681565b60405160ff90911681526020016103e8565b34801561063b57600080fd5b506103de60105481565b34801561065157600080fd5b50610478610660366004614e85565b611374565b34801561067157600080fd5b50610411610680366004614e85565b6117a6565b34801561069157600080fd5b506104b86daaeb6d7670e522a718067333cd4e81565b3480156106b357600080fd5b506104116106c2366004614f3d565b6117d5565b3480156106d357600080fd5b506103de6106e2366004614d40565b601c6020526000908152604090205481565b34801561070057600080fd5b5061041161070f366004614e85565b6117fa565b34801561072057600080fd5b5060135461061d9060ff1681565b34801561073a57600080fd5b506104b8610749366004614e85565b611829565b34801561075a57600080fd5b50610411610769366004614d40565b61183b565b34801561077a57600080fd5b50610411610789366004614e85565b611887565b34801561079a57600080fd5b506104116107a9366004614e85565b6118b6565b3480156107ba57600080fd5b506103de6107c9366004614d40565b6118e5565b3480156107da57600080fd5b50610411611933565b3480156107ef57600080fd5b506103de6107fe366004614d40565b60166020526000908152604090205481565b34801561081c57600080fd5b5061041161082b366004614da6565b611969565b34801561083c57600080fd5b5061085061084b366004614d40565b611ac8565b6040516103e89190614f9b565b610411611c01565b34801561087157600080fd5b506000546001600160a01b03166104b8565b34801561088f57600080fd5b5061041161089e366004614e85565b611c5c565b3480156108af57600080fd5b506103de600c5481565b3480156108c557600080fd5b50610478611c8b565b3480156108da57600080fd5b506103de600d5481565b3480156108f057600080fd5b506104116108ff366004614fed565b611c9a565b34801561091057600080fd5b5061041161091f366004614e85565b611d2f565b34801561093057600080fd5b506103de60115481565b34801561094657600080fd5b50610411610955366004614e85565b611d5e565b34801561096657600080fd5b50610411610975366004614e85565b611d8d565b34801561098657600080fd5b50610411610995366004615024565b611dbc565b3480156109a657600080fd5b506103de600f5481565b3480156109bc57600080fd5b506104116109cb3660046150bd565b611ea4565b6104116109de366004614e85565b611ed1565b3480156109ef57600080fd5b506104786109fe366004614e85565b612061565b348015610a0f57600080fd5b506103de60125481565b348015610a2557600080fd5b50610478610a34366004614e85565b612076565b348015610a4557600080fd5b506103de60095481565b348015610a5b57600080fd5b50610453610a6a366004614ec8565b61213b565b348015610a7b57600080fd5b50610453610a8a366004615167565b612182565b348015610a9b57600080fd5b50610411610aaa366004614d40565b6121b0565b348015610abb57600080fd5b50610411610aca366004614e85565b612248565b348015610adb57600080fd5b50610411610aea366004614e85565b612277565b348015610afb57600080fd5b506104116122a6565b348015610b1057600080fd5b50610478610b1f366004614e85565b612300565b6000610b336002546001540390565b60135490915060ff16600114610b645760405162461bcd60e51b8152600401610b5b90615191565b60405180910390fd5b600954610b728260026151ce565b1115610b905760405162461bcd60e51b8152600401610b5b906151e6565b610b9b3384846110d2565b610bd95760405162461bcd60e51b815260206004820152600f60248201526e139bdd081bdb881d1a19481b1a5cdd608a1b6044820152606401610b5b565b336000908152601c602052604090205415610c275760405162461bcd60e51b815260206004820152600e60248201526d105b1c9958591e481b5a5b9d195960921b6044820152606401610b5b565b336000908152601c60205260408120805491610c428361521d565b919050555060005b6002811015610cba574233610c5f83856151ce565b604051602001610c7193929190615236565b60408051601f19818403018152919052805160209091012060186000610c9784866151ce565b815260208101919091526040016000205580610cb28161521d565b915050610c4a565b5060009050610cca3360026124cf565b505050565b6000546001600160a01b03163314610cf95760405162461bcd60e51b8152600401610b5b9061525e565b601e80546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160e01b031982166380ac58cd60e01b1480610d4c57506001600160e01b03198216635b5e139f60e01b145b80610d6757506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060038054610d7c90615293565b80601f0160208091040260200160405190810160405280929190818152602001828054610da890615293565b8015610df55780601f10610dca57610100808354040283529160200191610df5565b820191906000526020600020905b815481529060010190602001808311610dd857829003601f168201915b5050505050905090565b6000610e0e6002546001540390565b60105433600090815260166020526040812054929350911015610e4d5733600090815260166020526040902054601054610e4891906152cd565b610e50565b60005b9050600083821015610e6b57610e6682856152cd565b610e6e565b60005b60135490915060ff16600314610e965760405162461bcd60e51b8152600401610b5b90615191565b600c54841115610ed35760405162461bcd60e51b8152602060048201526008602482015267546f6f206d616e7960c01b6044820152606401610b5b565b600954610ee085856151ce565b1115610f2e5760405162461bcd60e51b815260206004820152601e60248201527f576f756c6420657863656564206d6178207075626c696320737570706c7900006044820152606401610b5b565b3481600f54610f3d91906152e4565b14610f5a5760405162461bcd60e51b8152600401610b5b90615303565b3360009081526016602052604081208054869290610f799084906151ce565b90915550600090505b84811015610ff1574233610f9683876151ce565b604051602001610fa893929190615236565b60408051601f19818403018152919052805160209091012060186000610fce84886151ce565b815260208101919091526040016000205580610fe98161521d565b915050610f82565b506000925061100033856124cf565b50505050565b6000611011826124ed565b61102e576040516333d1c03960e21b815260040160405180910390fd5b506000908152600760205260409020546001600160a01b031690565b600061105582611829565b9050806001600160a01b0316836001600160a01b0316036110895760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b038216148015906110a957506110a78133612182565b155b156110c7576040516367d9dca160e11b815260040160405180910390fd5b610cca838383612519565b60006111196110e085612575565b8484808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506125b492505050565b949350505050565b6000546001600160a01b0316331461114b5760405162461bcd60e51b8152600401610b5b9061525e565b601354600560ff909116101561116b576013805460ff191660ff83161790555b50565b826001600160a01b038116331461118857611188336125ca565b611000848484612683565b60135460ff610100909104166001146111e65760405162461bcd60e51b81526020600482015260156024820152745265726f6c6c20436f6c6f7220696e61637469766560581b6044820152606401610b5b565b600b546012541061122b5760405162461bcd60e51b815260206004820152600f60248201526e4e6f206d6f7265207265726f6c6c7360881b6044820152606401610b5b565b61123481611829565b6001600160a01b0316336001600160a01b03161461128c5760405162461bcd60e51b815260206004820152601560248201527413db9b1e481bdddb995c8818d85b881c995c9bdb1b605a1b6044820152606401610b5b565b34600e54146112ad5760405162461bcd60e51b8152600401610b5b90615303565b6012546112bb9060016151ce565b6012556000818152601a60205260409020546112d89060016151ce565b6000918252601a602052604090912055565b6112f382611829565b6001600160a01b0316336001600160a01b0316146113535760405162461bcd60e51b815260206004820152601960248201527f4f6e6c79206f776e65722063616e206368616e676520557463000000000000006044820152606401610b5b565b61135e601882615343565b6000928352601960205260409092209190915550565b60606113836002546001540390565b8211156113c25760405162461bcd60e51b815260206004820152600d60248201526c13585b881b9bdd08195e1a5cdd609a1b6044820152606401610b5b565b60006113cd8361268e565b601e5481519192506001600160a01b031690631020bb629083906000906113f6576113f6615357565b60200260200101516040518263ffffffff1660e01b8152600401611424919061ffff91909116815260200190565b600060405180830381865afa158015611441573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611469919081019061536d565b601e5482516001600160a01b039091169063b7fd9bfe908490600490811061149357611493615357565b60200260200101516040518263ffffffff1660e01b81526004016114c1919061ffff91909116815260200190565b600060405180830381865afa1580156114de573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611506919081019061536d565b601e5483516001600160a01b0390911690637760d266908590600690811061153057611530615357565b60200260200101516040518263ffffffff1660e01b815260040161155e919061ffff91909116815260200190565b600060405180830381865afa15801561157b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526115a3919081019061536d565b601e5484516001600160a01b03909116906369e2321390869060059081106115cd576115cd615357565b60200260200101516115de89612dc5565b6040518363ffffffff1660e01b81526004016115fb9291906153e3565b600060405180830381865afa158015611618573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611640919081019061536d565b601e5485516001600160a01b0390911690633bf9045c908790600390811061166a5761166a615357565b602002602001015161167b8a612dc5565b6040518363ffffffff1660e01b81526004016116989291906153e3565b600060405180830381865afa1580156116b5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526116dd919081019061536d565b601e5486516001600160a01b03909116906353dbb7c7908890600290811061170757611707615357565b60200260200101516040518263ffffffff1660e01b8152600401611735919061ffff91909116815260200190565b600060405180830381865afa158015611752573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261177a919081019061536d565b60405160200161178f9695949392919061545b565b604051602081830303815290604052915050919050565b6000546001600160a01b031633146117d05760405162461bcd60e51b8152600401610b5b9061525e565b601055565b826001600160a01b03811633146117ef576117ef336125ca565b611000848484612e9b565b6000546001600160a01b031633146118245760405162461bcd60e51b8152600401610b5b9061525e565b600a55565b600061183482612eb6565b5192915050565b6000546001600160a01b031633146118655760405162461bcd60e51b8152600401610b5b9061525e565b601780546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146118b15760405162461bcd60e51b8152600401610b5b9061525e565b600b55565b6000546001600160a01b031633146118e05760405162461bcd60e51b8152600401610b5b9061525e565b600955565b60006001600160a01b03821661190e576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600660205260409020546001600160401b031690565b6000546001600160a01b0316331461195d5760405162461bcd60e51b8152600401610b5b9061525e565b6119676000612fd0565b565b60006119786002546001540390565b60135490915060ff166002146119a05760405162461bcd60e51b8152600401610b5b90615191565b6009546119ae8260016151ce565b11156119cc5760405162461bcd60e51b8152600401610b5b906151e6565b6119d733848461213b565b611a155760405162461bcd60e51b815260206004820152600f60248201526e139bdd081bdb881d1a19481b1a5cdd608a1b6044820152606401610b5b565b336000908152601d602052604090205415611a635760405162461bcd60e51b815260206004820152600e60248201526d105b1c9958591e481b5a5b9d195960921b6044820152606401610b5b565b336000908152601d60205260408120805491611a7e8361521d565b9190505550423382604051602001611a9893929190615236565b60408051601f19818403018152918152815160209283012060009384526018909252822055610cca3360016124cf565b60606000611ad5836118e5565b90506000816001600160401b03811115611af157611af1615050565b604051908082528060200260200182016040528015611b1a578160200160208202803683370190505b509050600080611b2d6002546001540390565b905060005b81811015611bf6576000611b45826124ed565b90508015611b9f57876001600160a01b0316611b6083611829565b6001600160a01b031603611b9a5781858581518110611b8157611b81615357565b602090810291909101015283611b968161521d565b9450505b611be3565b80158015611bd0575084611bb46001886152cd565b81518110611bc457611bc4615357565b60200260200101516000145b15611be35782611bdf8161521d565b9350505b5080611bee8161521d565b915050611b32565b509195945050505050565b6000546001600160a01b03163314611c2b5760405162461bcd60e51b8152600401610b5b9061525e565b6017546040516001600160a01b03909116904780156108fc02916000818181858888f1935050505061196757600080fd5b6000546001600160a01b03163314611c865760405162461bcd60e51b8152600401610b5b9061525e565b600e55565b606060048054610d7c90615293565b336001600160a01b03831603611cc35760405163b06307db60e01b815260040160405180910390fd5b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000546001600160a01b03163314611d595760405162461bcd60e51b8152600401610b5b9061525e565b601455565b6000546001600160a01b03163314611d885760405162461bcd60e51b8152600401610b5b9061525e565b600c55565b6000546001600160a01b03163314611db75760405162461bcd60e51b8152600401610b5b9061525e565b601555565b6000546001600160a01b03163314611de65760405162461bcd60e51b8152600401610b5b9061525e565b6000611df56002546001540390565b600954909150611e0584836151ce565b1115611e235760405162461bcd60e51b8152600401610b5b906151e6565b60005b83811015611e95574233611e3a83856151ce565b604051602001611e4c93929190615236565b60408051601f19818403018152919052805160209091012060186000611e7284866151ce565b815260208101919091526040016000205580611e8d8161521d565b915050611e26565b5060009050610cca82846124cf565b836001600160a01b0381163314611ebe57611ebe336125ca565b611eca85858585613020565b5050505050565b60135460ff61010090910416600114611f1e5760405162461bcd60e51b815260206004820152600f60248201526e5265726f6c6c20696e61637469766560881b6044820152606401610b5b565b600a5460115410611f635760405162461bcd60e51b815260206004820152600f60248201526e4e6f206d6f7265207265726f6c6c7360881b6044820152606401610b5b565b611f6c81611829565b6001600160a01b0316336001600160a01b031614611fc45760405162461bcd60e51b815260206004820152601560248201527413db9b1e481bdddb995c8818d85b881c995c9bdb1b605a1b6044820152606401610b5b565b34600d5414611fe55760405162461bcd60e51b8152600401610b5b90615303565b601154611ff39060016151ce565b60115542336120038360016151ce565b60405160200161201593929190615236565b60408051601f198184030181529181528151602092830120600084815260189093529120556107e761204561306b565b61204f91906152cd565b6000918252601b602052604090912055565b6060610d6760086120718461308c565b613190565b6060612081826124ed565b6120bf5760405162461bcd60e51b815260206004820152600f60248201526e151bdad95b881b9bdd08199bdd5b99608a1b6044820152606401610b5b565b6000806120cb84613252565b915091506121136120db85613573565b60008681526030602090815260409182902091516120ff93929186918891016154da565b60405160208183030381529060405261369e565b60405160200161212391906156b5565b60405160208183030381529060405292505050919050565b600061111961214985612575565b84848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061380492505050565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b6000546001600160a01b031633146121da5760405162461bcd60e51b8152600401610b5b9061525e565b6001600160a01b03811661223f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b5b565b61116b81612fd0565b6000546001600160a01b031633146122725760405162461bcd60e51b8152600401610b5b9061525e565b600d55565b6000546001600160a01b031633146122a15760405162461bcd60e51b8152600401610b5b9061525e565b600f55565b6000546001600160a01b031633146122d05760405162461bcd60e51b8152600401610b5b9061525e565b601354610100900460ff166001036122ef576013805461ff0019169055565b6013805461ff001916610100179055565b6060816000610e1062015180612317601885615343565b61232390610e106152e4565b61232d90426151ce565b6123379190615343565b61234191906156fa565b90506000603c612353610e1042615343565b61235d91906156fa565b6040805160208082018352600082528251808401845260018152601d60f91b818301528351808501909452600684526520285554432b60d01b918401919091529293509190600c8510156123e4576040518060400160405280600381526020016220414d60e81b8152509250846000036123df576123dc85600c6151ce565b94505b612419565b6040518060400160405280600381526020016220504d60e81b8152509250600c85111561241957612416600c866152cd565b94505b600a841015612440576040518060400160405280600281526020016103a360f41b81525091505b600c861115612480575060408051808201909152600681526520285554432d60d01b6020820152612472600c87615343565b61247d90600c6152cd565b95505b61248985613573565b8261249386613573565b858461249e8b613573565b6040516020016124b39695949392919061570e565b6040516020818303038152906040529650505050505050919050565b6124e9828260405180602001604052806000815250613813565b5050565b600060015482108015610d67575050600090815260056020526040902054600160e01b900460ff161590565b60008281526007602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6040516bffffffffffffffffffffffff19606083901b166020820152600090603401604051602081830303815290604052805190602001209050919050565b60006125c382601454856139d9565b9392505050565b6daaeb6d7670e522a718067333cd4e3b1561116b57604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015612637573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061265b9190615796565b61116b57604051633b79c77360e21b81526001600160a01b0382166004820152602401610b5b565b610cca8383836139ef565b6000818152601860205260408120546060916126ac82600886613be5565b60408051600880825261012082019092529192506000919060208201610100803683375050601f80546040805160208084028201810190925282815294955061277194935083018282801561274857602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff168152602001906002019060208260010104928301926001038202915080841161270f5790505b50505050508360008151811061276057612760615357565b602002602001015161ffff16613d57565b8160008151811061278457612784615357565b61ffff92909216602092830291909101820152805460408051828402810184019091528181526128209290918282018282801561280857602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff16815260200190600201906020826001010492830192600103820291508084116127cf5790505b50505050508360018151811061276057612760615357565b8160018151811061283357612833615357565b61ffff929092166020928302919091018201526021805460408051828502810185019091528181526128d293909291908301828280156128ba57602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff16815260200190600201906020826001010492830192600103820291508084116128815790505b50505050508360028151811061276057612760615357565b816002815181106128e5576128e5615357565b61ffff92909216602092830291909101820152602280546040805182850281018501909152818152612984939092919083018282801561296c57602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff16815260200190600201906020826001010492830192600103820291508084116129335790505b50505050508360038151811061276057612760615357565b8160038151811061299757612997615357565b61ffff92909216602092830291909101820152602380546040805182850281018501909152818152612a369390929190830182828015612a1e57602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff16815260200190600201906020826001010492830192600103820291508084116129e55790505b50505050508360048151811061276057612760615357565b81600481518110612a4957612a49615357565b61ffff92909216602092830291909101820152602480546040805182850281018501909152818152612ae89390929190830182828015612ad057602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff1681526020019060020190602082600101049283019260010382029150808411612a975790505b50505050508360058151811061276057612760615357565b81600581518110612afb57612afb615357565b61ffff92909216602092830291909101820152602580546040805182850281018501909152818152612b9a9390929190830182828015612b8257602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff1681526020019060020190602082600101049283019260010382029150808411612b495790505b50505050508360068151811061276057612760615357565b81600681518110612bad57612bad615357565b61ffff92909216602092830291909101820152602680546040805182850281018501909152818152612c4c9390929190830182828015612c3457602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff1681526020019060020190602082600101049283019260010382029150808411612bfb5790505b50505050508360078151811061276057612760615357565b81600781518110612c5f57612c5f615357565b602002602001019061ffff16908161ffff168152505080600581518110612c8857612c88615357565b602002602001015161ffff16600c03612cc757600181600081518110612cb057612cb0615357565b602002602001019061ffff16908161ffff16815250505b80600081518110612cda57612cda615357565b602002602001015161ffff1660041480612d12575080600081518110612d0257612d02615357565b602002602001015161ffff166005145b80612d3b575080600081518110612d2b57612d2b615357565b602002602001015161ffff166006145b15612d6c57600181600681518110612d5557612d55615357565b602002602001019061ffff16908161ffff16815250505b80600381518110612d7f57612d7f615357565b602002602001015161ffff1660030361111957600181600281518110612da757612da7615357565b602002602001019061ffff16908161ffff1681525050949350505050565b612dcd614cfc565b600082815260186020908152604080832054601a909252822054612e299190612df79060326151ce565b6040805160208101939093528201526060016040516020818303038152906040528051906020012060001c6020613dfb565b905060005b60098111612e9457612e6b612e448260066152e4565b612e4f9060036151ce565b612e5a8360066152e4565b612e659060086151ce565b84613f96565b8382600a8110612e7d57612e7d615357565b602002015280612e8c8161521d565b915050612e2e565b5050919050565b610cca83838360405180602001604052806000815250611ea4565b604080516060810182526000808252602082018190529181019190915281600154811015612fb757600081815260056020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff16151591810182905290612fb55780516001600160a01b031615612f4c579392505050565b5060001901600081815260056020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff1615159281019290925215612fb0579392505050565b612f4c565b505b604051636f96cda160e11b815260040160405180910390fd5b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b61302b8484846139ef565b6001600160a01b0383163b1515801561304d575061304b84848484614073565b155b15611000576040516368d2bf6b60e11b815260040160405180910390fd5b600061307b6301e18558426156fa565b613087906107b26151ce565b905090565b60008061309761306b565b90506000613130601f60070180548060200260200160405190810160405280929190818152602001828054801561311557602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff16815260200190600201906020826001010492830192600103820291508084116130dc5790505b5050506000888152601860205260409020549150613d579050565b61ffff166107dd601b6000878152602001908152602001600020548461315691906152cd565b61316091906152cd565b61316a91906152cd565b9050600a811061317e575060099392505050565b600181116125c3575060019392505050565b6060602783600981106131a5576131a5615357565b0182815481106131b7576131b7615357565b9060005260206000200180546131cc90615293565b80601f01602080910402602001604051908101604052809291908181526020018280546131f890615293565b80156132455780601f1061321a57610100808354040283529160200191613245565b820191906000526020600020905b81548152906001019060200180831161322857829003601f168201915b5050505050905092915050565b6060808260006132618261268e565b9050600061326f828761415e565b905061327a8161369e565b945060606132ce60405180604001604052806004815260200163426f647960e01b8152506132c76000866000815181106132b6576132b6615357565b602002602001015161ffff16613190565b60006149ab565b613309604051806040016040528060078152602001662bb2b0ba3432b960c91b8152506132c76001876001815181106132b6576132b6615357565b6133446040518060400160405280600781526020016622bcb2bbb2b0b960c91b8152506132c76002886002815181106132b6576132b6615357565b61337c604051806040016040528060048152602001634861747360e01b8152506132c76003896003815181106132b6576132b6615357565b6133b36040518060400160405280600381526020016245796560e81b8152506132c760048a6004815181106132b6576132b6615357565b6133ee60405180604001604052806007815260200166436c6f7468657360c81b8152506132c760058b6005815181106132b6576132b6615357565b61342760405180604001604052806005815260200164486169727360d81b8152506132c760068c6006815181106132b6576132b6615357565b60405160200161343d97969594939291906157b3565b604051602081830303815290604052905060008161348d6040518060400160405280600481526020016354696d6560e01b8152506132c7601960008a815260200190815260200160002054612300565b6134b76040518060400160405280600681526020016529b2b0b9b7b760d11b8152506132c7614a0b565b6134e660405180604001604052806005815260200164546965727360d81b8152506132c760086120718c61308c565b6135226040518060400160405280600b81526020016a54656d706f72616c69747960a81b81525061351b60076120718d61308c565b60016149ab565b604051602001613536959493929190615845565b60405160208183030381529060405290508060405160200161355891906158b0565b60405160208183030381529060405295505050505050915091565b60608160000361359a5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156135c457806135ae8161521d565b91506135bd9050600a836156fa565b915061359e565b6000816001600160401b038111156135de576135de615050565b6040519080825280601f01601f191660200182016040528015613608576020820181803683370190505b509050815b85156136955761361e6001826152cd565b9050600061362d600a886156fa565b61363890600a6152e4565b61364290886152cd565b61364d9060306158cc565b905060008160f81b90508084848151811061366a5761366a615357565b60200101906001600160f81b031916908160001a90535061368c600a896156fa565b9750505061360d565b50949350505050565b606081516000036136bd57505060408051602081019091526000815290565b6000604051806060016040528060408152602001615c2960409139905060006003845160026136ec91906151ce565b6136f691906156fa565b6137019060046152e4565b905060006137108260206151ce565b6001600160401b0381111561372757613727615050565b6040519080825280601f01601f191660200182016040528015613751576020820181803683370190505b509050818152600183018586518101602084015b818310156137bf5760039283018051603f601282901c811687015160f890811b8552600c83901c8216880151811b6001860152600683901c8216880151811b60028601529116860151901b93820193909352600401613765565b6003895106600181146137d957600281146137ea576137f6565b613d3d60f01b6001198301526137f6565b603d60f81b6000198301525b509398975050505050505050565b60006125c382601554856139d9565b6001546001600160a01b03841661383c57604051622e076360e81b815260040160405180910390fd5b8260000361385d5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038416600081815260066020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168b0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168b01811690920217909155858452600590925290912080546001600160e01b0319168317600160a01b42909316929092029190911790558190818501903b15613985575b60405182906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a461394e6000878480600101955087614073565b61396b576040516368d2bf6b60e11b815260040160405180910390fd5b80820361390357826001541461398057600080fd5b6139ca565b5b6040516001830192906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808203613986575b50600155611000600085838684565b6000826139e68584614b08565b14949350505050565b60006139fa82612eb6565b9050836001600160a01b031681600001516001600160a01b031614613a315760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0386161480613a4f5750613a4f8533612182565b80613a6a575033613a5f84611006565b6001600160a01b0316145b905080613a8a57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038416613ab157604051633a954ecd60e21b815260040160405180910390fd5b613abd60008487612519565b6001600160a01b038581166000908152600660209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600590945282852080546001600160e01b031916909417600160a01b42909216919091021783558701808452922080549193909116613b91576001548214613b9157805460208601516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4333b15611eca57611eca83614bac565b6060826001600160401b03811115613bff57613bff615050565b604051908082528060200260200182016040528015613c28578160200160208202803683370190505b50905060005b83811015613d4f5780600103613cee57613cc185613c4d8360016151ce565b6000868152601960205260409020546201518090613c6d90601890615343565b613c7990610e106152e4565b613c8390426151ce565b613c8d91906156fa565b60408051602081019490945283019190915260608201526080015b6040516020818303038152906040528051906020012090565b828281518110613cd357613cd3615357565b602002602001019061ffff16908161ffff1681525050613d3d565b613d1485613cfd8360016151ce565b604080516020810193909352820152606001613ca8565b828281518110613d2657613d26615357565b602002602001019061ffff16908161ffff16815250505b80613d478161521d565b915050613c2e565b509392505050565b600080613d6661271084615343565b9050600060015b85518161ffff1611613df5576000868261ffff1681518110613d9157613d91615357565b602002602001015190508281613da791906158f1565b61ffff168461ffff16108015613dc557508261ffff168461ffff1610155b15613dd557509250610d67915050565b613ddf81846158f1565b9250508080613ded90615917565b915050613d6d565b50600080fd5b60606000613e0a8360026152e4565b613e159060026151ce565b6001600160401b03811115613e2c57613e2c615050565b6040519080825280601f01601f191660200182016040528015613e56576020820181803683370190505b509050600360fc1b81600081518110613e7157613e71615357565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110613ea057613ea0615357565b60200101906001600160f81b031916908160001a9053506000613ec48460026152e4565b613ecf9060016151ce565b90505b6001811115613f47576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110613f0357613f03615357565b1a60f81b828281518110613f1957613f19615357565b60200101906001600160f81b031916908160001a90535060049490941c93613f4081615938565b9050613ed2565b5083156125c35760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610b5b565b60606000613fa485856152cd565b613faf9060016151ce565b6001600160401b03811115613fc657613fc6615050565b6040519080825280601f01601f191660200182016040528015613ff0576020820181803683370190505b50905060005b61400086866152cd565b81116136955783600161401388846151ce565b61401d91906152cd565b8151811061402d5761402d615357565b602001015160f81c60f81b82828151811061404a5761404a615357565b60200101906001600160f81b031916908160001a9053508061406b8161521d565b915050613ff6565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906140a890339089908890889060040161594f565b6020604051808303816000875af19250505080156140e3575060408051601f3d908101601f191682019092526140e09181019061598c565b60015b614141573d808015614111576040519150601f19603f3d011682016040523d82523d6000602084013e614116565b606091505b508051600003614139576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b606060006040518060c0016040528060908152602001615b9960909139601e5485516001600160a01b0390911690631020bb629087906000906141a3576141a3615357565b60200260200101516040518263ffffffff1660e01b81526004016141d1919061ffff91909116815260200190565b600060405180830381865afa1580156141ee573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052614216919081019061536d565b601e5486516001600160a01b039091169063b7fd9bfe908890600490811061424057614240615357565b60200260200101516040518263ffffffff1660e01b815260040161426e919061ffff91909116815260200190565b600060405180830381865afa15801561428b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526142b3919081019061536d565b601e5487516001600160a01b0390911690637760d26690899060069081106142dd576142dd615357565b60200260200101516040518263ffffffff1660e01b815260040161430b919061ffff91909116815260200190565b600060405180830381865afa158015614328573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052614350919081019061536d565b601e5488516001600160a01b03909116906369e23213908a90600590811061437a5761437a615357565b602002602001015161438b8a612dc5565b6040518363ffffffff1660e01b81526004016143a89291906153e3565b600060405180830381865afa1580156143c5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526143ed919081019061536d565b601e5489516001600160a01b0390911690633bf9045c908b90600390811061441757614417615357565b60200260200101516144288b612dc5565b6040518363ffffffff1660e01b81526004016144459291906153e3565b600060405180830381865afa158015614462573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261448a919081019061536d565b601e548a516001600160a01b03909116906353dbb7c7908c9060029081106144b4576144b4615357565b60200260200101516040518263ffffffff1660e01b81526004016144e2919061ffff91909116815260200190565b600060405180830381865afa1580156144ff573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052614527919081019061536d565b604051806040016040528060048152602001631e17b39f60e11b81525060405160200161455b9897969594939291906159a9565b60408051808303601f1901815290829052601e54631b7f794d60e11b8352600160048401529092506001600160a01b0316906336fef29a90602401600060405180830381865afa1580156145b3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526145db919081019061536d565b601e5485516001600160a01b039091169063c209f2ae908790600190811061460557614605615357565b602002602001015160196000888152602001908152602001600020546040518363ffffffff1660e01b815260040161464d92919061ffff929092168252602082015260400190565b600060405180830381865afa15801561466a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052614692919081019061536d565b601e546001600160a01b03166384740dde6146ac8761308c565b6040518263ffffffff1660e01b81526004016146ca91815260200190565b600060405180830381865afa1580156146e7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261470f919081019061536d565b601e54875185916001600160a01b03169063940f4897908a90600190811061473957614739615357565b60200260200101516040518263ffffffff1660e01b8152600401614767919061ffff91909116815260200190565b600060405180830381865afa158015614784573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526147ac919081019061536d565b601e546001600160a01b0316630672e85a6147c68a61308c565b6040518263ffffffff1660e01b81526004016147e491815260200190565b600060405180830381865afa158015614801573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052614829919081019061536d565b601e54604051631b7f794d60e11b81526004808201526001600160a01b03909116906336fef29a90602401600060405180830381865afa158015614871573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052614899919081019061536d565b601e54604051631b7f794d60e11b8152600560048201526001600160a01b03909116906336fef29a90602401600060405180830381865afa1580156148e2573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261490a919081019061536d565b601e54604051631b7f794d60e11b8152600260048201526001600160a01b03909116906336fef29a90602401600060405180830381865afa158015614953573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261497b919081019061536d565b60405160200161499399989796959493929190615a4e565b60405160208183030381529060405291505092915050565b6040805180820190915260018152600b60fa1b602082015260609082156149dd57506040805160208101909152600081525b8484826040516020016149f293929190615b0f565b6040516020818303038152906040529150509392505050565b60606000614a1d6301e1855842615343565b60408051602081019091526000815290915062682680821080614a4357506301d4ff1882115b15614a6b57506040805180820190915260068152652bb4b73a32b960d11b6020820152610d67565b626826808210158015614a81575062e2b3f08211155b15614aa95750604080518082019091526006815265537072696e6760d01b6020820152610d67565b62e2b3f082118015614abe575063015d4f7082105b15614ae6575060408051808201909152600681526529bab6b6b2b960d11b6020820152610d67565b5060408051808201909152600481526311985b1b60e21b602082015292915050565b600081815b8451811015613d4f576000858281518110614b2a57614b2a615357565b60200260200101519050808311614b6c576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250614b99565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b5080614ba48161521d565b915050614b0d565b6000614bb661306b565b90506000614c4f601f600701805480602002602001604051908101604052809291908181526020018280548015614c3457602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff1681526020019060020190602082600101049283019260010382029150808411614bfb5790505b5050506000878152601860205260409020549150613d579050565b61ffff166107dd601b60008681526020019081526020016000205484614c7591906152cd565b614c7f91906152cd565b614c8991906152cd565b9050600a8110614cce576000838152601b6020526040902054600890614cb09083906151ce565b614cba91906152cd565b6000848152601b6020526040902055505050565b60018111614ce2575050600052601b602052565b6000838152601b6020526040902054614cba9060016151ce565b604051806101400160405280600a905b6060815260200190600190039081614d0c5790505090565b80356001600160a01b0381168114614d3b57600080fd5b919050565b600060208284031215614d5257600080fd5b6125c382614d24565b60008083601f840112614d6d57600080fd5b5081356001600160401b03811115614d8457600080fd5b6020830191508360208260051b8501011115614d9f57600080fd5b9250929050565b60008060208385031215614db957600080fd5b82356001600160401b03811115614dcf57600080fd5b614ddb85828601614d5b565b90969095509350505050565b6001600160e01b03198116811461116b57600080fd5b600060208284031215614e0f57600080fd5b81356125c381614de7565b60005b83811015614e35578181015183820152602001614e1d565b838111156110005750506000910152565b60008151808452614e5e816020860160208601614e1a565b601f01601f19169290920160200192915050565b6020815260006125c36020830184614e46565b600060208284031215614e9757600080fd5b5035919050565b60008060408385031215614eb157600080fd5b614eba83614d24565b946020939093013593505050565b600080600060408486031215614edd57600080fd5b614ee684614d24565b925060208401356001600160401b03811115614f0157600080fd5b614f0d86828701614d5b565b9497909650939450505050565b600060208284031215614f2c57600080fd5b813560ff811681146125c357600080fd5b600080600060608486031215614f5257600080fd5b614f5b84614d24565b9250614f6960208501614d24565b9150604084013590509250925092565b60008060408385031215614f8c57600080fd5b50508035926020909101359150565b6020808252825182820181905260009190848201906040850190845b81811015614fd357835183529284019291840191600101614fb7565b50909695505050505050565b801515811461116b57600080fd5b6000806040838503121561500057600080fd5b61500983614d24565b9150602083013561501981614fdf565b809150509250929050565b6000806040838503121561503757600080fd5b8235915061504760208401614d24565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561508e5761508e615050565b604052919050565b60006001600160401b038211156150af576150af615050565b50601f01601f191660200190565b600080600080608085870312156150d357600080fd5b6150dc85614d24565b93506150ea60208601614d24565b92506040850135915060608501356001600160401b0381111561510c57600080fd5b8501601f8101871361511d57600080fd5b803561513061512b82615096565b615066565b81815288602083850101111561514557600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b6000806040838503121561517a57600080fd5b61518383614d24565b915061504760208401614d24565b6020808252600d908201526c53616c6520696e61637469766560981b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600082198211156151e1576151e16151b8565b500190565b60208082526017908201527f576f756c6420657863656564206d617820737570706c79000000000000000000604082015260600190565b60006001820161522f5761522f6151b8565b5060010190565b92835260609190911b6bffffffffffffffffffffffff19166020830152603482015260540190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c908216806152a757607f821691505b6020821081036152c757634e487b7160e01b600052602260045260246000fd5b50919050565b6000828210156152df576152df6151b8565b500390565b60008160001904831182151516156152fe576152fe6151b8565b500290565b60208082526010908201526f15dc9bdb99c811551208185b5bdd5b9d60821b604082015260600190565b634e487b7160e01b600052601260045260246000fd5b6000826153525761535261532d565b500690565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561537f57600080fd5b81516001600160401b0381111561539557600080fd5b8201601f810184136153a657600080fd5b80516153b461512b82615096565b8181528560208385010111156153c957600080fd5b6153da826020830160208601614e1a565b95945050505050565b61ffff831681526040602080830182905260009161018084019190840185845b600a81101561543257603f19878603018352615420858351614e46565b94509183019190830190600101615403565b5092979650505050505050565b60008151615451818560208601614e1a565b9290920192915050565b60008751602061546e8285838d01614e1a565b8851918401916154818184848d01614e1a565b88519201916154938184848c01614e1a565b87519201916154a58184848b01614e1a565b86519201916154b78184848a01614e1a565b85519201916154c98184848901614e1a565b919091019998505050505050505050565b717b226e616d65223a224e6f4c61756768202360701b8152845160009060206155098260128601838b01614e1a565b600160fd1b6012928501928301528654601390600090600181811c908083168061553457607f831692505b868310810361555157634e487b7160e01b85526022600452602485fd5b808015615565576001811461557a576155ab565b60ff19851689880152838901870195506155ab565b60008e81526020902060005b858110156155a15781548b82018a0152908401908901615586565b505086848a010195505b50507f222c20226465736372697074696f6e223a20224e6f4c6175676854696d652077845250507f696c6c206c69766520666f7265766572207468726f75676820746865204574686020830152507f657265756d20626c6f636b636861696e20616e642072656d61696e206861707060408201527f7920616e6420667265652e222c2022747261697473223a205b0000000000000060608201526156a761569961569361565b607985018c61543f565b7f5d2c2022696d616765223a22646174613a696d6167652f7376672b786d6c3b62815265185cd94d8d0b60d21b602082015260260190565b8961543f565b61227d60f01b815260020190565b9a9950505050505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008152600082516156ed81601d850160208701614e1a565b91909101601d0192915050565b6000826157095761570961532d565b500490565b6000875160206157218285838d01614e1a565b8851918401916157348184848d01614e1a565b88519201916157468184848c01614e1a565b87519201916157588184848b01614e1a565b865192019161576a8184848a01614e1a565b855192019161577c8184848901614e1a565b602960f81b92019182525060010198975050505050505050565b6000602082840312156157a857600080fd5b81516125c381614fdf565b6000885160206157c68285838e01614e1a565b8951918401916157d98184848e01614e1a565b89519201916157eb8184848d01614e1a565b88519201916157fd8184848c01614e1a565b875192019161580f8184848b01614e1a565b86519201916158218184848a01614e1a565b85519201916158338184848901614e1a565b919091019a9950505050505050505050565b60008651615857818460208b01614e1a565b86519083019061586b818360208b01614e1a565b865191019061587e818360208a01614e1a565b8551910190615891818360208901614e1a565b84519101906158a4818360208801614e1a565b01979650505050505050565b600082516158c2818460208701614e1a565b9190910192915050565b600060ff821660ff84168060ff038211156158e9576158e96151b8565b019392505050565b600061ffff80831681851680830382111561590e5761590e6151b8565b01949350505050565b600061ffff80831681810361592e5761592e6151b8565b6001019392505050565b600081615947576159476151b8565b506000190190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061598290830184614e46565b9695505050505050565b60006020828403121561599e57600080fd5b81516125c381614de7565b6000895160206159bc8285838f01614e1a565b8a51918401916159cf8184848f01614e1a565b8a519201916159e18184848e01614e1a565b89519201916159f38184848d01614e1a565b8851920191615a058184848c01614e1a565b8751920191615a178184848b01614e1a565b8651920191615a298184848a01614e1a565b8551920191615a3b8184848901614e1a565b919091019b9a5050505050505050505050565b60008a51615a60818460208f01614e1a565b8a51615a728183860160208f01614e1a565b8a519184010190615a87818360208e01614e1a565b8951615a998183850160208e01614e1a565b8951929091010190615aaf818360208c01614e1a565b8751615ac18183850160208c01614e1a565b8751929091010190615ad7818360208a01614e1a565b8551615ae98183850160208a01614e1a565b8551929091010190615aff818360208801614e1a565b019b9a5050505050505050505050565b6f3d913a3930b4ba2fba3cb832911d101160811b81528351600090615b3b816010850160208901614e1a565b6c111610113b30b63ab2911d101160991b6010918401918201528451615b6881601d840160208901614e1a565b61227d60f01b601d92909101918201528351615b8b81601f840160208801614e1a565b01601f019594505050505056fe3c7374796c653e23753435207b7472616e736974696f6e2d6475726174696f6e3a2032733b7472616e73666f726d2d6f726967696e3a203335253b7472616e73666f726d2d626f783a66696c6c2d626f783b7d23777437383a686f7665722023753435207b7472616e73666f726d3a207363616c6528312e35293b7d3c2f7374796c653e3c672069643d27753435273e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220206da47c9c7e07cc461c8a56d59f95b9978ac3505502b0099ecf1d497ff53fc664736f6c634300080d0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000004ab96cd0b4c40de069550a271a74795b0570cd59
-----Decoded View---------------
Arg [0] : descriptor_ (address): 0x4Ab96CD0B4C40de069550a271A74795b0570cd59
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000004ab96cd0b4c40de069550a271a74795b0570cd59
Deployed Bytecode Sourcemap
75493:27788:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76830:49;;;;;;;;;;-1:-1:-1;76830:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;529:25:1;;;517:2;502:18;76830:49:0;;;;;;;;90923:583;;;;;;;;;;-1:-1:-1;90923:583:0;;;;;:::i;:::-;;:::i;:::-;;96932:111;;;;;;;;;;-1:-1:-1;96932:111:0;;;;;:::i;:::-;;:::i;39112:305::-;;;;;;;;;;-1:-1:-1;39112:305:0;;;;;:::i;:::-;;:::i;:::-;;;1930:14:1;;1923:22;1905:41;;1893:2;1878:18;39112:305:0;1765:187:1;42225:100:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;90003:853::-;;;;;;:::i;:::-;;:::i;43728:204::-;;;;;;;;;;-1:-1:-1;43728:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;3057:32:1;;;3039:51;;3027:2;3012:18;43728:204:0;2893:203:1;75596:33:0;;;;;;;;;;;;;;;;43291:371;;;;;;;;;;-1:-1:-1;43291:371:0;;;;;:::i;:::-;;:::i;95836:151::-;;;;;;;;;;-1:-1:-1;95836:151:0;;;;;:::i;:::-;;:::i;94266:134::-;;;;;;;;;;-1:-1:-1;94266:134:0;;;;;:::i;:::-;;:::i;38361:303::-;;;;;;;;;;-1:-1:-1;38615:12:0;;38599:13;;:28;38361:303;;75634:39;;;;;;;;;;;;;;;;102479:163;;;;;;;;;;-1:-1:-1;102479:163:0;;;;;:::i;:::-;;:::i;75772:49::-;;;;;;;;;;;;;;;;76886:37;;;;;;;;;;-1:-1:-1;76886:37:0;;;;-1:-1:-1;;;;;76886:37:0;;;92649:439;;;;;;:::i;:::-;;:::i;93094:201::-;;;;;;;;;;-1:-1:-1;93094:201:0;;;;;:::i;:::-;;:::i;76081:32::-;;;;;;;;;;-1:-1:-1;76081:32:0;;;;;;;;;;;;;;5144:4:1;5132:17;;;5114:36;;5102:2;5087:18;76081:32:0;4972:184:1;75872:31:0;;;;;;;;;;;;;;;;87514:530;;;;;;;;;;-1:-1:-1;87514:530:0;;;;;:::i;:::-;;:::i;95308:103::-;;;;;;;;;;-1:-1:-1;95308:103:0;;;;;:::i;:::-;;:::i;68969:143::-;;;;;;;;;;;;61389:42;68969:143;;102650:171;;;;;;;;;;-1:-1:-1;102650:171:0;;;;;:::i;:::-;;:::i;76731:51::-;;;;;;;;;;-1:-1:-1;76731:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;94768:88;;;;;;;;;;-1:-1:-1;94768:88:0;;;;;:::i;:::-;;:::i;75979:26::-;;;;;;;;;;-1:-1:-1;75979:26:0;;;;;;;;42033:125;;;;;;;;;;-1:-1:-1;42033:125:0;;;;;:::i;:::-;;:::i;95585:80::-;;;;;;;;;;-1:-1:-1;95585:80:0;;;;;:::i;:::-;;:::i;94976:99::-;;;;;;;;;;-1:-1:-1;94976:99:0;;;;;:::i;:::-;;:::i;94571:88::-;;;;;;;;;;-1:-1:-1;94571:88:0;;;;;:::i;:::-;;:::i;39481:206::-;;;;;;;;;;-1:-1:-1;39481:206:0;;;;;:::i;:::-;;:::i;34267:94::-;;;;;;;;;;;;;:::i;76217:54::-;;;;;;;;;;-1:-1:-1;76217:54:0;;;;;:::i;:::-;;;;;;;;;;;;;;91570:523;;;;;;;;;;-1:-1:-1;91570:523:0;;;;;:::i;:::-;;:::i;97815:614::-;;;;;;;;;;-1:-1:-1;97815:614:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;95466:113::-;;;:::i;33616:87::-;;;;;;;;;;-1:-1:-1;33662:7:0;33689:6;-1:-1:-1;;;;;33689:6:0;33616:87;;94862:108;;;;;;;;;;-1:-1:-1;94862:108:0;;;;;:::i;:::-;;:::i;75678:42::-;;;;;;;;;;;;;;;;42394:104;;;;;;;;;;;;;:::i;75725:42::-;;;;;;;;;;;;;;;;44004:287;;;;;;;;;;-1:-1:-1;44004:287:0;;;;;:::i;:::-;;:::i;96173:103::-;;;;;;;;;;-1:-1:-1;96173:103:0;;;;;:::i;:::-;;:::i;75910:26::-;;;;;;;;;;;;;;;;95184:116;;;;;;;;;;-1:-1:-1;95184:116:0;;;;;:::i;:::-;;:::i;96282:103::-;;;;;;;;;;-1:-1:-1;96282:103:0;;;;;:::i;:::-;;:::i;89551:424::-;;;;;;;;;;-1:-1:-1;89551:424:0;;;;;:::i;:::-;;:::i;75826:41::-;;;;;;;;;;;;;;;;102829:228;;;;;;;;;;-1:-1:-1;102829:228:0;;;;;:::i;:::-;;:::i;92133:510::-;;;;;;:::i;:::-;;:::i;82800:122::-;;;;;;;;;;-1:-1:-1;82800:122:0;;;;;:::i;:::-;;:::i;75941:31::-;;;;;;;;;;;;;;;;88228:776;;;;;;;;;;-1:-1:-1;88228:776:0;;;;;:::i;:::-;;:::i;75564:27::-;;;;;;;;;;;;;;;;95993:151;;;;;;;;;;-1:-1:-1;95993:151:0;;;;;:::i;:::-;;:::i;44362:164::-;;;;;;;;;;-1:-1:-1;44362:164:0;;;;;:::i;:::-;;:::i;34516:192::-;;;;;;;;;;-1:-1:-1;34516:192:0;;;;;:::i;:::-;;:::i;94665:97::-;;;;;;;;;;-1:-1:-1;94665:97:0;;;;;:::i;:::-;;:::i;95083:93::-;;;;;;;;;;-1:-1:-1;95083:93:0;;;;;:::i;:::-;;:::i;94406:157::-;;;;;;;;;;;;;:::i;81504:745::-;;;;;;;;;;-1:-1:-1;81504:745:0;;;;;:::i;:::-;;:::i;90923:583::-;90982:14;90999:13;38615:12;;38599:13;;:28;;38361:303;90999:13;91027:9;;90982:30;;-1:-1:-1;91027:9:0;;;:14;91019:40;;;;-1:-1:-1;;;91019:40:0;;;;;;;:::i;:::-;;;;;;;;;91088:3;;91074:10;:6;91083:1;91074:10;:::i;:::-;:17;;91066:53;;;;-1:-1:-1;;;91066:53:0;;;;;;;:::i;:::-;91134:35;91150:10;91162:6;;91134:15;:35::i;:::-;91126:63;;;;-1:-1:-1;;;91126:63:0;;10070:2:1;91126:63:0;;;10052:21:1;10109:2;10089:18;;;10082:30;-1:-1:-1;;;10128:18:1;;;10121:45;10183:18;;91126:63:0;9868:339:1;91126:63:0;91221:10;91204:28;;;;:16;:28;;;;;;:33;91196:60;;;;-1:-1:-1;;;91196:60:0;;10414:2:1;91196:60:0;;;10396:21:1;10453:2;10433:18;;;10426:30;-1:-1:-1;;;10472:18:1;;;10465:44;10526:18;;91196:60:0;10212:338:1;91196:60:0;91280:10;91263:28;;;;:16;:28;;;;;:30;;;;;;:::i;:::-;;;;;;91305:9;91300:150;91324:1;91320;:5;91300:150;;;91400:15;91417:10;91429;91438:1;91429:6;:10;:::i;:::-;91383:57;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;91383:57:0;;;;;;;;;91373:68;;91383:57;91373:68;;;;91341:9;91365:77;91351:10;91360:1;91351:6;:10;:::i;:::-;91341:21;;;;;;;;;;;-1:-1:-1;91341:21:0;:101;91327:3;;;;:::i;:::-;;;;91300:150;;;;91456:13;;;91476:24;91486:10;91498:1;91476:9;:24::i;:::-;90975:531;90923:583;;:::o;96932:111::-;33662:7;33689:6;-1:-1:-1;;;;;33689:6:0;19051:10;33836:23;33828:68;;;;-1:-1:-1;;;33828:68:0;;;;;;;:::i;:::-;96997:10:::1;:40:::0;;-1:-1:-1;;;;;;96997:40:0::1;-1:-1:-1::0;;;;;96997:40:0;;;::::1;::::0;;;::::1;::::0;;96932:111::o;39112:305::-;39214:4;-1:-1:-1;;;;;;39251:40:0;;-1:-1:-1;;;39251:40:0;;:105;;-1:-1:-1;;;;;;;39308:48:0;;-1:-1:-1;;;39308:48:0;39251:105;:158;;;-1:-1:-1;;;;;;;;;;1711:40:0;;;39373:36;39231:178;39112:305;-1:-1:-1;;39112:305:0:o;42225:100::-;42279:13;42312:5;42305:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42225:100;:::o;90003:853::-;90065:14;90082:13;38615:12;;38599:13;;:28;;38361:303;90082:13;90155:11;;90140:10;90102:12;90117:34;;;:22;:34;;;;;;90065:30;;-1:-1:-1;90102:12:0;90117:49;;:104;;90210:10;90187:34;;;;:22;:34;;;;;;90173:11;;:48;;90187:34;90173:48;:::i;:::-;90117:104;;;90169:1;90117:104;90102:119;;90228:13;90252:14;90244:4;:22;;:50;;90273:21;90290:4;90273:14;:21;:::i;:::-;90244:50;;;90269:1;90244:50;90309:9;;90228:66;;-1:-1:-1;90309:9:0;;90322:1;90309:14;90301:40;;;;-1:-1:-1;;;90301:40:0;;;;;;;:::i;:::-;90374:22;;90356:14;:40;;90348:61;;;;-1:-1:-1;;;90348:61:0;;12137:2:1;90348:61:0;;;12119:21:1;12176:1;12156:18;;;12149:29;-1:-1:-1;;;12194:18:1;;;12187:38;12242:18;;90348:61:0;11935:331:1;90348:61:0;90451:3;;90424:23;90433:14;90424:6;:23;:::i;:::-;:30;;90416:73;;;;-1:-1:-1;;;90416:73:0;;12473:2:1;90416:73:0;;;12455:21:1;12512:2;12492:18;;;12485:30;12551:32;12531:18;;;12524:60;12601:18;;90416:73:0;12271:354:1;90416:73:0;90526:9;90517:5;90504:10;;:18;;;;:::i;:::-;:31;90496:60;;;;-1:-1:-1;;;90496:60:0;;;;;;;:::i;:::-;90586:10;90563:34;;;;:22;:34;;;;;:52;;90601:14;;90563:34;:52;;90601:14;;90563:52;:::i;:::-;;;;-1:-1:-1;90629:9:0;;-1:-1:-1;90624:163:0;90648:14;90644:1;:18;90624:163;;;90737:15;90754:10;90766;90775:1;90766:6;:10;:::i;:::-;90720:57;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;90720:57:0;;;;;;;;;90710:68;;90720:57;90710:68;;;;90678:9;90702:77;90688:10;90697:1;90688:6;:10;:::i;:::-;90678:21;;;;;;;;;;;-1:-1:-1;90678:21:0;:101;90664:3;;;;:::i;:::-;;;;90624:163;;;;90793:13;;;90813:37;90823:10;90835:14;90813:9;:37::i;:::-;90058:798;;;90003:853;:::o;43728:204::-;43796:7;43821:16;43829:7;43821;:16::i;:::-;43816:64;;43846:34;;-1:-1:-1;;;43846:34:0;;;;;;;;;;;43816:64;-1:-1:-1;43900:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;43900:24:0;;43728:204::o;43291:371::-;43364:13;43380:24;43396:7;43380:15;:24::i;:::-;43364:40;;43425:5;-1:-1:-1;;;;;43419:11:0;:2;-1:-1:-1;;;;;43419:11:0;;43415:48;;43439:24;;-1:-1:-1;;;43439:24:0;;;;;;;;;;;43415:48;19051:10;-1:-1:-1;;;;;43480:21:0;;;;;;:63;;-1:-1:-1;43506:37:0;43523:5;19051:10;44362:164;:::i;43506:37::-;43505:38;43480:63;43476:138;;;43567:35;;-1:-1:-1;;;43567:35:0;;;;;;;;;;;43476:138;43626:28;43635:2;43639:7;43648:5;43626:8;:28::i;95836:151::-;95927:4;95947:34;95957:15;95963:8;95957:5;:15::i;:::-;95974:6;;95947:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;95947:9:0;;-1:-1:-1;;;95947:34:0:i;:::-;95940:41;95836:151;-1:-1:-1;;;;95836:151:0:o;94266:134::-;33662:7;33689:6;-1:-1:-1;;;;;33689:6:0;19051:10;33836:23;33828:68;;;;-1:-1:-1;;;33828:68:0;;;;;;;:::i;:::-;94335:9:::1;::::0;94348:1:::1;94335:9;::::0;;::::1;:14;94331:64:::0;::::1;;94371:9;:22:::0;;-1:-1:-1;;94371:22:0::1;;::::0;::::1;;::::0;;94331:64:::1;94266:134:::0;:::o;102479:163::-;102580:4;-1:-1:-1;;;;;70477:18:0;;70485:10;70477:18;70473:83;;70512:32;70533:10;70512:20;:32::i;:::-;102597:37:::1;102616:4;102622:2;102626:7;102597:18;:37::i;92649:439::-:0;92721:15;;;;;;;;;:20;92713:54;;;;-1:-1:-1;;;92713:54:0;;13350:2:1;92713:54:0;;;13332:21:1;13389:2;13369:18;;;13362:30;-1:-1:-1;;;13408:18:1;;;13401:51;13469:18;;92713:54:0;13148:345:1;92713:54:0;92801:17;;92782:16;;:36;92774:64;;;;-1:-1:-1;;;92774:64:0;;13700:2:1;92774:64:0;;;13682:21:1;13739:2;13719:18;;;13712:30;-1:-1:-1;;;13758:18:1;;;13751:45;13813:18;;92774:64:0;13498:339:1;92774:64:0;92867:17;92875:8;92867:7;:17::i;:::-;-1:-1:-1;;;;;92853:31:0;:10;-1:-1:-1;;;;;92853:31:0;;92845:65;;;;-1:-1:-1;;;92845:65:0;;14044:2:1;92845:65:0;;;14026:21:1;14083:2;14063:18;;;14056:30;-1:-1:-1;;;14102:18:1;;;14095:51;14163:18;;92845:65:0;13842:345:1;92845:65:0;92947:9;92925:18;;:31;92917:60;;;;-1:-1:-1;;;92917:60:0;;;;;;;:::i;:::-;93005:16;;:20;;93024:1;93005:20;:::i;:::-;92986:16;:39;93055:20;;;;:10;:20;;;;;;:24;;93078:1;93055:24;:::i;:::-;93032:20;;;;:10;:20;;;;;;:47;92649:439::o;93094:201::-;93187:17;93195:8;93187:7;:17::i;:::-;-1:-1:-1;;;;;93173:31:0;:10;-1:-1:-1;;;;;93173:31:0;;93165:69;;;;-1:-1:-1;;;93165:69:0;;14394:2:1;93165:69:0;;;14376:21:1;14433:2;14413:18;;;14406:30;14472:27;14452:18;;;14445:55;14517:18;;93165:69:0;14192:349:1;93165:69:0;93272:13;93283:2;93272:8;:13;:::i;:::-;93243:18;;;;:8;:18;;;;;;:43;;;;-1:-1:-1;93094:201:0:o;87514:530::-;87572:12;87613:13;38615:12;;38599:13;;:28;;38361:303;87613:13;87601:8;:25;;87593:51;;;;-1:-1:-1;;;87593:51:0;;14997:2:1;87593:51:0;;;14979:21:1;15036:2;15016:18;;;15009:30;-1:-1:-1;;;15055:18:1;;;15048:43;15108:18;;87593:51:0;14795:337:1;87593:51:0;87651:22;87676:25;87692:8;87676:15;:25::i;:::-;87740:10;;87762:9;;87651:50;;-1:-1:-1;;;;;;87740:10:0;;:21;;87651:50;;87740:10;;87762:9;;;;:::i;:::-;;;;;;;87740:32;;;;;;;;;;;;;;15444:6:1;15432:19;;;;15414:38;;15402:2;15387:18;;15269:189;87740:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;87740:32:0;;;;;;;;;;;;:::i;:::-;87781:10;;87802:9;;-1:-1:-1;;;;;87781:10:0;;;;:20;;87802:6;;87809:1;;87802:9;;;;;;:::i;:::-;;;;;;;87781:31;;;;;;;;;;;;;;15444:6:1;15432:19;;;;15414:38;;15402:2;15387:18;;15269:189;87781:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;87781:31:0;;;;;;;;;;;;:::i;:::-;87821:10;;87844:9;;-1:-1:-1;;;;;87821:10:0;;;;:22;;87844:6;;87851:1;;87844:9;;;;;;:::i;:::-;;;;;;;87821:33;;;;;;;;;;;;;;15444:6:1;15432:19;;;;15414:38;;15402:2;15387:18;;15269:189;87821:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;87821:33:0;;;;;;;;;;;;:::i;:::-;87863:10;;87888:9;;-1:-1:-1;;;;;87863:10:0;;;;:24;;87888:6;;87895:1;;87888:9;;;;;;:::i;:::-;;;;;;;87898:23;87912:8;87898:13;:23::i;:::-;87863:59;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;87863:59:0;;;;;;;;;;;;:::i;:::-;87931:10;;87953:9;;-1:-1:-1;;;;;87931:10:0;;;;:21;;87953:6;;87960:1;;87953:9;;;;;;:::i;:::-;;;;;;;87963:23;87977:8;87963:13;:23::i;:::-;87931:56;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;87931:56:0;;;;;;;;;;;;:::i;:::-;87996:10;;88021:9;;-1:-1:-1;;;;;87996:10:0;;;;:24;;88021:6;;88028:1;;88021:9;;;;;;:::i;:::-;;;;;;;87996:35;;;;;;;;;;;;;;15444:6:1;15432:19;;;;15414:38;;15402:2;15387:18;;15269:189;87996:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;87996:35:0;;;;;;;;;;;;:::i;:::-;87715:323;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;87708:330;;;87514:530;;;:::o;95308:103::-;33662:7;33689:6;-1:-1:-1;;;;;33689:6:0;19051:10;33836:23;33828:68;;;;-1:-1:-1;;;33828:68:0;;;;;;;:::i;:::-;95382:11:::1;:21:::0;95308:103::o;102650:171::-;102755:4;-1:-1:-1;;;;;70477:18:0;;70485:10;70477:18;70473:83;;70512:32;70533:10;70512:20;:32::i;:::-;102772:41:::1;102795:4;102801:2;102805:7;102772:22;:41::i;94768:88::-:0;33662:7;33689:6;-1:-1:-1;;;;;33689:6:0;19051:10;33836:23;33828:68;;;;-1:-1:-1;;;33828:68:0;;;;;;;:::i;:::-;94831:11:::1;:17:::0;94768:88::o;42033:125::-;42097:7;42124:21;42137:7;42124:12;:21::i;:::-;:26;;42033:125;-1:-1:-1;;42033:125:0:o;95585:80::-;33662:7;33689:6;-1:-1:-1;;;;;33689:6:0;19051:10;33836:23;33828:68;;;;-1:-1:-1;;;33828:68:0;;;;;;;:::i;:::-;95647:2:::1;:10:::0;;-1:-1:-1;;;;;;95647:10:0::1;-1:-1:-1::0;;;;;95647:10:0;;;::::1;::::0;;;::::1;::::0;;95585:80::o;94976:99::-;33662:7;33689:6;-1:-1:-1;;;;;33689:6:0;19051:10;33836:23;33828:68;;;;-1:-1:-1;;;33828:68:0;;;;;;;:::i;:::-;95044:17:::1;:23:::0;94976:99::o;94571:88::-;33662:7;33689:6;-1:-1:-1;;;;;33689:6:0;19051:10;33836:23;33828:68;;;;-1:-1:-1;;;33828:68:0;;;;;;;:::i;:::-;94638:3:::1;:13:::0;94571:88::o;39481:206::-;39545:7;-1:-1:-1;;;;;39569:19:0;;39565:60;;39597:28;;-1:-1:-1;;;39597:28:0;;;;;;;;;;;39565:60;-1:-1:-1;;;;;;39651:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;39651:27:0;;39481:206::o;34267:94::-;33662:7;33689:6;-1:-1:-1;;;;;33689:6:0;19051:10;33836:23;33828:68;;;;-1:-1:-1;;;33828:68:0;;;;;;;:::i;:::-;34332:21:::1;34350:1;34332:9;:21::i;:::-;34267:94::o:0;91570:523::-;91629:14;91646:13;38615:12;;38599:13;;:28;;38361:303;91646:13;91674:9;;91629:30;;-1:-1:-1;91674:9:0;;91687:1;91674:14;91666:40;;;;-1:-1:-1;;;91666:40:0;;;;;;;:::i;:::-;91735:3;;91721:10;:6;91730:1;91721:10;:::i;:::-;:17;;91713:53;;;;-1:-1:-1;;;91713:53:0;;;;;;;:::i;:::-;91781:35;91797:10;91809:6;;91781:15;:35::i;:::-;91773:63;;;;-1:-1:-1;;;91773:63:0;;10070:2:1;91773:63:0;;;10052:21:1;10109:2;10089:18;;;10082:30;-1:-1:-1;;;10128:18:1;;;10121:45;10183:18;;91773:63:0;9868:339:1;91773:63:0;91866:10;91851:26;;;;:14;:26;;;;;;:31;91843:58;;;;-1:-1:-1;;;91843:58:0;;10414:2:1;91843:58:0;;;10396:21:1;10453:2;10433:18;;;10426:30;-1:-1:-1;;;10472:18:1;;;10465:44;10526:18;;91843:58:0;10212:338:1;91843:58:0;91923:10;91908:26;;;;:14;:26;;;;;:28;;;;;;:::i;:::-;;;;;;91998:15;92015:10;92027:6;91981:53;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;91981:53:0;;;;;;;;;91971:64;;91981:53;91971:64;;;;91963:73;91943:17;;;:9;:17;;;;;:93;92063:24;92073:10;92085:1;92063:9;:24::i;97815:614::-;97885:16;97914;97933:19;97943:8;97933:9;:19::i;:::-;97914:38;;97963:24;98005:8;-1:-1:-1;;;;;97990:24:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;97990:24:0;;97963:51;;98025:14;98050:20;98073:13;38615:12;;38599:13;;:28;;38361:303;98073:13;98050:36;;98102:9;98097:300;98121:12;98117:1;:16;98097:300;;;98155:12;98170:10;98178:1;98170:7;:10::i;:::-;98155:25;;98199:7;98195:191;;;98245:8;-1:-1:-1;;;;;98231:22:0;:10;98239:1;98231:7;:10::i;:::-;-1:-1:-1;;;;;98231:22:0;;98227:62;;98275:1;98257:7;98265:6;98257:15;;;;;;;;:::i;:::-;;;;;;;;;;:19;98278:8;;;;:::i;:::-;;;;98227:62;98195:191;;;98328:7;98327:8;:38;;;;-1:-1:-1;98339:7:0;98347:12;98358:1;98347:8;:12;:::i;:::-;98339:21;;;;;;;;:::i;:::-;;;;;;;98364:1;98339:26;98327:38;98323:63;;;98369:14;;;;:::i;:::-;;;;98323:63;-1:-1:-1;98135:3:0;;;;:::i;:::-;;;;98097:300;;;-1:-1:-1;98414:7:0;;97815:614;-1:-1:-1;;;;;97815:614:0:o;95466:113::-;33662:7;33689:6;-1:-1:-1;;;;;33689:6:0;19051:10;33836:23;33828:68;;;;-1:-1:-1;;;33828:68:0;;;;;;;:::i;:::-;95539:2:::1;::::0;95531:39:::1;::::0;-1:-1:-1;;;;;95539:2:0;;::::1;::::0;95548:21:::1;95531:39:::0;::::1;;;::::0;95539:2:::1;95531:39:::0;95539:2;95531:39;95548:21;95539:2;95531:39;::::1;;;;;;95523:48;;;::::0;::::1;94862:108:::0;33662:7;33689:6;-1:-1:-1;;;;;33689:6:0;19051:10;33836:23;33828:68;;;;-1:-1:-1;;;33828:68:0;;;;;;;:::i;:::-;94935:18:::1;:27:::0;94862:108::o;42394:104::-;42450:13;42483:7;42476:14;;;;;:::i;44004:287::-;19051:10;-1:-1:-1;;;;;44103:24:0;;;44099:54;;44136:17;;-1:-1:-1;;;44136:17:0;;;;;;;;;;;44099:54;19051:10;44166:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;44166:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;44166:53:0;;;;;;;;;;44235:48;;1905:41:1;;;44166:42:0;;19051:10;44235:48;;1878:18:1;44235:48:0;;;;;;;44004:287;;:::o;96173:103::-;33662:7;33689:6;-1:-1:-1;;;;;33689:6:0;19051:10;33836:23;33828:68;;;;-1:-1:-1;;;33828:68:0;;;;;;;:::i;:::-;96243:13:::1;:27:::0;96173:103::o;95184:116::-;33662:7;33689:6;-1:-1:-1;;;;;33689:6:0;19051:10;33836:23;33828:68;;;;-1:-1:-1;;;33828:68:0;;;;;;;:::i;:::-;95261:22:::1;:31:::0;95184:116::o;96282:103::-;33662:7;33689:6;-1:-1:-1;;;;;33689:6:0;19051:10;33836:23;33828:68;;;;-1:-1:-1;;;33828:68:0;;;;;;;:::i;:::-;96352:13:::1;:27:::0;96282:103::o;89551:424::-;33662:7;33689:6;-1:-1:-1;;;;;33689:6:0;19051:10;33836:23;33828:68;;;;-1:-1:-1;;;33828:68:0;;;;;;;:::i;:::-;89634:14:::1;89651:13;38615:12:::0;;38599:13;;:28;;38361:303;89651:13:::1;89706:3;::::0;89634:30;;-1:-1:-1;89679:23:0::1;89688:14:::0;89634:30;89679:23:::1;:::i;:::-;:30;;89671:66;;;;-1:-1:-1::0;;;89671:66:0::1;;;;;;;:::i;:::-;89749:9;89744:163;89768:14;89764:1;:18;89744:163;;;89857:15;89874:10;89886;89895:1:::0;89886:6;:10:::1;:::i;:::-;89840:57;;;;;;;;;;:::i;:::-;;::::0;;-1:-1:-1;;89840:57:0;;::::1;::::0;;;;;;89830:68;;89840:57:::1;89830:68:::0;;::::1;::::0;89798:9:::1;89822:77;89808:10;89817:1:::0;89808:6;:10:::1;:::i;:::-;89798:21:::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;89798:21:0;:101;89784:3;::::1;::::0;::::1;:::i;:::-;;;;89744:163;;;;89913:13;;;89933:36;89943:9;89954:14;89933:9;:36::i;102829:228::-:0;102980:4;-1:-1:-1;;;;;70477:18:0;;70485:10;70477:18;70473:83;;70512:32;70533:10;70512:20;:32::i;:::-;103002:47:::1;103025:4;103031:2;103035:7;103044:4;103002:22;:47::i;:::-;102829:228:::0;;;;;:::o;92133:510::-;92199:15;;;;;;;;;:20;92191:48;;;;-1:-1:-1;;;92191:48:0;;18522:2:1;92191:48:0;;;18504:21:1;18561:2;18541:18;;;18534:30;-1:-1:-1;;;18580:18:1;;;18573:45;18635:18;;92191:48:0;18320:339:1;92191:48:0;92268:11;;92254;;:25;92246:53;;;;-1:-1:-1;;;92246:53:0;;13700:2:1;92246:53:0;;;13682:21:1;13739:2;13719:18;;;13712:30;-1:-1:-1;;;13758:18:1;;;13751:45;13813:18;;92246:53:0;13498:339:1;92246:53:0;92328:17;92336:8;92328:7;:17::i;:::-;-1:-1:-1;;;;;92314:31:0;:10;-1:-1:-1;;;;;92314:31:0;;92306:65;;;;-1:-1:-1;;;92306:65:0;;14044:2:1;92306:65:0;;;14026:21:1;14083:2;14063:18;;;14056:30;-1:-1:-1;;;14102:18:1;;;14095:51;14163:18;;92306:65:0;13842:345:1;92306:65:0;92402:9;92386:12;;:25;92378:54;;;;-1:-1:-1;;;92378:54:0;;;;;;;:::i;:::-;92455:11;;:15;;92469:1;92455:15;:::i;:::-;92441:11;:29;92534:15;92551:10;92563:12;:8;92574:1;92563:12;:::i;:::-;92517:59;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;92517:59:0;;;;;;;;;92507:70;;92517:59;92507:70;;;;92499:79;92477:19;;;:9;:19;;;;;:101;92632:4;92622:7;:5;:7::i;:::-;:14;;;;:::i;:::-;92585:26;;;;:16;:26;;;;;;:52;92133:510::o;82800:122::-;82854:13;82883:33;82893:1;82896:19;82906:8;82896:9;:19::i;:::-;82883:9;:33::i;88228:776::-;88301:13;88331:16;88339:7;88331;:16::i;:::-;88323:44;;;;-1:-1:-1;;;88323:44:0;;18866:2:1;88323:44:0;;;18848:21:1;18905:2;18885:18;;;18878:30;-1:-1:-1;;;18924:18:1;;;18917:45;18979:18;;88323:44:0;18664:339:1;88323:44:0;88375:17;88394:24;88422:18;88432:7;88422:9;:18::i;:::-;88374:66;;;;88553:425;88644:17;88653:7;88644:8;:17::i;:::-;88666:19;;;;:10;:19;;;;;;;;;88574:391;;;;;88666:19;88842:10;;88926:3;;88574:391;;:::i;:::-;;;;;;;;;;;;;88553:6;:425::i;:::-;88480:509;;;;;;;;:::i;:::-;;;;;;;;;;;;;88449:549;;;;88228:776;;;:::o;95993:151::-;96084:4;96104:34;96114:15;96120:8;96114:5;:15::i;:::-;96131:6;;96104:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;96104:9:0;;-1:-1:-1;;;96104:34:0:i;44362:164::-;-1:-1:-1;;;;;44483:25:0;;;44459:4;44483:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;44362:164::o;34516:192::-;33662:7;33689:6;-1:-1:-1;;;;;33689:6:0;19051:10;33836:23;33828:68;;;;-1:-1:-1;;;33828:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34605:22:0;::::1;34597:73;;;::::0;-1:-1:-1;;;34597:73:0;;22792:2:1;34597:73:0::1;::::0;::::1;22774:21:1::0;22831:2;22811:18;;;22804:30;22870:34;22850:18;;;22843:62;-1:-1:-1;;;22921:18:1;;;22914:36;22967:19;;34597:73:0::1;22590:402:1::0;34597:73:0::1;34681:19;34691:8;34681:9;:19::i;94665:97::-:0;33662:7;33689:6;-1:-1:-1;;;;;33689:6:0;19051:10;33836:23;33828:68;;;;-1:-1:-1;;;33828:68:0;;;;;;;:::i;:::-;94733:12:::1;:21:::0;94665:97::o;95083:93::-;33662:7;33689:6;-1:-1:-1;;;;;33689:6:0;19051:10;33836:23;33828:68;;;;-1:-1:-1;;;33828:68:0;;;;;;;:::i;:::-;95149:10:::1;:19:::0;95083:93::o;94406:157::-;33662:7;33689:6;-1:-1:-1;;;;;33689:6:0;19051:10;33836:23;33828:68;;;;-1:-1:-1;;;33828:68:0;;;;;;;:::i;:::-;94467:15:::1;::::0;::::1;::::0;::::1;;;;:20:::0;94463:95:::1;;94498:15;:19:::0;;-1:-1:-1;;94498:19:0::1;::::0;;34267:94::o;94463:95::-:1;94537:15;:19:::0;;-1:-1:-1;;94537:19:0::1;;;::::0;;94406:157::o;81504:745::-;81557:13;81597:5;81581:13;81689:4;81680:5;81657:10;81665:2;81597:5;81657:10;:::i;:::-;81656:19;;81671:4;81656:19;:::i;:::-;81637:39;;:15;:39;:::i;:::-;81636:49;;;;:::i;:::-;81635:58;;;;:::i;:::-;81611:83;-1:-1:-1;81703:13:0;81754:2;81728:22;81746:4;81728:15;:22;:::i;:::-;81727:29;;;;:::i;:::-;81766:22;;;;;;;;;:17;:22;;81797:21;;;;;;;;;;-1:-1:-1;;;81797:21:0;;;;81827:27;;;;;;;;;;;-1:-1:-1;;;81827:27:0;;;;;;;81703:54;;-1:-1:-1;81766:22:0;81797:21;81875:2;81867:10;;81863:178;;;81892:11;;;;;;;;;;;;;-1:-1:-1;;;81892:11:0;;;;;81920:5;81929:1;81920:10;81916:37;;81941:10;:5;81949:2;81941:10;:::i;:::-;81933:18;;81916:37;81863:178;;;81980:11;;;;;;;;;;;;;-1:-1:-1;;;81980:11:0;;;;;82016:2;82008:5;:10;82004:36;;;82028:10;82036:2;82028:5;:10;:::i;:::-;82020:18;;82004:36;82061:2;82053:5;:10;82049:28;;;82066:9;;;;;;;;;;;;;-1:-1:-1;;;82066:9:0;;;;;82049:28;82097:2;82089:5;:10;82085:55;;;-1:-1:-1;82101:13:0;;;;;;;;;;;;-1:-1:-1;;;82101:13:0;;;;82127:10;82135:2;82127:5;:10;:::i;:::-;82123:15;;:2;:15;:::i;:::-;82115:23;;82085:55;82179:15;82188:5;82179:8;:15::i;:::-;82195:2;82198:15;82207:5;82198:8;:15::i;:::-;82214:3;82218;82222:15;82231:5;82222:8;:15::i;:::-;82162:80;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;82148:95;;;;;;;;81504:745;;;:::o;46046:104::-;46115:27;46125:2;46129:8;46115:27;;;;;;;;;;;;:9;:27::i;:::-;46046:104;;:::o;45788:174::-;45845:4;45909:13;;45899:7;:23;45869:85;;;;-1:-1:-1;;45927:20:0;;;;:11;:20;;;;;:27;-1:-1:-1;;;45927:27:0;;;;45926:28;;45788:174::o;55112:196::-;55227:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;55227:29:0;-1:-1:-1;;;;;55227:29:0;;;;;;;;;55272:28;;55227:24;;55272:28;;;;;;;55112:196;;;:::o;96430:122::-;96519:26;;-1:-1:-1;;24696:2:1;24692:15;;;24688:53;96519:26:0;;;24676:66:1;96486:7:0;;24758:12:1;;96519:26:0;;;;;;;;;;;;96509:37;;;;;;96502:44;;96430:122;;;:::o;96577:156::-;96659:4;96679:48;96698:6;96706:13;;96721:5;96679:18;:48::i;:::-;96672:55;96577:156;-1:-1:-1;;;96577:156:0:o;70894:647::-;61389:42;71085:45;:49;71081:453;;71384:67;;-1:-1:-1;;;71384:67:0;;71435:4;71384:67;;;24993:34:1;-1:-1:-1;;;;;25063:15:1;;25043:18;;;25036:43;61389:42:0;;71384;;24928:18:1;;71384:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;71379:144;;71479:28;;-1:-1:-1;;;71479:28:0;;-1:-1:-1;;;;;3057:32:1;;71479:28:0;;;3039:51:1;3012:18;;71479:28:0;2893:203:1;44593:170:0;44727:28;44737:4;44743:2;44747:7;44727:9;:28::i;83120:1046::-;83208:12;83223:18;;;:9;:18;;;;;;83185:15;;83279:24;83223:18;83292:1;83233:7;83279:6;:24::i;:::-;83335:15;;;83348:1;83335:15;;;;;;;;;83248:55;;-1:-1:-1;83310:22:0;;83335:15;;;;;;;;;-1:-1:-1;;83386:8:0;83371:44;;;;;;;;;;;;;;;;;;;83310:40;;-1:-1:-1;83371:44:0;;;-1:-1:-1;83371:44:0;;83386:8;83371:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;83399:12;83412:1;83399:15;;;;;;;;:::i;:::-;;;;;;;83371:44;;:14;:44::i;:::-;83359:6;83366:1;83359:9;;;;;;;;:::i;:::-;:56;;;;;:9;;;;;;;;;;:56;83434:44;;;;;;;;;;;;;;;;;;;;;;;;;83359:9;83434:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;83462:12;83475:1;83462:15;;;;;;;;:::i;83434:44::-;83422:6;83429:1;83422:9;;;;;;;;:::i;:::-;:56;;;;;:9;;;;;;;;;;:56;83512:11;83497:44;;;;;;;;;;;;;;;;;;;;;;83512:11;83497:44;;;83512:11;83497:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;83525:12;83538:1;83525:15;;;;;;;;:::i;83497:44::-;83485:6;83492:1;83485:9;;;;;;;;:::i;:::-;:56;;;;;:9;;;;;;;;;;:56;83575:11;83560:44;;;;;;;;;;;;;;;;;;;;;;83575:11;83560:44;;;83575:11;83560:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;83588:12;83601:1;83588:15;;;;;;;;:::i;83560:44::-;83548:6;83555:1;83548:9;;;;;;;;:::i;:::-;:56;;;;;:9;;;;;;;;;;:56;83638:11;83623:44;;;;;;;;;;;;;;;;;;;;;;83638:11;83623:44;;;83638:11;83623:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;83651:12;83664:1;83651:15;;;;;;;;:::i;83623:44::-;83611:6;83618:1;83611:9;;;;;;;;:::i;:::-;:56;;;;;:9;;;;;;;;;;:56;83701:11;83686:44;;;;;;;;;;;;;;;;;;;;;;83701:11;83686:44;;;83701:11;83686:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;83714:12;83727:1;83714:15;;;;;;;;:::i;83686:44::-;83674:6;83681:1;83674:9;;;;;;;;:::i;:::-;:56;;;;;:9;;;;;;;;;;:56;83764:11;83749:44;;;;;;;;;;;;;;;;;;;;;;83764:11;83749:44;;;83764:11;83749:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;83777:12;83790:1;83777:15;;;;;;;;:::i;83749:44::-;83737:6;83744:1;83737:9;;;;;;;;:::i;:::-;:56;;;;;:9;;;;;;;;;;:56;83827:11;83812:44;;;;;;;;;;;;;;;;;;;;;;83827:11;83812:44;;;83827:11;83812:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;83840:12;83853:1;83840:15;;;;;;;;:::i;83812:44::-;83800:6;83807:1;83800:9;;;;;;;;:::i;:::-;;;;;;:56;;;;;;;;;;;83869:6;83876:1;83869:9;;;;;;;;:::i;:::-;;;;;;;:15;;83882:2;83869:15;83865:51;;83907:1;83895:6;83902:1;83895:9;;;;;;;;:::i;:::-;;;;;;:13;;;;;;;;;;;83865:51;83948:6;83955:1;83948:9;;;;;;;;:::i;:::-;;;;;;;:14;;83961:1;83948:14;:32;;;;83966:6;83973:1;83966:9;;;;;;;;:::i;:::-;;;;;;;:14;;83979:1;83966:14;83948:32;:50;;;;83984:6;83991:1;83984:9;;;;;;;;:::i;:::-;;;;;;;:14;;83997:1;83984:14;83948:50;83944:86;;;84021:1;84009:6;84016:1;84009:9;;;;;;;;:::i;:::-;;;;;;:13;;;;;;;;;;;83944:86;84070:6;84077:1;84070:9;;;;;;;;:::i;:::-;;;;;;;:14;;84083:1;84070:14;84066:50;;84107:1;84095:6;84102:1;84095:9;;;;;;;;:::i;:::-;;;;;;:13;;;;;;;;;;;84156:6;83120:1046;-1:-1:-1;;;;83120:1046:0:o;93773:360::-;93837:27;;:::i;:::-;93875:18;93945:19;;;:9;:19;;;;;;;;;93972:10;:20;;;;;;93896:104;;93945:19;93967:25;;:2;:25;:::i;:::-;93934:59;;;;;;25514:25:1;;;;25555:18;;25548:34;25487:18;;93934:59:0;;;;;;;;;;;;93924:70;;;;;;93916:79;;93997:2;93896:19;:104::i;:::-;93875:125;;94013:6;94009:94;94025:1;94022;:4;94009:94;;94066:26;94075:3;94077:1;94075;:3;:::i;:::-;:5;;94079:1;94075:5;:::i;:::-;94081:3;94083:1;94081;:3;:::i;:::-;:5;;94085:1;94081:5;:::i;:::-;94087:4;94066:8;:26::i;:::-;94044:9;94054:1;94044:12;;;;;;;:::i;:::-;;;;:49;94027:3;;;;:::i;:::-;;;;94009:94;;;;94111:16;93773:360;;;:::o;44834:185::-;44972:39;44989:4;44995:2;44999:7;44972:39;;;;;;;;;;;;:16;:39::i;40862:1109::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;40973:7:0;41056:13;;41049:4;:20;41018:886;;;41090:31;41124:17;;;:11;:17;;;;;;;;;41090:51;;;;;;;;;-1:-1:-1;;;;;41090:51:0;;;;-1:-1:-1;;;41090:51:0;;-1:-1:-1;;;;;41090:51:0;;;;;;;;-1:-1:-1;;;41090:51:0;;;;;;;;;;;;;;41160:729;;41210:14;;-1:-1:-1;;;;;41210:28:0;;41206:101;;41274:9;40862:1109;-1:-1:-1;;;40862:1109:0:o;41206:101::-;-1:-1:-1;;;41649:6:0;41694:17;;;;:11;:17;;;;;;;;;41682:29;;;;;;;;;-1:-1:-1;;;;;41682:29:0;;;;;-1:-1:-1;;;41682:29:0;;-1:-1:-1;;;;;41682:29:0;;;;;;;;-1:-1:-1;;;41682:29:0;;;;;;;;;;;;;41742:28;41738:109;;41810:9;40862:1109;-1:-1:-1;;;40862:1109:0:o;41738:109::-;41609:261;;;41071:833;41018:886;41932:31;;-1:-1:-1;;;41932:31:0;;;;;;;;;;;34716:173;34772:16;34791:6;;-1:-1:-1;;;;;34808:17:0;;;-1:-1:-1;;;;;;34808:17:0;;;;;;34841:40;;34791:6;;;;;;;34841:40;;34772:16;34841:40;34761:128;34716:173;:::o;45090:369::-;45257:28;45267:4;45273:2;45277:7;45257:9;:28::i;:::-;-1:-1:-1;;;;;45300:13:0;;10384:20;10432:8;;45300:76;;;;;45320:56;45351:4;45357:2;45361:7;45370:5;45320:30;:56::i;:::-;45319:57;45300:76;45296:156;;;45400:40;;-1:-1:-1;;;45400:40:0;;;;;;;;;;;82681:113;82721:7;82753:26;82771:8;82753:15;:26;:::i;:::-;82752:35;;82783:4;82752:35;:::i;:::-;82737:51;;82681:113;:::o;101948:408::-;102007:7;102025:16;102044:7;:5;:7::i;:::-;102025:26;-1:-1:-1;102060:14:0;102123:47;102138:8;102147:1;102138:11;102123:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;102151:18:0;;;;:9;:18;;;;;;;-1:-1:-1;102123:14:0;;-1:-1:-1;102123:47:0:i;:::-;102077:93;;102116:4;102088:16;:25;102105:7;102088:25;;;;;;;;;;;;102077:8;:36;;;;:::i;:::-;:43;;;;:::i;:::-;:93;;;;:::i;:::-;102060:110;;102193:2;102183:6;:12;102179:170;;-1:-1:-1;102223:1:0;;101948:408;-1:-1:-1;;;101948:408:0:o;102179:170::-;102262:1;102252:6;:11;102248:101;;-1:-1:-1;102291:1:0;;101948:408;-1:-1:-1;;;101948:408:0:o;81363:135::-;81436:13;81465:12;81478:6;81465:20;;;;;;;:::i;:::-;;81486:5;81465:27;;;;;;;;:::i;:::-;;;;;;;;81458:34;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;81363:135;;;;:::o;84531:1347::-;84590:17;;84661:7;84642:16;84700:24;84661:7;84700:15;:24::i;:::-;84675:49;;84752:17;84772:55;84798:6;84813:7;84772:17;:55::i;:::-;84752:75;;84842:12;84849:4;84842:6;:12::i;:::-;84836:18;;84980:24;85050:48;;;;;;;;;;;;;;-1:-1:-1;;;85050:48:0;;;85071:23;85081:1;85084:6;85091:1;85084:9;;;;;;;;:::i;:::-;;;;;;;85071:23;;:9;:23::i;:::-;85096:1;85050:12;:48::i;:::-;85107:51;;;;;;;;;;;;;;-1:-1:-1;;;85107:51:0;;;85131:23;85141:1;85144:6;85151:1;85144:9;;;;;;;;:::i;85107:51::-;85167;;;;;;;;;;;;;;-1:-1:-1;;;85167:51:0;;;85191:23;85201:1;85204:6;85211:1;85204:9;;;;;;;;:::i;85167:51::-;85227:48;;;;;;;;;;;;;;-1:-1:-1;;;85227:48:0;;;85248:23;85258:1;85261:6;85268:1;85261:9;;;;;;;;:::i;85227:48::-;85284:47;;;;;;;;;;;;;;-1:-1:-1;;;85284:47:0;;;85304:23;85314:1;85317:6;85324:1;85317:9;;;;;;;;:::i;85284:47::-;85340:51;;;;;;;;;;;;;;-1:-1:-1;;;85340:51:0;;;85364:23;85374:1;85377:6;85384:1;85377:9;;;;;;;;:::i;85340:51::-;85400:49;;;;;;;;;;;;;;-1:-1:-1;;;85400:49:0;;;85422:23;85432:1;85435:6;85442:1;85435:9;;;;;;;;:::i;85400:49::-;85025:431;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;85011:445;;85463:24;85515:11;85535:52;;;;;;;;;;;;;;-1:-1:-1;;;85535:52:0;;;85556:27;85564:8;:18;85573:8;85564:18;;;;;;;;;;;;85556:7;:27::i;85535:52::-;85596:36;;;;;;;;;;;;;;-1:-1:-1;;;85596:36:0;;;85619:9;:7;:9::i;85596:36::-;85641:58;;;;;;;;;;;;;;-1:-1:-1;;;85641:58:0;;;85663:33;85673:1;85676:19;85686:8;85676:9;:19::i;85641:58::-;85708:65;;;;;;;;;;;;;;-1:-1:-1;;;85708:65:0;;;85736:33;85746:1;85749:19;85759:8;85749:9;:19::i;85736:33::-;85771:1;85708:12;:65::i;:::-;85490:290;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;85463:317;;85824:11;85807:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;85787:50;;85848:24;;;;;84531:1347;;;:::o;98482:498::-;98535:27;98578:2;98584:1;98578:7;98574:40;;-1:-1:-1;;98596:10:0;;;;;;;;;;;;-1:-1:-1;;;98596:10:0;;;;;98482:498::o;98574:40::-;98632:2;98620:9;98659:53;98666:6;;98659:53;;98683:5;;;;:::i;:::-;;-1:-1:-1;98697:7:0;;-1:-1:-1;98702:2:0;98697:7;;:::i;:::-;;;98659:53;;;98718:17;98748:3;-1:-1:-1;;;;;98738:14:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;98738:14:0;-1:-1:-1;98718:34:0;-1:-1:-1;98771:3:0;98781:168;98788:7;;98781:168;;98810:5;98814:1;98810;:5;:::i;:::-;98806:9;-1:-1:-1;98824:10:0;98855:7;98860:2;98855;:7;:::i;:::-;98854:14;;98866:2;98854:14;:::i;:::-;98849:19;;:2;:19;:::i;:::-;98838:31;;:2;:31;:::i;:::-;98824:46;;98879:9;98898:4;98891:12;;98879:24;;98922:2;98912:4;98917:1;98912:7;;;;;;;;:::i;:::-;;;;:12;-1:-1:-1;;;;;98912:12:0;;;;;;;;-1:-1:-1;98933:8:0;98939:2;98933:8;;:::i;:::-;;;98797:152;;98781:168;;;-1:-1:-1;98969:4:0;98482:498;-1:-1:-1;;;;98482:498:0:o;99213:2037::-;99271:13;99301:4;:11;99316:1;99301:16;99297:31;;-1:-1:-1;;99319:9:0;;;;;;;;;-1:-1:-1;99319:9:0;;;99213:2037::o;99297:31::-;99388:19;99410:5;;;;;;;;;;;;;;;;;99388:27;;99467:18;99513:1;99494:4;:11;99508:1;99494:15;;;;:::i;:::-;99493:21;;;;:::i;:::-;99488:27;;:1;:27;:::i;:::-;99467:48;-1:-1:-1;99598:20:0;99632:15;99467:48;99645:2;99632:15;:::i;:::-;-1:-1:-1;;;;;99621:27:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;99621:27:0;;99598:50;;99745:10;99737:6;99730:26;99852:1;99845:5;99841:13;99923:4;99974;99968:11;99959:7;99955:25;100082:2;100074:6;100070:15;100167:810;100186:6;100177:7;100174:19;100167:810;;;100252:1;100239:15;;;100333:14;;100486:4;100474:2;100470:14;;;100466:25;;100452:40;;100446:47;100441:3;100437:57;;;100419:76;;100614:2;100610:14;;;100606:25;;100592:40;;100586:47;100577:57;;100540:1;100525:17;;100559:76;100755:1;100750:14;;;100746:25;;100732:40;;100726:47;100717:57;;100665:17;;;100699:76;100886:25;;100872:40;;100866:47;100857:57;;100805:17;;;100839:76;;;;100945:17;;100167:810;;;101062:1;101055:4;101049:11;101045:19;101083:1;101078:54;;;;101151:1;101146:52;;;;101038:160;;101078:54;-1:-1:-1;;;;;101094:17:0;;101087:43;101078:54;;101146:52;-1:-1:-1;;;;;101162:17:0;;101155:41;101038:160;-1:-1:-1;101236:6:0;;99213:2037;-1:-1:-1;;;;;;;;99213:2037:0:o;96739:156::-;96821:4;96841:48;96860:6;96868:13;;96883:5;96841:18;:48::i;46524:1751::-;46670:13;;-1:-1:-1;;;;;46698:16:0;;46694:48;;46723:19;;-1:-1:-1;;;46723:19:0;;;;;;;;;;;46694:48;46757:8;46769:1;46757:13;46753:44;;46779:18;;-1:-1:-1;;;46779:18:0;;;;;;;;;;;46753:44;-1:-1:-1;;;;;47148:16:0;;;;;;:12;:16;;;;;;;;:44;;-1:-1:-1;;47207:49:0;;-1:-1:-1;;;;;47148:44:0;;;;;;;47207:49;;;;-1:-1:-1;;47148:44:0;;;;;;47207:49;;;;;;;;;;;;;;;;47273:25;;;:11;:25;;;;;;:35;;-1:-1:-1;;;;;;47323:66:0;;;-1:-1:-1;;;47373:15:0;47323:66;;;;;;;;;;;;;47273:25;;47470:23;;;;10384:20;10432:8;47510:633;;47550:314;47581:38;;47606:12;;-1:-1:-1;;;;;47581:38:0;;;47598:1;;47581:38;;47598:1;;47581:38;47647:69;47686:1;47690:2;47694:14;;;;;;47710:5;47647:30;:69::i;:::-;47642:174;;47752:40;;-1:-1:-1;;;47752:40:0;;;;;;;;;;;47642:174;47859:3;47843:12;:19;47550:314;;47945:12;47928:13;;:29;47924:43;;47959:8;;;47924:43;47510:633;;;48008:120;48039:40;;48064:14;;;;;-1:-1:-1;;;;;48039:40:0;;;48056:1;;48039:40;;48056:1;;48039:40;48123:3;48107:12;:19;48008:120;;47510:633;-1:-1:-1;48157:13:0;:28;48207:60;48236:1;48240:2;48244:12;48258:8;48207:60;:::i;59922:190::-;60047:4;60100;60071:25;60084:5;60091:4;60071:12;:25::i;:::-;:33;;59922:190;-1:-1:-1;;;;59922:190:0:o;49962:2228::-;50077:35;50115:21;50128:7;50115:12;:21::i;:::-;50077:59;;50175:4;-1:-1:-1;;;;;50153:26:0;:13;:18;;;-1:-1:-1;;;;;50153:26:0;;50149:67;;50188:28;;-1:-1:-1;;;50188:28:0;;;;;;;;;;;50149:67;50229:22;19051:10;-1:-1:-1;;;;;50255:20:0;;;;:73;;-1:-1:-1;50292:36:0;50309:4;19051:10;44362:164;:::i;50292:36::-;50255:126;;;-1:-1:-1;19051:10:0;50345:20;50357:7;50345:11;:20::i;:::-;-1:-1:-1;;;;;50345:36:0;;50255:126;50229:153;;50400:17;50395:66;;50426:35;;-1:-1:-1;;;50426:35:0;;;;;;;;;;;50395:66;-1:-1:-1;;;;;50476:16:0;;50472:52;;50501:23;;-1:-1:-1;;;50501:23:0;;;;;;;;;;;50472:52;50645:35;50662:1;50666:7;50675:4;50645:8;:35::i;:::-;-1:-1:-1;;;;;50976:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;50976:31:0;;;-1:-1:-1;;;;;50976:31:0;;;-1:-1:-1;;50976:31:0;;;;;;;51022:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;51022:29:0;;;;;;;;;;;51102:20;;;:11;:20;;;;;;51137:18;;-1:-1:-1;;;;;;51170:49:0;;;;-1:-1:-1;;;51203:15:0;51170:49;;;;;;;;;;51493:11;;51553:24;;;;;51596:13;;51102:20;;51553:24;;51596:13;51592:384;;51806:13;;51791:11;:28;51787:174;;51844:20;;51913:28;;;;-1:-1:-1;;;;;51887:54:0;-1:-1:-1;;;51887:54:0;-1:-1:-1;;;;;;51887:54:0;;;-1:-1:-1;;;;;51844:20:0;;51887:54;;;;51787:174;50951:1036;;;52023:7;52019:2;-1:-1:-1;;;;;52004:27:0;52013:4;-1:-1:-1;;;;;52004:27:0;;;;;;;;;;;52107:10;10384:20;10432:8;52095:88;;52146:25;52163:7;52146:16;:25::i;97104:526::-;97194:30;97266:1;-1:-1:-1;;;;;97253:15:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;97253:15:0;;97236:32;;97280:9;97275:322;97299:1;97295;:5;97275:322;;;97320:1;97325;97320:6;97316:274;;97359:130;97391:13;97406:5;:1;97410;97406:5;:::i;:::-;97443:18;;;;:8;:18;;;;;;97480:5;;97435:32;;97465:2;;97435:32;:::i;:::-;97434:41;;97471:4;97434:41;:::i;:::-;97415:61;;:15;:61;:::i;:::-;97414:71;;;;:::i;:::-;97380:107;;;;;;28770:25:1;;;;28811:18;;28804:34;;;;28854:18;;;28847:34;28743:18;;97380:107:0;;;;;;;;;;;;;97370:118;;;;;;97759:2;97668:101;97359:130;97339:14;97354:1;97339:17;;;;;;;;:::i;:::-;;;;;;:150;;;;;;;;;;;97316:274;;;97533:55;97565:13;97580:5;:1;97584;97580:5;:::i;:::-;97554:32;;;;;;25514:25:1;;;;25555:18;;25548:34;25487:18;;97554:32:0;25340:248:1;97533:55:0;97513:14;97528:1;97513:17;;;;;;;;:::i;:::-;;;;;;:75;;;;;;;;;;;97316:274;97302:3;;;;:::i;:::-;;;;97275:322;;;;97104:526;;;;;:::o;85983:501::-;86101:12;;86148:20;86163:5;86148:12;:20;:::i;:::-;86122:47;-1:-1:-1;86176:17:0;86216:1;86200:264;86224:17;:24;86219:1;:29;;;86200:264;;86264:17;86284;86302:1;86284:20;;;;;;;;;;:::i;:::-;;;;;;;86264:40;;86344:10;86331;:23;;;;:::i;:::-;86319:35;;:9;:35;;;:62;;;;;86371:10;86358:23;;:9;:23;;;;86319:62;86315:97;;;-1:-1:-1;86401:1:0;-1:-1:-1;86394:8:0;;-1:-1:-1;;86394:8:0;86315:97;86433:23;86446:10;86433;:23;:::i;:::-;86420:36;;86255:209;86250:3;;;;;:::i;:::-;;;;86200:264;;;;86470:8;;;8837:451;8912:13;8938:19;8970:10;8974:6;8970:1;:10;:::i;:::-;:14;;8983:1;8970:14;:::i;:::-;-1:-1:-1;;;;;8960:25:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8960:25:0;;8938:47;;-1:-1:-1;;;8996:6:0;9003:1;8996:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;8996:15:0;;;;;;;;;-1:-1:-1;;;9022:6:0;9029:1;9022:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;9022:15:0;;;;;;;;-1:-1:-1;9053:9:0;9065:10;9069:6;9065:1;:10;:::i;:::-;:14;;9078:1;9065:14;:::i;:::-;9053:26;;9048:135;9085:1;9081;:5;9048:135;;;-1:-1:-1;;;9133:5:0;9141:3;9133:11;9120:25;;;;;;;:::i;:::-;;;;9108:6;9115:1;9108:9;;;;;;;;:::i;:::-;;;;:37;-1:-1:-1;;;;;9108:37:0;;;;;;;;-1:-1:-1;9170:1:0;9160:11;;;;;9088:3;;;:::i;:::-;;;9048:135;;;-1:-1:-1;9201:10:0;;9193:55;;;;-1:-1:-1;;;9193:55:0;;29666:2:1;9193:55:0;;;29648:21:1;;;29685:18;;;29678:30;29744:34;29724:18;;;29717:62;29796:18;;9193:55:0;29464:356:1;93437:291:0;93526:13;93552:14;93579:9;93583:5;93579:3;:9;:::i;:::-;:11;;93589:1;93579:11;:::i;:::-;-1:-1:-1;;;;;93569:22:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;93569:22:0;;93552:39;;93606:6;93602:86;93618:9;93622:5;93618:3;:9;:::i;:::-;93615:1;:12;93602:86;;93660:4;93674:1;93666:7;93668:5;93666:1;:7;:::i;:::-;:9;;;;:::i;:::-;93654:22;;;;;;;;:::i;:::-;;;;;;;;;93647:1;93649;93647:4;;;;;;;;:::i;:::-;;;;:29;-1:-1:-1;;;;;93647:29:0;;;;;;;;-1:-1:-1;93628:3:0;;;;:::i;:::-;;;;93602:86;;55800:667;55984:72;;-1:-1:-1;;;55984:72:0;;55963:4;;-1:-1:-1;;;;;55984:36:0;;;;;:72;;19051:10;;56035:4;;56041:7;;56050:5;;55984:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55984:72:0;;;;;;;;-1:-1:-1;;55984:72:0;;;;;;;;;;;;:::i;:::-;;;55980:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56218:6;:13;56235:1;56218:18;56214:235;;56264:40;;-1:-1:-1;;;56264:40:0;;;;;;;;;;;56214:235;56407:6;56401:13;56392:6;56388:2;56384:15;56377:38;55980:480;-1:-1:-1;;;;;;56103:55:0;-1:-1:-1;;;56103:55:0;;-1:-1:-1;55800:667:0;;;;;;:::o;86554:937::-;86647:12;86668:18;86714:7;;;;;;;;;;;;;;;;;86730:10;;86752;;-1:-1:-1;;;;;86730:10:0;;;;:21;;86752:7;;86730:10;;86752;;;;:::i;:::-;;;;;;;86730:33;;;;;;;;;;;;;;15444:6:1;15432:19;;;;15414:38;;15402:2;15387:18;;15269:189;86730:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;86730:33:0;;;;;;;;;;;;:::i;:::-;86772:10;;86793;;-1:-1:-1;;;;;86772:10:0;;;;:20;;86793:7;;86801:1;;86793:10;;;;;;:::i;:::-;;;;;;;86772:32;;;;;;;;;;;;;;15444:6:1;15432:19;;;;15414:38;;15402:2;15387:18;;15269:189;86772:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;86772:32:0;;;;;;;;;;;;:::i;:::-;86813:10;;86836;;-1:-1:-1;;;;;86813:10:0;;;;:22;;86836:7;;86844:1;;86836:10;;;;;;:::i;:::-;;;;;;;86813:34;;;;;;;;;;;;;;15444:6:1;15432:19;;;;15414:38;;15402:2;15387:18;;15269:189;86813:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;86813:34:0;;;;;;;;;;;;:::i;:::-;86856:10;;86881;;-1:-1:-1;;;;;86856:10:0;;;;:24;;86881:7;;86889:1;;86881:10;;;;;;:::i;:::-;;;;;;;86892:23;86906:8;86892:13;:23::i;:::-;86856:60;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;86856:60:0;;;;;;;;;;;;:::i;:::-;86925:10;;86947;;-1:-1:-1;;;;;86925:10:0;;;;:21;;86947:7;;86955:1;;86947:10;;;;;;:::i;:::-;;;;;;;86958:23;86972:8;86958:13;:23::i;:::-;86925:57;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;86925:57:0;;;;;;;;;;;;:::i;:::-;86991:10;;87016;;-1:-1:-1;;;;;86991:10:0;;;;:24;;87016:7;;87024:1;;87016:10;;;;;;:::i;:::-;;;;;;;86991:36;;;;;;;;;;;;;;15444:6:1;15432:19;;;;15414:38;;15402:2;15387:18;;15269:189;86991:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;86991:36:0;;;;;;;;;;;;:::i;:::-;87036:4;;;;;;;;;;;;;-1:-1:-1;;;87036:4:0;;;86689:358;;;;;;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;86689:358:0;;;;;;;87095:10;;-1:-1:-1;;;87095:25:0;;:10;:25;;;529::1;86689:358:0;;-1:-1:-1;;;;;;87095:10:0;;:22;;502:18:1;;87095:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;87095:25:0;;;;;;;;;;;;:::i;:::-;87131:10;;87156;;-1:-1:-1;;;;;87131:10:0;;;;:24;;87156:7;;87131:10;;87156;;;;;;:::i;:::-;;;;;;;87168:8;:18;87177:8;87168:18;;;;;;;;;;;;87131:56;;;;;;;;;;;;;;;32600:6:1;32588:19;;;;32570:38;;32639:2;32624:18;;32617:34;32558:2;32543:18;;32397:260;87131:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;87131:56:0;;;;;;;;;;;;:::i;:::-;87198:10;;-1:-1:-1;;;;;87198:10:0;:27;87226:19;87236:8;87226:9;:19::i;:::-;87198:48;;;;;;;;;;;;;529:25:1;;517:2;502:18;;383:177;87198:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;87198:48:0;;;;;;;;;;;;:::i;:::-;87273:10;;87299;;87257:5;;-1:-1:-1;;;;;87273:10:0;;:25;;87299:7;;87273:10;;87299;;;;;;:::i;:::-;;;;;;;87273:37;;;;;;;;;;;;;;15444:6:1;15432:19;;;;15414:38;;15402:2;15387:18;;15269:189;87273:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;87273:37:0;;;;;;;;;;;;:::i;:::-;87321:10;;-1:-1:-1;;;;;87321:10:0;:26;87348:19;87358:8;87348:9;:19::i;:::-;87321:47;;;;;;;;;;;;;529:25:1;;517:2;502:18;;383:177;87321:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;87321:47:0;;;;;;;;;;;;:::i;:::-;87379:10;;:25;;-1:-1:-1;;;87379:25:0;;87402:1;87379:25;;;529::1;-1:-1:-1;;;;;87379:10:0;;;;:22;;502:18:1;;87379:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;87379:25:0;;;;;;;;;;;;:::i;:::-;87415:10;;:25;;-1:-1:-1;;;87415:25:0;;87438:1;87415:25;;;529::1;-1:-1:-1;;;;;87415:10:0;;;;:22;;502:18:1;;87415:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;87415:25:0;;;;;;;;;;;;:::i;:::-;87451:10;;:25;;-1:-1:-1;;;87451:25:0;;87474:1;87451:25;;;529::1;-1:-1:-1;;;;;87451:10:0;;;;:22;;502:18:1;;87451:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;87451:25:0;;;;;;;;;;;;:::i;:::-;87068:417;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;87054:431;;;86554:937;;;;:::o;89059:343::-;89179:25;;;;;;;;;;;;-1:-1:-1;;;89179:25:0;;;;89158:12;;89215:8;;89211:24;;-1:-1:-1;89225:10:0;;;;;;;;;-1:-1:-1;89225:10:0;;89211:24;89312:4;89353:3;89382:5;89256:140;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;89242:154;;;89059:343;;;;;:::o;82255:420::-;82297:13;82319:9;82331:26;82349:8;82331:15;:26;:::i;:::-;82364:25;;;;;;;;;:20;:25;;82319:38;;-1:-1:-1;82404:7:0;82400:11;;;:27;;;82419:8;82415:1;:12;82400:27;82396:254;;;-1:-1:-1;82438:17:0;;;;;;;;;;;;-1:-1:-1;;;82438:17:0;;;;82396:254;;;82483:7;82478:1;:12;;:29;;;;;82499:8;82494:1;:13;;82478:29;82474:176;;;-1:-1:-1;82518:17:0;;;;;;;;;;;;-1:-1:-1;;;82518:17:0;;;;82474:176;;;82562:8;82558:1;:12;:28;;;;;82578:8;82574:1;:12;82558:28;82554:96;;;-1:-1:-1;82596:17:0;;;;;;;;;;;;-1:-1:-1;;;82596:17:0;;;;82554:96;;;-1:-1:-1;82633:15:0;;;;;;;;;;;;-1:-1:-1;;;82633:15:0;;;;82663:6;82255:420;-1:-1:-1;;82255:420:0:o;60474:701::-;60557:7;60600:4;60557:7;60615:523;60639:5;:12;60635:1;:16;60615:523;;;60673:20;60696:5;60702:1;60696:8;;;;;;;;:::i;:::-;;;;;;;60673:31;;60739:12;60723;:28;60719:408;;60876:44;;;;;;36311:19:1;;;36346:12;;;36339:28;;;36383:12;;60876:44:0;;;;;;;;;;;;60866:55;;;;;;60851:70;;60719:408;;;61066:44;;;;;;36311:19:1;;;36346:12;;;36339:28;;;36383:12;;61066:44:0;;;;;;;;;;;;61056:55;;;;;;61041:70;;60719:408;-1:-1:-1;60653:3:0;;;;:::i;:::-;;;;60615:523;;101419:521;101497:16;101516:7;:5;:7::i;:::-;101497:26;-1:-1:-1;101532:14:0;101595:47;101610:8;101619:1;101610:11;101595:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;101623:18:0;;;;:9;:18;;;;;;;-1:-1:-1;101595:14:0;;-1:-1:-1;101595:47:0:i;:::-;101549:93;;101588:4;101560:16;:25;101577:7;101560:25;;;;;;;;;;;;101549:8;:36;;;;:::i;:::-;:43;;;;:::i;:::-;:93;;;;:::i;:::-;101532:110;;101665:2;101655:6;:12;101651:282;;101708:25;;;;:16;:25;;;;;;101745:1;;101708:34;;101736:6;;101708:34;:::i;:::-;:38;;;;:::i;:::-;101680:25;;;;:16;:25;;;;;:66;90975:531;90923:583;;:::o;101651:282::-;101783:1;101773:6;:11;101769:164;;-1:-1:-1;;101825:25:0;;:16;:25;;90923:583::o;101769:164::-;101902:25;;;;:16;:25;;;;;;:29;;101930:1;101902:29;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:173:1:-;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:186::-;251:6;304:2;292:9;283:7;279:23;275:32;272:52;;;320:1;317;310:12;272:52;343:29;362:9;343:29;:::i;565:367::-;628:8;638:6;692:3;685:4;677:6;673:17;669:27;659:55;;710:1;707;700:12;659:55;-1:-1:-1;733:20:1;;-1:-1:-1;;;;;765:30:1;;762:50;;;808:1;805;798:12;762:50;845:4;837:6;833:17;821:29;;905:3;898:4;888:6;885:1;881:14;873:6;869:27;865:38;862:47;859:67;;;922:1;919;912:12;859:67;565:367;;;;;:::o;937:437::-;1023:6;1031;1084:2;1072:9;1063:7;1059:23;1055:32;1052:52;;;1100:1;1097;1090:12;1052:52;1140:9;1127:23;-1:-1:-1;;;;;1165:6:1;1162:30;1159:50;;;1205:1;1202;1195:12;1159:50;1244:70;1306:7;1297:6;1286:9;1282:22;1244:70;:::i;:::-;1333:8;;1218:96;;-1:-1:-1;937:437:1;-1:-1:-1;;;;937:437:1:o;1379:131::-;-1:-1:-1;;;;;;1453:32:1;;1443:43;;1433:71;;1500:1;1497;1490:12;1515:245;1573:6;1626:2;1614:9;1605:7;1601:23;1597:32;1594:52;;;1642:1;1639;1632:12;1594:52;1681:9;1668:23;1700:30;1724:5;1700:30;:::i;1957:258::-;2029:1;2039:113;2053:6;2050:1;2047:13;2039:113;;;2129:11;;;2123:18;2110:11;;;2103:39;2075:2;2068:10;2039:113;;;2170:6;2167:1;2164:13;2161:48;;;-1:-1:-1;;2205:1:1;2187:16;;2180:27;1957:258::o;2220:::-;2262:3;2300:5;2294:12;2327:6;2322:3;2315:19;2343:63;2399:6;2392:4;2387:3;2383:14;2376:4;2369:5;2365:16;2343:63;:::i;:::-;2460:2;2439:15;-1:-1:-1;;2435:29:1;2426:39;;;;2467:4;2422:50;;2220:258;-1:-1:-1;;2220:258:1:o;2483:220::-;2632:2;2621:9;2614:21;2595:4;2652:45;2693:2;2682:9;2678:18;2670:6;2652:45;:::i;2708:180::-;2767:6;2820:2;2808:9;2799:7;2795:23;2791:32;2788:52;;;2836:1;2833;2826:12;2788:52;-1:-1:-1;2859:23:1;;2708:180;-1:-1:-1;2708:180:1:o;3101:254::-;3169:6;3177;3230:2;3218:9;3209:7;3205:23;3201:32;3198:52;;;3246:1;3243;3236:12;3198:52;3269:29;3288:9;3269:29;:::i;:::-;3259:39;3345:2;3330:18;;;;3317:32;;-1:-1:-1;;;3101:254:1:o;3360:511::-;3455:6;3463;3471;3524:2;3512:9;3503:7;3499:23;3495:32;3492:52;;;3540:1;3537;3530:12;3492:52;3563:29;3582:9;3563:29;:::i;:::-;3553:39;;3643:2;3632:9;3628:18;3615:32;-1:-1:-1;;;;;3662:6:1;3659:30;3656:50;;;3702:1;3699;3692:12;3656:50;3741:70;3803:7;3794:6;3783:9;3779:22;3741:70;:::i;:::-;3360:511;;3830:8;;-1:-1:-1;3715:96:1;;-1:-1:-1;;;;3360:511:1:o;3876:269::-;3933:6;3986:2;3974:9;3965:7;3961:23;3957:32;3954:52;;;4002:1;3999;3992:12;3954:52;4041:9;4028:23;4091:4;4084:5;4080:16;4073:5;4070:27;4060:55;;4111:1;4108;4101:12;4150:328;4227:6;4235;4243;4296:2;4284:9;4275:7;4271:23;4267:32;4264:52;;;4312:1;4309;4302:12;4264:52;4335:29;4354:9;4335:29;:::i;:::-;4325:39;;4383:38;4417:2;4406:9;4402:18;4383:38;:::i;:::-;4373:48;;4468:2;4457:9;4453:18;4440:32;4430:42;;4150:328;;;;;:::o;4719:248::-;4787:6;4795;4848:2;4836:9;4827:7;4823:23;4819:32;4816:52;;;4864:1;4861;4854:12;4816:52;-1:-1:-1;;4887:23:1;;;4957:2;4942:18;;;4929:32;;-1:-1:-1;4719:248:1:o;5624:632::-;5795:2;5847:21;;;5917:13;;5820:18;;;5939:22;;;5766:4;;5795:2;6018:15;;;;5992:2;5977:18;;;5766:4;6061:169;6075:6;6072:1;6069:13;6061:169;;;6136:13;;6124:26;;6205:15;;;;6170:12;;;;6097:1;6090:9;6061:169;;;-1:-1:-1;6247:3:1;;5624:632;-1:-1:-1;;;;;;5624:632:1:o;6261:118::-;6347:5;6340:13;6333:21;6326:5;6323:32;6313:60;;6369:1;6366;6359:12;6384:315;6449:6;6457;6510:2;6498:9;6489:7;6485:23;6481:32;6478:52;;;6526:1;6523;6516:12;6478:52;6549:29;6568:9;6549:29;:::i;:::-;6539:39;;6628:2;6617:9;6613:18;6600:32;6641:28;6663:5;6641:28;:::i;:::-;6688:5;6678:15;;;6384:315;;;;;:::o;6889:254::-;6957:6;6965;7018:2;7006:9;6997:7;6993:23;6989:32;6986:52;;;7034:1;7031;7024:12;6986:52;7070:9;7057:23;7047:33;;7099:38;7133:2;7122:9;7118:18;7099:38;:::i;:::-;7089:48;;6889:254;;;;;:::o;7148:127::-;7209:10;7204:3;7200:20;7197:1;7190:31;7240:4;7237:1;7230:15;7264:4;7261:1;7254:15;7280:275;7351:2;7345:9;7416:2;7397:13;;-1:-1:-1;;7393:27:1;7381:40;;-1:-1:-1;;;;;7436:34:1;;7472:22;;;7433:62;7430:88;;;7498:18;;:::i;:::-;7534:2;7527:22;7280:275;;-1:-1:-1;7280:275:1:o;7560:186::-;7608:4;-1:-1:-1;;;;;7633:6:1;7630:30;7627:56;;;7663:18;;:::i;:::-;-1:-1:-1;7729:2:1;7708:15;-1:-1:-1;;7704:29:1;7735:4;7700:40;;7560:186::o;7751:888::-;7846:6;7854;7862;7870;7923:3;7911:9;7902:7;7898:23;7894:33;7891:53;;;7940:1;7937;7930:12;7891:53;7963:29;7982:9;7963:29;:::i;:::-;7953:39;;8011:38;8045:2;8034:9;8030:18;8011:38;:::i;:::-;8001:48;;8096:2;8085:9;8081:18;8068:32;8058:42;;8151:2;8140:9;8136:18;8123:32;-1:-1:-1;;;;;8170:6:1;8167:30;8164:50;;;8210:1;8207;8200:12;8164:50;8233:22;;8286:4;8278:13;;8274:27;-1:-1:-1;8264:55:1;;8315:1;8312;8305:12;8264:55;8351:2;8338:16;8376:48;8392:31;8420:2;8392:31;:::i;:::-;8376:48;:::i;:::-;8447:2;8440:5;8433:17;8487:7;8482:2;8477;8473;8469:11;8465:20;8462:33;8459:53;;;8508:1;8505;8498:12;8459:53;8563:2;8558;8554;8550:11;8545:2;8538:5;8534:14;8521:45;8607:1;8602:2;8597;8590:5;8586:14;8582:23;8575:34;8628:5;8618:15;;;;;7751:888;;;;;;;:::o;8644:260::-;8712:6;8720;8773:2;8761:9;8752:7;8748:23;8744:32;8741:52;;;8789:1;8786;8779:12;8741:52;8812:29;8831:9;8812:29;:::i;:::-;8802:39;;8860:38;8894:2;8883:9;8879:18;8860:38;:::i;8909:337::-;9111:2;9093:21;;;9150:2;9130:18;;;9123:30;-1:-1:-1;;;9184:2:1;9169:18;;9162:43;9237:2;9222:18;;8909:337::o;9251:127::-;9312:10;9307:3;9303:20;9300:1;9293:31;9343:4;9340:1;9333:15;9367:4;9364:1;9357:15;9383:128;9423:3;9454:1;9450:6;9447:1;9444:13;9441:39;;;9460:18;;:::i;:::-;-1:-1:-1;9496:9:1;;9383:128::o;9516:347::-;9718:2;9700:21;;;9757:2;9737:18;;;9730:30;9796:25;9791:2;9776:18;;9769:53;9854:2;9839:18;;9516:347::o;10555:135::-;10594:3;10615:17;;;10612:43;;10635:18;;:::i;:::-;-1:-1:-1;10682:1:1;10671:13;;10555:135::o;10695:359::-;10880:19;;;10937:2;10933:15;;;;-1:-1:-1;;10929:53:1;10924:2;10915:12;;10908:75;11008:2;10999:12;;10992:28;11045:2;11036:12;;10695:359::o;11059:356::-;11261:2;11243:21;;;11280:18;;;11273:30;11339:34;11334:2;11319:18;;11312:62;11406:2;11391:18;;11059:356::o;11420:380::-;11499:1;11495:12;;;;11542;;;11563:61;;11617:4;11609:6;11605:17;11595:27;;11563:61;11670:2;11662:6;11659:14;11639:18;11636:38;11633:161;;11716:10;11711:3;11707:20;11704:1;11697:31;11751:4;11748:1;11741:15;11779:4;11776:1;11769:15;11633:161;;11420:380;;;:::o;11805:125::-;11845:4;11873:1;11870;11867:8;11864:34;;;11878:18;;:::i;:::-;-1:-1:-1;11915:9:1;;11805:125::o;12630:168::-;12670:7;12736:1;12732;12728:6;12724:14;12721:1;12718:21;12713:1;12706:9;12699:17;12695:45;12692:71;;;12743:18;;:::i;:::-;-1:-1:-1;12783:9:1;;12630:168::o;12803:340::-;13005:2;12987:21;;;13044:2;13024:18;;;13017:30;-1:-1:-1;;;13078:2:1;13063:18;;13056:46;13134:2;13119:18;;12803:340::o;14546:127::-;14607:10;14602:3;14598:20;14595:1;14588:31;14638:4;14635:1;14628:15;14662:4;14659:1;14652:15;14678:112;14710:1;14736;14726:35;;14741:18;;:::i;:::-;-1:-1:-1;14775:9:1;;14678:112::o;15137:127::-;15198:10;15193:3;15189:20;15186:1;15179:31;15229:4;15226:1;15219:15;15253:4;15250:1;15243:15;15463:634;15542:6;15595:2;15583:9;15574:7;15570:23;15566:32;15563:52;;;15611:1;15608;15601:12;15563:52;15644:9;15638:16;-1:-1:-1;;;;;15669:6:1;15666:30;15663:50;;;15709:1;15706;15699:12;15663:50;15732:22;;15785:4;15777:13;;15773:27;-1:-1:-1;15763:55:1;;15814:1;15811;15804:12;15763:55;15843:2;15837:9;15868:48;15884:31;15912:2;15884:31;:::i;15868:48::-;15939:2;15932:5;15925:17;15979:7;15974:2;15969;15965;15961:11;15957:20;15954:33;15951:53;;;16000:1;15997;15990:12;15951:53;16013:54;16064:2;16059;16052:5;16048:14;16043:2;16039;16035:11;16013:54;:::i;:::-;16086:5;15463:634;-1:-1:-1;;;;;15463:634:1:o;16102:774::-;16379:6;16367:19;;16349:38;;16337:2;16406;16424:18;;;16417:30;;;16289:4;;16533:3;16518:19;;;16406:2;16322:18;;16560:6;16289:4;16594:253;16608:4;16605:1;16602:11;16594:253;;;16699:2;16695:7;16683:9;16675:6;16671:22;16667:36;16662:3;16655:49;16727:40;16760:6;16751;16745:13;16727:40;:::i;:::-;16717:50;-1:-1:-1;16825:12:1;;;;16790:15;;;;16628:1;16621:9;16594:253;;;-1:-1:-1;16864:6:1;;16102:774;-1:-1:-1;;;;;;;16102:774:1:o;16881:184::-;16922:3;16960:5;16954:12;16975:52;17020:6;17015:3;17008:4;17001:5;16997:16;16975:52;:::i;:::-;17043:16;;;;;16881:184;-1:-1:-1;;16881:184:1:o;17070:1245::-;17429:3;17467:6;17461:13;17493:4;17506:51;17550:6;17545:3;17540:2;17532:6;17528:15;17506:51;:::i;:::-;17620:13;;17579:16;;;;17642:55;17620:13;17579:16;17664:15;;;17642:55;:::i;:::-;17764:13;;17719:20;;;17786:55;17764:13;17719:20;17808:15;;;17786:55;:::i;:::-;17908:13;;17863:20;;;17930:55;17908:13;17863:20;17952:15;;;17930:55;:::i;:::-;18052:13;;18007:20;;;18074:55;18052:13;18007:20;18096:15;;;18074:55;:::i;:::-;18196:13;;18151:20;;;18218:55;18196:13;18151:20;18240:15;;;18218:55;:::i;:::-;18289:20;;;;;17070:1245;-1:-1:-1;;;;;;;;;17070:1245:1:o;19897:2235::-;-1:-1:-1;;;20692:61:1;;20776:13;;20674:3;;20808:4;20821:60;20776:13;20869:2;20860:12;;20843:15;;;20821:60;:::i;:::-;-1:-1:-1;;;20940:2:1;20900:16;;;20932:11;;;20925:24;21017:13;;20968:2;;20990:1;;21077;21099:18;;;;21152;;;;21179:93;;21257:4;21247:8;21243:19;21231:31;;21179:93;21320:2;21310:8;21307:16;21287:18;21284:40;21281:167;;-1:-1:-1;;;21347:33:1;;21403:4;21400:1;21393:15;21433:4;21354:3;21421:17;21281:167;21464:18;21491:122;;;;21627:1;21622:340;;;;21457:505;;21491:122;-1:-1:-1;;21532:24:1;;21519:11;;;21512:45;21581:17;;;21577:26;;;-1:-1:-1;21491:122:1;;21622:340;19081:1;19074:14;;;19118:4;19105:18;;21717:1;21731:175;21745:8;21742:1;21739:15;21731:175;;;21833:14;;21816:10;;;21812:19;;21805:43;21876:16;;;;21762:10;;21731:175;;;21735:3;;21949:2;21938:8;21934:2;21930:17;21926:26;21919:33;;21457:505;-1:-1:-1;;19211:66:1;19199:79;;-1:-1:-1;;19308:34:1;19303:2;19294:12;;19287:56;-1:-1:-1;19373:34:1;19368:2;19359:12;;19352:56;19438:66;19433:2;19424:12;;19417:88;21978:148;22008:117;22033:91;22063:60;19530:3;19521:13;;22080:6;22063:60;:::i;:::-;19622:66;19610:79;;-1:-1:-1;;;19714:2:1;19705:12;;19698:30;19753:2;19744:12;;19545:217;22033:91;22025:6;22008:117;:::i;:::-;-1:-1:-1;;;19832:27:1;;19884:1;19875:11;;19767:125;21978:148;21971:155;19897:2235;-1:-1:-1;;;;;;;;;;19897:2235:1:o;22137:448::-;22399:31;22394:3;22387:44;22369:3;22460:6;22454:13;22476:62;22531:6;22526:2;22521:3;22517:12;22510:4;22502:6;22498:17;22476:62;:::i;:::-;22558:16;;;;22576:2;22554:25;;22137:448;-1:-1:-1;;22137:448:1:o;22997:120::-;23037:1;23063;23053:35;;23068:18;;:::i;:::-;-1:-1:-1;23102:9:1;;22997:120::o;23122:1420::-;23594:3;23632:6;23626:13;23658:4;23671:51;23715:6;23710:3;23705:2;23697:6;23693:15;23671:51;:::i;:::-;23785:13;;23744:16;;;;23807:55;23785:13;23744:16;23829:15;;;23807:55;:::i;:::-;23929:13;;23884:20;;;23951:55;23929:13;23884:20;23973:15;;;23951:55;:::i;:::-;24073:13;;24028:20;;;24095:55;24073:13;24028:20;24117:15;;;24095:55;:::i;:::-;24217:13;;24172:20;;;24239:55;24217:13;24172:20;24261:15;;;24239:55;:::i;:::-;24361:13;;24316:20;;;24383:55;24361:13;24316:20;24405:15;;;24383:55;:::i;:::-;-1:-1:-1;;;24460:20:1;;24489:18;;;-1:-1:-1;24534:1:1;24523:13;;23122:1420;-1:-1:-1;;;;;;;;23122:1420:1:o;25090:245::-;25157:6;25210:2;25198:9;25189:7;25185:23;25181:32;25178:52;;;25226:1;25223;25216:12;25178:52;25258:9;25252:16;25277:28;25299:5;25277:28;:::i;25593:1435::-;25998:3;26036:6;26030:13;26062:4;26075:51;26119:6;26114:3;26109:2;26101:6;26097:15;26075:51;:::i;:::-;26189:13;;26148:16;;;;26211:55;26189:13;26148:16;26233:15;;;26211:55;:::i;:::-;26333:13;;26288:20;;;26355:55;26333:13;26288:20;26377:15;;;26355:55;:::i;:::-;26477:13;;26432:20;;;26499:55;26477:13;26432:20;26521:15;;;26499:55;:::i;:::-;26621:13;;26576:20;;;26643:55;26621:13;26576:20;26665:15;;;26643:55;:::i;:::-;26765:13;;26720:20;;;26787:55;26765:13;26720:20;26809:15;;;26787:55;:::i;:::-;26909:13;;26864:20;;;26931:55;26909:13;26864:20;26953:15;;;26931:55;:::i;:::-;27002:20;;;;;25593:1435;-1:-1:-1;;;;;;;;;;25593:1435:1:o;27033:1042::-;27346:3;27384:6;27378:13;27400:53;27446:6;27441:3;27434:4;27426:6;27422:17;27400:53;:::i;:::-;27516:13;;27475:16;;;;27538:57;27516:13;27475:16;27572:4;27560:17;;27538:57;:::i;:::-;27662:13;;27617:20;;;27684:57;27662:13;27617:20;27718:4;27706:17;;27684:57;:::i;:::-;27808:13;;27763:20;;;27830:57;27808:13;27763:20;27864:4;27852:17;;27830:57;:::i;:::-;27954:13;;27909:20;;;27976:57;27954:13;27909:20;28010:4;27998:17;;27976:57;:::i;:::-;28049:20;;27033:1042;-1:-1:-1;;;;;;;27033:1042:1:o;28080:274::-;28209:3;28247:6;28241:13;28263:53;28309:6;28304:3;28297:4;28289:6;28285:17;28263:53;:::i;:::-;28332:16;;;;;28080:274;-1:-1:-1;;28080:274:1:o;28359:204::-;28397:3;28433:4;28430:1;28426:12;28465:4;28462:1;28458:12;28500:3;28494:4;28490:14;28485:3;28482:23;28479:49;;;28508:18;;:::i;:::-;28544:13;;28359:204;-1:-1:-1;;;28359:204:1:o;28892:224::-;28931:3;28959:6;28992:2;28989:1;28985:10;29022:2;29019:1;29015:10;29053:3;29049:2;29045:12;29040:3;29037:21;29034:47;;;29061:18;;:::i;:::-;29097:13;;28892:224;-1:-1:-1;;;;28892:224:1:o;29121:197::-;29159:3;29187:6;29228:2;29221:5;29217:14;29255:2;29246:7;29243:15;29240:41;;29261:18;;:::i;:::-;29310:1;29297:15;;29121:197;-1:-1:-1;;;29121:197:1:o;29323:136::-;29362:3;29390:5;29380:39;;29399:18;;:::i;:::-;-1:-1:-1;;;29435:18:1;;29323:136::o;29825:489::-;-1:-1:-1;;;;;30094:15:1;;;30076:34;;30146:15;;30141:2;30126:18;;30119:43;30193:2;30178:18;;30171:34;;;30241:3;30236:2;30221:18;;30214:31;;;30019:4;;30262:46;;30288:19;;30280:6;30262:46;:::i;:::-;30254:54;29825:489;-1:-1:-1;;;;;;29825:489:1:o;30319:249::-;30388:6;30441:2;30429:9;30420:7;30416:23;30412:32;30409:52;;;30457:1;30454;30447:12;30409:52;30489:9;30483:16;30508:30;30532:5;30508:30;:::i;30573:1629::-;31028:3;31066:6;31060:13;31092:4;31105:51;31149:6;31144:3;31139:2;31131:6;31127:15;31105:51;:::i;:::-;31219:13;;31178:16;;;;31241:55;31219:13;31178:16;31263:15;;;31241:55;:::i;:::-;31363:13;;31318:20;;;31385:55;31363:13;31318:20;31407:15;;;31385:55;:::i;:::-;31507:13;;31462:20;;;31529:55;31507:13;31462:20;31551:15;;;31529:55;:::i;:::-;31651:13;;31606:20;;;31673:55;31651:13;31606:20;31695:15;;;31673:55;:::i;:::-;31795:13;;31750:20;;;31817:55;31795:13;31750:20;31839:15;;;31817:55;:::i;:::-;31939:13;;31894:20;;;31961:55;31939:13;31894:20;31983:15;;;31961:55;:::i;:::-;32083:13;;32038:20;;;32105:55;32083:13;32038:20;32127:15;;;32105:55;:::i;:::-;32176:20;;;;;30573:1629;-1:-1:-1;;;;;;;;;;;30573:1629:1:o;33232:1749::-;33729:3;33767:6;33761:13;33783:53;33829:6;33824:3;33817:4;33809:6;33805:17;33783:53;:::i;:::-;33867:6;33861:13;33883:68;33942:8;33933:6;33928:3;33924:16;33917:4;33909:6;33905:17;33883:68;:::i;:::-;34029:13;;33977:16;;;33973:31;;34051:57;34029:13;33973:31;34085:4;34073:17;;34051:57;:::i;:::-;34139:6;34133:13;34155:72;34218:8;34207;34200:5;34196:20;34189:4;34181:6;34177:17;34155:72;:::i;:::-;34309:13;;34253:20;;;;34249:35;;34331:57;34309:13;34249:35;34365:4;34353:17;;34331:57;:::i;:::-;34419:6;34413:13;34435:72;34498:8;34487;34480:5;34476:20;34469:4;34461:6;34457:17;34435:72;:::i;:::-;34589:13;;34533:20;;;;34529:35;;34611:57;34589:13;34529:35;34645:4;34633:17;;34611:57;:::i;:::-;34699:6;34693:13;34715:72;34778:8;34767;34760:5;34756:20;34749:4;34741:6;34737:17;34715:72;:::i;:::-;34866:13;;34810:20;;;;34806:35;;34888:54;34866:13;34806:35;34922:4;34910:17;;34888:54;:::i;:::-;34958:17;;33232:1749;-1:-1:-1;;;;;;;;;;;33232:1749:1:o;34986:1163::-;-1:-1:-1;;;35534:57:1;;35614:13;;35516:3;;35636:62;35614:13;35686:2;35677:12;;35670:4;35658:17;;35636:62;:::i;:::-;-1:-1:-1;;;35757:2:1;35717:16;;;35749:11;;;35742:59;35826:13;;35848:63;35826:13;35897:2;35889:11;;35882:4;35870:17;;35848:63;:::i;:::-;-1:-1:-1;;;35971:2:1;35930:17;;;;35963:11;;;35956:35;36016:13;;36038:63;36016:13;36087:2;36079:11;;36072:4;36060:17;;36038:63;:::i;:::-;36121:17;36140:2;36117:26;;34986:1163;-1:-1:-1;;;;;34986:1163:1:o
Swarm Source
ipfs://206da47c9c7e07cc461c8a56d59f95b9978ac3505502b0099ecf1d497ff53fc6
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.