Overview
TokenID
4780
Total Transfers
-
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
YAKDAODomes
Compiler Version
v0.8.0+commit.c7dfd78e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-09-08 */ /** $$\ $$\ $$$$$$\ $$\ $$\ $$$$$$$\ $$$$$$\ $$$$$$\ \$$\ $$ |$$ __$$\ $$ | $$ |$$ __$$\ $$ __$$\ $$ __$$\ \$$\ $$ / $$ / $$ |$$ |$$ / $$ | $$ |$$ / $$ |$$ / $$ | \$$$$ / $$$$$$$$ |$$$$$ / $$ | $$ |$$$$$$$$ |$$ | $$ | \$$ / $$ __$$ |$$ $$< $$ | $$ |$$ __$$ |$$ | $$ | $$ | $$ | $$ |$$ |\$$\ $$ | $$ |$$ | $$ |$$ | $$ | $$ | $$ | $$ |$$ | \$$\ $$$$$$$ |$$ | $$ | $$$$$$ | \__| \__| \__|\__| \__|\_______/ \__| \__| \______/ By 0xPioneers */ //SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) private pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } /** * @dev YAKDAO Camping and Glamping Properties, NFT Collection. */ contract YAKDAODomes is ERC721, Ownable { using Strings for uint256; address public treasury; string public baseTokenURI; enum stage { Paused, Presale, Open } stage public mintStage = stage.Paused; enum asset { MaunaKea, Everest, K2, Sherpa } uint16[4] private floor = [1, 534, 4776, 9981]; mapping(asset => uint256) private index; uint16[4] private ceiling = [533, 4775, 9980, 10000]; mapping(asset => mapping(address => uint16)) private presale; mapping(asset => uint16) private presaleLeft; uint8[4] public mintLimit = [3, 5, 5, 0]; mapping(address => mapping(asset => uint8)) private mintIndex; uint256[4] public mintFee = [2.5 ether, 0.1 ether, 0.05 ether, 0]; bool private reentrancyLock = false; modifier reentrancyGuard { if (reentrancyLock) { revert(); } reentrancyLock = true; _; reentrancyLock = false; } constructor( ) ERC721("YAK Domes", "YAKDAO") { //initialize indexes to each floor's starting index index[asset.MaunaKea] = floor[uint256(asset.MaunaKea)]; index[asset.Everest] = floor[uint256(asset.Everest)]; index[asset.K2] = floor[uint256(asset.K2)]; index[asset.Sherpa] = floor[uint256(asset.Sherpa)]; } /** * @dev Add dome `_type` presale whitelist `amount` for `account`. */ function addPresale( asset _type, address _account, uint16 _amount ) public onlyOwner { require(_account != address(0) && _amount > 0, "YAKDAO: Invalid presale"); presale[_type][_account] += _amount; presaleLeft[_type] += _amount; } /** * @dev Add dome `_type` presale whitelist arrays of `amount` for `account`. */ function addPresales( asset _type, address[] calldata _account, uint16[] calldata _amount ) external onlyOwner { require(_account.length > 0 && _account.length ==_amount.length, "YAKDAO: Invalid presales"); for (uint16 i; i < _account.length; i++) { if (_account[i] != address(0) && _amount[i] > 0) { addPresale(_type, _account[i], _amount[i]); } } } /** * @dev Set treasury `_account` where mint fees are sent to. */ function setTreasury( address _account ) external onlyOwner { treasury = _account; } /** * @dev Set mint `_stage` as enumeration 'Paused' (0), 'Presale' (1), or 'Open' (2) */ function setMintStage( stage _stage ) external onlyOwner { mintStage = _stage; } /** * @dev Set dome `_type` `_mintFee` */ function setMintFee( asset _type, uint256 _mintFee ) external onlyOwner { mintFee[uint256(_type)] = _mintFee; } /** * @dev Set dome `_type` mint `_limit` per account (does not include presale) */ function setMintLimit( asset _type, uint8 _limit ) external onlyOwner { mintLimit[uint256(_type)] = _limit; } /** * @dev Set `_baseTokenURI` for collection */ function setBaseURI( string memory _baseTokenURI ) external onlyOwner { baseTokenURI = _baseTokenURI; } /** * @dev Open Mint for dome `_type` for mintFee if within mintLimit * Mint Stages: * Paused - No mnting allowed * Presale - Presale minting only * Open - Open Minting */ function mint( asset _type ) external payable reentrancyGuard { require(mintStage == stage.Open, "YAKDAO: Minting not open."); uint256 type_ = uint256(_type); require(type_ < 3, "YAKDAO: Invalid type, 0-2."); require(//has supply available index[_type] + presaleLeft[_type] <= ceiling[type_], "YAKDAO: Supply limit reached for type." ); require(mintIndex[_msgSender()][_type] < mintLimit[type_], "YAKDAO: Mint limit reached."); uint256 mintFee_ = mintFee[type_]; require(msg.value >= mintFee_, "YAKDAO: Mint fee required."); if (msg.value > mintFee_) { refundOverpay(msg.value - mintFee_); } Address.sendValue(payable(treasury), mintFee_); _mint(_msgSender(), index[_type]); index[_type] += 1; mintIndex[_msgSender()][_type] += 1; } /** * @dev Presale only mint function */ function mintPresale( asset _type ) external reentrancyGuard { require(mintStage != stage.Paused, "YAKDAO: Minting paused."); uint16 _amount = presale[_type][_msgSender()]; require(_amount > 0, "YAKDAO: No presales left to mint."); for (uint16 i = 0; i < _amount; i++) { _mint(_msgSender(), index[_type] + i); } presaleLeft[_type] -= _amount; index[_type] += _amount; delete presale[_type][_msgSender()]; } /** * @dev Owner Sherpa mint function */ function mintSherpa( ) external onlyOwner reentrancyGuard { uint256 _floor = floor[uint256(asset.Sherpa)]; uint256 _ceiling = ceiling[uint256(asset.Sherpa)]; for (uint256 i = _floor; i <= _ceiling; i++) { _mint(_msgSender(), i); } index[asset.Sherpa] = ceiling[uint256(asset.Sherpa)] + 1; } /** * @dev View of presales left for `_type` by `_account` */ function presaleByAccount( asset _type, address _account ) public view returns (uint16) { return presale[_type][_account]; } /** * @dev View of all msg sender presales */ function allAccountPresales( ) external view returns (uint16[3] memory amounts) { amounts = [ presaleByAccount(asset.MaunaKea, _msgSender()), presaleByAccount(asset.Everest, _msgSender()), presaleByAccount(asset.K2, _msgSender()) ]; } /** * @dev View of total presales left for `_type` */ function presaleTotal( asset _type ) external view returns (uint16) { return presaleLeft[_type]; } /** * @dev View of total collection supply accross all types */ function totalSupply( ) external view returns (uint256) { return (index[asset.MaunaKea] - floor[uint256(asset.MaunaKea)]) + (index[asset.Everest] - floor[uint256(asset.Everest)]) + (index[asset.K2] - floor[uint256(asset.K2)]) + (index[asset.Sherpa] - floor[uint256(asset.Sherpa)]); } /** * @dev View of total asset supply by `_type` */ function totalAssetSupply( asset _type ) public view returns (uint256) { return index[_type] - floor[uint256(_type)]; } /** * @dev View of total collection max supply */ function maxSupply( ) public view returns (uint256) { return ceiling[uint256(asset.Sherpa)]; } /** * @dev View of collection dome `_type` max supply */ function maxAssetSupply( asset _type ) public view returns (uint256) { return ceiling[uint256(_type)] - floor[uint256(_type)] + 1; } /** * @dev View of all assets supply */ function allAssetSupply( ) external view returns (uint256[4] memory total, uint256[4] memory max) { total = [ totalAssetSupply(asset.MaunaKea), totalAssetSupply(asset.Everest), totalAssetSupply(asset.K2), totalAssetSupply(asset.Sherpa) ]; max = [ maxAssetSupply(asset.MaunaKea), maxAssetSupply(asset.Everest), maxAssetSupply(asset.K2), maxAssetSupply(asset.Sherpa) ]; } /** * @dev View of mints left for `_type` per account */ function mintsLeftOfType( asset _type ) public view returns (uint8) { return mintLimit[uint256(_type)] - mintIndex[_msgSender()][_type]; } /** * @dev View of mints left per account */ function mintsLeft( ) external view returns (uint8[3] memory amounts) { amounts = [ mintsLeftOfType(asset.MaunaKea), mintsLeftOfType(asset.Everest), mintsLeftOfType(asset.K2) ]; } /** * @dev View of NFT token URI data */ function tokenURI( uint256 tokenId ) public view override returns (string memory) { return string(abi.encodePacked( baseTokenURI, tokenId.toString(), '.json' )); } /** * @dev Owner only, withdraw contract funds */ function withdraw( ) public onlyOwner { require(address(this).balance > 0, "ERC721Base: Nothing to withdraw"); Address.sendValue(payable(owner()), address(this).balance); } /** * @dev Conveinience function to refund any funds sent beyond required mint fees. */ function refundOverpay( uint256 _amount ) internal { if (_amount > 0 && msg.value >= _amount) { (bool refunded, ) = payable(msg.sender).call{value: _amount}(""); require(refunded, "YAKDAO: Failed to refund overpayment"); } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"enum YAKDAODomes.asset","name":"_type","type":"uint8"},{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint16","name":"_amount","type":"uint16"}],"name":"addPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum YAKDAODomes.asset","name":"_type","type":"uint8"},{"internalType":"address[]","name":"_account","type":"address[]"},{"internalType":"uint16[]","name":"_amount","type":"uint16[]"}],"name":"addPresales","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"allAccountPresales","outputs":[{"internalType":"uint16[3]","name":"amounts","type":"uint16[3]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allAssetSupply","outputs":[{"internalType":"uint256[4]","name":"total","type":"uint256[4]"},{"internalType":"uint256[4]","name":"max","type":"uint256[4]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum YAKDAODomes.asset","name":"_type","type":"uint8"}],"name":"maxAssetSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum YAKDAODomes.asset","name":"_type","type":"uint8"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"mintFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"mintLimit","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum YAKDAODomes.asset","name":"_type","type":"uint8"}],"name":"mintPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintSherpa","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintStage","outputs":[{"internalType":"enum YAKDAODomes.stage","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintsLeft","outputs":[{"internalType":"uint8[3]","name":"amounts","type":"uint8[3]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum YAKDAODomes.asset","name":"_type","type":"uint8"}],"name":"mintsLeftOfType","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum YAKDAODomes.asset","name":"_type","type":"uint8"},{"internalType":"address","name":"_account","type":"address"}],"name":"presaleByAccount","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum YAKDAODomes.asset","name":"_type","type":"uint8"}],"name":"presaleTotal","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseTokenURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum YAKDAODomes.asset","name":"_type","type":"uint8"},{"internalType":"uint256","name":"_mintFee","type":"uint256"}],"name":"setMintFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum YAKDAODomes.asset","name":"_type","type":"uint8"},{"internalType":"uint8","name":"_limit","type":"uint8"}],"name":"setMintLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum YAKDAODomes.stage","name":"_stage","type":"uint8"}],"name":"setMintStage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"setTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum YAKDAODomes.asset","name":"_type","type":"uint8"}],"name":"totalAssetSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6009805460ff191690556101006040526001608090815261021660a0526112a860c0526126fd60e0526200003890600a906004620002a2565b506040805160808101825261021581526112a760208201526126fc9181019190915261271060608201526200007290600c906004620002a2565b5060408051608081018252600381526005602082018190529181019190915260006060820152620000a890600f9060046200033f565b50604080516080810182526722b1c8c1227a0000815267016345785d8a0000602082015266b1a2bc2ec500009181019190915260006060820152620000f2906011906004620003c5565b506015805460ff191690553480156200010a57600080fd5b50604080518082018252600981526859414b20446f6d657360b81b60208083019182528351808501909452600684526559414b44414f60d01b9084015281519192916200015a9160009162000401565b5080516200017090600190602084019062000401565b5050506200018d620001876200024c60201b60201c565b62000250565b600a54600b60205261ffff8082167fdf7de25b7f1fd6d0b5205f0e18f1f35bd7b8d84cce336588d184533ce43a6f765562010000820481167f72c6bfb7988af3a1efa6568f02a999bc52252641c659d85961ca3d372b57d5cf55640100000000820481167fa50eece07c7db1631545c0069bd8f5f54d5935e215d59097edf258a44ba916345560036000526601000000000000909104167f64c15cc42be7899b001f818cf4433057002112c418d1d3a67cd5cb453051d33e55620004d2565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001830191839082156200032d5791602002820160005b83821115620002fb57835183826101000a81548161ffff021916908361ffff1602179055509260200192600201602081600101049283019260010302620002b9565b80156200032b5782816101000a81549061ffff0219169055600201602081600101049283019260010302620002fb565b505b506200033b9291506200047e565b5090565b6001830191839082156200032d5791602002820160005b838211156200039657835183826101000a81548160ff021916908360ff160217905550926020019260010160208160000104928301926001030262000356565b80156200032b5782816101000a81549060ff021916905560010160208160000104928301926001030262000396565b82600481019282156200032d579160200282015b828111156200032d57825182906001600160401b0316905591602001919060010190620003d9565b8280546200040f9062000495565b90600052602060002090601f0160209004810192826200043357600085556200032d565b82601f106200044e57805160ff19168380011785556200032d565b828001600101855582156200032d579182015b828111156200032d57825182559160200191906001019062000461565b5b808211156200033b57600081556001016200047f565b600281046001821680620004aa57607f821691505b60208210811415620004cc57634e487b7160e01b600052602260045260246000fd5b50919050565b6139b480620004e26000396000f3fe6080604052600436106102515760003560e01c806395d89b4111610139578063cdedc0b5116100b6578063da8c7e6b1161007a578063da8c7e6b146106b8578063e521aa94146106db578063e985e9c5146106fb578063f0f442601461071b578063f150a0491461073b578063f2fde38b1461075d57610251565b8063cdedc0b51461062e578063d4795a4f1461064e578063d547cfb71461066e578063d5abeb0114610683578063d7d6d6661461069857610251565b8063aee0fcb6116100fd578063aee0fcb614610581578063b88d4fde146105a1578063bb0ba35d146105c1578063bd8c01c4146105e1578063c87b56dd1461060e57610251565b806395d89b41146104ea5780639d5561e1146104ff578063a0a6ee0f14610521578063a22cb46514610541578063a80be0ea1461056157610251565b80633e1dd866116101d25780636ecd2306116101965780636ecd23061461045857806370a082311461046b578063715018a61461048b578063796e60f8146104a05780638a35ace3146104b55780638da5cb5b146104d557610251565b80633e1dd866146103c357806342842e0e146103e357806355f804b31461040357806361d027b3146104235780636352211e1461043857610251565b806315da46581161021957806315da46581461031d57806318160ddd1461034a57806323b872dd1461036c57806332c21f1e1461038c5780633ccfd60b146103ae57610251565b806301ffc9a71461025657806306fdde031461028c578063081812fc146102ae578063095ea7b3146102db5780630cbb6cc7146102fd575b600080fd5b34801561026257600080fd5b50610276610271366004612beb565b61077d565b6040516102839190612ff4565b60405180910390f35b34801561029857600080fd5b506102a16107c5565b6040516102839190613027565b3480156102ba57600080fd5b506102ce6102c9366004612de2565b610857565b6040516102839190612f27565b3480156102e757600080fd5b506102fb6102f6366004612bc2565b6108a3565b005b34801561030957600080fd5b506102fb610318366004612d18565b61093b565b34801561032957600080fd5b5061033d610338366004612c3d565b6109c1565b6040516102839190613768565b34801561035657600080fd5b5061035f610a39565b6040516102839190613777565b34801561037857600080fd5b506102fb610387366004612ad4565b610b69565b34801561039857600080fd5b506103a1610ba1565b6040516102839190612f78565b3480156103ba57600080fd5b506102fb610bf8565b3480156103cf57600080fd5b5061035f6103de366004612c23565b610c6a565b3480156103ef57600080fd5b506102fb6103fe366004612ad4565b610d3f565b34801561040f57600080fd5b506102fb61041e366004612d82565b610d5a565b34801561042f57600080fd5b506102ce610db0565b34801561044457600080fd5b506102ce610453366004612de2565b610dbf565b6102fb610466366004612c23565b610df4565b34801561047757600080fd5b5061035f610486366004612a81565b611282565b34801561049757600080fd5b506102fb6112c6565b3480156104ac57600080fd5b506102fb61130f565b3480156104c157600080fd5b5061035f6104d0366004612de2565b611409565b3480156104e157600080fd5b506102ce611420565b3480156104f657600080fd5b506102a161142f565b34801561050b57600080fd5b5061051461143e565b6040516102839190612fc9565b34801561052d57600080fd5b506102fb61053c366004612c23565b611489565b34801561054d57600080fd5b506102fb61055c366004612b88565b611796565b34801561056d57600080fd5b5061033d61057c366004612c23565b611864565b34801561058d57600080fd5b506102fb61059c366004612d33565b6118c4565b3480156105ad57600080fd5b506102fb6105bc366004612b0f565b611968565b3480156105cd57600080fd5b506102fb6105dc366004612d63565b6119a7565b3480156105ed57600080fd5b506106016105fc366004612c23565b611a1b565b6040516102839190613780565b34801561061a57600080fd5b506102a1610629366004612de2565b611afe565b34801561063a57600080fd5b506102fb610649366004612c9a565b611b32565b34801561065a57600080fd5b5061035f610669366004612c23565b611ccd565b34801561067a57600080fd5b506102a1611d89565b34801561068f57600080fd5b5061035f611e17565b3480156106a457600080fd5b506102fb6106b3366004612c58565b611e28565b3480156106c457600080fd5b506106cd611fc0565b604051610283929190612fad565b3480156106e757600080fd5b506106016106f6366004612de2565b612061565b34801561070757600080fd5b50610276610716366004612aa2565b61208b565b34801561072757600080fd5b506102fb610736366004612a81565b6120b9565b34801561074757600080fd5b5061075061211a565b6040516102839190612fff565b34801561076957600080fd5b506102fb610778366004612a81565b612123565b60006001600160e01b031982166380ac58cd60e01b14806107ae57506001600160e01b03198216635b5e139f60e01b145b806107bd57506107bd82612194565b90505b919050565b6060600080546107d49061389a565b80601f01602080910402602001604051908101604052809291908181526020018280546108009061389a565b801561084d5780601f106108225761010080835404028352916020019161084d565b820191906000526020600020905b81548152906001019060200180831161083057829003601f168201915b5050505050905090565b6000610862826121ad565b6108875760405162461bcd60e51b815260040161087e90613523565b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006108ae82610dbf565b9050806001600160a01b0316836001600160a01b031614156108e25760405162461bcd60e51b815260040161087e90613624565b806001600160a01b03166108f46121ca565b6001600160a01b031614806109105750610910816107166121ca565b61092c5760405162461bcd60e51b815260040161087e90613359565b61093683836121ce565b505050565b6109436121ca565b6001600160a01b0316610954611420565b6001600160a01b03161461097a5760405162461bcd60e51b815260040161087e906135a6565b80601183600381111561099d57634e487b7160e01b600052602160045260246000fd5b600481106109bb57634e487b7160e01b600052603260045260246000fd5b01555050565b6000600d60008460038111156109e757634e487b7160e01b600052602160045260246000fd5b6003811115610a0657634e487b7160e01b600052602160045260246000fd5b8152602080820192909252604090810160009081206001600160a01b038616825290925290205461ffff16905092915050565b600a5460036000908152600b6020527f64c15cc42be7899b001f818cf4433057002112c418d1d3a67cd5cb453051d33e549091610a8291600160301b90910461ffff1690613834565b600a546002600052600b6020527fa50eece07c7db1631545c0069bd8f5f54d5935e215d59097edf258a44ba9163454610ac791640100000000900461ffff1690613834565b600a546001600052600b6020527f72c6bfb7988af3a1efa6568f02a999bc52252641c659d85961ca3d372b57d5cf54610b0a9162010000900461ffff1690613834565b600a5460008052600b6020527fdf7de25b7f1fd6d0b5205f0e18f1f35bd7b8d84cce336588d184533ce43a6f7654610b469161ffff1690613834565b610b5091906137c0565b610b5a91906137c0565b610b6491906137c0565b905090565b610b7a610b746121ca565b8261223c565b610b965760405162461bcd60e51b815260040161087e906136a9565b6109368383836122c1565b610ba96128bb565b6040518060600160405280610bc160006103386121ca565b61ffff168152602001610bd760016103386121ca565b61ffff168152602001610bed60026103386121ca565b61ffff169052919050565b610c006121ca565b6001600160a01b0316610c11611420565b6001600160a01b031614610c375760405162461bcd60e51b815260040161087e906135a6565b60004711610c575760405162461bcd60e51b815260040161087e90613449565b610c68610c62611420565b476123ee565b565b6000600a826003811115610c8e57634e487b7160e01b600052602160045260246000fd5b60048110610cac57634e487b7160e01b600052603260045260246000fd5b601091828204019190066002029054906101000a900461ffff16600c836003811115610ce857634e487b7160e01b600052602160045260246000fd5b60048110610d0657634e487b7160e01b600052603260045260246000fd5b601091828204019190066002029054906101000a900461ffff16610d2a9190613811565b610d3590600161379a565b61ffff1692915050565b61093683838360405180602001604052806000815250611968565b610d626121ca565b6001600160a01b0316610d73611420565b6001600160a01b031614610d995760405162461bcd60e51b815260040161087e906135a6565b8051610dac9060089060208401906128d9565b5050565b6007546001600160a01b031681565b6000818152600260205260408120546001600160a01b0316806107bd5760405162461bcd60e51b815260040161087e90613400565b60155460ff1615610e0457600080fd5b6015805460ff19166001179055600260095460ff166002811115610e3857634e487b7160e01b600052602160045260246000fd5b14610e555760405162461bcd60e51b815260040161087e9061356f565b6000816003811115610e7757634e487b7160e01b600052602160045260246000fd5b905060038110610e995760405162461bcd60e51b815260040161087e90613731565b600c8160048110610eba57634e487b7160e01b600052603260045260246000fd5b601091828204019190066002029054906101000a900461ffff1661ffff16600e6000846003811115610efc57634e487b7160e01b600052602160045260246000fd5b6003811115610f1b57634e487b7160e01b600052602160045260246000fd5b8152602081019190915260400160009081205461ffff1690600b90856003811115610f5657634e487b7160e01b600052602160045260246000fd5b6003811115610f7557634e487b7160e01b600052602160045260246000fd5b815260200190815260200160002054610f8e91906137c0565b1115610fac5760405162461bcd60e51b815260040161087e90613259565b600f8160048110610fcd57634e487b7160e01b600052603260045260246000fd5b602081049091015460ff601f9092166101000a90041660106000610fef6121ca565b6001600160a01b03166001600160a01b03168152602001908152602001600020600084600381111561103157634e487b7160e01b600052602160045260246000fd5b600381111561105057634e487b7160e01b600052602160045260246000fd5b815260208101919091526040016000205460ff16106110815760405162461bcd60e51b815260040161087e906131c5565b6000601182600481106110a457634e487b7160e01b600052603260045260246000fd5b01549050803410156110c85760405162461bcd60e51b815260040161087e906134ec565b803411156110e2576110e26110dd8234613834565b61248a565b6007546110f8906001600160a01b0316826123ee565b61115a6111036121ca565b600b600086600381111561112757634e487b7160e01b600052602160045260246000fd5b600381111561114657634e487b7160e01b600052602160045260246000fd5b81526020019081526020016000205461251b565b6001600b600085600381111561118057634e487b7160e01b600052602160045260246000fd5b600381111561119f57634e487b7160e01b600052602160045260246000fd5b815260200190815260200160002060008282546111bc91906137c0565b9091555060019050601060006111d06121ca565b6001600160a01b03166001600160a01b03168152602001908152602001600020600085600381111561121257634e487b7160e01b600052602160045260246000fd5b600381111561123157634e487b7160e01b600052602160045260246000fd5b815260208101919091526040016000908120805490919061125690849060ff166137d8565b825460ff9182166101009390930a928302919092021990911617905550506015805460ff191690555050565b60006001600160a01b0382166112aa5760405162461bcd60e51b815260040161087e906133b6565b506001600160a01b031660009081526003602052604090205490565b6112ce6121ca565b6001600160a01b03166112df611420565b6001600160a01b0316146113055760405162461bcd60e51b815260040161087e906135a6565b610c6860006125fa565b6113176121ca565b6001600160a01b0316611328611420565b6001600160a01b03161461134e5760405162461bcd60e51b815260040161087e906135a6565b60155460ff161561135e57600080fd5b6015805460ff19166001179055600a54600c54600160301b9182900461ffff9081169290910416815b8181116113b15761139f6113996121ca565b8261251b565b806113a9816138f7565b915050611387565b50600c546113cb90600160301b900461ffff16600161379a565b6003600052600b60205261ffff167f64c15cc42be7899b001f818cf4433057002112c418d1d3a67cd5cb453051d33e5550506015805460ff19169055565b6011816004811061141957600080fd5b0154905081565b6006546001600160a01b031690565b6060600180546107d49061389a565b6114466128bb565b604051806060016040528061145b6000611a1b565b60ff16815260200161146d6001611a1b565b60ff16815260200161147f6002611a1b565b60ff169052919050565b60155460ff161561149957600080fd5b6015805460ff19166001179055600060095460ff1660028111156114cd57634e487b7160e01b600052602160045260246000fd5b14156114eb5760405162461bcd60e51b815260040161087e906134b5565b6000600d600083600381111561151157634e487b7160e01b600052602160045260246000fd5b600381111561153057634e487b7160e01b600052602160045260246000fd5b815260200190815260200160002060006115486121ca565b6001600160a01b0316815260208101919091526040016000205461ffff169050806115855760405162461bcd60e51b815260040161087e90613109565b60005b8161ffff168161ffff16101561161b576116096115a36121ca565b8261ffff16600b60008760038111156115cc57634e487b7160e01b600052602160045260246000fd5b60038111156115eb57634e487b7160e01b600052602160045260246000fd5b81526020019081526020016000205461160491906137c0565b61251b565b80611613816138d5565b915050611588565b5080600e600084600381111561164157634e487b7160e01b600052602160045260246000fd5b600381111561166057634e487b7160e01b600052602160045260246000fd5b815260208101919091526040016000908120805490919061168690849061ffff16613811565b92506101000a81548161ffff021916908361ffff1602179055508061ffff16600b60008460038111156116c957634e487b7160e01b600052602160045260246000fd5b60038111156116e857634e487b7160e01b600052602160045260246000fd5b8152602001908152602001600020600082825461170591906137c0565b90915550600d9050600083600381111561172f57634e487b7160e01b600052602160045260246000fd5b600381111561174e57634e487b7160e01b600052602160045260246000fd5b815260200190815260200160002060006117666121ca565b6001600160a01b031681526020810191909152604001600020805461ffff1916905550506015805460ff19169055565b61179e6121ca565b6001600160a01b0316826001600160a01b031614156117cf5760405162461bcd60e51b815260040161087e9061318e565b80600560006117dc6121ca565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff1916921515929092179091556118206121ca565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118589190612ff4565b60405180910390a35050565b6000600e600083600381111561188a57634e487b7160e01b600052602160045260246000fd5b60038111156118a957634e487b7160e01b600052602160045260246000fd5b815260208101919091526040016000205461ffff1692915050565b6118cc6121ca565b6001600160a01b03166118dd611420565b6001600160a01b0316146119035760405162461bcd60e51b815260040161087e906135a6565b80600f83600381111561192657634e487b7160e01b600052602160045260246000fd5b6004811061194457634e487b7160e01b600052603260045260246000fd5b602091828204019190066101000a81548160ff021916908360ff1602179055505050565b6119796119736121ca565b8361223c565b6119955760405162461bcd60e51b815260040161087e906136a9565b6119a18484848461264c565b50505050565b6119af6121ca565b6001600160a01b03166119c0611420565b6001600160a01b0316146119e65760405162461bcd60e51b815260040161087e906135a6565b6009805482919060ff19166001836002811115611a1357634e487b7160e01b600052602160045260246000fd5b021790555050565b600060106000611a296121ca565b6001600160a01b03166001600160a01b031681526020019081526020016000206000836003811115611a6b57634e487b7160e01b600052602160045260246000fd5b6003811115611a8a57634e487b7160e01b600052602160045260246000fd5b815260208101919091526040016000205460ff16600f836003811115611ac057634e487b7160e01b600052602160045260246000fd5b60048110611ade57634e487b7160e01b600052603260045260246000fd5b602091828204019190069054906101000a900460ff166107bd919061384b565b60606008611b0b8361267f565b604051602001611b1c929190612e76565b6040516020818303038152906040529050919050565b611b3a6121ca565b6001600160a01b0316611b4b611420565b6001600160a01b031614611b715760405162461bcd60e51b815260040161087e906135a6565b8215801590611b7f57508281145b611b9b5760405162461bcd60e51b815260040161087e90613322565b60005b61ffff8116841115611cc5576000858561ffff8416818110611bd057634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611be59190612a81565b6001600160a01b031614158015611c385750600083838361ffff16818110611c1d57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611c329190612dc8565b61ffff16115b15611cb357611cb38686868461ffff16818110611c6557634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611c7a9190612a81565b85858561ffff16818110611c9e57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906106b39190612dc8565b80611cbd816138d5565b915050611b9e565b505050505050565b6000600a826003811115611cf157634e487b7160e01b600052602160045260246000fd5b60048110611d0f57634e487b7160e01b600052603260045260246000fd5b601091828204019190066002029054906101000a900461ffff1661ffff16600b6000846003811115611d5157634e487b7160e01b600052602160045260246000fd5b6003811115611d7057634e487b7160e01b600052602160045260246000fd5b8152602001908152602001600020546107bd9190613834565b60088054611d969061389a565b80601f0160208091040260200160405190810160405280929190818152602001828054611dc29061389a565b8015611e0f5780601f10611de457610100808354040283529160200191611e0f565b820191906000526020600020905b815481529060010190602001808311611df257829003601f168201915b505050505081565b600c54600160301b900461ffff1690565b611e306121ca565b6001600160a01b0316611e41611420565b6001600160a01b031614611e675760405162461bcd60e51b815260040161087e906135a6565b6001600160a01b03821615801590611e83575060008161ffff16115b611e9f5760405162461bcd60e51b815260040161087e906136fa565b80600d6000856003811115611ec457634e487b7160e01b600052602160045260246000fd5b6003811115611ee357634e487b7160e01b600052602160045260246000fd5b8152602080820192909252604090810160009081206001600160a01b038716825290925281208054909190611f1d90849061ffff1661379a565b92506101000a81548161ffff021916908361ffff16021790555080600e6000856003811115611f5c57634e487b7160e01b600052602160045260246000fd5b6003811115611f7b57634e487b7160e01b600052602160045260246000fd5b8152602081019190915260400160009081208054909190611fa190849061ffff1661379a565b92506101000a81548161ffff021916908361ffff160217905550505050565b611fc861295d565b611fd061295d565b6040518060800160405280611fe56000611ccd565b8152602001611ff46001611ccd565b81526020016120036002611ccd565b81526020016120126003611ccd565b8152509150604051806080016040528061202c6000610c6a565b815260200161203b6001610c6a565b815260200161204a6002610c6a565b81526020016120596003610c6a565b905291929050565b600f816004811061207157600080fd5b60209182820401919006915054906101000a900460ff1681565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b6120c16121ca565b6001600160a01b03166120d2611420565b6001600160a01b0316146120f85760405162461bcd60e51b815260040161087e906135a6565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b60095460ff1681565b61212b6121ca565b6001600160a01b031661213c611420565b6001600160a01b0316146121625760405162461bcd60e51b815260040161087e906135a6565b6001600160a01b0381166121885760405162461bcd60e51b815260040161087e9061308c565b612191816125fa565b50565b6001600160e01b031981166301ffc9a760e01b14919050565b6000908152600260205260409020546001600160a01b0316151590565b3390565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061220382610dbf565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612247826121ad565b6122635760405162461bcd60e51b815260040161087e906132d6565b600061226e83610dbf565b9050806001600160a01b0316846001600160a01b031614806122a95750836001600160a01b031661229e84610857565b6001600160a01b0316145b806122b957506122b9818561208b565b949350505050565b826001600160a01b03166122d482610dbf565b6001600160a01b0316146122fa5760405162461bcd60e51b815260040161087e906135db565b6001600160a01b0382166123205760405162461bcd60e51b815260040161087e9061314a565b61232b838383610936565b6123366000826121ce565b6001600160a01b038316600090815260036020526040812080546001929061235f908490613834565b90915550506001600160a01b038216600090815260036020526040812080546001929061238d9084906137c0565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b8047101561240e5760405162461bcd60e51b815260040161087e9061329f565b6000826001600160a01b03168260405161242790612f24565b60006040518083038185875af1925050503d8060008114612464576040519150601f19603f3d011682016040523d82523d6000602084013e612469565b606091505b50509050806109365760405162461bcd60e51b815260040161087e906131fc565b60008111801561249a5750803410155b15612191576000336001600160a01b0316826040516124b890612f24565b60006040518083038185875af1925050503d80600081146124f5576040519150601f19603f3d011682016040523d82523d6000602084013e6124fa565b606091505b5050905080610dac5760405162461bcd60e51b815260040161087e90613665565b6001600160a01b0382166125415760405162461bcd60e51b815260040161087e90613480565b61254a816121ad565b156125675760405162461bcd60e51b815260040161087e906130d2565b61257360008383610936565b6001600160a01b038216600090815260036020526040812080546001929061259c9084906137c0565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6126578484846122c1565b6126638484848461279a565b6119a15760405162461bcd60e51b815260040161087e9061303a565b6060816126a457506040805180820190915260018152600360fc1b60208201526107c0565b8160005b81156126ce57806126b8816138f7565b91506126c79050600a836137fd565b91506126a8565b60008167ffffffffffffffff8111156126f757634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612721576020820181803683370190505b5090505b84156122b957612736600183613834565b9150612743600a86613912565b61274e9060306137c0565b60f81b81838151811061277157634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350612793600a866137fd565b9450612725565b60006127ae846001600160a01b03166128b5565b156128aa57836001600160a01b031663150b7a026127ca6121ca565b8786866040518563ffffffff1660e01b81526004016127ec9493929190612f3b565b602060405180830381600087803b15801561280657600080fd5b505af1925050508015612836575060408051601f3d908101601f1916820190925261283391810190612c07565b60015b612890573d808015612864576040519150601f19603f3d011682016040523d82523d6000602084013e612869565b606091505b5080516128885760405162461bcd60e51b815260040161087e9061303a565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506122b9565b506001949350505050565b3b151590565b60405180606001604052806003906020820280368337509192915050565b8280546128e59061389a565b90600052602060002090601f016020900481019282612907576000855561294d565b82601f1061292057805160ff191683800117855561294d565b8280016001018555821561294d579182015b8281111561294d578251825591602001919060010190612932565b5061295992915061297b565b5090565b60405180608001604052806004906020820280368337509192915050565b5b80821115612959576000815560010161297c565b600067ffffffffffffffff808411156129ab576129ab613952565b604051601f8501601f1916810160200182811182821017156129cf576129cf613952565b6040528481529150818385018610156129e757600080fd5b8484602083013760006020868301015250509392505050565b80356001600160a01b03811681146107c057600080fd5b60008083601f840112612a28578081fd5b50813567ffffffffffffffff811115612a3f578182fd5b6020830191508360208083028501011115612a5957600080fd5b9250929050565b8035600481106107c057600080fd5b803561ffff811681146107c057600080fd5b600060208284031215612a92578081fd5b612a9b82612a00565b9392505050565b60008060408385031215612ab4578081fd5b612abd83612a00565b9150612acb60208401612a00565b90509250929050565b600080600060608486031215612ae8578081fd5b612af184612a00565b9250612aff60208501612a00565b9150604084013590509250925092565b60008060008060808587031215612b24578081fd5b612b2d85612a00565b9350612b3b60208601612a00565b925060408501359150606085013567ffffffffffffffff811115612b5d578182fd5b8501601f81018713612b6d578182fd5b612b7c87823560208401612990565b91505092959194509250565b60008060408385031215612b9a578182fd5b612ba383612a00565b915060208301358015158114612bb7578182fd5b809150509250929050565b60008060408385031215612bd4578182fd5b612bdd83612a00565b946020939093013593505050565b600060208284031215612bfc578081fd5b8135612a9b81613968565b600060208284031215612c18578081fd5b8151612a9b81613968565b600060208284031215612c34578081fd5b612a9b82612a60565b60008060408385031215612c4f578182fd5b612abd83612a60565b600080600060608486031215612c6c578081fd5b612c7584612a60565b9250612c8360208501612a00565b9150612c9160408501612a6f565b90509250925092565b600080600080600060608688031215612cb1578283fd5b612cba86612a60565b9450602086013567ffffffffffffffff80821115612cd6578485fd5b612ce289838a01612a17565b90965094506040880135915080821115612cfa578283fd5b50612d0788828901612a17565b969995985093965092949392505050565b60008060408385031215612d2a578182fd5b612bdd83612a60565b60008060408385031215612d45578182fd5b612d4e83612a60565b9150602083013560ff81168114612bb7578182fd5b600060208284031215612d74578081fd5b813560038110612a9b578182fd5b600060208284031215612d93578081fd5b813567ffffffffffffffff811115612da9578182fd5b8201601f81018413612db9578182fd5b6122b984823560208401612990565b600060208284031215612dd9578081fd5b612a9b82612a6f565b600060208284031215612df3578081fd5b5035919050565b8060005b60048110156119a1578151845260209384019390910190600101612dfe565b60008151808452612e3581602086016020860161386e565b601f01601f19169290920160200192915050565b60008151612e5b81856020860161386e565b9290920192915050565b64173539b7b760d91b815260050190565b8254600090819060028104600180831680612e9257607f831692505b6020808410821415612eb257634e487b7160e01b87526022600452602487fd5b818015612ec65760018114612ed757612f03565b60ff19861689528489019650612f03565b612ee08b61378e565b885b86811015612efb5781548b820152908501908301612ee2565b505084890196505b505050505050612f1b612f168286612e49565b612e65565b95945050505050565b90565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612f6e90830184612e1d565b9695505050505050565b60608101818360005b6003811015612fa457815161ffff16835260209283019290910190600101612f81565b50505092915050565b6101008101612fbc8285612dfa565b612a9b6080830184612dfa565b60608101818360005b6003811015612fa457815160ff16835260209283019290910190600101612fd2565b901515815260200190565b602081016003831061302157634e487b7160e01b600052602160045260246000fd5b91905290565b600060208252612a9b6020830184612e1d565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b60208082526021908201527f59414b44414f3a204e6f2070726573616c6573206c65667420746f206d696e746040820152601760f91b606082015260800190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252601b908201527f59414b44414f3a204d696e74206c696d697420726561636865642e0000000000604082015260600190565b6020808252603a908201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260408201527f6563697069656e74206d61792068617665207265766572746564000000000000606082015260800190565b60208082526026908201527f59414b44414f3a20537570706c79206c696d6974207265616368656420666f72604082015265103a3cb8329760d11b606082015260800190565b6020808252601d908201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526018908201527f59414b44414f3a20496e76616c69642070726573616c65730000000000000000604082015260600190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b6020808252601f908201527f455243373231426173653a204e6f7468696e6720746f20776974686472617700604082015260600190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b60208082526017908201527f59414b44414f3a204d696e74696e67207061757365642e000000000000000000604082015260600190565b6020808252601a908201527f59414b44414f3a204d696e74206665652072657175697265642e000000000000604082015260600190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526019908201527f59414b44414f3a204d696e74696e67206e6f74206f70656e2e00000000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526024908201527f59414b44414f3a204661696c656420746f20726566756e64206f7665727061796040820152631b595b9d60e21b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526017908201527f59414b44414f3a20496e76616c69642070726573616c65000000000000000000604082015260600190565b6020808252601a908201527f59414b44414f3a20496e76616c696420747970652c20302d322e000000000000604082015260600190565b61ffff91909116815260200190565b90815260200190565b60ff91909116815260200190565b60009081526020902090565b600061ffff8083168185168083038211156137b7576137b7613926565b01949350505050565b600082198211156137d3576137d3613926565b500190565b600060ff821660ff84168060ff038211156137f5576137f5613926565b019392505050565b60008261380c5761380c61393c565b500490565b600061ffff8381169083168181101561382c5761382c613926565b039392505050565b60008282101561384657613846613926565b500390565b600060ff821660ff84168082101561386557613865613926565b90039392505050565b60005b83811015613889578181015183820152602001613871565b838111156119a15750506000910152565b6002810460018216806138ae57607f821691505b602082108114156138cf57634e487b7160e01b600052602260045260246000fd5b50919050565b600061ffff808316818114156138ed576138ed613926565b6001019392505050565b600060001982141561390b5761390b613926565b5060010190565b6000826139215761392161393c565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461219157600080fdfea264697066735822122002780950c1ed31565a3712f084edbc7f901e00ba217bb3fa53b91f8b595a8b4664736f6c63430008000033
Deployed Bytecode
0x6080604052600436106102515760003560e01c806395d89b4111610139578063cdedc0b5116100b6578063da8c7e6b1161007a578063da8c7e6b146106b8578063e521aa94146106db578063e985e9c5146106fb578063f0f442601461071b578063f150a0491461073b578063f2fde38b1461075d57610251565b8063cdedc0b51461062e578063d4795a4f1461064e578063d547cfb71461066e578063d5abeb0114610683578063d7d6d6661461069857610251565b8063aee0fcb6116100fd578063aee0fcb614610581578063b88d4fde146105a1578063bb0ba35d146105c1578063bd8c01c4146105e1578063c87b56dd1461060e57610251565b806395d89b41146104ea5780639d5561e1146104ff578063a0a6ee0f14610521578063a22cb46514610541578063a80be0ea1461056157610251565b80633e1dd866116101d25780636ecd2306116101965780636ecd23061461045857806370a082311461046b578063715018a61461048b578063796e60f8146104a05780638a35ace3146104b55780638da5cb5b146104d557610251565b80633e1dd866146103c357806342842e0e146103e357806355f804b31461040357806361d027b3146104235780636352211e1461043857610251565b806315da46581161021957806315da46581461031d57806318160ddd1461034a57806323b872dd1461036c57806332c21f1e1461038c5780633ccfd60b146103ae57610251565b806301ffc9a71461025657806306fdde031461028c578063081812fc146102ae578063095ea7b3146102db5780630cbb6cc7146102fd575b600080fd5b34801561026257600080fd5b50610276610271366004612beb565b61077d565b6040516102839190612ff4565b60405180910390f35b34801561029857600080fd5b506102a16107c5565b6040516102839190613027565b3480156102ba57600080fd5b506102ce6102c9366004612de2565b610857565b6040516102839190612f27565b3480156102e757600080fd5b506102fb6102f6366004612bc2565b6108a3565b005b34801561030957600080fd5b506102fb610318366004612d18565b61093b565b34801561032957600080fd5b5061033d610338366004612c3d565b6109c1565b6040516102839190613768565b34801561035657600080fd5b5061035f610a39565b6040516102839190613777565b34801561037857600080fd5b506102fb610387366004612ad4565b610b69565b34801561039857600080fd5b506103a1610ba1565b6040516102839190612f78565b3480156103ba57600080fd5b506102fb610bf8565b3480156103cf57600080fd5b5061035f6103de366004612c23565b610c6a565b3480156103ef57600080fd5b506102fb6103fe366004612ad4565b610d3f565b34801561040f57600080fd5b506102fb61041e366004612d82565b610d5a565b34801561042f57600080fd5b506102ce610db0565b34801561044457600080fd5b506102ce610453366004612de2565b610dbf565b6102fb610466366004612c23565b610df4565b34801561047757600080fd5b5061035f610486366004612a81565b611282565b34801561049757600080fd5b506102fb6112c6565b3480156104ac57600080fd5b506102fb61130f565b3480156104c157600080fd5b5061035f6104d0366004612de2565b611409565b3480156104e157600080fd5b506102ce611420565b3480156104f657600080fd5b506102a161142f565b34801561050b57600080fd5b5061051461143e565b6040516102839190612fc9565b34801561052d57600080fd5b506102fb61053c366004612c23565b611489565b34801561054d57600080fd5b506102fb61055c366004612b88565b611796565b34801561056d57600080fd5b5061033d61057c366004612c23565b611864565b34801561058d57600080fd5b506102fb61059c366004612d33565b6118c4565b3480156105ad57600080fd5b506102fb6105bc366004612b0f565b611968565b3480156105cd57600080fd5b506102fb6105dc366004612d63565b6119a7565b3480156105ed57600080fd5b506106016105fc366004612c23565b611a1b565b6040516102839190613780565b34801561061a57600080fd5b506102a1610629366004612de2565b611afe565b34801561063a57600080fd5b506102fb610649366004612c9a565b611b32565b34801561065a57600080fd5b5061035f610669366004612c23565b611ccd565b34801561067a57600080fd5b506102a1611d89565b34801561068f57600080fd5b5061035f611e17565b3480156106a457600080fd5b506102fb6106b3366004612c58565b611e28565b3480156106c457600080fd5b506106cd611fc0565b604051610283929190612fad565b3480156106e757600080fd5b506106016106f6366004612de2565b612061565b34801561070757600080fd5b50610276610716366004612aa2565b61208b565b34801561072757600080fd5b506102fb610736366004612a81565b6120b9565b34801561074757600080fd5b5061075061211a565b6040516102839190612fff565b34801561076957600080fd5b506102fb610778366004612a81565b612123565b60006001600160e01b031982166380ac58cd60e01b14806107ae57506001600160e01b03198216635b5e139f60e01b145b806107bd57506107bd82612194565b90505b919050565b6060600080546107d49061389a565b80601f01602080910402602001604051908101604052809291908181526020018280546108009061389a565b801561084d5780601f106108225761010080835404028352916020019161084d565b820191906000526020600020905b81548152906001019060200180831161083057829003601f168201915b5050505050905090565b6000610862826121ad565b6108875760405162461bcd60e51b815260040161087e90613523565b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006108ae82610dbf565b9050806001600160a01b0316836001600160a01b031614156108e25760405162461bcd60e51b815260040161087e90613624565b806001600160a01b03166108f46121ca565b6001600160a01b031614806109105750610910816107166121ca565b61092c5760405162461bcd60e51b815260040161087e90613359565b61093683836121ce565b505050565b6109436121ca565b6001600160a01b0316610954611420565b6001600160a01b03161461097a5760405162461bcd60e51b815260040161087e906135a6565b80601183600381111561099d57634e487b7160e01b600052602160045260246000fd5b600481106109bb57634e487b7160e01b600052603260045260246000fd5b01555050565b6000600d60008460038111156109e757634e487b7160e01b600052602160045260246000fd5b6003811115610a0657634e487b7160e01b600052602160045260246000fd5b8152602080820192909252604090810160009081206001600160a01b038616825290925290205461ffff16905092915050565b600a5460036000908152600b6020527f64c15cc42be7899b001f818cf4433057002112c418d1d3a67cd5cb453051d33e549091610a8291600160301b90910461ffff1690613834565b600a546002600052600b6020527fa50eece07c7db1631545c0069bd8f5f54d5935e215d59097edf258a44ba9163454610ac791640100000000900461ffff1690613834565b600a546001600052600b6020527f72c6bfb7988af3a1efa6568f02a999bc52252641c659d85961ca3d372b57d5cf54610b0a9162010000900461ffff1690613834565b600a5460008052600b6020527fdf7de25b7f1fd6d0b5205f0e18f1f35bd7b8d84cce336588d184533ce43a6f7654610b469161ffff1690613834565b610b5091906137c0565b610b5a91906137c0565b610b6491906137c0565b905090565b610b7a610b746121ca565b8261223c565b610b965760405162461bcd60e51b815260040161087e906136a9565b6109368383836122c1565b610ba96128bb565b6040518060600160405280610bc160006103386121ca565b61ffff168152602001610bd760016103386121ca565b61ffff168152602001610bed60026103386121ca565b61ffff169052919050565b610c006121ca565b6001600160a01b0316610c11611420565b6001600160a01b031614610c375760405162461bcd60e51b815260040161087e906135a6565b60004711610c575760405162461bcd60e51b815260040161087e90613449565b610c68610c62611420565b476123ee565b565b6000600a826003811115610c8e57634e487b7160e01b600052602160045260246000fd5b60048110610cac57634e487b7160e01b600052603260045260246000fd5b601091828204019190066002029054906101000a900461ffff16600c836003811115610ce857634e487b7160e01b600052602160045260246000fd5b60048110610d0657634e487b7160e01b600052603260045260246000fd5b601091828204019190066002029054906101000a900461ffff16610d2a9190613811565b610d3590600161379a565b61ffff1692915050565b61093683838360405180602001604052806000815250611968565b610d626121ca565b6001600160a01b0316610d73611420565b6001600160a01b031614610d995760405162461bcd60e51b815260040161087e906135a6565b8051610dac9060089060208401906128d9565b5050565b6007546001600160a01b031681565b6000818152600260205260408120546001600160a01b0316806107bd5760405162461bcd60e51b815260040161087e90613400565b60155460ff1615610e0457600080fd5b6015805460ff19166001179055600260095460ff166002811115610e3857634e487b7160e01b600052602160045260246000fd5b14610e555760405162461bcd60e51b815260040161087e9061356f565b6000816003811115610e7757634e487b7160e01b600052602160045260246000fd5b905060038110610e995760405162461bcd60e51b815260040161087e90613731565b600c8160048110610eba57634e487b7160e01b600052603260045260246000fd5b601091828204019190066002029054906101000a900461ffff1661ffff16600e6000846003811115610efc57634e487b7160e01b600052602160045260246000fd5b6003811115610f1b57634e487b7160e01b600052602160045260246000fd5b8152602081019190915260400160009081205461ffff1690600b90856003811115610f5657634e487b7160e01b600052602160045260246000fd5b6003811115610f7557634e487b7160e01b600052602160045260246000fd5b815260200190815260200160002054610f8e91906137c0565b1115610fac5760405162461bcd60e51b815260040161087e90613259565b600f8160048110610fcd57634e487b7160e01b600052603260045260246000fd5b602081049091015460ff601f9092166101000a90041660106000610fef6121ca565b6001600160a01b03166001600160a01b03168152602001908152602001600020600084600381111561103157634e487b7160e01b600052602160045260246000fd5b600381111561105057634e487b7160e01b600052602160045260246000fd5b815260208101919091526040016000205460ff16106110815760405162461bcd60e51b815260040161087e906131c5565b6000601182600481106110a457634e487b7160e01b600052603260045260246000fd5b01549050803410156110c85760405162461bcd60e51b815260040161087e906134ec565b803411156110e2576110e26110dd8234613834565b61248a565b6007546110f8906001600160a01b0316826123ee565b61115a6111036121ca565b600b600086600381111561112757634e487b7160e01b600052602160045260246000fd5b600381111561114657634e487b7160e01b600052602160045260246000fd5b81526020019081526020016000205461251b565b6001600b600085600381111561118057634e487b7160e01b600052602160045260246000fd5b600381111561119f57634e487b7160e01b600052602160045260246000fd5b815260200190815260200160002060008282546111bc91906137c0565b9091555060019050601060006111d06121ca565b6001600160a01b03166001600160a01b03168152602001908152602001600020600085600381111561121257634e487b7160e01b600052602160045260246000fd5b600381111561123157634e487b7160e01b600052602160045260246000fd5b815260208101919091526040016000908120805490919061125690849060ff166137d8565b825460ff9182166101009390930a928302919092021990911617905550506015805460ff191690555050565b60006001600160a01b0382166112aa5760405162461bcd60e51b815260040161087e906133b6565b506001600160a01b031660009081526003602052604090205490565b6112ce6121ca565b6001600160a01b03166112df611420565b6001600160a01b0316146113055760405162461bcd60e51b815260040161087e906135a6565b610c6860006125fa565b6113176121ca565b6001600160a01b0316611328611420565b6001600160a01b03161461134e5760405162461bcd60e51b815260040161087e906135a6565b60155460ff161561135e57600080fd5b6015805460ff19166001179055600a54600c54600160301b9182900461ffff9081169290910416815b8181116113b15761139f6113996121ca565b8261251b565b806113a9816138f7565b915050611387565b50600c546113cb90600160301b900461ffff16600161379a565b6003600052600b60205261ffff167f64c15cc42be7899b001f818cf4433057002112c418d1d3a67cd5cb453051d33e5550506015805460ff19169055565b6011816004811061141957600080fd5b0154905081565b6006546001600160a01b031690565b6060600180546107d49061389a565b6114466128bb565b604051806060016040528061145b6000611a1b565b60ff16815260200161146d6001611a1b565b60ff16815260200161147f6002611a1b565b60ff169052919050565b60155460ff161561149957600080fd5b6015805460ff19166001179055600060095460ff1660028111156114cd57634e487b7160e01b600052602160045260246000fd5b14156114eb5760405162461bcd60e51b815260040161087e906134b5565b6000600d600083600381111561151157634e487b7160e01b600052602160045260246000fd5b600381111561153057634e487b7160e01b600052602160045260246000fd5b815260200190815260200160002060006115486121ca565b6001600160a01b0316815260208101919091526040016000205461ffff169050806115855760405162461bcd60e51b815260040161087e90613109565b60005b8161ffff168161ffff16101561161b576116096115a36121ca565b8261ffff16600b60008760038111156115cc57634e487b7160e01b600052602160045260246000fd5b60038111156115eb57634e487b7160e01b600052602160045260246000fd5b81526020019081526020016000205461160491906137c0565b61251b565b80611613816138d5565b915050611588565b5080600e600084600381111561164157634e487b7160e01b600052602160045260246000fd5b600381111561166057634e487b7160e01b600052602160045260246000fd5b815260208101919091526040016000908120805490919061168690849061ffff16613811565b92506101000a81548161ffff021916908361ffff1602179055508061ffff16600b60008460038111156116c957634e487b7160e01b600052602160045260246000fd5b60038111156116e857634e487b7160e01b600052602160045260246000fd5b8152602001908152602001600020600082825461170591906137c0565b90915550600d9050600083600381111561172f57634e487b7160e01b600052602160045260246000fd5b600381111561174e57634e487b7160e01b600052602160045260246000fd5b815260200190815260200160002060006117666121ca565b6001600160a01b031681526020810191909152604001600020805461ffff1916905550506015805460ff19169055565b61179e6121ca565b6001600160a01b0316826001600160a01b031614156117cf5760405162461bcd60e51b815260040161087e9061318e565b80600560006117dc6121ca565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff1916921515929092179091556118206121ca565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118589190612ff4565b60405180910390a35050565b6000600e600083600381111561188a57634e487b7160e01b600052602160045260246000fd5b60038111156118a957634e487b7160e01b600052602160045260246000fd5b815260208101919091526040016000205461ffff1692915050565b6118cc6121ca565b6001600160a01b03166118dd611420565b6001600160a01b0316146119035760405162461bcd60e51b815260040161087e906135a6565b80600f83600381111561192657634e487b7160e01b600052602160045260246000fd5b6004811061194457634e487b7160e01b600052603260045260246000fd5b602091828204019190066101000a81548160ff021916908360ff1602179055505050565b6119796119736121ca565b8361223c565b6119955760405162461bcd60e51b815260040161087e906136a9565b6119a18484848461264c565b50505050565b6119af6121ca565b6001600160a01b03166119c0611420565b6001600160a01b0316146119e65760405162461bcd60e51b815260040161087e906135a6565b6009805482919060ff19166001836002811115611a1357634e487b7160e01b600052602160045260246000fd5b021790555050565b600060106000611a296121ca565b6001600160a01b03166001600160a01b031681526020019081526020016000206000836003811115611a6b57634e487b7160e01b600052602160045260246000fd5b6003811115611a8a57634e487b7160e01b600052602160045260246000fd5b815260208101919091526040016000205460ff16600f836003811115611ac057634e487b7160e01b600052602160045260246000fd5b60048110611ade57634e487b7160e01b600052603260045260246000fd5b602091828204019190069054906101000a900460ff166107bd919061384b565b60606008611b0b8361267f565b604051602001611b1c929190612e76565b6040516020818303038152906040529050919050565b611b3a6121ca565b6001600160a01b0316611b4b611420565b6001600160a01b031614611b715760405162461bcd60e51b815260040161087e906135a6565b8215801590611b7f57508281145b611b9b5760405162461bcd60e51b815260040161087e90613322565b60005b61ffff8116841115611cc5576000858561ffff8416818110611bd057634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611be59190612a81565b6001600160a01b031614158015611c385750600083838361ffff16818110611c1d57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611c329190612dc8565b61ffff16115b15611cb357611cb38686868461ffff16818110611c6557634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611c7a9190612a81565b85858561ffff16818110611c9e57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906106b39190612dc8565b80611cbd816138d5565b915050611b9e565b505050505050565b6000600a826003811115611cf157634e487b7160e01b600052602160045260246000fd5b60048110611d0f57634e487b7160e01b600052603260045260246000fd5b601091828204019190066002029054906101000a900461ffff1661ffff16600b6000846003811115611d5157634e487b7160e01b600052602160045260246000fd5b6003811115611d7057634e487b7160e01b600052602160045260246000fd5b8152602001908152602001600020546107bd9190613834565b60088054611d969061389a565b80601f0160208091040260200160405190810160405280929190818152602001828054611dc29061389a565b8015611e0f5780601f10611de457610100808354040283529160200191611e0f565b820191906000526020600020905b815481529060010190602001808311611df257829003601f168201915b505050505081565b600c54600160301b900461ffff1690565b611e306121ca565b6001600160a01b0316611e41611420565b6001600160a01b031614611e675760405162461bcd60e51b815260040161087e906135a6565b6001600160a01b03821615801590611e83575060008161ffff16115b611e9f5760405162461bcd60e51b815260040161087e906136fa565b80600d6000856003811115611ec457634e487b7160e01b600052602160045260246000fd5b6003811115611ee357634e487b7160e01b600052602160045260246000fd5b8152602080820192909252604090810160009081206001600160a01b038716825290925281208054909190611f1d90849061ffff1661379a565b92506101000a81548161ffff021916908361ffff16021790555080600e6000856003811115611f5c57634e487b7160e01b600052602160045260246000fd5b6003811115611f7b57634e487b7160e01b600052602160045260246000fd5b8152602081019190915260400160009081208054909190611fa190849061ffff1661379a565b92506101000a81548161ffff021916908361ffff160217905550505050565b611fc861295d565b611fd061295d565b6040518060800160405280611fe56000611ccd565b8152602001611ff46001611ccd565b81526020016120036002611ccd565b81526020016120126003611ccd565b8152509150604051806080016040528061202c6000610c6a565b815260200161203b6001610c6a565b815260200161204a6002610c6a565b81526020016120596003610c6a565b905291929050565b600f816004811061207157600080fd5b60209182820401919006915054906101000a900460ff1681565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b6120c16121ca565b6001600160a01b03166120d2611420565b6001600160a01b0316146120f85760405162461bcd60e51b815260040161087e906135a6565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b60095460ff1681565b61212b6121ca565b6001600160a01b031661213c611420565b6001600160a01b0316146121625760405162461bcd60e51b815260040161087e906135a6565b6001600160a01b0381166121885760405162461bcd60e51b815260040161087e9061308c565b612191816125fa565b50565b6001600160e01b031981166301ffc9a760e01b14919050565b6000908152600260205260409020546001600160a01b0316151590565b3390565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061220382610dbf565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612247826121ad565b6122635760405162461bcd60e51b815260040161087e906132d6565b600061226e83610dbf565b9050806001600160a01b0316846001600160a01b031614806122a95750836001600160a01b031661229e84610857565b6001600160a01b0316145b806122b957506122b9818561208b565b949350505050565b826001600160a01b03166122d482610dbf565b6001600160a01b0316146122fa5760405162461bcd60e51b815260040161087e906135db565b6001600160a01b0382166123205760405162461bcd60e51b815260040161087e9061314a565b61232b838383610936565b6123366000826121ce565b6001600160a01b038316600090815260036020526040812080546001929061235f908490613834565b90915550506001600160a01b038216600090815260036020526040812080546001929061238d9084906137c0565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b8047101561240e5760405162461bcd60e51b815260040161087e9061329f565b6000826001600160a01b03168260405161242790612f24565b60006040518083038185875af1925050503d8060008114612464576040519150601f19603f3d011682016040523d82523d6000602084013e612469565b606091505b50509050806109365760405162461bcd60e51b815260040161087e906131fc565b60008111801561249a5750803410155b15612191576000336001600160a01b0316826040516124b890612f24565b60006040518083038185875af1925050503d80600081146124f5576040519150601f19603f3d011682016040523d82523d6000602084013e6124fa565b606091505b5050905080610dac5760405162461bcd60e51b815260040161087e90613665565b6001600160a01b0382166125415760405162461bcd60e51b815260040161087e90613480565b61254a816121ad565b156125675760405162461bcd60e51b815260040161087e906130d2565b61257360008383610936565b6001600160a01b038216600090815260036020526040812080546001929061259c9084906137c0565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6126578484846122c1565b6126638484848461279a565b6119a15760405162461bcd60e51b815260040161087e9061303a565b6060816126a457506040805180820190915260018152600360fc1b60208201526107c0565b8160005b81156126ce57806126b8816138f7565b91506126c79050600a836137fd565b91506126a8565b60008167ffffffffffffffff8111156126f757634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612721576020820181803683370190505b5090505b84156122b957612736600183613834565b9150612743600a86613912565b61274e9060306137c0565b60f81b81838151811061277157634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350612793600a866137fd565b9450612725565b60006127ae846001600160a01b03166128b5565b156128aa57836001600160a01b031663150b7a026127ca6121ca565b8786866040518563ffffffff1660e01b81526004016127ec9493929190612f3b565b602060405180830381600087803b15801561280657600080fd5b505af1925050508015612836575060408051601f3d908101601f1916820190925261283391810190612c07565b60015b612890573d808015612864576040519150601f19603f3d011682016040523d82523d6000602084013e612869565b606091505b5080516128885760405162461bcd60e51b815260040161087e9061303a565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506122b9565b506001949350505050565b3b151590565b60405180606001604052806003906020820280368337509192915050565b8280546128e59061389a565b90600052602060002090601f016020900481019282612907576000855561294d565b82601f1061292057805160ff191683800117855561294d565b8280016001018555821561294d579182015b8281111561294d578251825591602001919060010190612932565b5061295992915061297b565b5090565b60405180608001604052806004906020820280368337509192915050565b5b80821115612959576000815560010161297c565b600067ffffffffffffffff808411156129ab576129ab613952565b604051601f8501601f1916810160200182811182821017156129cf576129cf613952565b6040528481529150818385018610156129e757600080fd5b8484602083013760006020868301015250509392505050565b80356001600160a01b03811681146107c057600080fd5b60008083601f840112612a28578081fd5b50813567ffffffffffffffff811115612a3f578182fd5b6020830191508360208083028501011115612a5957600080fd5b9250929050565b8035600481106107c057600080fd5b803561ffff811681146107c057600080fd5b600060208284031215612a92578081fd5b612a9b82612a00565b9392505050565b60008060408385031215612ab4578081fd5b612abd83612a00565b9150612acb60208401612a00565b90509250929050565b600080600060608486031215612ae8578081fd5b612af184612a00565b9250612aff60208501612a00565b9150604084013590509250925092565b60008060008060808587031215612b24578081fd5b612b2d85612a00565b9350612b3b60208601612a00565b925060408501359150606085013567ffffffffffffffff811115612b5d578182fd5b8501601f81018713612b6d578182fd5b612b7c87823560208401612990565b91505092959194509250565b60008060408385031215612b9a578182fd5b612ba383612a00565b915060208301358015158114612bb7578182fd5b809150509250929050565b60008060408385031215612bd4578182fd5b612bdd83612a00565b946020939093013593505050565b600060208284031215612bfc578081fd5b8135612a9b81613968565b600060208284031215612c18578081fd5b8151612a9b81613968565b600060208284031215612c34578081fd5b612a9b82612a60565b60008060408385031215612c4f578182fd5b612abd83612a60565b600080600060608486031215612c6c578081fd5b612c7584612a60565b9250612c8360208501612a00565b9150612c9160408501612a6f565b90509250925092565b600080600080600060608688031215612cb1578283fd5b612cba86612a60565b9450602086013567ffffffffffffffff80821115612cd6578485fd5b612ce289838a01612a17565b90965094506040880135915080821115612cfa578283fd5b50612d0788828901612a17565b969995985093965092949392505050565b60008060408385031215612d2a578182fd5b612bdd83612a60565b60008060408385031215612d45578182fd5b612d4e83612a60565b9150602083013560ff81168114612bb7578182fd5b600060208284031215612d74578081fd5b813560038110612a9b578182fd5b600060208284031215612d93578081fd5b813567ffffffffffffffff811115612da9578182fd5b8201601f81018413612db9578182fd5b6122b984823560208401612990565b600060208284031215612dd9578081fd5b612a9b82612a6f565b600060208284031215612df3578081fd5b5035919050565b8060005b60048110156119a1578151845260209384019390910190600101612dfe565b60008151808452612e3581602086016020860161386e565b601f01601f19169290920160200192915050565b60008151612e5b81856020860161386e565b9290920192915050565b64173539b7b760d91b815260050190565b8254600090819060028104600180831680612e9257607f831692505b6020808410821415612eb257634e487b7160e01b87526022600452602487fd5b818015612ec65760018114612ed757612f03565b60ff19861689528489019650612f03565b612ee08b61378e565b885b86811015612efb5781548b820152908501908301612ee2565b505084890196505b505050505050612f1b612f168286612e49565b612e65565b95945050505050565b90565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612f6e90830184612e1d565b9695505050505050565b60608101818360005b6003811015612fa457815161ffff16835260209283019290910190600101612f81565b50505092915050565b6101008101612fbc8285612dfa565b612a9b6080830184612dfa565b60608101818360005b6003811015612fa457815160ff16835260209283019290910190600101612fd2565b901515815260200190565b602081016003831061302157634e487b7160e01b600052602160045260246000fd5b91905290565b600060208252612a9b6020830184612e1d565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b60208082526021908201527f59414b44414f3a204e6f2070726573616c6573206c65667420746f206d696e746040820152601760f91b606082015260800190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252601b908201527f59414b44414f3a204d696e74206c696d697420726561636865642e0000000000604082015260600190565b6020808252603a908201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260408201527f6563697069656e74206d61792068617665207265766572746564000000000000606082015260800190565b60208082526026908201527f59414b44414f3a20537570706c79206c696d6974207265616368656420666f72604082015265103a3cb8329760d11b606082015260800190565b6020808252601d908201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526018908201527f59414b44414f3a20496e76616c69642070726573616c65730000000000000000604082015260600190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b6020808252601f908201527f455243373231426173653a204e6f7468696e6720746f20776974686472617700604082015260600190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b60208082526017908201527f59414b44414f3a204d696e74696e67207061757365642e000000000000000000604082015260600190565b6020808252601a908201527f59414b44414f3a204d696e74206665652072657175697265642e000000000000604082015260600190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526019908201527f59414b44414f3a204d696e74696e67206e6f74206f70656e2e00000000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526024908201527f59414b44414f3a204661696c656420746f20726566756e64206f7665727061796040820152631b595b9d60e21b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526017908201527f59414b44414f3a20496e76616c69642070726573616c65000000000000000000604082015260600190565b6020808252601a908201527f59414b44414f3a20496e76616c696420747970652c20302d322e000000000000604082015260600190565b61ffff91909116815260200190565b90815260200190565b60ff91909116815260200190565b60009081526020902090565b600061ffff8083168185168083038211156137b7576137b7613926565b01949350505050565b600082198211156137d3576137d3613926565b500190565b600060ff821660ff84168060ff038211156137f5576137f5613926565b019392505050565b60008261380c5761380c61393c565b500490565b600061ffff8381169083168181101561382c5761382c613926565b039392505050565b60008282101561384657613846613926565b500390565b600060ff821660ff84168082101561386557613865613926565b90039392505050565b60005b83811015613889578181015183820152602001613871565b838111156119a15750506000910152565b6002810460018216806138ae57607f821691505b602082108114156138cf57634e487b7160e01b600052602260045260246000fd5b50919050565b600061ffff808316818114156138ed576138ed613926565b6001019392505050565b600060001982141561390b5761390b613926565b5060010190565b6000826139215761392161393c565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461219157600080fdfea264697066735822122002780950c1ed31565a3712f084edbc7f901e00ba217bb3fa53b91f8b595a8b4664736f6c63430008000033
Deployed Bytecode Sourcemap
34598:9646:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20206:305;;;;;;;;;;-1:-1:-1;20206:305:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21151:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;22710:221::-;;;;;;;;;;-1:-1:-1;22710:221:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;22233:411::-;;;;;;;;;;-1:-1:-1;22233:411:0;;;;;:::i;:::-;;:::i;:::-;;37402:148;;;;;;;;;;-1:-1:-1;37402:148:0;;;;;:::i;:::-;;:::i;40272:161::-;;;;;;;;;;-1:-1:-1;40272:161:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;41099:358::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;23600:339::-;;;;;;;;;;-1:-1:-1;23600:339:0;;;;;:::i;:::-;;:::i;40504:301::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;43639:200::-;;;;;;;;;;;;;:::i;41951:160::-;;;;;;;;;;-1:-1:-1;41951:160:0;;;;;:::i;:::-;;:::i;24010:185::-;;;;;;;;;;-1:-1:-1;24010:185:0;;;;;:::i;:::-;;:::i;37879:131::-;;;;;;;;;;-1:-1:-1;37879:131:0;;;;;:::i;:::-;;:::i;34679:23::-;;;;;;;;;;;;;:::i;20845:239::-;;;;;;;;;;-1:-1:-1;20845:239:0;;;;;:::i;:::-;;:::i;38247:928::-;;;;;;:::i;:::-;;:::i;20575:208::-;;;;;;;;;;-1:-1:-1;20575:208:0;;;;;:::i;:::-;;:::i;33894:94::-;;;;;;;;;;;;;:::i;39827:358::-;;;;;;;;;;;;;:::i;35285:65::-;;;;;;;;;;-1:-1:-1;35285:65:0;;;;;:::i;:::-;;:::i;33243:87::-;;;;;;;;;;;;;:::i;21320:104::-;;;;;;;;;;;;;:::i;43013:246::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;39241:520::-;;;;;;;;;;-1:-1:-1;39241:520:0;;;;;:::i;:::-;;:::i;23003:295::-;;;;;;;;;;-1:-1:-1;23003:295:0;;;;;:::i;:::-;;:::i;40884:126::-;;;;;;;;;;-1:-1:-1;40884:126:0;;;;;:::i;:::-;;:::i;37659:146::-;;;;;;;;;;-1:-1:-1;37659:146:0;;;;;:::i;:::-;;:::i;24266:328::-;;;;;;;;;;-1:-1:-1;24266:328:0;;;;;:::i;:::-;;:::i;37227:108::-;;;;;;;;;;-1:-1:-1;37227:108:0;;;;;:::i;:::-;;:::i;42777:166::-;;;;;;;;;;-1:-1:-1;42777:166:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;43325:239::-;;;;;;;;;;-1:-1:-1;43325:239:0;;;;;:::i;:::-;;:::i;36449:459::-;;;;;;;;;;-1:-1:-1;36449:459:0;;;;;:::i;:::-;;:::i;41534:147::-;;;;;;;;;;-1:-1:-1;41534:147:0;;;;;:::i;:::-;;:::i;34709:26::-;;;;;;;;;;;;;:::i;41756:113::-;;;;;;;;;;;;;:::i;36043:298::-;;;;;;;;;;-1:-1:-1;36043:298:0;;;;;:::i;:::-;;:::i;42176:519::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;35168:40::-;;;;;;;;;;-1:-1:-1;35168:40:0;;;;;:::i;:::-;;:::i;23369:164::-;;;;;;;;;;-1:-1:-1;23369:164:0;;;;;:::i;:::-;;:::i;37000:112::-;;;;;;;;;;-1:-1:-1;37000:112:0;;;;;:::i;:::-;;:::i;34786:37::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;34143:192::-;;;;;;;;;;-1:-1:-1;34143:192:0;;;;;:::i;:::-;;:::i;20206:305::-;20308:4;-1:-1:-1;;;;;;20345:40:0;;-1:-1:-1;;;20345:40:0;;:105;;-1:-1:-1;;;;;;;20402:48:0;;-1:-1:-1;;;20402:48:0;20345:105;:158;;;;20467:36;20491:11;20467:23;:36::i;:::-;20325:178;;20206:305;;;;:::o;21151:100::-;21205:13;21238:5;21231:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21151:100;:::o;22710:221::-;22786:7;22814:16;22822:7;22814;:16::i;:::-;22806:73;;;;-1:-1:-1;;;22806:73:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;22899:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;22899:24:0;;22710:221::o;22233:411::-;22314:13;22330:23;22345:7;22330:14;:23::i;:::-;22314:39;;22378:5;-1:-1:-1;;;;;22372:11:0;:2;-1:-1:-1;;;;;22372:11:0;;;22364:57;;;;-1:-1:-1;;;22364:57:0;;;;;;;:::i;:::-;22472:5;-1:-1:-1;;;;;22456:21:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;22456:21:0;;:62;;;;22481:37;22498:5;22505:12;:10;:12::i;22481:37::-;22434:168;;;;-1:-1:-1;;;22434:168:0;;;;;;;:::i;:::-;22615:21;22624:2;22628:7;22615:8;:21::i;:::-;22233:411;;;:::o;37402:148::-;33474:12;:10;:12::i;:::-;-1:-1:-1;;;;;33463:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;33463:23:0;;33455:68;;;;-1:-1:-1;;;33455:68:0;;;;;;;:::i;:::-;37534:8:::1;37508:7;37524:5;37516:14;;;;;;-1:-1:-1::0;;;37516:14:0::1;;;;;;;;;37508:23;;;;;-1:-1:-1::0;;;37508:23:0::1;;;;;;;;;;:34:::0;-1:-1:-1;;37402:148:0:o;40272:161::-;40375:6;40401:7;:14;40409:5;40401:14;;;;;;-1:-1:-1;;;40401:14:0;;;;;;;;;;;;;;;-1:-1:-1;;;40401:14:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40401:14:0;;;-1:-1:-1;;;;;40401:24:0;;;;;;;;;;;;;-1:-1:-1;40272:161:0;;;;:::o;41099:358::-;41420:5;:28;41434:12;41151:7;41398:19;;;:5;:19;;;;41151:7;;41398:50;;-1:-1:-1;;;41420:28:0;;;;;;41398:50;:::i;:::-;41355:5;:24;41369:8;41355:24;41337:15;:5;:15;;;;:42;;41355:24;;;;;;41337:42;:::i;:::-;41289:5;:29;41303:13;41289:29;41266:20;:5;:20;;;;:52;;41289:29;;;;;;41266:52;:::i;:::-;41217:5;:30;41231:14;41193:21;;:5;:21;;;;:54;;41217:30;;;41193:54;:::i;:::-;41192:127;;;;:::i;:::-;:188;;;;:::i;:::-;:257;;;;:::i;:::-;41171:278;;41099:358;:::o;23600:339::-;23795:41;23814:12;:10;:12::i;:::-;23828:7;23795:18;:41::i;:::-;23787:103;;;;-1:-1:-1;;;23787:103:0;;;;;;;:::i;:::-;23903:28;23913:4;23919:2;23923:7;23903:9;:28::i;40504:301::-;40563:24;;:::i;:::-;40600:197;;;;;;;;40625:46;40642:14;40658:12;:10;:12::i;40625:46::-;40600:197;;;;;;40686:45;40703:13;40718:12;:10;:12::i;40686:45::-;40600:197;;;;;;40746:40;40763:8;40773:12;:10;:12::i;40746:40::-;40600:197;;;;;40504:301;-1:-1:-1;40504:301:0:o;43639:200::-;33474:12;:10;:12::i;:::-;-1:-1:-1;;;;;33463:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;33463:23:0;;33455:68;;;;-1:-1:-1;;;33455:68:0;;;;;;;:::i;:::-;43725:1:::1;43701:21;:25;43693:69;;;;-1:-1:-1::0;;;43693:69:0::1;;;;;;;:::i;:::-;43773:58;43799:7;:5;:7::i;:::-;43809:21;43773:17;:58::i;:::-;43639:200::o:0;41951:160::-;42025:7;42078:5;42092;42084:14;;;;;;-1:-1:-1;;;42084:14:0;;;;;;;;;42078:21;;;;;-1:-1:-1;;;42078:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42052:7;42068:5;42060:14;;;;;;-1:-1:-1;;;42060:14:0;;;;;;;;;42052:23;;;;;-1:-1:-1;;;42052:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:47;;;;:::i;:::-;:51;;42102:1;42052:51;:::i;:::-;42045:58;;;41951:160;-1:-1:-1;;41951:160:0:o;24010:185::-;24148:39;24165:4;24171:2;24175:7;24148:39;;;;;;;;;;;;:16;:39::i;37879:131::-;33474:12;:10;:12::i;:::-;-1:-1:-1;;;;;33463:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;33463:23:0;;33455:68;;;;-1:-1:-1;;;33455:68:0;;;;;;;:::i;:::-;37974:28;;::::1;::::0;:12:::1;::::0;:28:::1;::::0;::::1;::::0;::::1;:::i;:::-;;37879:131:::0;:::o;34679:23::-;;;-1:-1:-1;;;;;34679:23:0;;:::o;20845:239::-;20917:7;20953:16;;;:7;:16;;;;;;-1:-1:-1;;;;;20953:16:0;20988:19;20980:73;;;;-1:-1:-1;;;20980:73:0;;;;;;;:::i;38247:928::-;35441:14;;;;35437:55;;;35472:8;;;35437:55;35502:14;:21;;-1:-1:-1;;35502:21:0;35519:4;35502:21;;;38355:10:::1;38342:9;::::0;::::1;;:23;::::0;::::1;;;;-1:-1:-1::0;;;38342:23:0::1;;;;;;;;;;38334:61;;;;-1:-1:-1::0;;;38334:61:0::1;;;;;;;:::i;:::-;38406:13;38430:5;38422:14;;;;;;-1:-1:-1::0;;;38422:14:0::1;;;;;;;;;38406:30;;38463:1;38455:5;:9;38447:48;;;;-1:-1:-1::0;;;38447:48:0::1;;;;;;;:::i;:::-;38587:7;38595:5;38587:14;;;;;-1:-1:-1::0;;;38587:14:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38550:51;;38565:11;:18;38577:5;38565:18;;;;;;-1:-1:-1::0;;;38565:18:0::1;;;;;;;;;;;;;;;-1:-1:-1::0;;;38565:18:0::1;;;;;;;;;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;38565:18:0;;;;::::1;;::::0;38550:5:::1;::::0;38556;38550:12:::1;::::0;::::1;;;;-1:-1:-1::0;;;38550:12:0::1;;;;;;;;;;;;;;;-1:-1:-1::0;;;38550:12:0::1;;;;;;;;;;;;;;;;;;;;;:33;;;;:::i;:::-;:51;;38506:161;;;;-1:-1:-1::0;;;38506:161:0::1;;;;;;;:::i;:::-;38719:9;38729:5;38719:16;;;;;-1:-1:-1::0;;;38719:16:0::1;;;;;;;;;;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;;;::::1;;::::0;::::1;;38686:9;:23;38696:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;38686:23:0::1;-1:-1:-1::0;;;;;38686:23:0::1;;;;;;;;;;;;:30;38710:5;38686:30;;;;;;-1:-1:-1::0;;;38686:30:0::1;;;;;;;;;;;;;;;-1:-1:-1::0;;;38686:30:0::1;;;;;;;;;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;38686:30:0;;::::1;;:49;38678:89;;;;-1:-1:-1::0;;;38678:89:0::1;;;;;;;:::i;:::-;38780:16;38799:7;38807:5;38799:14;;;;;-1:-1:-1::0;;;38799:14:0::1;;;;;;;;;;;38780:33;;38845:8;38832:9;:21;;38824:60;;;;-1:-1:-1::0;;;38824:60:0::1;;;;;;;:::i;:::-;38911:8;38899:9;:20;38895:88;;;38936:35;38950:20;38962:8:::0;38950:9:::1;:20;:::i;:::-;38936:13;:35::i;:::-;39019:8;::::0;38993:46:::1;::::0;-1:-1:-1;;;;;39019:8:0::1;39030::::0;38993:17:::1;:46::i;:::-;39060:33;39066:12;:10;:12::i;:::-;39080:5;:12;39086:5;39080:12;;;;;;-1:-1:-1::0;;;39080:12:0::1;;;;;;;;;;;;;;;-1:-1:-1::0;;;39080:12:0::1;;;;;;;;;;;;;;;;;;;;;39060:5;:33::i;:::-;39120:1;39104:5;:12;39110:5;39104:12;;;;;;-1:-1:-1::0;;;39104:12:0::1;;;;;;;;;;;;;;;-1:-1:-1::0;;;39104:12:0::1;;;;;;;;;;;;;;;;;;;;;:17;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;39166:1:0::1;::::0;-1:-1:-1;39132:9:0::1;:23;39142:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;39132:23:0::1;-1:-1:-1::0;;;;;39132:23:0::1;;;;;;;;;;;;:30;39156:5;39132:30;;;;;;-1:-1:-1::0;;;39132:30:0::1;;;;;;;;;;;;;;;-1:-1:-1::0;;;39132:30:0::1;;;;;;;;;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;39132:30:0;;;:35;;:30;;-1:-1:-1;39132:35:0::1;::::0;;;::::1;;;:::i;:::-;::::0;;::::1;::::0;;::::1;;::::0;;;::::1;::::0;;::::1;::::0;;;::::1;;::::0;;::::1;;::::0;;-1:-1:-1;;35546:14:0;:22;;-1:-1:-1;;35546:22:0;;;-1:-1:-1;;38247:928:0:o;20575:208::-;20647:7;-1:-1:-1;;;;;20675:19:0;;20667:74;;;;-1:-1:-1;;;20667:74:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;20759:16:0;;;;;:9;:16;;;;;;;20575:208::o;33894:94::-;33474:12;:10;:12::i;:::-;-1:-1:-1;;;;;33463:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;33463:23:0;;33455:68;;;;-1:-1:-1;;;33455:68:0;;;;;;;:::i;:::-;33959:21:::1;33977:1;33959:9;:21::i;39827:358::-:0;33474:12;:10;:12::i;:::-;-1:-1:-1;;;;;33463:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;33463:23:0;;33455:68;;;;-1:-1:-1;;;33455:68:0;;;;;;;:::i;:::-;35441:14:::1;::::0;::::1;;35437:55;;;35472:8;::::0;::::1;35437:55;35502:14;:21:::0;;-1:-1:-1;;35502:21:0::1;35519:4;35502:21;::::0;;39918:5:::2;:28:::0;39976:7:::2;:30:::0;-1:-1:-1;;;39918:28:0;;;::::2;;::::0;;::::2;::::0;39976:30;;::::2;;39918:28:::0;40017:94:::2;40047:8;40042:1;:13;40017:94;;40077:22;40083:12;:10;:12::i;:::-;40097:1;40077:5;:22::i;:::-;40057:3:::0;::::2;::::0;::::2;:::i;:::-;;;;40017:94;;;-1:-1:-1::0;40143:7:0::2;:30:::0;:34:::2;::::0;-1:-1:-1;;;40143:30:0;::::2;;;40176:1;40143:34;:::i;:::-;40127:12;40121:19;::::0;:5:::2;:19;::::0;:56:::2;;:19:::0;:56;-1:-1:-1;;35546:14:0::1;:22:::0;;-1:-1:-1;;35546:22:0::1;::::0;;39827:358::o;35285:65::-;;;;;;;;;;;;;;;-1:-1:-1;35285:65:0;:::o;33243:87::-;33316:6;;-1:-1:-1;;;;;33316:6:0;33243:87;:::o;21320:104::-;21376:13;21409:7;21402:14;;;;;:::i;43013:246::-;43063:23;;:::i;:::-;43099:152;;;;;;;;43124:31;43140:14;43124:15;:31::i;:::-;43099:152;;;;;;43170:30;43186:13;43170:15;:30::i;:::-;43099:152;;;;;;43215:25;43231:8;43215:15;:25::i;:::-;43099:152;;;;;43013:246;-1:-1:-1;43013:246:0:o;39241:520::-;35441:14;;;;35437:55;;;35472:8;;;35437:55;35502:14;:21;;-1:-1:-1;;35502:21:0;35519:4;35502:21;;;:14;39335:9:::1;::::0;::::1;;:25;::::0;::::1;;;;-1:-1:-1::0;;;39335:25:0::1;;;;;;;;;;;39327:61;;;;-1:-1:-1::0;;;39327:61:0::1;;;;;;;:::i;:::-;39399:14;39416:7;:14;39424:5;39416:14;;;;;;-1:-1:-1::0;;;39416:14:0::1;;;;;;;;;;;;;;;-1:-1:-1::0;;;39416:14:0::1;;;;;;;;;;;;;;;;;;;;:28;39431:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;39416:28:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;39416:28:0;;::::1;;::::0;-1:-1:-1;39463:11:0;39455:57:::1;;;;-1:-1:-1::0;;;39455:57:0::1;;;;;;;:::i;:::-;39538:8;39533:101;39556:7;39552:11;;:1;:11;;;39533:101;;;39585:37;39591:12;:10;:12::i;:::-;39620:1;39605:16;;:5;:12;39611:5;39605:12;;;;;;-1:-1:-1::0;;;39605:12:0::1;;;;;;;;;;;;;;;-1:-1:-1::0;;;39605:12:0::1;;;;;;;;;;;;;;;;;;;;;:16;;;;:::i;:::-;39585:5;:37::i;:::-;39565:3:::0;::::1;::::0;::::1;:::i;:::-;;;;39533:101;;;;39666:7;39644:11;:18;39656:5;39644:18;;;;;;-1:-1:-1::0;;;39644:18:0::1;;;;;;;;;;;;;;;-1:-1:-1::0;;;39644:18:0::1;;;;;;;;;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;39644:18:0;;;:29;;:18;;-1:-1:-1;39644:29:0::1;::::0;;;::::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;39700:7;39684:23;;:5;:12;39690:5;39684:12;;;;;;-1:-1:-1::0;;;39684:12:0::1;;;;;;;;;;;;;;;-1:-1:-1::0;;;39684:12:0::1;;;;;;;;;;;;;;;;;;;;;:23;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;39725:7:0::1;::::0;-1:-1:-1;39725:14:0::1;39733:5:::0;39725:14:::1;::::0;::::1;;;;-1:-1:-1::0;;;39725:14:0::1;;;;;;;;;;;;;;;-1:-1:-1::0;;;39725:14:0::1;;;;;;;;;;;;;;;;;;;;:28;39740:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;39725:28:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;39725:28:0;39718:35;;-1:-1:-1;;39718:35:0::1;::::0;;-1:-1:-1;;35546:14:0;:22;;-1:-1:-1;;35546:22:0;;;39241:520::o;23003:295::-;23118:12;:10;:12::i;:::-;-1:-1:-1;;;;;23106:24:0;:8;-1:-1:-1;;;;;23106:24:0;;;23098:62;;;;-1:-1:-1;;;23098:62:0;;;;;;;:::i;:::-;23218:8;23173:18;:32;23192:12;:10;:12::i;:::-;-1:-1:-1;;;;;23173:32:0;;;;;;;;;;;;;;;;;-1:-1:-1;23173:32:0;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;23173:53:0;;;;;;;;;;;23257:12;:10;:12::i;:::-;-1:-1:-1;;;;;23242:48:0;;23281:8;23242:48;;;;;;:::i;:::-;;;;;;;;23003:295;;:::o;40884:126::-;40958:6;40984:11;:18;40996:5;40984:18;;;;;;-1:-1:-1;;;40984:18:0;;;;;;;;;;;;;;;-1:-1:-1;;;40984:18:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40984:18:0;;;;;40884:126;-1:-1:-1;;40884:126:0:o;37659:146::-;33474:12;:10;:12::i;:::-;-1:-1:-1;;;;;33463:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;33463:23:0;;33455:68;;;;-1:-1:-1;;;33455:68:0;;;;;;;:::i;:::-;37791:6:::1;37763:9;37781:5;37773:14;;;;;;-1:-1:-1::0;;;37773:14:0::1;;;;;;;;;37763:25;;;;;-1:-1:-1::0;;;37763:25:0::1;;;;;;;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;37659:146:::0;;:::o;24266:328::-;24441:41;24460:12;:10;:12::i;:::-;24474:7;24441:18;:41::i;:::-;24433:103;;;;-1:-1:-1;;;24433:103:0;;;;;;;:::i;:::-;24547:39;24561:4;24567:2;24571:7;24580:5;24547:13;:39::i;:::-;24266:328;;;;:::o;37227:108::-;33474:12;:10;:12::i;:::-;-1:-1:-1;;;;;33463:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;33463:23:0;;33455:68;;;;-1:-1:-1;;;33455:68:0;;;;;;;:::i;:::-;37309:9:::1;:18:::0;;37321:6;;37309:9;-1:-1:-1;;37309:18:0::1;::::0;37321:6;37309:18:::1;::::0;::::1;;;;-1:-1:-1::0;;;37309:18:0::1;;;;;;;;;;;;;;37227:108:::0;:::o;42777:166::-;42852:5;42905:9;:23;42915:12;:10;:12::i;:::-;-1:-1:-1;;;;;42905:23:0;-1:-1:-1;;;;;42905:23:0;;;;;;;;;;;;:30;42929:5;42905:30;;;;;;-1:-1:-1;;;42905:30:0;;;;;;;;;;;;;;;-1:-1:-1;;;42905:30:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42905:30:0;;;;42877:9;42895:5;42887:14;;;;;;-1:-1:-1;;;42887:14:0;;;;;;;;;42877:25;;;;;-1:-1:-1;;;42877:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:58;;;;:::i;43325:239::-;43406:13;43477:12;43504:18;:7;:16;:18::i;:::-;43446:109;;;;;;;;;:::i;:::-;;;;;;;;;;;;;43432:124;;43325:239;;;:::o;36449:459::-;33474:12;:10;:12::i;:::-;-1:-1:-1;;;;;33463:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;33463:23:0;;33455:68;;;;-1:-1:-1;;;33455:68:0;;;;;;;:::i;:::-;36611:19;;;;;:55:::1;;-1:-1:-1::0;36634:32:0;;::::1;36611:55;36603:92;;;;-1:-1:-1::0;;;36603:92:0::1;;;;;;;:::i;:::-;36713:8;36708:193;36723:19;::::0;::::1;::::0;-1:-1:-1;36708:193:0::1;;;36791:1;36768:8:::0;;:11:::1;::::0;::::1;::::0;;::::1;;;-1:-1:-1::0;;;36768:11:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;36768:25:0::1;;;:43;;;;;36810:1;36797:7;;36805:1;36797:10;;;;;;;-1:-1:-1::0;;;36797:10:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:14;;;36768:43;36764:126;;;36832:42;36843:5;36850:8;;36859:1;36850:11;;;;;;;-1:-1:-1::0;;;36850:11:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36863:7;;36871:1;36863:10;;;;;;;-1:-1:-1::0;;;36863:10:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;36832:42::-;36744:3:::0;::::1;::::0;::::1;:::i;:::-;;;;36708:193;;;;36449:459:::0;;;;;:::o;41534:147::-;41610:7;41652:5;41666;41658:14;;;;;;-1:-1:-1;;;41658:14:0;;;;;;;;;41652:21;;;;;-1:-1:-1;;;41652:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41637:36;;:5;:12;41643:5;41637:12;;;;;;-1:-1:-1;;;41637:12:0;;;;;;;;;;;;;;;-1:-1:-1;;;41637:12:0;;;;;;;;;;;;;;;;;;;;;:36;;;;:::i;34709:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;41756:113::-;41831:7;:30;-1:-1:-1;;;41831:30:0;;;;;41756:113::o;36043:298::-;33474:12;:10;:12::i;:::-;-1:-1:-1;;;;;33463:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;33463:23:0;;33455:68;;;;-1:-1:-1;;;33455:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;36180:22:0;::::1;::::0;;::::1;::::0;:37:::1;;;36216:1;36206:7;:11;;;36180:37;36172:73;;;;-1:-1:-1::0;;;36172:73:0::1;;;;;;;:::i;:::-;36286:7;36258;:14;36266:5;36258:14;;;;;;-1:-1:-1::0;;;36258:14:0::1;;;;;;;;;;;;;;;-1:-1:-1::0;;;36258:14:0::1;;;;;;;;;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;36258:14:0;;;-1:-1:-1;;;;;36258:24:0;::::1;::::0;;;;;;;:35;;:24;;-1:-1:-1;36258:35:0::1;::::0;;;::::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;36326:7;36304:11;:18;36316:5;36304:18;;;;;;-1:-1:-1::0;;;36304:18:0::1;;;;;;;;;;;;;;;-1:-1:-1::0;;;36304:18:0::1;;;;;;;;;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;36304:18:0;;;:29;;:18;;-1:-1:-1;36304:29:0::1;::::0;;;::::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;36043:298:::0;;;:::o;42176:519::-;42231:23;;:::i;:::-;42256:21;;:::i;:::-;42290:198;;;;;;;;42313:32;42330:14;42313:16;:32::i;:::-;42290:198;;;;42360:31;42377:13;42360:16;:31::i;:::-;42290:198;;;;42406:26;42423:8;42406:16;:26::i;:::-;42290:198;;;;42447:30;42464:12;42447:16;:30::i;:::-;42290:198;;;;;42499:188;;;;;;;;42520:30;42535:14;42520;:30::i;:::-;42499:188;;;;42565:29;42580:13;42565:14;:29::i;:::-;42499:188;;;;42609:24;42624:8;42609:14;:24::i;:::-;42499:188;;;;42648:28;42663:12;42648:14;:28::i;:::-;42499:188;;42176:519;;;-1:-1:-1;42176:519:0:o;35168:40::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;23369:164::-;-1:-1:-1;;;;;23490:25:0;;;23466:4;23490:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;23369:164::o;37000:112::-;33474:12;:10;:12::i;:::-;-1:-1:-1;;;;;33463:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;33463:23:0;;33455:68;;;;-1:-1:-1;;;33455:68:0;;;;;;;:::i;:::-;37085:8:::1;:19:::0;;-1:-1:-1;;;;;;37085:19:0::1;-1:-1:-1::0;;;;;37085:19:0;;;::::1;::::0;;;::::1;::::0;;37000:112::o;34786:37::-;;;;;;:::o;34143:192::-;33474:12;:10;:12::i;:::-;-1:-1:-1;;;;;33463:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;33463:23:0;;33455:68;;;;-1:-1:-1;;;33455:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34232:22:0;::::1;34224:73;;;;-1:-1:-1::0;;;34224:73:0::1;;;;;;;:::i;:::-;34308:19;34318:8;34308:9;:19::i;:::-;34143:192:::0;:::o;7658:157::-;-1:-1:-1;;;;;;7767:40:0;;-1:-1:-1;;;7767:40:0;7658:157;;;:::o;26104:127::-;26169:4;26193:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26193:16:0;:30;;;26104:127::o;8363:98::-;8443:10;8363:98;:::o;30086:174::-;30161:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;30161:29:0;-1:-1:-1;;;;;30161:29:0;;;;;;;;:24;;30215:23;30161:24;30215:14;:23::i;:::-;-1:-1:-1;;;;;30206:46:0;;;;;;;;;;;30086:174;;:::o;26398:348::-;26491:4;26516:16;26524:7;26516;:16::i;:::-;26508:73;;;;-1:-1:-1;;;26508:73:0;;;;;;;:::i;:::-;26592:13;26608:23;26623:7;26608:14;:23::i;:::-;26592:39;;26661:5;-1:-1:-1;;;;;26650:16:0;:7;-1:-1:-1;;;;;26650:16:0;;:51;;;;26694:7;-1:-1:-1;;;;;26670:31:0;:20;26682:7;26670:11;:20::i;:::-;-1:-1:-1;;;;;26670:31:0;;26650:51;:87;;;;26705:32;26722:5;26729:7;26705:16;:32::i;:::-;26642:96;26398:348;-1:-1:-1;;;;26398:348:0:o;29390:578::-;29549:4;-1:-1:-1;;;;;29522:31:0;:23;29537:7;29522:14;:23::i;:::-;-1:-1:-1;;;;;29522:31:0;;29514:85;;;;-1:-1:-1;;;29514:85:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;29618:16:0;;29610:65;;;;-1:-1:-1;;;29610:65:0;;;;;;;:::i;:::-;29688:39;29709:4;29715:2;29719:7;29688:20;:39::i;:::-;29792:29;29809:1;29813:7;29792:8;:29::i;:::-;-1:-1:-1;;;;;29834:15:0;;;;;;:9;:15;;;;;:20;;29853:1;;29834:15;:20;;29853:1;;29834:20;:::i;:::-;;;;-1:-1:-1;;;;;;;29865:13:0;;;;;;:9;:13;;;;;:18;;29882:1;;29865:13;:18;;29882:1;;29865:18;:::i;:::-;;;;-1:-1:-1;;29894:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;29894:21:0;-1:-1:-1;;;;;29894:21:0;;;;;;;;;29933:27;;29894:16;;29933:27;;;;;;;29390:578;;;:::o;11200:317::-;11315:6;11290:21;:31;;11282:73;;;;-1:-1:-1;;;11282:73:0;;;;;;;:::i;:::-;11369:12;11387:9;-1:-1:-1;;;;;11387:14:0;11409:6;11387:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11368:52;;;11439:7;11431:78;;;;-1:-1:-1;;;11431:78:0;;;;;;;:::i;43952:287::-;44042:1;44032:7;:11;:35;;;;;44060:7;44047:9;:20;;44032:35;44028:204;;;44085:13;44112:10;-1:-1:-1;;;;;44104:24:0;44136:7;44104:44;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44084:64;;;44171:8;44163:57;;;;-1:-1:-1;;;44163:57:0;;;;;;;:::i;28082:382::-;-1:-1:-1;;;;;28162:16:0;;28154:61;;;;-1:-1:-1;;;28154:61:0;;;;;;;:::i;:::-;28235:16;28243:7;28235;:16::i;:::-;28234:17;28226:58;;;;-1:-1:-1;;;28226:58:0;;;;;;;:::i;:::-;28297:45;28326:1;28330:2;28334:7;28297:20;:45::i;:::-;-1:-1:-1;;;;;28355:13:0;;;;;;:9;:13;;;;;:18;;28372:1;;28355:13;:18;;28372:1;;28355:18;:::i;:::-;;;;-1:-1:-1;;28384:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;28384:21:0;-1:-1:-1;;;;;28384:21:0;;;;;;;;28423:33;;28384:16;;;28423:33;;28384:16;;28423:33;28082:382;;:::o;34343:173::-;34418:6;;;-1:-1:-1;;;;;34435:17:0;;;-1:-1:-1;;;;;;34435:17:0;;;;;;;34468:40;;34418:6;;;34435:17;34418:6;;34468:40;;34399:16;;34468:40;34343:173;;:::o;25476:315::-;25633:28;25643:4;25649:2;25653:7;25633:9;:28::i;:::-;25680:48;25703:4;25709:2;25713:7;25722:5;25680:22;:48::i;:::-;25672:111;;;;-1:-1:-1;;;25672:111:0;;;;;;;:::i;17218:723::-;17274:13;17495:10;17491:53;;-1:-1:-1;17522:10:0;;;;;;;;;;;;-1:-1:-1;;;17522:10:0;;;;;;17491:53;17569:5;17554:12;17610:78;17617:9;;17610:78;;17643:8;;;;:::i;:::-;;-1:-1:-1;17666:10:0;;-1:-1:-1;17674:2:0;17666:10;;:::i;:::-;;;17610:78;;;17698:19;17730:6;17720:17;;;;;;-1:-1:-1;;;17720:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17720:17:0;;17698:39;;17748:154;17755:10;;17748:154;;17782:11;17792:1;17782:11;;:::i;:::-;;-1:-1:-1;17851:10:0;17859:2;17851:5;:10;:::i;:::-;17838:24;;:2;:24;:::i;:::-;17825:39;;17808:6;17815;17808:14;;;;;;-1:-1:-1;;;17808:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;17808:56:0;;;;;;;;-1:-1:-1;17879:11:0;17888:2;17879:11;;:::i;:::-;;;17748:154;;30825:803;30980:4;31001:15;:2;-1:-1:-1;;;;;31001:13:0;;:15::i;:::-;30997:624;;;31053:2;-1:-1:-1;;;;;31037:36:0;;31074:12;:10;:12::i;:::-;31088:4;31094:7;31103:5;31037:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31037:72:0;;;;;;;;-1:-1:-1;;31037:72:0;;;;;;;;;;;;:::i;:::-;;;31033:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31283:13:0;;31279:272;;31326:60;;-1:-1:-1;;;31326:60:0;;;;;;;:::i;31279:272::-;31501:6;31495:13;31486:6;31482:2;31478:15;31471:38;31033:533;-1:-1:-1;;;;;;31160:55:0;-1:-1:-1;;;31160:55:0;;-1:-1:-1;31153:62:0;;30997:624;-1:-1:-1;31605:4:0;30825:803;;;;;;:::o;9878:387::-;10201:20;10249:8;;;9878:387::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;14:607:1;;110:18;151:2;143:6;140:14;137:2;;;157:18;;:::i;:::-;206:2;200:9;279:2;256:17;;-1:-1:-1;;252:31:1;240:44;;286:4;236:55;306:18;;;326:22;;;303:46;300:2;;;352:18;;:::i;:::-;388:2;381:22;436;;;421:6;-1:-1:-1;421:6:1;473:16;;;470:25;-1:-1:-1;467:2:1;;;508:1;505;498:12;467:2;558:6;553:3;546:4;538:6;534:17;521:44;613:1;606:4;597:6;589;585:19;581:30;574:41;;;90:531;;;;;:::o;626:175::-;696:20;;-1:-1:-1;;;;;745:31:1;;735:42;;725:2;;791:1;788;781:12;806:400;;;939:3;932:4;924:6;920:17;916:27;906:2;;962:6;954;947:22;906:2;-1:-1:-1;990:20:1;;1033:18;1022:30;;1019:2;;;1072:8;1062;1055:26;1019:2;1116:4;1108:6;1104:17;1092:29;;1179:3;1172:4;1164;1156:6;1152:17;1144:6;1140:30;1136:41;1133:50;1130:2;;;1196:1;1193;1186:12;1130:2;896:310;;;;;:::o;1211:149::-;1285:20;;1334:1;1324:12;;1314:2;;1350:1;1347;1340:12;1365:161;1434:20;;1494:6;1483:18;;1473:29;;1463:2;;1516:1;1513;1506:12;1531:198;;1643:2;1631:9;1622:7;1618:23;1614:32;1611:2;;;1664:6;1656;1649:22;1611:2;1692:31;1713:9;1692:31;:::i;:::-;1682:41;1601:128;-1:-1:-1;;;1601:128:1:o;1734:274::-;;;1863:2;1851:9;1842:7;1838:23;1834:32;1831:2;;;1884:6;1876;1869:22;1831:2;1912:31;1933:9;1912:31;:::i;:::-;1902:41;;1962:40;1998:2;1987:9;1983:18;1962:40;:::i;:::-;1952:50;;1821:187;;;;;:::o;2013:342::-;;;;2159:2;2147:9;2138:7;2134:23;2130:32;2127:2;;;2180:6;2172;2165:22;2127:2;2208:31;2229:9;2208:31;:::i;:::-;2198:41;;2258:40;2294:2;2283:9;2279:18;2258:40;:::i;:::-;2248:50;;2345:2;2334:9;2330:18;2317:32;2307:42;;2117:238;;;;;:::o;2360:702::-;;;;;2532:3;2520:9;2511:7;2507:23;2503:33;2500:2;;;2554:6;2546;2539:22;2500:2;2582:31;2603:9;2582:31;:::i;:::-;2572:41;;2632:40;2668:2;2657:9;2653:18;2632:40;:::i;:::-;2622:50;;2719:2;2708:9;2704:18;2691:32;2681:42;;2774:2;2763:9;2759:18;2746:32;2801:18;2793:6;2790:30;2787:2;;;2838:6;2830;2823:22;2787:2;2866:22;;2919:4;2911:13;;2907:27;-1:-1:-1;2897:2:1;;2953:6;2945;2938:22;2897:2;2981:75;3048:7;3043:2;3030:16;3025:2;3021;3017:11;2981:75;:::i;:::-;2971:85;;;2490:572;;;;;;;:::o;3067:369::-;;;3193:2;3181:9;3172:7;3168:23;3164:32;3161:2;;;3214:6;3206;3199:22;3161:2;3242:31;3263:9;3242:31;:::i;:::-;3232:41;;3323:2;3312:9;3308:18;3295:32;3370:5;3363:13;3356:21;3349:5;3346:32;3336:2;;3397:6;3389;3382:22;3336:2;3425:5;3415:15;;;3151:285;;;;;:::o;3441:266::-;;;3570:2;3558:9;3549:7;3545:23;3541:32;3538:2;;;3591:6;3583;3576:22;3538:2;3619:31;3640:9;3619:31;:::i;:::-;3609:41;3697:2;3682:18;;;;3669:32;;-1:-1:-1;;;3528:179:1:o;3712:257::-;;3823:2;3811:9;3802:7;3798:23;3794:32;3791:2;;;3844:6;3836;3829:22;3791:2;3888:9;3875:23;3907:32;3933:5;3907:32;:::i;3974:261::-;;4096:2;4084:9;4075:7;4071:23;4067:32;4064:2;;;4117:6;4109;4102:22;4064:2;4154:9;4148:16;4173:32;4199:5;4173:32;:::i;4240:212::-;;4362:2;4350:9;4341:7;4337:23;4333:32;4330:2;;;4383:6;4375;4368:22;4330:2;4411:35;4436:9;4411:35;:::i;4457:288::-;;;4596:2;4584:9;4575:7;4571:23;4567:32;4564:2;;;4617:6;4609;4602:22;4564:2;4645:35;4670:9;4645:35;:::i;4750:362::-;;;;4905:2;4893:9;4884:7;4880:23;4876:32;4873:2;;;4926:6;4918;4911:22;4873:2;4954:35;4979:9;4954:35;:::i;:::-;4944:45;;5008:40;5044:2;5033:9;5029:18;5008:40;:::i;:::-;4998:50;;5067:39;5102:2;5091:9;5087:18;5067:39;:::i;:::-;5057:49;;4863:249;;;;;:::o;5117:904::-;;;;;;5342:2;5330:9;5321:7;5317:23;5313:32;5310:2;;;5363:6;5355;5348:22;5310:2;5391:35;5416:9;5391:35;:::i;:::-;5381:45;;5477:2;5466:9;5462:18;5449:32;5500:18;5541:2;5533:6;5530:14;5527:2;;;5562:6;5554;5547:22;5527:2;5606:76;5674:7;5665:6;5654:9;5650:22;5606:76;:::i;:::-;5701:8;;-1:-1:-1;5580:102:1;-1:-1:-1;5789:2:1;5774:18;;5761:32;;-1:-1:-1;5805:16:1;;;5802:2;;;5839:6;5831;5824:22;5802:2;;5883:78;5953:7;5942:8;5931:9;5927:24;5883:78;:::i;:::-;5300:721;;;;-1:-1:-1;5300:721:1;;-1:-1:-1;5980:8:1;;5857:104;5300:721;-1:-1:-1;;;5300:721:1:o;6026:280::-;;;6165:2;6153:9;6144:7;6140:23;6136:32;6133:2;;;6186:6;6178;6171:22;6133:2;6214:35;6239:9;6214:35;:::i;6311:379::-;;;6448:2;6436:9;6427:7;6423:23;6419:32;6416:2;;;6469:6;6461;6454:22;6416:2;6497:35;6522:9;6497:35;:::i;:::-;6487:45;;6582:2;6571:9;6567:18;6554:32;6626:4;6619:5;6615:16;6608:5;6605:27;6595:2;;6651:6;6643;6636:22;6695:286;;6817:2;6805:9;6796:7;6792:23;6788:32;6785:2;;;6838:6;6830;6823:22;6785:2;6882:9;6869:23;6921:1;6914:5;6911:12;6901:2;;6942:6;6934;6927:22;6986:482;;7108:2;7096:9;7087:7;7083:23;7079:32;7076:2;;;7129:6;7121;7114:22;7076:2;7174:9;7161:23;7207:18;7199:6;7196:30;7193:2;;;7244:6;7236;7229:22;7193:2;7272:22;;7325:4;7317:13;;7313:27;-1:-1:-1;7303:2:1;;7359:6;7351;7344:22;7303:2;7387:75;7454:7;7449:2;7436:16;7431:2;7427;7423:11;7387:75;:::i;7473:196::-;;7584:2;7572:9;7563:7;7559:23;7555:32;7552:2;;;7605:6;7597;7590:22;7552:2;7633:30;7653:9;7633:30;:::i;7674:190::-;;7786:2;7774:9;7765:7;7761:23;7757:32;7754:2;;;7807:6;7799;7792:22;7754:2;-1:-1:-1;7835:23:1;;7744:120;-1:-1:-1;7744:120:1:o;7869:331::-;7967:5;7990:1;8000:194;8014:4;8011:1;8008:11;8000:194;;;8073:13;;8061:26;;8110:4;8134:12;;;;8169:15;;;;8034:1;8027:9;8000:194;;8205:259;;8286:5;8280:12;8313:6;8308:3;8301:19;8329:63;8385:6;8378:4;8373:3;8369:14;8362:4;8355:5;8351:16;8329:63;:::i;:::-;8446:2;8425:15;-1:-1:-1;;8421:29:1;8412:39;;;;8453:4;8408:50;;8256:208;-1:-1:-1;;8256:208:1:o;8469:187::-;;8551:5;8545:12;8566:52;8611:6;8606:3;8599:4;8592:5;8588:16;8566:52;:::i;:::-;8634:16;;;;;8521:135;-1:-1:-1;;8521:135:1:o;8661:120::-;-1:-1:-1;;;8728:20:1;;8773:1;8764:11;;8718:63::o;8786:1315::-;9121:13;;8786:1315;;;;9194:1;9179:17;;9215:1;9251:18;;;;9278:2;;9332:4;9324:6;9320:17;9310:27;;9278:2;9358;9406;9398:6;9395:14;9375:18;9372:38;9369:2;;;-1:-1:-1;;;9433:33:1;;9489:4;9486:1;9479:15;9519:4;9440:3;9507:17;9369:2;9550:18;9577:104;;;;9695:1;9690:324;;;;9543:471;;9577:104;-1:-1:-1;;9610:24:1;;9598:37;;9655:16;;;;-1:-1:-1;9577:104:1;;9690:324;9726:39;9758:6;9726:39;:::i;:::-;9787:3;9803:165;9817:6;9814:1;9811:13;9803:165;;;9895:14;;9882:11;;;9875:35;9938:16;;;;9832:10;;9803:165;;;9807:3;;9997:6;9992:3;9988:16;9981:23;;9543:471;;;;;;;10030:65;10062:32;10090:3;10082:6;10062:32;:::i;:::-;10030:65;:::i;:::-;10023:72;9071:1030;-1:-1:-1;;;;;9071:1030:1:o;10106:205::-;10306:3;10297:14::o;10316:203::-;-1:-1:-1;;;;;10480:32:1;;;;10462:51;;10450:2;10435:18;;10417:102::o;10524:490::-;-1:-1:-1;;;;;10793:15:1;;;10775:34;;10845:15;;10840:2;10825:18;;10818:43;10892:2;10877:18;;10870:34;;;10940:3;10935:2;10920:18;;10913:31;;;10524:490;;10961:47;;10988:19;;10980:6;10961:47;:::i;:::-;10953:55;10727:287;-1:-1:-1;;;;;;10727:287:1:o;11019:505::-;11197:2;11182:18;;11186:9;11277:6;11019:505;11311:207;11325:4;11322:1;11319:11;11311:207;;;11388:13;;11403:6;11384:26;11372:39;;11434:4;11458:12;;;;11493:15;;;;11345:1;11338:9;11311:207;;;11315:3;;;11164:360;;;;:::o;11529:388::-;11783:3;11768:19;;11796:48;11772:9;11826:6;11796:48;:::i;:::-;11853:58;11906:3;11895:9;11891:19;11883:6;11853:58;:::i;11922:501::-;12098:2;12083:18;;12087:9;12178:6;11922:501;12212:205;12226:4;12223:1;12220:11;12212:205;;;12289:13;;12304:4;12285:24;12273:37;;12333:4;12357:12;;;;12392:15;;;;12246:1;12239:9;12212:205;;12428:187;12593:14;;12586:22;12568:41;;12556:2;12541:18;;12523:92::o;12620:338::-;12762:2;12747:18;;12795:1;12784:13;;12774:2;;12840:10;12835:3;12831:20;12828:1;12821:31;12875:4;12872:1;12865:15;12903:4;12900:1;12893:15;12774:2;12927:25;;;12729:229;:::o;12963:221::-;;13112:2;13101:9;13094:21;13132:46;13174:2;13163:9;13159:18;13151:6;13132:46;:::i;13189:414::-;13391:2;13373:21;;;13430:2;13410:18;;;13403:30;13469:34;13464:2;13449:18;;13442:62;-1:-1:-1;;;13535:2:1;13520:18;;13513:48;13593:3;13578:19;;13363:240::o;13608:402::-;13810:2;13792:21;;;13849:2;13829:18;;;13822:30;13888:34;13883:2;13868:18;;13861:62;-1:-1:-1;;;13954:2:1;13939:18;;13932:36;14000:3;13985:19;;13782:228::o;14015:352::-;14217:2;14199:21;;;14256:2;14236:18;;;14229:30;14295;14290:2;14275:18;;14268:58;14358:2;14343:18;;14189:178::o;14372:397::-;14574:2;14556:21;;;14613:2;14593:18;;;14586:30;14652:34;14647:2;14632:18;;14625:62;-1:-1:-1;;;14718:2:1;14703:18;;14696:31;14759:3;14744:19;;14546:223::o;14774:400::-;14976:2;14958:21;;;15015:2;14995:18;;;14988:30;15054:34;15049:2;15034:18;;15027:62;-1:-1:-1;;;15120:2:1;15105:18;;15098:34;15164:3;15149:19;;14948:226::o;15179:349::-;15381:2;15363:21;;;15420:2;15400:18;;;15393:30;15459:27;15454:2;15439:18;;15432:55;15519:2;15504:18;;15353:175::o;15533:351::-;15735:2;15717:21;;;15774:2;15754:18;;;15747:30;15813:29;15808:2;15793:18;;15786:57;15875:2;15860:18;;15707:177::o;15889:422::-;16091:2;16073:21;;;16130:2;16110:18;;;16103:30;16169:34;16164:2;16149:18;;16142:62;16240:28;16235:2;16220:18;;16213:56;16301:3;16286:19;;16063:248::o;16316:402::-;16518:2;16500:21;;;16557:2;16537:18;;;16530:30;16596:34;16591:2;16576:18;;16569:62;-1:-1:-1;;;16662:2:1;16647:18;;16640:36;16708:3;16693:19;;16490:228::o;16723:353::-;16925:2;16907:21;;;16964:2;16944:18;;;16937:30;17003:31;16998:2;16983:18;;16976:59;17067:2;17052:18;;16897:179::o;17081:408::-;17283:2;17265:21;;;17322:2;17302:18;;;17295:30;17361:34;17356:2;17341:18;;17334:62;-1:-1:-1;;;17427:2:1;17412:18;;17405:42;17479:3;17464:19;;17255:234::o;17494:348::-;17696:2;17678:21;;;17735:2;17715:18;;;17708:30;17774:26;17769:2;17754:18;;17747:54;17833:2;17818:18;;17668:174::o;17847:420::-;18049:2;18031:21;;;18088:2;18068:18;;;18061:30;18127:34;18122:2;18107:18;;18100:62;18198:26;18193:2;18178:18;;18171:54;18257:3;18242:19;;18021:246::o;18272:406::-;18474:2;18456:21;;;18513:2;18493:18;;;18486:30;18552:34;18547:2;18532:18;;18525:62;-1:-1:-1;;;18618:2:1;18603:18;;18596:40;18668:3;18653:19;;18446:232::o;18683:405::-;18885:2;18867:21;;;18924:2;18904:18;;;18897:30;18963:34;18958:2;18943:18;;18936:62;-1:-1:-1;;;19029:2:1;19014:18;;19007:39;19078:3;19063:19;;18857:231::o;19093:355::-;19295:2;19277:21;;;19334:2;19314:18;;;19307:30;19373:33;19368:2;19353:18;;19346:61;19439:2;19424:18;;19267:181::o;19453:356::-;19655:2;19637:21;;;19674:18;;;19667:30;19733:34;19728:2;19713:18;;19706:62;19800:2;19785:18;;19627:182::o;19814:347::-;20016:2;19998:21;;;20055:2;20035:18;;;20028:30;20094:25;20089:2;20074:18;;20067:53;20152:2;20137:18;;19988:173::o;20166:350::-;20368:2;20350:21;;;20407:2;20387:18;;;20380:30;20446:28;20441:2;20426:18;;20419:56;20507:2;20492:18;;20340:176::o;20521:408::-;20723:2;20705:21;;;20762:2;20742:18;;;20735:30;20801:34;20796:2;20781:18;;20774:62;-1:-1:-1;;;20867:2:1;20852:18;;20845:42;20919:3;20904:19;;20695:234::o;20934:349::-;21136:2;21118:21;;;21175:2;21155:18;;;21148:30;21214:27;21209:2;21194:18;;21187:55;21274:2;21259:18;;21108:175::o;21288:356::-;21490:2;21472:21;;;21509:18;;;21502:30;21568:34;21563:2;21548:18;;21541:62;21635:2;21620:18;;21462:182::o;21649:405::-;21851:2;21833:21;;;21890:2;21870:18;;;21863:30;21929:34;21924:2;21909:18;;21902:62;-1:-1:-1;;;21995:2:1;21980:18;;21973:39;22044:3;22029:19;;21823:231::o;22059:397::-;22261:2;22243:21;;;22300:2;22280:18;;;22273:30;22339:34;22334:2;22319:18;;22312:62;-1:-1:-1;;;22405:2:1;22390:18;;22383:31;22446:3;22431:19;;22233:223::o;22461:400::-;22663:2;22645:21;;;22702:2;22682:18;;;22675:30;22741:34;22736:2;22721:18;;22714:62;-1:-1:-1;;;22807:2:1;22792:18;;22785:34;22851:3;22836:19;;22635:226::o;22866:413::-;23068:2;23050:21;;;23107:2;23087:18;;;23080:30;23146:34;23141:2;23126:18;;23119:62;-1:-1:-1;;;23212:2:1;23197:18;;23190:47;23269:3;23254:19;;23040:239::o;23284:347::-;23486:2;23468:21;;;23525:2;23505:18;;;23498:30;23564:25;23559:2;23544:18;;23537:53;23622:2;23607:18;;23458:173::o;23636:350::-;23838:2;23820:21;;;23877:2;23857:18;;;23850:30;23916:28;23911:2;23896:18;;23889:56;23977:2;23962:18;;23810:176::o;23991:188::-;24165:6;24153:19;;;;24135:38;;24123:2;24108:18;;24090:89::o;24184:177::-;24330:25;;;24318:2;24303:18;;24285:76::o;24366:184::-;24538:4;24526:17;;;;24508:36;;24496:2;24481:18;;24463:87::o;24555:129::-;;24623:17;;;24673:4;24657:21;;;24613:71::o;24689:224::-;;24756:6;24789:2;24786:1;24782:10;24819:2;24816:1;24812:10;24850:3;24846:2;24842:12;24837:3;24834:21;24831:2;;;24858:18;;:::i;:::-;24894:13;;24736:177;-1:-1:-1;;;;24736:177:1:o;24918:128::-;;24989:1;24985:6;24982:1;24979:13;24976:2;;;24995:18;;:::i;:::-;-1:-1:-1;25031:9:1;;24966:80::o;25051:204::-;;25125:4;25122:1;25118:12;25157:4;25154:1;25150:12;25192:3;25186:4;25182:14;25177:3;25174:23;25171:2;;;25200:18;;:::i;:::-;25236:13;;25097:158;-1:-1:-1;;;25097:158:1:o;25260:120::-;;25326:1;25316:2;;25331:18;;:::i;:::-;-1:-1:-1;25365:9:1;;25306:74::o;25385:217::-;;25453:6;25509:10;;;;25479;;25531:12;;;25528:2;;;25546:18;;:::i;:::-;25583:13;;25433:169;-1:-1:-1;;;25433:169:1:o;25607:125::-;;25675:1;25672;25669:8;25666:2;;;25680:18;;:::i;:::-;-1:-1:-1;25717:9:1;;25656:76::o;25737:195::-;;25812:4;25809:1;25805:12;25844:4;25841:1;25837:12;25869:3;25864;25861:12;25858:2;;;25876:18;;:::i;:::-;25913:13;;;25784:148;-1:-1:-1;;;25784:148:1:o;25937:258::-;26009:1;26019:113;26033:6;26030:1;26027:13;26019:113;;;26109:11;;;26103:18;26090:11;;;26083:39;26055:2;26048:10;26019:113;;;26150:6;26147:1;26144:13;26141:2;;;-1:-1:-1;;26185:1:1;26167:16;;26160:27;25990:205::o;26200:380::-;26285:1;26275:12;;26332:1;26322:12;;;26343:2;;26397:4;26389:6;26385:17;26375:27;;26343:2;26450;26442:6;26439:14;26419:18;26416:38;26413:2;;;26496:10;26491:3;26487:20;26484:1;26477:31;26531:4;26528:1;26521:15;26559:4;26556:1;26549:15;26413:2;;26255:325;;;:::o;26585:197::-;;26651:6;26692:2;26685:5;26681:14;26719:2;26710:7;26707:15;26704:2;;;26725:18;;:::i;:::-;26774:1;26761:15;;26631:151;-1:-1:-1;;;26631:151:1:o;26787:135::-;;-1:-1:-1;;26847:17:1;;26844:2;;;26867:18;;:::i;:::-;-1:-1:-1;26914:1:1;26903:13;;26834:88::o;26927:112::-;;26985:1;26975:2;;26990:18;;:::i;:::-;-1:-1:-1;27024:9:1;;26965:74::o;27044:127::-;27105:10;27100:3;27096:20;27093:1;27086:31;27136:4;27133:1;27126:15;27160:4;27157:1;27150:15;27176:127;27237:10;27232:3;27228:20;27225:1;27218:31;27268:4;27265:1;27258:15;27292:4;27289:1;27282:15;27308:127;27369:10;27364:3;27360:20;27357:1;27350:31;27400:4;27397:1;27390:15;27424:4;27421:1;27414:15;27440:133;-1:-1:-1;;;;;;27516:32:1;;27506:43;;27496:2;;27563:1;27560;27553:12
Swarm Source
ipfs://02780950c1ed31565a3712f084edbc7f901e00ba217bb3fa53b91f8b595a8b46
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.