Feature Tip: Add private address tag to any address under My Name Tag !
Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
This contract contains unverified libraries: Looting
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
EvoSnails
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2021-11-01
*/
// Sources flattened with hardhat v2.6.5 https://hardhat.org
// File @openzeppelin/contracts-upgradeable/utils/introspection/IERC165Upgradeable.sol@v4.3.2
// 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 IERC165Upgradeable {
/**
* @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-upgradeable/token/ERC721/IERC721Upgradeable.sol@v4.3.2
pragma solidity ^0.8.0;
/**
* @dev Required interface of an ERC721 compliant contract.
*/
interface IERC721Upgradeable is IERC165Upgradeable {
/**
* @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-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol@v4.3.2
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 IERC721ReceiverUpgradeable {
/**
* @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-upgradeable/token/ERC721/extensions/IERC721MetadataUpgradeable.sol@v4.3.2
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 IERC721MetadataUpgradeable is IERC721Upgradeable {
/**
* @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-upgradeable/utils/AddressUpgradeable.sol@v4.3.2
pragma solidity ^0.8.0;
/**
* @dev Collection of functions related to the address type
*/
library AddressUpgradeable {
/**
* @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 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-upgradeable/proxy/utils/Initializable.sol@v4.3.2
pragma solidity ^0.8.0;
/**
* @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed
* behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an
* external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer
* function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.
*
* TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as
* possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.
*
* CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure
* that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.
*/
abstract contract Initializable {
/**
* @dev Indicates that the contract has been initialized.
*/
bool private _initialized;
/**
* @dev Indicates that the contract is in the process of being initialized.
*/
bool private _initializing;
/**
* @dev Modifier to protect an initializer function from being invoked twice.
*/
modifier initializer() {
require(_initializing || !_initialized, "Initializable: contract is already initialized");
bool isTopLevelCall = !_initializing;
if (isTopLevelCall) {
_initializing = true;
_initialized = true;
}
_;
if (isTopLevelCall) {
_initializing = false;
}
}
}
// File @openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol@v4.3.2
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 ContextUpgradeable is Initializable {
function __Context_init() internal initializer {
__Context_init_unchained();
}
function __Context_init_unchained() internal initializer {
}
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
uint256[50] private __gap;
}
// File @openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol@v4.3.2
pragma solidity ^0.8.0;
/**
* @dev String operations.
*/
library StringsUpgradeable {
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-upgradeable/utils/introspection/ERC165Upgradeable.sol@v4.3.2
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 ERC165Upgradeable is Initializable, IERC165Upgradeable {
function __ERC165_init() internal initializer {
__ERC165_init_unchained();
}
function __ERC165_init_unchained() internal initializer {
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IERC165Upgradeable).interfaceId;
}
uint256[50] private __gap;
}
// File @openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol@v4.3.2
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 ERC721Upgradeable is Initializable, ContextUpgradeable, ERC165Upgradeable, IERC721Upgradeable, IERC721MetadataUpgradeable {
using AddressUpgradeable for address;
using StringsUpgradeable 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.
*/
function __ERC721_init(string memory name_, string memory symbol_) internal initializer {
__Context_init_unchained();
__ERC165_init_unchained();
__ERC721_init_unchained(name_, symbol_);
}
function __ERC721_init_unchained(string memory name_, string memory symbol_) internal initializer {
_name = name_;
_symbol = symbol_;
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165Upgradeable, IERC165Upgradeable) returns (bool) {
return
interfaceId == type(IERC721Upgradeable).interfaceId ||
interfaceId == type(IERC721MetadataUpgradeable).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 = ERC721Upgradeable.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 = ERC721Upgradeable.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 = ERC721Upgradeable.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(ERC721Upgradeable.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(ERC721Upgradeable.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 IERC721ReceiverUpgradeable(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
return retval == IERC721ReceiverUpgradeable.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 {}
uint256[44] private __gap;
}
// File @openzeppelin/contracts-upgradeable/token/ERC721/extensions/IERC721EnumerableUpgradeable.sol@v4.3.2
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 IERC721EnumerableUpgradeable is IERC721Upgradeable {
/**
* @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);
}
// File @openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721EnumerableUpgradeable.sol@v4.3.2
pragma solidity ^0.8.0;
/**
* @dev This implements an optional extension of {ERC721} defined in the EIP that adds
* enumerability of all the token ids in the contract as well as all token ids owned by each
* account.
*/
abstract contract ERC721EnumerableUpgradeable is Initializable, ERC721Upgradeable, IERC721EnumerableUpgradeable {
function __ERC721Enumerable_init() internal initializer {
__Context_init_unchained();
__ERC165_init_unchained();
__ERC721Enumerable_init_unchained();
}
function __ERC721Enumerable_init_unchained() internal initializer {
}
// Mapping from owner to list of owned token IDs
mapping(address => mapping(uint256 => uint256)) private _ownedTokens;
// Mapping from token ID to index of the owner tokens list
mapping(uint256 => uint256) private _ownedTokensIndex;
// Array with all token ids, used for enumeration
uint256[] private _allTokens;
// Mapping from token id to position in the allTokens array
mapping(uint256 => uint256) private _allTokensIndex;
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165Upgradeable, ERC721Upgradeable) returns (bool) {
return interfaceId == type(IERC721EnumerableUpgradeable).interfaceId || super.supportsInterface(interfaceId);
}
/**
* @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
*/
function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
require(index < ERC721Upgradeable.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
return _ownedTokens[owner][index];
}
/**
* @dev See {IERC721Enumerable-totalSupply}.
*/
function totalSupply() public view virtual override returns (uint256) {
return _allTokens.length;
}
/**
* @dev See {IERC721Enumerable-tokenByIndex}.
*/
function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
require(index < ERC721EnumerableUpgradeable.totalSupply(), "ERC721Enumerable: global index out of bounds");
return _allTokens[index];
}
/**
* @dev Hook that is called before any token transfer. This includes minting
* and burning.
*
* Calling conditions:
*
* - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
* transferred to `to`.
* - When `from` is zero, `tokenId` will be minted for `to`.
* - When `to` is zero, ``from``'s `tokenId` will be burned.
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(
address from,
address to,
uint256 tokenId
) internal virtual override {
super._beforeTokenTransfer(from, to, tokenId);
if (from == address(0)) {
_addTokenToAllTokensEnumeration(tokenId);
} else if (from != to) {
_removeTokenFromOwnerEnumeration(from, tokenId);
}
if (to == address(0)) {
_removeTokenFromAllTokensEnumeration(tokenId);
} else if (to != from) {
_addTokenToOwnerEnumeration(to, tokenId);
}
}
/**
* @dev Private function to add a token to this extension's ownership-tracking data structures.
* @param to address representing the new owner of the given token ID
* @param tokenId uint256 ID of the token to be added to the tokens list of the given address
*/
function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
uint256 length = ERC721Upgradeable.balanceOf(to);
_ownedTokens[to][length] = tokenId;
_ownedTokensIndex[tokenId] = length;
}
/**
* @dev Private function to add a token to this extension's token tracking data structures.
* @param tokenId uint256 ID of the token to be added to the tokens list
*/
function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
_allTokensIndex[tokenId] = _allTokens.length;
_allTokens.push(tokenId);
}
/**
* @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
* while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
* gas optimizations e.g. when performing a transfer operation (avoiding double writes).
* This has O(1) time complexity, but alters the order of the _ownedTokens array.
* @param from address representing the previous owner of the given token ID
* @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
*/
function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
// To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
// then delete the last slot (swap and pop).
uint256 lastTokenIndex = ERC721Upgradeable.balanceOf(from) - 1;
uint256 tokenIndex = _ownedTokensIndex[tokenId];
// When the token to delete is the last token, the swap operation is unnecessary
if (tokenIndex != lastTokenIndex) {
uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];
_ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
_ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
}
// This also deletes the contents at the last position of the array
delete _ownedTokensIndex[tokenId];
delete _ownedTokens[from][lastTokenIndex];
}
/**
* @dev Private function to remove a token from this extension's token tracking data structures.
* This has O(1) time complexity, but alters the order of the _allTokens array.
* @param tokenId uint256 ID of the token to be removed from the tokens list
*/
function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
// To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
// then delete the last slot (swap and pop).
uint256 lastTokenIndex = _allTokens.length - 1;
uint256 tokenIndex = _allTokensIndex[tokenId];
// When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
// rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
// an 'if' statement (like in _removeTokenFromOwnerEnumeration)
uint256 lastTokenId = _allTokens[lastTokenIndex];
_allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
_allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
// This also deletes the contents at the last position of the array
delete _allTokensIndex[tokenId];
_allTokens.pop();
}
uint256[46] private __gap;
}
// File @openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol@v4.3.2
pragma solidity ^0.8.0;
/**
* @dev Contract module which allows children to implement an emergency stop
* mechanism that can be triggered by an authorized account.
*
* This module is used through inheritance. It will make available the
* modifiers `whenNotPaused` and `whenPaused`, which can be applied to
* the functions of your contract. Note that they will not be pausable by
* simply including this module, only once the modifiers are put in place.
*/
abstract contract PausableUpgradeable is Initializable, ContextUpgradeable {
/**
* @dev Emitted when the pause is triggered by `account`.
*/
event Paused(address account);
/**
* @dev Emitted when the pause is lifted by `account`.
*/
event Unpaused(address account);
bool private _paused;
/**
* @dev Initializes the contract in unpaused state.
*/
function __Pausable_init() internal initializer {
__Context_init_unchained();
__Pausable_init_unchained();
}
function __Pausable_init_unchained() internal initializer {
_paused = false;
}
/**
* @dev Returns true if the contract is paused, and false otherwise.
*/
function paused() public view virtual returns (bool) {
return _paused;
}
/**
* @dev Modifier to make a function callable only when the contract is not paused.
*
* Requirements:
*
* - The contract must not be paused.
*/
modifier whenNotPaused() {
require(!paused(), "Pausable: paused");
_;
}
/**
* @dev Modifier to make a function callable only when the contract is paused.
*
* Requirements:
*
* - The contract must be paused.
*/
modifier whenPaused() {
require(paused(), "Pausable: not paused");
_;
}
/**
* @dev Triggers stopped state.
*
* Requirements:
*
* - The contract must not be paused.
*/
function _pause() internal virtual whenNotPaused {
_paused = true;
emit Paused(_msgSender());
}
/**
* @dev Returns to normal state.
*
* Requirements:
*
* - The contract must be paused.
*/
function _unpause() internal virtual whenPaused {
_paused = false;
emit Unpaused(_msgSender());
}
uint256[49] private __gap;
}
// File @openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol@v4.3.2
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 OwnableUpgradeable is Initializable, ContextUpgradeable {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
function __Ownable_init() internal initializer {
__Context_init_unchained();
__Ownable_init_unchained();
}
function __Ownable_init_unchained() internal initializer {
_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);
}
uint256[49] private __gap;
}
// File @openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721BurnableUpgradeable.sol@v4.3.2
pragma solidity ^0.8.0;
/**
* @title ERC721 Burnable Token
* @dev ERC721 Token that can be irreversibly burned (destroyed).
*/
abstract contract ERC721BurnableUpgradeable is Initializable, ContextUpgradeable, ERC721Upgradeable {
function __ERC721Burnable_init() internal initializer {
__Context_init_unchained();
__ERC165_init_unchained();
__ERC721Burnable_init_unchained();
}
function __ERC721Burnable_init_unchained() internal initializer {
}
/**
* @dev Burns `tokenId`. See {ERC721-_burn}.
*
* Requirements:
*
* - The caller must own `tokenId` or be an approved operator.
*/
function burn(uint256 tokenId) public virtual {
//solhint-disable-next-line max-line-length
require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved");
_burn(tokenId);
}
uint256[50] private __gap;
}
// File @openzeppelin/contracts-upgradeable/utils/CountersUpgradeable.sol@v4.3.2
pragma solidity ^0.8.0;
/**
* @title Counters
* @author Matt Condon (@shrugs)
* @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
* of elements in a mapping, issuing ERC721 ids, or counting request ids.
*
* Include with `using Counters for Counters.Counter;`
*/
library CountersUpgradeable {
struct Counter {
// This variable should never be directly accessed by users of the library: interactions must be restricted to
// the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
// this feature: see https://github.com/ethereum/solidity/issues/4637
uint256 _value; // default: 0
}
function current(Counter storage counter) internal view returns (uint256) {
return counter._value;
}
function increment(Counter storage counter) internal {
unchecked {
counter._value += 1;
}
}
function decrement(Counter storage counter) internal {
uint256 value = counter._value;
require(value > 0, "Counter: decrement overflow");
unchecked {
counter._value = value - 1;
}
}
function reset(Counter storage counter) internal {
counter._value = 0;
}
}
// File @openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol@v4.3.2
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20Upgradeable {
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `recipient`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address recipient, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `sender` to `recipient` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address sender,
address recipient,
uint256 amount
) external returns (bool);
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
}
// File @openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20MetadataUpgradeable.sol@v4.3.2
pragma solidity ^0.8.0;
/**
* @dev Interface for the optional metadata functions from the ERC20 standard.
*
* _Available since v4.1._
*/
interface IERC20MetadataUpgradeable is IERC20Upgradeable {
/**
* @dev Returns the name of the token.
*/
function name() external view returns (string memory);
/**
* @dev Returns the symbol of the token.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the decimals places of the token.
*/
function decimals() external view returns (uint8);
}
// File @openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol@v4.3.2
pragma solidity ^0.8.0;
/**
* @dev Implementation of the {IERC20} interface.
*
* This implementation is agnostic to the way tokens are created. This means
* that a supply mechanism has to be added in a derived contract using {_mint}.
* For a generic mechanism see {ERC20PresetMinterPauser}.
*
* TIP: For a detailed writeup see our guide
* https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
* to implement supply mechanisms].
*
* We have followed general OpenZeppelin Contracts guidelines: functions revert
* instead returning `false` on failure. This behavior is nonetheless
* conventional and does not conflict with the expectations of ERC20
* applications.
*
* Additionally, an {Approval} event is emitted on calls to {transferFrom}.
* This allows applications to reconstruct the allowance for all accounts just
* by listening to said events. Other implementations of the EIP may not emit
* these events, as it isn't required by the specification.
*
* Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
* functions have been added to mitigate the well-known issues around setting
* allowances. See {IERC20-approve}.
*/
contract ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeable, IERC20MetadataUpgradeable {
mapping(address => uint256) private _balances;
mapping(address => mapping(address => uint256)) private _allowances;
uint256 private _totalSupply;
string private _name;
string private _symbol;
/**
* @dev Sets the values for {name} and {symbol}.
*
* The default value of {decimals} is 18. To select a different value for
* {decimals} you should overload it.
*
* All two of these values are immutable: they can only be set once during
* construction.
*/
function __ERC20_init(string memory name_, string memory symbol_) internal initializer {
__Context_init_unchained();
__ERC20_init_unchained(name_, symbol_);
}
function __ERC20_init_unchained(string memory name_, string memory symbol_) internal initializer {
_name = name_;
_symbol = symbol_;
}
/**
* @dev Returns the name of the token.
*/
function name() public view virtual override returns (string memory) {
return _name;
}
/**
* @dev Returns the symbol of the token, usually a shorter version of the
* name.
*/
function symbol() public view virtual override returns (string memory) {
return _symbol;
}
/**
* @dev Returns the number of decimals used to get its user representation.
* For example, if `decimals` equals `2`, a balance of `505` tokens should
* be displayed to a user as `5.05` (`505 / 10 ** 2`).
*
* Tokens usually opt for a value of 18, imitating the relationship between
* Ether and Wei. This is the value {ERC20} uses, unless this function is
* overridden;
*
* NOTE: This information is only used for _display_ purposes: it in
* no way affects any of the arithmetic of the contract, including
* {IERC20-balanceOf} and {IERC20-transfer}.
*/
function decimals() public view virtual override returns (uint8) {
return 18;
}
/**
* @dev See {IERC20-totalSupply}.
*/
function totalSupply() public view virtual override returns (uint256) {
return _totalSupply;
}
/**
* @dev See {IERC20-balanceOf}.
*/
function balanceOf(address account) public view virtual override returns (uint256) {
return _balances[account];
}
/**
* @dev See {IERC20-transfer}.
*
* Requirements:
*
* - `recipient` cannot be the zero address.
* - the caller must have a balance of at least `amount`.
*/
function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
_transfer(_msgSender(), recipient, amount);
return true;
}
/**
* @dev See {IERC20-allowance}.
*/
function allowance(address owner, address spender) public view virtual override returns (uint256) {
return _allowances[owner][spender];
}
/**
* @dev See {IERC20-approve}.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function approve(address spender, uint256 amount) public virtual override returns (bool) {
_approve(_msgSender(), spender, amount);
return true;
}
/**
* @dev See {IERC20-transferFrom}.
*
* Emits an {Approval} event indicating the updated allowance. This is not
* required by the EIP. See the note at the beginning of {ERC20}.
*
* Requirements:
*
* - `sender` and `recipient` cannot be the zero address.
* - `sender` must have a balance of at least `amount`.
* - the caller must have allowance for ``sender``'s tokens of at least
* `amount`.
*/
function transferFrom(
address sender,
address recipient,
uint256 amount
) public virtual override returns (bool) {
_transfer(sender, recipient, amount);
uint256 currentAllowance = _allowances[sender][_msgSender()];
require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
unchecked {
_approve(sender, _msgSender(), currentAllowance - amount);
}
return true;
}
/**
* @dev Atomically increases the allowance granted to `spender` by the caller.
*
* This is an alternative to {approve} that can be used as a mitigation for
* problems described in {IERC20-approve}.
*
* Emits an {Approval} event indicating the updated allowance.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
_approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);
return true;
}
/**
* @dev Atomically decreases the allowance granted to `spender` by the caller.
*
* This is an alternative to {approve} that can be used as a mitigation for
* problems described in {IERC20-approve}.
*
* Emits an {Approval} event indicating the updated allowance.
*
* Requirements:
*
* - `spender` cannot be the zero address.
* - `spender` must have allowance for the caller of at least
* `subtractedValue`.
*/
function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
uint256 currentAllowance = _allowances[_msgSender()][spender];
require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
unchecked {
_approve(_msgSender(), spender, currentAllowance - subtractedValue);
}
return true;
}
/**
* @dev Moves `amount` of tokens from `sender` to `recipient`.
*
* This internal function is equivalent to {transfer}, and can be used to
* e.g. implement automatic token fees, slashing mechanisms, etc.
*
* Emits a {Transfer} event.
*
* Requirements:
*
* - `sender` cannot be the zero address.
* - `recipient` cannot be the zero address.
* - `sender` must have a balance of at least `amount`.
*/
function _transfer(
address sender,
address recipient,
uint256 amount
) internal virtual {
require(sender != address(0), "ERC20: transfer from the zero address");
require(recipient != address(0), "ERC20: transfer to the zero address");
_beforeTokenTransfer(sender, recipient, amount);
uint256 senderBalance = _balances[sender];
require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
unchecked {
_balances[sender] = senderBalance - amount;
}
_balances[recipient] += amount;
emit Transfer(sender, recipient, amount);
_afterTokenTransfer(sender, recipient, amount);
}
/** @dev Creates `amount` tokens and assigns them to `account`, increasing
* the total supply.
*
* Emits a {Transfer} event with `from` set to the zero address.
*
* Requirements:
*
* - `account` cannot be the zero address.
*/
function _mint(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: mint to the zero address");
_beforeTokenTransfer(address(0), account, amount);
_totalSupply += amount;
_balances[account] += amount;
emit Transfer(address(0), account, amount);
_afterTokenTransfer(address(0), account, amount);
}
/**
* @dev Destroys `amount` tokens from `account`, reducing the
* total supply.
*
* Emits a {Transfer} event with `to` set to the zero address.
*
* Requirements:
*
* - `account` cannot be the zero address.
* - `account` must have at least `amount` tokens.
*/
function _burn(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: burn from the zero address");
_beforeTokenTransfer(account, address(0), amount);
uint256 accountBalance = _balances[account];
require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
unchecked {
_balances[account] = accountBalance - amount;
}
_totalSupply -= amount;
emit Transfer(account, address(0), amount);
_afterTokenTransfer(account, address(0), amount);
}
/**
* @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
*
* This internal function is equivalent to `approve`, and can be used to
* e.g. set automatic allowances for certain subsystems, etc.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `owner` cannot be the zero address.
* - `spender` cannot be the zero address.
*/
function _approve(
address owner,
address spender,
uint256 amount
) internal virtual {
require(owner != address(0), "ERC20: approve from the zero address");
require(spender != address(0), "ERC20: approve to the zero address");
_allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
/**
* @dev Hook that is called before any transfer of tokens. This includes
* minting and burning.
*
* Calling conditions:
*
* - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
* will be transferred to `to`.
* - when `from` is zero, `amount` tokens will be minted for `to`.
* - when `to` is zero, `amount` of ``from``'s tokens 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 amount
) internal virtual {}
/**
* @dev Hook that is called after any transfer of tokens. This includes
* minting and burning.
*
* Calling conditions:
*
* - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
* has been transferred to `to`.
* - when `from` is zero, `amount` tokens have been minted for `to`.
* - when `to` is zero, `amount` of ``from``'s tokens have been 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 _afterTokenTransfer(
address from,
address to,
uint256 amount
) internal virtual {}
uint256[45] private __gap;
}
// File @openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20BurnableUpgradeable.sol@v4.3.2
pragma solidity ^0.8.0;
/**
* @dev Extension of {ERC20} that allows token holders to destroy both their own
* tokens and those that they have an allowance for, in a way that can be
* recognized off-chain (via event analysis).
*/
abstract contract ERC20BurnableUpgradeable is Initializable, ContextUpgradeable, ERC20Upgradeable {
function __ERC20Burnable_init() internal initializer {
__Context_init_unchained();
__ERC20Burnable_init_unchained();
}
function __ERC20Burnable_init_unchained() internal initializer {
}
/**
* @dev Destroys `amount` tokens from the caller.
*
* See {ERC20-_burn}.
*/
function burn(uint256 amount) public virtual {
_burn(_msgSender(), amount);
}
/**
* @dev Destroys `amount` tokens from `account`, deducting from the caller's
* allowance.
*
* See {ERC20-_burn} and {ERC20-allowance}.
*
* Requirements:
*
* - the caller must have allowance for ``accounts``'s tokens of at least
* `amount`.
*/
function burnFrom(address account, uint256 amount) public virtual {
uint256 currentAllowance = allowance(account, _msgSender());
require(currentAllowance >= amount, "ERC20: burn amount exceeds allowance");
unchecked {
_approve(account, _msgSender(), currentAllowance - amount);
}
_burn(account, amount);
}
uint256[50] private __gap;
}
// File @openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20PausableUpgradeable.sol@v4.3.2
pragma solidity ^0.8.0;
/**
* @dev ERC20 token with pausable token transfers, minting and burning.
*
* Useful for scenarios such as preventing trades until the end of an evaluation
* period, or having an emergency switch for freezing all token transfers in the
* event of a large bug.
*/
abstract contract ERC20PausableUpgradeable is Initializable, ERC20Upgradeable, PausableUpgradeable {
function __ERC20Pausable_init() internal initializer {
__Context_init_unchained();
__Pausable_init_unchained();
__ERC20Pausable_init_unchained();
}
function __ERC20Pausable_init_unchained() internal initializer {
}
/**
* @dev See {ERC20-_beforeTokenTransfer}.
*
* Requirements:
*
* - the contract must not be paused.
*/
function _beforeTokenTransfer(
address from,
address to,
uint256 amount
) internal virtual override {
super._beforeTokenTransfer(from, to, amount);
require(!paused(), "ERC20Pausable: token transfer while paused");
}
uint256[50] private __gap;
}
// File @openzeppelin/contracts-upgradeable/access/IAccessControlUpgradeable.sol@v4.3.2
pragma solidity ^0.8.0;
/**
* @dev External interface of AccessControl declared to support ERC165 detection.
*/
interface IAccessControlUpgradeable {
/**
* @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
*
* `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
* {RoleAdminChanged} not being emitted signaling this.
*
* _Available since v3.1._
*/
event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);
/**
* @dev Emitted when `account` is granted `role`.
*
* `sender` is the account that originated the contract call, an admin role
* bearer except when using {AccessControl-_setupRole}.
*/
event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);
/**
* @dev Emitted when `account` is revoked `role`.
*
* `sender` is the account that originated the contract call:
* - if using `revokeRole`, it is the admin role bearer
* - if using `renounceRole`, it is the role bearer (i.e. `account`)
*/
event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);
/**
* @dev Returns `true` if `account` has been granted `role`.
*/
function hasRole(bytes32 role, address account) external view returns (bool);
/**
* @dev Returns the admin role that controls `role`. See {grantRole} and
* {revokeRole}.
*
* To change a role's admin, use {AccessControl-_setRoleAdmin}.
*/
function getRoleAdmin(bytes32 role) external view returns (bytes32);
/**
* @dev Grants `role` to `account`.
*
* If `account` had not been already granted `role`, emits a {RoleGranted}
* event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function grantRole(bytes32 role, address account) external;
/**
* @dev Revokes `role` from `account`.
*
* If `account` had been granted `role`, emits a {RoleRevoked} event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function revokeRole(bytes32 role, address account) external;
/**
* @dev Revokes `role` from the calling account.
*
* Roles are often managed via {grantRole} and {revokeRole}: this function's
* purpose is to provide a mechanism for accounts to lose their privileges
* if they are compromised (such as when a trusted device is misplaced).
*
* If the calling account had been granted `role`, emits a {RoleRevoked}
* event.
*
* Requirements:
*
* - the caller must be `account`.
*/
function renounceRole(bytes32 role, address account) external;
}
// File @openzeppelin/contracts-upgradeable/access/IAccessControlEnumerableUpgradeable.sol@v4.3.2
pragma solidity ^0.8.0;
/**
* @dev External interface of AccessControlEnumerable declared to support ERC165 detection.
*/
interface IAccessControlEnumerableUpgradeable is IAccessControlUpgradeable {
/**
* @dev Returns one of the accounts that have `role`. `index` must be a
* value between 0 and {getRoleMemberCount}, non-inclusive.
*
* Role bearers are not sorted in any particular way, and their ordering may
* change at any point.
*
* WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure
* you perform all queries on the same block. See the following
* https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post]
* for more information.
*/
function getRoleMember(bytes32 role, uint256 index) external view returns (address);
/**
* @dev Returns the number of accounts that have `role`. Can be used
* together with {getRoleMember} to enumerate all bearers of a role.
*/
function getRoleMemberCount(bytes32 role) external view returns (uint256);
}
// File @openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol@v4.3.2
pragma solidity ^0.8.0;
/**
* @dev Contract module that allows children to implement role-based access
* control mechanisms. This is a lightweight version that doesn't allow enumerating role
* members except through off-chain means by accessing the contract event logs. Some
* applications may benefit from on-chain enumerability, for those cases see
* {AccessControlEnumerable}.
*
* Roles are referred to by their `bytes32` identifier. These should be exposed
* in the external API and be unique. The best way to achieve this is by
* using `public constant` hash digests:
*
* ```
* bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
* ```
*
* Roles can be used to represent a set of permissions. To restrict access to a
* function call, use {hasRole}:
*
* ```
* function foo() public {
* require(hasRole(MY_ROLE, msg.sender));
* ...
* }
* ```
*
* Roles can be granted and revoked dynamically via the {grantRole} and
* {revokeRole} functions. Each role has an associated admin role, and only
* accounts that have a role's admin role can call {grantRole} and {revokeRole}.
*
* By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
* that only accounts with this role will be able to grant or revoke other
* roles. More complex role relationships can be created by using
* {_setRoleAdmin}.
*
* WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
* grant and revoke this role. Extra precautions should be taken to secure
* accounts that have been granted it.
*/
abstract contract AccessControlUpgradeable is Initializable, ContextUpgradeable, IAccessControlUpgradeable, ERC165Upgradeable {
function __AccessControl_init() internal initializer {
__Context_init_unchained();
__ERC165_init_unchained();
__AccessControl_init_unchained();
}
function __AccessControl_init_unchained() internal initializer {
}
struct RoleData {
mapping(address => bool) members;
bytes32 adminRole;
}
mapping(bytes32 => RoleData) private _roles;
bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;
/**
* @dev Modifier that checks that an account has a specific role. Reverts
* with a standardized message including the required role.
*
* The format of the revert reason is given by the following regular expression:
*
* /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
*
* _Available since v4.1._
*/
modifier onlyRole(bytes32 role) {
_checkRole(role, _msgSender());
_;
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IAccessControlUpgradeable).interfaceId || super.supportsInterface(interfaceId);
}
/**
* @dev Returns `true` if `account` has been granted `role`.
*/
function hasRole(bytes32 role, address account) public view override returns (bool) {
return _roles[role].members[account];
}
/**
* @dev Revert with a standard message if `account` is missing `role`.
*
* The format of the revert reason is given by the following regular expression:
*
* /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
*/
function _checkRole(bytes32 role, address account) internal view {
if (!hasRole(role, account)) {
revert(
string(
abi.encodePacked(
"AccessControl: account ",
StringsUpgradeable.toHexString(uint160(account), 20),
" is missing role ",
StringsUpgradeable.toHexString(uint256(role), 32)
)
)
);
}
}
/**
* @dev Returns the admin role that controls `role`. See {grantRole} and
* {revokeRole}.
*
* To change a role's admin, use {_setRoleAdmin}.
*/
function getRoleAdmin(bytes32 role) public view override returns (bytes32) {
return _roles[role].adminRole;
}
/**
* @dev Grants `role` to `account`.
*
* If `account` had not been already granted `role`, emits a {RoleGranted}
* event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
_grantRole(role, account);
}
/**
* @dev Revokes `role` from `account`.
*
* If `account` had been granted `role`, emits a {RoleRevoked} event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
_revokeRole(role, account);
}
/**
* @dev Revokes `role` from the calling account.
*
* Roles are often managed via {grantRole} and {revokeRole}: this function's
* purpose is to provide a mechanism for accounts to lose their privileges
* if they are compromised (such as when a trusted device is misplaced).
*
* If the calling account had been granted `role`, emits a {RoleRevoked}
* event.
*
* Requirements:
*
* - the caller must be `account`.
*/
function renounceRole(bytes32 role, address account) public virtual override {
require(account == _msgSender(), "AccessControl: can only renounce roles for self");
_revokeRole(role, account);
}
/**
* @dev Grants `role` to `account`.
*
* If `account` had not been already granted `role`, emits a {RoleGranted}
* event. Note that unlike {grantRole}, this function doesn't perform any
* checks on the calling account.
*
* [WARNING]
* ====
* This function should only be called from the constructor when setting
* up the initial roles for the system.
*
* Using this function in any other way is effectively circumventing the admin
* system imposed by {AccessControl}.
* ====
*/
function _setupRole(bytes32 role, address account) internal virtual {
_grantRole(role, account);
}
/**
* @dev Sets `adminRole` as ``role``'s admin role.
*
* Emits a {RoleAdminChanged} event.
*/
function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
bytes32 previousAdminRole = getRoleAdmin(role);
_roles[role].adminRole = adminRole;
emit RoleAdminChanged(role, previousAdminRole, adminRole);
}
function _grantRole(bytes32 role, address account) private {
if (!hasRole(role, account)) {
_roles[role].members[account] = true;
emit RoleGranted(role, account, _msgSender());
}
}
function _revokeRole(bytes32 role, address account) private {
if (hasRole(role, account)) {
_roles[role].members[account] = false;
emit RoleRevoked(role, account, _msgSender());
}
}
uint256[49] private __gap;
}
// File @openzeppelin/contracts-upgradeable/utils/structs/EnumerableSetUpgradeable.sol@v4.3.2
pragma solidity ^0.8.0;
/**
* @dev Library for managing
* https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
* types.
*
* Sets have the following properties:
*
* - Elements are added, removed, and checked for existence in constant time
* (O(1)).
* - Elements are enumerated in O(n). No guarantees are made on the ordering.
*
* ```
* contract Example {
* // Add the library methods
* using EnumerableSet for EnumerableSet.AddressSet;
*
* // Declare a set state variable
* EnumerableSet.AddressSet private mySet;
* }
* ```
*
* As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
* and `uint256` (`UintSet`) are supported.
*/
library EnumerableSetUpgradeable {
// To implement this library for multiple types with as little code
// repetition as possible, we write it in terms of a generic Set type with
// bytes32 values.
// The Set implementation uses private functions, and user-facing
// implementations (such as AddressSet) are just wrappers around the
// underlying Set.
// This means that we can only create new EnumerableSets for types that fit
// in bytes32.
struct Set {
// Storage of set values
bytes32[] _values;
// Position of the value in the `values` array, plus 1 because index 0
// means a value is not in the set.
mapping(bytes32 => uint256) _indexes;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function _add(Set storage set, bytes32 value) private returns (bool) {
if (!_contains(set, value)) {
set._values.push(value);
// The value is stored at length-1, but we add 1 to all indexes
// and use 0 as a sentinel value
set._indexes[value] = set._values.length;
return true;
} else {
return false;
}
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function _remove(Set storage set, bytes32 value) private returns (bool) {
// We read and store the value's index to prevent multiple reads from the same storage slot
uint256 valueIndex = set._indexes[value];
if (valueIndex != 0) {
// Equivalent to contains(set, value)
// To delete an element from the _values array in O(1), we swap the element to delete with the last one in
// the array, and then remove the last element (sometimes called as 'swap and pop').
// This modifies the order of the array, as noted in {at}.
uint256 toDeleteIndex = valueIndex - 1;
uint256 lastIndex = set._values.length - 1;
if (lastIndex != toDeleteIndex) {
bytes32 lastvalue = set._values[lastIndex];
// Move the last value to the index where the value to delete is
set._values[toDeleteIndex] = lastvalue;
// Update the index for the moved value
set._indexes[lastvalue] = valueIndex; // Replace lastvalue's index to valueIndex
}
// Delete the slot where the moved value was stored
set._values.pop();
// Delete the index for the deleted slot
delete set._indexes[value];
return true;
} else {
return false;
}
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function _contains(Set storage set, bytes32 value) private view returns (bool) {
return set._indexes[value] != 0;
}
/**
* @dev Returns the number of values on the set. O(1).
*/
function _length(Set storage set) private view returns (uint256) {
return set._values.length;
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function _at(Set storage set, uint256 index) private view returns (bytes32) {
return set._values[index];
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function _values(Set storage set) private view returns (bytes32[] memory) {
return set._values;
}
// Bytes32Set
struct Bytes32Set {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
return _add(set._inner, value);
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
return _remove(set._inner, value);
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
return _contains(set._inner, value);
}
/**
* @dev Returns the number of values in the set. O(1).
*/
function length(Bytes32Set storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
return _at(set._inner, index);
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {
return _values(set._inner);
}
// AddressSet
struct AddressSet {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(AddressSet storage set, address value) internal returns (bool) {
return _add(set._inner, bytes32(uint256(uint160(value))));
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(AddressSet storage set, address value) internal returns (bool) {
return _remove(set._inner, bytes32(uint256(uint160(value))));
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(AddressSet storage set, address value) internal view returns (bool) {
return _contains(set._inner, bytes32(uint256(uint160(value))));
}
/**
* @dev Returns the number of values in the set. O(1).
*/
function length(AddressSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(AddressSet storage set, uint256 index) internal view returns (address) {
return address(uint160(uint256(_at(set._inner, index))));
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function values(AddressSet storage set) internal view returns (address[] memory) {
bytes32[] memory store = _values(set._inner);
address[] memory result;
assembly {
result := store
}
return result;
}
// UintSet
struct UintSet {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(UintSet storage set, uint256 value) internal returns (bool) {
return _add(set._inner, bytes32(value));
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(UintSet storage set, uint256 value) internal returns (bool) {
return _remove(set._inner, bytes32(value));
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(UintSet storage set, uint256 value) internal view returns (bool) {
return _contains(set._inner, bytes32(value));
}
/**
* @dev Returns the number of values on the set. O(1).
*/
function length(UintSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(UintSet storage set, uint256 index) internal view returns (uint256) {
return uint256(_at(set._inner, index));
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function values(UintSet storage set) internal view returns (uint256[] memory) {
bytes32[] memory store = _values(set._inner);
uint256[] memory result;
assembly {
result := store
}
return result;
}
}
// File @openzeppelin/contracts-upgradeable/access/AccessControlEnumerableUpgradeable.sol@v4.3.2
pragma solidity ^0.8.0;
/**
* @dev Extension of {AccessControl} that allows enumerating the members of each role.
*/
abstract contract AccessControlEnumerableUpgradeable is Initializable, IAccessControlEnumerableUpgradeable, AccessControlUpgradeable {
function __AccessControlEnumerable_init() internal initializer {
__Context_init_unchained();
__ERC165_init_unchained();
__AccessControl_init_unchained();
__AccessControlEnumerable_init_unchained();
}
function __AccessControlEnumerable_init_unchained() internal initializer {
}
using EnumerableSetUpgradeable for EnumerableSetUpgradeable.AddressSet;
mapping(bytes32 => EnumerableSetUpgradeable.AddressSet) private _roleMembers;
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IAccessControlEnumerableUpgradeable).interfaceId || super.supportsInterface(interfaceId);
}
/**
* @dev Returns one of the accounts that have `role`. `index` must be a
* value between 0 and {getRoleMemberCount}, non-inclusive.
*
* Role bearers are not sorted in any particular way, and their ordering may
* change at any point.
*
* WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure
* you perform all queries on the same block. See the following
* https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post]
* for more information.
*/
function getRoleMember(bytes32 role, uint256 index) public view override returns (address) {
return _roleMembers[role].at(index);
}
/**
* @dev Returns the number of accounts that have `role`. Can be used
* together with {getRoleMember} to enumerate all bearers of a role.
*/
function getRoleMemberCount(bytes32 role) public view override returns (uint256) {
return _roleMembers[role].length();
}
/**
* @dev Overload {grantRole} to track enumerable memberships
*/
function grantRole(bytes32 role, address account) public virtual override(AccessControlUpgradeable, IAccessControlUpgradeable) {
super.grantRole(role, account);
_roleMembers[role].add(account);
}
/**
* @dev Overload {revokeRole} to track enumerable memberships
*/
function revokeRole(bytes32 role, address account) public virtual override(AccessControlUpgradeable, IAccessControlUpgradeable) {
super.revokeRole(role, account);
_roleMembers[role].remove(account);
}
/**
* @dev Overload {renounceRole} to track enumerable memberships
*/
function renounceRole(bytes32 role, address account) public virtual override(AccessControlUpgradeable, IAccessControlUpgradeable) {
super.renounceRole(role, account);
_roleMembers[role].remove(account);
}
/**
* @dev Overload {_setupRole} to track enumerable memberships
*/
function _setupRole(bytes32 role, address account) internal virtual override {
super._setupRole(role, account);
_roleMembers[role].add(account);
}
uint256[49] private __gap;
}
// File @openzeppelin/contracts-upgradeable/token/ERC20/presets/ERC20PresetMinterPauserUpgradeable.sol@v4.3.2
pragma solidity ^0.8.0;
/**
* @dev {ERC20} token, including:
*
* - ability for holders to burn (destroy) their tokens
* - a minter role that allows for token minting (creation)
* - a pauser role that allows to stop all token transfers
*
* This contract uses {AccessControl} to lock permissioned functions using the
* different roles - head to its documentation for details.
*
* The account that deploys the contract will be granted the minter and pauser
* roles, as well as the default admin role, which will let it grant both minter
* and pauser roles to other accounts.
*/
contract ERC20PresetMinterPauserUpgradeable is Initializable, ContextUpgradeable, AccessControlEnumerableUpgradeable, ERC20BurnableUpgradeable, ERC20PausableUpgradeable {
function initialize(string memory name, string memory symbol) public virtual initializer {
__ERC20PresetMinterPauser_init(name, symbol);
}
bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE");
bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE");
/**
* @dev Grants `DEFAULT_ADMIN_ROLE`, `MINTER_ROLE` and `PAUSER_ROLE` to the
* account that deploys the contract.
*
* See {ERC20-constructor}.
*/
function __ERC20PresetMinterPauser_init(string memory name, string memory symbol) internal initializer {
__Context_init_unchained();
__ERC165_init_unchained();
__AccessControl_init_unchained();
__AccessControlEnumerable_init_unchained();
__ERC20_init_unchained(name, symbol);
__ERC20Burnable_init_unchained();
__Pausable_init_unchained();
__ERC20Pausable_init_unchained();
__ERC20PresetMinterPauser_init_unchained(name, symbol);
}
function __ERC20PresetMinterPauser_init_unchained(string memory name, string memory symbol) internal initializer {
_setupRole(DEFAULT_ADMIN_ROLE, _msgSender());
_setupRole(MINTER_ROLE, _msgSender());
_setupRole(PAUSER_ROLE, _msgSender());
}
/**
* @dev Creates `amount` new tokens for `to`.
*
* See {ERC20-_mint}.
*
* Requirements:
*
* - the caller must have the `MINTER_ROLE`.
*/
function mint(address to, uint256 amount) public virtual {
require(hasRole(MINTER_ROLE, _msgSender()), "ERC20PresetMinterPauser: must have minter role to mint");
_mint(to, amount);
}
/**
* @dev Pauses all token transfers.
*
* See {ERC20Pausable} and {Pausable-_pause}.
*
* Requirements:
*
* - the caller must have the `PAUSER_ROLE`.
*/
function pause() public virtual {
require(hasRole(PAUSER_ROLE, _msgSender()), "ERC20PresetMinterPauser: must have pauser role to pause");
_pause();
}
/**
* @dev Unpauses all token transfers.
*
* See {ERC20Pausable} and {Pausable-_unpause}.
*
* Requirements:
*
* - the caller must have the `PAUSER_ROLE`.
*/
function unpause() public virtual {
require(hasRole(PAUSER_ROLE, _msgSender()), "ERC20PresetMinterPauser: must have pauser role to unpause");
_unpause();
}
function _beforeTokenTransfer(
address from,
address to,
uint256 amount
) internal virtual override(ERC20Upgradeable, ERC20PausableUpgradeable) {
super._beforeTokenTransfer(from, to, amount);
}
uint256[50] private __gap;
}
// File @openzeppelin/contracts-upgradeable/utils/cryptography/MerkleProofUpgradeable.sol@v4.3.2
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 MerkleProofUpgradeable {
/**
* @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) {
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));
}
}
// Check if the computed hash (root) is equal to the provided root
return computedHash == root;
}
}
// File contracts/NFT.sol
pragma solidity ^0.8.2;
interface InventoryManager {
function getTokenURI(
uint16 id,
uint8 background_,
uint8 trail_,
uint8 body_,
uint8 shell_,
uint8 eyes_,
uint8 mouth_,
uint8 accessory_,
bool staked_,
uint8 modifier_
) external view returns (string memory);
}
contract Leaf is ERC20PresetMinterPauserUpgradeable {
function init() public initializer {
__ERC20PresetMinterPauser_init("Leaf", "LEAF");
}
function burnFrom(address from, uint256 amount) public override {
require(hasRole(MINTER_ROLE, _msgSender()), "ERC20PresetMinterPauser: must have minter role to mint");
_burn(from, amount);
}
}
struct LootPool {
uint16 cost;
uint16 total;
uint8 minTier;
uint16 tier1;
uint16 tier2;
uint16 tier3;
uint16 tier4;
}
struct Snail {
uint8 background;
uint8 trail;
uint8 body;
uint8 shell;
uint8 eyes;
uint8 mouth;
uint8 accessory;
}
library Looting {
function init(mapping(uint8 => LootPool) storage pools, mapping(uint8 => uint8[]) storage bodyToEyesMouth) public {
pools[0] = LootPool({cost: 0, total: 100, minTier: 0, tier1: 95, tier2: 5, tier3: 0, tier4: 0});
pools[1] = LootPool({cost: 1, total: 100, minTier: 1, tier1: 80, tier2: 15, tier3: 5, tier4: 0});
pools[2] = LootPool({cost: 3, total: 30000, minTier: 1, tier1: 3900, tier2: 21000, tier3: 5100, tier4: 0});
pools[3] = LootPool({cost: 6, total: 20300, minTier: 2, tier1: 3048, tier2: 15222, tier3: 2030, tier4: 0});
pools[4] = LootPool({cost: 12, total: 13500, minTier: 3, tier1: 6750, tier2: 6750, tier3: 0, tier4: 0});
pools[5] = LootPool({cost: 24, total: 1666, minTier: 4, tier1: 833, tier2: 833, tier3: 0, tier4: 0});
pools[6] = LootPool({cost: 48, total: 3333, minTier: 5, tier1: 3328, tier2: 5, tier3: 0, tier4: 0});
bodyToEyesMouth[1] = [4, 6, 18, 8, 16, 20];
bodyToEyesMouth[2] = [4, 21, 26, 5, 16, 23];
bodyToEyesMouth[3] = [6, 21, 33, 2, 14, 23];
bodyToEyesMouth[4] = [21, 22, 33, 5, 8, 16];
bodyToEyesMouth[5] = [4, 6, 26, 20, 22, 23];
bodyToEyesMouth[6] = [8, 13, 26, 5, 12, 16];
bodyToEyesMouth[7] = [4, 25, 33, 3, 8, 18];
bodyToEyesMouth[8] = [2, 6, 25, 3, 10, 14];
bodyToEyesMouth[9] = [15, 21, 29, 3, 4, 17];
bodyToEyesMouth[10] = [18, 25, 31, 5, 19, 20];
bodyToEyesMouth[11] = [5, 10, 12, 9, 15, 16];
bodyToEyesMouth[12] = [1, 16, 29, 3, 7, 19];
bodyToEyesMouth[13] = [3, 8, 17, 10, 15, 20];
bodyToEyesMouth[14] = [2, 18, 30, 2, 5, 21];
bodyToEyesMouth[15] = [1, 4, 14, 10, 19, 21];
bodyToEyesMouth[16] = [6, 10, 28, 1, 9, 16];
bodyToEyesMouth[17] = [5, 8, 18, 9, 19, 21];
bodyToEyesMouth[18] = [1, 25, 26, 4, 7, 19];
bodyToEyesMouth[19] = [10, 13, 18, 1, 8, 15];
bodyToEyesMouth[20] = [1, 7, 33, 8, 9, 10];
bodyToEyesMouth[21] = [1, 3, 25, 9, 10, 22];
bodyToEyesMouth[22] = [2, 11, 18, 6, 9, 21];
bodyToEyesMouth[23] = [1, 3, 28, 9, 13, 18];
bodyToEyesMouth[24] = [26, 27, 32, 4, 10, 19];
bodyToEyesMouth[25] = [8, 14, 28, 1, 6, 7];
bodyToEyesMouth[26] = [1, 20, 28, 1, 10, 19];
bodyToEyesMouth[27] = [7, 25, 28, 8, 9, 15];
bodyToEyesMouth[28] = [7, 9, 25, 1, 7, 16];
bodyToEyesMouth[29] = [3, 10, 23, 15, 19, 23];
bodyToEyesMouth[30] = [7, 27, 32, 6, 9, 21];
}
function checkFullSet(Snail storage snail, mapping(uint8 => bool) storage setClaimed) public {
uint8[5][5] memory sets = [
[23, 16, 27, 13, 36],
[25, 26, 29, 14, 37],
[30, 29, 23, 29, 38],
[27, 20, 20, 25, 40],
[26, 30, 15, 27, 39]
];
for (uint8 i = 0; i < 5; i++) {
if (setClaimed[i]) continue;
if (snail.background == sets[i][0] && snail.body == sets[i][1] && snail.shell == sets[i][2] && snail.trail == sets[i][3]) {
snail.accessory = sets[i][4];
setClaimed[i] = true;
break;
}
}
}
}
contract EvoSnails is ERC721Upgradeable, ERC721EnumerableUpgradeable, PausableUpgradeable, OwnableUpgradeable {
using CountersUpgradeable for CountersUpgradeable.Counter;
CountersUpgradeable.Counter private _tokenIdCounter;
/////////////////////////////////////////////////////////////
// CONFIGURATION
/////////////////////////////////////////////////////////////
uint256 public constant cost = 0.05 ether;
uint256 public constant maxSupply = 5555;
uint256 public constant maxMintAmount = 1;
uint256 internal constant partsPerTier = 5;
bool internal cooldownEnabled;
bool internal gamePaused;
uint88 public whitelistMintStartTime;
uint88 public publicMintStartTime;
uint88 public startTime;
bytes32 public merkleRoot;
mapping(address => uint256) snailsMinted;
ERC20PresetMinterPauserUpgradeable public leaf;
InventoryManager inventoryManager;
/////////////////////////////////////////////////////////////
// UTILS
/////////////////////////////////////////////////////////////
uint256 entropy;
/////////////////////////////////////////////////////////////
// STRUCTURES
/////////////////////////////////////////////////////////////
mapping(uint256 => Snail) public snails;
enum ActivityState {
UNSTAKED,
GREENHOUSE
}
struct Activity {
ActivityState state;
address user;
uint48 since;
uint40 lastRoll;
}
mapping(uint256 => Activity) public snailActivities;
enum Part {
ACCESSORY,
BACKGROUND,
BODY,
EYES,
MOUTH,
SHELL,
TRAIL
}
mapping(uint8 => LootPool) public pools;
mapping(uint8 => bool) public setClaimed;
mapping(uint8 => uint8[]) internal bodyToEyesMouth;
/////////////////////////////////////////////////////////////
// SET UP
/////////////////////////////////////////////////////////////
function initialize() public initializer {
__ERC721_init("EvoSnails", "EVOSNAIL");
__ERC721Enumerable_init();
__Pausable_init();
__Ownable_init();
cooldownEnabled = true;
gamePaused = false;
whitelistMintStartTime = 1635753600;
publicMintStartTime = 1635796800;
startTime = 1635800400;
Looting.init(pools, bodyToEyesMouth);
}
function setInventoryManager(address manager) public onlyOwner {
inventoryManager = InventoryManager(manager);
}
function setLeaf(address leaf_) public onlyOwner {
leaf = Leaf(leaf_);
}
/////////////////////////////////////////////////////////////
// MINTING
/////////////////////////////////////////////////////////////
function mint(uint256 _mintAmount) public payable noCheaters {
uint256 supply = totalSupply();
require(block.timestamp > publicMintStartTime, "mint locked");
require(_mintAmount > 0, "amount must be >0");
require(_mintAmount <= maxMintAmount, "amount must < max");
require(supply + _mintAmount <= maxSupply, "sold out!");
if (msg.sender != owner()) {
require(msg.value >= cost * _mintAmount, "no funds");
}
for (uint256 i = 1; i <= _mintAmount; i++) {
_mintSnail(msg.sender);
}
}
function mintWhitelist(
address account,
uint256 tokenId,
bytes32[] calldata proof
) public payable noCheaters {
require(block.timestamp > whitelistMintStartTime, "mint locked");
if (msg.sender != owner() && tokenId > 113) {
require(msg.value >= cost, "no funds");
}
require(_verify(_leaf(account, tokenId), proof), "Invalid proof");
require(snailsMinted[account] == 0, "already minted");
snailsMinted[account]++;
_mintSnail(account);
}
/////////////////////////////////////////////////////////////
// STAKING
/////////////////////////////////////////////////////////////
function claimableLeaf(uint256 id) public view returns (uint256 _claimable) {
Activity memory currentActivity = snailActivities[id];
uint256 diff = uint48(block.timestamp) - snailActivities[id].since;
if (currentActivity.state == ActivityState.UNSTAKED) {
_claimable = 0;
return _claimable;
}
_claimable = ((diff * (leafModifier(id)) * 1 ether)) / 1 days;
return _claimable;
}
function greenhouseSnails(uint256[] calldata ids) public noCheaters {
require(block.timestamp > startTime, "not started");
require(!gamePaused, "game paused");
for (uint256 index = 0; index < ids.length; index++) {
_greenhouse(ids[index]);
}
}
function _greenhouse(uint256 id) private {
Activity memory currentActivity = snailActivities[id];
require(currentActivity.state != ActivityState.GREENHOUSE, "already staked");
require(msg.sender == ownerOf(id), "not yours");
_transfer(msg.sender, address(this), id);
snailActivities[id] = Activity({
state: ActivityState.GREENHOUSE,
since: uint48(block.timestamp),
user: msg.sender,
lastRoll: currentActivity.lastRoll
});
}
function returnSnails(uint256[] calldata ids) public noCheaters {
for (uint256 index = 0; index < ids.length; index++) {
_returnSnail(ids[index]);
}
}
function _returnSnail(uint256 id) private {
Activity memory currentActivity = snailActivities[id];
require(currentActivity.state != ActivityState.UNSTAKED, "already unstaked");
require(msg.sender == snailActivities[id].user);
_transfer(address(this), msg.sender, id);
_withdrawLeaf(id);
snailActivities[id] = Activity({
state: ActivityState.UNSTAKED,
since: uint48(block.timestamp),
user: msg.sender,
lastRoll: currentActivity.lastRoll
});
}
function withdrawLeaf(uint256[] calldata ids) public noCheaters {
for (uint256 index = 0; index < ids.length; index++) {
_withdrawLeaf(ids[index]);
}
}
function _withdrawLeaf(uint256 id) private {
Activity memory currentActivity = snailActivities[id];
if (currentActivity.state == ActivityState.UNSTAKED) {
require(msg.sender == ownerOf(id));
} else if (currentActivity.state == ActivityState.GREENHOUSE) {
require(msg.sender == currentActivity.user);
}
uint256 claimable = claimableLeaf(id);
if (claimable == 0) return;
leaf.mint(msg.sender, claimableLeaf(id));
snailActivities[id].since = uint48(block.timestamp);
}
function leafModifier(uint256 id) public view returns (uint256 mod) {
Snail memory snail = snails[id];
// Check to see if this is a 1 of 1
if (_getTier(snail.body) >= 6) return 60;
mod = 5;
uint256 a_t = _getTier(snail.accessory);
if (a_t == 7) mod += 25;
else if (a_t >= 2) mod += a_t;
mod += _getTier(snail.background);
mod += _getTier(snail.body);
mod += _getTier(snail.shell);
mod += _getTier(snail.trail);
return mod;
}
function stakedSnailsCount(address _owner) public view returns (uint256) {
uint256 numIds = 0;
Activity memory activity;
for (uint256 i = 1; i <= _tokenIdCounter.current(); i++) {
activity = snailActivities[i];
if (activity.user == _owner && activity.state == ActivityState.GREENHOUSE) numIds++;
}
return numIds;
}
function stakedSnailByIndex(address _owner, uint256 index) public view returns (uint256) {
uint256 numIds = 0;
Activity memory activity;
for (uint256 i = 1; i <= _tokenIdCounter.current(); i++) {
activity = snailActivities[i];
if (activity.user == _owner && activity.state == ActivityState.GREENHOUSE) {
if (numIds == index) return i;
numIds++;
}
}
return 0;
}
/////////////////////////////////////////////////////////////
// LOOTING
/////////////////////////////////////////////////////////////
function lootForSnail(
uint256 id,
uint8 rollTier,
bool rollAccessory,
bool rollBackground,
bool rollBody,
bool rollShell,
bool rollTrail
) public noCheaters {
Activity memory currentActivity = snailActivities[id];
if (currentActivity.state == ActivityState.UNSTAKED) {
require(msg.sender == ownerOf(id));
} else if (currentActivity.state == ActivityState.GREENHOUSE) {
require(msg.sender == currentActivity.user);
}
Snail memory snail = snails[id];
require(!gamePaused, "game paused");
require(rollAccessory || rollBackground || rollBody || rollShell || rollTrail, "roll >0 parts");
require(canLoot(id, rollTier), "cooldown");
require(rollTier > 0 && rollTier <= 6, "invalid tier");
require(tierUnlocked(rollTier), "tier locked");
require(_getTier(snail.body) < 6, "can't roll a unique");
snailActivities[id].lastRoll = uint40(block.timestamp);
// Withdraw current rewards to avoid multiplying
_withdrawLeaf(id);
leaf.burnFrom(msg.sender, _costToRoll(rollTier, rollAccessory, rollBackground, rollBody, rollShell, rollTrail));
uint8 newItem;
if (rollAccessory) {
newItem = _rollPart(id, rollTier, Part.ACCESSORY);
if (_getTier(newItem) == 6) {
_setUnique(id);
return;
}
}
if (rollBackground) {
newItem = _rollPart(id, rollTier, Part.BACKGROUND);
if (_getTier(newItem) == 6) {
_setUnique(id);
return;
}
}
if (rollBody) {
newItem = _rollPart(id, rollTier, Part.BODY);
if (_getTier(newItem) == 6) {
_setUnique(id);
return;
}
}
if (rollShell) {
newItem = _rollPart(id, rollTier, Part.SHELL);
if (_getTier(newItem) == 6) {
_setUnique(id);
return;
}
}
if (rollTrail) {
newItem = _rollPart(id, rollTier, Part.TRAIL);
if (_getTier(newItem) == 6) {
_setUnique(id);
return;
}
}
_checkFullSet(id);
}
function canLoot(uint256 id, uint8 rollTier) public view returns (bool) {
Activity memory currentActivity = snailActivities[id];
return block.timestamp - currentActivity.lastRoll > uint40(_cooldownForTier(rollTier));
}
function _costToRoll(
uint8 rollTier,
bool rollAccessory,
bool rollBackground,
bool rollBody,
bool rollShell,
bool rollTrail
) internal view returns (uint256) {
uint8 numberOfTraits = 0;
if (rollAccessory) numberOfTraits++;
if (rollBackground) numberOfTraits++;
if (rollBody) numberOfTraits++;
if (rollShell) numberOfTraits++;
if (rollTrail) numberOfTraits++;
return uint256(pools[rollTier].cost) * uint256(numberOfTraits) * 1 ether;
}
function _rollPart(
uint256 id,
uint8 rollTier,
Part part
) internal returns (uint8) {
uint256 seed = _rand();
uint256 rand = _randomiseFromSeed(seed, uint256(part), id);
LootPool memory lootPool = pools[rollTier];
require(lootPool.total > 0, "pool empty");
(uint8 newItem, LootPool memory newLootPool) = _getItem(rand, lootPool);
Snail memory snail = snails[id];
if (part == Part.ACCESSORY) snail.accessory = newItem;
else if (part == Part.BACKGROUND) snail.background = newItem;
else if (part == Part.BODY) {
snail.body = newItem;
if (newItem < 31) {
uint8 eyeIdx = uint8(_randomiseFromSeed(seed, "eyes", 0) % 3);
uint8 mouthIdx = uint8((_randomiseFromSeed(seed, "eyes", 0) % 3) + 3);
snail.eyes = bodyToEyesMouth[newItem][eyeIdx];
snail.mouth = bodyToEyesMouth[newItem][mouthIdx];
}
} else if (part == Part.SHELL) snail.shell = newItem;
else if (part == Part.TRAIL) snail.trail = newItem;
snails[id] = snail;
if (rollTier >= 2) pools[rollTier] = newLootPool;
return newItem;
}
function _getItem(uint256 rand, LootPool memory lootPool) internal pure returns (uint8, LootPool memory) {
uint256 roll = rand % lootPool.total;
lootPool.total--;
uint8 item;
if (roll >= lootPool.tier1 + lootPool.tier2 + lootPool.tier3 && lootPool.tier4 > 0) {
item = uint8(((roll % partsPerTier) + 1) + (lootPool.minTier + 3) * partsPerTier);
lootPool.tier4--;
} else if (roll >= lootPool.tier1 + lootPool.tier2 && lootPool.tier3 > 0) {
item = uint8(((roll % partsPerTier) + 1) + (lootPool.minTier + 2) * partsPerTier);
lootPool.tier3--;
} else if (roll >= lootPool.tier1 && lootPool.tier2 > 0) {
item = uint8(((roll % partsPerTier) + 1) + (lootPool.minTier + 1) * partsPerTier);
lootPool.tier2--;
} else if (lootPool.tier1 >= 0) {
item = uint8(((roll % partsPerTier) + 1) + (lootPool.minTier) * partsPerTier);
lootPool.tier1--;
}
return (item, lootPool);
}
function _setUnique(uint256 id) internal {
uint8 newItem = uint8(pools[6].tier2) + 1 + 30;
Snail memory snail = snails[id];
snail.accessory = newItem;
snail.background = newItem;
snail.body = newItem;
snail.shell = newItem;
snail.trail = newItem;
snails[id] = snail;
}
function _checkFullSet(uint256 id) internal {
Looting.checkFullSet(snails[id], setClaimed);
}
function _getTier(uint256 partId) internal pure returns (uint8) {
if (partId == 0) return 0;
return uint8((partId - 1) / partsPerTier);
}
function _cooldownForTier(uint8 _tier) internal view returns (uint256) {
if (!cooldownEnabled) return 0;
return 8 hours;
}
function tierUnlocked(uint8 tier) public view returns (bool) {
if (tier == 0) return true;
return block.timestamp > (startTime + 1 * uint88(tier - 1) * 27 hours);
}
/////////////////////////////////////////////////////////////
// TOKEN FUNCTIONALITY
/////////////////////////////////////////////////////////////
function tokenURI(uint256 id) public view override returns (string memory) {
Snail memory snail = snails[id];
Activity memory activity = snailActivities[id];
uint8 modifier_ = uint8(leafModifier(id));
return
inventoryManager.getTokenURI(
uint16(id),
snail.background,
snail.trail,
snail.body,
snail.shell,
snail.eyes,
snail.mouth,
snail.accessory,
activity.state == ActivityState.GREENHOUSE,
modifier_
);
}
/////////////////////////////////////////////////////////////
// INTERNAL HELPERS
/////////////////////////////////////////////////////////////
function withdraw() public payable onlyOwner {
require(payable(msg.sender).send(address(this).balance), "could not withdraw");
}
function mintLeaf(address _to, uint256 _amount) public onlyOwner {
leaf.mint(_to, _amount);
}
function _mintSnail(address _to) internal {
_tokenIdCounter.increment();
uint256 id = _tokenIdCounter.current();
(uint8 accessory, uint8 background, uint8 body, uint8 eyes, uint8 mouth, uint8 shell, uint8 trail) = (1, 1, 0, 0, 0, 0, 0);
uint8 numOptions = 3;
uint256 seed = _rand();
LootPool memory pool = pools[0];
(body, pool) = _getItem(_randomiseFromSeed(seed, "body", id), pool);
(shell, pool) = _getItem(_randomiseFromSeed(seed, "shell", id), pool);
(trail, pool) = _getItem(_randomiseFromSeed(seed, "trail", id), pool);
eyes = bodyToEyesMouth[body][(_randomiseFromSeed(seed, "eyes", id) % numOptions)];
mouth = bodyToEyesMouth[body][(_randomiseFromSeed(seed, "mouth", id) % numOptions) + 3];
_mint(_to, id);
snails[id] = Snail({
accessory: accessory,
background: background,
body: body,
eyes: eyes,
mouth: mouth,
shell: shell,
trail: trail
});
snailActivities[id] = Activity({user: _to, since: uint48(block.timestamp), state: ActivityState.UNSTAKED, lastRoll: 0});
}
function _randomiseFromSeed(
uint256 _seed,
uint256 part,
uint256 _additional
) internal pure returns (uint256) {
return uint256(keccak256(abi.encode(_seed, part, _additional)));
}
function _randomiseFromSeed(
uint256 _seed,
string memory part,
uint256 _additional
) internal pure returns (uint256) {
return uint256(keccak256(abi.encode(_seed, part, _additional)));
}
function _rand() internal view returns (uint256) {
uint256 ret = uint256(keccak256(abi.encodePacked(msg.sender, block.timestamp, entropy)));
return ret;
}
modifier noCheaters() {
// We thank EtherOrcs for the idea of this function.
uint256 size = 0;
address acc = msg.sender;
assembly {
size := extcodesize(acc)
}
require(msg.sender == tx.origin, "cheater");
require(size == 0, "cheater");
_;
entropy = uint256(keccak256(abi.encodePacked(acc, block.coinbase)));
}
/////////////////////////////////////////////////////////////
// ADMINISTRATIVE
/////////////////////////////////////////////////////////////
function pause() public onlyOwner {
_pause();
}
function unpause() public onlyOwner {
_unpause();
}
function setWhitelistMintStartTime(uint88 _time) public onlyOwner {
whitelistMintStartTime = _time;
}
function setPublicMintStartTime(uint88 _time) public onlyOwner {
publicMintStartTime = _time;
}
function setStartTime(uint88 _time) public onlyOwner {
startTime = _time;
}
function setCooldownEnabled(bool _enabled) public onlyOwner {
cooldownEnabled = _enabled;
}
function setGamePaused(bool _paused) public onlyOwner {
gamePaused = _paused;
}
function safeMint(address _to, uint256 _tokenId) public onlyOwner {
_safeMint(_to, _tokenId);
}
function adminSetSnail(
uint256 id,
uint8 accessory,
uint8 background,
uint8 body,
uint8 eyes,
uint8 mouth,
uint8 shell,
uint8 trail
) public onlyOwner {
Snail memory snail = snails[id];
snail.accessory = accessory;
snail.background = background;
snail.body = body;
snail.eyes = eyes;
snail.mouth = mouth;
snail.shell = shell;
snail.trail = trail;
snails[id] = snail;
_checkFullSet(id);
}
function _leaf(address account, uint256 tokenId) internal pure returns (bytes32) {
return keccak256(abi.encodePacked(tokenId, account));
}
function _verify(bytes32 _leafNode, bytes32[] memory proof) internal view returns (bool) {
return MerkleProofUpgradeable.verify(proof, merkleRoot, _leafNode);
}
function setMerkleRoot(bytes32 _merkleRoot) public onlyOwner {
merkleRoot = _merkleRoot;
}
function _beforeTokenTransfer(
address from,
address to,
uint256 tokenId
) internal override(ERC721Upgradeable, ERC721EnumerableUpgradeable) whenNotPaused {
super._beforeTokenTransfer(from, to, tokenId);
}
// The following functions are overrides required by Solidity.
function supportsInterface(bytes4 interfaceId) public view override(ERC721Upgradeable, ERC721EnumerableUpgradeable) returns (bool) {
return super.supportsInterface(interfaceId);
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint8","name":"accessory","type":"uint8"},{"internalType":"uint8","name":"background","type":"uint8"},{"internalType":"uint8","name":"body","type":"uint8"},{"internalType":"uint8","name":"eyes","type":"uint8"},{"internalType":"uint8","name":"mouth","type":"uint8"},{"internalType":"uint8","name":"shell","type":"uint8"},{"internalType":"uint8","name":"trail","type":"uint8"}],"name":"adminSetSnail","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint8","name":"rollTier","type":"uint8"}],"name":"canLoot","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"claimableLeaf","outputs":[{"internalType":"uint256","name":"_claimable","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"greenhouseSnails","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"leaf","outputs":[{"internalType":"contract ERC20PresetMinterPauserUpgradeable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"leafModifier","outputs":[{"internalType":"uint256","name":"mod","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint8","name":"rollTier","type":"uint8"},{"internalType":"bool","name":"rollAccessory","type":"bool"},{"internalType":"bool","name":"rollBackground","type":"bool"},{"internalType":"bool","name":"rollBody","type":"bool"},{"internalType":"bool","name":"rollShell","type":"bool"},{"internalType":"bool","name":"rollTrail","type":"bool"}],"name":"lootForSnail","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintLeaf","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"mintWhitelist","outputs":[],"stateMutability":"payable","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":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"}],"name":"pools","outputs":[{"internalType":"uint16","name":"cost","type":"uint16"},{"internalType":"uint16","name":"total","type":"uint16"},{"internalType":"uint8","name":"minTier","type":"uint8"},{"internalType":"uint16","name":"tier1","type":"uint16"},{"internalType":"uint16","name":"tier2","type":"uint16"},{"internalType":"uint16","name":"tier3","type":"uint16"},{"internalType":"uint16","name":"tier4","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMintStartTime","outputs":[{"internalType":"uint88","name":"","type":"uint88"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"returnSnails","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"}],"name":"setClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setCooldownEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_paused","type":"bool"}],"name":"setGamePaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"manager","type":"address"}],"name":"setInventoryManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"leaf_","type":"address"}],"name":"setLeaf","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint88","name":"_time","type":"uint88"}],"name":"setPublicMintStartTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint88","name":"_time","type":"uint88"}],"name":"setStartTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint88","name":"_time","type":"uint88"}],"name":"setWhitelistMintStartTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"snailActivities","outputs":[{"internalType":"enum EvoSnails.ActivityState","name":"state","type":"uint8"},{"internalType":"address","name":"user","type":"address"},{"internalType":"uint48","name":"since","type":"uint48"},{"internalType":"uint40","name":"lastRoll","type":"uint40"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"snails","outputs":[{"internalType":"uint8","name":"background","type":"uint8"},{"internalType":"uint8","name":"trail","type":"uint8"},{"internalType":"uint8","name":"body","type":"uint8"},{"internalType":"uint8","name":"shell","type":"uint8"},{"internalType":"uint8","name":"eyes","type":"uint8"},{"internalType":"uint8","name":"mouth","type":"uint8"},{"internalType":"uint8","name":"accessory","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"stakedSnailByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"stakedSnailsCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startTime","outputs":[{"internalType":"uint88","name":"","type":"uint88"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"tier","type":"uint8"}],"name":"tierUnlocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whitelistMintStartTime","outputs":[{"internalType":"uint88","name":"","type":"uint88"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"withdrawLeaf","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
608060405234801561001057600080fd5b50615f4a80620000216000396000f3fe60806040526004361061029c5760003560e01c806301ffc9a7146102a157806306fdde03146102d6578063081812fc146102f8578063095ea7b31461032557806309647dfe146103475780630d0cdee01461036757806313faede61461038757806318160ddd146103b0578063239c70ae146103c557806323b872dd146103da5780632551cd34146103fa5780632bb1a91a1461041a5780632cc76cec146104595780632eb4a7ab146104795780632f745c59146104905780633a577ec9146104b05780633ccfd60b146104d05780633f4ba83a146104d8578063421f3d2d146104ed57806342842e0e1461050d5780634c8c32461461052d5780634f6ccce71461054d5780635932ead11461056d5780635bca47d51461058d5780635c975abb146105ad57806360ef50b9146105c55780636352211e146105d8578063668e780f146105f85780636cad4e5a1461062957806370a0823114610649578063715018a614610669578063719eb7c71461067e57806378e979251461069e5780637cb64759146106bf5780638129fc1c146106df5780638456cb59146106f457806386b75b44146107095780638da5cb5b1461072957806390494fb71461073e57806391d1ea4d1461075e57806395d89b411461077f578063972a4b4814610794578063a0712d68146107b4578063a1448194146107c7578063a22cb465146107e7578063ae40468114610807578063b02e893f14610877578063b54710c214610897578063b5c14adb14610946578063b7911ae614610966578063b88d4fde14610986578063c87b56dd146109a6578063d3cf00a3146109c6578063d5abeb01146109ee578063de230b9c14610a04578063e985e9c514610a24578063f158783a14610a44578063f2fde38b14610a64578063fb87a63514610a84575b600080fd5b3480156102ad57600080fd5b506102c16102bc3660046156f1565b610b3b565b60405190151581526020015b60405180910390f35b3480156102e257600080fd5b506102eb610b4c565b6040516102cd9190615a10565b34801561030457600080fd5b506103186103133660046156d9565b610bde565b6040516102cd9190615950565b34801561033157600080fd5b50610345610340366004615600565b610c6b565b005b34801561035357600080fd5b506103456103623660046154ae565b610d7c565b34801561037357600080fd5b506103456103823660046157b4565b610dce565b34801561039357600080fd5b506103a266b1a2bc2ec5000081565b6040519081526020016102cd565b3480156103bc57600080fd5b506099546103a2565b3480156103d157600080fd5b506103a2600181565b3480156103e657600080fd5b506103456103f53660046154fa565b611372565b34801561040657600080fd5b506103a26104153660046154ae565b6113a3565b34801561042657600080fd5b5061012e54610441906201000090046001600160581b031681565b6040516001600160581b0390911681526020016102cd565b34801561046557600080fd5b506103a2610474366004615600565b6114c9565b34801561048557600080fd5b506103a26101305481565b34801561049c57600080fd5b506103a26104ab366004615600565b611604565b3480156104bc57600080fd5b506102c16104cb3660046158c1565b61169a565b6103456116fa565b3480156104e457600080fd5b50610345611787565b3480156104f957600080fd5b50610345610508366004615680565b6117be565b34801561051957600080fd5b506103456105283660046154fa565b6118f3565b34801561053957600080fd5b50610345610548366004615680565b61190e565b34801561055957600080fd5b506103a26105683660046156d9565b61199b565b34801561057957600080fd5b506103456105883660046156bf565b611a3c565b34801561059957600080fd5b506103456105a8366004615600565b611a7f565b3480156105b957600080fd5b5060c95460ff166102c1565b6103456105d3366004615629565b611b17565b3480156105e457600080fd5b506103186105f33660046156d9565b611d22565b34801561060457600080fd5b506102c16106133660046158c1565b6101386020526000908152604090205460ff1681565b34801561063557600080fd5b506103456106443660046154ae565b611d99565b34801561065557600080fd5b506103a26106643660046154ae565b611deb565b34801561067557600080fd5b50610345611e72565b34801561068a57600080fd5b506103456106993660046158db565b611eab565b3480156106aa57600080fd5b5061012f54610441906001600160581b031681565b3480156106cb57600080fd5b506103456106da3660046156d9565b611f05565b3480156106eb57600080fd5b50610345611f3a565b34801561070057600080fd5b506103456120b0565b34801561071557600080fd5b506103456107243660046158db565b6120e7565b34801561073557600080fd5b50610318612143565b34801561074a57600080fd5b506103a26107593660046156d9565b612152565b34801561076a57600080fd5b5061013254610318906001600160a01b031681565b34801561078b57600080fd5b506102eb61229b565b3480156107a057600080fd5b506103a26107af3660046156d9565b6122aa565b6103456107c23660046156d9565b612402565b3480156107d357600080fd5b506103456107e2366004615600565b6125fe565b3480156107f357600080fd5b506103456108023660046155d7565b61263b565b34801561081357600080fd5b506108676108223660046156d9565b6101366020526000908152604090205460ff81169061010081046001600160a01b031690600160a81b810465ffffffffffff1690600160d81b900464ffffffffff1684565b6040516102cd94939291906159ba565b34801561088357600080fd5b506102c1610892366004615792565b6126fc565b3480156108a357600080fd5b506109036108b23660046156d9565b6101356020526000908152604090205460ff80821691610100810482169162010000820481169163010000008104821691600160201b8204811691600160281b8104821691600160301b9091041687565b6040805160ff9889168152968816602088015294871694860194909452918516606085015284166080840152831660a083015290911660c082015260e0016102cd565b34801561095257600080fd5b506103456109613660046156bf565b6127cf565b34801561097257600080fd5b50610345610981366004615680565b612819565b34801561099257600080fd5b506103456109a1366004615535565b6128a6565b3480156109b257600080fd5b506102eb6109c13660046156d9565b6128de565b3480156109d257600080fd5b5061012e5461044190600160681b90046001600160581b031681565b3480156109fa57600080fd5b506103a26115b381565b348015610a1057600080fd5b50610345610a1f3660046158db565b612b2e565b348015610a3057600080fd5b506102c1610a3f3660046154c8565b612b80565b348015610a5057600080fd5b50610345610a5f366004615832565b612bae565b348015610a7057600080fd5b50610345610a7f3660046154ae565b612e5c565b348015610a9057600080fd5b50610af4610a9f3660046158c1565b6101376020526000908152604090205461ffff8082169162010000810482169160ff600160201b83041691600160281b8104821691600160381b8204811691600160481b8104821691600160581b9091041687565b6040805161ffff9889168152968816602088015260ff90951694860194909452918516606085015284166080840152831660a08301529190911660c082015260e0016102cd565b6000610b4682612ef9565b92915050565b606060658054610b5b90615e12565b80601f0160208091040260200160405190810160405280929190818152602001828054610b8790615e12565b8015610bd45780601f10610ba957610100808354040283529160200191610bd4565b820191906000526020600020905b815481529060010190602001808311610bb757829003601f168201915b5050505050905090565b6000610be982612f1e565b610c4f5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152606960205260409020546001600160a01b031690565b6000610c7682611d22565b9050806001600160a01b0316836001600160a01b03161415610ce45760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610c46565b336001600160a01b0382161480610d005750610d008133612b80565b610d6d5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f776044820152771b995c881b9bdc88185c1c1c9bdd995908199bdc88185b1b60421b6064820152608401610c46565b610d778383612f3b565b505050565b33610d85612143565b6001600160a01b031614610dab5760405162461bcd60e51b8152600401610c4690615b55565b61013380546001600160a01b0319166001600160a01b0392909216919091179055565b33803b90328114610df15760405162461bcd60e51b8152600401610c4690615b34565b8115610e0f5760405162461bcd60e51b8152600401610c4690615b34565b600089815261013660205260408082208151608081019092528054829060ff166001811115610e4e57634e487b7160e01b600052602160045260246000fd5b6001811115610e6d57634e487b7160e01b600052602160045260246000fd5b8152905461010081046001600160a01b03166020830152600160a81b810465ffffffffffff166040830152600160d81b900464ffffffffff166060909101529050600081516001811115610ed157634e487b7160e01b600052602160045260246000fd5b1415610f0257610ee08a611d22565b6001600160a01b0316336001600160a01b031614610efd57600080fd5b610f4d565b600181516001811115610f2557634e487b7160e01b600052602160045260246000fd5b1415610f4d5780602001516001600160a01b0316336001600160a01b031614610f4d57600080fd5b60008a81526101356020908152604091829020825160e081018452905460ff80821683526101008083048216948401949094526201000082048116948301949094526301000000810484166060830152600160201b810484166080830152600160281b8104841660a0830152600160301b9004831660c082015261012e5490929190041615610fee5760405162461bcd60e51b8152600401610c4690615bdb565b8880610ff75750875b80610fff5750865b806110075750855b8061100f5750845b61104b5760405162461bcd60e51b815260206004820152600d60248201526c726f6c6c203e3020706172747360981b6044820152606401610c46565b6110558b8b6126fc565b61108c5760405162461bcd60e51b815260206004820152600860248201526731b7b7b63237bbb760c11b6044820152606401610c46565b60008a60ff161180156110a3575060068a60ff1611155b6110de5760405162461bcd60e51b815260206004820152600c60248201526b34b73b30b634b2103a34b2b960a11b6044820152606401610c46565b6110e78a61169a565b6111215760405162461bcd60e51b815260206004820152600b60248201526a1d1a595c881b1bd8dad95960aa1b6044820152606401610c46565b6006611133826040015160ff16612fa9565b60ff16106111795760405162461bcd60e51b815260206004820152601360248201527263616e277420726f6c6c206120756e6971756560681b6044820152606401610c46565b60008b81526101366020526040902080546001600160d81b0316600160d81b4264ffffffffff16021790556111ad8b612fcf565b610132546001600160a01b03166379cc6790336111ce8d8d8d8d8d8d6131c2565b6040518363ffffffff1660e01b81526004016111eb9291906159a1565b600060405180830381600087803b15801561120557600080fd5b505af1158015611219573d6000803e3d6000fd5b505050506000891561125b576112318c8c600061326c565b905061123f8160ff16612fa9565b60ff166006141561125b576112538c6137dc565b505050611338565b881561128f5761126d8c8c600161326c565b905061127b8160ff16612fa9565b60ff166006141561128f576112538c6137dc565b87156112c3576112a18c8c600261326c565b90506112af8160ff16612fa9565b60ff16600614156112c3576112538c6137dc565b86156112f7576112d58c8c600561326c565b90506112e38160ff16612fa9565b60ff16600614156112f7576112538c6137dc565b851561132b576113098c8c600661326c565b90506113178160ff16612fa9565b60ff166006141561132b576112538c6137dc565b6113348c613924565b5050505b804160405160200161134b92919061592e565b60408051601f19818403018152919052805160209091012061013455505050505050505050565b61137c33826139a6565b6113985760405162461bcd60e51b8152600401610c4690615b8a565b610d77838383613a68565b6000806113ae61536d565b60015b61012d5481116114c05760008181526101366020526040908190208151608081019092528054829060ff1660018111156113fb57634e487b7160e01b600052602160045260246000fd5b600181111561141a57634e487b7160e01b600052602160045260246000fd5b8152905461010081046001600160a01b03908116602080850191909152600160a81b830465ffffffffffff166040850152600160d81b90920464ffffffffff16606090930192909252820151919350868116911614801561149b575060018251600181111561149957634e487b7160e01b600052602160045260246000fd5b145b156114ae57826114aa81615e4d565b9350505b806114b881615e4d565b9150506113b1565b50909392505050565b6000806114d461536d565b60015b61012d5481116115f85760008181526101366020526040908190208151608081019092528054829060ff16600181111561152157634e487b7160e01b600052602160045260246000fd5b600181111561154057634e487b7160e01b600052602160045260246000fd5b8152905461010081046001600160a01b03908116602080850191909152600160a81b830465ffffffffffff166040850152600160d81b90920464ffffffffff1660609093019290925282015191935087811691161480156115c157506001825160018111156115bf57634e487b7160e01b600052602160045260246000fd5b145b156115e657848314156115d8579250610b46915050565b826115e281615e4d565b9350505b806115f081615e4d565b9150506114d7565b50600095945050505050565b600061160f83611deb565b82106116715760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610c46565b506001600160a01b03919091166000908152609760209081526040808320938352929052205490565b600060ff82166116ac57506001919050565b6116b7600183615da5565b6116c59060ff166001615d38565b6116d29062017bb0615d38565b61012f546116e991906001600160581b0316615ce3565b6001600160581b0316421192915050565b33611703612143565b6001600160a01b0316146117295760405162461bcd60e51b8152600401610c4690615b55565b60405133904780156108fc02916000818181858888f193505050506117855760405162461bcd60e51b8152602060048201526012602482015271636f756c64206e6f7420776974686472617760701b6044820152606401610c46565b565b33611790612143565b6001600160a01b0316146117b65760405162461bcd60e51b8152600401610c4690615b55565b611785613c01565b33803b903281146117e15760405162461bcd60e51b8152600401610c4690615b34565b81156117ff5760405162461bcd60e51b8152600401610c4690615b34565b61012f546001600160581b031642116118485760405162461bcd60e51b815260206004820152600b60248201526a1b9bdd081cdd185c9d195960aa1b6044820152606401610c46565b61012e54610100900460ff16156118715760405162461bcd60e51b8152600401610c4690615bdb565b60005b838110156118bd576118ab85858381811061189f57634e487b7160e01b600052603260045260246000fd5b90506020020135613c8e565b806118b581615e4d565b915050611874565b5080416040516020016118d192919061592e565b60408051601f1981840301815291905280516020909101206101345550505050565b610d77838383604051806020016040528060008152506128a6565b33803b903281146119315760405162461bcd60e51b8152600401610c4690615b34565b811561194f5760405162461bcd60e51b8152600401610c4690615b34565b60005b838110156118bd5761198985858381811061197d57634e487b7160e01b600052603260045260246000fd5b90506020020135613ee3565b8061199381615e4d565b915050611952565b60006119a660995490565b8210611a095760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610c46565b60998281548110611a2a57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b33611a45612143565b6001600160a01b031614611a6b5760405162461bcd60e51b8152600401610c4690615b55565b61012e805460ff1916911515919091179055565b33611a88612143565b6001600160a01b031614611aae5760405162461bcd60e51b8152600401610c4690615b55565b610132546040516340c10f1960e01b81526001600160a01b03909116906340c10f1990611ae190859085906004016159a1565b600060405180830381600087803b158015611afb57600080fd5b505af1158015611b0f573d6000803e3d6000fd5b505050505050565b33803b90328114611b3a5760405162461bcd60e51b8152600401610c4690615b34565b8115611b585760405162461bcd60e51b8152600401610c4690615b34565b61012e546201000090046001600160581b03164211611b895760405162461bcd60e51b8152600401610c4690615a23565b611b91612143565b6001600160a01b0316336001600160a01b031614158015611bb25750607185115b15611bde5766b1a2bc2ec50000341015611bde5760405162461bcd60e51b8152600401610c4690615a9a565b611c24611beb8787614036565b85858080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061407f92505050565b611c605760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210383937b7b360991b6044820152606401610c46565b6001600160a01b0386166000908152610131602052604090205415611cb85760405162461bcd60e51b815260206004820152600e60248201526d185b1c9958591e481b5a5b9d195960921b6044820152606401610c46565b6001600160a01b038616600090815261013160205260408120805491611cdd83615e4d565b9190505550611ceb86614096565b8041604051602001611cfe92919061592e565b60408051601f19818403018152919052805160209091012061013455505050505050565b6000818152606760205260408120546001600160a01b031680610b465760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610c46565b33611da2612143565b6001600160a01b031614611dc85760405162461bcd60e51b8152600401610c4690615b55565b61013280546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160a01b038216611e565760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610c46565b506001600160a01b031660009081526068602052604090205490565b33611e7b612143565b6001600160a01b031614611ea15760405162461bcd60e51b8152600401610c4690615b55565b6117856000614590565b33611eb4612143565b6001600160a01b031614611eda5760405162461bcd60e51b8152600401610c4690615b55565b61012e80546001600160581b03909216620100000262010000600160681b0319909216919091179055565b33611f0e612143565b6001600160a01b031614611f345760405162461bcd60e51b8152600401610c4690615b55565b61013055565b600054610100900460ff1680611f53575060005460ff16155b611f6f5760405162461bcd60e51b8152600401610c4690615ae6565b600054610100900460ff16158015611f91576000805461ffff19166101011790555b611fdc6040518060400160405280600981526020016845766f536e61696c7360b81b81525060405180604001604052806008815260200167115593d4d390525360c21b8152506145e2565b611fe4614669565b611fec6146ec565b611ff4614753565b61012e80546001600160c01b03191665617f9e800001630186011d606e1b0117905561012f805463618055506001600160581b031990911617905560405163091ce90360e21b81526101376004820152610139602482015273cbab1c973500112c389790a9f0c4c42071ffb4bb90632473a40c9060440160006040518083038186803b15801561208357600080fd5b505af4158015612097573d6000803e3d6000fd5b5050505080156120ad576000805461ff00191690555b50565b336120b9612143565b6001600160a01b0316146120df5760405162461bcd60e51b8152600401610c4690615b55565b6117856147ba565b336120f0612143565b6001600160a01b0316146121165760405162461bcd60e51b8152600401610c4690615b55565b61012e80546001600160581b03909216600160681b02600160681b600160c01b0319909216919091179055565b60fb546001600160a01b031690565b60008181526101366020526040808220815160808101909252805483929190829060ff16600181111561219557634e487b7160e01b600052602160045260246000fd5b60018111156121b457634e487b7160e01b600052602160045260246000fd5b8152905461010081046001600160a01b0316602080840191909152600160a81b80830465ffffffffffff908116604080870191909152600160d81b90940464ffffffffff1660609095019490945260008881526101369092529181205493945092612223929190041642615d7e565b65ffffffffffff16905060008251600181111561225057634e487b7160e01b600052602160045260246000fd5b1415612260575060009392505050565b6201518061226d856122aa565b6122779083615d19565b61228990670de0b6b3a7640000615d19565b6122939190615d05565b949350505050565b606060668054610b5b90615e12565b600081815261013560209081526040808320815160e081018352905460ff8082168352610100820481169483019490945262010000810484169282018390526301000000810484166060830152600160201b810484166080830152600160281b8104841660a0830152600160301b900490921660c083015260069061232e90612fa9565b60ff161061233f5750603c92915050565b6005915060006123558260c0015160ff16612fa9565b60ff16905080600714156123755761236e601984615ca6565b925061238a565b6002811061238a576123878184615ca6565b92505b81516123989060ff16612fa9565b6123a59060ff1684615ca6565b92506123b7826040015160ff16612fa9565b6123c49060ff1684615ca6565b92506123d6826060015160ff16612fa9565b6123e39060ff1684615ca6565b92506123f5826020015160ff16612fa9565b6122939060ff1684615ca6565b33803b903281146124255760405162461bcd60e51b8152600401610c4690615b34565b81156124435760405162461bcd60e51b8152600401610c4690615b34565b600061244e60995490565b61012e54909150600160681b90046001600160581b031642116124835760405162461bcd60e51b8152600401610c4690615a23565b600084116124c75760405162461bcd60e51b81526020600482015260116024820152700616d6f756e74206d757374206265203e3607c1b6044820152606401610c46565b600184111561250c5760405162461bcd60e51b81526020600482015260116024820152700c2dadeeadce840daeae6e8407840dac2f607b1b6044820152606401610c46565b6115b36125198583615ca6565b11156125535760405162461bcd60e51b8152602060048201526009602482015268736f6c64206f75742160b81b6044820152606401610c46565b61255b612143565b6001600160a01b0316336001600160a01b0316146125a3576125848466b1a2bc2ec50000615d19565b3410156125a35760405162461bcd60e51b8152600401610c4690615a9a565b60015b8481116125c8576125b633614096565b806125c081615e4d565b9150506125a6565b505080416040516020016125dd92919061592e565b60408051601f19818403018152919052805160209091012061013455505050565b33612607612143565b6001600160a01b03161461262d5760405162461bcd60e51b8152600401610c4690615b55565b6126378282614812565b5050565b6001600160a01b0382163314156126905760405162461bcd60e51b815260206004820152601960248201527822a9219b99189d1030b8383937bb32903a379031b0b63632b960391b6044820152606401610c46565b336000818152606a602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60008281526101366020526040808220815160808101909252805483929190829060ff16600181111561273f57634e487b7160e01b600052602160045260246000fd5b600181111561275e57634e487b7160e01b600052602160045260246000fd5b8152905461010081046001600160a01b03166020830152600160a81b810465ffffffffffff166040830152600160d81b900464ffffffffff1660609091015290506127a88361482c565b64ffffffffff16816060015164ffffffffff16426127c69190615d67565b11949350505050565b336127d8612143565b6001600160a01b0316146127fe5760405162461bcd60e51b8152600401610c4690615b55565b61012e80549115156101000261ff0019909216919091179055565b33803b9032811461283c5760405162461bcd60e51b8152600401610c4690615b34565b811561285a5760405162461bcd60e51b8152600401610c4690615b34565b60005b838110156118bd5761289485858381811061288857634e487b7160e01b600052603260045260246000fd5b90506020020135612fcf565b8061289e81615e4d565b91505061285d565b6128b033836139a6565b6128cc5760405162461bcd60e51b8152600401610c4690615b8a565b6128d88484848461484b565b50505050565b600081815261013560209081526040808320815160e081018352905460ff80821683526101008204811683860152620100008204811683850152630100000082048116606084810191909152600160201b83048216608080860191909152600160281b8404831660a0860152600160301b909304821660c0850152878752610136909552838620845192830190945283549495929492939192839116600181111561299957634e487b7160e01b600052602160045260246000fd5b60018111156129b857634e487b7160e01b600052602160045260246000fd5b8152905461010081046001600160a01b03166020830152600160a81b810465ffffffffffff166040830152600160d81b900464ffffffffff1660609091015290506000612a04856122aa565b610133548451602086015160408701516060880151608089015160a08a015160c08b01519798506001600160a01b0390961696635d7d0289968d96959493929160018c516001811115612a6757634e487b7160e01b600052602160045260246000fd5b6040516001600160e01b031960e08d901b16815261ffff909a1660048b015260ff98891660248b015296881660448a01529487166064890152928616608488015290851660a4870152841660c4860152831660e48501521461010483015284166101248201526101440160006040518083038186803b158015612ae957600080fd5b505afa158015612afd573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612b259190810190615729565b95945050505050565b33612b37612143565b6001600160a01b031614612b5d5760405162461bcd60e51b8152600401610c4690615b55565b61012f80546001600160581b0319166001600160581b0392909216919091179055565b6001600160a01b039182166000908152606a6020908152604080832093909416825291909152205460ff1690565b33612bb7612143565b6001600160a01b031614612bdd5760405162461bcd60e51b8152600401610c4690615b55565b600061013560008a81526020019081526020016000206040518060e00160405290816000820160009054906101000a900460ff1660ff1660ff1681526020016000820160019054906101000a900460ff1660ff1660ff1681526020016000820160029054906101000a900460ff1660ff1660ff1681526020016000820160039054906101000a900460ff1660ff1660ff1681526020016000820160049054906101000a900460ff1660ff1660ff1681526020016000820160059054906101000a900460ff1660ff1660ff1681526020016000820160069054906101000a900460ff1660ff1660ff16815250509050878160c0019060ff16908160ff168152505086816000019060ff16908160ff168152505085816040019060ff16908160ff168152505084816080019060ff16908160ff1681525050838160a0019060ff16908160ff168152505082816060019060ff16908160ff168152505081816020019060ff16908160ff16815250508061013560008b815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548160ff021916908360ff16021790555060608201518160000160036101000a81548160ff021916908360ff16021790555060808201518160000160046101000a81548160ff021916908360ff16021790555060a08201518160000160056101000a81548160ff021916908360ff16021790555060c08201518160000160066101000a81548160ff021916908360ff160217905550905050612e5189613924565b505050505050505050565b33612e65612143565b6001600160a01b031614612e8b5760405162461bcd60e51b8152600401610c4690615b55565b6001600160a01b038116612ef05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c46565b6120ad81614590565b60006001600160e01b0319821663780e9d6360e01b1480610b465750610b468261487e565b6000908152606760205260409020546001600160a01b0316151590565b600081815260696020526040902080546001600160a01b0319166001600160a01b0384169081179091558190612f7082611d22565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081612fb857506000919050565b6005612fc5600184615d67565b610b469190615d05565b600081815261013660205260408082208151608081019092528054829060ff16600181111561300e57634e487b7160e01b600052602160045260246000fd5b600181111561302d57634e487b7160e01b600052602160045260246000fd5b8152905461010081046001600160a01b03166020830152600160a81b810465ffffffffffff166040830152600160d81b900464ffffffffff16606090910152905060008151600181111561309157634e487b7160e01b600052602160045260246000fd5b14156130c2576130a082611d22565b6001600160a01b0316336001600160a01b0316146130bd57600080fd5b61310d565b6001815160018111156130e557634e487b7160e01b600052602160045260246000fd5b141561310d5780602001516001600160a01b0316336001600160a01b03161461310d57600080fd5b600061311883612152565b90508061312457505050565b610132546001600160a01b03166340c10f193361314086612152565b6040518363ffffffff1660e01b815260040161315d9291906159a1565b600060405180830381600087803b15801561317757600080fd5b505af115801561318b573d6000803e3d6000fd5b505050600093845250506101366020525060409020805465ffffffffffff60a81b1916600160a81b4265ffffffffffff1602179055565b60008086156131d957806131d581615e68565b9150505b85156131ed57806131e981615e68565b9150505b841561320157806131fd81615e68565b9150505b8315613215578061321181615e68565b9150505b8215613229578061322581615e68565b9150505b60ff8881166000908152610137602052604090205461324e9183169061ffff16615d19565b61326090670de0b6b3a7640000615d19565b98975050505050505050565b6000806132776148ce565b905060006132a58285600681111561329f57634e487b7160e01b600052602160045260246000fd5b88614916565b60ff80871660009081526101376020908152604091829020825160e081018452905461ffff80821683526201000082048116938301849052600160201b820490951693820193909352600160281b830484166060820152600160381b830484166080820152600160481b8304841660a0820152600160581b90920490921660c08201529192506133645760405162461bcd60e51b815260206004820152600a602482015269706f6f6c20656d70747960b01b6044820152606401610c46565b6000806133718484614955565b60008b815261013560209081526040808320815160e081018352905460ff808216835261010082048116948301949094526201000081048416928201929092526301000000820483166060820152600160201b820483166080820152600160281b8204831660a0820152600160301b90910490911660c082015292945090925088600681111561341157634e487b7160e01b600052602160045260246000fd5b14156134255760ff831660c0820152613630565b600188600681111561344757634e487b7160e01b600052602160045260246000fd5b14156134585760ff83168152613630565b600288600681111561347a57634e487b7160e01b600052602160045260246000fd5b14156135c85760ff831660408201819052601f11156135c357600060036134bf88604051806040016040528060048152602001636579657360e01b8152506000614bb9565b6134c99190615e88565b9050600060036134f789604051806040016040528060048152602001636579657360e01b8152506000614bb9565b6135019190615e88565b61350c906003615ca6565b60ff80871660009081526101396020526040902080549293509190841690811061354657634e487b7160e01b600052603260045260246000fd5b60009182526020808320818304015460ff601f9093166101000a90048216608087015287821683526101399052604090912080549091831690811061359b57634e487b7160e01b600052603260045260246000fd5b60009182526020918290209181049091015460ff601f9092166101000a90041660a084015250505b613630565b60058860068111156135ea57634e487b7160e01b600052602160045260246000fd5b14156135fe5760ff83166060820152613630565b600688600681111561362057634e487b7160e01b600052602160045260246000fd5b14156136305760ff831660208201525b60008a815261013560209081526040918290208351815492850151938501516060860151608087015160a088015160c089015160ff95861661ffff1990981697909717610100988616989098029790971763ffff00001916620100009385169390930263ff0000001916929092176301000000918416919091021761ffff60201b1916600160201b9183169190910260ff60281b191617600160281b948216949094029390931760ff60301b1916600160301b928416929092029190911790556002908a16106137ce5760ff808a16600090815261013760209081526040918290208551815492870151938701516060880151608089015160a08a015160c08b015161ffff908116600160581b0261ffff60581b19928216600160481b0261ffff60481b19948316600160381b029490941663ffffffff60381b19958316600160281b0261ffff60281b1997909c16600160201b029690961662ffffff60201b199a8316620100000263ffffffff19909a16929097169190911797909717979097169390931796909617959095169490941793909317919091161790555b509098975050505050505050565b600660009081526101376020527fe61ba6d5276b1f0e4decff92b6d57a453a7d0d5c2a55a75aaf612a522da84e675461382190600160381b900461ffff166001615cbe565b61382c90601e615cbe565b600083815261013560208181526040808420815160e081018352815460ff600160201b808304821660808501908152600160281b808504841660a087019081529b841660c0870181815281885298870181815260608801828152888c019283529f909c52999098529351975198519b5193519951955197821661ffff1990931692909217610100988216989098029790971763ffff00001916620100009a88169a909a0263ff0000001916999099176301000000918716919091021761ffff60201b191695851690970260ff60281b191694909417938316029290921760ff60301b1916600160301b92909116919091021790915550565b600081815261013560205260409081902090516001620f4f8b60e31b031981526004810191909152610138602482015273cbab1c973500112c389790a9f0c4c42071ffb4bb9063ff8583a89060440160006040518083038186803b15801561398b57600080fd5b505af415801561399f573d6000803e3d6000fd5b5050505050565b60006139b182612f1e565b613a125760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610c46565b6000613a1d83611d22565b9050806001600160a01b0316846001600160a01b03161480613a585750836001600160a01b0316613a4d84610bde565b6001600160a01b0316145b8061229357506122938185612b80565b826001600160a01b0316613a7b82611d22565b6001600160a01b031614613ae35760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610c46565b6001600160a01b038216613b455760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610c46565b613b50838383614bd0565b613b5b600082612f3b565b6001600160a01b0383166000908152606860205260408120805460019290613b84908490615d67565b90915550506001600160a01b0382166000908152606860205260408120805460019290613bb2908490615ca6565b909155505060008181526067602052604080822080546001600160a01b0319166001600160a01b038681169182179092559151849391871691600080516020615ef583398151915291a4505050565b60c95460ff16613c4a5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610c46565b60c9805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b604051613c849190615950565b60405180910390a1565b600081815261013660205260408082208151608081019092528054829060ff166001811115613ccd57634e487b7160e01b600052602160045260246000fd5b6001811115613cec57634e487b7160e01b600052602160045260246000fd5b8152905461010081046001600160a01b03166020830152600160a81b810465ffffffffffff166040830152600160d81b900464ffffffffff166060909101529050600181516001811115613d5057634e487b7160e01b600052602160045260246000fd5b1415613d8f5760405162461bcd60e51b815260206004820152600e60248201526d185b1c9958591e481cdd185ad95960921b6044820152606401610c46565b613d9882611d22565b6001600160a01b0316336001600160a01b031614613de45760405162461bcd60e51b81526020600482015260096024820152686e6f7420796f75727360b81b6044820152606401610c46565b613def333084613a68565b60408051608081019091528060015b81523360208083019190915265ffffffffffff421660408084019190915260608581015164ffffffffff1693019290925260008581526101369091522081518154829060ff191660018381811115613e6657634e487b7160e01b600052602160045260246000fd5b021790555060208201518154604084015160609094015164ffffffffff16600160d81b026001600160d81b0365ffffffffffff909516600160a81b0265ffffffffffff60a81b196001600160a01b039094166101000293909316610100600160d81b03199092169190911791909117929092169190911790555050565b600081815261013660205260408082208151608081019092528054829060ff166001811115613f2257634e487b7160e01b600052602160045260246000fd5b6001811115613f4157634e487b7160e01b600052602160045260246000fd5b8152905461010081046001600160a01b03166020830152600160a81b810465ffffffffffff166040830152600160d81b900464ffffffffff166060909101529050600081516001811115613fa557634e487b7160e01b600052602160045260246000fd5b1415613fe65760405162461bcd60e51b815260206004820152601060248201526f185b1c9958591e481d5b9cdd185ad95960821b6044820152606401610c46565b6000828152610136602052604090205461010090046001600160a01b0316331461400f57600080fd5b61401a303384613a68565b61402382612fcf565b6040805160808101909152806000613dfe565b6000818360405160200161406192919091825260601b6001600160601b031916602082015260340190565b60405160208183030381529060405280519060200120905092915050565b600061408f826101305485614bfe565b9392505050565b6140a561012d80546001019055565b60006140b161012d5490565b90506001806000808080806003816140c76148ce565b6000805261013760209081526040805160e0810182527f9656a38e5b8bf16175eb4bca28ffa04d5646d4e9da9a5df333165c7cb8a8693f5461ffff8082168352620100008204811683860152600160201b820460ff1683850152600160281b820481166060840152600160381b820481166080840152600160481b8204811660a0840152600160581b9091041660c082015281518083019092526004825263626f647960e01b928201929092529192509061418e906141889084908e614bb9565b82614955565b80925081995050506141c161418883604051806040016040528060058152602001641cda195b1b60da1b8152508e614bb9565b80925081965050506141f461418883604051806040016040528060058152602001641d1c985a5b60da1b8152508e614bb9565b809250819550505061013960008960ff1660ff1681526020019081526020016000208360ff1661424184604051806040016040528060048152602001636579657360e01b8152508f614bb9565b61424b9190615e88565b8154811061426957634e487b7160e01b600052603260045260246000fd5b90600052602060002090602091828204019190069054906101000a900460ff16965061013960008960ff1660ff1681526020019081526020016000208360ff166142d184604051806040016040528060058152602001640dadeeae8d60db1b8152508f614bb9565b6142db9190615e88565b6142e6906003615ca6565b8154811061430457634e487b7160e01b600052603260045260246000fd5b90600052602060002090602091828204019190069054906101000a900460ff1695506143308c8c614cbb565b6040518060e001604052808a60ff1681526020018560ff1681526020018960ff1681526020018660ff1681526020018860ff1681526020018760ff1681526020018b60ff1681525061013560008d815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548160ff021916908360ff16021790555060608201518160000160036101000a81548160ff021916908360ff16021790555060808201518160000160046101000a81548160ff021916908360ff16021790555060a08201518160000160056101000a81548160ff021916908360ff16021790555060c08201518160000160066101000a81548160ff021916908360ff1602179055509050506040518060800160405280600060018111156144a257634e487b7160e01b600052602160045260246000fd5b81526001600160a01b038e1660208083019190915265ffffffffffff4216604080840191909152600060609093018390528e8352610136909152902081518154829060ff19166001838181111561450957634e487b7160e01b600052602160045260246000fd5b021790555060208201518154604084015160609094015164ffffffffff16600160d81b026001600160d81b0365ffffffffffff909516600160a81b0265ffffffffffff60a81b196001600160a01b039094166101000293909316610100600160d81b0319909216919091179190911792909216919091179055505050505050505050505050565b60fb80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff16806145fb575060005460ff16155b6146175760405162461bcd60e51b8152600401610c4690615ae6565b600054610100900460ff16158015614639576000805461ffff19166101011790555b614641614de7565b614649614de7565b6146538383614e51565b8015610d77576000805461ff0019169055505050565b600054610100900460ff1680614682575060005460ff16155b61469e5760405162461bcd60e51b8152600401610c4690615ae6565b600054610100900460ff161580156146c0576000805461ffff19166101011790555b6146c8614de7565b6146d0614de7565b6146d8614de7565b80156120ad576000805461ff001916905550565b600054610100900460ff1680614705575060005460ff16155b6147215760405162461bcd60e51b8152600401610c4690615ae6565b600054610100900460ff16158015614743576000805461ffff19166101011790555b61474b614de7565b6146d8614ee6565b600054610100900460ff168061476c575060005460ff16155b6147885760405162461bcd60e51b8152600401610c4690615ae6565b600054610100900460ff161580156147aa576000805461ffff19166101011790555b6147b2614de7565b6146d8614f5b565b60c95460ff16156147dd5760405162461bcd60e51b8152600401610c4690615abc565b60c9805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258613c773390565b612637828260405180602001604052806000815250614fbb565b61012e5460009060ff1661484257506000919050565b50617080919050565b614856848484613a68565b61486284848484614fee565b6128d85760405162461bcd60e51b8152600401610c4690615a48565b60006001600160e01b031982166380ac58cd60e01b14806148af57506001600160e01b03198216635b5e139f60e01b145b80610b4657506301ffc9a760e01b6001600160e01b0319831614610b46565b61013454604080513360601b6001600160601b031916602080830191909152426034830152605480830194909452825180830390940184526074909101909152815191012090565b6040805160208101859052908101839052606081018290526000906080015b60408051601f198184030181529190528051602090910120949350505050565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290526000836020015161ffff16856149a39190615e88565b6020850180519192506149b582615df4565b61ffff1690525060a084015160808501516060860151600092916149d891615c80565b6149e29190615c80565b61ffff1682101580156149fd575060008560c0015161ffff16115b15614a6057600585604001516003614a159190615cbe565b60ff16614a229190615d19565b614a2d600584615e88565b614a38906001615ca6565b614a429190615ca6565b60c086018051919250614a5482615df4565b61ffff16905250614bab565b84608001518560600151614a749190615c80565b61ffff168210158015614a8f575060008560a0015161ffff16115b15614ae657600585604001516002614aa79190615cbe565b60ff16614ab49190615d19565b614abf600584615e88565b614aca906001615ca6565b614ad49190615ca6565b60a086018051919250614a5482615df4565b846060015161ffff168210158015614b0657506000856080015161ffff16115b15614b5d57600585604001516001614b1e9190615cbe565b60ff16614b2b9190615d19565b614b36600584615e88565b614b41906001615ca6565b614b4b9190615ca6565b608086018051919250614a5482615df4565b6005856040015160ff16614b719190615d19565b614b7c600584615e88565b614b87906001615ca6565b614b919190615ca6565b606086018051919250614ba382615df4565b61ffff169052505b9250839150505b9250929050565b600083838360405160200161493593929190615c00565b60c95460ff1615614bf35760405162461bcd60e51b8152600401610c4690615abc565b610d778383836150fb565b600081815b8551811015614cb0576000868281518110614c2e57634e487b7160e01b600052603260045260246000fd5b60200260200101519050808311614c70576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250614c9d565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b5080614ca881615e4d565b915050614c03565b509092149392505050565b6001600160a01b038216614d115760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610c46565b614d1a81612f1e565b15614d665760405162461bcd60e51b815260206004820152601c60248201527b115490cdcc8c4e881d1bdad95b88185b1c9958591e481b5a5b9d195960221b6044820152606401610c46565b614d7260008383614bd0565b6001600160a01b0382166000908152606860205260408120805460019290614d9b908490615ca6565b909155505060008181526067602052604080822080546001600160a01b0319166001600160a01b0386169081179091559051839290600080516020615ef5833981519152908290a45050565b600054610100900460ff1680614e00575060005460ff16155b614e1c5760405162461bcd60e51b8152600401610c4690615ae6565b600054610100900460ff161580156146d8576000805461ffff191661010117905580156120ad576000805461ff001916905550565b600054610100900460ff1680614e6a575060005460ff16155b614e865760405162461bcd60e51b8152600401610c4690615ae6565b600054610100900460ff16158015614ea8576000805461ffff19166101011790555b8251614ebb906065906020860190615396565b508151614ecf906066906020850190615396565b508015610d77576000805461ff0019169055505050565b600054610100900460ff1680614eff575060005460ff16155b614f1b5760405162461bcd60e51b8152600401610c4690615ae6565b600054610100900460ff16158015614f3d576000805461ffff19166101011790555b60c9805460ff1916905580156120ad576000805461ff001916905550565b600054610100900460ff1680614f74575060005460ff16155b614f905760405162461bcd60e51b8152600401610c4690615ae6565b600054610100900460ff16158015614fb2576000805461ffff19166101011790555b6146d833614590565b614fc58383614cbb565b614fd26000848484614fee565b610d775760405162461bcd60e51b8152600401610c4690615a48565b60006001600160a01b0384163b156150f057604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290615032903390899088908890600401615964565b602060405180830381600087803b15801561504c57600080fd5b505af192505050801561507c575060408051601f3d908101601f191682019092526150799181019061570d565b60015b6150d6573d8080156150aa576040519150601f19603f3d011682016040523d82523d6000602084013e6150af565b606091505b5080516150ce5760405162461bcd60e51b8152600401610c4690615a48565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612293565b506001949350505050565b6001600160a01b0383166151565761515181609980546000838152609a60205260408120829055600182018355919091527f72a152ddfb8e864297c917af52ea6c1c68aead0fee1a62673fcc7e0c94979d000155565b615179565b816001600160a01b0316836001600160a01b0316146151795761517983826151b3565b6001600160a01b03821661519057610d7781615250565b826001600160a01b0316826001600160a01b031614610d7757610d778282615329565b600060016151c084611deb565b6151ca9190615d67565b60008381526098602052604090205490915080821461521d576001600160a01b03841660009081526097602090815260408083208584528252808320548484528184208190558352609890915290208190555b5060009182526098602090815260408084208490556001600160a01b039094168352609781528383209183525290812055565b60995460009061526290600190615d67565b6000838152609a60205260408120546099805493945090928490811061529857634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905080609983815481106152c757634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255828152609a9091526040808220849055858252812055609980548061530d57634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061533483611deb565b6001600160a01b039093166000908152609760209081526040808320868452825280832085905593825260989052919091209190915550565b604080516080810190915280600081526000602082018190526040820181905260609091015290565b8280546153a290615e12565b90600052602060002090601f0160209004810192826153c4576000855561540a565b82601f106153dd57805160ff191683800117855561540a565b8280016001018555821561540a579182015b8281111561540a5782518255916020019190600101906153ef565b5061541692915061541a565b5090565b5b80821115615416576000815560010161541b565b80356001600160a01b038116811461544657600080fd5b919050565b60008083601f84011261545c578081fd5b5081356001600160401b03811115615472578182fd5b6020830191508360208260051b8501011115614bb257600080fd5b8035801515811461544657600080fd5b803560ff8116811461544657600080fd5b6000602082840312156154bf578081fd5b61408f8261542f565b600080604083850312156154da578081fd5b6154e38361542f565b91506154f16020840161542f565b90509250929050565b60008060006060848603121561550e578081fd5b6155178461542f565b92506155256020850161542f565b9150604084013590509250925092565b6000806000806080858703121561554a578081fd5b6155538561542f565b93506155616020860161542f565b92506040850135915060608501356001600160401b03811115615582578182fd5b8501601f81018713615592578182fd5b80356155a56155a082615c59565b615c29565b8181528860208385010111156155b9578384fd5b81602084016020830137908101602001929092525092959194509250565b600080604083850312156155e9578182fd5b6155f28361542f565b91506154f16020840161548d565b60008060408385031215615612578182fd5b61561b8361542f565b946020939093013593505050565b6000806000806060858703121561563e578384fd5b6156478561542f565b93506020850135925060408501356001600160401b03811115615668578283fd5b6156748782880161544b565b95989497509550505050565b60008060208385031215615692578182fd5b82356001600160401b038111156156a7578283fd5b6156b38582860161544b565b90969095509350505050565b6000602082840312156156d0578081fd5b61408f8261548d565b6000602082840312156156ea578081fd5b5035919050565b600060208284031215615702578081fd5b813561408f81615ede565b60006020828403121561571e578081fd5b815161408f81615ede565b60006020828403121561573a578081fd5b81516001600160401b0381111561574f578182fd5b8201601f8101841361575f578182fd5b805161576d6155a082615c59565b818152856020838501011115615781578384fd5b612b25826020830160208601615dc8565b600080604083850312156157a4578182fd5b823591506154f16020840161549d565b600080600080600080600060e0888a0312156157ce578485fd5b873596506157de6020890161549d565b95506157ec6040890161548d565b94506157fa6060890161548d565b93506158086080890161548d565b925061581660a0890161548d565b915061582460c0890161548d565b905092959891949750929550565b600080600080600080600080610100898b03121561584e578182fd5b8835975061585e60208a0161549d565b965061586c60408a0161549d565b955061587a60608a0161549d565b945061588860808a0161549d565b935061589660a08a0161549d565b92506158a460c08a0161549d565b91506158b260e08a0161549d565b90509295985092959890939650565b6000602082840312156158d2578081fd5b61408f8261549d565b6000602082840312156158ec578081fd5b81356001600160581b038116811461408f578182fd5b6000815180845261591a816020860160208601615dc8565b601f01601f19169290920160200192915050565b6001600160601b0319606093841b811682529190921b16601482015260280190565b6001600160a01b0391909116815260200190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061599790830184615902565b9695505050505050565b6001600160a01b03929092168252602082015260400190565b60808101600286106159dc57634e487b7160e01b600052602160045260246000fd5b9481526001600160a01b0393909316602084015265ffffffffffff91909116604083015264ffffffffff1660609091015290565b60208152600061408f6020830184615902565b6020808252600b908201526a1b5a5b9d081b1bd8dad95960aa1b604082015260600190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252600890820152676e6f2066756e647360c01b604082015260600190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b60208082526007908201526631b432b0ba32b960c91b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252600b908201526a19d85b59481c185d5cd95960aa1b604082015260600190565b838152606060208201526000615c196060830185615902565b9050826040830152949350505050565b604051601f8201601f191681016001600160401b0381118282101715615c5157615c51615ec8565b604052919050565b60006001600160401b03821115615c7257615c72615ec8565b50601f01601f191660200190565b600061ffff808316818516808303821115615c9d57615c9d615e9c565b01949350505050565b60008219821115615cb957615cb9615e9c565b500190565b600060ff821660ff84168060ff03821115615cdb57615cdb615e9c565b019392505050565b60006001600160581b03828116848216808303821115615c9d57615c9d615e9c565b600082615d1457615d14615eb2565b500490565b6000816000190483118215151615615d3357615d33615e9c565b500290565b60006001600160581b0382811684821681151582840482111615615d5e57615d5e615e9c565b02949350505050565b600082821015615d7957615d79615e9c565b500390565b600065ffffffffffff83811690831681811015615d9d57615d9d615e9c565b039392505050565b600060ff821660ff841680821015615dbf57615dbf615e9c565b90039392505050565b60005b83811015615de3578181015183820152602001615dcb565b838111156128d85750506000910152565b600061ffff821680615e0857615e08615e9c565b6000190192915050565b600181811c90821680615e2657607f821691505b60208210811415615e4757634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415615e6157615e61615e9c565b5060010190565b600060ff821660ff811415615e7f57615e7f615e9c565b60010192915050565b600082615e9757615e97615eb2565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146120ad57600080fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa264697066735822122028c344260942ef8bfab252b3aea5f5d5260ec44c7bbe19fd8584e0303bd83fa464736f6c63430008040033
Deployed Bytecode
0x60806040526004361061029c5760003560e01c806301ffc9a7146102a157806306fdde03146102d6578063081812fc146102f8578063095ea7b31461032557806309647dfe146103475780630d0cdee01461036757806313faede61461038757806318160ddd146103b0578063239c70ae146103c557806323b872dd146103da5780632551cd34146103fa5780632bb1a91a1461041a5780632cc76cec146104595780632eb4a7ab146104795780632f745c59146104905780633a577ec9146104b05780633ccfd60b146104d05780633f4ba83a146104d8578063421f3d2d146104ed57806342842e0e1461050d5780634c8c32461461052d5780634f6ccce71461054d5780635932ead11461056d5780635bca47d51461058d5780635c975abb146105ad57806360ef50b9146105c55780636352211e146105d8578063668e780f146105f85780636cad4e5a1461062957806370a0823114610649578063715018a614610669578063719eb7c71461067e57806378e979251461069e5780637cb64759146106bf5780638129fc1c146106df5780638456cb59146106f457806386b75b44146107095780638da5cb5b1461072957806390494fb71461073e57806391d1ea4d1461075e57806395d89b411461077f578063972a4b4814610794578063a0712d68146107b4578063a1448194146107c7578063a22cb465146107e7578063ae40468114610807578063b02e893f14610877578063b54710c214610897578063b5c14adb14610946578063b7911ae614610966578063b88d4fde14610986578063c87b56dd146109a6578063d3cf00a3146109c6578063d5abeb01146109ee578063de230b9c14610a04578063e985e9c514610a24578063f158783a14610a44578063f2fde38b14610a64578063fb87a63514610a84575b600080fd5b3480156102ad57600080fd5b506102c16102bc3660046156f1565b610b3b565b60405190151581526020015b60405180910390f35b3480156102e257600080fd5b506102eb610b4c565b6040516102cd9190615a10565b34801561030457600080fd5b506103186103133660046156d9565b610bde565b6040516102cd9190615950565b34801561033157600080fd5b50610345610340366004615600565b610c6b565b005b34801561035357600080fd5b506103456103623660046154ae565b610d7c565b34801561037357600080fd5b506103456103823660046157b4565b610dce565b34801561039357600080fd5b506103a266b1a2bc2ec5000081565b6040519081526020016102cd565b3480156103bc57600080fd5b506099546103a2565b3480156103d157600080fd5b506103a2600181565b3480156103e657600080fd5b506103456103f53660046154fa565b611372565b34801561040657600080fd5b506103a26104153660046154ae565b6113a3565b34801561042657600080fd5b5061012e54610441906201000090046001600160581b031681565b6040516001600160581b0390911681526020016102cd565b34801561046557600080fd5b506103a2610474366004615600565b6114c9565b34801561048557600080fd5b506103a26101305481565b34801561049c57600080fd5b506103a26104ab366004615600565b611604565b3480156104bc57600080fd5b506102c16104cb3660046158c1565b61169a565b6103456116fa565b3480156104e457600080fd5b50610345611787565b3480156104f957600080fd5b50610345610508366004615680565b6117be565b34801561051957600080fd5b506103456105283660046154fa565b6118f3565b34801561053957600080fd5b50610345610548366004615680565b61190e565b34801561055957600080fd5b506103a26105683660046156d9565b61199b565b34801561057957600080fd5b506103456105883660046156bf565b611a3c565b34801561059957600080fd5b506103456105a8366004615600565b611a7f565b3480156105b957600080fd5b5060c95460ff166102c1565b6103456105d3366004615629565b611b17565b3480156105e457600080fd5b506103186105f33660046156d9565b611d22565b34801561060457600080fd5b506102c16106133660046158c1565b6101386020526000908152604090205460ff1681565b34801561063557600080fd5b506103456106443660046154ae565b611d99565b34801561065557600080fd5b506103a26106643660046154ae565b611deb565b34801561067557600080fd5b50610345611e72565b34801561068a57600080fd5b506103456106993660046158db565b611eab565b3480156106aa57600080fd5b5061012f54610441906001600160581b031681565b3480156106cb57600080fd5b506103456106da3660046156d9565b611f05565b3480156106eb57600080fd5b50610345611f3a565b34801561070057600080fd5b506103456120b0565b34801561071557600080fd5b506103456107243660046158db565b6120e7565b34801561073557600080fd5b50610318612143565b34801561074a57600080fd5b506103a26107593660046156d9565b612152565b34801561076a57600080fd5b5061013254610318906001600160a01b031681565b34801561078b57600080fd5b506102eb61229b565b3480156107a057600080fd5b506103a26107af3660046156d9565b6122aa565b6103456107c23660046156d9565b612402565b3480156107d357600080fd5b506103456107e2366004615600565b6125fe565b3480156107f357600080fd5b506103456108023660046155d7565b61263b565b34801561081357600080fd5b506108676108223660046156d9565b6101366020526000908152604090205460ff81169061010081046001600160a01b031690600160a81b810465ffffffffffff1690600160d81b900464ffffffffff1684565b6040516102cd94939291906159ba565b34801561088357600080fd5b506102c1610892366004615792565b6126fc565b3480156108a357600080fd5b506109036108b23660046156d9565b6101356020526000908152604090205460ff80821691610100810482169162010000820481169163010000008104821691600160201b8204811691600160281b8104821691600160301b9091041687565b6040805160ff9889168152968816602088015294871694860194909452918516606085015284166080840152831660a083015290911660c082015260e0016102cd565b34801561095257600080fd5b506103456109613660046156bf565b6127cf565b34801561097257600080fd5b50610345610981366004615680565b612819565b34801561099257600080fd5b506103456109a1366004615535565b6128a6565b3480156109b257600080fd5b506102eb6109c13660046156d9565b6128de565b3480156109d257600080fd5b5061012e5461044190600160681b90046001600160581b031681565b3480156109fa57600080fd5b506103a26115b381565b348015610a1057600080fd5b50610345610a1f3660046158db565b612b2e565b348015610a3057600080fd5b506102c1610a3f3660046154c8565b612b80565b348015610a5057600080fd5b50610345610a5f366004615832565b612bae565b348015610a7057600080fd5b50610345610a7f3660046154ae565b612e5c565b348015610a9057600080fd5b50610af4610a9f3660046158c1565b6101376020526000908152604090205461ffff8082169162010000810482169160ff600160201b83041691600160281b8104821691600160381b8204811691600160481b8104821691600160581b9091041687565b6040805161ffff9889168152968816602088015260ff90951694860194909452918516606085015284166080840152831660a08301529190911660c082015260e0016102cd565b6000610b4682612ef9565b92915050565b606060658054610b5b90615e12565b80601f0160208091040260200160405190810160405280929190818152602001828054610b8790615e12565b8015610bd45780601f10610ba957610100808354040283529160200191610bd4565b820191906000526020600020905b815481529060010190602001808311610bb757829003601f168201915b5050505050905090565b6000610be982612f1e565b610c4f5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152606960205260409020546001600160a01b031690565b6000610c7682611d22565b9050806001600160a01b0316836001600160a01b03161415610ce45760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610c46565b336001600160a01b0382161480610d005750610d008133612b80565b610d6d5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f776044820152771b995c881b9bdc88185c1c1c9bdd995908199bdc88185b1b60421b6064820152608401610c46565b610d778383612f3b565b505050565b33610d85612143565b6001600160a01b031614610dab5760405162461bcd60e51b8152600401610c4690615b55565b61013380546001600160a01b0319166001600160a01b0392909216919091179055565b33803b90328114610df15760405162461bcd60e51b8152600401610c4690615b34565b8115610e0f5760405162461bcd60e51b8152600401610c4690615b34565b600089815261013660205260408082208151608081019092528054829060ff166001811115610e4e57634e487b7160e01b600052602160045260246000fd5b6001811115610e6d57634e487b7160e01b600052602160045260246000fd5b8152905461010081046001600160a01b03166020830152600160a81b810465ffffffffffff166040830152600160d81b900464ffffffffff166060909101529050600081516001811115610ed157634e487b7160e01b600052602160045260246000fd5b1415610f0257610ee08a611d22565b6001600160a01b0316336001600160a01b031614610efd57600080fd5b610f4d565b600181516001811115610f2557634e487b7160e01b600052602160045260246000fd5b1415610f4d5780602001516001600160a01b0316336001600160a01b031614610f4d57600080fd5b60008a81526101356020908152604091829020825160e081018452905460ff80821683526101008083048216948401949094526201000082048116948301949094526301000000810484166060830152600160201b810484166080830152600160281b8104841660a0830152600160301b9004831660c082015261012e5490929190041615610fee5760405162461bcd60e51b8152600401610c4690615bdb565b8880610ff75750875b80610fff5750865b806110075750855b8061100f5750845b61104b5760405162461bcd60e51b815260206004820152600d60248201526c726f6c6c203e3020706172747360981b6044820152606401610c46565b6110558b8b6126fc565b61108c5760405162461bcd60e51b815260206004820152600860248201526731b7b7b63237bbb760c11b6044820152606401610c46565b60008a60ff161180156110a3575060068a60ff1611155b6110de5760405162461bcd60e51b815260206004820152600c60248201526b34b73b30b634b2103a34b2b960a11b6044820152606401610c46565b6110e78a61169a565b6111215760405162461bcd60e51b815260206004820152600b60248201526a1d1a595c881b1bd8dad95960aa1b6044820152606401610c46565b6006611133826040015160ff16612fa9565b60ff16106111795760405162461bcd60e51b815260206004820152601360248201527263616e277420726f6c6c206120756e6971756560681b6044820152606401610c46565b60008b81526101366020526040902080546001600160d81b0316600160d81b4264ffffffffff16021790556111ad8b612fcf565b610132546001600160a01b03166379cc6790336111ce8d8d8d8d8d8d6131c2565b6040518363ffffffff1660e01b81526004016111eb9291906159a1565b600060405180830381600087803b15801561120557600080fd5b505af1158015611219573d6000803e3d6000fd5b505050506000891561125b576112318c8c600061326c565b905061123f8160ff16612fa9565b60ff166006141561125b576112538c6137dc565b505050611338565b881561128f5761126d8c8c600161326c565b905061127b8160ff16612fa9565b60ff166006141561128f576112538c6137dc565b87156112c3576112a18c8c600261326c565b90506112af8160ff16612fa9565b60ff16600614156112c3576112538c6137dc565b86156112f7576112d58c8c600561326c565b90506112e38160ff16612fa9565b60ff16600614156112f7576112538c6137dc565b851561132b576113098c8c600661326c565b90506113178160ff16612fa9565b60ff166006141561132b576112538c6137dc565b6113348c613924565b5050505b804160405160200161134b92919061592e565b60408051601f19818403018152919052805160209091012061013455505050505050505050565b61137c33826139a6565b6113985760405162461bcd60e51b8152600401610c4690615b8a565b610d77838383613a68565b6000806113ae61536d565b60015b61012d5481116114c05760008181526101366020526040908190208151608081019092528054829060ff1660018111156113fb57634e487b7160e01b600052602160045260246000fd5b600181111561141a57634e487b7160e01b600052602160045260246000fd5b8152905461010081046001600160a01b03908116602080850191909152600160a81b830465ffffffffffff166040850152600160d81b90920464ffffffffff16606090930192909252820151919350868116911614801561149b575060018251600181111561149957634e487b7160e01b600052602160045260246000fd5b145b156114ae57826114aa81615e4d565b9350505b806114b881615e4d565b9150506113b1565b50909392505050565b6000806114d461536d565b60015b61012d5481116115f85760008181526101366020526040908190208151608081019092528054829060ff16600181111561152157634e487b7160e01b600052602160045260246000fd5b600181111561154057634e487b7160e01b600052602160045260246000fd5b8152905461010081046001600160a01b03908116602080850191909152600160a81b830465ffffffffffff166040850152600160d81b90920464ffffffffff1660609093019290925282015191935087811691161480156115c157506001825160018111156115bf57634e487b7160e01b600052602160045260246000fd5b145b156115e657848314156115d8579250610b46915050565b826115e281615e4d565b9350505b806115f081615e4d565b9150506114d7565b50600095945050505050565b600061160f83611deb565b82106116715760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610c46565b506001600160a01b03919091166000908152609760209081526040808320938352929052205490565b600060ff82166116ac57506001919050565b6116b7600183615da5565b6116c59060ff166001615d38565b6116d29062017bb0615d38565b61012f546116e991906001600160581b0316615ce3565b6001600160581b0316421192915050565b33611703612143565b6001600160a01b0316146117295760405162461bcd60e51b8152600401610c4690615b55565b60405133904780156108fc02916000818181858888f193505050506117855760405162461bcd60e51b8152602060048201526012602482015271636f756c64206e6f7420776974686472617760701b6044820152606401610c46565b565b33611790612143565b6001600160a01b0316146117b65760405162461bcd60e51b8152600401610c4690615b55565b611785613c01565b33803b903281146117e15760405162461bcd60e51b8152600401610c4690615b34565b81156117ff5760405162461bcd60e51b8152600401610c4690615b34565b61012f546001600160581b031642116118485760405162461bcd60e51b815260206004820152600b60248201526a1b9bdd081cdd185c9d195960aa1b6044820152606401610c46565b61012e54610100900460ff16156118715760405162461bcd60e51b8152600401610c4690615bdb565b60005b838110156118bd576118ab85858381811061189f57634e487b7160e01b600052603260045260246000fd5b90506020020135613c8e565b806118b581615e4d565b915050611874565b5080416040516020016118d192919061592e565b60408051601f1981840301815291905280516020909101206101345550505050565b610d77838383604051806020016040528060008152506128a6565b33803b903281146119315760405162461bcd60e51b8152600401610c4690615b34565b811561194f5760405162461bcd60e51b8152600401610c4690615b34565b60005b838110156118bd5761198985858381811061197d57634e487b7160e01b600052603260045260246000fd5b90506020020135613ee3565b8061199381615e4d565b915050611952565b60006119a660995490565b8210611a095760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610c46565b60998281548110611a2a57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b33611a45612143565b6001600160a01b031614611a6b5760405162461bcd60e51b8152600401610c4690615b55565b61012e805460ff1916911515919091179055565b33611a88612143565b6001600160a01b031614611aae5760405162461bcd60e51b8152600401610c4690615b55565b610132546040516340c10f1960e01b81526001600160a01b03909116906340c10f1990611ae190859085906004016159a1565b600060405180830381600087803b158015611afb57600080fd5b505af1158015611b0f573d6000803e3d6000fd5b505050505050565b33803b90328114611b3a5760405162461bcd60e51b8152600401610c4690615b34565b8115611b585760405162461bcd60e51b8152600401610c4690615b34565b61012e546201000090046001600160581b03164211611b895760405162461bcd60e51b8152600401610c4690615a23565b611b91612143565b6001600160a01b0316336001600160a01b031614158015611bb25750607185115b15611bde5766b1a2bc2ec50000341015611bde5760405162461bcd60e51b8152600401610c4690615a9a565b611c24611beb8787614036565b85858080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061407f92505050565b611c605760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210383937b7b360991b6044820152606401610c46565b6001600160a01b0386166000908152610131602052604090205415611cb85760405162461bcd60e51b815260206004820152600e60248201526d185b1c9958591e481b5a5b9d195960921b6044820152606401610c46565b6001600160a01b038616600090815261013160205260408120805491611cdd83615e4d565b9190505550611ceb86614096565b8041604051602001611cfe92919061592e565b60408051601f19818403018152919052805160209091012061013455505050505050565b6000818152606760205260408120546001600160a01b031680610b465760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610c46565b33611da2612143565b6001600160a01b031614611dc85760405162461bcd60e51b8152600401610c4690615b55565b61013280546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160a01b038216611e565760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610c46565b506001600160a01b031660009081526068602052604090205490565b33611e7b612143565b6001600160a01b031614611ea15760405162461bcd60e51b8152600401610c4690615b55565b6117856000614590565b33611eb4612143565b6001600160a01b031614611eda5760405162461bcd60e51b8152600401610c4690615b55565b61012e80546001600160581b03909216620100000262010000600160681b0319909216919091179055565b33611f0e612143565b6001600160a01b031614611f345760405162461bcd60e51b8152600401610c4690615b55565b61013055565b600054610100900460ff1680611f53575060005460ff16155b611f6f5760405162461bcd60e51b8152600401610c4690615ae6565b600054610100900460ff16158015611f91576000805461ffff19166101011790555b611fdc6040518060400160405280600981526020016845766f536e61696c7360b81b81525060405180604001604052806008815260200167115593d4d390525360c21b8152506145e2565b611fe4614669565b611fec6146ec565b611ff4614753565b61012e80546001600160c01b03191665617f9e800001630186011d606e1b0117905561012f805463618055506001600160581b031990911617905560405163091ce90360e21b81526101376004820152610139602482015273cbab1c973500112c389790a9f0c4c42071ffb4bb90632473a40c9060440160006040518083038186803b15801561208357600080fd5b505af4158015612097573d6000803e3d6000fd5b5050505080156120ad576000805461ff00191690555b50565b336120b9612143565b6001600160a01b0316146120df5760405162461bcd60e51b8152600401610c4690615b55565b6117856147ba565b336120f0612143565b6001600160a01b0316146121165760405162461bcd60e51b8152600401610c4690615b55565b61012e80546001600160581b03909216600160681b02600160681b600160c01b0319909216919091179055565b60fb546001600160a01b031690565b60008181526101366020526040808220815160808101909252805483929190829060ff16600181111561219557634e487b7160e01b600052602160045260246000fd5b60018111156121b457634e487b7160e01b600052602160045260246000fd5b8152905461010081046001600160a01b0316602080840191909152600160a81b80830465ffffffffffff908116604080870191909152600160d81b90940464ffffffffff1660609095019490945260008881526101369092529181205493945092612223929190041642615d7e565b65ffffffffffff16905060008251600181111561225057634e487b7160e01b600052602160045260246000fd5b1415612260575060009392505050565b6201518061226d856122aa565b6122779083615d19565b61228990670de0b6b3a7640000615d19565b6122939190615d05565b949350505050565b606060668054610b5b90615e12565b600081815261013560209081526040808320815160e081018352905460ff8082168352610100820481169483019490945262010000810484169282018390526301000000810484166060830152600160201b810484166080830152600160281b8104841660a0830152600160301b900490921660c083015260069061232e90612fa9565b60ff161061233f5750603c92915050565b6005915060006123558260c0015160ff16612fa9565b60ff16905080600714156123755761236e601984615ca6565b925061238a565b6002811061238a576123878184615ca6565b92505b81516123989060ff16612fa9565b6123a59060ff1684615ca6565b92506123b7826040015160ff16612fa9565b6123c49060ff1684615ca6565b92506123d6826060015160ff16612fa9565b6123e39060ff1684615ca6565b92506123f5826020015160ff16612fa9565b6122939060ff1684615ca6565b33803b903281146124255760405162461bcd60e51b8152600401610c4690615b34565b81156124435760405162461bcd60e51b8152600401610c4690615b34565b600061244e60995490565b61012e54909150600160681b90046001600160581b031642116124835760405162461bcd60e51b8152600401610c4690615a23565b600084116124c75760405162461bcd60e51b81526020600482015260116024820152700616d6f756e74206d757374206265203e3607c1b6044820152606401610c46565b600184111561250c5760405162461bcd60e51b81526020600482015260116024820152700c2dadeeadce840daeae6e8407840dac2f607b1b6044820152606401610c46565b6115b36125198583615ca6565b11156125535760405162461bcd60e51b8152602060048201526009602482015268736f6c64206f75742160b81b6044820152606401610c46565b61255b612143565b6001600160a01b0316336001600160a01b0316146125a3576125848466b1a2bc2ec50000615d19565b3410156125a35760405162461bcd60e51b8152600401610c4690615a9a565b60015b8481116125c8576125b633614096565b806125c081615e4d565b9150506125a6565b505080416040516020016125dd92919061592e565b60408051601f19818403018152919052805160209091012061013455505050565b33612607612143565b6001600160a01b03161461262d5760405162461bcd60e51b8152600401610c4690615b55565b6126378282614812565b5050565b6001600160a01b0382163314156126905760405162461bcd60e51b815260206004820152601960248201527822a9219b99189d1030b8383937bb32903a379031b0b63632b960391b6044820152606401610c46565b336000818152606a602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60008281526101366020526040808220815160808101909252805483929190829060ff16600181111561273f57634e487b7160e01b600052602160045260246000fd5b600181111561275e57634e487b7160e01b600052602160045260246000fd5b8152905461010081046001600160a01b03166020830152600160a81b810465ffffffffffff166040830152600160d81b900464ffffffffff1660609091015290506127a88361482c565b64ffffffffff16816060015164ffffffffff16426127c69190615d67565b11949350505050565b336127d8612143565b6001600160a01b0316146127fe5760405162461bcd60e51b8152600401610c4690615b55565b61012e80549115156101000261ff0019909216919091179055565b33803b9032811461283c5760405162461bcd60e51b8152600401610c4690615b34565b811561285a5760405162461bcd60e51b8152600401610c4690615b34565b60005b838110156118bd5761289485858381811061288857634e487b7160e01b600052603260045260246000fd5b90506020020135612fcf565b8061289e81615e4d565b91505061285d565b6128b033836139a6565b6128cc5760405162461bcd60e51b8152600401610c4690615b8a565b6128d88484848461484b565b50505050565b600081815261013560209081526040808320815160e081018352905460ff80821683526101008204811683860152620100008204811683850152630100000082048116606084810191909152600160201b83048216608080860191909152600160281b8404831660a0860152600160301b909304821660c0850152878752610136909552838620845192830190945283549495929492939192839116600181111561299957634e487b7160e01b600052602160045260246000fd5b60018111156129b857634e487b7160e01b600052602160045260246000fd5b8152905461010081046001600160a01b03166020830152600160a81b810465ffffffffffff166040830152600160d81b900464ffffffffff1660609091015290506000612a04856122aa565b610133548451602086015160408701516060880151608089015160a08a015160c08b01519798506001600160a01b0390961696635d7d0289968d96959493929160018c516001811115612a6757634e487b7160e01b600052602160045260246000fd5b6040516001600160e01b031960e08d901b16815261ffff909a1660048b015260ff98891660248b015296881660448a01529487166064890152928616608488015290851660a4870152841660c4860152831660e48501521461010483015284166101248201526101440160006040518083038186803b158015612ae957600080fd5b505afa158015612afd573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612b259190810190615729565b95945050505050565b33612b37612143565b6001600160a01b031614612b5d5760405162461bcd60e51b8152600401610c4690615b55565b61012f80546001600160581b0319166001600160581b0392909216919091179055565b6001600160a01b039182166000908152606a6020908152604080832093909416825291909152205460ff1690565b33612bb7612143565b6001600160a01b031614612bdd5760405162461bcd60e51b8152600401610c4690615b55565b600061013560008a81526020019081526020016000206040518060e00160405290816000820160009054906101000a900460ff1660ff1660ff1681526020016000820160019054906101000a900460ff1660ff1660ff1681526020016000820160029054906101000a900460ff1660ff1660ff1681526020016000820160039054906101000a900460ff1660ff1660ff1681526020016000820160049054906101000a900460ff1660ff1660ff1681526020016000820160059054906101000a900460ff1660ff1660ff1681526020016000820160069054906101000a900460ff1660ff1660ff16815250509050878160c0019060ff16908160ff168152505086816000019060ff16908160ff168152505085816040019060ff16908160ff168152505084816080019060ff16908160ff1681525050838160a0019060ff16908160ff168152505082816060019060ff16908160ff168152505081816020019060ff16908160ff16815250508061013560008b815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548160ff021916908360ff16021790555060608201518160000160036101000a81548160ff021916908360ff16021790555060808201518160000160046101000a81548160ff021916908360ff16021790555060a08201518160000160056101000a81548160ff021916908360ff16021790555060c08201518160000160066101000a81548160ff021916908360ff160217905550905050612e5189613924565b505050505050505050565b33612e65612143565b6001600160a01b031614612e8b5760405162461bcd60e51b8152600401610c4690615b55565b6001600160a01b038116612ef05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c46565b6120ad81614590565b60006001600160e01b0319821663780e9d6360e01b1480610b465750610b468261487e565b6000908152606760205260409020546001600160a01b0316151590565b600081815260696020526040902080546001600160a01b0319166001600160a01b0384169081179091558190612f7082611d22565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081612fb857506000919050565b6005612fc5600184615d67565b610b469190615d05565b600081815261013660205260408082208151608081019092528054829060ff16600181111561300e57634e487b7160e01b600052602160045260246000fd5b600181111561302d57634e487b7160e01b600052602160045260246000fd5b8152905461010081046001600160a01b03166020830152600160a81b810465ffffffffffff166040830152600160d81b900464ffffffffff16606090910152905060008151600181111561309157634e487b7160e01b600052602160045260246000fd5b14156130c2576130a082611d22565b6001600160a01b0316336001600160a01b0316146130bd57600080fd5b61310d565b6001815160018111156130e557634e487b7160e01b600052602160045260246000fd5b141561310d5780602001516001600160a01b0316336001600160a01b03161461310d57600080fd5b600061311883612152565b90508061312457505050565b610132546001600160a01b03166340c10f193361314086612152565b6040518363ffffffff1660e01b815260040161315d9291906159a1565b600060405180830381600087803b15801561317757600080fd5b505af115801561318b573d6000803e3d6000fd5b505050600093845250506101366020525060409020805465ffffffffffff60a81b1916600160a81b4265ffffffffffff1602179055565b60008086156131d957806131d581615e68565b9150505b85156131ed57806131e981615e68565b9150505b841561320157806131fd81615e68565b9150505b8315613215578061321181615e68565b9150505b8215613229578061322581615e68565b9150505b60ff8881166000908152610137602052604090205461324e9183169061ffff16615d19565b61326090670de0b6b3a7640000615d19565b98975050505050505050565b6000806132776148ce565b905060006132a58285600681111561329f57634e487b7160e01b600052602160045260246000fd5b88614916565b60ff80871660009081526101376020908152604091829020825160e081018452905461ffff80821683526201000082048116938301849052600160201b820490951693820193909352600160281b830484166060820152600160381b830484166080820152600160481b8304841660a0820152600160581b90920490921660c08201529192506133645760405162461bcd60e51b815260206004820152600a602482015269706f6f6c20656d70747960b01b6044820152606401610c46565b6000806133718484614955565b60008b815261013560209081526040808320815160e081018352905460ff808216835261010082048116948301949094526201000081048416928201929092526301000000820483166060820152600160201b820483166080820152600160281b8204831660a0820152600160301b90910490911660c082015292945090925088600681111561341157634e487b7160e01b600052602160045260246000fd5b14156134255760ff831660c0820152613630565b600188600681111561344757634e487b7160e01b600052602160045260246000fd5b14156134585760ff83168152613630565b600288600681111561347a57634e487b7160e01b600052602160045260246000fd5b14156135c85760ff831660408201819052601f11156135c357600060036134bf88604051806040016040528060048152602001636579657360e01b8152506000614bb9565b6134c99190615e88565b9050600060036134f789604051806040016040528060048152602001636579657360e01b8152506000614bb9565b6135019190615e88565b61350c906003615ca6565b60ff80871660009081526101396020526040902080549293509190841690811061354657634e487b7160e01b600052603260045260246000fd5b60009182526020808320818304015460ff601f9093166101000a90048216608087015287821683526101399052604090912080549091831690811061359b57634e487b7160e01b600052603260045260246000fd5b60009182526020918290209181049091015460ff601f9092166101000a90041660a084015250505b613630565b60058860068111156135ea57634e487b7160e01b600052602160045260246000fd5b14156135fe5760ff83166060820152613630565b600688600681111561362057634e487b7160e01b600052602160045260246000fd5b14156136305760ff831660208201525b60008a815261013560209081526040918290208351815492850151938501516060860151608087015160a088015160c089015160ff95861661ffff1990981697909717610100988616989098029790971763ffff00001916620100009385169390930263ff0000001916929092176301000000918416919091021761ffff60201b1916600160201b9183169190910260ff60281b191617600160281b948216949094029390931760ff60301b1916600160301b928416929092029190911790556002908a16106137ce5760ff808a16600090815261013760209081526040918290208551815492870151938701516060880151608089015160a08a015160c08b015161ffff908116600160581b0261ffff60581b19928216600160481b0261ffff60481b19948316600160381b029490941663ffffffff60381b19958316600160281b0261ffff60281b1997909c16600160201b029690961662ffffff60201b199a8316620100000263ffffffff19909a16929097169190911797909717979097169390931796909617959095169490941793909317919091161790555b509098975050505050505050565b600660009081526101376020527fe61ba6d5276b1f0e4decff92b6d57a453a7d0d5c2a55a75aaf612a522da84e675461382190600160381b900461ffff166001615cbe565b61382c90601e615cbe565b600083815261013560208181526040808420815160e081018352815460ff600160201b808304821660808501908152600160281b808504841660a087019081529b841660c0870181815281885298870181815260608801828152888c019283529f909c52999098529351975198519b5193519951955197821661ffff1990931692909217610100988216989098029790971763ffff00001916620100009a88169a909a0263ff0000001916999099176301000000918716919091021761ffff60201b191695851690970260ff60281b191694909417938316029290921760ff60301b1916600160301b92909116919091021790915550565b600081815261013560205260409081902090516001620f4f8b60e31b031981526004810191909152610138602482015273cbab1c973500112c389790a9f0c4c42071ffb4bb9063ff8583a89060440160006040518083038186803b15801561398b57600080fd5b505af415801561399f573d6000803e3d6000fd5b5050505050565b60006139b182612f1e565b613a125760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610c46565b6000613a1d83611d22565b9050806001600160a01b0316846001600160a01b03161480613a585750836001600160a01b0316613a4d84610bde565b6001600160a01b0316145b8061229357506122938185612b80565b826001600160a01b0316613a7b82611d22565b6001600160a01b031614613ae35760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610c46565b6001600160a01b038216613b455760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610c46565b613b50838383614bd0565b613b5b600082612f3b565b6001600160a01b0383166000908152606860205260408120805460019290613b84908490615d67565b90915550506001600160a01b0382166000908152606860205260408120805460019290613bb2908490615ca6565b909155505060008181526067602052604080822080546001600160a01b0319166001600160a01b038681169182179092559151849391871691600080516020615ef583398151915291a4505050565b60c95460ff16613c4a5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610c46565b60c9805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b604051613c849190615950565b60405180910390a1565b600081815261013660205260408082208151608081019092528054829060ff166001811115613ccd57634e487b7160e01b600052602160045260246000fd5b6001811115613cec57634e487b7160e01b600052602160045260246000fd5b8152905461010081046001600160a01b03166020830152600160a81b810465ffffffffffff166040830152600160d81b900464ffffffffff166060909101529050600181516001811115613d5057634e487b7160e01b600052602160045260246000fd5b1415613d8f5760405162461bcd60e51b815260206004820152600e60248201526d185b1c9958591e481cdd185ad95960921b6044820152606401610c46565b613d9882611d22565b6001600160a01b0316336001600160a01b031614613de45760405162461bcd60e51b81526020600482015260096024820152686e6f7420796f75727360b81b6044820152606401610c46565b613def333084613a68565b60408051608081019091528060015b81523360208083019190915265ffffffffffff421660408084019190915260608581015164ffffffffff1693019290925260008581526101369091522081518154829060ff191660018381811115613e6657634e487b7160e01b600052602160045260246000fd5b021790555060208201518154604084015160609094015164ffffffffff16600160d81b026001600160d81b0365ffffffffffff909516600160a81b0265ffffffffffff60a81b196001600160a01b039094166101000293909316610100600160d81b03199092169190911791909117929092169190911790555050565b600081815261013660205260408082208151608081019092528054829060ff166001811115613f2257634e487b7160e01b600052602160045260246000fd5b6001811115613f4157634e487b7160e01b600052602160045260246000fd5b8152905461010081046001600160a01b03166020830152600160a81b810465ffffffffffff166040830152600160d81b900464ffffffffff166060909101529050600081516001811115613fa557634e487b7160e01b600052602160045260246000fd5b1415613fe65760405162461bcd60e51b815260206004820152601060248201526f185b1c9958591e481d5b9cdd185ad95960821b6044820152606401610c46565b6000828152610136602052604090205461010090046001600160a01b0316331461400f57600080fd5b61401a303384613a68565b61402382612fcf565b6040805160808101909152806000613dfe565b6000818360405160200161406192919091825260601b6001600160601b031916602082015260340190565b60405160208183030381529060405280519060200120905092915050565b600061408f826101305485614bfe565b9392505050565b6140a561012d80546001019055565b60006140b161012d5490565b90506001806000808080806003816140c76148ce565b6000805261013760209081526040805160e0810182527f9656a38e5b8bf16175eb4bca28ffa04d5646d4e9da9a5df333165c7cb8a8693f5461ffff8082168352620100008204811683860152600160201b820460ff1683850152600160281b820481166060840152600160381b820481166080840152600160481b8204811660a0840152600160581b9091041660c082015281518083019092526004825263626f647960e01b928201929092529192509061418e906141889084908e614bb9565b82614955565b80925081995050506141c161418883604051806040016040528060058152602001641cda195b1b60da1b8152508e614bb9565b80925081965050506141f461418883604051806040016040528060058152602001641d1c985a5b60da1b8152508e614bb9565b809250819550505061013960008960ff1660ff1681526020019081526020016000208360ff1661424184604051806040016040528060048152602001636579657360e01b8152508f614bb9565b61424b9190615e88565b8154811061426957634e487b7160e01b600052603260045260246000fd5b90600052602060002090602091828204019190069054906101000a900460ff16965061013960008960ff1660ff1681526020019081526020016000208360ff166142d184604051806040016040528060058152602001640dadeeae8d60db1b8152508f614bb9565b6142db9190615e88565b6142e6906003615ca6565b8154811061430457634e487b7160e01b600052603260045260246000fd5b90600052602060002090602091828204019190069054906101000a900460ff1695506143308c8c614cbb565b6040518060e001604052808a60ff1681526020018560ff1681526020018960ff1681526020018660ff1681526020018860ff1681526020018760ff1681526020018b60ff1681525061013560008d815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548160ff021916908360ff16021790555060608201518160000160036101000a81548160ff021916908360ff16021790555060808201518160000160046101000a81548160ff021916908360ff16021790555060a08201518160000160056101000a81548160ff021916908360ff16021790555060c08201518160000160066101000a81548160ff021916908360ff1602179055509050506040518060800160405280600060018111156144a257634e487b7160e01b600052602160045260246000fd5b81526001600160a01b038e1660208083019190915265ffffffffffff4216604080840191909152600060609093018390528e8352610136909152902081518154829060ff19166001838181111561450957634e487b7160e01b600052602160045260246000fd5b021790555060208201518154604084015160609094015164ffffffffff16600160d81b026001600160d81b0365ffffffffffff909516600160a81b0265ffffffffffff60a81b196001600160a01b039094166101000293909316610100600160d81b0319909216919091179190911792909216919091179055505050505050505050505050565b60fb80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff16806145fb575060005460ff16155b6146175760405162461bcd60e51b8152600401610c4690615ae6565b600054610100900460ff16158015614639576000805461ffff19166101011790555b614641614de7565b614649614de7565b6146538383614e51565b8015610d77576000805461ff0019169055505050565b600054610100900460ff1680614682575060005460ff16155b61469e5760405162461bcd60e51b8152600401610c4690615ae6565b600054610100900460ff161580156146c0576000805461ffff19166101011790555b6146c8614de7565b6146d0614de7565b6146d8614de7565b80156120ad576000805461ff001916905550565b600054610100900460ff1680614705575060005460ff16155b6147215760405162461bcd60e51b8152600401610c4690615ae6565b600054610100900460ff16158015614743576000805461ffff19166101011790555b61474b614de7565b6146d8614ee6565b600054610100900460ff168061476c575060005460ff16155b6147885760405162461bcd60e51b8152600401610c4690615ae6565b600054610100900460ff161580156147aa576000805461ffff19166101011790555b6147b2614de7565b6146d8614f5b565b60c95460ff16156147dd5760405162461bcd60e51b8152600401610c4690615abc565b60c9805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258613c773390565b612637828260405180602001604052806000815250614fbb565b61012e5460009060ff1661484257506000919050565b50617080919050565b614856848484613a68565b61486284848484614fee565b6128d85760405162461bcd60e51b8152600401610c4690615a48565b60006001600160e01b031982166380ac58cd60e01b14806148af57506001600160e01b03198216635b5e139f60e01b145b80610b4657506301ffc9a760e01b6001600160e01b0319831614610b46565b61013454604080513360601b6001600160601b031916602080830191909152426034830152605480830194909452825180830390940184526074909101909152815191012090565b6040805160208101859052908101839052606081018290526000906080015b60408051601f198184030181529190528051602090910120949350505050565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290526000836020015161ffff16856149a39190615e88565b6020850180519192506149b582615df4565b61ffff1690525060a084015160808501516060860151600092916149d891615c80565b6149e29190615c80565b61ffff1682101580156149fd575060008560c0015161ffff16115b15614a6057600585604001516003614a159190615cbe565b60ff16614a229190615d19565b614a2d600584615e88565b614a38906001615ca6565b614a429190615ca6565b60c086018051919250614a5482615df4565b61ffff16905250614bab565b84608001518560600151614a749190615c80565b61ffff168210158015614a8f575060008560a0015161ffff16115b15614ae657600585604001516002614aa79190615cbe565b60ff16614ab49190615d19565b614abf600584615e88565b614aca906001615ca6565b614ad49190615ca6565b60a086018051919250614a5482615df4565b846060015161ffff168210158015614b0657506000856080015161ffff16115b15614b5d57600585604001516001614b1e9190615cbe565b60ff16614b2b9190615d19565b614b36600584615e88565b614b41906001615ca6565b614b4b9190615ca6565b608086018051919250614a5482615df4565b6005856040015160ff16614b719190615d19565b614b7c600584615e88565b614b87906001615ca6565b614b919190615ca6565b606086018051919250614ba382615df4565b61ffff169052505b9250839150505b9250929050565b600083838360405160200161493593929190615c00565b60c95460ff1615614bf35760405162461bcd60e51b8152600401610c4690615abc565b610d778383836150fb565b600081815b8551811015614cb0576000868281518110614c2e57634e487b7160e01b600052603260045260246000fd5b60200260200101519050808311614c70576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250614c9d565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b5080614ca881615e4d565b915050614c03565b509092149392505050565b6001600160a01b038216614d115760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610c46565b614d1a81612f1e565b15614d665760405162461bcd60e51b815260206004820152601c60248201527b115490cdcc8c4e881d1bdad95b88185b1c9958591e481b5a5b9d195960221b6044820152606401610c46565b614d7260008383614bd0565b6001600160a01b0382166000908152606860205260408120805460019290614d9b908490615ca6565b909155505060008181526067602052604080822080546001600160a01b0319166001600160a01b0386169081179091559051839290600080516020615ef5833981519152908290a45050565b600054610100900460ff1680614e00575060005460ff16155b614e1c5760405162461bcd60e51b8152600401610c4690615ae6565b600054610100900460ff161580156146d8576000805461ffff191661010117905580156120ad576000805461ff001916905550565b600054610100900460ff1680614e6a575060005460ff16155b614e865760405162461bcd60e51b8152600401610c4690615ae6565b600054610100900460ff16158015614ea8576000805461ffff19166101011790555b8251614ebb906065906020860190615396565b508151614ecf906066906020850190615396565b508015610d77576000805461ff0019169055505050565b600054610100900460ff1680614eff575060005460ff16155b614f1b5760405162461bcd60e51b8152600401610c4690615ae6565b600054610100900460ff16158015614f3d576000805461ffff19166101011790555b60c9805460ff1916905580156120ad576000805461ff001916905550565b600054610100900460ff1680614f74575060005460ff16155b614f905760405162461bcd60e51b8152600401610c4690615ae6565b600054610100900460ff16158015614fb2576000805461ffff19166101011790555b6146d833614590565b614fc58383614cbb565b614fd26000848484614fee565b610d775760405162461bcd60e51b8152600401610c4690615a48565b60006001600160a01b0384163b156150f057604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290615032903390899088908890600401615964565b602060405180830381600087803b15801561504c57600080fd5b505af192505050801561507c575060408051601f3d908101601f191682019092526150799181019061570d565b60015b6150d6573d8080156150aa576040519150601f19603f3d011682016040523d82523d6000602084013e6150af565b606091505b5080516150ce5760405162461bcd60e51b8152600401610c4690615a48565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612293565b506001949350505050565b6001600160a01b0383166151565761515181609980546000838152609a60205260408120829055600182018355919091527f72a152ddfb8e864297c917af52ea6c1c68aead0fee1a62673fcc7e0c94979d000155565b615179565b816001600160a01b0316836001600160a01b0316146151795761517983826151b3565b6001600160a01b03821661519057610d7781615250565b826001600160a01b0316826001600160a01b031614610d7757610d778282615329565b600060016151c084611deb565b6151ca9190615d67565b60008381526098602052604090205490915080821461521d576001600160a01b03841660009081526097602090815260408083208584528252808320548484528184208190558352609890915290208190555b5060009182526098602090815260408084208490556001600160a01b039094168352609781528383209183525290812055565b60995460009061526290600190615d67565b6000838152609a60205260408120546099805493945090928490811061529857634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905080609983815481106152c757634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255828152609a9091526040808220849055858252812055609980548061530d57634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061533483611deb565b6001600160a01b039093166000908152609760209081526040808320868452825280832085905593825260989052919091209190915550565b604080516080810190915280600081526000602082018190526040820181905260609091015290565b8280546153a290615e12565b90600052602060002090601f0160209004810192826153c4576000855561540a565b82601f106153dd57805160ff191683800117855561540a565b8280016001018555821561540a579182015b8281111561540a5782518255916020019190600101906153ef565b5061541692915061541a565b5090565b5b80821115615416576000815560010161541b565b80356001600160a01b038116811461544657600080fd5b919050565b60008083601f84011261545c578081fd5b5081356001600160401b03811115615472578182fd5b6020830191508360208260051b8501011115614bb257600080fd5b8035801515811461544657600080fd5b803560ff8116811461544657600080fd5b6000602082840312156154bf578081fd5b61408f8261542f565b600080604083850312156154da578081fd5b6154e38361542f565b91506154f16020840161542f565b90509250929050565b60008060006060848603121561550e578081fd5b6155178461542f565b92506155256020850161542f565b9150604084013590509250925092565b6000806000806080858703121561554a578081fd5b6155538561542f565b93506155616020860161542f565b92506040850135915060608501356001600160401b03811115615582578182fd5b8501601f81018713615592578182fd5b80356155a56155a082615c59565b615c29565b8181528860208385010111156155b9578384fd5b81602084016020830137908101602001929092525092959194509250565b600080604083850312156155e9578182fd5b6155f28361542f565b91506154f16020840161548d565b60008060408385031215615612578182fd5b61561b8361542f565b946020939093013593505050565b6000806000806060858703121561563e578384fd5b6156478561542f565b93506020850135925060408501356001600160401b03811115615668578283fd5b6156748782880161544b565b95989497509550505050565b60008060208385031215615692578182fd5b82356001600160401b038111156156a7578283fd5b6156b38582860161544b565b90969095509350505050565b6000602082840312156156d0578081fd5b61408f8261548d565b6000602082840312156156ea578081fd5b5035919050565b600060208284031215615702578081fd5b813561408f81615ede565b60006020828403121561571e578081fd5b815161408f81615ede565b60006020828403121561573a578081fd5b81516001600160401b0381111561574f578182fd5b8201601f8101841361575f578182fd5b805161576d6155a082615c59565b818152856020838501011115615781578384fd5b612b25826020830160208601615dc8565b600080604083850312156157a4578182fd5b823591506154f16020840161549d565b600080600080600080600060e0888a0312156157ce578485fd5b873596506157de6020890161549d565b95506157ec6040890161548d565b94506157fa6060890161548d565b93506158086080890161548d565b925061581660a0890161548d565b915061582460c0890161548d565b905092959891949750929550565b600080600080600080600080610100898b03121561584e578182fd5b8835975061585e60208a0161549d565b965061586c60408a0161549d565b955061587a60608a0161549d565b945061588860808a0161549d565b935061589660a08a0161549d565b92506158a460c08a0161549d565b91506158b260e08a0161549d565b90509295985092959890939650565b6000602082840312156158d2578081fd5b61408f8261549d565b6000602082840312156158ec578081fd5b81356001600160581b038116811461408f578182fd5b6000815180845261591a816020860160208601615dc8565b601f01601f19169290920160200192915050565b6001600160601b0319606093841b811682529190921b16601482015260280190565b6001600160a01b0391909116815260200190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061599790830184615902565b9695505050505050565b6001600160a01b03929092168252602082015260400190565b60808101600286106159dc57634e487b7160e01b600052602160045260246000fd5b9481526001600160a01b0393909316602084015265ffffffffffff91909116604083015264ffffffffff1660609091015290565b60208152600061408f6020830184615902565b6020808252600b908201526a1b5a5b9d081b1bd8dad95960aa1b604082015260600190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252600890820152676e6f2066756e647360c01b604082015260600190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b60208082526007908201526631b432b0ba32b960c91b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252600b908201526a19d85b59481c185d5cd95960aa1b604082015260600190565b838152606060208201526000615c196060830185615902565b9050826040830152949350505050565b604051601f8201601f191681016001600160401b0381118282101715615c5157615c51615ec8565b604052919050565b60006001600160401b03821115615c7257615c72615ec8565b50601f01601f191660200190565b600061ffff808316818516808303821115615c9d57615c9d615e9c565b01949350505050565b60008219821115615cb957615cb9615e9c565b500190565b600060ff821660ff84168060ff03821115615cdb57615cdb615e9c565b019392505050565b60006001600160581b03828116848216808303821115615c9d57615c9d615e9c565b600082615d1457615d14615eb2565b500490565b6000816000190483118215151615615d3357615d33615e9c565b500290565b60006001600160581b0382811684821681151582840482111615615d5e57615d5e615e9c565b02949350505050565b600082821015615d7957615d79615e9c565b500390565b600065ffffffffffff83811690831681811015615d9d57615d9d615e9c565b039392505050565b600060ff821660ff841680821015615dbf57615dbf615e9c565b90039392505050565b60005b83811015615de3578181015183820152602001615dcb565b838111156128d85750506000910152565b600061ffff821680615e0857615e08615e9c565b6000190192915050565b600181811c90821680615e2657607f821691505b60208210811415615e4757634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415615e6157615e61615e9c565b5060010190565b600060ff821660ff811415615e7f57615e7f615e9c565b60010192915050565b600082615e9757615e97615eb2565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146120ad57600080fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa264697066735822122028c344260942ef8bfab252b3aea5f5d5260ec44c7bbe19fd8584e0303bd83fa464736f6c63430008040033
Deployed Bytecode Sourcemap
107667:21247:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;128718:193;;;;;;;;;;-1:-1:-1;128718:193:0;;;;;:::i;:::-;;:::i;:::-;;;10786:14:1;;10779:22;10761:41;;10749:2;10734:18;128718:193:0;;;;;;;;23780:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;25350:221::-;;;;;;;;;;-1:-1:-1;25350:221:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;24862:422::-;;;;;;;;;;-1:-1:-1;24862:422:0;;;;;:::i;:::-;;:::i;:::-;;110152:126;;;;;;;;;;-1:-1:-1;110152:126:0;;;;;:::i;:::-;;:::i;116302:2417::-;;;;;;;;;;-1:-1:-1;116302:2417:0;;;;;:::i;:::-;;:::i;108068:41::-;;;;;;;;;;;;108099:10;108068:41;;;;;10959:25:1;;;10947:2;10932:18;108068:41:0;10914:76:1;38069:113:0;;;;;;;;;;-1:-1:-1;38157:10:0;:17;38069:113;;108163:41;;;;;;;;;;;;108203:1;108163:41;;26240:339;;;;;;;;;;-1:-1:-1;26240:339:0;;;;;:::i;:::-;;:::i;115263:390::-;;;;;;;;;;-1:-1:-1;115263:390:0;;;;;:::i;:::-;;:::i;108333:36::-;;;;;;;;;;-1:-1:-1;108333:36:0;;;;;;;-1:-1:-1;;;;;108333:36:0;;;;;;-1:-1:-1;;;;;30103:31:1;;;30085:50;;30073:2;30058:18;108333:36:0;30040:101:1;115661:483:0;;;;;;;;;;-1:-1:-1;115661:483:0;;;;;:::i;:::-;;:::i;108448:25::-;;;;;;;;;;;;;;;;37726:267;;;;;;;;;;-1:-1:-1;37726:267:0;;;;;:::i;:::-;;:::i;122658:187::-;;;;;;;;;;-1:-1:-1;122658:187:0;;;;;:::i;:::-;;:::i;123827:142::-;;;:::i;126624:65::-;;;;;;;;;;;;;:::i;112315:299::-;;;;;;;;;;-1:-1:-1;112315:299:0;;;;;:::i;:::-;;:::i;26650:185::-;;;;;;;;;;-1:-1:-1;26650:185:0;;;;;:::i;:::-;;:::i;113168:186::-;;;;;;;;;;-1:-1:-1;113168:186:0;;;;;:::i;:::-;;:::i;38259:244::-;;;;;;;;;;-1:-1:-1;38259:244:0;;;;;:::i;:::-;;:::i;127034:105::-;;;;;;;;;;-1:-1:-1;127034:105:0;;;;;:::i;:::-;;:::i;123977:107::-;;;;;;;;;;-1:-1:-1;123977:107:0;;;;;:::i;:::-;;:::i;44965:86::-;;;;;;;;;;-1:-1:-1;45036:7:0;;;;44965:86;;111133:549;;;;;;:::i;:::-;;:::i;23474:239::-;;;;;;;;;;-1:-1:-1;23474:239:0;;;;;:::i;:::-;;:::i;109457:40::-;;;;;;;;;;-1:-1:-1;109457:40:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;110286:86;;;;;;;;;;-1:-1:-1;110286:86:0;;;;;:::i;:::-;;:::i;23204:208::-;;;;;;;;;;-1:-1:-1;23204:208:0;;;;;:::i;:::-;;:::i;48078:94::-;;;;;;;;;;;;;:::i;126697:115::-;;;;;;;;;;-1:-1:-1;126697:115:0;;;;;:::i;:::-;;:::i;108416:23::-;;;;;;;;;;-1:-1:-1;108416:23:0;;;;-1:-1:-1;;;;;108416:23:0;;;128277:104;;;;;;;;;;-1:-1:-1;128277:104:0;;;;;:::i;:::-;;:::i;109716:428::-;;;;;;;;;;;;;:::i;126555:61::-;;;;;;;;;;;;;:::i;126820:109::-;;;;;;;;;;-1:-1:-1;126820:109:0;;;;;:::i;:::-;;:::i;47427:87::-;;;;;;;;;;;;;:::i;111840:467::-;;;;;;;;;;-1:-1:-1;111840:467:0;;;;;:::i;:::-;;:::i;108529:46::-;;;;;;;;;;-1:-1:-1;108529:46:0;;;;-1:-1:-1;;;;;108529:46:0;;;23949:104;;;;;;;;;;;;;:::i;114710:545::-;;;;;;;;;;-1:-1:-1;114710:545:0;;;;;:::i;:::-;;:::i;110530:595::-;;;;;;:::i;:::-;;:::i;127248:109::-;;;;;;;;;;-1:-1:-1;127248:109:0;;;;;:::i;:::-;;:::i;25643:295::-;;;;;;;;;;-1:-1:-1;25643:295:0;;;;;:::i;:::-;;:::i;109205:51::-;;;;;;;;;;-1:-1:-1;109205:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;109205:51:0;;-1:-1:-1;;;109205:51:0;;;;;-1:-1:-1;;;109205:51:0;;;;;;;;;;;;;;;;:::i;118727:241::-;;;;;;;;;;-1:-1:-1;118727:241:0;;;;;:::i;:::-;;:::i;108951:39::-;;;;;;;;;;-1:-1:-1;108951:39:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;108951:39:0;;;;;-1:-1:-1;;;108951:39:0;;;;;-1:-1:-1;;;108951:39:0;;;;;;;;;;30443:4:1;30474:15;;;30456:34;;30526:15;;;30521:2;30506:18;;30499:43;30578:15;;;30558:18;;;30551:43;;;;30630:15;;;30625:2;30610:18;;30603:43;30683:15;;30677:3;30662:19;;30655:44;30736:15;;30730:3;30715:19;;30708:44;30789:15;;;30783:3;30768:19;;30761:44;30420:3;30405:19;108951:39:0;30387:424:1;127147:93:0;;;;;;;;;;-1:-1:-1;127147:93:0;;;;;:::i;:::-;;:::i;113935:187::-;;;;;;;;;;-1:-1:-1;113935:187:0;;;;;:::i;:::-;;:::i;26906:328::-;;;;;;;;;;-1:-1:-1;26906:328:0;;;;;:::i;:::-;;:::i;123015:643::-;;;;;;;;;;-1:-1:-1;123015:643:0;;;;;:::i;:::-;;:::i;108376:33::-;;;;;;;;;;-1:-1:-1;108376:33:0;;;;-1:-1:-1;;;108376:33:0;;-1:-1:-1;;;;;108376:33:0;;;108116:40;;;;;;;;;;;;108152:4;108116:40;;126937:89;;;;;;;;;;-1:-1:-1;126937:89:0;;;;;:::i;:::-;;:::i;26009:164::-;;;;;;;;;;-1:-1:-1;26009:164:0;;;;;:::i;:::-;;:::i;127365:562::-;;;;;;;;;;-1:-1:-1;127365:562:0;;;;;:::i;:::-;;:::i;48327:192::-;;;;;;;;;;-1:-1:-1;48327:192:0;;;;;:::i;:::-;;:::i;109409:39::-;;;;;;;;;;-1:-1:-1;109409:39:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;109409:39:0;;;;-1:-1:-1;;;109409:39:0;;;;;-1:-1:-1;;;109409:39:0;;;;;-1:-1:-1;;;109409:39:0;;;;;-1:-1:-1;;;109409:39:0;;;;;;;;;;27780:6:1;27813:15;;;27795:34;;27865:15;;;27860:2;27845:18;;27838:43;27929:4;27917:17;;;27897:18;;;27890:45;;;;27971:15;;;27966:2;27951:18;;27944:43;28024:15;;28018:3;28003:19;;27996:44;28077:15;;28071:3;28056:19;;28049:44;28130:15;;;;28124:3;28109:19;;28102:44;27757:3;27742:19;109409:39:0;27724:428:1;128718:193:0;128843:4;128867:36;128891:11;128867:23;:36::i;:::-;128860:43;128718:193;-1:-1:-1;;128718:193:0:o;23780:100::-;23834:13;23867:5;23860:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23780:100;:::o;25350:221::-;25426:7;25454:16;25462:7;25454;:16::i;:::-;25446:73;;;;-1:-1:-1;;;25446:73:0;;21887:2:1;25446:73:0;;;21869:21:1;21926:2;21906:18;;;21899:30;21965:34;21945:18;;;21938:62;-1:-1:-1;;;22016:18:1;;;22009:42;22068:19;;25446:73:0;;;;;;;;;-1:-1:-1;25539:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;25539:24:0;;25350:221::o;24862:422::-;24943:13;24959:34;24985:7;24959:25;:34::i;:::-;24943:50;;25018:5;-1:-1:-1;;;;;25012:11:0;:2;-1:-1:-1;;;;;25012:11:0;;;25004:57;;;;-1:-1:-1;;;25004:57:0;;24094:2:1;25004:57:0;;;24076:21:1;24133:2;24113:18;;;24106:30;24172:34;24152:18;;;24145:62;-1:-1:-1;;;24223:18:1;;;24216:31;24264:19;;25004:57:0;24066:223:1;25004:57:0;17554:10;-1:-1:-1;;;;;25096:21:0;;;;:62;;-1:-1:-1;25121:37:0;25138:5;17554:10;26009:164;:::i;25121:37::-;25074:168;;;;-1:-1:-1;;;25074:168:0;;18511:2:1;25074:168:0;;;18493:21:1;18550:2;18530:18;;;18523:30;18589:34;18569:18;;;18562:62;-1:-1:-1;;;18640:18:1;;;18633:54;18704:19;;25074:168:0;18483:246:1;25074:168:0;25255:21;25264:2;25268:7;25255:8;:21::i;:::-;24862:422;;;:::o;110152:126::-;17554:10;47647:7;:5;:7::i;:::-;-1:-1:-1;;;;;47647:23:0;;47639:68;;;;-1:-1:-1;;;47639:68:0;;;;;;;:::i;:::-;110226:16:::1;:44:::0;;-1:-1:-1;;;;;;110226:44:0::1;-1:-1:-1::0;;;;;110226:44:0;;;::::1;::::0;;;::::1;::::0;;110152:126::o;116302:2417::-;126113:10;126166:16;;;126227:9;126213:23;;126205:43;;;;-1:-1:-1;;;126205:43:0;;;;;;;:::i;:::-;126267:9;;126259:29;;;;-1:-1:-1;;;126259:29:0;;;;;;;:::i;:::-;116539:31:::1;116573:19:::0;;;:15:::1;:19;::::0;;;;;116539:53;;::::1;::::0;::::1;::::0;;;;;;;::::1;;::::0;;::::1;;;;-1:-1:-1::0;;;116539:53:0::1;;;;;;;;;;;;;;;-1:-1:-1::0;;;116539:53:0::1;;;;;;;;;::::0;;;;::::1;::::0;::::1;-1:-1:-1::0;;;;;116539:53:0::1;;::::0;::::1;::::0;-1:-1:-1;;;116539:53:0;::::1;;;::::0;;;;-1:-1:-1;;;116539:53:0;::::1;;;::::0;;;;;;-1:-1:-1;;116607:21:0;;:47:::1;::::0;::::1;;;;-1:-1:-1::0;;;116607:47:0::1;;;;;;;;;;116603:245;;;116693:11;116701:2;116693:7;:11::i;:::-;-1:-1:-1::0;;;;;116679:25:0::1;:10;-1:-1:-1::0;;;;;116679:25:0::1;;116671:34;;;::::0;::::1;;116603:245;;;116752:24;116727:21:::0;;:49:::1;::::0;::::1;;;;-1:-1:-1::0;;;116727:49:0::1;;;;;;;;;;116723:125;;;116815:15;:20;;;-1:-1:-1::0;;;;;116801:34:0::1;:10;-1:-1:-1::0;;;;;116801:34:0::1;;116793:43;;;::::0;::::1;;116860:18;116881:10:::0;;;:6:::1;:10;::::0;;;;;;;;116860:31;;::::1;::::0;::::1;::::0;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;;;;;;;;;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;116860:31:0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;116860:31:0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;116860:31:0;::::1;::::0;::::1;::::0;;;;116913:10:::1;::::0;116860:31;;116913:10;;::::1;;116912:11;116904:35;;;;-1:-1:-1::0;;;116904:35:0::1;;;;;;;:::i;:::-;116960:13;:31;;;;116977:14;116960:31;:43;;;;116995:8;116960:43;:56;;;;117007:9;116960:56;:69;;;;117020:9;116960:69;116952:95;;;::::0;-1:-1:-1;;;116952:95:0;;20508:2:1;116952:95:0::1;::::0;::::1;20490:21:1::0;20547:2;20527:18;;;20520:30;-1:-1:-1;;;20566:18:1;;;20559:43;20619:18;;116952:95:0::1;20480:163:1::0;116952:95:0::1;117068:21;117076:2;117080:8;117068:7;:21::i;:::-;117060:42;;;::::0;-1:-1:-1;;;117060:42:0;;18936:2:1;117060:42:0::1;::::0;::::1;18918:21:1::0;18975:1;18955:18;;;18948:29;-1:-1:-1;;;18993:18:1;;;18986:38;19041:18;;117060:42:0::1;18908:157:1::0;117060:42:0::1;117134:1;117123:8;:12;;;:29;;;;;117151:1;117139:8;:13;;;;117123:29;117115:54;;;::::0;-1:-1:-1;;;117115:54:0;;20850:2:1;117115:54:0::1;::::0;::::1;20832:21:1::0;20889:2;20869:18;;;20862:30;-1:-1:-1;;;20908:18:1;;;20901:42;20960:18;;117115:54:0::1;20822:162:1::0;117115:54:0::1;117190:22;117203:8;117190:12;:22::i;:::-;117182:46;;;::::0;-1:-1:-1;;;117182:46:0;;23754:2:1;117182:46:0::1;::::0;::::1;23736:21:1::0;23793:2;23773:18;;;23766:30;-1:-1:-1;;;23812:18:1;;;23805:41;23863:18;;117182:46:0::1;23726:161:1::0;117182:46:0::1;117272:1;117249:20;117258:5;:10;;;117249:20;;:8;:20::i;:::-;:24;;;117241:56;;;::::0;-1:-1:-1;;;117241:56:0;;16384:2:1;117241:56:0::1;::::0;::::1;16366:21:1::0;16423:2;16403:18;;;16396:30;-1:-1:-1;;;16442:18:1;;;16435:49;16501:18;;117241:56:0::1;16356:169:1::0;117241:56:0::1;117310:19;::::0;;;:15:::1;:19;::::0;;;;:54;;-1:-1:-1;;;;;117310:54:0::1;-1:-1:-1::0;;;117348:15:0::1;117310:54;;;;::::0;;117433:17:::1;117310:19:::0;117433:13:::1;:17::i;:::-;117463:4;::::0;-1:-1:-1;;;;;117463:4:0::1;:13;117477:10;117489:84;117501:8:::0;117511:13;117526:14;117542:8;117552:9;117563;117489:11:::1;:84::i;:::-;117463:111;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;117587:13;117615;117611:211;;;117655:39;117665:2;117669:8;117679:14;117655:9;:39::i;:::-;117645:49;;117713:17;117722:7;117713:17;;:8;:17::i;:::-;:22;;117734:1;117713:22;117709:102;;;117756:14;117767:2;117756:10;:14::i;:::-;117789:7;;;;;117709:102;117836:14;117832:213;;;117877:40;117887:2;117891:8;117901:15;117877:9;:40::i;:::-;117867:50;;117936:17;117945:7;117936:17;;:8;:17::i;:::-;:22;;117957:1;117936:22;117932:102;;;117979:14;117990:2;117979:10;:14::i;117932:102::-;118059:8;118055:201;;;118094:34;118104:2;118108:8;118118:9;118094;:34::i;:::-;118084:44;;118147:17;118156:7;118147:17;;:8;:17::i;:::-;:22;;118168:1;118147:22;118143:102;;;118190:14;118201:2;118190:10;:14::i;118143:102::-;118270:9;118266:203;;;118306:35;118316:2;118320:8;118330:10;118306:9;:35::i;:::-;118296:45;;118360:17;118369:7;118360:17;;:8;:17::i;:::-;:22;;118381:1;118360:22;118356:102;;;118403:14;118414:2;118403:10;:14::i;118356:102::-;118483:9;118479:203;;;118519:35;118529:2;118533:8;118543:10;118519:9;:35::i;:::-;118509:45;;118573:17;118582:7;118573:17;;:8;:17::i;:::-;:22;;118594:1;118573:22;118569:102;;;118616:14;118627:2;118616:10;:14::i;118569:102::-;118694:17;118708:2;118694:13;:17::i;:::-;126299:1;;;;126358:3:::0;126363:14;126341:37;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;126341:37:0;;;;;;;;;126331:48;;126341:37;126331:48;;;;126313:7;:67;-1:-1:-1;;;;;;;;;116302:2417:0:o;26240:339::-;26435:41;17554:10;26468:7;26435:18;:41::i;:::-;26427:103;;;;-1:-1:-1;;;26427:103:0;;;;;;;:::i;:::-;26543:28;26553:4;26559:2;26563:7;26543:9;:28::i;115263:390::-;115327:7;;115376:24;;:::i;:::-;115428:1;115411:211;115436:15;50771:14;115431:1;:30;115411:211;;115494:18;;;;:15;:18;;;;;;;115483:29;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;115483:29:0;;;;;;;;;;;;;;;-1:-1:-1;;;115483:29:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;115483:29:0;;;;;;;;;;;-1:-1:-1;;;115483:29:0;;;;;;;;-1:-1:-1;;;115483:29:0;;;;;;;;;;;;;115531:13;;;;;-1:-1:-1;115531:23:0;;;;;;:69;;;;-1:-1:-1;115576:24:0;115558:14;;:42;;;;;;-1:-1:-1;;;115558:42:0;;;;;;;;;;115531:69;115527:83;;;115602:8;;;;:::i;:::-;;;;115527:83;115463:3;;;;:::i;:::-;;;;115411:211;;;-1:-1:-1;115639:6:0;;115263:390;-1:-1:-1;;;115263:390:0:o;115661:483::-;115741:7;;115790:24;;:::i;:::-;115842:1;115825:293;115850:15;50771:14;115845:1;:30;115825:293;;115908:18;;;;:15;:18;;;;;;;115897:29;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;115897:29:0;;;;;;;;;;;;;;;-1:-1:-1;;;115897:29:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;115897:29:0;;;;;;;;;;;-1:-1:-1;;;115897:29:0;;;;;;;;-1:-1:-1;;;115897:29:0;;;;;;;;;;;;;115945:13;;;;;-1:-1:-1;115945:23:0;;;;;;:69;;;;-1:-1:-1;115990:24:0;115972:14;;:42;;;;;;-1:-1:-1;;;115972:42:0;;;;;;;;;;115945:69;115941:166;;;116049:5;116039:6;:15;116035:29;;;116063:1;-1:-1:-1;116056:8:0;;-1:-1:-1;;116056:8:0;116035:29;116083:8;;;;:::i;:::-;;;;115941:166;115877:3;;;;:::i;:::-;;;;115825:293;;;-1:-1:-1;116135:1:0;;115661:483;-1:-1:-1;;;;;115661:483:0:o;37726:267::-;37823:7;37859:34;37887:5;37859:27;:34::i;:::-;37851:5;:42;37843:98;;;;-1:-1:-1;;;37843:98:0;;13685:2:1;37843:98:0;;;13667:21:1;13724:2;13704:18;;;13697:30;13763:34;13743:18;;;13736:62;-1:-1:-1;;;13814:18:1;;;13807:41;13865:19;;37843:98:0;13657:233:1;37843:98:0;-1:-1:-1;;;;;;37959:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;37726:267::o;122658:187::-;122713:4;122734:9;;;122730:26;;-1:-1:-1;122752:4:0;;122658:187;-1:-1:-1;122658:187:0:o;122730:26::-;122816:8;122823:1;122816:4;:8;:::i;:::-;122805:20;;122809:16;;122805:1;:20;:::i;:::-;:31;;122828:8;122805:31;:::i;:::-;122793:9;;:43;;;-1:-1:-1;;;;;122793:9:0;:43;:::i;:::-;-1:-1:-1;;;;;122774:63:0;:15;:63;;122658:187;-1:-1:-1;;122658:187:0:o;123827:142::-;17554:10;47647:7;:5;:7::i;:::-;-1:-1:-1;;;;;47647:23:0;;47639:68;;;;-1:-1:-1;;;47639:68:0;;;;;;;:::i;:::-;123891:47:::1;::::0;123899:10:::1;::::0;123916:21:::1;123891:47:::0;::::1;;;::::0;::::1;::::0;;;123916:21;123899:10;123891:47;::::1;;;;;;123883:78;;;::::0;-1:-1:-1;;;123883:78:0;;12989:2:1;123883:78:0::1;::::0;::::1;12971:21:1::0;13028:2;13008:18;;;13001:30;-1:-1:-1;;;13047:18:1;;;13040:48;13105:18;;123883:78:0::1;12961:168:1::0;123883:78:0::1;123827:142::o:0;126624:65::-;17554:10;47647:7;:5;:7::i;:::-;-1:-1:-1;;;;;47647:23:0;;47639:68;;;;-1:-1:-1;;;47639:68:0;;;;;;;:::i;:::-;126671:10:::1;:8;:10::i;112315:299::-:0;126113:10;126166:16;;;126227:9;126213:23;;126205:43;;;;-1:-1:-1;;;126205:43:0;;;;;;;:::i;:::-;126267:9;;126259:29;;;;-1:-1:-1;;;126259:29:0;;;;;;;:::i;:::-;112420:9:::1;::::0;-1:-1:-1;;;;;112420:9:0::1;112402:15;:27;112394:51;;;::::0;-1:-1:-1;;;112394:51:0;;25669:2:1;112394:51:0::1;::::0;::::1;25651:21:1::0;25708:2;25688:18;;;25681:30;-1:-1:-1;;;25727:18:1;;;25720:41;25778:18;;112394:51:0::1;25641:161:1::0;112394:51:0::1;112465:10;::::0;::::1;::::0;::::1;;;112464:11;112456:35;;;;-1:-1:-1::0;;;112456:35:0::1;;;;;;;:::i;:::-;112509:13;112504:103;112528:18:::0;;::::1;112504:103;;;112572:23;112584:3;;112588:5;112584:10;;;;;-1:-1:-1::0;;;112584:10:0::1;;;;;;;;;;;;;;;112572:11;:23::i;:::-;112548:7:::0;::::1;::::0;::::1;:::i;:::-;;;;112504:103;;;;126358:3:::0;126363:14;126341:37;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;126341:37:0;;;;;;;;;126331:48;;126341:37;126331:48;;;;126313:7;:67;-1:-1:-1;;;;112315:299:0:o;26650:185::-;26788:39;26805:4;26811:2;26815:7;26788:39;;;;;;;;;;;;:16;:39::i;113168:186::-;126113:10;126166:16;;;126227:9;126213:23;;126205:43;;;;-1:-1:-1;;;126205:43:0;;;;;;;:::i;:::-;126267:9;;126259:29;;;;-1:-1:-1;;;126259:29:0;;;;;;;:::i;:::-;113248:13:::1;113243:104;113267:18:::0;;::::1;113243:104;;;113311:24;113324:3;;113328:5;113324:10;;;;;-1:-1:-1::0;;;113324:10:0::1;;;;;;;;;;;;;;;113311:12;:24::i;:::-;113287:7:::0;::::1;::::0;::::1;:::i;:::-;;;;113243:104;;38259:244:::0;38334:7;38370:41;38157:10;:17;;38069:113;38370:41;38362:5;:49;38354:106;;;;-1:-1:-1;;;38354:106:0;;24914:2:1;38354:106:0;;;24896:21:1;24953:2;24933:18;;;24926:30;24992:34;24972:18;;;24965:62;-1:-1:-1;;;25043:18:1;;;25036:42;25095:19;;38354:106:0;24886:234:1;38354:106:0;38478:10;38489:5;38478:17;;;;;;-1:-1:-1;;;38478:17:0;;;;;;;;;;;;;;;;;38471:24;;38259:244;;;:::o;127034:105::-;17554:10;47647:7;:5;:7::i;:::-;-1:-1:-1;;;;;47647:23:0;;47639:68;;;;-1:-1:-1;;;47639:68:0;;;;;;;:::i;:::-;127105:15:::1;:26:::0;;-1:-1:-1;;127105:26:0::1;::::0;::::1;;::::0;;;::::1;::::0;;127034:105::o;123977:107::-;17554:10;47647:7;:5;:7::i;:::-;-1:-1:-1;;;;;47647:23:0;;47639:68;;;;-1:-1:-1;;;47639:68:0;;;;;;;:::i;:::-;124053:4:::1;::::0;:23:::1;::::0;-1:-1:-1;;;124053:23:0;;-1:-1:-1;;;;;124053:4:0;;::::1;::::0;:9:::1;::::0;:23:::1;::::0;124063:3;;124068:7;;124053:23:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;123977:107:::0;;:::o;111133:549::-;126113:10;126166:16;;;126227:9;126213:23;;126205:43;;;;-1:-1:-1;;;126205:43:0;;;;;;;:::i;:::-;126267:9;;126259:29;;;;-1:-1:-1;;;126259:29:0;;;;;;;:::i;:::-;111313:22:::1;::::0;;;::::1;-1:-1:-1::0;;;;;111313:22:0::1;111295:15;:40;111287:64;;;;-1:-1:-1::0;;;111287:64:0::1;;;;;;;:::i;:::-;111380:7;:5;:7::i;:::-;-1:-1:-1::0;;;;;111366:21:0::1;:10;-1:-1:-1::0;;;;;111366:21:0::1;;;:38;;;;;111401:3;111391:7;:13;111366:38;111362:109;;;108099:10;111429:9;:17;;111421:38;;;;-1:-1:-1::0;;;111421:38:0::1;;;;;;;:::i;:::-;111489:39;111497:23;111503:7;111512;111497:5;:23::i;:::-;111522:5;;111489:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;111489:7:0::1;::::0;-1:-1:-1;;;111489:39:0:i:1;:::-;111481:65;;;::::0;-1:-1:-1;;;111481:65:0;;25327:2:1;111481:65:0::1;::::0;::::1;25309:21:1::0;25366:2;25346:18;;;25339:30;-1:-1:-1;;;25385:18:1;;;25378:43;25438:18;;111481:65:0::1;25299:163:1::0;111481:65:0::1;-1:-1:-1::0;;;;;111565:21:0;::::1;;::::0;;;:12:::1;:21;::::0;;;;;:26;111557:53:::1;;;::::0;-1:-1:-1;;;111557:53:0;;27029:2:1;111557:53:0::1;::::0;::::1;27011:21:1::0;27068:2;27048:18;;;27041:30;-1:-1:-1;;;27087:18:1;;;27080:44;27141:18;;111557:53:0::1;27001:164:1::0;111557:53:0::1;-1:-1:-1::0;;;;;111621:21:0;::::1;;::::0;;;:12:::1;:21;::::0;;;;:23;;;::::1;::::0;::::1;:::i;:::-;;;;;;111655:19;111666:7;111655:10;:19::i;:::-;126358:3:::0;126363:14;126341:37;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;126341:37:0;;;;;;;;;126331:48;;126341:37;126331:48;;;;126313:7;:67;-1:-1:-1;;;;;;111133:549:0:o;23474:239::-;23546:7;23582:16;;;:7;:16;;;;;;-1:-1:-1;;;;;23582:16:0;23617:19;23609:73;;;;-1:-1:-1;;;23609:73:0;;19683:2:1;23609:73:0;;;19665:21:1;19722:2;19702:18;;;19695:30;19761:34;19741:18;;;19734:62;-1:-1:-1;;;19812:18:1;;;19805:39;19861:19;;23609:73:0;19655:231:1;110286:86:0;17554:10;47647:7;:5;:7::i;:::-;-1:-1:-1;;;;;47647:23:0;;47639:68;;;;-1:-1:-1;;;47639:68:0;;;;;;;:::i;:::-;110346:4:::1;:18:::0;;-1:-1:-1;;;;;;110346:18:0::1;-1:-1:-1::0;;;;;110346:18:0;;;::::1;::::0;;;::::1;::::0;;110286:86::o;23204:208::-;23276:7;-1:-1:-1;;;;;23304:19:0;;23296:74;;;;-1:-1:-1;;;23296:74:0;;19272:2:1;23296:74:0;;;19254:21:1;19311:2;19291:18;;;19284:30;19350:34;19330:18;;;19323:62;-1:-1:-1;;;19401:18:1;;;19394:40;19451:19;;23296:74:0;19244:232:1;23296:74:0;-1:-1:-1;;;;;;23388:16:0;;;;;:9;:16;;;;;;;23204:208::o;48078:94::-;17554:10;47647:7;:5;:7::i;:::-;-1:-1:-1;;;;;47647:23:0;;47639:68;;;;-1:-1:-1;;;47639:68:0;;;;;;;:::i;:::-;48143:21:::1;48161:1;48143:9;:21::i;126697:115::-:0;17554:10;47647:7;:5;:7::i;:::-;-1:-1:-1;;;;;47647:23:0;;47639:68;;;;-1:-1:-1;;;47639:68:0;;;;;;;:::i;:::-;126774:22:::1;:30:::0;;-1:-1:-1;;;;;126774:30:0;;::::1;::::0;::::1;-1:-1:-1::0;;;;;;126774:30:0;;::::1;::::0;;;::::1;::::0;;126697:115::o;128277:104::-;17554:10;47647:7;:5;:7::i;:::-;-1:-1:-1;;;;;47647:23:0;;47639:68;;;;-1:-1:-1;;;47639:68:0;;;;;;;:::i;:::-;128349:10:::1;:24:::0;128277:104::o;109716:428::-;16271:13;;;;;;;;:30;;-1:-1:-1;16289:12:0;;;;16288:13;16271:30;16263:89;;;;-1:-1:-1;;;16263:89:0;;;;;;;:::i;:::-;16365:19;16388:13;;;;;;16387:14;16412:101;;;;16447:13;:20;;-1:-1:-1;;16482:19:0;;;;;16412:101;109768:38:::1;;;;;;;;;;;;;;-1:-1:-1::0;;;109768:38:0::1;;::::0;::::1;;;;;;;;;;;;;-1:-1:-1::0;;;109768:38:0::1;;::::0;:13:::1;:38::i;:::-;109817:25;:23;:25::i;:::-;109853:17;:15;:17::i;:::-;109881:16;:14;:16::i;:::-;109910:15;:22:::0;;-1:-1:-1;;;;;;110022:32:0;-1:-1:-1;;;;;110022:32:0;;;110065:9:::1;:22:::0;;110077:10:::1;-1:-1:-1::0;;;;;;110065:22:0;;::::1;;::::0;;110100:36:::1;::::0;-1:-1:-1;;;110100:36:0;;110113:5:::1;110100:36;::::0;::::1;12144:25:1::0;110120:15:0::1;12185:18:1::0;;;12178:34;110100:7:0::1;::::0;:12:::1;::::0;12117:18:1;;110100:36:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;16543:14:::0;16539:68;;;16590:5;16574:21;;-1:-1:-1;;16574:21:0;;;16539:68;109716:428;:::o;126555:61::-;17554:10;47647:7;:5;:7::i;:::-;-1:-1:-1;;;;;47647:23:0;;47639:68;;;;-1:-1:-1;;;47639:68:0;;;;;;;:::i;:::-;126600:8:::1;:6;:8::i;126820:109::-:0;17554:10;47647:7;:5;:7::i;:::-;-1:-1:-1;;;;;47647:23:0;;47639:68;;;;-1:-1:-1;;;47639:68:0;;;;;;;:::i;:::-;126894:19:::1;:27:::0;;-1:-1:-1;;;;;126894:27:0;;::::1;-1:-1:-1::0;;;126894:27:0::1;-1:-1:-1::0;;;;;;;;126894:27:0;;::::1;::::0;;;::::1;::::0;;126820:109::o;47427:87::-;47500:6;;-1:-1:-1;;;;;47500:6:0;;47427:87::o;111840:467::-;111896:18;111961:19;;;:15;:19;;;;;;111927:53;;;;;;;;;;111896:18;;111927:53;111961:19;111927:53;;;;;;;;;;-1:-1:-1;;;111927:53:0;;;;;;;;;;;;;;;-1:-1:-1;;;111927:53:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;111927:53:0;;;;;;;;;-1:-1:-1;;;111927:53:0;;;;;;;;;;;;;;;-1:-1:-1;;;111927:53:0;;;;;;;;;;;;;-1:-1:-1;112032:19:0;;;:15;:19;;;;;;:25;111927:53;;-1:-1:-1;;112006:51:0;;112032:25;;;;112013:15;112006:51;:::i;:::-;111991:66;;;-1:-1:-1;112099:22:0;112074:21;;:47;;;;;;-1:-1:-1;;;112074:47:0;;;;;;;;;;112070:126;;;-1:-1:-1;112151:1:0;;111840:467;-1:-1:-1;;;111840:467:0:o;112070:126::-;112263:6;112231:16;112244:2;112231:12;:16::i;:::-;112223:25;;:4;:25;:::i;:::-;:35;;112251:7;112223:35;:::i;:::-;112221:48;;;;:::i;:::-;112208:61;111840:467;-1:-1:-1;;;;111840:467:0:o;23949:104::-;24005:13;24038:7;24031:14;;;;;:::i;114710:545::-;114765:11;114810:10;;;:6;:10;;;;;;;;114789:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;114789:31:0;;;;;;;;-1:-1:-1;;;114789:31:0;;;;;;;;-1:-1:-1;;;114789:31:0;;;;;;;;;;;114882:20;;:8;:20::i;:::-;:25;;;114878:40;;-1:-1:-1;114916:2:0;;114710:545;-1:-1:-1;;114710:545:0:o;114878:40::-;114937:1;114931:7;;114951:11;114965:25;114974:5;:15;;;114965:25;;:8;:25::i;:::-;114951:39;;;;115005:3;115012:1;115005:8;115001:63;;;115015:9;115022:2;115015:9;;:::i;:::-;;;115001:63;;;115051:1;115044:3;:8;115040:24;;115054:10;115061:3;115054:10;;:::i;:::-;;;115040:24;115093:16;;115084:26;;;;:8;:26::i;:::-;115077:33;;;;;;:::i;:::-;;;115128:20;115137:5;:10;;;115128:20;;:8;:20::i;:::-;115121:27;;;;;;:::i;:::-;;;115166:21;115175:5;:11;;;115166:21;;:8;:21::i;:::-;115159:28;;;;;;:::i;:::-;;;115205:21;115214:5;:11;;;115205:21;;:8;:21::i;:::-;115198:28;;;;;;:::i;110530:595::-;126113:10;126166:16;;;126227:9;126213:23;;126205:43;;;;-1:-1:-1;;;126205:43:0;;;;;;;:::i;:::-;126267:9;;126259:29;;;;-1:-1:-1;;;126259:29:0;;;;;;;:::i;:::-;110602:14:::1;110619:13;38157:10:::0;:17;;38069:113;110619:13:::1;110669:19;::::0;110602:30;;-1:-1:-1;;;;110669:19:0;::::1;-1:-1:-1::0;;;;;110669:19:0::1;110651:15;:37;110643:61;;;;-1:-1:-1::0;;;110643:61:0::1;;;;;;;:::i;:::-;110737:1;110723:11;:15;110715:45;;;::::0;-1:-1:-1;;;110715:45:0;;17820:2:1;110715:45:0::1;::::0;::::1;17802:21:1::0;17859:2;17839:18;;;17832:30;-1:-1:-1;;;17878:18:1;;;17871:47;17935:18;;110715:45:0::1;17792:167:1::0;110715:45:0::1;108203:1;110779:11;:28;;110771:58;;;::::0;-1:-1:-1;;;110771:58:0;;22637:2:1;110771:58:0::1;::::0;::::1;22619:21:1::0;22676:2;22656:18;;;22649:30;-1:-1:-1;;;22695:18:1;;;22688:47;22752:18;;110771:58:0::1;22609:167:1::0;110771:58:0::1;108152:4;110848:20;110857:11:::0;110848:6;:20:::1;:::i;:::-;:33;;110840:55;;;::::0;-1:-1:-1;;;110840:55:0;;26349:2:1;110840:55:0::1;::::0;::::1;26331:21:1::0;26388:1;26368:18;;;26361:29;-1:-1:-1;;;26406:18:1;;;26399:39;26455:18;;110840:55:0::1;26321:158:1::0;110840:55:0::1;110926:7;:5;:7::i;:::-;-1:-1:-1::0;;;;;110912:21:0::1;:10;-1:-1:-1::0;;;;;110912:21:0::1;;110908:106;;110971:18;110978:11:::0;108099:10:::1;110971:18;:::i;:::-;110958:9;:31;;110950:52;;;;-1:-1:-1::0;;;110950:52:0::1;;;;;;;:::i;:::-;111043:1;111026:92;111051:11;111046:1;:16;111026:92;;111084:22;111095:10;111084;:22::i;:::-;111064:3:::0;::::1;::::0;::::1;:::i;:::-;;;;111026:92;;;;126299:1;126358:3:::0;126363:14;126341:37;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;126341:37:0;;;;;;;;;126331:48;;126341:37;126331:48;;;;126313:7;:67;-1:-1:-1;;;110530:595:0:o;127248:109::-;17554:10;47647:7;:5;:7::i;:::-;-1:-1:-1;;;;;47647:23:0;;47639:68;;;;-1:-1:-1;;;47639:68:0;;;;;;;:::i;:::-;127325:24:::1;127335:3;127340:8;127325:9;:24::i;:::-;127248:109:::0;;:::o;25643:295::-;-1:-1:-1;;;;;25746:24:0;;17554:10;25746:24;;25738:62;;;;-1:-1:-1;;;25738:62:0;;16030:2:1;25738:62:0;;;16012:21:1;16069:2;16049:18;;;16042:30;-1:-1:-1;;;16088:18:1;;;16081:55;16153:18;;25738:62:0;16002:175:1;25738:62:0;17554:10;25813:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;25813:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;25813:53:0;;;;;;;;;;25882:48;;10761:41:1;;;25813:42:0;;17554:10;25882:48;;10734:18:1;25882:48:0;;;;;;;25643:295;;:::o;118727:241::-;118793:4;118844:19;;;:15;:19;;;;;;118810:53;;;;;;;;;;118793:4;;118810:53;118844:19;118810:53;;;;;;;;;;-1:-1:-1;;;118810:53:0;;;;;;;;;;;;;;;-1:-1:-1;;;118810:53:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;118810:53:0;;;;;-1:-1:-1;;;118810:53:0;;;;;;;;-1:-1:-1;;;118810:53:0;;;;;;;;;;-1:-1:-1;118933:26:0;118950:8;118933:16;:26::i;:::-;118881:79;;118899:15;:24;;;118881:42;;:15;:42;;;;:::i;:::-;:79;;118727:241;-1:-1:-1;;;;118727:241:0:o;127147:93::-;17554:10;47647:7;:5;:7::i;:::-;-1:-1:-1;;;;;47647:23:0;;47639:68;;;;-1:-1:-1;;;47639:68:0;;;;;;;:::i;:::-;127212:10:::1;:20:::0;;;::::1;;;;-1:-1:-1::0;;127212:20:0;;::::1;::::0;;;::::1;::::0;;127147:93::o;113935:187::-;126113:10;126166:16;;;126227:9;126213:23;;126205:43;;;;-1:-1:-1;;;126205:43:0;;;;;;;:::i;:::-;126267:9;;126259:29;;;;-1:-1:-1;;;126259:29:0;;;;;;;:::i;:::-;114015:13:::1;114010:105;114034:18:::0;;::::1;114010:105;;;114078:25;114092:3;;114096:5;114092:10;;;;;-1:-1:-1::0;;;114092:10:0::1;;;;;;;;;;;;;;;114078:13;:25::i;:::-;114054:7:::0;::::1;::::0;::::1;:::i;:::-;;;;114010:105;;26906:328:::0;27081:41;17554:10;27114:7;27081:18;:41::i;:::-;27073:103;;;;-1:-1:-1;;;27073:103:0;;;;;;;:::i;:::-;27187:39;27201:4;27207:2;27211:7;27220:5;27187:13;:39::i;:::-;26906:328;;;;:::o;123015:643::-;123101:18;123122:10;;;:6;:10;;;;;;;;123101:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;123075:13;123101:31;;;;;;;-1:-1:-1;;;123101:31:0;;;;;;;;;;;;-1:-1:-1;;;123101:31:0;;;;;;;;-1:-1:-1;;;123101:31:0;;;;;;;;;123170:19;;;:15;:19;;;;;;123143:46;;;;;;;;;;123075:13;;123101:31;;:18;;123143:46;;;;;123101:31;123143:46;;;;;-1:-1:-1;;;123143:46:0;;;;;;;;;;;;;;;-1:-1:-1;;;123143:46:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;123143:46:0;;;;;-1:-1:-1;;;123143:46:0;;;;;;;;-1:-1:-1;;;123143:46:0;;;;;;;;;;-1:-1:-1;;123224:16:0;123237:2;123224:12;:16::i;:::-;123272;;123348;;123383:11;;;;123413:10;;;;123442:11;;;;123472:10;;;;123501:11;;;;123531:15;;;;123200:41;;-1:-1:-1;;;;;;123272:16:0;;;;:28;;123326:2;;123348:16;123383:11;123413:10;123442:11;123472:10;123272:16;123565:14;;:42;;;;;;-1:-1:-1;;;123565:42:0;;;;;;;;;123272:378;;-1:-1:-1;;;;;;123272:378:0;;;;;;;28546:6:1;28534:19;;;123272:378:0;;;28516:38:1;28573:4;28613:15;;;28593:18;;;28586:43;28665:15;;;28645:18;;;28638:43;28717:15;;;28697:18;;;28690:43;28770:15;;;28749:19;;;28742:44;28823:15;;;28802:19;;;28795:44;28876:15;;28855:19;;;28848:44;28929:15;;28908:19;;;28901:44;123565:42:0;28961:19:1;;;28954:51;29042:15;;29021:19;;;29014:44;28488:19;;123272:378:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;123272:378:0;;;;;;;;;;;;:::i;:::-;123252:398;123015:643;-1:-1:-1;;;;;123015:643:0:o;126937:89::-;17554:10;47647:7;:5;:7::i;:::-;-1:-1:-1;;;;;47647:23:0;;47639:68;;;;-1:-1:-1;;;47639:68:0;;;;;;;:::i;:::-;127001:9:::1;:17:::0;;-1:-1:-1;;;;;;127001:17:0::1;-1:-1:-1::0;;;;;127001:17:0;;;::::1;::::0;;;::::1;::::0;;126937:89::o;26009:164::-;-1:-1:-1;;;;;26130:25:0;;;26106:4;26130:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;26009:164::o;127365:562::-;17554:10;47647:7;:5;:7::i;:::-;-1:-1:-1;;;;;47647:23:0;;47639:68;;;;-1:-1:-1;;;47639:68:0;;;;;;;:::i;:::-;127605:18:::1;127626:6;:10;127633:2;127626:10;;;;;;;;;;;127605:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;127665:9;127647:5;:15;;:27;;;;;;;;;::::0;::::1;127704:10;127685:5;:16;;:29;;;;;;;;;::::0;::::1;127738:4;127725:5;:10;;:17;;;;;;;;;::::0;::::1;127766:4;127753:5;:10;;:17;;;;;;;;;::::0;::::1;127795:5;127781;:11;;:19;;;;;;;;;::::0;::::1;127825:5;127811;:11;;:19;;;;;;;;;::::0;::::1;127855:5;127841;:11;;:19;;;;;;;;;::::0;::::1;127884:5;127871:6;:10;127878:2;127871:10;;;;;;;;;;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;127902:17;127916:2;127902:13;:17::i;:::-;47718:1;127365:562:::0;;;;;;;;:::o;48327:192::-;17554:10;47647:7;:5;:7::i;:::-;-1:-1:-1;;;;;47647:23:0;;47639:68;;;;-1:-1:-1;;;47639:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;48416:22:0;::::1;48408:73;;;::::0;-1:-1:-1;;;48408:73:0;;14516:2:1;48408:73:0::1;::::0;::::1;14498:21:1::0;14555:2;14535:18;;;14528:30;14594:34;14574:18;;;14567:62;-1:-1:-1;;;14645:18:1;;;14638:36;14691:19;;48408:73:0::1;14488:228:1::0;48408:73:0::1;48492:19;48502:8;48492:9;:19::i;37385:257::-:0;37509:4;-1:-1:-1;;;;;;37533:61:0;;-1:-1:-1;;;37533:61:0;;:101;;;37598:36;37622:11;37598:23;:36::i;28744:127::-;28809:4;28833:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28833:16:0;:30;;;28744:127::o;32759:185::-;32834:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;32834:29:0;-1:-1:-1;;;;;32834:29:0;;;;;;;;:24;;32888:34;32834:24;32888:25;:34::i;:::-;-1:-1:-1;;;;;32879:57:0;;;;;;;;;;;32759:185;;:::o;122337:160::-;122394:5;122416:11;122412:25;;-1:-1:-1;122436:1:0;;122337:160;-1:-1:-1;122337:160:0:o;122412:25::-;108254:1;122462:10;122471:1;122462:6;:10;:::i;:::-;122461:27;;;;:::i;114130:572::-;114184:31;114218:19;;;:15;:19;;;;;;114184:53;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;114184:53:0;;;;;;;;;;;;;;;-1:-1:-1;;;114184:53:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;114184:53:0;;;;;-1:-1:-1;;;114184:53:0;;;;;;;;-1:-1:-1;;;114184:53:0;;;;;;;;;;-1:-1:-1;;114252:21:0;;:47;;;;;;-1:-1:-1;;;114252:47:0;;;;;;;;;;114248:245;;;114338:11;114346:2;114338:7;:11::i;:::-;-1:-1:-1;;;;;114324:25:0;:10;-1:-1:-1;;;;;114324:25:0;;114316:34;;;;;;114248:245;;;114397:24;114372:21;;:49;;;;;;-1:-1:-1;;;114372:49:0;;;;;;;;;;114368:125;;;114460:15;:20;;;-1:-1:-1;;;;;114446:34:0;:10;-1:-1:-1;;;;;114446:34:0;;114438:43;;;;;;114505:17;114525;114539:2;114525:13;:17::i;:::-;114505:37;-1:-1:-1;114557:14:0;114553:27;;114573:7;;114130:572;:::o;114553:27::-;114592:4;;-1:-1:-1;;;;;114592:4:0;:9;114602:10;114614:17;114628:2;114614:13;:17::i;:::-;114592:40;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;114643:19:0;;;;-1:-1:-1;;114643:15:0;:19;;-1:-1:-1;114643:19:0;;;:51;;-1:-1:-1;;;;114643:51:0;-1:-1:-1;;;114678:15:0;114643:51;;;;;;114130:572::o;118976:562::-;119185:7;;119240:35;;;;119259:16;;;;:::i;:::-;;;;119240:35;119290:14;119286:36;;;119306:16;;;;:::i;:::-;;;;119286:36;119337:8;119333:30;;;119347:16;;;;:::i;:::-;;;;119333:30;119378:9;119374:31;;;119389:16;;;;:::i;:::-;;;;119374:31;119420:9;119416:31;;;119431:16;;;;:::i;:::-;;;;119416:31;119497:23;119473:15;;;;;;;:5;:15;;;;;:20;119465:55;;119497:23;;;119473:20;;119465:55;:::i;:::-;:65;;119523:7;119465:65;:::i;:::-;119458:72;118976:562;-1:-1:-1;;;;;;;;118976:562:0:o;119546:1257::-;119656:5;119674:12;119689:7;:5;:7::i;:::-;119674:22;;119707:12;119722:43;119741:4;119755;119747:13;;;;;;-1:-1:-1;;;119747:13:0;;;;;;;;;119762:2;119722:18;:43::i;:::-;119803:15;;;;119776:24;119803:15;;;:5;:15;;;;;;;;;119776:42;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;119776:42:0;;;;;;;;;;;;-1:-1:-1;;;119776:42:0;;;;;;;;-1:-1:-1;;;119776:42:0;;;;;;;;-1:-1:-1;;;119776:42:0;;;;;;;;-1:-1:-1;;;119776:42:0;;;;;;;;;;119707:58;;-1:-1:-1;119831:41:0;;;;-1:-1:-1;;;119831:41:0;;16732:2:1;119831:41:0;;;16714:21:1;16771:2;16751:18;;;16744:30;-1:-1:-1;;;16790:18:1;;;16783:40;16840:18;;119831:41:0;16704:160:1;119831:41:0;119886:13;119901:27;119932:24;119941:4;119947:8;119932;:24::i;:::-;119967:18;119988:10;;;:6;:10;;;;;;;;119967:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;119967:31:0;;;;;;;;-1:-1:-1;;;119967:31:0;;;;;;;;-1:-1:-1;;;119967:31:0;;;;;;;;;;119885:71;;-1:-1:-1;119885:71:0;;-1:-1:-1;120013:4:0;:22;;;;;;-1:-1:-1;;;120013:22:0;;;;;;;;;;120009:669;;;120037:25;;;:15;;;:25;120009:669;;;120090:15;120082:4;:23;;;;;;-1:-1:-1;;;120082:23:0;;;;;;;;;;120078:600;;;120107:26;;;;;120078:600;;;120161:9;120153:4;:17;;;;;;-1:-1:-1;;;120153:17:0;;;;;;;;;;120149:529;;;120187:20;;;:10;;;:20;;;120236:2;-1:-1:-1;120222:333:0;;;120259:12;120318:1;120280:35;120299:4;120280:35;;;;;;;;;;;;;-1:-1:-1;;;120280:35:0;;;120313:1;120280:18;:35::i;:::-;:39;;;;:::i;:::-;120259:61;;120339:14;120401:1;120363:35;120382:4;120363:35;;;;;;;;;;;;;-1:-1:-1;;;120363:35:0;;;120396:1;120363:18;:35::i;:::-;:39;;;;:::i;:::-;120362:45;;120406:1;120362:45;:::i;:::-;120440:24;;;;;;;;:15;:24;;;;;:32;;120339:69;;-1:-1:-1;120440:24:0;:32;;;;;;;;-1:-1:-1;;;120440:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;120427:10;;;:45;120505:24;;;;;:15;:24;;;;;;:34;;:24;;:34;;;;;;;-1:-1:-1;;;120505:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;120491:11;;;:48;-1:-1:-1;;120222:333:0;120149:529;;;120584:10;120576:4;:18;;;;;;-1:-1:-1;;;120576:18:0;;;;;;;;;;120572:106;;;120596:21;;;:11;;;:21;120572:106;;;120645:10;120637:4;:18;;;;;;-1:-1:-1;;;120637:18:0;;;;;;;;;;120633:45;;;120657:21;;;:11;;;:21;120633:45;120691:10;;;;:6;:10;;;;;;;;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;120691:18:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;120691:18:0;;;;;;;;;-1:-1:-1;;120691:18:0;;;;;;;;;;;;;;-1:-1:-1;;;;120691:18:0;-1:-1:-1;;;120691:18:0;;;;;;;-1:-1:-1;;;;120691:18:0;;-1:-1:-1;;;120691:18:0;;;;;;;;;;;-1:-1:-1;;;;120691:18:0;-1:-1:-1;;;120691:18:0;;;;;;;;;;;;;;120724:13;;;;120720:48;;120739:15;;;;;;;;:5;:15;;;;;;;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;120739:29:0;-1:-1:-1;;;;120739:29:0;;;-1:-1:-1;;;120739:29:0;-1:-1:-1;;;;120739:29:0;;;-1:-1:-1;;;120739:29:0;;;;;-1:-1:-1;;;;120739:29:0;;;-1:-1:-1;;;120739:29:0;-1:-1:-1;;;;120739:29:0;;;;-1:-1:-1;;;120739:29:0;;;;;-1:-1:-1;;;;120739:29:0;;;;;-1:-1:-1;;120739:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;120720:48;-1:-1:-1;120788:7:0;;119546:1257;-1:-1:-1;;;;;;;;119546:1257:0:o;121869:345::-;121949:1;121921:13;121943:8;;;:5;:8;;;:14;121937:25;;-1:-1:-1;;;121943:14:0;;;;121961:1;121937:25;:::i;:::-;:30;;121965:2;121937:30;:::i;:::-;121978:18;121999:10;;;:6;:10;;;;;;;;121978:31;;;;;;;;;;-1:-1:-1;;;121978:31:0;;;;;;;;;;;-1:-1:-1;;;121978:31:0;;;;;;;;;;;122020:25;;;121978:31;;;122020:25;;;122056:26;;;121978:31;;;122093:20;;;-1:-1:-1;121978:31:0;;122124:21;;;121978:31;;;122156:21;;;122188:10;;;;;;;;:18;;;;;;;;;;;;;;;;;-1:-1:-1;;122188:18:0;;;;;;;121978:31;122188:18;;;;;;;;;;;-1:-1:-1;;122188:18:0;121978:31;122188:18;;;;;;;-1:-1:-1;;122188:18:0;;;;;121978:31;122188:18;;;;;;;;-1:-1:-1;;;;122188:18:0;;;;;;;-1:-1:-1;;;;122188:18:0;;;;;;;;;;;;;-1:-1:-1;;;;122188:18:0;-1:-1:-1;;;122188:18:0;;;;;;;;;;;;-1:-1:-1;121869:345:0:o;122222:107::-;122298:10;;;;:6;:10;;;;;;;122277:44;;-1:-1:-1;;;;;;122277:44:0;;;;;12144:25:1;;;;122310:10:0;12185:18:1;;;12178:34;122277:7:0;;:20;;12117:18:1;;122277:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;122222:107;:::o;29038:359::-;29131:4;29156:16;29164:7;29156;:16::i;:::-;29148:73;;;;-1:-1:-1;;;29148:73:0;;17071:2:1;29148:73:0;;;17053:21:1;17110:2;17090:18;;;17083:30;17149:34;17129:18;;;17122:62;-1:-1:-1;;;17200:18:1;;;17193:42;17252:19;;29148:73:0;17043:234:1;29148:73:0;29232:13;29248:34;29274:7;29248:25;:34::i;:::-;29232:50;;29312:5;-1:-1:-1;;;;;29301:16:0;:7;-1:-1:-1;;;;;29301:16:0;;:51;;;;29345:7;-1:-1:-1;;;;;29321:31:0;:20;29333:7;29321:11;:20::i;:::-;-1:-1:-1;;;;;29321:31:0;;29301:51;:87;;;;29356:32;29373:5;29380:7;29356:16;:32::i;32052:589::-;32222:4;-1:-1:-1;;;;;32184:42:0;:34;32210:7;32184:25;:34::i;:::-;-1:-1:-1;;;;;32184:42:0;;32176:96;;;;-1:-1:-1;;;32176:96:0;;23344:2:1;32176:96:0;;;23326:21:1;23383:2;23363:18;;;23356:30;23422:34;23402:18;;;23395:62;-1:-1:-1;;;23473:18:1;;;23466:39;23522:19;;32176:96:0;23316:231:1;32176:96:0;-1:-1:-1;;;;;32291:16:0;;32283:65;;;;-1:-1:-1;;;32283:65:0;;15625:2:1;32283:65:0;;;15607:21:1;15664:2;15644:18;;;15637:30;15703:34;15683:18;;;15676:62;-1:-1:-1;;;15754:18:1;;;15747:34;15798:19;;32283:65:0;15597:226:1;32283:65:0;32361:39;32382:4;32388:2;32392:7;32361:20;:39::i;:::-;32465:29;32482:1;32486:7;32465:8;:29::i;:::-;-1:-1:-1;;;;;32507:15:0;;;;;;:9;:15;;;;;:20;;32526:1;;32507:15;:20;;32526:1;;32507:20;:::i;:::-;;;;-1:-1:-1;;;;;;;32538:13:0;;;;;;:9;:13;;;;;:18;;32555:1;;32538:13;:18;;32555:1;;32538:18;:::i;:::-;;;;-1:-1:-1;;32567:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;32567:21:0;-1:-1:-1;;;;;32567:21:0;;;;;;;;;32606:27;;32567:16;;32606:27;;;;-1:-1:-1;;;;;;;;;;;32606:27:0;;32052:589;;;:::o;46024:120::-;45036:7;;;;45560:41;;;;-1:-1:-1;;;45560:41:0;;13336:2:1;45560:41:0;;;13318:21:1;13375:2;13355:18;;;13348:30;-1:-1:-1;;;13394:18:1;;;13387:50;13454:18;;45560:41:0;13308:170:1;45560:41:0;46083:7:::1;:15:::0;;-1:-1:-1;;46083:15:0::1;::::0;;46114:22:::1;17554:10:::0;46123:12:::1;46114:22;;;;;;:::i;:::-;;;;;;;;46024:120::o:0;112622:538::-;112674:31;112708:19;;;:15;:19;;;;;;112674:53;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;112674:53:0;;;;;;;;;;;;;;;-1:-1:-1;;;112674:53:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;112674:53:0;;;;;-1:-1:-1;;;112674:53:0;;;;;;;;-1:-1:-1;;;112674:53:0;;;;;;;;;;-1:-1:-1;112674:53:0;112746:21;;:49;;;;;;-1:-1:-1;;;112746:49:0;;;;;;;;;;;112738:76;;;;-1:-1:-1;;;112738:76:0;;26686:2:1;112738:76:0;;;26668:21:1;26725:2;26705:18;;;26698:30;-1:-1:-1;;;26744:18:1;;;26737:44;26798:18;;112738:76:0;26658:164:1;112738:76:0;112847:11;112855:2;112847:7;:11::i;:::-;-1:-1:-1;;;;;112833:25:0;:10;-1:-1:-1;;;;;112833:25:0;;112825:47;;;;-1:-1:-1;;;112825:47:0;;22300:2:1;112825:47:0;;;22282:21:1;22339:1;22319:18;;;22312:29;-1:-1:-1;;;22357:18:1;;;22350:39;22406:18;;112825:47:0;22272:158:1;112825:47:0;112885:40;112895:10;112915:4;112922:2;112885:9;:40::i;:::-;112960:192;;;;;;;;;;112991:24;112960:192;;;113081:10;112960:192;;;;;;;;;113044:15;112960:192;;;;;;;;;;113116:24;;;;112960:192;;;;;;;;-1:-1:-1;112938:19:0;;;:15;:19;;;;:214;;;;:19;;-1:-1:-1;;112938:214:0;;;;;;;;;-1:-1:-1;;;112938:214:0;;;;;;;;;;;;;-1:-1:-1;112938:214:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;112938:214:0;-1:-1:-1;;;;;112938:214:0;;;;-1:-1:-1;;;112938:214:0;-1:-1:-1;;;;;;;;;112938:214:0;;;;;;;;;-1:-1:-1;;;;;;112938:214:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;112622:538:0:o;113362:565::-;113415:31;113449:19;;;:15;:19;;;;;;113415:53;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;113415:53:0;;;;;;;;;;;;;;;-1:-1:-1;;;113415:53:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;113415:53:0;;;;;-1:-1:-1;;;113415:53:0;;;;;;;;-1:-1:-1;;;113415:53:0;;;;;;;;;;-1:-1:-1;;113487:21:0;;:47;;;;;;-1:-1:-1;;;113487:47:0;;;;;;;;;;;113479:76;;;;-1:-1:-1;;;113479:76:0;;15280:2:1;113479:76:0;;;15262:21:1;15319:2;15299:18;;;15292:30;-1:-1:-1;;;15338:18:1;;;15331:46;15394:18;;113479:76:0;15252:166:1;113479:76:0;113588:19;;;;:15;:19;;;;;:24;;;;-1:-1:-1;;;;;113588:24:0;113574:10;:38;113566:47;;;;;;113626:40;113644:4;113651:10;113663:2;113626:9;:40::i;:::-;113677:17;113691:2;113677:13;:17::i;:::-;113729:190;;;;;;;;;;-1:-1:-1;113729:190:0;;127935:152;128007:7;128061;128070;128044:34;;;;;;;;9507:19:1;;;9589:2;9560:15;-1:-1:-1;;;;;;9556:45:1;9551:2;9542:12;;9535:67;9627:2;9618:12;;9497:139;128044:34:0;;;;;;;;;;;;;128034:45;;;;;;128027:52;;127935:152;;;;:::o;128095:174::-;128178:4;128202:59;128232:5;128239:10;;128251:9;128202:29;:59::i;:::-;128195:66;128095:174;-1:-1:-1;;;128095:174:0:o;124092:1218::-;124145:27;:15;50890:19;;50908:1;50890:19;;;50801:127;124145:27;124183:10;124196:25;:15;50771:14;;50679:114;124196:25;124183:38;-1:-1:-1;124336:1:0;;124235:15;;;;;124388:1;124235:15;124417:7;:5;:7::i;:::-;124437:20;124460:8;;:5;:8;;;;;124437:31;;;;;;;124460:8;124437:31;;;;;;;;;;;;;;;;-1:-1:-1;;;124437:31:0;;124460:8;124437:31;;;;;-1:-1:-1;;;124437:31:0;;;;;;;;-1:-1:-1;;;124437:31:0;;;;;;;;-1:-1:-1;;;124437:31:0;;;;;;;;-1:-1:-1;;;124437:31:0;;;;;;;;124503:36;;;;;;;;124437:31;124503:36;;-1:-1:-1;;;124503:36:0;;;;;;;124402:22;;-1:-1:-1;124437:31:0;124494:52;;124503:36;;124402:22;;124536:2;124503:18;:36::i;:::-;124541:4;124494:8;:52::i;:::-;124479:67;;;;;;;;124573:53;124582:37;124601:4;124582:37;;;;;;;;;;;;;-1:-1:-1;;;124582:37:0;;;124616:2;124582:18;:37::i;124573:53::-;124557:69;;;;;;;;124653:53;124662:37;124681:4;124662:37;;;;;;;;;;;;;-1:-1:-1;;;124662:37:0;;;124696:2;124662:18;:37::i;124653:53::-;124637:69;;;;;;;;124724:15;:21;124740:4;124724:21;;;;;;;;;;;;;;;124786:10;124747:49;;:36;124766:4;124747:36;;;;;;;;;;;;;-1:-1:-1;;;124747:36:0;;;124780:2;124747:18;:36::i;:::-;:49;;;;:::i;:::-;124724:74;;;;;;-1:-1:-1;;;124724:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;124717:81;;124817:15;:21;124833:4;124817:21;;;;;;;;;;;;;;;124880:10;124840:50;;:37;124859:4;124840:37;;;;;;;;;;;;;-1:-1:-1;;;124840:37:0;;;124874:2;124840:18;:37::i;:::-;:50;;;;:::i;:::-;124839:56;;124894:1;124839:56;:::i;:::-;124817:79;;;;;;-1:-1:-1;;;124817:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;124809:87;;124909:14;124915:3;124920:2;124909:5;:14::i;:::-;124949:221;;;;;;;;125017:10;124949:221;;;;;;125153:5;124949:221;;;;;;125048:4;124949:221;;;;;;125126:5;124949:221;;;;;;125073:4;124949:221;;;;;;125099:5;124949:221;;;;;;124981:9;124949:221;;;;;124936:6;:10;124943:2;124936:10;;;;;;;;;;;:234;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;125205:97;;;;;;;;125265:22;125205:97;;;;;;-1:-1:-1;;;125205:97:0;;;;;;;;;;;-1:-1:-1;;;;;125205:97:0;;;;;;;;;;;125240:15;125205:97;;;;;;;;;-1:-1:-1;125205:97:0;;;;;;;125183:19;;;:15;:19;;;;;:119;;;;:19;;-1:-1:-1;;125183:119:0;;;;;;;;;-1:-1:-1;;;125183:119:0;;;;;;;;;;;;;-1:-1:-1;125183:119:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;125183:119:0;-1:-1:-1;;;;;125183:119:0;;;;-1:-1:-1;;;125183:119:0;-1:-1:-1;;;;;;;;;125183:119:0;;;;;;;;;-1:-1:-1;;;;;;125183:119:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;124092:1218:0:o;48527:173::-;48602:6;;;-1:-1:-1;;;;;48619:17:0;;;-1:-1:-1;;;;;;48619:17:0;;;;;;;48652:40;;48602:6;;;48619:17;48602:6;;48652:40;;48583:16;;48652:40;48527:173;;:::o;22334:219::-;16271:13;;;;;;;;:30;;-1:-1:-1;16289:12:0;;;;16288:13;16271:30;16263:89;;;;-1:-1:-1;;;16263:89:0;;;;;;;:::i;:::-;16365:19;16388:13;;;;;;16387:14;16412:101;;;;16447:13;:20;;-1:-1:-1;;16482:19:0;;;;;16412:101;22433:26:::1;:24;:26::i;:::-;22470:25;:23;:25::i;:::-;22506:39;22530:5;22537:7;22506:23;:39::i;:::-;16543:14:::0;16539:68;;;16590:5;16574:21;;-1:-1:-1;;16574:21:0;;;22334:219;;;:::o;36576:183::-;16271:13;;;;;;;;:30;;-1:-1:-1;16289:12:0;;;;16288:13;16271:30;16263:89;;;;-1:-1:-1;;;16263:89:0;;;;;;;:::i;:::-;16365:19;16388:13;;;;;;16387:14;16412:101;;;;16447:13;:20;;-1:-1:-1;;16482:19:0;;;;;16412:101;36643:26:::1;:24;:26::i;:::-;36680:25;:23;:25::i;:::-;36716:35;:33;:35::i;:::-;16543:14:::0;16539:68;;;16590:5;16574:21;;-1:-1:-1;;16574:21:0;;;36576:183;:::o;44634:131::-;16271:13;;;;;;;;:30;;-1:-1:-1;16289:12:0;;;;16288:13;16271:30;16263:89;;;;-1:-1:-1;;;16263:89:0;;;;;;;:::i;:::-;16365:19;16388:13;;;;;;16387:14;16412:101;;;;16447:13;:20;;-1:-1:-1;;16482:19:0;;;;;16412:101;44693:26:::1;:24;:26::i;:::-;44730:27;:25;:27::i;47110:129::-:0;16271:13;;;;;;;;:30;;-1:-1:-1;16289:12:0;;;;16288:13;16271:30;16263:89;;;;-1:-1:-1;;;16263:89:0;;;;;;;:::i;:::-;16365:19;16388:13;;;;;;16387:14;16412:101;;;;16447:13;:20;;-1:-1:-1;;16482:19:0;;;;;16412:101;47168:26:::1;:24;:26::i;:::-;47205;:24;:26::i;45765:118::-:0;45036:7;;;;45290:9;45282:38;;;;-1:-1:-1;;;45282:38:0;;;;;;;:::i;:::-;45825:7:::1;:14:::0;;-1:-1:-1;;45825:14:0::1;45835:4;45825:14;::::0;;45855:20:::1;45862:12;17554:10:::0;;17474:98;29739:110;29815:26;29825:2;29829:7;29815:26;;;;;;;;;;;;:9;:26::i;122505:145::-;122592:15;;122567:7;;122592:15;;122587:30;;-1:-1:-1;122616:1:0;;122505:145;-1:-1:-1;122505:145:0:o;122587:30::-;-1:-1:-1;122635:7:0;;122505:145;-1:-1:-1;122505:145:0:o;28116:315::-;28273:28;28283:4;28289:2;28293:7;28273:9;:28::i;:::-;28320:48;28343:4;28349:2;28353:7;28362:5;28320:22;:48::i;:::-;28312:111;;;;-1:-1:-1;;;28312:111:0;;;;;;;:::i;22791:349::-;22915:4;-1:-1:-1;;;;;;22952:51:0;;-1:-1:-1;;;22952:51:0;;:127;;-1:-1:-1;;;;;;;23020:59:0;;-1:-1:-1;;;23020:59:0;22952:127;:180;;;-1:-1:-1;;;;;;;;;;20971:51:0;;;23096:36;20862:168;125792:177;125930:7;;125884:54;;;125901:10;8972:2:1;8943:15;-1:-1:-1;;;;;;8939:45:1;125884:54:0;;;;8927:58:1;;;;125913:15:0;9001:12:1;;;8994:28;9038:12;;;;9031:28;;;;125884:54:0;;;;;;;;;;9075:12:1;;;;125884:54:0;;;125874:65;;;;;;125792:177::o;125318:226::-;125498:36;;;;;;29819:25:1;;;29860:18;;;29853:34;;;29903:18;;;29896:34;;;125453:7:0;;29792:18:1;;125498:36:0;;;;-1:-1:-1;;125498:36:0;;;;;;;;;125488:47;;125498:36;125488:47;;;;;125318:226;-1:-1:-1;;;;125318:226:0:o;120811:1050::-;-1:-1:-1;;;;;;;;120892:5:0;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;120927:12:0;120949:8;:14;;;120942:21;;:4;:21;;;;:::i;:::-;120974:14;;;:16;;120927:36;;-1:-1:-1;120974:16:0;;;:::i;:::-;;;;;-1:-1:-1;121070:14:0;;;;121053;;;;121036;;;;121001:10;;121070:14;121036:31;;;:::i;:::-;:48;;;;:::i;:::-;121028:56;;:4;:56;;:78;;;;;121105:1;121088:8;:14;;;:18;;;121028:78;121024:796;;;108254:1;121167:8;:16;;;121186:1;121167:20;;;;:::i;:::-;121166:37;;;;;;:::i;:::-;121138:19;108254:1;121138:4;:19;:::i;:::-;121137:25;;121161:1;121137:25;:::i;:::-;121136:67;;;;:::i;:::-;121219:14;;;:16;;121123:81;;-1:-1:-1;121219:16:0;;;:::i;:::-;;;;;-1:-1:-1;121024:796:0;;;121282:8;:14;;;121265:8;:14;;;:31;;;;:::i;:::-;121257:39;;:4;:39;;:61;;;;;121317:1;121300:8;:14;;;:18;;;121257:61;121253:567;;;108254:1;121379:8;:16;;;121398:1;121379:20;;;;:::i;:::-;121378:37;;;;;;:::i;:::-;121350:19;108254:1;121350:4;:19;:::i;:::-;121349:25;;121373:1;121349:25;:::i;:::-;121348:67;;;;:::i;:::-;121431:14;;;:16;;121335:81;;-1:-1:-1;121431:16:0;;;:::i;121253:567::-;121477:8;:14;;;121469:22;;:4;:22;;:44;;;;;121512:1;121495:8;:14;;;:18;;;121469:44;121465:355;;;108254:1;121574:8;:16;;;121593:1;121574:20;;;;:::i;:::-;121573:37;;;;;;:::i;:::-;121545:19;108254:1;121545:4;:19;:::i;:::-;121544:25;;121568:1;121544:25;:::i;:::-;121543:67;;;;:::i;:::-;121626:14;;;:16;;121530:81;;-1:-1:-1;121626:16:0;;;:::i;121465:355::-;108254:1;121744:8;:16;;;121743:33;;;;;;:::i;:::-;121715:19;108254:1;121715:4;:19;:::i;:::-;121714:25;;121738:1;121714:25;:::i;:::-;121713:63;;;;:::i;:::-;121792:14;;;:16;;121700:77;;-1:-1:-1;121792:16:0;;;:::i;:::-;;;;;-1:-1:-1;121660:160:0;121838:4;-1:-1:-1;121844:8:0;;-1:-1:-1;;120811:1050:0;;;;;;:::o;125552:232::-;125693:7;125749:5;125756:4;125762:11;125738:36;;;;;;;;;;:::i;128389:251::-;45036:7;;;;45290:9;45282:38;;;;-1:-1:-1;;;45282:38:0;;;;;;;:::i;:::-;128587:45:::1;128614:4;128620:2;128624:7;128587:26;:45::i;102466:830::-:0;102591:4;102631;102591;102648:525;102672:5;:12;102668:1;:16;102648:525;;;102706:20;102729:5;102735:1;102729:8;;;;;;-1:-1:-1;;;102729:8:0;;;;;;;;;;;;;;;102706:31;;102774:12;102758;:28;102754:408;;102911:44;;;;;;9255:19:1;;;9290:12;;;9283:28;;;9327:12;;102911:44:0;;;;;;;;;;;;102901:55;;;;;;102886:70;;102754:408;;;103101:44;;;;;;9255:19:1;;;9290:12;;;9283:28;;;9327:12;;103101:44:0;;;;;;;;;;;;103091:55;;;;;;103076:70;;102754:408;-1:-1:-1;102686:3:0;;;;:::i;:::-;;;;102648:525;;;-1:-1:-1;103268:20:0;;;;102466:830;-1:-1:-1;;;102466:830:0:o;30733:382::-;-1:-1:-1;;;;;30813:16:0;;30805:61;;;;-1:-1:-1;;;30805:61:0;;21526:2:1;30805:61:0;;;21508:21:1;;;21545:18;;;21538:30;21604:34;21584:18;;;21577:62;21656:18;;30805:61:0;21498:182:1;30805:61:0;30886:16;30894:7;30886;:16::i;:::-;30885:17;30877:58;;;;-1:-1:-1;;;30877:58:0;;14923:2:1;30877:58:0;;;14905:21:1;14962:2;14942:18;;;14935:30;-1:-1:-1;;;14981:18:1;;;14974:58;15049:18;;30877:58:0;14895:178:1;30877:58:0;30948:45;30977:1;30981:2;30985:7;30948:20;:45::i;:::-;-1:-1:-1;;;;;31006:13:0;;;;;;:9;:13;;;;;:18;;31023:1;;31006:13;:18;;31023:1;;31006:18;:::i;:::-;;;;-1:-1:-1;;31035:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;31035:21:0;-1:-1:-1;;;;;31035:21:0;;;;;;;;31074:33;;31035:16;;;-1:-1:-1;;;;;;;;;;;31074:33:0;31035:16;;31074:33;30733:382;;:::o;17403:65::-;16271:13;;;;;;;;:30;;-1:-1:-1;16289:12:0;;;;16288:13;16271:30;16263:89;;;;-1:-1:-1;;;16263:89:0;;;;;;;:::i;:::-;16365:19;16388:13;;;;;;16387:14;16412:101;;;;16447:13;:20;;-1:-1:-1;;16482:19:0;;;;;16539:68;;;;16590:5;16574:21;;-1:-1:-1;;16574:21:0;;;17403:65;:::o;22561:158::-;16271:13;;;;;;;;:30;;-1:-1:-1;16289:12:0;;;;16288:13;16271:30;16263:89;;;;-1:-1:-1;;;16263:89:0;;;;;;;:::i;:::-;16365:19;16388:13;;;;;;16387:14;16412:101;;;;16447:13;:20;;-1:-1:-1;;16482:19:0;;;;;16412:101;22670:13;;::::1;::::0;:5:::1;::::0;:13:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;22694:17:0;;::::1;::::0;:7:::1;::::0;:17:::1;::::0;::::1;::::0;::::1;:::i;:::-;;16543:14:::0;16539:68;;;16590:5;16574:21;;-1:-1:-1;;16574:21:0;;;22561:158;;;:::o;44773:92::-;16271:13;;;;;;;;:30;;-1:-1:-1;16289:12:0;;;;16288:13;16271:30;16263:89;;;;-1:-1:-1;;;16263:89:0;;;;;;;:::i;:::-;16365:19;16388:13;;;;;;16387:14;16412:101;;;;16447:13;:20;;-1:-1:-1;;16482:19:0;;;;;16412:101;44842:7:::1;:15:::0;;-1:-1:-1;;44842:15:0::1;::::0;;16539:68;;;;16590:5;16574:21;;-1:-1:-1;;16574:21:0;;;44773:92;:::o;47247:99::-;16271:13;;;;;;;;:30;;-1:-1:-1;16289:12:0;;;;16288:13;16271:30;16263:89;;;;-1:-1:-1;;;16263:89:0;;;;;;;:::i;:::-;16365:19;16388:13;;;;;;16387:14;16412:101;;;;16447:13;:20;;-1:-1:-1;;16482:19:0;;;;;16412:101;47315:23:::1;17554:10:::0;47315:9:::1;:23::i;30076:321::-:0;30206:18;30212:2;30216:7;30206:5;:18::i;:::-;30257:54;30288:1;30292:2;30296:7;30305:5;30257:22;:54::i;:::-;30235:154;;;;-1:-1:-1;;;30235:154:0;;;;;;;:::i;33509:821::-;33664:4;-1:-1:-1;;;;;33685:13:0;;8747:20;8795:8;33681:642;;33721:83;;-1:-1:-1;;;33721:83:0;;-1:-1:-1;;;;;33721:47:0;;;;;:83;;17554:10;;33783:4;;33789:7;;33798:5;;33721:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33721:83:0;;;;;;;;-1:-1:-1;;33721:83:0;;;;;;;;;;;;:::i;:::-;;;33717:551;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33985:13:0;;33981:272;;34028:60;;-1:-1:-1;;;34028:60:0;;;;;;;:::i;33981:272::-;34203:6;34197:13;34188:6;34184:2;34180:15;34173:38;33717:551;-1:-1:-1;;;;;;33855:62:0;-1:-1:-1;;;33855:62:0;;-1:-1:-1;33848:69:0;;33681:642;-1:-1:-1;34307:4:0;33509:821;;;;;;:::o;39116:589::-;-1:-1:-1;;;;;39322:18:0;;39318:187;;39357:40;39389:7;40543:10;:17;;40516:24;;;;:15;:24;;;;;:44;;;40571:24;;;;;;;;;;;;40439:164;39357:40;39318:187;;;39427:2;-1:-1:-1;;;;;39419:10:0;:4;-1:-1:-1;;;;;39419:10:0;;39415:90;;39446:47;39479:4;39485:7;39446:32;:47::i;:::-;-1:-1:-1;;;;;39519:16:0;;39515:183;;39552:45;39589:7;39552:36;:45::i;39515:183::-;39625:4;-1:-1:-1;;;;;39619:10:0;:2;-1:-1:-1;;;;;39619:10:0;;39615:83;;39646:40;39674:2;39678:7;39646:27;:40::i;41230:999::-;41496:22;41557:1;41521:33;41549:4;41521:27;:33::i;:::-;:37;;;;:::i;:::-;41569:18;41590:26;;;:17;:26;;;;;;41496:62;;-1:-1:-1;41723:28:0;;;41719:328;;-1:-1:-1;;;;;41790:18:0;;41768:19;41790:18;;;:12;:18;;;;;;;;:34;;;;;;;;;41841:30;;;;;;:44;;;41958:30;;:17;:30;;;;;:43;;;41719:328;-1:-1:-1;42143:26:0;;;;:17;:26;;;;;;;;42136:33;;;-1:-1:-1;;;;;42187:18:0;;;;;:12;:18;;;;;:34;;;;;;;42180:41;41230:999::o;42524:1079::-;42802:10;:17;42777:22;;42802:21;;42822:1;;42802:21;:::i;:::-;42834:18;42855:24;;;:15;:24;;;;;;43228:10;:26;;42777:46;;-1:-1:-1;42855:24:0;;42777:46;;43228:26;;;;-1:-1:-1;;;43228:26:0;;;;;;;;;;;;;;;;;43206:48;;43292:11;43267:10;43278;43267:22;;;;;;-1:-1:-1;;;43267:22:0;;;;;;;;;;;;;;;;;;;;:36;;;;43372:28;;;:15;:28;;;;;;;:41;;;43544:24;;;;;43537:31;43579:10;:16;;;;;-1:-1:-1;;;43579:16:0;;;;;;;;;;;;;;;;;;;;;;;;;;42524:1079;;;;:::o;40006:232::-;40091:14;40108:31;40136:2;40108:27;:31::i;:::-;-1:-1:-1;;;;;40150:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;40195:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;40006:232:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:2;;177:1;174;167:12;111:2;63:124;;;:::o;192:391::-;255:8;265:6;319:3;312:4;304:6;300:17;296:27;286:2;;342:6;334;327:22;286:2;-1:-1:-1;370:20:1;;-1:-1:-1;;;;;402:30:1;;399:2;;;452:8;442;435:26;399:2;496:4;488:6;484:17;472:29;;556:3;549:4;539:6;536:1;532:14;524:6;520:27;516:38;513:47;510:2;;;573:1;570;563:12;588:160;653:20;;709:13;;702:21;692:32;;682:2;;738:1;735;728:12;753:156;819:20;;879:4;868:16;;858:27;;848:2;;899:1;896;889:12;914:196;973:6;1026:2;1014:9;1005:7;1001:23;997:32;994:2;;;1047:6;1039;1032:22;994:2;1075:29;1094:9;1075:29;:::i;1115:270::-;1183:6;1191;1244:2;1232:9;1223:7;1219:23;1215:32;1212:2;;;1265:6;1257;1250:22;1212:2;1293:29;1312:9;1293:29;:::i;:::-;1283:39;;1341:38;1375:2;1364:9;1360:18;1341:38;:::i;:::-;1331:48;;1202:183;;;;;:::o;1390:338::-;1467:6;1475;1483;1536:2;1524:9;1515:7;1511:23;1507:32;1504:2;;;1557:6;1549;1542:22;1504:2;1585:29;1604:9;1585:29;:::i;:::-;1575:39;;1633:38;1667:2;1656:9;1652:18;1633:38;:::i;:::-;1623:48;;1718:2;1707:9;1703:18;1690:32;1680:42;;1494:234;;;;;:::o;1733:933::-;1828:6;1836;1844;1852;1905:3;1893:9;1884:7;1880:23;1876:33;1873:2;;;1927:6;1919;1912:22;1873:2;1955:29;1974:9;1955:29;:::i;:::-;1945:39;;2003:38;2037:2;2026:9;2022:18;2003:38;:::i;:::-;1993:48;-1:-1:-1;2088:2:1;2073:18;;2060:32;;-1:-1:-1;2143:2:1;2128:18;;2115:32;-1:-1:-1;;;;;2159:30:1;;2156:2;;;2207:6;2199;2192:22;2156:2;2235:22;;2288:4;2280:13;;2276:27;-1:-1:-1;2266:2:1;;2322:6;2314;2307:22;2266:2;2363;2350:16;2388:48;2404:31;2432:2;2404:31;:::i;:::-;2388:48;:::i;:::-;2459:2;2452:5;2445:17;2499:7;2494:2;2489;2485;2481:11;2477:20;2474:33;2471:2;;;2525:6;2517;2510:22;2471:2;2585;2580;2576;2572:11;2567:2;2560:5;2556:14;2543:45;2608:14;;;2624:2;2604:23;2597:39;;;;-1:-1:-1;1863:803:1;;;;-1:-1:-1;1863:803:1;-1:-1:-1;1863:803:1:o;2671:264::-;2736:6;2744;2797:2;2785:9;2776:7;2772:23;2768:32;2765:2;;;2818:6;2810;2803:22;2765:2;2846:29;2865:9;2846:29;:::i;:::-;2836:39;;2894:35;2925:2;2914:9;2910:18;2894:35;:::i;2940:264::-;3008:6;3016;3069:2;3057:9;3048:7;3044:23;3040:32;3037:2;;;3090:6;3082;3075:22;3037:2;3118:29;3137:9;3118:29;:::i;:::-;3108:39;3194:2;3179:18;;;;3166:32;;-1:-1:-1;;;3027:177:1:o;3209:599::-;3313:6;3321;3329;3337;3390:2;3378:9;3369:7;3365:23;3361:32;3358:2;;;3411:6;3403;3396:22;3358:2;3439:29;3458:9;3439:29;:::i;:::-;3429:39;-1:-1:-1;3515:2:1;3500:18;;3487:32;;-1:-1:-1;3570:2:1;3555:18;;3542:32;-1:-1:-1;;;;;3586:30:1;;3583:2;;;3634:6;3626;3619:22;3583:2;3678:70;3740:7;3731:6;3720:9;3716:22;3678:70;:::i;:::-;3348:460;;;;-1:-1:-1;3767:8:1;-1:-1:-1;;;;3348:460:1:o;3813:457::-;3899:6;3907;3960:2;3948:9;3939:7;3935:23;3931:32;3928:2;;;3981:6;3973;3966:22;3928:2;4013:23;;-1:-1:-1;;;;;4048:30:1;;4045:2;;;4096:6;4088;4081:22;4045:2;4140:70;4202:7;4193:6;4182:9;4178:22;4140:70;:::i;:::-;4229:8;;4114:96;;-1:-1:-1;3918:352:1;-1:-1:-1;;;;3918:352:1:o;4275:190::-;4331:6;4384:2;4372:9;4363:7;4359:23;4355:32;4352:2;;;4405:6;4397;4390:22;4352:2;4433:26;4449:9;4433:26;:::i;4470:190::-;4529:6;4582:2;4570:9;4561:7;4557:23;4553:32;4550:2;;;4603:6;4595;4588:22;4550:2;-1:-1:-1;4631:23:1;;4540:120;-1:-1:-1;4540:120:1:o;4665:255::-;4723:6;4776:2;4764:9;4755:7;4751:23;4747:32;4744:2;;;4797:6;4789;4782:22;4744:2;4841:9;4828:23;4860:30;4884:5;4860:30;:::i;4925:259::-;4994:6;5047:2;5035:9;5026:7;5022:23;5018:32;5015:2;;;5068:6;5060;5053:22;5015:2;5105:9;5099:16;5124:30;5148:5;5124:30;:::i;5189:675::-;5269:6;5322:2;5310:9;5301:7;5297:23;5293:32;5290:2;;;5343:6;5335;5328:22;5290:2;5375:16;;-1:-1:-1;;;;;5403:30:1;;5400:2;;;5451:6;5443;5436:22;5400:2;5479:22;;5532:4;5524:13;;5520:27;-1:-1:-1;5510:2:1;;5566:6;5558;5551:22;5510:2;5600;5594:9;5625:48;5641:31;5669:2;5641:31;:::i;5625:48::-;5696:2;5689:5;5682:17;5736:7;5731:2;5726;5722;5718:11;5714:20;5711:33;5708:2;;;5762:6;5754;5747:22;5708:2;5780:54;5831:2;5826;5819:5;5815:14;5810:2;5806;5802:11;5780:54;:::i;6064:260::-;6130:6;6138;6191:2;6179:9;6170:7;6166:23;6162:32;6159:2;;;6212:6;6204;6197:22;6159:2;6253:9;6240:23;6230:33;;6282:36;6314:2;6303:9;6299:18;6282:36;:::i;6329:604::-;6425:6;6433;6441;6449;6457;6465;6473;6526:3;6514:9;6505:7;6501:23;6497:33;6494:2;;;6548:6;6540;6533:22;6494:2;6589:9;6576:23;6566:33;;6618:36;6650:2;6639:9;6635:18;6618:36;:::i;:::-;6608:46;;6673:35;6704:2;6693:9;6689:18;6673:35;:::i;:::-;6663:45;;6727:35;6758:2;6747:9;6743:18;6727:35;:::i;:::-;6717:45;;6781:36;6812:3;6801:9;6797:19;6781:36;:::i;:::-;6771:46;;6836:36;6867:3;6856:9;6852:19;6836:36;:::i;:::-;6826:46;;6891:36;6922:3;6911:9;6907:19;6891:36;:::i;:::-;6881:46;;6484:449;;;;;;;;;;:::o;6938:685::-;7046:6;7054;7062;7070;7078;7086;7094;7102;7155:3;7143:9;7134:7;7130:23;7126:33;7123:2;;;7177:6;7169;7162:22;7123:2;7218:9;7205:23;7195:33;;7247:36;7279:2;7268:9;7264:18;7247:36;:::i;:::-;7237:46;;7302:36;7334:2;7323:9;7319:18;7302:36;:::i;:::-;7292:46;;7357:36;7389:2;7378:9;7374:18;7357:36;:::i;:::-;7347:46;;7412:37;7444:3;7433:9;7429:19;7412:37;:::i;:::-;7402:47;;7468:37;7500:3;7489:9;7485:19;7468:37;:::i;:::-;7458:47;;7524:37;7556:3;7545:9;7541:19;7524:37;:::i;:::-;7514:47;;7580:37;7612:3;7601:9;7597:19;7580:37;:::i;:::-;7570:47;;7113:510;;;;;;;;;;;:::o;7628:192::-;7685:6;7738:2;7726:9;7717:7;7713:23;7709:32;7706:2;;;7759:6;7751;7744:22;7706:2;7787:27;7804:9;7787:27;:::i;7825:304::-;7883:6;7936:2;7924:9;7915:7;7911:23;7907:32;7904:2;;;7957:6;7949;7942:22;7904:2;7988:23;;-1:-1:-1;;;;;8040:30:1;;8030:41;;8020:2;;8090:6;8082;8075:22;8134:257;8175:3;8213:5;8207:12;8240:6;8235:3;8228:19;8256:63;8312:6;8305:4;8300:3;8296:14;8289:4;8282:5;8278:16;8256:63;:::i;:::-;8373:2;8352:15;-1:-1:-1;;8348:29:1;8339:39;;;;8380:4;8335:50;;8183:208;-1:-1:-1;;8183:208:1:o;8396:341::-;-1:-1:-1;;;;;;8591:2:1;8627:15;;;8623:24;;8611:37;;8682:15;;;;8678:24;8673:2;8664:12;;8657:46;8728:2;8719:12;;8559:178::o;9641:203::-;-1:-1:-1;;;;;9805:32:1;;;;9787:51;;9775:2;9760:18;;9742:102::o;9849:488::-;-1:-1:-1;;;;;10118:15:1;;;10100:34;;10170:15;;10165:2;10150:18;;10143:43;10217:2;10202:18;;10195:34;;;10265:3;10260:2;10245:18;;10238:31;;;10043:4;;10286:45;;10311:19;;10303:6;10286:45;:::i;:::-;10278:53;10052:285;-1:-1:-1;;;;;;10052:285:1:o;10342:274::-;-1:-1:-1;;;;;10534:32:1;;;;10516:51;;10598:2;10583:18;;10576:34;10504:2;10489:18;;10471:145::o;11246:622::-;11476:3;11461:19;;11510:1;11499:13;;11489:2;;11555:10;11550:3;11546:20;11543:1;11536:31;11590:4;11587:1;11580:15;11618:4;11615:1;11608:15;11489:2;11642:25;;;-1:-1:-1;;;;;11703:32:1;;;;11698:2;11683:18;;11676:60;11784:14;11772:27;;;;11767:2;11752:18;;11745:55;11848:12;11836:25;11831:2;11816:18;;;11809:53;11443:425;:::o;12223:219::-;12372:2;12361:9;12354:21;12335:4;12392:44;12432:2;12421:9;12417:18;12409:6;12392:44;:::i;12447:335::-;12649:2;12631:21;;;12688:2;12668:18;;;12661:30;-1:-1:-1;;;12722:2:1;12707:18;;12700:41;12773:2;12758:18;;12621:161::o;13895:414::-;14097:2;14079:21;;;14136:2;14116:18;;;14109:30;14175:34;14170:2;14155:18;;14148:62;-1:-1:-1;;;14241:2:1;14226:18;;14219:48;14299:3;14284:19;;14069:240::o;17282:331::-;17484:2;17466:21;;;17523:1;17503:18;;;17496:29;-1:-1:-1;;;17556:2:1;17541:18;;17534:38;17604:2;17589:18;;17456:157::o;17964:340::-;18166:2;18148:21;;;18205:2;18185:18;;;18178:30;-1:-1:-1;;;18239:2:1;18224:18;;18217:46;18295:2;18280:18;;18138:166::o;19891:410::-;20093:2;20075:21;;;20132:2;20112:18;;;20105:30;20171:34;20166:2;20151:18;;20144:62;-1:-1:-1;;;20237:2:1;20222:18;;20215:44;20291:3;20276:19;;20065:236::o;20989:330::-;21191:2;21173:21;;;21230:1;21210:18;;;21203:29;-1:-1:-1;;;21263:2:1;21248:18;;21241:37;21310:2;21295:18;;21163:156::o;22781:356::-;22983:2;22965:21;;;23002:18;;;22995:30;23061:34;23056:2;23041:18;;23034:62;23128:2;23113:18;;22955:182::o;24294:413::-;24496:2;24478:21;;;24535:2;24515:18;;;24508:30;24574:34;24569:2;24554:18;;24547:62;-1:-1:-1;;;24640:2:1;24625:18;;24618:47;24697:3;24682:19;;24468:239::o;25807:335::-;26009:2;25991:21;;;26048:2;26028:18;;;26021:30;-1:-1:-1;;;26082:2:1;26067:18;;26060:41;26133:2;26118:18;;25981:161::o;29251:361::-;29456:6;29445:9;29438:25;29499:2;29494;29483:9;29479:18;29472:30;29419:4;29519:44;29559:2;29548:9;29544:18;29536:6;29519:44;:::i;:::-;29511:52;;29599:6;29594:2;29583:9;29579:18;29572:34;29428:184;;;;;;:::o;30816:275::-;30887:2;30881:9;30952:2;30933:13;;-1:-1:-1;;30929:27:1;30917:40;;-1:-1:-1;;;;;30972:34:1;;31008:22;;;30969:62;30966:2;;;31034:18;;:::i;:::-;31070:2;31063:22;30861:230;;-1:-1:-1;30861:230:1:o;31096:186::-;31144:4;-1:-1:-1;;;;;31166:30:1;;31163:2;;;31199:18;;:::i;:::-;-1:-1:-1;31265:2:1;31244:15;-1:-1:-1;;31240:29:1;31271:4;31236:40;;31153:129::o;31287:224::-;31326:3;31354:6;31387:2;31384:1;31380:10;31417:2;31414:1;31410:10;31448:3;31444:2;31440:12;31435:3;31432:21;31429:2;;;31456:18;;:::i;:::-;31492:13;;31334:177;-1:-1:-1;;;;31334:177:1:o;31516:128::-;31556:3;31587:1;31583:6;31580:1;31577:13;31574:2;;;31593:18;;:::i;:::-;-1:-1:-1;31629:9:1;;31564:80::o;31649:204::-;31687:3;31723:4;31720:1;31716:12;31755:4;31752:1;31748:12;31790:3;31784:4;31780:14;31775:3;31772:23;31769:2;;;31798:18;;:::i;:::-;31834:13;;31695:158;-1:-1:-1;;;31695:158:1:o;31858:236::-;31897:3;-1:-1:-1;;;;;31963:10:1;;;31993;;;32023:12;;;32015:21;;32012:2;;;32039:18;;:::i;32099:120::-;32139:1;32165;32155:2;;32170:18;;:::i;:::-;-1:-1:-1;32204:9:1;;32145:74::o;32224:168::-;32264:7;32330:1;32326;32322:6;32318:14;32315:1;32312:21;32307:1;32300:9;32293:17;32289:45;32286:2;;;32337:18;;:::i;:::-;-1:-1:-1;32377:9:1;;32276:116::o;32397:270::-;32436:7;-1:-1:-1;;;;;32506:10:1;;;32536;;;32569:11;;32562:19;32591:12;;;32583:21;;32558:47;32555:2;;;32608:18;;:::i;:::-;32648:13;;32448:219;-1:-1:-1;;;;32448:219:1:o;32672:125::-;32712:4;32740:1;32737;32734:8;32731:2;;;32745:18;;:::i;:::-;-1:-1:-1;32782:9:1;;32721:76::o;32802:225::-;32841:4;32870:14;32934:10;;;;32904;;32956:12;;;32953:2;;;32971:18;;:::i;:::-;33008:13;;32850:177;-1:-1:-1;;;32850:177:1:o;33032:195::-;33070:4;33107;33104:1;33100:12;33139:4;33136:1;33132:12;33164:3;33159;33156:12;33153:2;;;33171:18;;:::i;:::-;33208:13;;;33079:148;-1:-1:-1;;;33079:148:1:o;33232:258::-;33304:1;33314:113;33328:6;33325:1;33322:13;33314:113;;;33404:11;;;33398:18;33385:11;;;33378:39;33350:2;33343:10;33314:113;;;33445:6;33442:1;33439:13;33436:2;;;-1:-1:-1;;33480:1:1;33462:16;;33455:27;33285:205::o;33495:181::-;33533:3;33577:6;33570:5;33566:18;33603:7;33593:2;;33614:18;;:::i;:::-;-1:-1:-1;;33650:20:1;;33541:135;-1:-1:-1;;33541:135:1:o;33681:380::-;33760:1;33756:12;;;;33803;;;33824:2;;33878:4;33870:6;33866:17;33856:27;;33824:2;33931;33923:6;33920:14;33900:18;33897:38;33894:2;;;33977:10;33972:3;33968:20;33965:1;33958:31;34012:4;34009:1;34002:15;34040:4;34037:1;34030:15;33894:2;;33736:325;;;:::o;34066:135::-;34105:3;-1:-1:-1;;34126:17:1;;34123:2;;;34146:18;;:::i;:::-;-1:-1:-1;34193:1:1;34182:13;;34113:88::o;34206:175::-;34243:3;34287:4;34280:5;34276:16;34316:4;34307:7;34304:17;34301:2;;;34324:18;;:::i;:::-;34373:1;34360:15;;34251:130;-1:-1:-1;;34251:130:1:o;34386:112::-;34418:1;34444;34434:2;;34449:18;;:::i;:::-;-1:-1:-1;34483:9:1;;34424:74::o;34503:127::-;34564:10;34559:3;34555:20;34552:1;34545:31;34595:4;34592:1;34585:15;34619:4;34616:1;34609:15;34635:127;34696:10;34691:3;34687:20;34684:1;34677:31;34727:4;34724:1;34717:15;34751:4;34748:1;34741:15;34767:127;34828:10;34823:3;34819:20;34816:1;34809:31;34859:4;34856:1;34849:15;34883:4;34880:1;34873:15;34899:131;-1:-1:-1;;;;;;34973:32:1;;34963:43;;34953:2;;35020:1;35017;35010:12
Swarm Source
ipfs://28c344260942ef8bfab252b3aea5f5d5260ec44c7bbe19fd8584e0303bd83fa4
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.