More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 44 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Unstake | 20763357 | 162 days ago | IN | 0 ETH | 0.00067099 | ||||
Harvest Flowers | 20763342 | 162 days ago | IN | 0 ETH | 0.00098956 | ||||
Harvest Flowers | 20572816 | 189 days ago | IN | 0 ETH | 0.00016856 | ||||
Stake | 19684341 | 313 days ago | IN | 0 ETH | 0.00310428 | ||||
Harvest Flowers | 18941881 | 417 days ago | IN | 0 ETH | 0.00575999 | ||||
Harvest Flowers | 18848723 | 430 days ago | IN | 0 ETH | 0.00488638 | ||||
Harvest Flowers | 18711166 | 450 days ago | IN | 0 ETH | 0.00825242 | ||||
Harvest Flowers | 18711149 | 450 days ago | IN | 0 ETH | 0.00656788 | ||||
Harvest Flowers | 18625619 | 462 days ago | IN | 0 ETH | 0.00518933 | ||||
Harvest Flowers | 18601377 | 465 days ago | IN | 0 ETH | 0.0029522 | ||||
Harvest Flowers | 18549474 | 472 days ago | IN | 0 ETH | 0.00720249 | ||||
Harvest Flowers | 18460761 | 485 days ago | IN | 0 ETH | 0.00174746 | ||||
Harvest Flowers | 18381888 | 496 days ago | IN | 0 ETH | 0.00178542 | ||||
Start Growing | 18306136 | 506 days ago | IN | 0 ETH | 0.00319559 | ||||
Stake | 18306131 | 506 days ago | IN | 0 ETH | 0.00709731 | ||||
Stake | 18293431 | 508 days ago | IN | 0 ETH | 0.00422229 | ||||
Harvest Flowers | 18293375 | 508 days ago | IN | 0 ETH | 0.00225805 | ||||
Harvest Flowers | 17714384 | 589 days ago | IN | 0 ETH | 0.00545482 | ||||
Stake | 17457901 | 625 days ago | IN | 0 ETH | 0.00550272 | ||||
Unstake | 17451994 | 626 days ago | IN | 0 ETH | 0.00469404 | ||||
Stop Growing | 17451829 | 626 days ago | IN | 0 ETH | 0.00370967 | ||||
Harvest Flowers | 17451020 | 626 days ago | IN | 0 ETH | 0.00496009 | ||||
Harvest Flowers | 17408541 | 632 days ago | IN | 0 ETH | 0.0032418 | ||||
Harvest Flowers | 17408541 | 632 days ago | IN | 0 ETH | 0.00640807 | ||||
Stake | 17028444 | 686 days ago | IN | 0 ETH | 0.01043769 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
CBZ_Staking
Compiler Version
v0.8.12+commit.f00d7308
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-02-17 */ // SPDX-License-Identifier: MIT // _____ ____ ______ _____ _ _ _ // / ____| _ \___ / / ____| | | | (_) // | | | |_) | / / | (___ | |_ __ _| | ___ _ __ __ _ // | | | _ < / / \___ \| __/ _` | |/ / | '_ \ / _` | // | |____| |_) / /__ ____) | || (_| | <| | | | | (_| | // \_____|____/_____| |_____/ \__\__,_|_|\_\_|_| |_|\__, | // __/ | v.4.20 // |___/ rel.:0.1 // creator: 73kn1k pragma solidity ^0.8.12; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); } /** * @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 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 _Available since v3.1._ */ interface IERC1155Receiver is IERC165 { /** * @dev Handles the receipt of a single ERC1155 token type. This function is * called at the end of a `safeTransferFrom` after the balance has been updated. * * NOTE: To accept the transfer, this must return * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` * (i.e. 0xf23a6e61, or its own function selector). * * @param operator The address which initiated the transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param id The ID of the token being transferred * @param value The amount of tokens being transferred * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns (bytes4); /** * @dev Handles the receipt of a multiple ERC1155 token types. This function * is called at the end of a `safeBatchTransferFrom` after the balances have * been updated. * * NOTE: To accept the transfer(s), this must return * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` * (i.e. 0xbc197c81, or its own function selector). * * @param operator The address which initiated the batch transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param ids An array containing ids of each token being transferred (order and length must match values array) * @param values An array containing amounts of each token being transferred (order and length must match ids array) * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns (bytes4); } interface IERC1155 is IERC165 { /** * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch( address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values ); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll(address indexed account, address indexed operator, bool approved); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); /** * @dev Returns the amount of tokens of token type `id` owned by `account`. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) external view returns (uint256); /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the caller. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function isApprovedForAll(address account, address operator) external view returns (bool); /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes calldata data ) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function safeBatchTransferFrom( address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data ) external; } interface IERC1155MetadataURI is IERC1155 { /** * @dev Returns the URI for token type `id`. * * If the `\{id\}` substring is present in the URI, it must be replaced by * clients with the actual token type ID. */ function uri(uint256 id) external view returns (string memory); } contract ERC1155 is ERC165, IERC1155, IERC1155MetadataURI { // Mapping from token ID to account balances mapping(uint256 => mapping(address => uint256)) private _balances; // Mapping from account to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; mapping(uint256 => uint8) internal tokenlist; // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json string internal _uri; /** * @dev See {_setURI}. */ constructor(string memory uri_) { _uri = uri_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC1155).interfaceId || interfaceId == type(IERC1155MetadataURI).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC1155MetadataURI-uri}. * * This implementation returns the same URI for *all* token types. It relies * on the token type ID substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * Clients calling this function must replace the `\{id\}` substring with the * actual token type ID. */ function uri(uint256) public view virtual override returns (string memory) { return _uri; } /** * @dev See {IERC1155-balanceOf}. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) public view virtual override returns (uint256) { require(account != address(0), "ERC1155: address zero is not a valid owner"); return _balances[id][account]; } /** * @dev See {IERC1155-balanceOfBatch}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] memory accounts, uint256[] memory ids) public view virtual override returns (uint256[] memory) { require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch"); uint256[] memory batchBalances = new uint256[](accounts.length); for (uint256 i = 0; i < accounts.length; ++i) { batchBalances[i] = balanceOf(accounts[i], ids[i]); } return batchBalances; } /** * @dev See {IERC1155-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(msg.sender, operator, approved); } /** * @dev See {IERC1155-isApprovedForAll}. */ function isApprovedForAll(address account, address operator) public view virtual override returns (bool) { return _operatorApprovals[account][operator]; } /** * @dev Returns whether the specified token exists by checking to see if it has a creator * @param _id uint256 ID of the token to query the existence of * @return bool whether the token exists */ function _exists( uint256 _id ) internal view returns (bool) { return tokenlist[_id] == 1; } /** * @dev See {IERC1155-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) public virtual override { require( from == msg.sender || isApprovedForAll(from, msg.sender), "ERC1155: caller is not token owner or approved" ); _safeTransferFrom(from, to, id, amount, data); } /** * @dev See {IERC1155-safeBatchTransferFrom}. */ function safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) public virtual override { require( from == msg.sender || isApprovedForAll(from, msg.sender), "ERC1155: caller is not token owner or approved" ); _safeBatchTransferFrom(from, to, ids, amounts, data); } /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: transfer to the zero address"); address operator = msg.sender; uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, from, to, ids, amounts, data); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; emit TransferSingle(operator, from, to, id, amount); _afterTokenTransfer(operator, from, to, ids, amounts, data); _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); require(to != address(0), "ERC1155: transfer to the zero address"); address operator = msg.sender; _beforeTokenTransfer(operator, from, to, ids, amounts, data); for (uint256 i = 0; i < ids.length; ++i) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; } emit TransferBatch(operator, from, to, ids, amounts); _afterTokenTransfer(operator, from, to, ids, amounts, data); _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data); } /** * @dev Sets a new URI for all token types, by relying on the token type ID * substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * By this mechanism, any occurrence of the `\{id\}` substring in either the * URI or any of the amounts in the JSON file at said URI will be replaced by * clients with the token type ID. * * For example, the `https://token-cdn-domain/\{id\}.json` URI would be * interpreted by clients as * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json` * for token type ID 0x4cce0. * * See {uri}. * * Because these URIs cannot be meaningfully represented by the {URI} event, * this function emits no events. */ function _setURI(string memory newuri) internal virtual { _uri = newuri; } /** * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _mint( address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); address operator = msg.sender; uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); _balances[id][to] += amount; emit TransferSingle(operator, address(0), to, id, amount); _afterTokenTransfer(operator, address(0), to, ids, amounts, data); _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _mintBatch( address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = msg.sender; _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); for (uint256 i = 0; i < ids.length; i++) { _balances[ids[i]][to] += amounts[i]; } emit TransferBatch(operator, address(0), to, ids, amounts); _afterTokenTransfer(operator, address(0), to, ids, amounts, data); _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data); } /** * @dev Destroys `amount` tokens of token type `id` from `from` * * Emits a {TransferSingle} event. * * Requirements: * * - `from` cannot be the zero address. * - `from` must have at least `amount` tokens of token type `id`. */ function _burn( address from, uint256 id, uint256 amount ) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); address operator = msg.sender; uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, from, address(0), ids, amounts, ""); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][from] = fromBalance - amount; } emit TransferSingle(operator, from, address(0), id, amount); _afterTokenTransfer(operator, from, address(0), ids, amounts, ""); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. */ function _burnBatch( address from, uint256[] memory ids, uint256[] memory amounts ) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = msg.sender; _beforeTokenTransfer(operator, from, address(0), ids, amounts, ""); for (uint256 i = 0; i < ids.length; i++) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][from] = fromBalance - amount; } } emit TransferBatch(operator, from, address(0), ids, amounts); _afterTokenTransfer(operator, from, address(0), ids, amounts, ""); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { if(owner == operator) {} else { _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning, as well as batched variants. * * The same hook is called on both single and batched variants. For single * transfers, the length of the `ids` and `amounts` arrays will be 1. * * Calling conditions (for each `id` and `amount` pair): * * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens * of token type `id` will be transferred to `to`. * - When `from` is zero, `amount` tokens of token type `id` will be minted * for `to`. * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` * will be burned. * - `from` and `to` are never both zero. * - `ids` and `amounts` have the same, non-zero length. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual {} /** * @dev Hook that is called after any token transfer. This includes minting * and burning, as well as batched variants. * * The same hook is called on both single and batched variants. For single * transfers, the length of the `id` and `amount` arrays will be 1. * * Calling conditions (for each `id` and `amount` pair): * * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens * of token type `id` will be transferred to `to`. * - When `from` is zero, `amount` tokens of token type `id` will be minted * for `to`. * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` * will be burned. * - `from` and `to` are never both zero. * - `ids` and `amounts` have the same, non-zero length. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual {} function _doSafeTransferAcceptanceCheck( address operator, address from, address to, uint256 id, uint256 amount, bytes memory data ) private { if (to.code.length > 0) { // isContract try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) { if (response != IERC1155Receiver.onERC1155Received.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non-ERC1155Receiver implementer"); } } } function _doSafeBatchTransferAcceptanceCheck( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) private { if (to.code.length > 0) { // isContract try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns ( bytes4 response ) { if (response != IERC1155Receiver.onERC1155BatchReceived.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non-ERC1155Receiver implementer"); } } } function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) { uint256[] memory array = new uint256[](1); array[0] = element; return array; } } /** * @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 `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @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 payable; /** * @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 payable; /** * @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 payable; } /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } /** * @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); } } /* Signature Verification How to Sign and Verify # Signing 1. Create message to sign 2. Hash the message 3. Sign the hash (off chain, keep your private key secret) # Verify 1. Recreate hash from the original message 2. Recover signer from signature and hash 3. Compare recovered signer to claimed signer */ contract VerifySignature { uint256 public lastNonce=0; mapping(uint256 => uint8) internal usedNonce; function lognonce(uint256 nonce) internal { require(usedNonce[nonce] != 1, "Nonce already Used"); if(nonce > lastNonce){ lastNonce = nonce; } usedNonce[nonce] = 1; } function getEthSignedMessageHash(bytes32 _messageHash) internal pure returns (bytes32) { /* Signature is produced by signing a keccak256 hash with the following format: "\x19Ethereum Signed Message\n" + len(msg) + msg */ return keccak256( abi.encodePacked("\x19Ethereum Signed Message:\n32", _messageHash) ); } function recoverSigner(bytes32 _ethSignedMessageHash, bytes memory _signature) internal pure returns (address) { (bytes32 r, bytes32 s, uint8 v) = splitSignature(_signature); return ecrecover(_ethSignedMessageHash, v, r, s); } function splitSignature(bytes memory sig) internal pure returns ( bytes32 r, bytes32 s, uint8 v ) { require(sig.length == 65, "invalid signature length"); assembly { /* First 32 bytes stores the length of the signature add(sig, 32) = pointer of sig + 32 effectively, skips first 32 bytes of signature mload(p) loads next 32 bytes starting at the memory address p into memory */ // first 32 bytes, after the length prefix r := mload(add(sig, 32)) // second 32 bytes s := mload(add(sig, 64)) // final byte (first byte of the next 32 bytes) v := byte(0, mload(add(sig, 96))) } // implicitly return (r, s, v) } } contract Signed is VerifySignature { function getScoreMessageHash( uint256 amount, uint256 at, uint256 _nonce ) internal pure returns (bytes32) { return keccak256(abi.encodePacked(amount, at, _nonce)); } function verifyScore( address _signer, uint256 amount, uint256 at, uint256 _nonce, bytes memory signature ) internal view returns (bool) { if(at + 86400 > block.timestamp){ bytes32 messageHash = getScoreMessageHash(amount, at, _nonce); bytes32 ethSignedMessageHash = getEthSignedMessageHash(messageHash); return recoverSigner(ethSignedMessageHash, signature) == _signer; } else { return false; } } } /** * @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; } } /** * @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 { address internal _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(msg.sender); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == msg.sender, "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // CBZ_token.sol /** * @title CBZ_token * CBZ_token - ERC1155 contract that whitelists an Proxy address, has mint functionality, * and supports useful standards from OpenZeppelin, * like _exists(), name(), symbol(), and totalSupply() */ contract CBZ_token is ERC1155, Ownable { //using Strings for string; address private Proxy; uint256 private _currentTokenID = 0; // Contract name string public name; // Contract symbol string public symbol; string private cbzToken = "CBZ Token: "; uint256 _totaltoken = 0; mapping (uint256 => uint256) public tokenSupply; modifier onlyProxy { require(msg.sender == Proxy, string.concat(cbzToken, "Only Proxy Function")); _; } constructor( string memory _name, string memory _symbol ) ERC1155("https://cornerboyz.club/metadata?token=") { name = _name; symbol = _symbol; } function uri( uint256 _id ) override public view returns (string memory) { require(_exists(_id), string.concat(cbzToken, "NONEXISTENT_TOKEN")); return string.concat(_uri,name,"&id=",Strings.toString(_id) ); } /** * @dev Returns the total quantity for a token ID * @return amount of token in existence */ function totalSupply() public view returns (uint256) { return _totaltoken; } /** * @dev Will update the base URL of token's URI * @param _newBaseMetadataURI New base URL of token's URI */ function setBaseMetadataURI( string memory _newBaseMetadataURI ) public onlyOwner { _setURI(_newBaseMetadataURI); } function setProxy(address _proxy) public onlyOwner { Proxy = _proxy; } /** * @dev Mints some amount of tokens to an address * @param _to Address of the future owner of the token * @param _quantity Amount of tokens to mint */ function mint( address _to, uint256 _quantity ) public onlyProxy { _mint(_to, _currentTokenID, _quantity, ""); tokenSupply[_currentTokenID] += _quantity; if(tokenlist[_currentTokenID] == 0){ tokenlist[_currentTokenID] = 1; _totaltoken += 1; } if(isApprovedForAll(_to,address(this)) == false && _to != Proxy){ _setApprovalForAll(_to, Proxy, true); } } function setTokenID(uint256 _newValue) public onlyProxy { _currentTokenID = _newValue; } function burn(address from, uint256 amount) public onlyProxy { _burn(from, _currentTokenID, amount); } } // end CBZ_token.sol // myStructure.sol struct StakersArray { address owner; uint256[] cbzid; uint256[] seedid; } struct CBZI { address owner; uint256 start; uint256 end; uint256 boxClaimed; uint256 flowersHarwested; } struct SeedI { address owner; uint256 start; uint256 produced; uint256 end; } struct Staker { uint256 id; // Amount of ERC721 Tokens staked uint256 cbzStaked; uint256 seedStaked; //uint256 brandStaked; uint256 timeOfRegistration; uint256 timeOfLastBoxUpdate; uint256 timeOfLastGrowthUpdate; //uint256 timeOfLastBrandUpdate; uint256 unclaimedMysteryBoxes; uint256 unclaimedFlowers; uint256 claimedMysteryBoxes; uint256 claimedFlowers; // Register activity on web uint256 web2score; uint256 web2oas; } // end myStructure.sol // CBZ_Tokens.sol contract CBZ_Tokens is ERC165, IERC1155Receiver, ReentrancyGuard { StakersArray[] public stakersArray; CBZ_token public immutable Flowers = CBZ_token(0x607cB8Bb818e80595A51F41c81FEb8C82e04f1d6); CBZ_token public MysteryBox; // = CBZ_token(0x. . .); CBZ_token public Bucks; address internal Creator; uint256 internal boxBurningCost = 0.0001 ether; uint256 internal boxInterval = 30 days; // 30 days uint256 internal boxReward = 1; uint256 internal cbzExchangeReward = 0; uint256 internal exchangeReward = 420; // it's to provide 2 decimals "4.20%" // Common Strings string internal cbzStaking = "CBZ Staking: "; string internal notOwner = "Not owner"; string internal wrongAmount = "Wrong amount"; bool internal buckEscrow = false; bool internal buckStaking = false; uint256 private buckFraction = 100000000000000; // Mapping of User Address to Staker mapping(address => Staker) public stakers; // Mapping of Token data. mapping(uint256 => CBZI) public cbzStaked; mapping(uint256 => SeedI) public seedStaked; mapping(address => uint256) public buckStaker; function approveSpendERC20(address token, address spender, uint256 value) public onlyCreator returns (bool) { IERC20 t = IERC20(token); return t.approve(spender, value); } function availableBoxRewards(address _user) internal view returns (uint256) { if (stakers[_user].cbzStaked == 0) { return stakers[_user].unclaimedMysteryBoxes; } uint256 _rewards = stakers[_user].unclaimedMysteryBoxes + calculateBoxRewards(_user); return _rewards; } function calculateBoxRewards(address _staker) internal view returns (uint256 _rewards) { if(MysteryBox == CBZ_token(address(0))){ return 0; } else { Staker memory staker = stakers[_staker]; return ((( ((block.timestamp - staker.timeOfLastBoxUpdate) * staker.cbzStaked) ) * boxReward) / boxInterval); } } function claimMysteryBox() external nonReentrant { uint256 cbzrewards = calculateBoxRewards(msg.sender) + stakers[msg.sender].unclaimedMysteryBoxes; require(cbzrewards > 0, string.concat(cbzStaking,"No MysteryBox to claim")); unchecked { uint256 percbz = cbzrewards / stakers[msg.sender].cbzStaked; stakers[msg.sender].timeOfLastBoxUpdate = block.timestamp; stakers[msg.sender].claimedMysteryBoxes += cbzrewards; stakers[msg.sender].unclaimedMysteryBoxes = 0; uint256 inx = stakers[msg.sender].id - 1; for(uint256 i; i < stakersArray[inx].cbzid.length;++i){ if(cbzStaked[stakersArray[inx].cbzid[i]].owner == msg.sender){ cbzStaked[stakersArray[inx].cbzid[i]].boxClaimed += percbz; } } } MysteryBox.mint(msg.sender, cbzrewards); } function burnMysteryBox(uint256 amount) external payable notStaking nonReentrant { uint256 total = boxBurningCost * amount; require(msg.value >= total, string.concat(cbzStaking,"Need more dough to burn")); MysteryBox.burn(msg.sender, amount); total = total / buckFraction; if( buckEscrow == true ){ Bucks.mint(address(this), total); buckStaker[msg.sender] += total; } } function bucksBURN(uint256 amount) external nonReentrant { require(buckStaking == false || (msg.sender == Creator && buckStaking == true), string.concat(cbzStaking,"Not posible") ); if(msg.sender == Creator){ require(payable(msg.sender).send(amount * buckFraction)); if(buckEscrow == true) { Bucks.burn(address(this), amount); } } else { require(buckStaker[msg.sender] >= amount, string.concat(cbzStaking,wrongAmount)); uint256 reward = (amount / 10000) * (exchangeReward / 2); require(payable(msg.sender).send((amount - reward) * buckFraction)); buckStaker[msg.sender] -= amount; cbzExchangeReward += exchangeReward; Bucks.burn(address(this), amount - reward); } } function bucksEXCHANGE(uint256 amount) external nonReentrant { require(Bucks.balanceOf(msg.sender, 0) >= amount, string.concat(cbzStaking,wrongAmount)); uint256 reward = (amount / 10000) * exchangeReward; Bucks.burn(msg.sender, amount - reward); require(payable(msg.sender).send((amount - reward) * buckFraction)); cbzExchangeReward += reward; } function bucksMOVE( address[] memory from, address[] memory to, uint256[] memory amount ) public onlyCreator { require(buckStaking == true, string.concat(cbzStaking,"Not staking currently")); for(uint256 i; i < from.length; ++i){ require(buckStaker[from[i]] > amount[i], string.concat(cbzStaking,wrongAmount)); buckStaker[from[i]] -= amount[i]; buckStaker[to[i]] += amount[i]; } } function bucksWITHDRAW(address to, uint256 amount) external notStaking nonReentrant { require(msg.sender == to, string.concat(cbzStaking,notOwner)); require(buckStaker[to] > amount, string.concat(cbzStaking,wrongAmount)); Bucks.safeTransferFrom(address(this), to, 0, amount,""); buckStaker[to] -= amount; } function onERC1155Received( address, // operator address, // from uint256, // id uint256, // value bytes calldata // data ) external pure returns (bytes4) { return IERC1155Receiver.onERC1155Received.selector; } function onERC1155BatchReceived( address, // operator address, // from uint256[] calldata, // ids uint256[] calldata, // values bytes calldata // data ) external pure returns (bytes4){ return IERC1155Receiver.onERC1155BatchReceived.selector; } function withdraw(uint256 amount) public onlyCreator { require(payable(msg.sender).send(amount)); } modifier notStaking { require(buckStaking == false,string.concat(cbzStaking,"Bucks Staking...")); _; } modifier onlyCreator { require(msg.sender == Creator, string.concat(cbzStaking,"Only Creator Function")); _; } } // end CBZ_Tokens.sol ////////////////////// // Staking Area // ////////////////////// contract CBZ_Staking is CBZ_Tokens, IERC721Receiver, Signed { IERC721 public immutable CornerBoyz = IERC721(0x85be9dE7A369850A964616A2C04d79000d168DEA); IERC721 public immutable Seeds = IERC721(0x14fC5036bE2388e2c2aB8A80c86755ef1FCF6E00); uint256 private maxSeedPerCorner = 1; uint256 private maxCBZperSeed = 4; uint256 private minimumHarvest = 420; uint256 private seedInterval = 1 days; uint256 private seedReward = 10; // 10 with one CBZ 21 w/2 ... 42 max uint256 private seedMaxReward = 100000; // 100.000 cuz its 42.000.000 / 420 / 42 / 365 = min 6.5+ years uint256 private quarter = seedMaxReward / 4; // with this the contract life extends... to more years XD constructor(){ Creator = msg.sender; } function onERC721Received(address, address from, uint256 tokenid, bytes calldata) external returns (bytes4) { if(IERC721(msg.sender) == CornerBoyz){ stakers[from].web2score = 0; logstaking(from); cbzStaked[tokenid].owner = from; cbzStaked[tokenid].start = block.timestamp; stakers[from].cbzStaked += 1; stakers[from].timeOfLastBoxUpdate = block.timestamp; logCBZarr(from, tokenid); } else if(IERC721(msg.sender) == Seeds){ ifcanStakeSeed(from,1); stakers[from].web2score = 0; logstaking(from); seedStaked[tokenid].owner = from; seedStaked[tokenid].start = block.timestamp; stakers[from].seedStaked += 1; stakers[from].timeOfLastBoxUpdate = block.timestamp; stakers[from].timeOfLastGrowthUpdate = block.timestamp; logSEEDarr(from, tokenid); } return IERC721Receiver.onERC721Received.selector; } function stake(uint256[] memory _tokenIds) public nonReentrant { logstaking(msg.sender); uint256 amount = _tokenIds.length; for (uint256 i; i < amount; ++i) { ifownToken(CornerBoyz, _tokenIds[i]); CornerBoyz.transferFrom(msg.sender, address(this), _tokenIds[i]); cbzStaked[_tokenIds[i]].owner = msg.sender; cbzStaked[_tokenIds[i]].start = block.timestamp; logCBZarr(msg.sender, _tokenIds[i]); } stakers[msg.sender].cbzStaked += amount; stakers[msg.sender].timeOfLastBoxUpdate = block.timestamp; } function startGrowing(uint256[] calldata _tokenIds) external nonReentrant { uint256 amount = _tokenIds.length; ifcanStakeSeed(msg.sender, amount); logstaking(msg.sender); for (uint256 i; i < amount; ++i) { ifownToken(Seeds, _tokenIds[i]); Seeds.transferFrom(msg.sender, address(this), _tokenIds[i]); seedStaked[_tokenIds[i]].owner = msg.sender; seedStaked[_tokenIds[i]].start = block.timestamp; logSEEDarr(msg.sender,_tokenIds[i]); } stakers[msg.sender].seedStaked += amount; stakers[msg.sender].timeOfLastGrowthUpdate = block.timestamp; } function stopGrowing(uint256[] calldata _tokenIds) external nonReentrant { Staker storage staker = stakers[msg.sender]; require( staker.seedStaked > 0, string.concat(cbzStaking,"You have no Seed growing") ); staker.web2score = 0; uint256 rewards = 0; uint256 amount = _tokenIds.length; uint256 growth = calculateGrowth(msg.sender, 0) / amount; uint256 seedGrowth; for (uint256 i; i < amount; ++i) { SeedI storage seed = seedStaked[_tokenIds[i]]; require(seed.owner == msg.sender, string.concat(cbzStaking,notOwner)); seed.owner = address(0); seedGrowth = growth / (((seedMaxReward - (seedMaxReward - seed.produced)) / quarter) + 1); if(seed.produced + seedGrowth < seedMaxReward){ seed.produced += seedGrowth; rewards += seedGrowth; } else { rewards += seedMaxReward - seed.produced; seed.produced = seedMaxReward; } seed.end = block.timestamp; Seeds.transferFrom(address(this), msg.sender, _tokenIds[i]); } staker.unclaimedFlowers += rewards; staker.seedStaked -= amount; staker.timeOfLastGrowthUpdate = block.timestamp; } function unstake(uint256[] calldata _tokenIds) external nonReentrant { uint256 amount = _tokenIds.length; require( stakers[msg.sender].cbzStaked > 0, string.concat(cbzStaking,"You have no CornerBoyz staked") ); require( stakers[msg.sender].seedStaked <= stakers[msg.sender].cbzStaked - amount, string.concat(cbzStaking,"Pls stopGrowing your seeds first") ); uint256 rewards = calculateBoxRewards(msg.sender); stakers[msg.sender].unclaimedMysteryBoxes += rewards; for (uint256 i; i < amount; ++i) { require(cbzStaked[_tokenIds[i]].owner == msg.sender,string.concat(cbzStaking,notOwner)); cbzStaked[_tokenIds[i]].owner = address(0); cbzStaked[_tokenIds[i]].end = block.timestamp; CornerBoyz.transferFrom(address(this), msg.sender, _tokenIds[i]); } stakers[msg.sender].cbzStaked -= amount; stakers[msg.sender].timeOfLastBoxUpdate = block.timestamp; } function calcCBZsPerSeed(uint256 cbzs, uint256 seeds) internal view returns (uint256 cbzPerSeed) { cbzPerSeed = cbzs / seeds; if(cbzPerSeed > maxCBZperSeed){ cbzPerSeed = maxCBZperSeed; } return cbzPerSeed; } function calculateGrowth(address _staker, uint256 _score) public view returns (uint256 _rewards) { Staker memory staker = stakers[_staker]; uint256 cbzPerSeed = calcCBZsPerSeed(staker.cbzStaked, staker.seedStaked); uint256 basereward = (((cbzPerSeed * seedReward) + (cbzPerSeed / 2)) * 100) / 2; uint256 actionreward = basereward / 100; uint256 growth = ((basereward + (actionreward * _score)) / staker.seedStaked) / 100; uint256 inx = staker.id - 1; uint256 seedrewards; for (uint256 i = 0; i < stakersArray[inx].seedid.length; ++i) { SeedI memory seed = seedStaked[stakersArray[inx].seedid[i]]; if(seed.owner == _staker){ uint256 seedGrowth = growth / (((seedMaxReward - (seedMaxReward - seed.produced)) / quarter) + 1); if(seed.produced + seedGrowth < seedMaxReward){ seedrewards += seedGrowth; } else { seedrewards += seedMaxReward - seed.produced; } } } return ((( ((block.timestamp - staker.timeOfLastGrowthUpdate) * staker.seedStaked) ) * seedrewards) / seedInterval); } function harvestFlowers(uint256 score, uint256 at, uint256 nonce, bytes memory data) public nonReentrant { Staker storage staker = stakers[msg.sender]; uint256 seedrewards = 0 + staker.unclaimedFlowers; if(staker.seedStaked > 0){ uint256 growth = calculateGrowth(msg.sender, score) / staker.seedStaked; uint256 seedGrowth; uint256 seedCount = stakersArray[staker.id - 1].seedid.length; if(score != 0){ lognonce(nonce); require(verifyScore(Creator, score, at, nonce, data), "Not allowed"); } staker.web2score = score; staker.web2oas += score; staker.timeOfLastGrowthUpdate = block.timestamp; for (uint256 i; i < seedCount; ++i) { SeedI storage seed = seedStaked[stakersArray[staker.id - 1].seedid[i]]; if(seed.owner == msg.sender){ seedGrowth = growth / (((seedMaxReward - (seedMaxReward - seed.produced)) / quarter) + 1); if(seed.produced + seedGrowth < seedMaxReward){ seed.produced += seedGrowth; seedrewards += seedGrowth; } else { seedrewards += seedMaxReward - seed.produced; seed.produced = seedMaxReward; } } } } require(seedrewards > 0, string.concat(cbzStaking,"No Flower$ to harvest")); require(seedrewards > minimumHarvest, string.concat(cbzStaking,"Crop not ready")); staker.claimedFlowers += seedrewards; staker.unclaimedFlowers = 0; Flowers.mint(msg.sender, seedrewards); } function setMaxCBZsPerSeed(uint256 _newValue) public onlyCreator { maxCBZperSeed = _newValue; } function setMaxSeedPerCBZ(uint256 _newValue) public onlyCreator { maxSeedPerCorner = _newValue; } function setMinimumHarvest(uint256 _newValue) public onlyCreator { minimumHarvest = _newValue; } function setSeedReward(uint256 _newValue) public onlyCreator { seedReward = _newValue; } function setSeedInterval(uint256 _newValue) public onlyCreator { seedInterval = _newValue; } /////////////// // Views // /////////////// function StakerInfo(address _user, uint256 _score) public view returns (uint256 _cbzStaked, uint256 _seedsStaked, uint256 _mysteryBox, uint256 _fowers) { return (stakers[_user].cbzStaked, stakers[_user].seedStaked, availableBoxRewards(_user), availableFlowers(_user, _score)); } function stakedCBZs(address _user) public view returns(uint256[] memory){ uint256 inx = stakers[_user].id - 1; uint256[] memory _val = new uint256[](stakersArray[inx].cbzid.length); for (uint256 i = 0; i < stakersArray[inx].cbzid.length; ++i) { if(cbzStaked[stakersArray[inx].cbzid[i]].owner == _user){ _val[i] = stakersArray[inx].cbzid[i]; } } return _val; } function stakedSeeds(address _user) public view returns(uint256[] memory){ uint256 inx = stakers[_user].id - 1; uint256[] memory _val = new uint256[](stakersArray[inx].seedid.length); for (uint256 i = 0; i < stakersArray[inx].seedid.length; ++i) { if(seedStaked[stakersArray[inx].seedid[i]].owner == _user){ _val[i] = stakersArray[inx].seedid[i]; } } return _val; } function staking_parameters() public view returns( bool _escrowBUCK$, bool _stakingBUCK$, uint256 _boxBurningCost, uint256 _boxInterval, uint256 _boxReward, uint256 _exchangeReward, uint256 _maxSeedPerCorner, uint256 _minimumHarvest, uint256 _seedInterval, uint256 _seedReward, uint256 _unclaimedReward ) { return (buckEscrow ,buckStaking, boxBurningCost, boxInterval, boxReward, exchangeReward, maxSeedPerCorner, minimumHarvest, seedInterval, seedReward, cbzExchangeReward); } ////////////////// // Internal // ////////////////// function availableFlowers(address _user, uint256 _score) internal view returns (uint256) { if (stakers[_user].seedStaked == 0) { return stakers[_user].unclaimedFlowers; } else { return stakers[_user].unclaimedFlowers + calculateGrowth(_user,_score); } } function ifcanStakeSeed(address from, uint256 amount) internal view { require( stakers[from].cbzStaked * maxSeedPerCorner > stakers[from].seedStaked + (amount - 1), string.concat(cbzStaking,"Not enough CornerBoyz staked") ); } function ifownToken(IERC721 _collection, uint256 i) internal view { require( _collection.ownerOf(i) == msg.sender, string.concat(cbzStaking,notOwner) ); } function logCBZarr(address _staker, uint256 _token) internal { bool isinarr = false; StakersArray storage staker = stakersArray[stakers[_staker].id - 1]; for(uint256 i; i < staker.cbzid.length;++i){ if(staker.cbzid[i] == _token){ isinarr = true; break; } } if(isinarr == false){ uint256 utai = staker.cbzid.length; staker.cbzid.push(); staker.cbzid[utai] = _token; } } function logSEEDarr(address _staker, uint256 _token) internal { bool isinarr = false; uint256 inx = stakers[_staker].id - 1; for(uint256 i; i < stakersArray[inx].seedid.length;++i){ if(stakersArray[inx].seedid[i] == _token){ isinarr = true; break; } } if(isinarr == false){ uint256 utai = stakersArray[inx].seedid.length; stakersArray[inx].seedid.push(); stakersArray[inx].seedid[utai] = _token; } } function logstaking(address _staker) internal { Staker storage staker = stakers[_staker]; if(staker.id == 0){ stakersArray.push(); stakersArray[stakersArray.length - 1].owner = _staker; staker.timeOfRegistration = block.timestamp; staker.id = stakersArray.length; } if (staker.cbzStaked > 0) { staker.unclaimedMysteryBoxes += calculateBoxRewards(_staker); } if (staker.seedStaked > 0) { uint256 seedrewards = 0; uint256 growth = calculateGrowth(_staker, 0) / staker.seedStaked; uint256 seedGrowth; for (uint256 i = 0; i < staker.seedStaked; ++i) { SeedI storage seed = seedStaked[stakersArray[staker.id - 1].seedid[i]]; if(seed.owner == _staker){ seedGrowth = growth / (((seedMaxReward - (seedMaxReward - seed.produced)) / quarter) + 1); if(seed.produced + seedGrowth < seedMaxReward){ seed.produced += seedGrowth; seedrewards += seedGrowth; } else { seedrewards += seedMaxReward - seed.produced; seed.produced = seedMaxReward; } } } staker.timeOfLastGrowthUpdate = block.timestamp; staker.unclaimedFlowers += seedrewards; } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"Bucks","outputs":[{"internalType":"contract CBZ_token","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CornerBoyz","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Flowers","outputs":[{"internalType":"contract CBZ_token","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MysteryBox","outputs":[{"internalType":"contract CBZ_token","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Seeds","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"uint256","name":"_score","type":"uint256"}],"name":"StakerInfo","outputs":[{"internalType":"uint256","name":"_cbzStaked","type":"uint256"},{"internalType":"uint256","name":"_seedsStaked","type":"uint256"},{"internalType":"uint256","name":"_mysteryBox","type":"uint256"},{"internalType":"uint256","name":"_fowers","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approveSpendERC20","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"buckStaker","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"bucksBURN","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"bucksEXCHANGE","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"from","type":"address[]"},{"internalType":"address[]","name":"to","type":"address[]"},{"internalType":"uint256[]","name":"amount","type":"uint256[]"}],"name":"bucksMOVE","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"bucksWITHDRAW","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnMysteryBox","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_staker","type":"address"},{"internalType":"uint256","name":"_score","type":"uint256"}],"name":"calculateGrowth","outputs":[{"internalType":"uint256","name":"_rewards","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"cbzStaked","outputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"},{"internalType":"uint256","name":"boxClaimed","type":"uint256"},{"internalType":"uint256","name":"flowersHarwested","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimMysteryBox","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"score","type":"uint256"},{"internalType":"uint256","name":"at","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"harvestFlowers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lastNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"tokenid","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"seedStaked","outputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"produced","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newValue","type":"uint256"}],"name":"setMaxCBZsPerSeed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newValue","type":"uint256"}],"name":"setMaxSeedPerCBZ","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newValue","type":"uint256"}],"name":"setMinimumHarvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newValue","type":"uint256"}],"name":"setSeedInterval","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newValue","type":"uint256"}],"name":"setSeedReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"stakedCBZs","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"stakedSeeds","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"stakers","outputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"cbzStaked","type":"uint256"},{"internalType":"uint256","name":"seedStaked","type":"uint256"},{"internalType":"uint256","name":"timeOfRegistration","type":"uint256"},{"internalType":"uint256","name":"timeOfLastBoxUpdate","type":"uint256"},{"internalType":"uint256","name":"timeOfLastGrowthUpdate","type":"uint256"},{"internalType":"uint256","name":"unclaimedMysteryBoxes","type":"uint256"},{"internalType":"uint256","name":"unclaimedFlowers","type":"uint256"},{"internalType":"uint256","name":"claimedMysteryBoxes","type":"uint256"},{"internalType":"uint256","name":"claimedFlowers","type":"uint256"},{"internalType":"uint256","name":"web2score","type":"uint256"},{"internalType":"uint256","name":"web2oas","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"stakersArray","outputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"staking_parameters","outputs":[{"internalType":"bool","name":"_escrowBUCK$","type":"bool"},{"internalType":"bool","name":"_stakingBUCK$","type":"bool"},{"internalType":"uint256","name":"_boxBurningCost","type":"uint256"},{"internalType":"uint256","name":"_boxInterval","type":"uint256"},{"internalType":"uint256","name":"_boxReward","type":"uint256"},{"internalType":"uint256","name":"_exchangeReward","type":"uint256"},{"internalType":"uint256","name":"_maxSeedPerCorner","type":"uint256"},{"internalType":"uint256","name":"_minimumHarvest","type":"uint256"},{"internalType":"uint256","name":"_seedInterval","type":"uint256"},{"internalType":"uint256","name":"_seedReward","type":"uint256"},{"internalType":"uint256","name":"_unclaimedReward","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"startGrowing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"stopGrowing","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":[{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"unstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
73607cb8bb818e80595a51f41c81feb8c82e04f1d6608052655af3107a400060055562278d00600655600160075560006008556101a4600955610120604052600d60e08190526c021a12d1029ba30b5b4b7339d1609d1b6101009081526200006b91600a91906200017e565b50604080518082019091526009808252682737ba1037bbb732b960b91b60209092019182526200009e91600b916200017e565b5060408051808201909152600c8082526b15dc9bdb99c8185b5bdd5b9d60a21b6020909201918252620000d291816200017e565b50600d805461ffff19169055655af3107a4000600e5560006013557385be9de7a369850a964616a2c04d79000d168dea60a0527314fc5036be2388e2c2ab8a80c86755ef1fcf6e0060c0526001601555600460168190556101a460175562015180601855600a601955620186a0601a81905562000150919062000224565b601b553480156200016057600080fd5b506001600055600480546001600160a01b0319163317905562000284565b8280546200018c9062000247565b90600052602060002090601f016020900481019282620001b05760008555620001fb565b82601f10620001cb57805160ff1916838001178555620001fb565b82800160010185558215620001fb579182015b82811115620001fb578251825591602001919060010190620001de565b50620002099291506200020d565b5090565b5b808211156200020957600081556001016200020e565b6000826200024257634e487b7160e01b600052601260045260246000fd5b500490565b600181811c908216806200025c57607f821691505b602082108114156200027e57634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a05160c051614535620002f36000396000818161048701528181610f270152818161160701528181611646015261233801526000818161081a01528181610c4801528181610c8801528181610e4f0152612ad30152600081816102a40152611b1d01526145356000f3fe6080604052600436106102255760003560e01c80637140655d11610123578063bc197c81116100ab578063e2ade6761161006f578063e2ade67614610902578063e449f34114610922578063eac885ba14610942578063eb8940de14610957578063f23a6e611461097757600080fd5b8063bc197c81146107d9578063bf03c66114610808578063c59d26461461083c578063cd277f4f1461085c578063d1d6ee191461086f57600080fd5b80639168ae72116100f25780639168ae721461066557806395a08087146107395780639b2e334e14610759578063b66255af14610779578063b72580f01461079957600080fd5b80637140655d1461058f5780637e681223146105af578063848247c8146105cf5780638588d57f1461064557600080fd5b806333859d4e116101b15780635e494d65116101755780635e494d6514610475578063662dc525146104a957806368890ec7146104c95780636f9d6288146104e95780637130c0d61461056f57600080fd5b806333859d4e146103d2578063435e9651146103ff57806352631ab41461041f57806352baa7c7146104355780635357e9161461045557600080fd5b806308aed0aa116101f857806308aed0aa146102fe5780630bf645ea1461031e5780630fbf0a9314610359578063150b7a02146103795780632e1a7d4d146103b257600080fd5b80630154993b1461022a57806301ffc9a71461024c5780630757e4941461029257806307c3a649146102de575b600080fd5b34801561023657600080fd5b5061024a610245366004613a03565b6109a4565b005b34801561025857600080fd5b5061027d610267366004613a1c565b6001600160e01b0319166301ffc9a760e01b1490565b60405190151581526020015b60405180910390f35b34801561029e57600080fd5b506102c67f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610289565b3480156102ea57600080fd5b5061024a6102f9366004613a5b565b610a03565b34801561030a57600080fd5b5061024a610319366004613a03565b610bcf565b34801561032a57600080fd5b5061034b610339366004613a87565b60126020526000908152604090205481565b604051908152602001610289565b34801561036557600080fd5b5061024a610374366004613b7a565b610c25565b34801561038557600080fd5b50610399610394366004613c00565b610e42565b6040516001600160e01b03199091168152602001610289565b3480156103be57600080fd5b5061024a6103cd366004613a03565b611015565b3480156103de57600080fd5b506103f26103ed366004613a87565b61108b565b6040516102899190613c73565b34801561040b57600080fd5b5061024a61041a366004613a03565b61123b565b34801561042b57600080fd5b5061034b60135481565b34801561044157600080fd5b5061024a610450366004613a03565b611500565b34801561046157600080fd5b506102c6610470366004613a03565b611556565b34801561048157600080fd5b506102c67f000000000000000000000000000000000000000000000000000000000000000081565b3480156104b557600080fd5b5061024a6104c4366004613a03565b611585565b3480156104d557600080fd5b5061024a6104e4366004613cfc565b6115db565b3480156104f557600080fd5b5061053d610504366004613a03565b601060205260009081526040902080546001820154600283015460038401546004909401546001600160a01b0390931693919290919085565b604080516001600160a01b0390961686526020860194909452928401919091526060830152608082015260a001610289565b34801561057b57600080fd5b5061024a61058a366004613d3e565b6117f7565b34801561059b57600080fd5b5061024a6105aa366004613a03565b611b93565b3480156105bb57600080fd5b5061027d6105ca366004613df0565b611be9565b3480156105db57600080fd5b5061061b6105ea366004613a03565b60116020526000908152604090208054600182015460028301546003909301546001600160a01b0390921692909184565b604080516001600160a01b0390951685526020850193909352918301526060820152608001610289565b34801561065157600080fd5b506103f2610660366004613a87565b611cb1565b34801561067157600080fd5b506106e0610680366004613a87565b600f60205280600052604060002060009150905080600001549080600101549080600201549080600301549080600401549080600501549080600601549080600701549080600801549080600901549080600a01549080600b015490508c565b604080519c8d5260208d019b909b52998b019890985260608a0196909652608089019490945260a088019290925260c087015260e086015261010085015261012084015261014083015261016082015261018001610289565b34801561074557600080fd5b5061034b610754366004613a5b565b611e59565b34801561076557600080fd5b506003546102c6906001600160a01b031681565b34801561078557600080fd5b5061024a610794366004613cfc565b612154565b3480156107a557600080fd5b506107b96107b4366004613a5b565b612440565b604080519485526020850193909352918301526060820152608001610289565b3480156107e557600080fd5b506103996107f4366004613e31565b63bc197c8160e01b98975050505050505050565b34801561081457600080fd5b506102c67f000000000000000000000000000000000000000000000000000000000000000081565b34801561084857600080fd5b506002546102c6906001600160a01b031681565b61024a61086a366004613a03565b61248d565b34801561087b57600080fd5b506108ad600d5460055460065460075460095460155460175460185460195460085460ff808b169a610100900416999a565b604080519b15158c5299151560208c0152988a01979097526060890195909552608088019390935260a087019190915260c086015260e085015261010084015261012083015261014082015261016001610289565b34801561090e57600080fd5b5061024a61091d366004613f54565b612653565b34801561092e57600080fd5b5061024a61093d366004613cfc565b61288d565b34801561094e57600080fd5b5061024a612bdf565b34801561096357600080fd5b5061024a610972366004613a03565b612e28565b34801561098357600080fd5b50610399610992366004613fdc565b63f23a6e6160e01b9695505050505050565b6004546040516001600160a01b039091163314906109c790600a906020016140f2565b604051602081830303815290604052906109fd5760405162461bcd60e51b81526004016109f4919061412b565b60405180910390fd5b50601755565b600d5460405161010090910460ff161590610a2390600a90602001614180565b60405160208183030381529060405290610a505760405162461bcd60e51b81526004016109f4919061412b565b50610a59612fce565b604051336001600160a01b0384161490610a7b90600a90600b906020016141ac565b60405160208183030381529060405290610aa85760405162461bcd60e51b81526004016109f4919061412b565b508060126000846001600160a01b03166001600160a01b031681526020019081526020016000205411600a600c604051602001610ae69291906141ac565b60405160208183030381529060405290610b135760405162461bcd60e51b81526004016109f4919061412b565b50600354604051637921219560e11b81523060048201526001600160a01b0384811660248301526000604483018190526064830185905260a0608484015260a48301529091169063f242432a9060c401600060405180830381600087803b158015610b7d57600080fd5b505af1158015610b91573d6000803e3d6000fd5b505050506001600160a01b03821660009081526012602052604081208054839290610bbd9084906141d7565b909155505060016000555050565b5050565b6004546040516001600160a01b03909116331490610bf290600a906020016140f2565b60405160208183030381529060405290610c1f5760405162461bcd60e51b81526004016109f4919061412b565b50601655565b610c2d612fce565b610c3633613028565b805160005b81811015610df657610c867f0000000000000000000000000000000000000000000000000000000000000000848381518110610c7957610c796141ee565b6020026020010151613278565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166323b872dd3330868581518110610cc957610cc96141ee565b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b158015610d2357600080fd5b505af1158015610d37573d6000803e3d6000fd5b505050503360106000858481518110610d5257610d526141ee565b6020026020010151815260200190815260200160002060000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055504260106000858481518110610da657610da66141ee565b6020026020010151815260200190815260200160002060010181905550610de633848381518110610dd957610dd96141ee565b6020026020010151613334565b610def81614204565b9050610c3b565b50336000908152600f602052604081206001018054839290610e1990849061421f565b9091555050336000908152600f602052604090204260049091015550610e3f6001600055565b50565b6000336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161415610f1c576001600160a01b0385166000908152600f60205260408120600a0155610e9a85613028565b600084815260106020908152604080832080546001600160a01b0319166001600160a01b038a169081178255426001928301558452600f90925282208101805491929091610ee990849061421f565b90915550506001600160a01b0385166000908152600f6020526040902042600490910155610f178585613334565b611002565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016141561100257610f5885600161340a565b6001600160a01b0385166000908152600f60205260408120600a0155610f7d85613028565b600084815260116020908152604080832080546001600160a01b0319166001600160a01b038a169081178255426001928301558452600f9092528220600201805491929091610fcd90849061421f565b90915550506001600160a01b0385166000908152600f6020526040902042600482018190556005909101556110028585613477565b50630a85bd0160e11b5b95945050505050565b6004546040516001600160a01b0390911633149061103890600a906020016140f2565b604051602081830303815290604052906110655760405162461bcd60e51b81526004016109f4919061412b565b50604051339082156108fc029083906000818181858888f19350505050610e3f57600080fd5b6001600160a01b0381166000908152600f6020526040812054606091906110b4906001906141d7565b90506000600182815481106110cb576110cb6141ee565b90600052602060002090600302016002018054905067ffffffffffffffff8111156110f8576110f8613aa4565b604051908082528060200260200182016040528015611121578160200160208202803683370190505b50905060005b6001838154811061113a5761113a6141ee565b90600052602060002090600302016002018054905081101561123357846001600160a01b03166011600060018681548110611177576111776141ee565b90600052602060002090600302016002018481548110611199576111996141ee565b600091825260208083209091015483528201929092526040019020546001600160a01b0316141561122357600183815481106111d7576111d76141ee565b906000526020600020906003020160020181815481106111f9576111f96141ee565b9060005260206000200154828281518110611216576112166141ee565b6020026020010181815250505b61122c81614204565b9050611127565b509392505050565b611243612fce565b600d54610100900460ff16158061127c57506004546001600160a01b03163314801561127c5750600d5460ff6101009091041615156001145b600a60405160200161128e9190614237565b604051602081830303815290604052906112bb5760405162461bcd60e51b81526004016109f4919061412b565b506004546001600160a01b031633141561137c57600e5433906108fc906112e2908461425e565b6040518115909202916000818181858888f1935050505061130257600080fd5b600d5460ff1615156001141561137757600354604051632770a7eb60e21b8152306004820152602481018390526001600160a01b0390911690639dc29fac90604401600060405180830381600087803b15801561135e57600080fd5b505af1158015611372573d6000803e3d6000fd5b505050505b6114f6565b3360009081526012602090815260409182902054915191831115916113a791600a91600c91016141ac565b604051602081830303815290604052906113d45760405162461bcd60e51b81526004016109f4919061412b565b50600060026009546113e69190614293565b6113f261271084614293565b6113fc919061425e565b600e5490915033906108fc9061141284866141d7565b61141c919061425e565b6040518115909202916000818181858888f1935050505061143c57600080fd5b336000908152601260205260408120805484929061145b9084906141d7565b90915550506009546008805460009061147590849061421f565b90915550506003546001600160a01b0316639dc29fac3061149684866141d7565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156114dc57600080fd5b505af11580156114f0573d6000803e3d6000fd5b50505050505b610e3f6001600055565b6004546040516001600160a01b0390911633149061152390600a906020016140f2565b604051602081830303815290604052906115505760405162461bcd60e51b81526004016109f4919061412b565b50601955565b6001818154811061156657600080fd5b60009182526020909120600390910201546001600160a01b0316905081565b6004546040516001600160a01b039091163314906115a890600a906020016140f2565b604051602081830303815290604052906115d55760405162461bcd60e51b81526004016109f4919061412b565b50601555565b6115e3612fce565b806115ee338261340a565b6115f733613028565b60005b818110156117ae576116447f0000000000000000000000000000000000000000000000000000000000000000858584818110611638576116386141ee565b90506020020135613278565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166323b872dd3330878786818110611687576116876141ee565b6040516001600160e01b031960e088901b1681526001600160a01b03958616600482015294909316602485015250602090910201356044820152606401600060405180830381600087803b1580156116de57600080fd5b505af11580156116f2573d6000803e3d6000fd5b50505050336011600086868581811061170d5761170d6141ee565b90506020020135815260200190815260200160002060000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055504260116000868685818110611760576117606141ee565b9050602002013581526020019081526020016000206001018190555061179e33858584818110611792576117926141ee565b90506020020135613477565b6117a781614204565b90506115fa565b50336000908152600f6020526040812060020180548392906117d190849061421f565b9091555050336000908152600f602052604090204260059091015550610bcb6001600055565b6117ff612fce565b336000908152600f602052604081206007810154909190611820908261421f565b600283015490915015611a58576000826002015461183e3389611e59565b6118489190614293565b9050600080600180866000015461185f91906141d7565b8154811061186f5761186f6141ee565b6000918252602090912060026003909202010154905088156118e757611894876135cb565b6004546118ad906001600160a01b03168a8a8a8a613658565b6118e75760405162461bcd60e51b815260206004820152600b60248201526a139bdd08185b1b1bddd95960aa1b60448201526064016109f4565b8885600a01819055508885600b016000828254611904919061421f565b909155505042600586015560005b81811015611a53576000601160006001808a6000015461193291906141d7565b81548110611942576119426141ee565b90600052602060002090600302016002018481548110611964576119646141ee565b60009182526020808320909101548352820192909252604001902080549091506001600160a01b0316331415611a4257601b548160020154601a546119a991906141d7565b601a546119b691906141d7565b6119c09190614293565b6119cb90600161421f565b6119d59086614293565b9350601a548482600201546119ea919061421f565b1015611a1b5783816002016000828254611a04919061421f565b90915550611a149050848761421f565b9550611a42565b8060020154601a54611a2d91906141d7565b611a37908761421f565b601a54600283015595505b50611a4c81614204565b9050611912565b505050505b60008111600a604051602001611a6e91906142b5565b60405160208183030381529060405290611a9b5760405162461bcd60e51b81526004016109f4919061412b565b506017548111600a604051602001611ab391906142ee565b60405160208183030381529060405290611ae05760405162461bcd60e51b81526004016109f4919061412b565b5080826009016000828254611af5919061421f565b9091555050600060078301556040516340c10f1960e01b8152336004820152602481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906340c10f1990604401600060405180830381600087803b158015611b6957600080fd5b505af1158015611b7d573d6000803e3d6000fd5b505050505050611b8d6001600055565b50505050565b6004546040516001600160a01b03909116331490611bb690600a906020016140f2565b60405160208183030381529060405290611be35760405162461bcd60e51b81526004016109f4919061412b565b50601855565b6004546040516000916001600160a01b0316331490611c0d90600a906020016140f2565b60405160208183030381529060405290611c3a5760405162461bcd60e51b81526004016109f4919061412b565b5060405163095ea7b360e01b81526001600160a01b0384811660048301526024820184905285919082169063095ea7b3906044016020604051808303816000875af1158015611c8d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061100c9190614318565b6001600160a01b0381166000908152600f602052604081205460609190611cda906001906141d7565b9050600060018281548110611cf157611cf16141ee565b90600052602060002090600302016001018054905067ffffffffffffffff811115611d1e57611d1e613aa4565b604051908082528060200260200182016040528015611d47578160200160208202803683370190505b50905060005b60018381548110611d6057611d606141ee565b90600052602060002090600302016001018054905081101561123357846001600160a01b03166010600060018681548110611d9d57611d9d6141ee565b90600052602060002090600302016001018481548110611dbf57611dbf6141ee565b600091825260208083209091015483528201929092526040019020546001600160a01b03161415611e495760018381548110611dfd57611dfd6141ee565b90600052602060002090600302016001018181548110611e1f57611e1f6141ee565b9060005260206000200154828281518110611e3c57611e3c6141ee565b6020026020010181815250505b611e5281614204565b9050611d4d565b6001600160a01b0382166000908152600f6020908152604080832081516101808101835281548152600182015493810184905260028201549281018390526003820154606082015260048201546080820152600582015460a0820152600682015460c0820152600782015460e082015260088201546101008201526009820154610120820152600a820154610140820152600b90910154610160820152918391611f039190613712565b905060006002611f138184614293565b601954611f20908561425e565b611f2a919061421f565b611f3590606461425e565b611f3f9190614293565b90506000611f4e606483614293565b90506000606485604001518884611f65919061425e565b611f6f908661421f565b611f799190614293565b611f839190614293565b9050600060018660000151611f9891906141d7565b90506000805b60018381548110611fb157611fb16141ee565b90600052602060002090600302016002018054905081101561210c5760006011600060018681548110611fe657611fe66141ee565b90600052602060002090600302016002018481548110612008576120086141ee565b600091825260208083209091015483528281019390935260409182019020815160808101835281546001600160a01b03908116808352600184015495830195909552600283015493820193909352600390910154606082015292508d1614156120fb576000601b548260400151601a5461208291906141d7565b601a5461208f91906141d7565b6120999190614293565b6120a490600161421f565b6120ae9087614293565b9050601a548183604001516120c3919061421f565b10156120da576120d3818561421f565b93506120f9565b8160400151601a546120ec91906141d7565b6120f6908561421f565b93505b505b5061210581614204565b9050611f9e565b506018548188604001518960a001514261212691906141d7565b612130919061425e565b61213a919061425e565b6121449190614293565b9750505050505050505b92915050565b61215c612fce565b336000908152600f602090815260409182902060028101549251909215159161218891600a910161433a565b604051602081830303815290604052906121b55760405162461bcd60e51b81526004016109f4919061412b565b506000600a82018190558281816121cc3383611e59565b6121d69190614293565b90506000805b838110156123f2576000601160008a8a858181106121fc576121fc6141ee565b60209081029290920135835250818101929092526040908101600020805491519093506001600160a01b039190911633149161223e91600a91600b91016141ac565b6040516020818303038152906040529061226b5760405162461bcd60e51b81526004016109f4919061412b565b5080546001600160a01b0319168155601b546002820154601a5461228f91906141d7565b601a5461229c91906141d7565b6122a69190614293565b6122b190600161421f565b6122bb9085614293565b9250601a548382600201546122d0919061421f565b101561230157828160020160008282546122ea919061421f565b909155506122fa9050838761421f565b9550612328565b8060020154601a5461231391906141d7565b61231d908761421f565b601a54600283015595505b4260038201556001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166323b872dd30338c8c87818110612371576123716141ee565b6040516001600160e01b031960e088901b1681526001600160a01b03958616600482015294909316602485015250602090910201356044820152606401600060405180830381600087803b1580156123c857600080fd5b505af11580156123dc573d6000803e3d6000fd5b5050505050806123eb90614204565b90506121dc565b5083856007016000828254612407919061421f565b925050819055508285600201600082825461242291906141d7565b9091555050426005909501949094555050600160005550610bcb9050565b6001600160a01b0382166000908152600f6020526040812060018101546002909101548291829182919061247388613734565b61247d89896137ab565b9299919850965090945092505050565b600d5460405161010090910460ff1615906124ad90600a90602001614180565b604051602081830303815290604052906124da5760405162461bcd60e51b81526004016109f4919061412b565b506124e3612fce565b6000816005546124f3919061425e565b905080341015600a60405160200161250b9190614373565b604051602081830303815290604052906125385760405162461bcd60e51b81526004016109f4919061412b565b50600254604051632770a7eb60e21b8152336004820152602481018490526001600160a01b0390911690639dc29fac90604401600060405180830381600087803b15801561258557600080fd5b505af1158015612599573d6000803e3d6000fd5b50505050600e54816125ab9190614293565b600d5490915060ff16151560011415612648576003546040516340c10f1960e01b8152306004820152602481018390526001600160a01b03909116906340c10f1990604401600060405180830381600087803b15801561260a57600080fd5b505af115801561261e573d6000803e3d6000fd5b5050336000908152601260205260408120805485945090925061264290849061421f565b90915550505b50610e3f6001600055565b6004546040516001600160a01b0390911633149061267690600a906020016140f2565b604051602081830303815290604052906126a35760405162461bcd60e51b81526004016109f4919061412b565b50600d5460405160ff610100909204919091161515600114906126cb90600a906020016143ac565b604051602081830303815290604052906126f85760405162461bcd60e51b81526004016109f4919061412b565b5060005b8351811015611b8d57818181518110612717576127176141ee565b602002602001015160126000868481518110612735576127356141ee565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000205411600a600c6040516020016127749291906141ac565b604051602081830303815290604052906127a15760405162461bcd60e51b81526004016109f4919061412b565b508181815181106127b4576127b46141ee565b6020026020010151601260008684815181106127d2576127d26141ee565b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020600082825461280991906141d7565b92505081905550818181518110612822576128226141ee565b602002602001015160126000858481518110612840576128406141ee565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000206000828254612877919061421f565b90915550612886905081614204565b90506126fc565b612895612fce565b336000908152600f602090815260409182902060010154915183921515916128c091600a91016143e5565b604051602081830303815290604052906128ed5760405162461bcd60e51b81526004016109f4919061412b565b50336000908152600f602052604090206001015461290c9082906141d7565b600f6000336001600160a01b03166001600160a01b03168152602001908152602001600020600201541115600a604051602001612949919061441e565b604051602081830303815290604052906129765760405162461bcd60e51b81526004016109f4919061412b565b50600061298233613824565b336000908152600f60205260408120600601805492935083929091906129a990849061421f565b90915550600090505b82811015612b945733601060008787858181106129d1576129d16141ee565b90506020020135815260200190815260200160002060000160009054906101000a90046001600160a01b03166001600160a01b031614600a600b604051602001612a1c9291906141ac565b60405160208183030381529060405290612a495760405162461bcd60e51b81526004016109f4919061412b565b50600060106000878785818110612a6257612a626141ee565b90506020020135815260200190815260200160002060000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055504260106000878785818110612ab557612ab56141ee565b905060200201358152602001908152602001600020600201819055507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166323b872dd3033888886818110612b1457612b146141ee565b6040516001600160e01b031960e088901b1681526001600160a01b03958616600482015294909316602485015250602090910201356044820152606401600060405180830381600087803b158015612b6b57600080fd5b505af1158015612b7f573d6000803e3d6000fd5b5050505080612b8d90614204565b90506129b2565b50336000908152600f602052604081206001018054849290612bb79084906141d7565b9091555050336000908152600f602052604090204260049091015550610bcb90506001600055565b612be7612fce565b336000818152600f60205260408120600601549091612c0590613824565b612c0f919061421f565b905060008111600a604051602001612c279190614457565b60405160208183030381529060405290612c545760405162461bcd60e51b81526004016109f4919061412b565b50336000908152600f60205260408120600101548281612c7657612c7661427d565b336000908152600f60205260408120426004820155600881018054870190556006810182905554929091049250600019909101905b60018281548110612cbe57612cbe6141ee565b906000526020600020906003020160010180549050811015612db457336001600160a01b03166010600060018581548110612cfb57612cfb6141ee565b90600052602060002090600302016001018481548110612d1d57612d1d6141ee565b600091825260208083209091015483528201929092526040019020546001600160a01b03161415612dac57826010600060018581548110612d6057612d606141ee565b90600052602060002090600302016001018481548110612d8257612d826141ee565b90600052602060002001548152602001908152602001600020600301600082825401925050819055505b600101612cab565b50506002546040516340c10f1960e01b8152336004820152602481018490526001600160a01b0390911691506340c10f1990604401600060405180830381600087803b158015612e0357600080fd5b505af1158015612e17573d6000803e3d6000fd5b5050505050612e266001600055565b565b612e30612fce565b600354604051627eeac760e11b81523360048201526000602482015282916001600160a01b03169062fdd58e90604401602060405180830381865afa158015612e7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ea19190614490565b1015600a600c604051602001612eb89291906141ac565b60405160208183030381529060405290612ee55760405162461bcd60e51b81526004016109f4919061412b565b50600954600090612ef861271084614293565b612f02919061425e565b6003549091506001600160a01b0316639dc29fac33612f2184866141d7565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015612f6757600080fd5b505af1158015612f7b573d6000803e3d6000fd5b5050600e543392506108fc9150612f9284866141d7565b612f9c919061425e565b6040518115909202916000818181858888f19350505050612fbc57600080fd5b8060086000828254612642919061421f565b600260005414156130215760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016109f4565b6002600055565b6001600160a01b0381166000908152600f6020526040902080546130ac5760018054810180825560008290528391906130629082906141d7565b81548110613072576130726141ee565b6000918252602090912060039182020180546001600160a01b0319166001600160a01b039390931692909217909155429082015560015481555b6001810154156130d8576130bf82613824565b8160060160008282546130d2919061421f565b90915550505b600281015415610bcb5760008082600201546130f5856000611e59565b6130ff9190614293565b90506000805b846002015481101561324e57600060116000600180896000015461312991906141d7565b81548110613139576131396141ee565b9060005260206000209060030201600201848154811061315b5761315b6141ee565b60009182526020808320909101548352820192909252604001902080549091506001600160a01b03908116908816141561323d57601b548160020154601a546131a491906141d7565b601a546131b191906141d7565b6131bb9190614293565b6131c690600161421f565b6131d09085614293565b9250601a548382600201546131e5919061421f565b101561321657828160020160008282546131ff919061421f565b9091555061320f9050838661421f565b945061323d565b8060020154601a5461322891906141d7565b613232908661421f565b601a54600283015594505b5061324781614204565b9050613105565b504284600501819055508284600701600082825461326c919061421f565b90915550505050505050565b6040516331a9108f60e11b81526004810182905233906001600160a01b03841690636352211e90602401602060405180830381865afa1580156132bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132e391906144a9565b6001600160a01b031614600a600b6040516020016133029291906141ac565b6040516020818303038152906040529061332f5760405162461bcd60e51b81526004016109f4919061412b565b505050565b6001600160a01b0382166000908152600f6020526040812054819060019061335d9082906141d7565b8154811061336d5761336d6141ee565b9060005260206000209060030201905060005b60018201548110156133cc57838260010182815481106133a2576133a26141ee565b906000526020600020015414156133bc57600192506133cc565b6133c581614204565b9050613380565b5081611b8d57600180820180549182018082556000829052859190839081106133f7576133f76141ee565b6000918252602090912001555050505050565b6134156001826141d7565b6001600160a01b0383166000908152600f602052604090206002015461343b919061421f565b6015546001600160a01b0384166000908152600f6020526040902060010154613464919061425e565b11600a60405160200161330291906144c6565b6001600160a01b0382166000908152600f6020526040812054819061349e906001906141d7565b905060005b600182815481106134b6576134b66141ee565b9060005260206000209060030201600201805490508110156135325783600183815481106134e6576134e66141ee565b90600052602060002090600302016002018281548110613508576135086141ee565b906000526020600020015414156135225760019250613532565b61352b81614204565b90506134a3565b5081611b8d5760006001828154811061354d5761354d6141ee565b906000526020600020906003020160020180549050905060018281548110613577576135776141ee565b60009182526020822060026003909202010180546001908101825591528054859190849081106135a9576135a96141ee565b906000526020600020906003020160020182815481106133f7576133f76141ee565b60008181526014602052604090205460ff166001141561362d5760405162461bcd60e51b815260206004820152601260248201527f4e6f6e636520616c72656164792055736564000000000000000000000000000060448201526064016109f4565b60135481111561363d5760138190555b6000908152601460205260409020805460ff19166001179055565b600042613668856201518061421f565b111561370a576040805160208082018890528183018790526060808301879052835180840390910181526080830184528051908201207f19457468657265756d205369676e6564204d6573736167653a0a33320000000060a084015260bc8084018290528451808503909101815260dc9093019093528151910120876001600160a01b03166136f78286613910565b6001600160a01b0316149250505061100c565b50600061100c565b600061371e8284614293565b905060165481111561214e575060165492915050565b6001600160a01b0381166000908152600f602052604081206001015461377357506001600160a01b03166000908152600f602052604090206006015490565b600061377e83613824565b6001600160a01b0384166000908152600f60205260409020600601546137a4919061421f565b9392505050565b6001600160a01b0382166000908152600f60205260408120600201546137ed57506001600160a01b0382166000908152600f602052604090206007015461214e565b6137f78383611e59565b6001600160a01b0384166000908152600f602052604090206007015461381d919061421f565b905061214e565b6002546000906001600160a01b031661383f57506000919050565b6001600160a01b0382166000908152600f602090815260409182902082516101808101845281548152600182015492810183905260028201549381019390935260038101546060840152600481015460808401819052600582015460a085015260068083015460c086015260078084015460e087015260088401546101008701526009840154610120870152600a840154610140870152600b909301546101608601525491549192906138f290426141d7565b6138fc919061425e565b613906919061425e565b6137a49190614293565b60008060008061391f8561398f565b6040805160008152602081018083528b905260ff8316918101919091526060810184905260808101839052929550909350915060019060a0016020604051602081039080840390855afa15801561397a573d6000803e3d6000fd5b5050604051601f190151979650505050505050565b600080600083516041146139e55760405162461bcd60e51b815260206004820152601860248201527f696e76616c6964207369676e6174757265206c656e677468000000000000000060448201526064016109f4565b50505060208101516040820151606090920151909260009190911a90565b600060208284031215613a1557600080fd5b5035919050565b600060208284031215613a2e57600080fd5b81356001600160e01b0319811681146137a457600080fd5b6001600160a01b0381168114610e3f57600080fd5b60008060408385031215613a6e57600080fd5b8235613a7981613a46565b946020939093013593505050565b600060208284031215613a9957600080fd5b81356137a481613a46565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715613ae357613ae3613aa4565b604052919050565b600067ffffffffffffffff821115613b0557613b05613aa4565b5060051b60200190565b600082601f830112613b2057600080fd5b81356020613b35613b3083613aeb565b613aba565b82815260059290921b84018101918181019086841115613b5457600080fd5b8286015b84811015613b6f5780358352918301918301613b58565b509695505050505050565b600060208284031215613b8c57600080fd5b813567ffffffffffffffff811115613ba357600080fd5b613baf84828501613b0f565b949350505050565b60008083601f840112613bc957600080fd5b50813567ffffffffffffffff811115613be157600080fd5b602083019150836020828501011115613bf957600080fd5b9250929050565b600080600080600060808688031215613c1857600080fd5b8535613c2381613a46565b94506020860135613c3381613a46565b935060408601359250606086013567ffffffffffffffff811115613c5657600080fd5b613c6288828901613bb7565b969995985093965092949392505050565b6020808252825182820181905260009190848201906040850190845b81811015613cab57835183529284019291840191600101613c8f565b50909695505050505050565b60008083601f840112613cc957600080fd5b50813567ffffffffffffffff811115613ce157600080fd5b6020830191508360208260051b8501011115613bf957600080fd5b60008060208385031215613d0f57600080fd5b823567ffffffffffffffff811115613d2657600080fd5b613d3285828601613cb7565b90969095509350505050565b60008060008060808587031215613d5457600080fd5b84359350602080860135935060408601359250606086013567ffffffffffffffff80821115613d8257600080fd5b818801915088601f830112613d9657600080fd5b813581811115613da857613da8613aa4565b613dba601f8201601f19168501613aba565b91508082528984828501011115613dd057600080fd5b808484018584013760008482840101525080935050505092959194509250565b600080600060608486031215613e0557600080fd5b8335613e1081613a46565b92506020840135613e2081613a46565b929592945050506040919091013590565b60008060008060008060008060a0898b031215613e4d57600080fd5b8835613e5881613a46565b97506020890135613e6881613a46565b9650604089013567ffffffffffffffff80821115613e8557600080fd5b613e918c838d01613cb7565b909850965060608b0135915080821115613eaa57600080fd5b613eb68c838d01613cb7565b909650945060808b0135915080821115613ecf57600080fd5b50613edc8b828c01613bb7565b999c989b5096995094979396929594505050565b600082601f830112613f0157600080fd5b81356020613f11613b3083613aeb565b82815260059290921b84018101918181019086841115613f3057600080fd5b8286015b84811015613b6f578035613f4781613a46565b8352918301918301613f34565b600080600060608486031215613f6957600080fd5b833567ffffffffffffffff80821115613f8157600080fd5b613f8d87838801613ef0565b94506020860135915080821115613fa357600080fd5b613faf87838801613ef0565b93506040860135915080821115613fc557600080fd5b50613fd286828701613b0f565b9150509250925092565b60008060008060008060a08789031215613ff557600080fd5b863561400081613a46565b9550602087013561401081613a46565b94506040870135935060608701359250608087013567ffffffffffffffff81111561403a57600080fd5b61404689828a01613bb7565b979a9699509497509295939492505050565b8054600090600181811c908083168061407257607f831692505b602080841082141561409457634e487b7160e01b600052602260045260246000fd5b8180156140a857600181146140b9576140e6565b60ff198616895284890196506140e6565b60008881526020902060005b868110156140de5781548b8201529085019083016140c5565b505084890196505b50505050505092915050565b60006140fe8284614058565b7f4f6e6c792043726561746f722046756e6374696f6e000000000000000000000081526015019392505050565b600060208083528351808285015260005b818110156141585785810183015185820160400152820161413c565b8181111561416a576000604083870101525b50601f01601f1916929092016040019392505050565b600061418c8284614058565b6f213ab1b5b99029ba30b5b4b73397171760811b81526010019392505050565b6000613baf6141bb8386614058565b84614058565b634e487b7160e01b600052601160045260246000fd5b6000828210156141e9576141e96141c1565b500390565b634e487b7160e01b600052603260045260246000fd5b6000600019821415614218576142186141c1565b5060010190565b60008219821115614232576142326141c1565b500190565b60006142438284614058565b6a4e6f7420706f7369626c6560a81b8152600b019392505050565b6000816000190483118215151615614278576142786141c1565b500290565b634e487b7160e01b600052601260045260246000fd5b6000826142b057634e487b7160e01b600052601260045260246000fd5b500490565b60006142c18284614058565b7f4e6f20466c6f7765722420746f2068617276657374000000000000000000000081526015019392505050565b60006142fa8284614058565b6d43726f70206e6f7420726561647960901b8152600e019392505050565b60006020828403121561432a57600080fd5b815180151581146137a457600080fd5b60006143468284614058565b7f596f752068617665206e6f20536565642067726f77696e67000000000000000081526018019392505050565b600061437f8284614058565b7f4e656564206d6f726520646f75676820746f206275726e00000000000000000081526017019392505050565b60006143b88284614058565b7f4e6f74207374616b696e672063757272656e746c79000000000000000000000081526015019392505050565b60006143f18284614058565b7f596f752068617665206e6f20436f726e6572426f797a207374616b65640000008152601d019392505050565b600061442a8284614058565b7f506c732073746f7047726f77696e6720796f757220736565647320666972737481526020019392505050565b60006144638284614058565b7f4e6f204d797374657279426f7820746f20636c61696d0000000000000000000081526016019392505050565b6000602082840312156144a257600080fd5b5051919050565b6000602082840312156144bb57600080fd5b81516137a481613a46565b60006144d28284614058565b7f4e6f7420656e6f75676820436f726e6572426f797a207374616b6564000000008152601c01939250505056fea26469706673582212207e72c89e0e96d2ceec57ac5530baefa984810254faec23164feb52a506cafcc564736f6c634300080c0033
Deployed Bytecode
0x6080604052600436106102255760003560e01c80637140655d11610123578063bc197c81116100ab578063e2ade6761161006f578063e2ade67614610902578063e449f34114610922578063eac885ba14610942578063eb8940de14610957578063f23a6e611461097757600080fd5b8063bc197c81146107d9578063bf03c66114610808578063c59d26461461083c578063cd277f4f1461085c578063d1d6ee191461086f57600080fd5b80639168ae72116100f25780639168ae721461066557806395a08087146107395780639b2e334e14610759578063b66255af14610779578063b72580f01461079957600080fd5b80637140655d1461058f5780637e681223146105af578063848247c8146105cf5780638588d57f1461064557600080fd5b806333859d4e116101b15780635e494d65116101755780635e494d6514610475578063662dc525146104a957806368890ec7146104c95780636f9d6288146104e95780637130c0d61461056f57600080fd5b806333859d4e146103d2578063435e9651146103ff57806352631ab41461041f57806352baa7c7146104355780635357e9161461045557600080fd5b806308aed0aa116101f857806308aed0aa146102fe5780630bf645ea1461031e5780630fbf0a9314610359578063150b7a02146103795780632e1a7d4d146103b257600080fd5b80630154993b1461022a57806301ffc9a71461024c5780630757e4941461029257806307c3a649146102de575b600080fd5b34801561023657600080fd5b5061024a610245366004613a03565b6109a4565b005b34801561025857600080fd5b5061027d610267366004613a1c565b6001600160e01b0319166301ffc9a760e01b1490565b60405190151581526020015b60405180910390f35b34801561029e57600080fd5b506102c67f000000000000000000000000607cb8bb818e80595a51f41c81feb8c82e04f1d681565b6040516001600160a01b039091168152602001610289565b3480156102ea57600080fd5b5061024a6102f9366004613a5b565b610a03565b34801561030a57600080fd5b5061024a610319366004613a03565b610bcf565b34801561032a57600080fd5b5061034b610339366004613a87565b60126020526000908152604090205481565b604051908152602001610289565b34801561036557600080fd5b5061024a610374366004613b7a565b610c25565b34801561038557600080fd5b50610399610394366004613c00565b610e42565b6040516001600160e01b03199091168152602001610289565b3480156103be57600080fd5b5061024a6103cd366004613a03565b611015565b3480156103de57600080fd5b506103f26103ed366004613a87565b61108b565b6040516102899190613c73565b34801561040b57600080fd5b5061024a61041a366004613a03565b61123b565b34801561042b57600080fd5b5061034b60135481565b34801561044157600080fd5b5061024a610450366004613a03565b611500565b34801561046157600080fd5b506102c6610470366004613a03565b611556565b34801561048157600080fd5b506102c67f00000000000000000000000014fc5036be2388e2c2ab8a80c86755ef1fcf6e0081565b3480156104b557600080fd5b5061024a6104c4366004613a03565b611585565b3480156104d557600080fd5b5061024a6104e4366004613cfc565b6115db565b3480156104f557600080fd5b5061053d610504366004613a03565b601060205260009081526040902080546001820154600283015460038401546004909401546001600160a01b0390931693919290919085565b604080516001600160a01b0390961686526020860194909452928401919091526060830152608082015260a001610289565b34801561057b57600080fd5b5061024a61058a366004613d3e565b6117f7565b34801561059b57600080fd5b5061024a6105aa366004613a03565b611b93565b3480156105bb57600080fd5b5061027d6105ca366004613df0565b611be9565b3480156105db57600080fd5b5061061b6105ea366004613a03565b60116020526000908152604090208054600182015460028301546003909301546001600160a01b0390921692909184565b604080516001600160a01b0390951685526020850193909352918301526060820152608001610289565b34801561065157600080fd5b506103f2610660366004613a87565b611cb1565b34801561067157600080fd5b506106e0610680366004613a87565b600f60205280600052604060002060009150905080600001549080600101549080600201549080600301549080600401549080600501549080600601549080600701549080600801549080600901549080600a01549080600b015490508c565b604080519c8d5260208d019b909b52998b019890985260608a0196909652608089019490945260a088019290925260c087015260e086015261010085015261012084015261014083015261016082015261018001610289565b34801561074557600080fd5b5061034b610754366004613a5b565b611e59565b34801561076557600080fd5b506003546102c6906001600160a01b031681565b34801561078557600080fd5b5061024a610794366004613cfc565b612154565b3480156107a557600080fd5b506107b96107b4366004613a5b565b612440565b604080519485526020850193909352918301526060820152608001610289565b3480156107e557600080fd5b506103996107f4366004613e31565b63bc197c8160e01b98975050505050505050565b34801561081457600080fd5b506102c67f00000000000000000000000085be9de7a369850a964616a2c04d79000d168dea81565b34801561084857600080fd5b506002546102c6906001600160a01b031681565b61024a61086a366004613a03565b61248d565b34801561087b57600080fd5b506108ad600d5460055460065460075460095460155460175460185460195460085460ff808b169a610100900416999a565b604080519b15158c5299151560208c0152988a01979097526060890195909552608088019390935260a087019190915260c086015260e085015261010084015261012083015261014082015261016001610289565b34801561090e57600080fd5b5061024a61091d366004613f54565b612653565b34801561092e57600080fd5b5061024a61093d366004613cfc565b61288d565b34801561094e57600080fd5b5061024a612bdf565b34801561096357600080fd5b5061024a610972366004613a03565b612e28565b34801561098357600080fd5b50610399610992366004613fdc565b63f23a6e6160e01b9695505050505050565b6004546040516001600160a01b039091163314906109c790600a906020016140f2565b604051602081830303815290604052906109fd5760405162461bcd60e51b81526004016109f4919061412b565b60405180910390fd5b50601755565b600d5460405161010090910460ff161590610a2390600a90602001614180565b60405160208183030381529060405290610a505760405162461bcd60e51b81526004016109f4919061412b565b50610a59612fce565b604051336001600160a01b0384161490610a7b90600a90600b906020016141ac565b60405160208183030381529060405290610aa85760405162461bcd60e51b81526004016109f4919061412b565b508060126000846001600160a01b03166001600160a01b031681526020019081526020016000205411600a600c604051602001610ae69291906141ac565b60405160208183030381529060405290610b135760405162461bcd60e51b81526004016109f4919061412b565b50600354604051637921219560e11b81523060048201526001600160a01b0384811660248301526000604483018190526064830185905260a0608484015260a48301529091169063f242432a9060c401600060405180830381600087803b158015610b7d57600080fd5b505af1158015610b91573d6000803e3d6000fd5b505050506001600160a01b03821660009081526012602052604081208054839290610bbd9084906141d7565b909155505060016000555050565b5050565b6004546040516001600160a01b03909116331490610bf290600a906020016140f2565b60405160208183030381529060405290610c1f5760405162461bcd60e51b81526004016109f4919061412b565b50601655565b610c2d612fce565b610c3633613028565b805160005b81811015610df657610c867f00000000000000000000000085be9de7a369850a964616a2c04d79000d168dea848381518110610c7957610c796141ee565b6020026020010151613278565b7f00000000000000000000000085be9de7a369850a964616a2c04d79000d168dea6001600160a01b03166323b872dd3330868581518110610cc957610cc96141ee565b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b158015610d2357600080fd5b505af1158015610d37573d6000803e3d6000fd5b505050503360106000858481518110610d5257610d526141ee565b6020026020010151815260200190815260200160002060000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055504260106000858481518110610da657610da66141ee565b6020026020010151815260200190815260200160002060010181905550610de633848381518110610dd957610dd96141ee565b6020026020010151613334565b610def81614204565b9050610c3b565b50336000908152600f602052604081206001018054839290610e1990849061421f565b9091555050336000908152600f602052604090204260049091015550610e3f6001600055565b50565b6000336001600160a01b037f00000000000000000000000085be9de7a369850a964616a2c04d79000d168dea161415610f1c576001600160a01b0385166000908152600f60205260408120600a0155610e9a85613028565b600084815260106020908152604080832080546001600160a01b0319166001600160a01b038a169081178255426001928301558452600f90925282208101805491929091610ee990849061421f565b90915550506001600160a01b0385166000908152600f6020526040902042600490910155610f178585613334565b611002565b336001600160a01b037f00000000000000000000000014fc5036be2388e2c2ab8a80c86755ef1fcf6e0016141561100257610f5885600161340a565b6001600160a01b0385166000908152600f60205260408120600a0155610f7d85613028565b600084815260116020908152604080832080546001600160a01b0319166001600160a01b038a169081178255426001928301558452600f9092528220600201805491929091610fcd90849061421f565b90915550506001600160a01b0385166000908152600f6020526040902042600482018190556005909101556110028585613477565b50630a85bd0160e11b5b95945050505050565b6004546040516001600160a01b0390911633149061103890600a906020016140f2565b604051602081830303815290604052906110655760405162461bcd60e51b81526004016109f4919061412b565b50604051339082156108fc029083906000818181858888f19350505050610e3f57600080fd5b6001600160a01b0381166000908152600f6020526040812054606091906110b4906001906141d7565b90506000600182815481106110cb576110cb6141ee565b90600052602060002090600302016002018054905067ffffffffffffffff8111156110f8576110f8613aa4565b604051908082528060200260200182016040528015611121578160200160208202803683370190505b50905060005b6001838154811061113a5761113a6141ee565b90600052602060002090600302016002018054905081101561123357846001600160a01b03166011600060018681548110611177576111776141ee565b90600052602060002090600302016002018481548110611199576111996141ee565b600091825260208083209091015483528201929092526040019020546001600160a01b0316141561122357600183815481106111d7576111d76141ee565b906000526020600020906003020160020181815481106111f9576111f96141ee565b9060005260206000200154828281518110611216576112166141ee565b6020026020010181815250505b61122c81614204565b9050611127565b509392505050565b611243612fce565b600d54610100900460ff16158061127c57506004546001600160a01b03163314801561127c5750600d5460ff6101009091041615156001145b600a60405160200161128e9190614237565b604051602081830303815290604052906112bb5760405162461bcd60e51b81526004016109f4919061412b565b506004546001600160a01b031633141561137c57600e5433906108fc906112e2908461425e565b6040518115909202916000818181858888f1935050505061130257600080fd5b600d5460ff1615156001141561137757600354604051632770a7eb60e21b8152306004820152602481018390526001600160a01b0390911690639dc29fac90604401600060405180830381600087803b15801561135e57600080fd5b505af1158015611372573d6000803e3d6000fd5b505050505b6114f6565b3360009081526012602090815260409182902054915191831115916113a791600a91600c91016141ac565b604051602081830303815290604052906113d45760405162461bcd60e51b81526004016109f4919061412b565b50600060026009546113e69190614293565b6113f261271084614293565b6113fc919061425e565b600e5490915033906108fc9061141284866141d7565b61141c919061425e565b6040518115909202916000818181858888f1935050505061143c57600080fd5b336000908152601260205260408120805484929061145b9084906141d7565b90915550506009546008805460009061147590849061421f565b90915550506003546001600160a01b0316639dc29fac3061149684866141d7565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156114dc57600080fd5b505af11580156114f0573d6000803e3d6000fd5b50505050505b610e3f6001600055565b6004546040516001600160a01b0390911633149061152390600a906020016140f2565b604051602081830303815290604052906115505760405162461bcd60e51b81526004016109f4919061412b565b50601955565b6001818154811061156657600080fd5b60009182526020909120600390910201546001600160a01b0316905081565b6004546040516001600160a01b039091163314906115a890600a906020016140f2565b604051602081830303815290604052906115d55760405162461bcd60e51b81526004016109f4919061412b565b50601555565b6115e3612fce565b806115ee338261340a565b6115f733613028565b60005b818110156117ae576116447f00000000000000000000000014fc5036be2388e2c2ab8a80c86755ef1fcf6e00858584818110611638576116386141ee565b90506020020135613278565b7f00000000000000000000000014fc5036be2388e2c2ab8a80c86755ef1fcf6e006001600160a01b03166323b872dd3330878786818110611687576116876141ee565b6040516001600160e01b031960e088901b1681526001600160a01b03958616600482015294909316602485015250602090910201356044820152606401600060405180830381600087803b1580156116de57600080fd5b505af11580156116f2573d6000803e3d6000fd5b50505050336011600086868581811061170d5761170d6141ee565b90506020020135815260200190815260200160002060000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055504260116000868685818110611760576117606141ee565b9050602002013581526020019081526020016000206001018190555061179e33858584818110611792576117926141ee565b90506020020135613477565b6117a781614204565b90506115fa565b50336000908152600f6020526040812060020180548392906117d190849061421f565b9091555050336000908152600f602052604090204260059091015550610bcb6001600055565b6117ff612fce565b336000908152600f602052604081206007810154909190611820908261421f565b600283015490915015611a58576000826002015461183e3389611e59565b6118489190614293565b9050600080600180866000015461185f91906141d7565b8154811061186f5761186f6141ee565b6000918252602090912060026003909202010154905088156118e757611894876135cb565b6004546118ad906001600160a01b03168a8a8a8a613658565b6118e75760405162461bcd60e51b815260206004820152600b60248201526a139bdd08185b1b1bddd95960aa1b60448201526064016109f4565b8885600a01819055508885600b016000828254611904919061421f565b909155505042600586015560005b81811015611a53576000601160006001808a6000015461193291906141d7565b81548110611942576119426141ee565b90600052602060002090600302016002018481548110611964576119646141ee565b60009182526020808320909101548352820192909252604001902080549091506001600160a01b0316331415611a4257601b548160020154601a546119a991906141d7565b601a546119b691906141d7565b6119c09190614293565b6119cb90600161421f565b6119d59086614293565b9350601a548482600201546119ea919061421f565b1015611a1b5783816002016000828254611a04919061421f565b90915550611a149050848761421f565b9550611a42565b8060020154601a54611a2d91906141d7565b611a37908761421f565b601a54600283015595505b50611a4c81614204565b9050611912565b505050505b60008111600a604051602001611a6e91906142b5565b60405160208183030381529060405290611a9b5760405162461bcd60e51b81526004016109f4919061412b565b506017548111600a604051602001611ab391906142ee565b60405160208183030381529060405290611ae05760405162461bcd60e51b81526004016109f4919061412b565b5080826009016000828254611af5919061421f565b9091555050600060078301556040516340c10f1960e01b8152336004820152602481018290527f000000000000000000000000607cb8bb818e80595a51f41c81feb8c82e04f1d66001600160a01b0316906340c10f1990604401600060405180830381600087803b158015611b6957600080fd5b505af1158015611b7d573d6000803e3d6000fd5b505050505050611b8d6001600055565b50505050565b6004546040516001600160a01b03909116331490611bb690600a906020016140f2565b60405160208183030381529060405290611be35760405162461bcd60e51b81526004016109f4919061412b565b50601855565b6004546040516000916001600160a01b0316331490611c0d90600a906020016140f2565b60405160208183030381529060405290611c3a5760405162461bcd60e51b81526004016109f4919061412b565b5060405163095ea7b360e01b81526001600160a01b0384811660048301526024820184905285919082169063095ea7b3906044016020604051808303816000875af1158015611c8d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061100c9190614318565b6001600160a01b0381166000908152600f602052604081205460609190611cda906001906141d7565b9050600060018281548110611cf157611cf16141ee565b90600052602060002090600302016001018054905067ffffffffffffffff811115611d1e57611d1e613aa4565b604051908082528060200260200182016040528015611d47578160200160208202803683370190505b50905060005b60018381548110611d6057611d606141ee565b90600052602060002090600302016001018054905081101561123357846001600160a01b03166010600060018681548110611d9d57611d9d6141ee565b90600052602060002090600302016001018481548110611dbf57611dbf6141ee565b600091825260208083209091015483528201929092526040019020546001600160a01b03161415611e495760018381548110611dfd57611dfd6141ee565b90600052602060002090600302016001018181548110611e1f57611e1f6141ee565b9060005260206000200154828281518110611e3c57611e3c6141ee565b6020026020010181815250505b611e5281614204565b9050611d4d565b6001600160a01b0382166000908152600f6020908152604080832081516101808101835281548152600182015493810184905260028201549281018390526003820154606082015260048201546080820152600582015460a0820152600682015460c0820152600782015460e082015260088201546101008201526009820154610120820152600a820154610140820152600b90910154610160820152918391611f039190613712565b905060006002611f138184614293565b601954611f20908561425e565b611f2a919061421f565b611f3590606461425e565b611f3f9190614293565b90506000611f4e606483614293565b90506000606485604001518884611f65919061425e565b611f6f908661421f565b611f799190614293565b611f839190614293565b9050600060018660000151611f9891906141d7565b90506000805b60018381548110611fb157611fb16141ee565b90600052602060002090600302016002018054905081101561210c5760006011600060018681548110611fe657611fe66141ee565b90600052602060002090600302016002018481548110612008576120086141ee565b600091825260208083209091015483528281019390935260409182019020815160808101835281546001600160a01b03908116808352600184015495830195909552600283015493820193909352600390910154606082015292508d1614156120fb576000601b548260400151601a5461208291906141d7565b601a5461208f91906141d7565b6120999190614293565b6120a490600161421f565b6120ae9087614293565b9050601a548183604001516120c3919061421f565b10156120da576120d3818561421f565b93506120f9565b8160400151601a546120ec91906141d7565b6120f6908561421f565b93505b505b5061210581614204565b9050611f9e565b506018548188604001518960a001514261212691906141d7565b612130919061425e565b61213a919061425e565b6121449190614293565b9750505050505050505b92915050565b61215c612fce565b336000908152600f602090815260409182902060028101549251909215159161218891600a910161433a565b604051602081830303815290604052906121b55760405162461bcd60e51b81526004016109f4919061412b565b506000600a82018190558281816121cc3383611e59565b6121d69190614293565b90506000805b838110156123f2576000601160008a8a858181106121fc576121fc6141ee565b60209081029290920135835250818101929092526040908101600020805491519093506001600160a01b039190911633149161223e91600a91600b91016141ac565b6040516020818303038152906040529061226b5760405162461bcd60e51b81526004016109f4919061412b565b5080546001600160a01b0319168155601b546002820154601a5461228f91906141d7565b601a5461229c91906141d7565b6122a69190614293565b6122b190600161421f565b6122bb9085614293565b9250601a548382600201546122d0919061421f565b101561230157828160020160008282546122ea919061421f565b909155506122fa9050838761421f565b9550612328565b8060020154601a5461231391906141d7565b61231d908761421f565b601a54600283015595505b4260038201556001600160a01b037f00000000000000000000000014fc5036be2388e2c2ab8a80c86755ef1fcf6e00166323b872dd30338c8c87818110612371576123716141ee565b6040516001600160e01b031960e088901b1681526001600160a01b03958616600482015294909316602485015250602090910201356044820152606401600060405180830381600087803b1580156123c857600080fd5b505af11580156123dc573d6000803e3d6000fd5b5050505050806123eb90614204565b90506121dc565b5083856007016000828254612407919061421f565b925050819055508285600201600082825461242291906141d7565b9091555050426005909501949094555050600160005550610bcb9050565b6001600160a01b0382166000908152600f6020526040812060018101546002909101548291829182919061247388613734565b61247d89896137ab565b9299919850965090945092505050565b600d5460405161010090910460ff1615906124ad90600a90602001614180565b604051602081830303815290604052906124da5760405162461bcd60e51b81526004016109f4919061412b565b506124e3612fce565b6000816005546124f3919061425e565b905080341015600a60405160200161250b9190614373565b604051602081830303815290604052906125385760405162461bcd60e51b81526004016109f4919061412b565b50600254604051632770a7eb60e21b8152336004820152602481018490526001600160a01b0390911690639dc29fac90604401600060405180830381600087803b15801561258557600080fd5b505af1158015612599573d6000803e3d6000fd5b50505050600e54816125ab9190614293565b600d5490915060ff16151560011415612648576003546040516340c10f1960e01b8152306004820152602481018390526001600160a01b03909116906340c10f1990604401600060405180830381600087803b15801561260a57600080fd5b505af115801561261e573d6000803e3d6000fd5b5050336000908152601260205260408120805485945090925061264290849061421f565b90915550505b50610e3f6001600055565b6004546040516001600160a01b0390911633149061267690600a906020016140f2565b604051602081830303815290604052906126a35760405162461bcd60e51b81526004016109f4919061412b565b50600d5460405160ff610100909204919091161515600114906126cb90600a906020016143ac565b604051602081830303815290604052906126f85760405162461bcd60e51b81526004016109f4919061412b565b5060005b8351811015611b8d57818181518110612717576127176141ee565b602002602001015160126000868481518110612735576127356141ee565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000205411600a600c6040516020016127749291906141ac565b604051602081830303815290604052906127a15760405162461bcd60e51b81526004016109f4919061412b565b508181815181106127b4576127b46141ee565b6020026020010151601260008684815181106127d2576127d26141ee565b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020600082825461280991906141d7565b92505081905550818181518110612822576128226141ee565b602002602001015160126000858481518110612840576128406141ee565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000206000828254612877919061421f565b90915550612886905081614204565b90506126fc565b612895612fce565b336000908152600f602090815260409182902060010154915183921515916128c091600a91016143e5565b604051602081830303815290604052906128ed5760405162461bcd60e51b81526004016109f4919061412b565b50336000908152600f602052604090206001015461290c9082906141d7565b600f6000336001600160a01b03166001600160a01b03168152602001908152602001600020600201541115600a604051602001612949919061441e565b604051602081830303815290604052906129765760405162461bcd60e51b81526004016109f4919061412b565b50600061298233613824565b336000908152600f60205260408120600601805492935083929091906129a990849061421f565b90915550600090505b82811015612b945733601060008787858181106129d1576129d16141ee565b90506020020135815260200190815260200160002060000160009054906101000a90046001600160a01b03166001600160a01b031614600a600b604051602001612a1c9291906141ac565b60405160208183030381529060405290612a495760405162461bcd60e51b81526004016109f4919061412b565b50600060106000878785818110612a6257612a626141ee565b90506020020135815260200190815260200160002060000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055504260106000878785818110612ab557612ab56141ee565b905060200201358152602001908152602001600020600201819055507f00000000000000000000000085be9de7a369850a964616a2c04d79000d168dea6001600160a01b03166323b872dd3033888886818110612b1457612b146141ee565b6040516001600160e01b031960e088901b1681526001600160a01b03958616600482015294909316602485015250602090910201356044820152606401600060405180830381600087803b158015612b6b57600080fd5b505af1158015612b7f573d6000803e3d6000fd5b5050505080612b8d90614204565b90506129b2565b50336000908152600f602052604081206001018054849290612bb79084906141d7565b9091555050336000908152600f602052604090204260049091015550610bcb90506001600055565b612be7612fce565b336000818152600f60205260408120600601549091612c0590613824565b612c0f919061421f565b905060008111600a604051602001612c279190614457565b60405160208183030381529060405290612c545760405162461bcd60e51b81526004016109f4919061412b565b50336000908152600f60205260408120600101548281612c7657612c7661427d565b336000908152600f60205260408120426004820155600881018054870190556006810182905554929091049250600019909101905b60018281548110612cbe57612cbe6141ee565b906000526020600020906003020160010180549050811015612db457336001600160a01b03166010600060018581548110612cfb57612cfb6141ee565b90600052602060002090600302016001018481548110612d1d57612d1d6141ee565b600091825260208083209091015483528201929092526040019020546001600160a01b03161415612dac57826010600060018581548110612d6057612d606141ee565b90600052602060002090600302016001018481548110612d8257612d826141ee565b90600052602060002001548152602001908152602001600020600301600082825401925050819055505b600101612cab565b50506002546040516340c10f1960e01b8152336004820152602481018490526001600160a01b0390911691506340c10f1990604401600060405180830381600087803b158015612e0357600080fd5b505af1158015612e17573d6000803e3d6000fd5b5050505050612e266001600055565b565b612e30612fce565b600354604051627eeac760e11b81523360048201526000602482015282916001600160a01b03169062fdd58e90604401602060405180830381865afa158015612e7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ea19190614490565b1015600a600c604051602001612eb89291906141ac565b60405160208183030381529060405290612ee55760405162461bcd60e51b81526004016109f4919061412b565b50600954600090612ef861271084614293565b612f02919061425e565b6003549091506001600160a01b0316639dc29fac33612f2184866141d7565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015612f6757600080fd5b505af1158015612f7b573d6000803e3d6000fd5b5050600e543392506108fc9150612f9284866141d7565b612f9c919061425e565b6040518115909202916000818181858888f19350505050612fbc57600080fd5b8060086000828254612642919061421f565b600260005414156130215760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016109f4565b6002600055565b6001600160a01b0381166000908152600f6020526040902080546130ac5760018054810180825560008290528391906130629082906141d7565b81548110613072576130726141ee565b6000918252602090912060039182020180546001600160a01b0319166001600160a01b039390931692909217909155429082015560015481555b6001810154156130d8576130bf82613824565b8160060160008282546130d2919061421f565b90915550505b600281015415610bcb5760008082600201546130f5856000611e59565b6130ff9190614293565b90506000805b846002015481101561324e57600060116000600180896000015461312991906141d7565b81548110613139576131396141ee565b9060005260206000209060030201600201848154811061315b5761315b6141ee565b60009182526020808320909101548352820192909252604001902080549091506001600160a01b03908116908816141561323d57601b548160020154601a546131a491906141d7565b601a546131b191906141d7565b6131bb9190614293565b6131c690600161421f565b6131d09085614293565b9250601a548382600201546131e5919061421f565b101561321657828160020160008282546131ff919061421f565b9091555061320f9050838661421f565b945061323d565b8060020154601a5461322891906141d7565b613232908661421f565b601a54600283015594505b5061324781614204565b9050613105565b504284600501819055508284600701600082825461326c919061421f565b90915550505050505050565b6040516331a9108f60e11b81526004810182905233906001600160a01b03841690636352211e90602401602060405180830381865afa1580156132bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132e391906144a9565b6001600160a01b031614600a600b6040516020016133029291906141ac565b6040516020818303038152906040529061332f5760405162461bcd60e51b81526004016109f4919061412b565b505050565b6001600160a01b0382166000908152600f6020526040812054819060019061335d9082906141d7565b8154811061336d5761336d6141ee565b9060005260206000209060030201905060005b60018201548110156133cc57838260010182815481106133a2576133a26141ee565b906000526020600020015414156133bc57600192506133cc565b6133c581614204565b9050613380565b5081611b8d57600180820180549182018082556000829052859190839081106133f7576133f76141ee565b6000918252602090912001555050505050565b6134156001826141d7565b6001600160a01b0383166000908152600f602052604090206002015461343b919061421f565b6015546001600160a01b0384166000908152600f6020526040902060010154613464919061425e565b11600a60405160200161330291906144c6565b6001600160a01b0382166000908152600f6020526040812054819061349e906001906141d7565b905060005b600182815481106134b6576134b66141ee565b9060005260206000209060030201600201805490508110156135325783600183815481106134e6576134e66141ee565b90600052602060002090600302016002018281548110613508576135086141ee565b906000526020600020015414156135225760019250613532565b61352b81614204565b90506134a3565b5081611b8d5760006001828154811061354d5761354d6141ee565b906000526020600020906003020160020180549050905060018281548110613577576135776141ee565b60009182526020822060026003909202010180546001908101825591528054859190849081106135a9576135a96141ee565b906000526020600020906003020160020182815481106133f7576133f76141ee565b60008181526014602052604090205460ff166001141561362d5760405162461bcd60e51b815260206004820152601260248201527f4e6f6e636520616c72656164792055736564000000000000000000000000000060448201526064016109f4565b60135481111561363d5760138190555b6000908152601460205260409020805460ff19166001179055565b600042613668856201518061421f565b111561370a576040805160208082018890528183018790526060808301879052835180840390910181526080830184528051908201207f19457468657265756d205369676e6564204d6573736167653a0a33320000000060a084015260bc8084018290528451808503909101815260dc9093019093528151910120876001600160a01b03166136f78286613910565b6001600160a01b0316149250505061100c565b50600061100c565b600061371e8284614293565b905060165481111561214e575060165492915050565b6001600160a01b0381166000908152600f602052604081206001015461377357506001600160a01b03166000908152600f602052604090206006015490565b600061377e83613824565b6001600160a01b0384166000908152600f60205260409020600601546137a4919061421f565b9392505050565b6001600160a01b0382166000908152600f60205260408120600201546137ed57506001600160a01b0382166000908152600f602052604090206007015461214e565b6137f78383611e59565b6001600160a01b0384166000908152600f602052604090206007015461381d919061421f565b905061214e565b6002546000906001600160a01b031661383f57506000919050565b6001600160a01b0382166000908152600f602090815260409182902082516101808101845281548152600182015492810183905260028201549381019390935260038101546060840152600481015460808401819052600582015460a085015260068083015460c086015260078084015460e087015260088401546101008701526009840154610120870152600a840154610140870152600b909301546101608601525491549192906138f290426141d7565b6138fc919061425e565b613906919061425e565b6137a49190614293565b60008060008061391f8561398f565b6040805160008152602081018083528b905260ff8316918101919091526060810184905260808101839052929550909350915060019060a0016020604051602081039080840390855afa15801561397a573d6000803e3d6000fd5b5050604051601f190151979650505050505050565b600080600083516041146139e55760405162461bcd60e51b815260206004820152601860248201527f696e76616c6964207369676e6174757265206c656e677468000000000000000060448201526064016109f4565b50505060208101516040820151606090920151909260009190911a90565b600060208284031215613a1557600080fd5b5035919050565b600060208284031215613a2e57600080fd5b81356001600160e01b0319811681146137a457600080fd5b6001600160a01b0381168114610e3f57600080fd5b60008060408385031215613a6e57600080fd5b8235613a7981613a46565b946020939093013593505050565b600060208284031215613a9957600080fd5b81356137a481613a46565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715613ae357613ae3613aa4565b604052919050565b600067ffffffffffffffff821115613b0557613b05613aa4565b5060051b60200190565b600082601f830112613b2057600080fd5b81356020613b35613b3083613aeb565b613aba565b82815260059290921b84018101918181019086841115613b5457600080fd5b8286015b84811015613b6f5780358352918301918301613b58565b509695505050505050565b600060208284031215613b8c57600080fd5b813567ffffffffffffffff811115613ba357600080fd5b613baf84828501613b0f565b949350505050565b60008083601f840112613bc957600080fd5b50813567ffffffffffffffff811115613be157600080fd5b602083019150836020828501011115613bf957600080fd5b9250929050565b600080600080600060808688031215613c1857600080fd5b8535613c2381613a46565b94506020860135613c3381613a46565b935060408601359250606086013567ffffffffffffffff811115613c5657600080fd5b613c6288828901613bb7565b969995985093965092949392505050565b6020808252825182820181905260009190848201906040850190845b81811015613cab57835183529284019291840191600101613c8f565b50909695505050505050565b60008083601f840112613cc957600080fd5b50813567ffffffffffffffff811115613ce157600080fd5b6020830191508360208260051b8501011115613bf957600080fd5b60008060208385031215613d0f57600080fd5b823567ffffffffffffffff811115613d2657600080fd5b613d3285828601613cb7565b90969095509350505050565b60008060008060808587031215613d5457600080fd5b84359350602080860135935060408601359250606086013567ffffffffffffffff80821115613d8257600080fd5b818801915088601f830112613d9657600080fd5b813581811115613da857613da8613aa4565b613dba601f8201601f19168501613aba565b91508082528984828501011115613dd057600080fd5b808484018584013760008482840101525080935050505092959194509250565b600080600060608486031215613e0557600080fd5b8335613e1081613a46565b92506020840135613e2081613a46565b929592945050506040919091013590565b60008060008060008060008060a0898b031215613e4d57600080fd5b8835613e5881613a46565b97506020890135613e6881613a46565b9650604089013567ffffffffffffffff80821115613e8557600080fd5b613e918c838d01613cb7565b909850965060608b0135915080821115613eaa57600080fd5b613eb68c838d01613cb7565b909650945060808b0135915080821115613ecf57600080fd5b50613edc8b828c01613bb7565b999c989b5096995094979396929594505050565b600082601f830112613f0157600080fd5b81356020613f11613b3083613aeb565b82815260059290921b84018101918181019086841115613f3057600080fd5b8286015b84811015613b6f578035613f4781613a46565b8352918301918301613f34565b600080600060608486031215613f6957600080fd5b833567ffffffffffffffff80821115613f8157600080fd5b613f8d87838801613ef0565b94506020860135915080821115613fa357600080fd5b613faf87838801613ef0565b93506040860135915080821115613fc557600080fd5b50613fd286828701613b0f565b9150509250925092565b60008060008060008060a08789031215613ff557600080fd5b863561400081613a46565b9550602087013561401081613a46565b94506040870135935060608701359250608087013567ffffffffffffffff81111561403a57600080fd5b61404689828a01613bb7565b979a9699509497509295939492505050565b8054600090600181811c908083168061407257607f831692505b602080841082141561409457634e487b7160e01b600052602260045260246000fd5b8180156140a857600181146140b9576140e6565b60ff198616895284890196506140e6565b60008881526020902060005b868110156140de5781548b8201529085019083016140c5565b505084890196505b50505050505092915050565b60006140fe8284614058565b7f4f6e6c792043726561746f722046756e6374696f6e000000000000000000000081526015019392505050565b600060208083528351808285015260005b818110156141585785810183015185820160400152820161413c565b8181111561416a576000604083870101525b50601f01601f1916929092016040019392505050565b600061418c8284614058565b6f213ab1b5b99029ba30b5b4b73397171760811b81526010019392505050565b6000613baf6141bb8386614058565b84614058565b634e487b7160e01b600052601160045260246000fd5b6000828210156141e9576141e96141c1565b500390565b634e487b7160e01b600052603260045260246000fd5b6000600019821415614218576142186141c1565b5060010190565b60008219821115614232576142326141c1565b500190565b60006142438284614058565b6a4e6f7420706f7369626c6560a81b8152600b019392505050565b6000816000190483118215151615614278576142786141c1565b500290565b634e487b7160e01b600052601260045260246000fd5b6000826142b057634e487b7160e01b600052601260045260246000fd5b500490565b60006142c18284614058565b7f4e6f20466c6f7765722420746f2068617276657374000000000000000000000081526015019392505050565b60006142fa8284614058565b6d43726f70206e6f7420726561647960901b8152600e019392505050565b60006020828403121561432a57600080fd5b815180151581146137a457600080fd5b60006143468284614058565b7f596f752068617665206e6f20536565642067726f77696e67000000000000000081526018019392505050565b600061437f8284614058565b7f4e656564206d6f726520646f75676820746f206275726e00000000000000000081526017019392505050565b60006143b88284614058565b7f4e6f74207374616b696e672063757272656e746c79000000000000000000000081526015019392505050565b60006143f18284614058565b7f596f752068617665206e6f20436f726e6572426f797a207374616b65640000008152601d019392505050565b600061442a8284614058565b7f506c732073746f7047726f77696e6720796f757220736565647320666972737481526020019392505050565b60006144638284614058565b7f4e6f204d797374657279426f7820746f20636c61696d0000000000000000000081526016019392505050565b6000602082840312156144a257600080fd5b5051919050565b6000602082840312156144bb57600080fd5b81516137a481613a46565b60006144d28284614058565b7f4e6f7420656e6f75676820436f726e6572426f797a207374616b6564000000008152601c01939250505056fea26469706673582212207e72c89e0e96d2ceec57ac5530baefa984810254faec23164feb52a506cafcc564736f6c634300080c0033
Deployed Bytecode Sourcemap
56149:15217:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65558:110;;;;;;;;;;-1:-1:-1;65558:110:0;;;;;:::i;:::-;;:::i;:::-;;4764:157;;;;;;;;;;-1:-1:-1;4764:157:0;;;;;:::i;:::-;-1:-1:-1;;;;;;4873:40:0;-1:-1:-1;;;4873:40:0;;4764:157;;;;655:14:1;;648:22;630:41;;618:2;603:18;4764:157:0;;;;;;;;49361:90;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;864:55:1;;;846:74;;834:2;819:18;49361:90:0;682:244:1;54701:347:0;;;;;;;;;;-1:-1:-1;54701:347:0;;;;;:::i;:::-;;:::i;65322:109::-;;;;;;;;;;-1:-1:-1;65322:109:0;;;;;:::i;:::-;;:::i;50407:45::-;;;;;;;;;;-1:-1:-1;50407:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;1808:25:1;;;1796:2;1781:18;50407:45:0;1662:177:1;58030:628:0;;;;;;;;;;-1:-1:-1;58030:628:0;;;;;:::i;:::-;;:::i;56974:1048::-;;;;;;;;;;-1:-1:-1;56974:1048:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;;4737:33:1;;;4719:52;;4707:2;4692:18;56974:1048:0;4575:202:1;55654:113:0;;;;;;;;;;-1:-1:-1;55654:113:0;;;;;:::i;:::-;;:::i;66746:458::-;;;;;;;;;;-1:-1:-1;66746:458:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;52886:898::-;;;;;;;;;;-1:-1:-1;52886:898:0;;;;;:::i;:::-;;:::i;39706:26::-;;;;;;;;;;;;;;;;65676:109;;;;;;;;;;-1:-1:-1;65676:109:0;;;;;:::i;:::-;;:::i;49318:34::-;;;;;;;;;;-1:-1:-1;49318:34:0;;;;;:::i;:::-;;:::i;56314:84::-;;;;;;;;;;;;;;;65439:111;;;;;;;;;;-1:-1:-1;65439:111:0;;;;;:::i;:::-;;:::i;58666:690::-;;;;;;;;;;-1:-1:-1;58666:690:0;;;;;:::i;:::-;;:::i;50309:41::-;;;;;;;;;;-1:-1:-1;50309:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;50309:41:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;6988:55:1;;;6970:74;;7075:2;7060:18;;7053:34;;;;7103:18;;;7096:34;;;;7161:2;7146:18;;7139:34;7204:3;7189:19;;7182:35;6957:3;6942:19;50309:41:0;6711:512:1;63452:1862:0;;;;;;;;;;-1:-1:-1;63452:1862:0;;;;;:::i;:::-;;:::i;65793:106::-;;;;;;;;;;-1:-1:-1;65793:106:0;;;;;:::i;:::-;;:::i;50461:208::-;;;;;;;;;;-1:-1:-1;50461:208:0;;;;;:::i;:::-;;:::i;50357:43::-;;;;;;;;;;-1:-1:-1;50357:43:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;50357:43:0;;;;;;;;;;;;-1:-1:-1;;;;;8911:55:1;;;8893:74;;8998:2;8983:18;;8976:34;;;;9026:18;;;9019:34;9084:2;9069:18;;9062:34;8880:3;8865:19;50357:43:0;8662:440:1;66286:452:0;;;;;;;;;;-1:-1:-1;66286:452:0;;;;;:::i;:::-;;:::i;50228:41::-;;;;;;;;;;-1:-1:-1;50228:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9564:25:1;;;9620:2;9605:18;;9598:34;;;;9648:18;;;9641:34;;;;9706:2;9691:18;;9684:34;;;;9749:3;9734:19;;9727:35;;;;9793:3;9778:19;;9771:35;;;;9837:3;9822:19;;9815:35;9881:3;9866:19;;9859:35;9925:3;9910:19;;9903:35;9969:3;9954:19;;9947:35;10013:3;9998:19;;9991:36;10058:3;10043:19;;10036:36;9551:3;9536:19;50228:41:0;9107:971:1;62157:1287:0;;;;;;;;;;-1:-1:-1;62157:1287:0;;;;;:::i;:::-;;:::i;49517:22::-;;;;;;;;;;-1:-1:-1;49517:22:0;;;;-1:-1:-1;;;;;49517:22:0;;;59364:1412;;;;;;;;;;-1:-1:-1;59364:1412:0;;;;;:::i;:::-;;:::i;65972:306::-;;;;;;;;;;-1:-1:-1;65972:306:0;;;;;:::i;:::-;;:::i;:::-;;;;10314:25:1;;;10370:2;10355:18;;10348:34;;;;10398:18;;;10391:34;10456:2;10441:18;;10434:34;10301:3;10286:19;65972:306:0;10083:391:1;55339:307:0;;;;;;;;;;-1:-1:-1;55339:307:0;;;;;:::i;:::-;-1:-1:-1;;;55339:307:0;;;;;;;;;;;56218:89;;;;;;;;;;;;;;;49458:27;;;;;;;;;;-1:-1:-1;49458:27:0;;;;-1:-1:-1;;;;;49458:27:0;;;52415:463;;;;;;:::i;:::-;;:::i;67212:629::-;;;;;;;;;;;;67640:10;;67665:14;;67681:11;;67694:9;;67722:14;;67738:16;;67756:14;;67772:12;;67803:10;;67815:17;;67640:10;;;;;;67652:11;;;67212:629;;;;;;;12263:14:1;;12256:22;12238:41;;12322:14;;12315:22;12310:2;12295:18;;12288:50;12354:18;;;12347:34;;;;12412:2;12397:18;;12390:34;;;;12455:3;12440:19;;12433:35;;;;12499:3;12484:19;;12477:35;;;;12543:3;12528:19;;12521:35;12587:3;12572:19;;12565:35;12631:3;12616:19;;12609:35;12675:3;12660:19;;12653:35;12719:3;12704:19;;12697:36;12225:3;12210:19;67212:629:0;11822:917:1;54220:473:0;;;;;;;;;;-1:-1:-1;54220:473:0;;;;;:::i;:::-;;:::i;60784:1055::-;;;;;;;;;;-1:-1:-1;60784:1055:0;;;;;:::i;:::-;;:::i;51465:938::-;;;;;;;;;;;;;:::i;53792:420::-;;;;;;;;;;-1:-1:-1;53792:420:0;;;;;:::i;:::-;;:::i;55056:274::-;;;;;;;;;;-1:-1:-1;55056:274:0;;;;;:::i;:::-;-1:-1:-1;;;55056:274:0;;;;;;;;;65558:110;55962:7;;55971:49;;-1:-1:-1;;;;;55962:7:0;;;55948:10;:21;;55971:49;;55985:10;;55971:49;;;:::i;:::-;;;;;;;;;;;;;55940:81;;;;;-1:-1:-1;;;55940:81:0;;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;65634:14:0::1;:26:::0;65558:110::o;54701:347::-;55814:11;;55835:44;;55814:11;;;;;;:20;;55835:44;;55849:10;;55835:44;;;:::i;:::-;;;;;;;;;;;;;55806:74;;;;;-1:-1:-1;;;55806:74:0;;;;;;;;:::i;:::-;;36762:21:::1;:19;:21::i;:::-;54822:34:::2;::::0;54804:10:::2;-1:-1:-1::0;;;;;54804:16:0;::::2;;::::0;54822:34:::2;::::0;54836:10:::2;::::0;54847:8:::2;::::0;54822:34:::2;;;:::i;:::-;;;;;;;;;;;;;54796:61;;;;;-1:-1:-1::0;;;54796:61:0::2;;;;;;;;:::i;:::-;;54893:6;54876:10;:14;54887:2;-1:-1:-1::0;;;;;54876:14:0::2;-1:-1:-1::0;;;;;54876:14:0::2;;;;;;;;;;;;;:23;54915:10;54926:11;54901:37;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54868:71;;;;;-1:-1:-1::0;;;54868:71:0::2;;;;;;;;:::i;:::-;-1:-1:-1::0;54950:5:0::2;::::0;:55:::2;::::0;-1:-1:-1;;;54950:55:0;;54981:4:::2;54950:55;::::0;::::2;18239:34:1::0;-1:-1:-1;;;;;18309:15:1;;;18289:18;;;18282:43;54950:5:0::2;18341:18:1::0;;;18334:34;;;18384:18;;;18377:34;;;18448:3;18427:19;;;18420:32;18468:19;;;18461:30;54950:5:0;;::::2;::::0;:22:::2;::::0;18508:19:1;;54950:55:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;;;;;;;;55016:14:0;::::2;;::::0;;;:10:::2;:14;::::0;;;;:24;;55034:6;;55016:14;:24:::2;::::0;55034:6;;55016:24:::2;:::i;:::-;::::0;;;-1:-1:-1;;36200:1:0;37322:7;:22;54701:347;;:::o;36806:20::-:1;54701:347:::0;;:::o;65322:109::-;55962:7;;55971:49;;-1:-1:-1;;;;;55962:7:0;;;55948:10;:21;;55971:49;;55985:10;;55971:49;;;:::i;:::-;;;;;;;;;;;;;55940:81;;;;;-1:-1:-1;;;55940:81:0;;;;;;;;:::i;:::-;-1:-1:-1;65398:13:0::1;:25:::0;65322:109::o;58030:628::-;36762:21;:19;:21::i;:::-;58104:22:::1;58115:10;58104;:22::i;:::-;58154:16:::0;;58137:14:::1;58189:344;58209:6;58205:1;:10;58189:344;;;58237:36;58248:10;58260:9;58270:1;58260:12;;;;;;;;:::i;:::-;;;;;;;58237:10;:36::i;:::-;58288:10;-1:-1:-1::0;;;;;58288:23:0::1;;58312:10;58332:4;58339:9;58349:1;58339:12;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;58288:64:::1;::::0;-1:-1:-1;;;;;;58288:64:0::1;::::0;;;;;;-1:-1:-1;;;;;19213:15:1;;;58288:64:0::1;::::0;::::1;19195:34:1::0;19265:15;;;;19245:18;;;19238:43;19297:18;;;19290:34;19107:18;;58288:64:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;58399:10;58367:9;:23;58377:9;58387:1;58377:12;;;;;;;;:::i;:::-;;;;;;;58367:23;;;;;;;;;;;:29;;;:42;;;;;-1:-1:-1::0;;;;;58367:42:0::1;;;;;-1:-1:-1::0;;;;;58367:42:0::1;;;;;;58456:15;58424:9;:23;58434:9;58444:1;58434:12;;;;;;;;:::i;:::-;;;;;;;58424:23;;;;;;;;;;;:29;;:47;;;;58486:35;58496:10;58508:9;58518:1;58508:12;;;;;;;;:::i;:::-;;;;;;;58486:9;:35::i;:::-;58217:3;::::0;::::1;:::i;:::-;;;58189:344;;;-1:-1:-1::0;58551:10:0::1;58543:19;::::0;;;:7:::1;:19;::::0;;;;:29:::1;;:39:::0;;58576:6;;58543:19;:39:::1;::::0;58576:6;;58543:39:::1;:::i;:::-;::::0;;;-1:-1:-1;;58601:10:0::1;58593:19;::::0;;;:7:::1;:19;::::0;;;;58635:15:::1;58593:39;::::0;;::::1;:57:::0;-1:-1:-1;36806:20:0;36200:1;37322:7;:22;37139:213;36806:20;58030:628;:::o;56974:1048::-;57074:6;57106:10;-1:-1:-1;;;;;57121:10:0;57098:33;;57095:857;;;-1:-1:-1;;;;;57147:13:0;;57173:1;57147:13;;;:7;:13;;;;;:23;;:27;57189:16;57155:4;57189:10;:16::i;:::-;57220:18;;;;:9;:18;;;;;;;;:31;;-1:-1:-1;;;;;;57220:31:0;-1:-1:-1;;;;;57220:31:0;;;;;;;57293:15;-1:-1:-1;57266:24:0;;;:42;57323:13;;:7;:13;;;;;:23;;:28;;-1:-1:-1;;57323:23:0;;:28;;-1:-1:-1;;57323:28:0;:::i;:::-;;;;-1:-1:-1;;;;;;;57366:13:0;;;;;;:7;:13;;;;;57402:15;57366:33;;;;:51;57432:24;57374:4;57448:7;57432:9;:24::i;:::-;57095:857;;;57485:10;-1:-1:-1;;;;;57500:5:0;57477:28;;57474:478;;;57521:22;57536:4;57541:1;57521:14;:22::i;:::-;-1:-1:-1;;;;;57558:13:0;;57584:1;57558:13;;;:7;:13;;;;;:23;;:27;57600:16;57566:4;57600:10;:16::i;:::-;57631:19;;;;:10;:19;;;;;;;;:32;;-1:-1:-1;;;;;;57631:32:0;-1:-1:-1;;;;;57631:32:0;;;;;;;57706:15;-1:-1:-1;57678:25:0;;;:43;57736:13;;:7;:13;;;;;:24;;:29;;-1:-1:-1;;57736:24:0;;:29;;-1:-1:-1;;57736:29:0;:::i;:::-;;;;-1:-1:-1;;;;;;;57780:13:0;;;;;;:7;:13;;;;;57816:15;57780:33;;;:51;;;57846:36;;;;:54;57915:25;57788:4;57932:7;57915:10;:25::i;:::-;-1:-1:-1;;;;56974:1048:0;;;;;;;;:::o;55654:113::-;55962:7;;55971:49;;-1:-1:-1;;;;;55962:7:0;;;55948:10;:21;;55971:49;;55985:10;;55971:49;;;:::i;:::-;;;;;;;;;;;;;55940:81;;;;;-1:-1:-1;;;55940:81:0;;;;;;;;:::i;:::-;-1:-1:-1;55726:32:0::1;::::0;55734:10:::1;::::0;55726:32;::::1;;;::::0;55751:6;;55726:32:::1;::::0;;;55751:6;55734:10;55726:32;::::1;;;;;;55718:41;;;::::0;::::1;66746:458:::0;-1:-1:-1;;;;;66844:14:0;;66830:11;66844:14;;;:7;:14;;;;;:17;66802:16;;66830:11;66844:21;;66864:1;;66844:21;:::i;:::-;66830:35;;66876:21;66914:12;66927:3;66914:17;;;;;;;;:::i;:::-;;;;;;;;;;;:24;;:31;;;;66900:46;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;66900:46:0;;66876:70;;66962:9;66957:218;66981:12;66994:3;66981:17;;;;;;;;:::i;:::-;;;;;;;;;;;:24;;:31;;;;66977:1;:35;66957:218;;;67086:5;-1:-1:-1;;;;;67037:54:0;:10;:39;67048:12;67061:3;67048:17;;;;;;;;:::i;:::-;;;;;;;;;;;:24;;67073:1;67048:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;67037:39;;;;;;;;;;;;:45;-1:-1:-1;;;;;67037:45:0;:54;67034:130;;;67121:12;67134:3;67121:17;;;;;;;;:::i;:::-;;;;;;;;;;;:24;;67146:1;67121:27;;;;;;;;:::i;:::-;;;;;;;;;67111:4;67116:1;67111:7;;;;;;;;:::i;:::-;;;;;;:37;;;;;67034:130;67014:3;;;:::i;:::-;;;66957:218;;;-1:-1:-1;67192:4:0;66746:458;-1:-1:-1;;;66746:458:0:o;52886:898::-;36762:21;:19;:21::i;:::-;52962:11:::1;::::0;::::1;::::0;::::1;;;:20;::::0;:70:::1;;-1:-1:-1::0;53001:7:0::1;::::0;-1:-1:-1;;;;;53001:7:0::1;52987:10;:21;:44:::0;::::1;;;-1:-1:-1::0;53012:11:0::1;::::0;::::1;;::::0;;::::1;;:19;;:11;:19;52987:44;53062:10;53048:39;;;;;;;;:::i;:::-;;;;;;;;;;;;;52954:144;;;;;-1:-1:-1::0;;;52954:144:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;53126:7:0::1;::::0;-1:-1:-1;;;;;53126:7:0::1;53112:10;:21;53109:667;;;53191:12;::::0;53165:10:::1;::::0;53157:47:::1;::::0;53182:21:::1;::::0;:6;:21:::1;:::i;:::-;53157:47;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;53149:56;;;::::0;::::1;;53223:10;::::0;::::1;;:18;;:10:::0;:18:::1;53220:91;;;53262:5;::::0;:33:::1;::::0;-1:-1:-1;;;53262:33:0;;53281:4:::1;53262:33;::::0;::::1;20321:74:1::0;20411:18;;;20404:34;;;-1:-1:-1;;;;;53262:5:0;;::::1;::::0;:10:::1;::::0;20294:18:1;;53262:33:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;53220:91;53109:667;;;53380:10;53369:22;::::0;;;:10:::1;:22;::::0;;;;;;;;;53403:37;;53369:32;;-1:-1:-1;53369:32:0::1;::::0;53403:37:::1;::::0;53417:10:::1;::::0;53428:11:::1;::::0;53403:37:::1;;:::i;:::-;;;;;;;;;;;;;53361:80;;;;;-1:-1:-1::0;;;53361:80:0::1;;;;;;;;:::i;:::-;;53456:14;53510:1;53493:14;;:18;;;;:::i;:::-;53474:14;53483:5;53474:6:::0;:14:::1;:::i;:::-;53473:39;;;;:::i;:::-;53596:12;::::0;53456:56;;-1:-1:-1;53559:10:0::1;::::0;53551:58:::1;::::0;53577:15:::1;53456:56:::0;53577:6;:15:::1;:::i;:::-;53576:32;;;;:::i;:::-;53551:58;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;53543:67;;;::::0;::::1;;53636:10;53625:22;::::0;;;:10:::1;:22;::::0;;;;:32;;53651:6;;53625:22;:32:::1;::::0;53651:6;;53625:32:::1;:::i;:::-;::::0;;;-1:-1:-1;;53693:14:0::1;::::0;53672:17:::1;:35:::0;;:17:::1;::::0;:35:::1;::::0;53693:14;;53672:35:::1;:::i;:::-;::::0;;;-1:-1:-1;;53722:5:0::1;::::0;-1:-1:-1;;;;;53722:5:0::1;:10;53741:4;53748:15;53757:6:::0;53748;:15:::1;:::i;:::-;53722:42;::::0;-1:-1:-1;;;;;;53722:42:0::1;::::0;;;;;;-1:-1:-1;;;;;20339:55:1;;;53722:42:0::1;::::0;::::1;20321:74:1::0;20411:18;;;20404:34;20294:18;;53722:42:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;53340:436;53109:667;36806:20:::0;36200:1;37322:7;:22;37139:213;65676:109;55962:7;;55971:49;;-1:-1:-1;;;;;55962:7:0;;;55948:10;:21;;55971:49;;55985:10;;55971:49;;;:::i;:::-;;;;;;;;;;;;;55940:81;;;;;-1:-1:-1;;;55940:81:0;;;;;;;;:::i;:::-;-1:-1:-1;65755:10:0::1;:22:::0;65676:109::o;49318:34::-;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;49318:34:0;;-1:-1:-1;49318:34:0;:::o;65439:111::-;55962:7;;55971:49;;-1:-1:-1;;;;;55962:7:0;;;55948:10;:21;;55971:49;;55985:10;;55971:49;;;:::i;:::-;;;;;;;;;;;;;55940:81;;;;;-1:-1:-1;;;55940:81:0;;;;;;;;:::i;:::-;-1:-1:-1;65514:16:0::1;:28:::0;65439:111::o;58666:690::-;36762:21;:19;:21::i;:::-;58778:9;58807:34:::1;58822:10;58778:9:::0;58807:14:::1;:34::i;:::-;58852:22;58863:10;58852;:22::i;:::-;58892:9;58887:336;58907:6;58903:1;:10;58887:336;;;58935:31;58946:5;58953:9;;58963:1;58953:12;;;;;;;:::i;:::-;;;;;;;58935:10;:31::i;:::-;58981:5;-1:-1:-1::0;;;;;58981:18:0::1;;59000:10;59020:4;59027:9;;59037:1;59027:12;;;;;;;:::i;:::-;58981:59;::::0;-1:-1:-1;;;;;;58981:59:0::1;::::0;;;;;;-1:-1:-1;;;;;19213:15:1;;;58981:59:0::1;::::0;::::1;19195:34:1::0;19265:15;;;;19245:18;;;19238:43;-1:-1:-1;59027:12:0::1;::::0;;::::1;;;19297:18:1::0;;;19290:34;19107:18;;58981:59:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;59088:10;59055;:24;59066:9;;59076:1;59066:12;;;;;;;:::i;:::-;;;;;;;59055:24;;;;;;;;;;;:30;;;:43;;;;;-1:-1:-1::0;;;;;59055:43:0::1;;;;;-1:-1:-1::0;;;;;59055:43:0::1;;;;;;59146:15;59113:10;:24;59124:9;;59134:1;59124:12;;;;;;;:::i;:::-;;;;;;;59113:24;;;;;;;;;;;:30;;:48;;;;59176:35;59187:10;59198:9;;59208:1;59198:12;;;;;;;:::i;:::-;;;;;;;59176:10;:35::i;:::-;58915:3;::::0;::::1;:::i;:::-;;;58887:336;;;-1:-1:-1::0;59243:10:0::1;59235:19;::::0;;;:7:::1;:19;::::0;;;;:30:::1;;:40:::0;;59269:6;;59235:19;:40:::1;::::0;59269:6;;59235:40:::1;:::i;:::-;::::0;;;-1:-1:-1;;59294:10:0::1;59286:19;::::0;;;:7:::1;:19;::::0;;;;59331:15:::1;59286:42;::::0;;::::1;:60:::0;-1:-1:-1;36806:20:0;36200:1;37322:7;:22;37139:213;63452:1862;36762:21;:19;:21::i;:::-;63602:10:::1;63570:21;63594:19:::0;;;:7:::1;:19;::::0;;;;63652:23:::1;::::0;::::1;::::0;63594:19;;63570:21;63648:27:::1;::::0;63570:21;63648:27:::1;:::i;:::-;63691:17;::::0;::::1;::::0;63626:49;;-1:-1:-1;63691:21:0;63688:1288:::1;;63730:14;63784:6;:17;;;63747:34;63763:10;63775:5;63747:15;:34::i;:::-;:54;;;;:::i;:::-;63730:71;;63816:18;63849:17:::0;63869:12:::1;63894:1:::0;63882:6:::1;:9;;;:13;;;;:::i;:::-;63869:27;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;:34:::1;:27;::::0;;::::1;;:34;:41:::0;;-1:-1:-1;63930:10:0;;63927:151:::1;;63960:15;63969:5;63960:8;:15::i;:::-;64014:7;::::0;64002:44:::1;::::0;-1:-1:-1;;;;;64014:7:0::1;64023:5:::0;64030:2;64034:5;64041:4;64002:11:::1;:44::i;:::-;63994:68;;;::::0;-1:-1:-1;;;63994:68:0;;21005:2:1;63994:68:0::1;::::0;::::1;20987:21:1::0;21044:2;21024:18;;;21017:30;-1:-1:-1;;;21063:18:1;;;21056:41;21114:18;;63994:68:0::1;20803:335:1::0;63994:68:0::1;64113:5;64094:6;:16;;:24;;;;64151:5;64133:6;:14;;;:23;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;64205:15:0::1;64173:29;::::0;::::1;:47:::0;64253:9:::1;64248:715;64268:9;64264:1;:13;64248:715;;;64319:18;64340:10;:49;64351:12;64376:1:::0;64364:6:::1;:9;;;:13;;;;:::i;:::-;64351:27;;;;;;;;:::i;:::-;;;;;;;;;;;:34;;64386:1;64351:37;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;::::0;64340:49;;;::::1;::::0;;;;;;;;64411:10;;64340:49;;-1:-1:-1;;;;;;64411:10:0::1;64425;64411:24;64408:529;;;64535:7;;64517:4;:13;;;64501;;:29;;;;:::i;:::-;64484:13;;:47;;;;:::i;:::-;64483:59;;;;:::i;:::-;64482:65;::::0;64546:1:::1;64482:65;:::i;:::-;64472:76;::::0;:6;:76:::1;:::i;:::-;64459:89;;64603:13;;64590:10;64574:4;:13;;;:26;;;;:::i;:::-;:42;64571:347;;;64661:10;64644:4;:13;;;:27;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;64712:25:0::1;::::0;-1:-1:-1;64727:10:0;64712:25;::::1;:::i;:::-;;;64571:347;;;64825:4;:13;;;64809;;:29;;;;:::i;:::-;64794:44;::::0;;::::1;:::i;:::-;64881:13;::::0;64865::::1;::::0;::::1;:29:::0;64794:44;-1:-1:-1;64571:347:0::1;-1:-1:-1::0;64279:3:0::1;::::0;::::1;:::i;:::-;;;64248:715;;;;63713:1263;;;63688:1288;65010:1;64996:11;:15;65027:10;65013:49;;;;;;;;:::i;:::-;;;;;;;;;;;;;64988:75;;;;;-1:-1:-1::0;;;64988:75:0::1;;;;;;;;:::i;:::-;;65096:14;;65082:11;:28;65126:10;65112:42;;;;;;;;:::i;:::-;;;;;;;;;;;;;65074:81;;;;;-1:-1:-1::0;;;65074:81:0::1;;;;;;;;:::i;:::-;;65205:11;65180:6;:21;;;:36;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;65253:1:0::1;65227:23;::::0;::::1;:27:::0;65267:37:::1;::::0;-1:-1:-1;;;65267:37:0;;65280:10:::1;65267:37;::::0;::::1;20321:74:1::0;20411:18;;;20404:34;;;65267:7:0::1;-1:-1:-1::0;;;;;65267:12:0::1;::::0;::::1;::::0;20294:18:1;;65267:37:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;63557:1757;;36806:20:::0;36200:1;37322:7;:22;37139:213;36806:20;63452:1862;;;;:::o;65793:106::-;55962:7;;55971:49;;-1:-1:-1;;;;;55962:7:0;;;55948:10;:21;;55971:49;;55985:10;;55971:49;;;:::i;:::-;;;;;;;;;;;;;55940:81;;;;;-1:-1:-1;;;55940:81:0;;;;;;;;:::i;:::-;-1:-1:-1;65867:12:0::1;:24:::0;65793:106::o;50461:208::-;55962:7;;55971:49;;50572:4;;-1:-1:-1;;;;;55962:7:0;55948:10;:21;;55971:49;;55985:10;;55971:49;;;:::i;:::-;;;;;;;;;;;;;55940:81;;;;;-1:-1:-1;;;55940:81:0;;;;;;;;:::i;:::-;-1:-1:-1;50636:25:0::1;::::0;-1:-1:-1;;;50636:25:0;;-1:-1:-1;;;;;20339:55:1;;;50636:25:0::1;::::0;::::1;20321:74:1::0;20411:18;;;20404:34;;;50612:5:0;;50636:9;;::::1;::::0;::::1;::::0;20294:18:1;;50636:25:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;66286:452::-:0;-1:-1:-1;;;;;66383:14:0;;66369:11;66383:14;;;:7;:14;;;;;:17;66341:16;;66369:11;66383:21;;66403:1;;66383:21;:::i;:::-;66369:35;;66415:21;66453:12;66466:3;66453:17;;;;;;;;:::i;:::-;;;;;;;;;;;:23;;:30;;;;66439:45;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;66439:45:0;;66415:69;;66500:9;66495:214;66519:12;66532:3;66519:17;;;;;;;;:::i;:::-;;;;;;;;;;;:23;;:30;;;;66515:1;:34;66495:214;;;66621:5;-1:-1:-1;;;;;66574:52:0;:9;:37;66584:12;66597:3;66584:17;;;;;;;;:::i;:::-;;;;;;;;;;;:23;;66608:1;66584:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;66574:37;;;;;;;;;;;;:43;-1:-1:-1;;;;;66574:43:0;:52;66571:127;;;66656:12;66669:3;66656:17;;;;;;;;:::i;:::-;;;;;;;;;;;:23;;66680:1;66656:26;;;;;;;;:::i;:::-;;;;;;;;;66646:4;66651:1;66646:7;;;;;;;;:::i;:::-;;;;;;:36;;;;;66571:127;66551:3;;;:::i;:::-;;;66495:214;;62157:1287;-1:-1:-1;;;;;62290:16:0;;62236;62290;;;:7;:16;;;;;;;;62267:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62236:16;;62340:52;;62267:39;62340:15;:52::i;:::-;62319:73;-1:-1:-1;62403:18:0;62481:1;62455:14;62481:1;62319:73;62455:14;:::i;:::-;62440:10;;62427:23;;:10;:23;:::i;:::-;62426:44;;;;:::i;:::-;62425:52;;62474:3;62425:52;:::i;:::-;62424:58;;;;:::i;:::-;62403:79;-1:-1:-1;62493:20:0;62516:16;62529:3;62403:79;62516:16;:::i;:::-;62493:39;;62543:14;62623:3;62602:6;:17;;;62591:6;62576:12;:21;;;;:::i;:::-;62562:36;;:10;:36;:::i;:::-;62561:58;;;;:::i;:::-;62560:66;;;;:::i;:::-;62543:83;;62647:11;62673:1;62661:6;:9;;;:13;;;;:::i;:::-;62647:27;-1:-1:-1;62693:19:0;;62729:556;62753:12;62766:3;62753:17;;;;;;;;:::i;:::-;;;;;;;;;;;:24;;:31;;;;62749:1;:35;62729:556;;;62818:17;62838:10;:39;62849:12;62862:3;62849:17;;;;;;;;:::i;:::-;;;;;;;;;;;:24;;62874:1;62849:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;62838:39;;;;;;;;;;;;;;;62818:59;;;;;;;;;-1:-1:-1;;;;;62818:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;62895:21:0;;;62892:382;;;62936:18;63020:7;;63002:4;:13;;;62986;;:29;;;;:::i;:::-;62969:13;;:47;;;;:::i;:::-;62968:59;;;;:::i;:::-;62967:65;;63031:1;62967:65;:::i;:::-;62957:76;;:6;:76;:::i;:::-;62936:97;;63084:13;;63071:10;63055:4;:13;;;:26;;;;:::i;:::-;:42;63052:207;;;63121:25;63136:10;63121:25;;:::i;:::-;;;63052:207;;;63226:4;:13;;;63210;;:29;;;;:::i;:::-;63195:44;;;;:::i;:::-;;;63052:207;62917:357;62892:382;-1:-1:-1;62786:3:0;;;:::i;:::-;;;62729:556;;;;63421:12;;63406:11;63374:6;:17;;;63341:6;:29;;;63323:15;:47;;;;:::i;:::-;63322:69;;;;:::i;:::-;63306:111;;;;:::i;:::-;63305:128;;;;:::i;:::-;63297:137;;;;;;;;;62157:1287;;;;;:::o;59364:1412::-;36762:21;:19;:21::i;:::-;59482:10:::1;59450:21;59474:19:::0;;;:7:::1;:19;::::0;;;;;;;;59528:17:::1;::::0;::::1;::::0;59564:52;;59474:19;;59528:21;;;59564:52:::1;::::0;59578:10:::1;::::0;59564:52:::1;;:::i;:::-;;;;;;;;;;;;;59506:121;;;;;-1:-1:-1::0;;;59506:121:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;59659:1:0::1;59640:16;::::0;::::1;:20:::0;;;59720:9;59659:1;59720:9;59764:30:::1;59780:10;59659:1:::0;59764:15:::1;:30::i;:::-;:39;;;;:::i;:::-;59747:56;;59814:18;59850:9:::0;59845:779:::1;59865:6;59861:1;:10;59845:779;;;59895:18;59916:10;:24;59927:9;;59937:1;59927:12;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;::::1;;59916:24:::0;;-1:-1:-1;59916:24:0;;::::1;::::0;;;;;;;;-1:-1:-1;59916:24:0;59965:10;;59991:34;;59916:24;;-1:-1:-1;;;;;;59965:10:0;;;::::1;59979;59965:24;::::0;59991:34:::1;::::0;60005:10:::1;::::0;60016:8:::1;::::0;59991:34:::1;;:::i;:::-;;;;;;;;;;;;;59957:69;;;;;-1:-1:-1::0;;;59957:69:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;60055:23:0;;-1:-1:-1;;;;;;60055:23:0::1;::::0;;60171:7:::1;::::0;60153:13:::1;::::0;::::1;::::0;60137::::1;::::0;:29:::1;::::0;60153:13;60137:29:::1;:::i;:::-;60120:13;;:47;;;;:::i;:::-;60119:59;;;;:::i;:::-;60118:65;::::0;60182:1:::1;60118:65;:::i;:::-;60108:76;::::0;:6;:76:::1;:::i;:::-;60095:89;;60233:13;;60220:10;60204:4;:13;;;:26;;;;:::i;:::-;:42;60201:293;;;60283:10;60266:4;:13;;;:27;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;60328:21:0::1;::::0;-1:-1:-1;60339:10:0;60328:21;::::1;:::i;:::-;;;60201:293;;;60417:4;:13;;;60401;;:29;;;;:::i;:::-;60390:40;::::0;;::::1;:::i;:::-;60465:13;::::0;60449::::1;::::0;::::1;:29:::0;60390:40;-1:-1:-1;60201:293:0::1;60521:15;60510:8;::::0;::::1;:26:::0;-1:-1:-1;;;;;60551:5:0::1;:18;;60578:4;60585:10;60597:9:::0;;60607:1;60597:12;;::::1;;;;;:::i;:::-;60551:59;::::0;-1:-1:-1;;;;;;60551:59:0::1;::::0;;;;;;-1:-1:-1;;;;;19213:15:1;;;60551:59:0::1;::::0;::::1;19195:34:1::0;19265:15;;;;19245:18;;;19238:43;-1:-1:-1;60597:12:0::1;::::0;;::::1;;;19297:18:1::0;;;19290:34;19107:18;;60551:59:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;59878:746;59873:3;;;;:::i;:::-;;;59845:779;;;;60663:7;60636:6;:23;;;:34;;;;;;;:::i;:::-;;;;;;;;60702:6;60681;:17;;;:27;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;60751:15:0::1;60719:29;::::0;;::::1;:47:::0;;;;-1:-1:-1;;36200:1:0;37322:7;:22;-1:-1:-1;36806:20:0;;-1:-1:-1;37139:213:0;65972:306;-1:-1:-1;;;;;66157:14:0;;66053:18;66157:14;;;:7;:14;;;;;:24;;;;66183:25;;;;;66053:18;;;;;;66157:24;66210:26;66165:5;66210:19;:26::i;:::-;66238:31;66255:5;66262:6;66238:16;:31::i;:::-;66149:121;;;;-1:-1:-1;66149:121:0;-1:-1:-1;66149:121:0;;-1:-1:-1;65972:306:0;-1:-1:-1;;;65972:306:0:o;52415:463::-;55814:11;;55835:44;;55814:11;;;;;;:20;;55835:44;;55849:10;;55835:44;;;:::i;:::-;;;;;;;;;;;;;55806:74;;;;;-1:-1:-1;;;55806:74:0;;;;;;;;:::i;:::-;;36762:21:::1;:19;:21::i;:::-;52507:13:::2;52540:6;52523:14;;:23;;;;:::i;:::-;52507:39;;52578:5;52565:9;:18;;52599:10;52585:51;;;;;;;;:::i;:::-;;;;;;;;;;;;;52557:80;;;;;-1:-1:-1::0;;;52557:80:0::2;;;;;;;;:::i;:::-;-1:-1:-1::0;52656:10:0::2;::::0;:35:::2;::::0;-1:-1:-1;;;52656:35:0;;52672:10:::2;52656:35;::::0;::::2;20321:74:1::0;20411:18;;;20404:34;;;-1:-1:-1;;;;;52656:10:0;;::::2;::::0;:15:::2;::::0;20294:18:1;;52656:35:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;52718:12;;52710:5;:20;;;;:::i;:::-;52745:10;::::0;52702:28;;-1:-1:-1;52745:10:0::2;;:18;;:10:::0;:18:::2;52741:130;;;52780:5;::::0;:32:::2;::::0;-1:-1:-1;;;52780:32:0;;52799:4:::2;52780:32;::::0;::::2;20321:74:1::0;20411:18;;;20404:34;;;-1:-1:-1;;;;;52780:5:0;;::::2;::::0;:10:::2;::::0;20294:18:1;;52780:32:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;52839:10:0::2;52828:22;::::0;;;:10:::2;:22;::::0;;;;:31;;52854:5;;-1:-1:-1;52828:22:0;;-1:-1:-1;52828:31:0::2;::::0;52854:5;;52828:31:::2;:::i;:::-;::::0;;;-1:-1:-1;;52741:130:0::2;52496:382;36806:20:::1;36200:1:::0;37322:7;:22;37139:213;54220:473;55962:7;;55971:49;;-1:-1:-1;;;;;55962:7:0;;;55948:10;:21;;55971:49;;55985:10;;55971:49;;;:::i;:::-;;;;;;;;;;;;;55940:81;;;;;-1:-1:-1;;;55940:81:0;;;;;;;;:::i;:::-;-1:-1:-1;54363:11:0::1;::::0;54384:49:::1;::::0;54363:11:::1;;::::0;;::::1;::::0;;;::::1;:19;;:11;:19;::::0;54384:49:::1;::::0;54398:10:::1;::::0;54384:49:::1;;;:::i;:::-;;;;;;;;;;;;;54355:79;;;;;-1:-1:-1::0;;;54355:79:0::1;;;;;;;;:::i;:::-;;54449:9;54445:241;54464:4;:11;54460:1;:15;54445:241;;;54526:6;54533:1;54526:9;;;;;;;;:::i;:::-;;;;;;;54504:10;:19;54515:4;54520:1;54515:7;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;54504:19:0::1;-1:-1:-1::0;;;;;54504:19:0::1;;;;;;;;;;;;;:31;54551:10;54562:11;54537:37;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54496:79;;;;;-1:-1:-1::0;;;54496:79:0::1;;;;;;;;:::i;:::-;;54620:6;54627:1;54620:9;;;;;;;;:::i;:::-;;;;;;;54597:10;:19;54608:4;54613:1;54608:7;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;54597:19:0::1;-1:-1:-1::0;;;;;54597:19:0::1;;;;;;;;;;;;;:32;;;;;;;:::i;:::-;;;;;;;;54665:6;54672:1;54665:9;;;;;;;;:::i;:::-;;;;;;;54644:10;:17;54655:2;54658:1;54655:5;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;54644:17:0::1;-1:-1:-1::0;;;;;54644:17:0::1;;;;;;;;;;;;;:30;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;54477:3:0::1;::::0;-1:-1:-1;54477:3:0;::::1;:::i;:::-;;;54445:241;;60784:1055:::0;36762:21;:19;:21::i;:::-;60938:10:::1;60864:14;60930:19:::0;;;:7:::1;:19;::::0;;;;;;;;:29:::1;;::::0;60978:57;;60881:9;;60930:33;;;60978:57:::1;::::0;60992:10:::1;::::0;60978:57:::1;;:::i;:::-;;;;;;;;;;;;;60908:138;;;;;-1:-1:-1::0;;;60908:138:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;61121:10:0::1;61113:19;::::0;;;:7:::1;:19;::::0;;;;:29:::1;;::::0;:38:::1;::::0;61145:6;;61113:38:::1;:::i;:::-;61079:7;:19;61087:10;-1:-1:-1::0;;;;;61079:19:0::1;-1:-1:-1::0;;;;;61079:19:0::1;;;;;;;;;;;;:30;;;:72;;61180:10;61166:60;;;;;;;;:::i;:::-;;;;;;;;;;;;;61057:180;;;;;-1:-1:-1::0;;;61057:180:0::1;;;;;;;;:::i;:::-;;61248:15;61266:31;61286:10;61266:19;:31::i;:::-;61316:10;61308:19;::::0;;;:7:::1;:19;::::0;;;;:41:::1;;:52:::0;;61248:49;;-1:-1:-1;61248:49:0;;61308:41;;:19;:52:::1;::::0;61248:49;;61308:52:::1;:::i;:::-;::::0;;;-1:-1:-1;61376:9:0::1;::::0;-1:-1:-1;61371:343:0::1;61391:6;61387:1;:10;61371:343;;;61460:10;61427:9;:23;61437:9:::0;;61447:1;61437:12;;::::1;;;;;:::i;:::-;;;;;;;61427:23;;;;;;;;;;;:29;;;;;;;;;;-1:-1:-1::0;;;;;61427:29:0::1;-1:-1:-1::0;;;;;61427:43:0::1;;61485:10;61496:8;61471:34;;;;;;;;;:::i;:::-;;;;;;;;;;;;;61419:87;;;;;-1:-1:-1::0;;;61419:87:0::1;;;;;;;;:::i;:::-;;61561:1;61521:9;:23;61531:9;;61541:1;61531:12;;;;;;;:::i;:::-;;;;;;;61521:23;;;;;;;;;;;:29;;;:42;;;;;-1:-1:-1::0;;;;;61521:42:0::1;;;;;-1:-1:-1::0;;;;;61521:42:0::1;;;;;;61608:15;61578:9;:23;61588:9;;61598:1;61588:12;;;;;;;:::i;:::-;;;;;;;61578:23;;;;;;;;;;;:27;;:45;;;;61638:10;-1:-1:-1::0;;;;;61638:23:0::1;;61670:4;61677:10;61689:9;;61699:1;61689:12;;;;;;;:::i;:::-;61638:64;::::0;-1:-1:-1;;;;;;61638:64:0::1;::::0;;;;;;-1:-1:-1;;;;;19213:15:1;;;61638:64:0::1;::::0;::::1;19195:34:1::0;19265:15;;;;19245:18;;;19238:43;-1:-1:-1;61689:12:0::1;::::0;;::::1;;;19297:18:1::0;;;19290:34;19107:18;;61638:64:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;61399:3;;;;:::i;:::-;;;61371:343;;;-1:-1:-1::0;61732:10:0::1;61724:19;::::0;;;:7:::1;:19;::::0;;;;:29:::1;;:39:::0;;61757:6;;61724:19;:39:::1;::::0;61757:6;;61724:39:::1;:::i;:::-;::::0;;;-1:-1:-1;;61782:10:0::1;61774:19;::::0;;;:7:::1;:19;::::0;;;;61816:15:::1;61774:39;::::0;;::::1;:57:::0;-1:-1:-1;36806:20:0;;-1:-1:-1;36200:1:0;37322:7;:22;37139:213;51465:938;36762:21;:19;:21::i;:::-;51601:10:::1;51525:18;51593:19:::0;;;:7:::1;:19;::::0;;;;:41:::1;;::::0;51525:18;;51546:31:::1;::::0;:19:::1;:31::i;:::-;:88;;;;:::i;:::-;51525:109;;51666:1;51653:10;:14;51683:10;51669:50;;;;;;;;:::i;:::-;;;;;;;;;;;;;51645:75;;;;;-1:-1:-1::0;;;51645:75:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;51794:10:0::1;51756:14;51786:19:::0;;;:7:::1;:19;::::0;;;;:29:::1;;::::0;51773:10;51786:29;51773:42:::1;;;;:::i;:::-;51838:10;51830:19;::::0;;;:7:::1;:19;::::0;;;;51872:15:::1;51830:39;::::0;::::1;:57:::0;51902:39:::1;::::0;::::1;:53:::0;;;::::1;::::0;;51970:41:::1;::::0;::::1;:45:::0;;;52044:22;51773:42;;;::::1;::::0;-1:-1:-1;;;52044:26:0;;;;52085:250:::1;52104:12;52117:3;52104:17;;;;;;;;:::i;:::-;;;;;;;;;;;:23;;:30;;;;52100:1;:34;52085:250;;;52208:10;-1:-1:-1::0;;;;;52161:57:0::1;:9;:37;52171:12;52184:3;52171:17;;;;;;;;:::i;:::-;;;;;;;;;;;:23;;52195:1;52171:26;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;::::0;52161:37;;;::::1;::::0;;;;;;;;:43;-1:-1:-1;;;;;52161:43:0::1;:57;52158:162;;;52294:6;52242:9;:37;52252:12;52265:3;52252:17;;;;;;;;:::i;:::-;;;;;;;;;;;:23;;52276:1;52252:26;;;;;;;;:::i;:::-;;;;;;;;;52242:37;;;;;;;;;;;:48;;;:58;;;;;;;;;;;52158:162;52135:3;;52085:250;;;-1:-1:-1::0;;52356:10:0::1;::::0;:39:::1;::::0;-1:-1:-1;;;52356:39:0;;52372:10:::1;52356:39;::::0;::::1;20321:74:1::0;20411:18;;;20404:34;;;-1:-1:-1;;;;;52356:10:0;;::::1;::::0;-1:-1:-1;52356:15:0::1;::::0;20294:18:1;;52356:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;51514:889;36806:20:::0;36200:1;37322:7;:22;37139:213;36806:20;51465:938::o;53792:420::-;36762:21;:19;:21::i;:::-;53872:5:::1;::::0;:30:::1;::::0;-1:-1:-1;;;53872:30:0;;53888:10:::1;53872:30;::::0;::::1;20321:74:1::0;53872:5:0::1;20411:18:1::0;;;20404:34;53906:6:0;;-1:-1:-1;;;;;53872:5:0::1;::::0;:15:::1;::::0;20294:18:1;;53872:30:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:40;;53928:10;53939:11;53914:37;;;;;;;;;:::i;:::-;;;;;;;;;;;;;53864:88;;;;;-1:-1:-1::0;;;53864:88:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;53999:14:0::1;::::0;53963::::1;::::0;53981::::1;53990:5;53981:6:::0;:14:::1;:::i;:::-;53980:33;;;;:::i;:::-;54024:5;::::0;53963:50;;-1:-1:-1;;;;;;54024:5:0::1;:10;54035;54047:15;53963:50:::0;54047:6;:15:::1;:::i;:::-;54024:39;::::0;-1:-1:-1;;;;;;54024:39:0::1;::::0;;;;;;-1:-1:-1;;;;;20339:55:1;;;54024:39:0::1;::::0;::::1;20321:74:1::0;20411:18;;;20404:34;20294:18;;54024:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;54144:12:0::1;::::0;54107:10:::1;::::0;-1:-1:-1;54099:58:0::1;::::0;-1:-1:-1;54125:15:0::1;54134:6:::0;54125;:15:::1;:::i;:::-;54124:32;;;;:::i;:::-;54099:58;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;54091:67;;;::::0;::::1;;54190:6;54169:17;;:27;;;;;;;:::i;36842:289::-:0;36244:1;36972:7;;:19;;36964:63;;;;-1:-1:-1;;;36964:63:0;;25152:2:1;36964:63:0;;;25134:21:1;25191:2;25171:18;;;25164:30;25230:33;25210:18;;;25203:61;25281:18;;36964:63:0;24950:355:1;36964:63:0;36244:1;37105:7;:18;36842:289::o;69803:1558::-;-1:-1:-1;;;;;69886:16:0;;69862:21;69886:16;;;:7;:16;;;;;69918:9;;69915:236;;69948:12;:19;;;;;;;-1:-1:-1;69948:19:0;;;70028:7;;69948:12;69995:23;;69948:12;;69995:23;:::i;:::-;69982:37;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:53;;-1:-1:-1;;;;;;69982:53:0;-1:-1:-1;;;;;69982:53:0;;;;;;;;;;;70078:15;70050:25;;;:43;-1:-1:-1;70120:19:0;70108:31;;69915:236;70167:16;;;;:20;70163:113;;70236:28;70256:7;70236:19;:28::i;:::-;70204:6;:28;;;:60;;;;;;;:::i;:::-;;;;-1:-1:-1;;70163:113:0;70293:17;;;;:21;70289:1063;;70334:19;70386:14;70433:6;:17;;;70403:27;70419:7;70428:1;70403:15;:27::i;:::-;:47;;;;:::i;:::-;70386:64;-1:-1:-1;70467:18:0;;70502:720;70526:6;:17;;;70522:1;:21;70502:720;;;70581:18;70602:10;:49;70613:12;70638:1;70626:6;:9;;;:13;;;;:::i;:::-;70613:27;;;;;;;;:::i;:::-;;;;;;;;;;;:34;;70648:1;70613:37;;;;;;;;:::i;:::-;;;;;;;;;;;;;70602:49;;;;;;;;;;;;70673:10;;70602:49;;-1:-1:-1;;;;;;70673:10:0;;;:21;;;;70670:526;;;70794:7;;70776:4;:13;;;70760;;:29;;;;:::i;:::-;70743:13;;:47;;;;:::i;:::-;70742:59;;;;:::i;:::-;70741:65;;70805:1;70741:65;:::i;:::-;70731:76;;:6;:76;:::i;:::-;70718:89;;70862:13;;70849:10;70833:4;:13;;;:26;;;;:::i;:::-;:42;70830:347;;;70920:10;70903:4;:13;;;:27;;;;;;;:::i;:::-;;;;-1:-1:-1;70971:25:0;;-1:-1:-1;70986:10:0;70971:25;;:::i;:::-;;;70830:347;;;71084:4;:13;;;71068;;:29;;;;:::i;:::-;71053:44;;;;:::i;:::-;71140:13;;71124;;;:29;71053:44;-1:-1:-1;70830:347:0;-1:-1:-1;70545:3:0;;;:::i;:::-;;;70502:720;;;;71270:15;71238:6;:29;;:47;;;;71327:11;71300:6;:23;;;:38;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;69849:1512:0;69803:1558;:::o;68498:190::-;68597:22;;-1:-1:-1;;;68597:22:0;;;;;1808:25:1;;;68623:10:0;;-1:-1:-1;;;;;68597:19:0;;;;;1781:18:1;;68597:22:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;68597:36:0;;68649:10;68660:8;68635:34;;;;;;;;;:::i;:::-;;;;;;;;;;;;;68575:105;;;;;-1:-1:-1;;;68575:105:0;;;;;;;;:::i;:::-;;68498:190;;:::o;68696:534::-;-1:-1:-1;;;;;68842:16:0;;68768:12;68842:16;;;:7;:16;;;;;:19;68768:12;;68829;;68842:23;;68829:12;;68842:23;:::i;:::-;68829:37;;;;;;;;:::i;:::-;;;;;;;;;;;68799:67;;68881:9;68877:171;68896:12;;;:19;68892:23;;68877:171;;;68957:6;68938;:12;;68951:1;68938:15;;;;;;;;:::i;:::-;;;;;;;;;:25;68935:102;;;68993:4;68983:14;;69016:5;;68935:102;68916:3;;;:::i;:::-;;;68877:171;;;-1:-1:-1;69069:16:0;69066:157;;69116:12;;;;:19;;69150;;;;;;69101:12;69150:19;;;69205:6;;69116:12;:19;;69184:18;;;;;;:::i;:::-;;;;;;;;;;:27;-1:-1:-1;68757:473:0;;68696:534;;:::o;68215:275::-;68389:10;68398:1;68389:6;:10;:::i;:::-;-1:-1:-1;;;;;68361:13:0;;;;;;:7;:13;;;;;:24;;;:39;;;;:::i;:::-;68342:16;;-1:-1:-1;;;;;68316:13:0;;;;;;:7;:13;;;;;:23;;;:42;;68342:16;68316:42;:::i;:::-;:84;68429:10;68415:56;;;;;;;;:::i;69238:557::-;-1:-1:-1;;;;;69356:16:0;;69311:12;69356:16;;;:7;:16;;;;;:19;69311:12;;69356:23;;69378:1;;69356:23;:::i;:::-;69342:37;;69394:9;69390:195;69409:12;69422:3;69409:17;;;;;;;;:::i;:::-;;;;;;;;;;;:24;;:31;;;;69405:1;:35;69390:195;;;69494:6;69463:12;69476:3;69463:17;;;;;;;;:::i;:::-;;;;;;;;;;;:24;;69488:1;69463:27;;;;;;;;:::i;:::-;;;;;;;;;:37;69460:114;;;69530:4;69520:14;;69553:5;;69460:114;69441:3;;;:::i;:::-;;;69390:195;;;-1:-1:-1;69598:16:0;69595:193;;69630:12;69645;69658:3;69645:17;;;;;;;;:::i;:::-;;;;;;;;;;;:24;;:31;;;;69630:46;;69691:12;69704:3;69691:17;;;;;;;;:::i;:::-;;;;;;;;:24;:17;;;;;:24;:31;;;;;;;;;;69737:17;;69770:6;;69691:31;69750:3;;69737:17;;;;;;:::i;:::-;;;;;;;;;;;:24;;69762:4;69737:30;;;;;;;;:::i;39794:219::-;39855:16;;;;:9;:16;;;;;;;;;:21;;39847:52;;;;-1:-1:-1;;;39847:52:0;;26151:2:1;39847:52:0;;;26133:21:1;26190:2;26170:18;;;26163:30;26229:20;26209:18;;;26202:48;26267:18;;39847:52:0;25949:342:1;39847:52:0;39921:9;;39913:5;:17;39910:65;;;39946:9;:17;;;39910:65;39985:16;;;;:9;:16;;;;;:20;;-1:-1:-1;;39985:20:0;40004:1;39985:20;;;39794:219::o;41933:541::-;42114:4;42147:15;42134:10;:2;42139:5;42134:10;:::i;:::-;:28;42131:326;;;41876:36;;;;;;;26481:19:1;;;26516:12;;;26509:28;;;26553:12;;;;26546:28;;;41876:36:0;;;;;;;;;;26590:12:1;;;41876:36:0;;41866:47;;;;;;26855:66:1;40367::0;;;26843:79:1;26938:12;;;;26931:28;;;40367:66:0;;;;;;;;;;26975:12:1;;;;40367:66:0;;;40339:109;;;;;42393:7;-1:-1:-1;;;;;42343:57:0;:46;42357:20;42379:9;42343:13;:46::i;:::-;-1:-1:-1;;;;;42343:57:0;;42336:64;;;;;;42131:326;-1:-1:-1;42440:5:0;42433:12;;61847:302;61924:18;61968:12;61975:5;61968:4;:12;:::i;:::-;61955:25;;62022:13;;62009:10;:26;62006:107;;;-1:-1:-1;62076:13:0;;61847:302;;;;:::o;50677:333::-;-1:-1:-1;;;;;50768:14:0;;50744:7;50768:14;;;:7;:14;;;;;:24;;;50764:105;;-1:-1:-1;;;;;;50821:14:0;;;;;:7;:14;;;;;:36;;;;50677:333::o;50764:105::-;50879:16;50950:26;50970:5;50950:19;:26::i;:::-;-1:-1:-1;;;;;50898:14:0;;;;;;:7;:14;;;;;:36;;;:78;;;;:::i;:::-;50879:97;50677:333;-1:-1:-1;;;50677:333:0:o;67923:284::-;-1:-1:-1;;;;;68027:14:0;;68003:7;68027:14;;;:7;:14;;;;;:25;;;68023:177;;-1:-1:-1;;;;;;68068:14:0;;;;;;:7;:14;;;;;:31;;;68061:38;;68023:177;68168:29;68184:5;68190:6;68168:15;:29::i;:::-;-1:-1:-1;;;;;68134:14:0;;;;;;:7;:14;;;;;:31;;;:63;;;;:::i;:::-;68126:71;;;;51018:439;51154:10;;51114:16;;-1:-1:-1;;;;;51154:10:0;51151:299;;-1:-1:-1;51212:1:0;;51018:439;-1:-1:-1;51018:439:0:o;51151:299::-;-1:-1:-1;;;;;51269:16:0;;51246:20;51269:16;;;:7;:16;;;;;;;;;51246:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51426:11;51413:9;;51426:11;;51246:39;51330:44;;:15;:44;:::i;:::-;51329:65;;;;:::i;:::-;51309:113;;;;:::i;:::-;51308:129;;;;:::i;40468:283::-;40597:7;40623:9;40634;40645:7;40656:26;40671:10;40656:14;:26::i;:::-;40702:41;;;;;;;;;;;;27225:25:1;;;27298:4;27286:17;;27266:18;;;27259:45;;;;27320:18;;;27313:34;;;27363:18;;;27356:34;;;40622:60:0;;-1:-1:-1;40622:60:0;;-1:-1:-1;40622:60:0;-1:-1:-1;40702:41:0;;27197:19:1;;40702:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;40702:41:0;;-1:-1:-1;;40702:41:0;;;40468:283;-1:-1:-1;;;;;;;40468:283:0:o;40759:893::-;40865:9;40889;40913:7;40956:3;:10;40970:2;40956:16;40948:53;;;;-1:-1:-1;;;40948:53:0;;27603:2:1;40948:53:0;;;27585:21:1;27642:2;27622:18;;;27615:30;27681:26;27661:18;;;27654:54;27725:18;;40948:53:0;27401:348:1;40948:53:0;-1:-1:-1;;;41410:2:0;41401:12;;41395:19;41480:2;41471:12;;41465:19;41587:2;41578:12;;;41572:19;41395;;41569:1;41564:28;;;;;40759:893::o;14:180:1:-;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;-1:-1:-1;165:23:1;;14:180;-1:-1:-1;14:180:1:o;199:286::-;257:6;310:2;298:9;289:7;285:23;281:32;278:52;;;326:1;323;316:12;278:52;352:23;;-1:-1:-1;;;;;;404:32:1;;394:43;;384:71;;451:1;448;441:12;931:154;-1:-1:-1;;;;;1010:5:1;1006:54;999:5;996:65;986:93;;1075:1;1072;1065:12;1090:315;1158:6;1166;1219:2;1207:9;1198:7;1194:23;1190:32;1187:52;;;1235:1;1232;1225:12;1187:52;1274:9;1261:23;1293:31;1318:5;1293:31;:::i;:::-;1343:5;1395:2;1380:18;;;;1367:32;;-1:-1:-1;;;1090:315:1:o;1410:247::-;1469:6;1522:2;1510:9;1501:7;1497:23;1493:32;1490:52;;;1538:1;1535;1528:12;1490:52;1577:9;1564:23;1596:31;1621:5;1596:31;:::i;1844:127::-;1905:10;1900:3;1896:20;1893:1;1886:31;1936:4;1933:1;1926:15;1960:4;1957:1;1950:15;1976:275;2047:2;2041:9;2112:2;2093:13;;-1:-1:-1;;2089:27:1;2077:40;;2147:18;2132:34;;2168:22;;;2129:62;2126:88;;;2194:18;;:::i;:::-;2230:2;2223:22;1976:275;;-1:-1:-1;1976:275:1:o;2256:183::-;2316:4;2349:18;2341:6;2338:30;2335:56;;;2371:18;;:::i;:::-;-1:-1:-1;2416:1:1;2412:14;2428:4;2408:25;;2256:183::o;2444:662::-;2498:5;2551:3;2544:4;2536:6;2532:17;2528:27;2518:55;;2569:1;2566;2559:12;2518:55;2605:6;2592:20;2631:4;2655:60;2671:43;2711:2;2671:43;:::i;:::-;2655:60;:::i;:::-;2749:15;;;2835:1;2831:10;;;;2819:23;;2815:32;;;2780:12;;;;2859:15;;;2856:35;;;2887:1;2884;2877:12;2856:35;2923:2;2915:6;2911:15;2935:142;2951:6;2946:3;2943:15;2935:142;;;3017:17;;3005:30;;3055:12;;;;2968;;2935:142;;;-1:-1:-1;3095:5:1;2444:662;-1:-1:-1;;;;;;2444:662:1:o;3111:348::-;3195:6;3248:2;3236:9;3227:7;3223:23;3219:32;3216:52;;;3264:1;3261;3254:12;3216:52;3304:9;3291:23;3337:18;3329:6;3326:30;3323:50;;;3369:1;3366;3359:12;3323:50;3392:61;3445:7;3436:6;3425:9;3421:22;3392:61;:::i;:::-;3382:71;3111:348;-1:-1:-1;;;;3111:348:1:o;3464:347::-;3515:8;3525:6;3579:3;3572:4;3564:6;3560:17;3556:27;3546:55;;3597:1;3594;3587:12;3546:55;-1:-1:-1;3620:20:1;;3663:18;3652:30;;3649:50;;;3695:1;3692;3685:12;3649:50;3732:4;3724:6;3720:17;3708:29;;3784:3;3777:4;3768:6;3760;3756:19;3752:30;3749:39;3746:59;;;3801:1;3798;3791:12;3746:59;3464:347;;;;;:::o;3816:754::-;3913:6;3921;3929;3937;3945;3998:3;3986:9;3977:7;3973:23;3969:33;3966:53;;;4015:1;4012;4005:12;3966:53;4054:9;4041:23;4073:31;4098:5;4073:31;:::i;:::-;4123:5;-1:-1:-1;4180:2:1;4165:18;;4152:32;4193:33;4152:32;4193:33;:::i;:::-;4245:7;-1:-1:-1;4299:2:1;4284:18;;4271:32;;-1:-1:-1;4354:2:1;4339:18;;4326:32;4381:18;4370:30;;4367:50;;;4413:1;4410;4403:12;4367:50;4452:58;4502:7;4493:6;4482:9;4478:22;4452:58;:::i;:::-;3816:754;;;;-1:-1:-1;3816:754:1;;-1:-1:-1;4529:8:1;;4426:84;3816:754;-1:-1:-1;;;3816:754:1:o;4782:632::-;4953:2;5005:21;;;5075:13;;4978:18;;;5097:22;;;4924:4;;4953:2;5176:15;;;;5150:2;5135:18;;;4924:4;5219:169;5233:6;5230:1;5227:13;5219:169;;;5294:13;;5282:26;;5363:15;;;;5328:12;;;;5255:1;5248:9;5219:169;;;-1:-1:-1;5405:3:1;;4782:632;-1:-1:-1;;;;;;4782:632:1:o;5897:367::-;5960:8;5970:6;6024:3;6017:4;6009:6;6005:17;6001:27;5991:55;;6042:1;6039;6032:12;5991:55;-1:-1:-1;6065:20:1;;6108:18;6097:30;;6094:50;;;6140:1;6137;6130:12;6094:50;6177:4;6169:6;6165:17;6153:29;;6237:3;6230:4;6220:6;6217:1;6213:14;6205:6;6201:27;6197:38;6194:47;6191:67;;;6254:1;6251;6244:12;6269:437;6355:6;6363;6416:2;6404:9;6395:7;6391:23;6387:32;6384:52;;;6432:1;6429;6422:12;6384:52;6472:9;6459:23;6505:18;6497:6;6494:30;6491:50;;;6537:1;6534;6527:12;6491:50;6576:70;6638:7;6629:6;6618:9;6614:22;6576:70;:::i;:::-;6665:8;;6550:96;;-1:-1:-1;6269:437:1;-1:-1:-1;;;;6269:437:1:o;7228:968::-;7323:6;7331;7339;7347;7400:3;7388:9;7379:7;7375:23;7371:33;7368:53;;;7417:1;7414;7407:12;7368:53;7453:9;7440:23;7430:33;;7482:2;7531;7520:9;7516:18;7503:32;7493:42;;7582:2;7571:9;7567:18;7554:32;7544:42;;7637:2;7626:9;7622:18;7609:32;7660:18;7701:2;7693:6;7690:14;7687:34;;;7717:1;7714;7707:12;7687:34;7755:6;7744:9;7740:22;7730:32;;7800:7;7793:4;7789:2;7785:13;7781:27;7771:55;;7822:1;7819;7812:12;7771:55;7858:2;7845:16;7880:2;7876;7873:10;7870:36;;;7886:18;;:::i;:::-;7928:53;7971:2;7952:13;;-1:-1:-1;;7948:27:1;7944:36;;7928:53;:::i;:::-;7915:66;;8004:2;7997:5;7990:17;8044:7;8039:2;8034;8030;8026:11;8022:20;8019:33;8016:53;;;8065:1;8062;8055:12;8016:53;8120:2;8115;8111;8107:11;8102:2;8095:5;8091:14;8078:45;8164:1;8159:2;8154;8147:5;8143:14;8139:23;8132:34;;8185:5;8175:15;;;;;7228:968;;;;;;;:::o;8201:456::-;8278:6;8286;8294;8347:2;8335:9;8326:7;8322:23;8318:32;8315:52;;;8363:1;8360;8353:12;8315:52;8402:9;8389:23;8421:31;8446:5;8421:31;:::i;:::-;8471:5;-1:-1:-1;8528:2:1;8513:18;;8500:32;8541:33;8500:32;8541:33;:::i;:::-;8201:456;;8593:7;;-1:-1:-1;;;8647:2:1;8632:18;;;;8619:32;;8201:456::o;10479:1338::-;10639:6;10647;10655;10663;10671;10679;10687;10695;10748:3;10736:9;10727:7;10723:23;10719:33;10716:53;;;10765:1;10762;10755:12;10716:53;10804:9;10791:23;10823:31;10848:5;10823:31;:::i;:::-;10873:5;-1:-1:-1;10930:2:1;10915:18;;10902:32;10943:33;10902:32;10943:33;:::i;:::-;10995:7;-1:-1:-1;11053:2:1;11038:18;;11025:32;11076:18;11106:14;;;11103:34;;;11133:1;11130;11123:12;11103:34;11172:70;11234:7;11225:6;11214:9;11210:22;11172:70;:::i;:::-;11261:8;;-1:-1:-1;11146:96:1;-1:-1:-1;11349:2:1;11334:18;;11321:32;;-1:-1:-1;11365:16:1;;;11362:36;;;11394:1;11391;11384:12;11362:36;11433:72;11497:7;11486:8;11475:9;11471:24;11433:72;:::i;:::-;11524:8;;-1:-1:-1;11407:98:1;-1:-1:-1;11612:3:1;11597:19;;11584:33;;-1:-1:-1;11629:16:1;;;11626:36;;;11658:1;11655;11648:12;11626:36;;11697:60;11749:7;11738:8;11727:9;11723:24;11697:60;:::i;:::-;10479:1338;;;;-1:-1:-1;10479:1338:1;;-1:-1:-1;10479:1338:1;;;;;;11776:8;-1:-1:-1;;;10479:1338:1:o;12744:737::-;12798:5;12851:3;12844:4;12836:6;12832:17;12828:27;12818:55;;12869:1;12866;12859:12;12818:55;12905:6;12892:20;12931:4;12955:60;12971:43;13011:2;12971:43;:::i;12955:60::-;13049:15;;;13135:1;13131:10;;;;13119:23;;13115:32;;;13080:12;;;;13159:15;;;13156:35;;;13187:1;13184;13177:12;13156:35;13223:2;13215:6;13211:15;13235:217;13251:6;13246:3;13243:15;13235:217;;;13331:3;13318:17;13348:31;13373:5;13348:31;:::i;:::-;13392:18;;13430:12;;;;13268;;13235:217;;13486:821;13638:6;13646;13654;13707:2;13695:9;13686:7;13682:23;13678:32;13675:52;;;13723:1;13720;13713:12;13675:52;13763:9;13750:23;13792:18;13833:2;13825:6;13822:14;13819:34;;;13849:1;13846;13839:12;13819:34;13872:61;13925:7;13916:6;13905:9;13901:22;13872:61;:::i;:::-;13862:71;;13986:2;13975:9;13971:18;13958:32;13942:48;;14015:2;14005:8;14002:16;13999:36;;;14031:1;14028;14021:12;13999:36;14054:63;14109:7;14098:8;14087:9;14083:24;14054:63;:::i;:::-;14044:73;;14170:2;14159:9;14155:18;14142:32;14126:48;;14199:2;14189:8;14186:16;14183:36;;;14215:1;14212;14205:12;14183:36;;14238:63;14293:7;14282:8;14271:9;14267:24;14238:63;:::i;:::-;14228:73;;;13486:821;;;;;:::o;14312:823::-;14418:6;14426;14434;14442;14450;14458;14511:3;14499:9;14490:7;14486:23;14482:33;14479:53;;;14528:1;14525;14518:12;14479:53;14567:9;14554:23;14586:31;14611:5;14586:31;:::i;:::-;14636:5;-1:-1:-1;14693:2:1;14678:18;;14665:32;14706:33;14665:32;14706:33;:::i;:::-;14758:7;-1:-1:-1;14812:2:1;14797:18;;14784:32;;-1:-1:-1;14863:2:1;14848:18;;14835:32;;-1:-1:-1;14918:3:1;14903:19;;14890:33;14946:18;14935:30;;14932:50;;;14978:1;14975;14968:12;14932:50;15017:58;15067:7;15058:6;15047:9;15043:22;15017:58;:::i;:::-;14312:823;;;;-1:-1:-1;14312:823:1;;-1:-1:-1;14312:823:1;;15094:8;;14312:823;-1:-1:-1;;;14312:823:1:o;15266:973::-;15351:12;;15316:3;;15406:1;15426:18;;;;15479;;;;15506:61;;15560:4;15552:6;15548:17;15538:27;;15506:61;15586:2;15634;15626:6;15623:14;15603:18;15600:38;15597:161;;;15680:10;15675:3;15671:20;15668:1;15661:31;15715:4;15712:1;15705:15;15743:4;15740:1;15733:15;15597:161;15774:18;15801:104;;;;15919:1;15914:319;;;;15767:466;;15801:104;-1:-1:-1;;15834:24:1;;15822:37;;15879:16;;;;-1:-1:-1;15801:104:1;;15914:319;15213:1;15206:14;;;15250:4;15237:18;;16008:1;16022:165;16036:6;16033:1;16030:13;16022:165;;;16114:14;;16101:11;;;16094:35;16157:16;;;;16051:10;;16022:165;;;16026:3;;16216:6;16211:3;16207:16;16200:23;;15767:466;;;;;;;15266:973;;;;:::o;16244:371::-;16463:3;16494:38;16528:3;16520:6;16494:38;:::i;:::-;16555:23;16541:38;;16606:2;16595:14;;16244:371;-1:-1:-1;;;16244:371:1:o;16620:597::-;16732:4;16761:2;16790;16779:9;16772:21;16822:6;16816:13;16865:6;16860:2;16849:9;16845:18;16838:34;16890:1;16900:140;16914:6;16911:1;16908:13;16900:140;;;17009:14;;;17005:23;;16999:30;16975:17;;;16994:2;16971:26;16964:66;16929:10;;16900:140;;;17058:6;17055:1;17052:13;17049:91;;;17128:1;17123:2;17114:6;17103:9;17099:22;17095:31;17088:42;17049:91;-1:-1:-1;17201:2:1;17180:15;-1:-1:-1;;17176:29:1;17161:45;;;;17208:2;17157:54;;16620:597;-1:-1:-1;;;16620:597:1:o;17222:366::-;17441:3;17472:38;17506:3;17498:6;17472:38;:::i;:::-;-1:-1:-1;;;17519:33:1;;17579:2;17568:14;;17222:366;-1:-1:-1;;;17222:366:1:o;17593:277::-;17766:3;17791:73;17825:38;17859:3;17851:6;17825:38;:::i;:::-;17817:6;17791:73;:::i;18538:127::-;18599:10;18594:3;18590:20;18587:1;18580:31;18630:4;18627:1;18620:15;18654:4;18651:1;18644:15;18670:125;18710:4;18738:1;18735;18732:8;18729:34;;;18743:18;;:::i;:::-;-1:-1:-1;18780:9:1;;18670:125::o;18800:127::-;18861:10;18856:3;18852:20;18849:1;18842:31;18892:4;18889:1;18882:15;18916:4;18913:1;18906:15;19335:135;19374:3;-1:-1:-1;;19395:17:1;;19392:43;;;19415:18;;:::i;:::-;-1:-1:-1;19462:1:1;19451:13;;19335:135::o;19475:128::-;19515:3;19546:1;19542:6;19539:1;19536:13;19533:39;;;19552:18;;:::i;:::-;-1:-1:-1;19588:9:1;;19475:128::o;19608:361::-;19827:3;19858:38;19892:3;19884:6;19858:38;:::i;:::-;-1:-1:-1;;;19905:28:1;;19960:2;19949:14;;19608:361;-1:-1:-1;;;19608:361:1:o;19974:168::-;20014:7;20080:1;20076;20072:6;20068:14;20065:1;20062:21;20057:1;20050:9;20043:17;20039:45;20036:71;;;20087:18;;:::i;:::-;-1:-1:-1;20127:9:1;;19974:168::o;20449:127::-;20510:10;20505:3;20501:20;20498:1;20491:31;20541:4;20538:1;20531:15;20565:4;20562:1;20555:15;20581:217;20621:1;20647;20637:132;;20691:10;20686:3;20682:20;20679:1;20672:31;20726:4;20723:1;20716:15;20754:4;20751:1;20744:15;20637:132;-1:-1:-1;20783:9:1;;20581:217::o;21143:371::-;21362:3;21393:38;21427:3;21419:6;21393:38;:::i;:::-;21454:23;21440:38;;21505:2;21494:14;;21143:371;-1:-1:-1;;;21143:371:1:o;21519:364::-;21738:3;21769:38;21803:3;21795:6;21769:38;:::i;:::-;-1:-1:-1;;;21816:31:1;;21874:2;21863:14;;21519:364;-1:-1:-1;;;21519:364:1:o;21888:277::-;21955:6;22008:2;21996:9;21987:7;21983:23;21979:32;21976:52;;;22024:1;22021;22014:12;21976:52;22056:9;22050:16;22109:5;22102:13;22095:21;22088:5;22085:32;22075:60;;22131:1;22128;22121:12;22170:374;22389:3;22420:38;22454:3;22446:6;22420:38;:::i;:::-;22481:26;22467:41;;22535:2;22524:14;;22170:374;-1:-1:-1;;;22170:374:1:o;22549:373::-;22768:3;22799:38;22833:3;22825:6;22799:38;:::i;:::-;22860:25;22846:40;;22913:2;22902:14;;22549:373;-1:-1:-1;;;22549:373:1:o;22927:371::-;23146:3;23177:38;23211:3;23203:6;23177:38;:::i;:::-;23238:23;23224:38;;23289:2;23278:14;;22927:371;-1:-1:-1;;;22927:371:1:o;23303:379::-;23522:3;23553:38;23587:3;23579:6;23553:38;:::i;:::-;23614:31;23600:46;;23673:2;23662:14;;23303:379;-1:-1:-1;;;23303:379:1:o;23687:382::-;23906:3;23937:38;23971:3;23963:6;23937:38;:::i;:::-;23998:34;23984:49;;24060:2;24049:14;;23687:382;-1:-1:-1;;;23687:382:1:o;24074:372::-;24293:3;24324:38;24358:3;24350:6;24324:38;:::i;:::-;24385:24;24371:39;;24437:2;24426:14;;24074:372;-1:-1:-1;;;24074:372:1:o;24761:184::-;24831:6;24884:2;24872:9;24863:7;24859:23;24855:32;24852:52;;;24900:1;24897;24890:12;24852:52;-1:-1:-1;24923:16:1;;24761:184;-1:-1:-1;24761:184:1:o;25310:251::-;25380:6;25433:2;25421:9;25412:7;25408:23;25404:32;25401:52;;;25449:1;25446;25439:12;25401:52;25481:9;25475:16;25500:31;25525:5;25500:31;:::i;25566:378::-;25785:3;25816:38;25850:3;25842:6;25816:38;:::i;:::-;25877:30;25863:45;;25935:2;25924:14;;25566:378;-1:-1:-1;;;25566:378:1:o
Swarm Source
ipfs://7e72c89e0e96d2ceec57ac5530baefa984810254faec23164feb52a506cafcc5
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.