Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
ScoutPass
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-04-26 */ pragma solidity ^0.8.7; // SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol) /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @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 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); } interface IUtilityERC20 is IERC20 { function adminMint(address owner, uint amountWei) external; function adminSetTokenTimestamp(uint tokenId, uint timestamp) external; function burn(address owner, uint amountWei) external; function claimRewards() external; function stake(uint[] calldata tokenId) external; } // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) /** * @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); } // OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155.sol) /** * @dev Required interface of an ERC1155 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-1155[EIP]. * * _Available since v3.1._ */ 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 be 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; } // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol) /** * @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); } // OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol) /** * @dev Interface of the optional ERC1155MetadataExtension interface, as defined * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP]. * * _Available since v3.1._ */ 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); } // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) /** * @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; } } // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // OpenZeppelin Contracts v4.4.1 (token/ERC1155/ERC1155.sol) /** * @dev Implementation of the basic standard multi-token. * See https://eips.ethereum.org/EIPS/eip-1155 * Originally based on code by Enjin: https://github.com/enjin/erc-1155 * * _Available since v3.1._ */ contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI { using Address for address; // 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; // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json string private _uri; /** * @dev See {_setURI}. */ constructor(string memory uri_) { _setURI(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: balance query for the zero address"); 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(_msgSender(), operator, approved); } /** * @dev See {IERC1155-isApprovedForAll}. */ function isApprovedForAll(address account, address operator) public view virtual override returns (bool) { return _operatorApprovals[account][operator]; } /** * @dev See {IERC1155-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: caller is not owner nor 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 == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: transfer caller is not owner nor 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 = _msgSender(); _beforeTokenTransfer(operator, from, to, _asSingletonArray(id), _asSingletonArray(amount), 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); _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 = _msgSender(); _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); _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 = _msgSender(); _beforeTokenTransfer(operator, address(0), to, _asSingletonArray(id), _asSingletonArray(amount), data); _balances[id][to] += amount; emit TransferSingle(operator, address(0), to, id, amount); _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}. * * 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 = _msgSender(); _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); _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data); } /** * @dev Destroys `amount` tokens of token type `id` from `from` * * 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 = _msgSender(); _beforeTokenTransfer(operator, from, address(0), _asSingletonArray(id), _asSingletonArray(amount), ""); 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); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}. * * 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 = _msgSender(); _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); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC1155: setting approval status for self"); _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 `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 _beforeTokenTransfer( 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.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.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; } } // OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/ERC1155Supply.sol) /** * @dev Extension of ERC1155 that adds tracking of total supply per id. * * Useful for scenarios where Fungible and Non-fungible tokens have to be * clearly identified. Note: While a totalSupply of 1 might mean the * corresponding is an NFT, there is no guarantees that no other token with the * same id are not going to be minted. */ abstract contract ERC1155Supply is ERC1155 { mapping(uint256 => uint256) private _totalSupply; /** * @dev Total amount of tokens in with a given id. */ function totalSupply(uint256 id) public view virtual returns (uint256) { return _totalSupply[id]; } /** * @dev Indicates whether any token exist with a given id, or not. */ function exists(uint256 id) public view virtual returns (bool) { return ERC1155Supply.totalSupply(id) > 0; } /** * @dev See {ERC1155-_beforeTokenTransfer}. */ function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual override { super._beforeTokenTransfer(operator, from, to, ids, amounts, data); if (from == address(0)) { for (uint256 i = 0; i < ids.length; ++i) { _totalSupply[ids[i]] += amounts[i]; } } if (to == address(0)) { for (uint256 i = 0; i < ids.length; ++i) { _totalSupply[ids[i]] -= amounts[i]; } } } } // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } interface IExtensibleERC721Enumerable is IERC721Enumerable { function isAdmin(address addr) external view returns (bool); function addAdmin(address addr) external; function removeAdmin(address addr) external; function canAccessToken(address addr, uint tokenId) external view returns (bool); function adminBurn(uint tokenId) external; function adminTransfer(address from, address to, uint tokenId) external; } enum Accessory { GOLD_EARRINGS, SCARS, GOLDEN_CHAIN, AMULET, CUBAN_LINK_GOLD_CHAIN, FANNY_PACK, NONE } enum BackAccessory { NETRUNNER, MERCENARY, RONIN, ENCHANTER, VANGUARD, MINER, PATHFINDER, SCOUT } enum Background { STARRY_PINK, STARRY_YELLOW, STARRY_PURPLE, STARRY_GREEN, NEBULA, STARRY_RED, STARRY_BLUE, SUNSET, MORNING, INDIGO, CITY__PURPLE, CONTROL_ROOM, LAB, GREEN, ORANGE, PURPLE, CITY__GREEN, CITY__RED, STATION, BOUNTY, BLUE_SKY, RED_SKY, GREEN_SKY } enum Clothing { MARTIAL_SUIT, AMETHYST_ARMOR, SHIRT_AND_TIE, THUNDERDOME_ARMOR, FLEET_UNIFORM__BLUE, BANANITE_SHIRT, EXPLORER, COSMIC_GHILLIE_SUIT__BLUE, COSMIC_GHILLIE_SUIT__GOLD, CYBER_JUMPSUIT, ENCHANTER_ROBES, HOODIE, SPACESUIT, MECHA_ARMOR, LAB_COAT, FLEET_UNIFORM__RED, GOLD_ARMOR, ENERGY_ARMOR__BLUE, ENERGY_ARMOR__RED, MISSION_SUIT__BLACK, MISSION_SUIT__PURPLE, COWBOY, GLITCH_ARMOR, NONE } enum Eyes { SPACE_VISOR, ADORABLE, VETERAN, SUNGLASSES, WHITE_SUNGLASSES, RED_EYES, WINK, CASUAL, CLOSED, DOWNCAST, HAPPY, BLUE_EYES, HUD_GLASSES, DARK_SUNGLASSES, NIGHT_VISION_GOGGLES, BIONIC, HIVE_GOGGLES, MATRIX_GLASSES, GREEN_GLOW, ORANGE_GLOW, RED_GLOW, PURPLE_GLOW, BLUE_GLOW, SKY_GLOW, RED_LASER, BLUE_LASER, GOLDEN_SHADES, HIPSTER_GLASSES, PINCENEZ, BLUE_SHADES, BLIT_GLASSES, NOUNS_GLASSES } enum Fur { MAGENTA, BLUE, GREEN, RED, BLACK, BROWN, SILVER, PURPLE, PINK, SEANCE, TURQUOISE, CRIMSON, GREENYELLOW, GOLD, DIAMOND, METALLIC } enum Head { HALO, ENERGY_FIELD, BLUE_TOP_HAT, RED_TOP_HAT, ENERGY_CRYSTAL, CROWN, BANDANA, BUCKET_HAT, HOMBURG_HAT, PROPELLER_HAT, HEADBAND, DORAG, PURPLE_COWBOY_HAT, SPACESUIT_HELMET, PARTY_HAT, CAP, LEATHER_COWBOY_HAT, CYBER_HELMET__BLUE, CYBER_HELMET__RED, SAMURAI_HAT, NONE } enum Mouth { SMIRK, SURPRISED, SMILE, PIPE, OPEN_SMILE, NEUTRAL, MASK, TONGUE_OUT, GOLD_GRILL, DIAMOND_GRILL, NAVY_RESPIRATOR, RED_RESPIRATOR, MAGENTA_RESPIRATOR, GREEN_RESPIRATOR, MEMPO, VAPE, PILOT_OXYGEN_MASK, CIGAR, BANANA, CHROME_RESPIRATOR, STOIC } library Enums { function toString(Accessory v) external pure returns (string memory) { if (v == Accessory.GOLD_EARRINGS) { return "Gold Earrings"; } if (v == Accessory.SCARS) { return "Scars"; } if (v == Accessory.GOLDEN_CHAIN) { return "Golden Chain"; } if (v == Accessory.AMULET) { return "Amulet"; } if (v == Accessory.CUBAN_LINK_GOLD_CHAIN) { return "Cuban Link Gold Chain"; } if (v == Accessory.FANNY_PACK) { return "Fanny Pack"; } if (v == Accessory.NONE) { return "None"; } revert("invalid accessory"); } function toString(BackAccessory v) external pure returns (string memory) { if (v == BackAccessory.NETRUNNER) { return "Netrunner"; } if (v == BackAccessory.MERCENARY) { return "Mercenary"; } if (v == BackAccessory.RONIN) { return "Ronin"; } if (v == BackAccessory.ENCHANTER) { return "Enchanter"; } if (v == BackAccessory.VANGUARD) { return "Vanguard"; } if (v == BackAccessory.MINER) { return "Miner"; } if (v == BackAccessory.PATHFINDER) { return "Pathfinder"; } if (v == BackAccessory.SCOUT) { return "Scout"; } revert("invalid back accessory"); } function toString(Background v) external pure returns (string memory) { if (v == Background.STARRY_PINK) { return "Starry Pink"; } if (v == Background.STARRY_YELLOW) { return "Starry Yellow"; } if (v == Background.STARRY_PURPLE) { return "Starry Purple"; } if (v == Background.STARRY_GREEN) { return "Starry Green"; } if (v == Background.NEBULA) { return "Nebula"; } if (v == Background.STARRY_RED) { return "Starry Red"; } if (v == Background.STARRY_BLUE) { return "Starry Blue"; } if (v == Background.SUNSET) { return "Sunset"; } if (v == Background.MORNING) { return "Morning"; } if (v == Background.INDIGO) { return "Indigo"; } if (v == Background.CITY__PURPLE) { return "City - Purple"; } if (v == Background.CONTROL_ROOM) { return "Control Room"; } if (v == Background.LAB) { return "Lab"; } if (v == Background.GREEN) { return "Green"; } if (v == Background.ORANGE) { return "Orange"; } if (v == Background.PURPLE) { return "Purple"; } if (v == Background.CITY__GREEN) { return "City - Green"; } if (v == Background.CITY__RED) { return "City - Red"; } if (v == Background.STATION) { return "Station"; } if (v == Background.BOUNTY) { return "Bounty"; } if (v == Background.BLUE_SKY) { return "Blue Sky"; } if (v == Background.RED_SKY) { return "Red Sky"; } if (v == Background.GREEN_SKY) { return "Green Sky"; } revert("invalid background"); } function toString(Clothing v) external pure returns (string memory) { if (v == Clothing.MARTIAL_SUIT) { return "Martial Suit"; } if (v == Clothing.AMETHYST_ARMOR) { return "Amethyst Armor"; } if (v == Clothing.SHIRT_AND_TIE) { return "Shirt and Tie"; } if (v == Clothing.THUNDERDOME_ARMOR) { return "Thunderdome Armor"; } if (v == Clothing.FLEET_UNIFORM__BLUE) { return "Fleet Uniform - Blue"; } if (v == Clothing.BANANITE_SHIRT) { return "Bananite Shirt"; } if (v == Clothing.EXPLORER) { return "Explorer"; } if (v == Clothing.COSMIC_GHILLIE_SUIT__BLUE) { return "Cosmic Ghillie Suit - Blue"; } if (v == Clothing.COSMIC_GHILLIE_SUIT__GOLD) { return "Cosmic Ghillie Suit - Gold"; } if (v == Clothing.CYBER_JUMPSUIT) { return "Cyber Jumpsuit"; } if (v == Clothing.ENCHANTER_ROBES) { return "Enchanter Robes"; } if (v == Clothing.HOODIE) { return "Hoodie"; } if (v == Clothing.SPACESUIT) { return "Spacesuit"; } if (v == Clothing.MECHA_ARMOR) { return "Mecha Armor"; } if (v == Clothing.LAB_COAT) { return "Lab Coat"; } if (v == Clothing.FLEET_UNIFORM__RED) { return "Fleet Uniform - Red"; } if (v == Clothing.GOLD_ARMOR) { return "Gold Armor"; } if (v == Clothing.ENERGY_ARMOR__BLUE) { return "Energy Armor - Blue"; } if (v == Clothing.ENERGY_ARMOR__RED) { return "Energy Armor - Red"; } if (v == Clothing.MISSION_SUIT__BLACK) { return "Mission Suit - Black"; } if (v == Clothing.MISSION_SUIT__PURPLE) { return "Mission Suit - Purple"; } if (v == Clothing.COWBOY) { return "Cowboy"; } if (v == Clothing.GLITCH_ARMOR) { return "Glitch Armor"; } if (v == Clothing.NONE) { return "None"; } revert("invalid clothing"); } function toString(Eyes v) external pure returns (string memory) { if (v == Eyes.SPACE_VISOR) { return "Space Visor"; } if (v == Eyes.ADORABLE) { return "Adorable"; } if (v == Eyes.VETERAN) { return "Veteran"; } if (v == Eyes.SUNGLASSES) { return "Sunglasses"; } if (v == Eyes.WHITE_SUNGLASSES) { return "White Sunglasses"; } if (v == Eyes.RED_EYES) { return "Red Eyes"; } if (v == Eyes.WINK) { return "Wink"; } if (v == Eyes.CASUAL) { return "Casual"; } if (v == Eyes.CLOSED) { return "Closed"; } if (v == Eyes.DOWNCAST) { return "Downcast"; } if (v == Eyes.HAPPY) { return "Happy"; } if (v == Eyes.BLUE_EYES) { return "Blue Eyes"; } if (v == Eyes.HUD_GLASSES) { return "HUD Glasses"; } if (v == Eyes.DARK_SUNGLASSES) { return "Dark Sunglasses"; } if (v == Eyes.NIGHT_VISION_GOGGLES) { return "Night Vision Goggles"; } if (v == Eyes.BIONIC) { return "Bionic"; } if (v == Eyes.HIVE_GOGGLES) { return "Hive Goggles"; } if (v == Eyes.MATRIX_GLASSES) { return "Matrix Glasses"; } if (v == Eyes.GREEN_GLOW) { return "Green Glow"; } if (v == Eyes.ORANGE_GLOW) { return "Orange Glow"; } if (v == Eyes.RED_GLOW) { return "Red Glow"; } if (v == Eyes.PURPLE_GLOW) { return "Purple Glow"; } if (v == Eyes.BLUE_GLOW) { return "Blue Glow"; } if (v == Eyes.SKY_GLOW) { return "Sky Glow"; } if (v == Eyes.RED_LASER) { return "Red Laser"; } if (v == Eyes.BLUE_LASER) { return "Blue Laser"; } if (v == Eyes.GOLDEN_SHADES) { return "Golden Shades"; } if (v == Eyes.HIPSTER_GLASSES) { return "Hipster Glasses"; } if (v == Eyes.PINCENEZ) { return "Pince-nez"; } if (v == Eyes.BLUE_SHADES) { return "Blue Shades"; } if (v == Eyes.BLIT_GLASSES) { return "Blit GLasses"; } if (v == Eyes.NOUNS_GLASSES) { return "Nouns Glasses"; } revert("invalid eyes"); } function toString(Fur v) external pure returns (string memory) { if (v == Fur.MAGENTA) { return "Magenta"; } if (v == Fur.BLUE) { return "Blue"; } if (v == Fur.GREEN) { return "Green"; } if (v == Fur.RED) { return "Red"; } if (v == Fur.BLACK) { return "Black"; } if (v == Fur.BROWN) { return "Brown"; } if (v == Fur.SILVER) { return "Silver"; } if (v == Fur.PURPLE) { return "Purple"; } if (v == Fur.PINK) { return "Pink"; } if (v == Fur.SEANCE) { return "Seance"; } if (v == Fur.TURQUOISE) { return "Turquoise"; } if (v == Fur.CRIMSON) { return "Crimson"; } if (v == Fur.GREENYELLOW) { return "Green-Yellow"; } if (v == Fur.GOLD) { return "Gold"; } if (v == Fur.DIAMOND) { return "Diamond"; } if (v == Fur.METALLIC) { return "Metallic"; } revert("invalid fur"); } function toString(Head v) external pure returns (string memory) { if (v == Head.HALO) { return "Halo"; } if (v == Head.ENERGY_FIELD) { return "Energy Field"; } if (v == Head.BLUE_TOP_HAT) { return "Blue Top Hat"; } if (v == Head.RED_TOP_HAT) { return "Red Top Hat"; } if (v == Head.ENERGY_CRYSTAL) { return "Energy Crystal"; } if (v == Head.CROWN) { return "Crown"; } if (v == Head.BANDANA) { return "Bandana"; } if (v == Head.BUCKET_HAT) { return "Bucket Hat"; } if (v == Head.HOMBURG_HAT) { return "Homburg Hat"; } if (v == Head.PROPELLER_HAT) { return "Propeller Hat"; } if (v == Head.HEADBAND) { return "Headband"; } if (v == Head.DORAG) { return "Do-rag"; } if (v == Head.PURPLE_COWBOY_HAT) { return "Purple Cowboy Hat"; } if (v == Head.SPACESUIT_HELMET) { return "Spacesuit Helmet"; } if (v == Head.PARTY_HAT) { return "Party Hat"; } if (v == Head.CAP) { return "Cap"; } if (v == Head.LEATHER_COWBOY_HAT) { return "Leather Cowboy Hat"; } if (v == Head.CYBER_HELMET__BLUE) { return "Cyber Helmet - Blue"; } if (v == Head.CYBER_HELMET__RED) { return "Cyber Helmet - Red"; } if (v == Head.SAMURAI_HAT) { return "Samurai Hat"; } if (v == Head.NONE) { return "None"; } revert("invalid head"); } function toString(Mouth v) external pure returns (string memory) { if (v == Mouth.SMIRK) { return "Smirk"; } if (v == Mouth.SURPRISED) { return "Surprised"; } if (v == Mouth.SMILE) { return "Smile"; } if (v == Mouth.PIPE) { return "Pipe"; } if (v == Mouth.OPEN_SMILE) { return "Open Smile"; } if (v == Mouth.NEUTRAL) { return "Neutral"; } if (v == Mouth.MASK) { return "Mask"; } if (v == Mouth.TONGUE_OUT) { return "Tongue Out"; } if (v == Mouth.GOLD_GRILL) { return "Gold Grill"; } if (v == Mouth.DIAMOND_GRILL) { return "Diamond Grill"; } if (v == Mouth.NAVY_RESPIRATOR) { return "Navy Respirator"; } if (v == Mouth.RED_RESPIRATOR) { return "Red Respirator"; } if (v == Mouth.MAGENTA_RESPIRATOR) { return "Magenta Respirator"; } if (v == Mouth.GREEN_RESPIRATOR) { return "Green Respirator"; } if (v == Mouth.MEMPO) { return "Mempo"; } if (v == Mouth.VAPE) { return "Vape"; } if (v == Mouth.PILOT_OXYGEN_MASK) { return "Pilot Oxygen Mask"; } if (v == Mouth.CIGAR) { return "Cigar"; } if (v == Mouth.BANANA) { return "Banana"; } if (v == Mouth.CHROME_RESPIRATOR) { return "Chrome Respirator"; } if (v == Mouth.STOIC) { return "Stoic"; } revert("invalid mouth"); } } struct KeyValuePair { string key; string value; } struct ChainScoutMetadata { Accessory accessory; BackAccessory backaccessory; Background background; Clothing clothing; Eyes eyes; Fur fur; Head head; Mouth mouth; uint24 attack; uint24 defense; uint24 luck; uint24 speed; uint24 strength; uint24 intelligence; uint16 level; } interface IChainScouts is IExtensibleERC721Enumerable { function adminCreateChainScout( ChainScoutMetadata calldata tbd, address owner ) external; function adminRemoveExtension(string calldata key) external; function adminSetExtension( string calldata key, ChainScoutsExtension extension ) external; function adminSetChainScoutMetadata( uint256 tokenId, ChainScoutMetadata calldata tbd ) external; function getChainScoutMetadata(uint256 tokenId) external view returns (ChainScoutMetadata memory); } abstract contract ChainScoutsExtension { IChainScouts internal chainScouts; bool public enabled; modifier canAccessToken(uint tokenId) { require(chainScouts.canAccessToken(msg.sender, tokenId), "ChainScoutsExtension: you don't own the token"); _; } modifier onlyAdmin() { require(chainScouts.isAdmin(msg.sender), "ChainScoutsExtension: admins only"); _; } modifier whenEnabled() { require(enabled, "ChainScoutsExtension: currently disabled"); _; } function adminSetEnabled(bool e) external onlyAdmin { enabled = e; } function extensionKey() public virtual view returns (string memory); function setChainScouts(IChainScouts _contract) external { require(address(0) == address(chainScouts) || chainScouts.isAdmin(msg.sender), "ChainScoutsExtension: The Chain Scouts contract must not be set or you must be an admin"); chainScouts = _contract; chainScouts.adminSetExtension(extensionKey(), this); } } // shamelessly stolen from the anonymice contract library Base64 { string internal constant TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; /** * @dev Converts the input data into a base64 string. */ function encode(bytes memory data) internal pure returns (string memory) { if (data.length == 0) return ""; // load the table into memory string memory table = TABLE; // multiply by 4/3 rounded up uint256 encodedLen = 4 * ((data.length + 2) / 3); // add some extra buffer at the end required for the writing string memory result = new string(encodedLen + 32); assembly { // set the actual output length mstore(result, encodedLen) // prepare the lookup table let tablePtr := add(table, 1) // input ptr let dataPtr := data let endPtr := add(dataPtr, mload(data)) // result ptr, jump over length let resultPtr := add(result, 32) // run over the input, 3 bytes at a time for { } lt(dataPtr, endPtr) { } { dataPtr := add(dataPtr, 3) // read 3 bytes let input := mload(dataPtr) // write 4 characters mstore( resultPtr, shl(248, mload(add(tablePtr, and(shr(18, input), 0x3F)))) ) resultPtr := add(resultPtr, 1) mstore( resultPtr, shl(248, mload(add(tablePtr, and(shr(12, input), 0x3F)))) ) resultPtr := add(resultPtr, 1) mstore( resultPtr, shl(248, mload(add(tablePtr, and(shr(6, input), 0x3F)))) ) resultPtr := add(resultPtr, 1) mstore( resultPtr, shl(248, mload(add(tablePtr, and(input, 0x3F)))) ) resultPtr := add(resultPtr, 1) } // padding with '=' switch mod(mload(data), 3) case 1 { mstore(sub(resultPtr, 2), shl(240, 0x3d3d)) } case 2 { mstore(sub(resultPtr, 1), shl(248, 0x3d)) } } return result; } } library Integer { /** * @dev Gets the bit at the given position in the given integer. * 255 is the leftmost bit, 0 is the rightmost bit. * * For example: bitAt(2, 0) == 0, because the rightmost bit of 10 is 0 * bitAt(2, 1) == 1, because the second to last bit of 10 is 1 */ function bitAt(uint integer, uint pos) internal pure returns (uint) { require(pos <= 255, "pos > 255"); return (integer & (1 << pos)) >> pos; } function setBitAt(uint integer, uint pos) internal pure returns (uint) { return integer | (1 << pos); } /** * @dev Gets the value of the bits between left and right, both inclusive, in the given integer. * 255 is the leftmost bit, 0 is the rightmost bit. * * For example: bitsFrom(10, 3, 1) == 7 (101 in binary), because 10 is *101*0 in binary * bitsFrom(10, 2, 0) == 2 (010 in binary), because 10 is 1*010* in binary */ function bitsFrom(uint integer, uint left, uint right) internal pure returns (uint) { require(left >= right, "left > right"); require(left <= 255, "left > 255"); uint delta = left - right + 1; return (integer & (((1 << delta) - 1) << right)) >> right; } } // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) /** * @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); } } enum NumericAttributeType { NUMBER, BOOST_PERCENTAGE, BOOST_NUMBER, DATE } struct Attribute { string displayType; string key; string serializedValue; string maxValue; } struct OpenSeaMetadata { string svg; string description; string name; uint24 backgroundColor; Attribute[] attributes; } library OpenSeaMetadataLibrary { using Strings for uint; struct ObjectKeyValuePair { string key; string serializedValue; } function uintToColorString(uint value, uint nBytes) internal pure returns (string memory) { bytes memory symbols = "0123456789ABCDEF"; bytes memory buf = new bytes(nBytes * 2); for (uint i = 0; i < nBytes * 2; ++i) { buf[nBytes * 2 - 1 - i] = symbols[Integer.bitsFrom(value, (i * 4) + 3, i * 4)]; } return string(buf); } function quote(string memory str) internal pure returns (string memory output) { return bytes(str).length > 0 ? string(abi.encodePacked( '"', str, '"' )) : ""; } function makeStringAttribute(string memory key, string memory value) internal pure returns (Attribute memory) { return Attribute("", key, quote(value), ""); } function makeNumericAttribute(NumericAttributeType nat, string memory key, string memory value, string memory maxValue) private pure returns (Attribute memory) { string memory s = "number"; if (nat == NumericAttributeType.BOOST_PERCENTAGE) { s = "boost_percentage"; } else if (nat == NumericAttributeType.BOOST_NUMBER) { s = "boost_number"; } else if (nat == NumericAttributeType.DATE) { s = "date"; } return Attribute(s, key, value, maxValue); } function makeFixedPoint(uint value, uint decimals) internal pure returns (string memory) { bytes memory st = bytes(value.toString()); while (st.length < decimals) { st = abi.encodePacked( "0", st ); } bytes memory ret = new bytes(st.length + 1); if (decimals >= st.length) { return string(abi.encodePacked("0.", st)); } uint dl = st.length - decimals; uint i = 0; uint j = 0; while (i < ret.length) { if (i == dl) { ret[i] = '.'; i++; continue; } ret[i] = st[j]; i++; j++; } return string(ret); } function makeFixedPointAttribute(NumericAttributeType nat, string memory key, uint value, uint maxValue, uint decimals) internal pure returns (Attribute memory) { return makeNumericAttribute(nat, key, makeFixedPoint(value, decimals), maxValue == 0 ? "" : makeFixedPoint(maxValue, decimals)); } function makeUintAttribute(NumericAttributeType nat, string memory key, uint value, uint maxValue) internal pure returns (Attribute memory) { return makeNumericAttribute(nat, key, value.toString(), maxValue == 0 ? "" : maxValue.toString()); } function makeBooleanAttribute(string memory key, bool value) internal pure returns (Attribute memory) { return Attribute("", key, value ? "true" : "false", ""); } function makeAttributesArray(Attribute[] memory attributes) internal pure returns (string memory output) { output = "["; bool empty = true; for (uint i = 0; i < attributes.length; ++i) { if (bytes(attributes[i].serializedValue).length > 0) { ObjectKeyValuePair[] memory kvps = new ObjectKeyValuePair[](4); kvps[0] = ObjectKeyValuePair("trait_type", quote(attributes[i].key)); kvps[1] = ObjectKeyValuePair("display_type", quote(attributes[i].displayType)); kvps[2] = ObjectKeyValuePair("value", attributes[i].serializedValue); kvps[3] = ObjectKeyValuePair("max_value", attributes[i].maxValue); output = string(abi.encodePacked( output, empty ? "" : ",", makeObject(kvps) )); empty = false; } } output = string(abi.encodePacked(output, "]")); } function notEmpty(string memory s) internal pure returns (bool) { return bytes(s).length > 0; } function makeObject(ObjectKeyValuePair[] memory kvps) internal pure returns (string memory output) { output = "{"; bool empty = true; for (uint i = 0; i < kvps.length; ++i) { if (bytes(kvps[i].serializedValue).length > 0) { output = string(abi.encodePacked( output, empty ? "" : ",", '"', kvps[i].key, '":', kvps[i].serializedValue )); empty = false; } } output = string(abi.encodePacked(output, "}")); } function makeMetadataWithExtraKvps(OpenSeaMetadata memory metadata, ObjectKeyValuePair[] memory extra) internal pure returns (string memory output) { /* string memory svgUrl = string(abi.encodePacked( "data:image/svg+xml;base64,", string(Base64.encode(bytes(metadata.svg))) )); */ string memory svgUrl = string(abi.encodePacked( "data:image/svg+xml;utf8,", metadata.svg )); ObjectKeyValuePair[] memory kvps = new ObjectKeyValuePair[](5 + extra.length); kvps[0] = ObjectKeyValuePair("name", quote(metadata.name)); kvps[1] = ObjectKeyValuePair("description", quote(metadata.description)); kvps[2] = ObjectKeyValuePair("image", quote(svgUrl)); kvps[3] = ObjectKeyValuePair("background_color", quote(uintToColorString(metadata.backgroundColor, 3))); kvps[4] = ObjectKeyValuePair("attributes", makeAttributesArray(metadata.attributes)); for (uint i = 0; i < extra.length; ++i) { kvps[i + 5] = extra[i]; } return string(abi.encodePacked( "data:application/json;base64,", Base64.encode(bytes(makeObject(kvps))) )); } function makeMetadata(OpenSeaMetadata memory metadata) internal pure returns (string memory output) { return makeMetadataWithExtraKvps(metadata, new ObjectKeyValuePair[](0)); } function makeERC1155Metadata(OpenSeaMetadata memory metadata, string memory symbol) internal pure returns (string memory output) { ObjectKeyValuePair[] memory kvps = new ObjectKeyValuePair[](1); kvps[0] = ObjectKeyValuePair("symbol", quote(symbol)); return makeMetadataWithExtraKvps(metadata, kvps); } } /** * Base class for creating "passes" e.g. Scout Pass purchaseable with a Utility ERC20 token. */ abstract contract BasePass is ChainScoutsExtension, ERC1155Supply { IUtilityERC20 public token; uint256 public price; string public name; uint256 public MAX_SUPPLY; IERC1155 public oldPass; // old scout pass address uint256 public oldSupply; // migration purpose only constructor() ERC1155("") {} function init( address _oldPass, uint256 _oldSupply, address _token, uint256 _price, string memory _name ) internal { _setURI(""); enabled = true; MAX_SUPPLY = 3_444; oldPass = IERC1155(_oldPass); oldSupply = _oldSupply; token = IUtilityERC20(_token); price = _price; name = _name; } /** * Sets the name of the pass. OpenSea uses this to determine the collection name. */ function adminSetName(string memory _name) external onlyAdmin { name = _name; } /** * Sets the token used to purchase the pass. */ function adminSetToken(IUtilityERC20 _token) external onlyAdmin { token = _token; } /** * Sets the amount of token() needed to purchase a pass. Remember that this is wei (10^-18 eth) for most tokens. */ function adminSetPrice(uint256 _price) external onlyAdmin { price = _price; } /** * Sets old supply for migration */ function adminSetOldSupply(uint oldSupply_) external onlyAdmin { oldSupply = oldSupply_; } /** * Sets old pass for migration */ function adminSetOldPass(address oldPass_) external onlyAdmin { oldPass = IERC1155(oldPass_); } /** * @dev Burns one or more passes. This is used by contracts that require passes in exchange for services. * You must be the owner of the pass(es) being burnt or an admin. */ function burn(address owner, uint256 count) external virtual whenEnabled { require( chainScouts.isAdmin(msg.sender) || msg.sender == owner, "must be admin or owner" ); _burn(msg.sender, 0, count); } /** * @dev Purchases one or more passes. Requires price() token() per pass. */ function migrate(uint256 count) public virtual whenEnabled { require(count > 0, "Must be at least one"); oldPass.safeTransferFrom(msg.sender, address(this), 0, count, hex""); _mint(msg.sender, 0, count, hex""); } /** * @dev Admin purpose only */ function mintReserve(uint256 count, address to_) external onlyAdmin { require(count > 0, "Must be at least one"); _mint(to_, 0, count, hex""); } /** * @dev Purchases one or more passes. Requires price() token() per pass. */ function purchase(uint256 count) public virtual whenEnabled { require(count > 0, "Must mint at least one"); require(totalSupply(0)+count <= MAX_SUPPLY-oldSupply, "Exceed max supply"); token.burn(msg.sender, count * price); _mint(msg.sender, 0, count, hex""); } /** * @dev Returns the metadata of the pass. Used by OpenSea to render the image. */ function metadata() public virtual view returns (OpenSeaMetadata memory); /** * @dev Returns the "symbol" of the pass. For example, Ethereum's symbol is "ETH". */ function symbol() public virtual view returns (string memory); function uri(uint) public override view returns (string memory) { return OpenSeaMetadataLibrary.makeERC1155Metadata(metadata(), symbol()); } // onReceive functions signatures /** * @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 ) public pure returns (bytes4) { return 0xf23a6e61; } /** * @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 ) public pure returns (bytes4) { return 0xbc197c81; } } interface IRenderer { function render(bytes[] memory sprites) external view returns (string memory); } /// @dev Proxy for NFT Factory contract ProxyTarget { // Storage for this proxy bytes32 internal constant IMPLEMENTATION_SLOT = bytes32(0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc); bytes32 internal constant ADMIN_SLOT = bytes32(0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103); function _getAddress(bytes32 key) internal view returns (address add) { add = address(uint160(uint256(_getSlotValue(key)))); } function _getSlotValue(bytes32 slot_) internal view returns (bytes32 value_) { assembly { value_ := sload(slot_) } } function _setSlotValue(bytes32 slot_, bytes32 value_) internal { assembly { sstore(slot_, value_) } } } // import "./Sprites.sol"; contract ScoutPass is BasePass, ProxyTarget { bool public initialized; IRenderer public renderer; string private _symbol; function initialize(address _oldPass, uint256 _oldSupply, address _token, IRenderer _renderer) external { require(msg.sender == _getAddress(ADMIN_SLOT), "not admin"); require(!initialized); initialized = true; // BasePass( // _token, // 200 ether, // "Scout Pass" // ) init(_oldPass, _oldSupply, _token, 200 ether, "Scout Pass"); _symbol = "SCOUTPASS"; renderer = _renderer; } function extensionKey() public override pure returns (string memory) { return "metaversePass"; } function adminSetRenderer(IRenderer _renderer) external onlyAdmin { renderer = _renderer; } function adminSetSymbol(string memory sym) external onlyAdmin { _symbol = sym; } function metadata() public virtual view override returns (OpenSeaMetadata memory) { bytes[] memory passSprite = new bytes[](1); passSprite[0] = getPassSprite(); string memory sprite = renderer.render(passSprite); return OpenSeaMetadata({ svg: sprite, name: "Scout Pass", description: "The Scout Pass is the key to unlock perks in the Chain Scouts ecosystem", backgroundColor: 0, attributes: new Attribute[](0) }); } function symbol() public virtual view override returns (string memory) { return _symbol; } function getPassSprite() internal pure returns (bytes memory) { return hex"41F022E501C28B9A020905370826B808241CFC28B98040D8426122E67102428101114DC4221E04044E4409075F122E501868B99C609AA066AAA46044A866AAAC6ADE58D1BF6EE19B057C46FDBC866BECC6FDBD06FC8D46ADED866BEDC6044E066AAE4609A75E1A2E7F1836101888B99C809AA09126A48044A880EB576203CF720113823F6F920269D7C88B94062A2E672826A829AAA9283CEA2AC195D8AADEDCA0F3E0A6AAE4A09A75F2A2E500CC8B990C0D84A6322E673026A8308869303CD538CADE5F0300118D8CADEDCC0F3E0C221E4C09A75F322E5018E8B99CE09AA0F126A4E0F3A8EAC156D3AB7AE38012F3B86B0380118D8EADEDCE0F3E0F126E4E09AE8E8B9ECE1A179F3A2E501908B99D009AA10221A500F354C42B7AD40012E45E1AF400118590ADEDD00F3E10221E5009A75F422E501928B99D209AA126CDA520F354B4AB7AC48012D4DE1AE4C182F480118592ADEDD20F3E126AAE5209A75F4A2E500D48B99148BA4A6522E675026A850A129503CEA52B7AB50012C55E1AD560FEE54182F55E1B0500118CD4ADE69550013652B7B7503CF85088B95026BA522EFB52327C522E9EFD48B98168B98562AD8968C94665A2E675826A85834E958112A5AB7AB58012C5DE1AD5E0FEE5C182F5DE1B05C1818CD6004D1783FD56004D96ADEDD6044E160E4E5609A75C5A2E7D5A2EFE5A2EBF58AB60622BA1622ED11988B99D809AA180D3A58044A98ADEAD8004B19786B5983FB99060BD9786C197CE63464183560013662B7B76011386034F960269D7D88B981A8BF4266A2E676826A869AFA968112A6AB7AB68012C6DE1AD6DF3AE6E0FEF6C18306DE1B16DF3B26DE199D1B83FD5A02BD9AADEDDA044E1A6BEE5A09AE9A8D4EDA8B9F1A8C87BF6A2E5011C8B995C8D499C8E79DC09AA1CFDBA5C04454B72B7AC70012D75E1AE75F3AF760FD851D060D5C004D9CADEDDC044E1CFDBE5C044E9C8E777C72321EFDC8B94037A2E647A35257A3CA67A40E77811287BF6E978111531EADEB5E0045D07DE198CDF83FD1E0046B67AB7B77811387BF6F978113A7A645DF1E8F2F5E8E77DF7A32100608B98A08D48E08E79209039602C99A099E9E009AA20FDBA6004454D82B7974E000469682B7B780113883F6F98026BA826E3B82647C82427D80AD3E82353F8232208A35218A39E28A43A38A42648A69658A77268A7E678826A889AFA98811155A2ADEDE2044E226BEE6209AEA2A0EEE29D4F229B8F62909FA28F2FE28E78248F18648F28A49868E499E9249D4964A0E9A4A289E409AA246BEA6404455696213790113891AFB99026BA92A9FB92943C9287FD92797E926E3F9264609A40E19A64629A6B639A79649A87E59A9E669AB8A79826A899AFA99811155A6ADEDE6044E266BEE6609AEA6B15EE6AE2F26A6EF66A28FA6A05FE69AD82899E8689C38A89E58E8A39928AA7968B169A8B789E809AA29126A68044AA8ADE56CA0886DA2B797468221CA8ADE675A08876A2B7B7A01138A449B9A026BAA2EF7BA2DA7CA2BB7DA2A2FEA2977FA27E60A8BA61AA83A2AA9423AAAF64AAC565AAF4A6AB16E7A826A8AC49A9A8112AAAB7ABA8886CAAB796BAA221BEAADEC2A221C6AADE653A88874AAB7B5A88876AAB7B7A81138AC49B9A826BAAB2CBBAB0B3CAADCBDAAC2FEAAACBFA8C5E0B28361B29B62B2B123B2D7E4B2F365B31E66B34F67B026A8B449A9B011155ACADEDEC044E2D126E6C09AEACDF9EECCDFF2CC47F6CBD2FACB50FECABD82EA5086EAED8AEB698EEC1492EC9A96ED719AEE859EE09AA2E221A6E0F3AAEADE56EB8886FBAB79846E221CAEADECEE221D2EADED6E221DAEADEDEE044E2E221E6E09AEAEF09EEEE60F2ED36F6EC88FAEBE9FEEB43830AC4870B508B0C1D8F0CB2930D8A970E589B0F8D9F009AA306BEA700F354BC2B7ACC0886DC2B7973F0221C30ADE632C08873C2B79A570221DB0ADEDF0044E306BEE7009AEB104BEF0F61F30E79F70D67FB0C79FF0BE9832B16872BFA8B2C888F2D80932EA4972FB79B31089F209AA326BEA720F3556CAB7B7C83CF8C9AFB9C826BACC743BCC18FCCBE0BDCB9ABECB4F7FCB18A0D2E4E1D31AE2D34F63D3A164D3E0A5D447E6D48A27D026A8D449A9D03CD55B5884DF40F3E34FDBE7409AEB52DAEF51E8F35063F74F6BFB4E53FF4CDF836C14876CDF8B6E2A8F6F6B9370FD9772099B732C9F609AA37126A76044AB60EB576D83CF7D81138DBF6F9D826BADCFC7BDCAFFCDC743DDC12FEDBCEFFDB7E60E31E61E36662E3BD63E40864E473E5E4BBA6E4FC67E026A8E1AAA9E0112AE1AAABE2B796378FDBBB86C15F1E3F6F2E1AFB3E3F6F4E3F235E2B7B6E1AFB7E01138E1AAB9E026BAE51CBBE4EB3CE4A97DE466FEE3F0FFE3B760EB3A61EB7962EBE6E3EC56521BA0049FA090A3A044537E88878E81139E8241D73A004F7B25CFBB11FFFAF8283CD9987CEF58BD0308FC004487F60FE8F61014AFD846B3D8425B6F6119BE3D84273CF60FFDF0013EF4743FF3FDA0FB86E1FBD862FC4BA3FC9E64F801129FF786509FC181533F786B7F0605D2FDE1B3FC181A5BF7866F8FC181CEFF786F3E004F7F39BFBF25CFFF0F0"; } // function setChainScoutsTest(IChainScouts _contract) external onlyAdmin { // // require(address(0) == address(chainScouts) || chainScouts.isAdmin(msg.sender), "ChainScoutsExtension: The Chain Scouts contract must not be set or you must be an admin"); // chainScouts = _contract; // // chainScouts.adminSetExtension(extensionKey(), this); // } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"e","type":"bool"}],"name":"adminSetEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"}],"name":"adminSetName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"oldPass_","type":"address"}],"name":"adminSetOldPass","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"oldSupply_","type":"uint256"}],"name":"adminSetOldSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"adminSetPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IRenderer","name":"_renderer","type":"address"}],"name":"adminSetRenderer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"sym","type":"string"}],"name":"adminSetSymbol","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IUtilityERC20","name":"_token","type":"address"}],"name":"adminSetToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"extensionKey","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_oldPass","type":"address"},{"internalType":"uint256","name":"_oldSupply","type":"uint256"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"contract IRenderer","name":"_renderer","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"metadata","outputs":[{"components":[{"internalType":"string","name":"svg","type":"string"},{"internalType":"string","name":"description","type":"string"},{"internalType":"string","name":"name","type":"string"},{"internalType":"uint24","name":"backgroundColor","type":"uint24"},{"components":[{"internalType":"string","name":"displayType","type":"string"},{"internalType":"string","name":"key","type":"string"},{"internalType":"string","name":"serializedValue","type":"string"},{"internalType":"string","name":"maxValue","type":"string"}],"internalType":"struct Attribute[]","name":"attributes","type":"tuple[]"}],"internalType":"struct OpenSeaMetadata","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"migrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"},{"internalType":"address","name":"to_","type":"address"}],"name":"mintReserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oldPass","outputs":[{"internalType":"contract IERC1155","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oldSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"purchase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renderer","outputs":[{"internalType":"contract IRenderer","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IChainScouts","name":"_contract","type":"address"}],"name":"setChainScouts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IUtilityERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040805160208101909152600081526200002c8162000033565b506200012f565b8051620000489060039060208401906200004c565b5050565b8280546200005a90620000f2565b90600052602060002090601f0160209004810192826200007e5760008555620000c9565b82601f106200009957805160ff1916838001178555620000c9565b82800160010185558215620000c9579182015b82811115620000c9578251825591602001919060010190620000ac565b50620000d7929150620000db565b5090565b5b80821115620000d75760008155600101620000dc565b600181811c908216806200010757607f821691505b602082108114156200012957634e487b7160e01b600052602260045260246000fd5b50919050565b61476a806200013f6000396000f3fe608060405234801561001057600080fd5b50600436106102315760003560e01c80637e26fbca11610130578063bc197c81116100b8578063efef39a11161007c578063efef39a114610551578063f23a6e6114610564578063f242432a14610584578063fc0c546a14610597578063ff1ff89c146105aa57600080fd5b8063bc197c8114610494578063bd85b039146104cf578063c78a0004146104ef578063c8abd9f214610502578063e985e9c51461051557600080fd5b80639dc29fac116100ff5780639dc29fac14610429578063a035b1fe1461043c578063a22cb46514610445578063a307cf9014610458578063b4375dc91461048157600080fd5b80637e26fbca146103e3578063850dd091146103f65780638ada6b0f1461040957806395d89b411461042157600080fd5b80632eb2c2d6116101be5780634e1273f4116101825780634e1273f4146103505780634f558e7914610370578063513f2862146103925780635e282bc8146103a5578063767bd704146103b857600080fd5b80632eb2c2d6146102f957806332cb6b0c1461030c578063358394d814610315578063392f37e914610328578063454b06081461033d57600080fd5b80630cc3be2f116102055780630cc3be2f1461029d5780630e89341c146102b25780631129accd146102c5578063158ef93e146102d8578063238dafe0146102e557600080fd5b8062fdd58e1461023657806301ffc9a71461025c578063058508441461027f57806306fdde0314610288575b600080fd5b6102496102443660046133f9565b6105bd565b6040519081526020015b60405180910390f35b61026f61026a366004613584565b610656565b6040519015158152602001610253565b610249600a5481565b6102906106a8565b6040516102539190613a2b565b6102b06102ab366004613687565b610736565b005b6102906102c0366004613687565b6107d2565b6102b06102d33660046135be565b6107ec565b600b5461026f9060ff1681565b60005461026f90600160a01b900460ff1681565b6102b061030736600461323b565b61089a565b61024960085481565b6102b0610323366004613425565b610931565b610330610a5a565b6040516102539190613bc8565b6102b061034b366004613687565b610c53565b61036361035e366004613478565b610d62565b60405161025391906139ea565b61026f61037e366004613687565b600090815260046020526040902054151590565b6102b06103a0366004613127565b610e8b565b6102b06103b33660046135be565b610f44565b6009546103cb906001600160a01b031681565b6040516001600160a01b039091168152602001610253565b6102b06103f1366004613127565b610fee565b6102b06104043660046136a0565b6110ad565b600b546103cb9061010090046001600160a01b031681565b6102906111a7565b6102b06104373660046133f9565b611239565b61024960065481565b6102b06104533660046133cb565b611341565b60408051808201909152600d81526c6d65746176657273655061737360981b6020820152610290565b6102b061048f36600461354a565b61134c565b6104b66104a236600461317d565b63bc197c8160e01b98975050505050505050565b6040516001600160e01b03199091168152602001610253565b6102496104dd366004613687565b60009081526004602052604090205490565b6102b06104fd366004613127565b611401565b6102b0610510366004613687565b6114ba565b61026f610523366004613144565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205460ff1690565b6102b061055f366004613687565b611556565b6104b66105723660046132e8565b63f23a6e6160e01b9695505050505050565b6102b0610592366004613363565b6116a5565b6005546103cb906001600160a01b031681565b6102b06105b8366004613127565b61172c565b60006001600160a01b03831661062e5760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084015b60405180910390fd5b5060009081526001602090815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b03198216636cdb3d1360e11b148061068757506001600160e01b031982166303a24d0760e21b145b806106a257506301ffc9a760e01b6001600160e01b03198316145b92915050565b600780546106b590613dd6565b80601f01602080910402602001604051908101604052809291908181526020018280546106e190613dd6565b801561072e5780601f106107035761010080835404028352916020019161072e565b820191906000526020600020905b81548152906001019060200180831161071157829003601f168201915b505050505081565b600054604051630935e01b60e21b81523360048201526001600160a01b03909116906324d7806c9060240160206040518083038186803b15801561077957600080fd5b505afa15801561078d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107b19190613567565b6107cd5760405162461bcd60e51b815260040161062590613b3d565b600655565b60606106a26107df610a5a565b6107e76111a7565b6118e1565b600054604051630935e01b60e21b81523360048201526001600160a01b03909116906324d7806c9060240160206040518083038186803b15801561082f57600080fd5b505afa158015610843573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108679190613567565b6108835760405162461bcd60e51b815260040161062590613b3d565b805161089690600c906020840190612f1e565b5050565b6001600160a01b0385163314806108b657506108b68533610523565b61091d5760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610625565b61092a8585858585611989565b5050505050565b61095a7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103611b77565b6001600160a01b0316336001600160a01b0316146109a65760405162461bcd60e51b81526020600482015260096024820152683737ba1030b236b4b760b91b6044820152606401610625565b600b5460ff16156109b657600080fd5b600b805460ff1916600117905560408051808201909152600a81526953636f7574205061737360b01b60208201526109fe90859085908590680ad78ebc5ac620000090611b81565b6040805180820190915260098082526853434f55545041535360b81b6020909201918252610a2e91600c91612f1e565b50600b80546001600160a01b0390921661010002610100600160a81b0319909216919091179055505050565b610a916040518060a00160405280606081526020016060815260200160608152602001600062ffffff168152602001606081525090565b604080516001808252818301909252600091816020015b6060815260200190600190039081610aa8579050509050610ac7611bff565b81600081518110610ada57610ada613e6e565b6020908102919091010152600b54604051638e182ed760e01b815260009161010090046001600160a01b031690638e182ed790610b1b908590600401613988565b60006040518083038186803b158015610b3357600080fd5b505afa158015610b47573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b6f9190810190613606565b90506040518060a001604052808281526020016040518060800160405280604781526020016146ee6047913981526020016040518060400160405280600a81526020016953636f7574205061737360b01b8152508152602001600062ffffff16815260200160006001600160401b03811115610bed57610bed613e84565b604051908082528060200260200182016040528015610c4957816020015b610c366040518060800160405280606081526020016060815260200160608152602001606081525090565b815260200190600190039081610c0b5790505b5090529392505050565b600054600160a01b900460ff16610c7c5760405162461bcd60e51b815260040161062590613ab0565b60008111610cc35760405162461bcd60e51b81526020600482015260146024820152734d757374206265206174206c65617374206f6e6560601b6044820152606401610625565b600954604051637921219560e11b81523360048201523060248201526000604482018190526064820184905260a0608483015260a48201526001600160a01b039091169063f242432a9060c4015b600060405180830381600087803b158015610d2b57600080fd5b505af1158015610d3f573d6000803e3d6000fd5b50505050610d5f3360008360405180602001604052806000815250611c22565b50565b60608151835114610dc75760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610625565b600083516001600160401b03811115610de257610de2613e84565b604051908082528060200260200182016040528015610e0b578160200160208202803683370190505b50905060005b8451811015610e8357610e56858281518110610e2f57610e2f613e6e565b6020026020010151858381518110610e4957610e49613e6e565b60200260200101516105bd565b828281518110610e6857610e68613e6e565b6020908102919091010152610e7c81613e3d565b9050610e11565b509392505050565b600054604051630935e01b60e21b81523360048201526001600160a01b03909116906324d7806c9060240160206040518083038186803b158015610ece57600080fd5b505afa158015610ee2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f069190613567565b610f225760405162461bcd60e51b815260040161062590613b3d565b600580546001600160a01b0319166001600160a01b0392909216919091179055565b600054604051630935e01b60e21b81523360048201526001600160a01b03909116906324d7806c9060240160206040518083038186803b158015610f8757600080fd5b505afa158015610f9b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fbf9190613567565b610fdb5760405162461bcd60e51b815260040161062590613b3d565b8051610896906007906020840190612f1e565b600054604051630935e01b60e21b81523360048201526001600160a01b03909116906324d7806c9060240160206040518083038186803b15801561103157600080fd5b505afa158015611045573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110699190613567565b6110855760405162461bcd60e51b815260040161062590613b3d565b600b80546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b600054604051630935e01b60e21b81523360048201526001600160a01b03909116906324d7806c9060240160206040518083038186803b1580156110f057600080fd5b505afa158015611104573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111289190613567565b6111445760405162461bcd60e51b815260040161062590613b3d565b6000821161118b5760405162461bcd60e51b81526020600482015260146024820152734d757374206265206174206c65617374206f6e6560601b6044820152606401610625565b6108968160008460405180602001604052806000815250611c22565b6060600c80546111b690613dd6565b80601f01602080910402602001604051908101604052809291908181526020018280546111e290613dd6565b801561122f5780601f106112045761010080835404028352916020019161122f565b820191906000526020600020905b81548152906001019060200180831161121257829003601f168201915b5050505050905090565b600054600160a01b900460ff166112625760405162461bcd60e51b815260040161062590613ab0565b600054604051630935e01b60e21b81523360048201526001600160a01b03909116906324d7806c9060240160206040518083038186803b1580156112a557600080fd5b505afa1580156112b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112dd9190613567565b806112f05750336001600160a01b038316145b6113355760405162461bcd60e51b815260206004820152601660248201527536bab9ba1031329030b236b4b71037b91037bbb732b960511b6044820152606401610625565b61089633600083611d34565b610896338383611eb1565b600054604051630935e01b60e21b81523360048201526001600160a01b03909116906324d7806c9060240160206040518083038186803b15801561138f57600080fd5b505afa1580156113a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113c79190613567565b6113e35760405162461bcd60e51b815260040161062590613b3d565b60008054911515600160a01b0260ff60a01b19909216919091179055565b600054604051630935e01b60e21b81523360048201526001600160a01b03909116906324d7806c9060240160206040518083038186803b15801561144457600080fd5b505afa158015611458573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061147c9190613567565b6114985760405162461bcd60e51b815260040161062590613b3d565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b600054604051630935e01b60e21b81523360048201526001600160a01b03909116906324d7806c9060240160206040518083038186803b1580156114fd57600080fd5b505afa158015611511573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115359190613567565b6115515760405162461bcd60e51b815260040161062590613b3d565b600a55565b600054600160a01b900460ff1661157f5760405162461bcd60e51b815260040161062590613ab0565b600081116115c85760405162461bcd60e51b81526020600482015260166024820152754d757374206d696e74206174206c65617374206f6e6560501b6044820152606401610625565b600a546008546115d89190613d8f565b6000805260046020527f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ec5461160e908390613d36565b11156116505760405162461bcd60e51b8152602060048201526011602482015270457863656564206d617820737570706c7960781b6044820152606401610625565b6005546006546001600160a01b0390911690639dc29fac9033906116749085613d70565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401610d11565b6001600160a01b0385163314806116c157506116c18533610523565b61171f5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201526808185c1c1c9bdd995960ba1b6064820152608401610625565b61092a8585858585611f92565b6000546001600160a01b031615806117ba5750600054604051630935e01b60e21b81523360048201526001600160a01b03909116906324d7806c9060240160206040518083038186803b15801561178257600080fd5b505afa158015611796573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ba9190613567565b6118525760405162461bcd60e51b815260206004820152605760248201527f436861696e53636f757473457874656e73696f6e3a2054686520436861696e2060448201527f53636f75747320636f6e7472616374206d757374206e6f74206265207365742060648201527f6f7220796f75206d75737420626520616e2061646d696e000000000000000000608482015260a401610625565b600080546001600160a01b0319166001600160a01b038316908117909155604080518082018252600d81526c6d65746176657273655061737360981b602082015290516307e9c7c760e11b8152630fd38f8e916118b3913090600401613a3e565b600060405180830381600087803b1580156118cd57600080fd5b505af115801561092a573d6000803e3d6000fd5b60408051600180825281830190925260609160009190816020015b60408051808201909152606080825260208201528152602001906001900390816118fc575050604080516080810182526006918101918252651cde5b589bdb60d21b606082015290815290915060208101611956856120b3565b8152508160008151811061196c5761196c613e6e565b602002602001018190525061198184826120f9565b949350505050565b81518351146119eb5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b6064820152608401610625565b6001600160a01b038416611a115760405162461bcd60e51b815260040161062590613af8565b33611a20818787878787612419565b60005b8451811015611b09576000858281518110611a4057611a40613e6e565b602002602001015190506000858381518110611a5e57611a5e613e6e565b60209081029190910181015160008481526001835260408082206001600160a01b038e168352909352919091205490915081811015611aaf5760405162461bcd60e51b815260040161062590613b7e565b60008381526001602090815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290611aee908490613d36565b9250508190555050505080611b0290613e3d565b9050611a23565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611b599291906139fd565b60405180910390a4611b6f818787878787612525565b505050505050565b60006106a2825490565b611b9960405180602001604052806000815250612690565b6000805460ff60a01b1916600160a01b179055610d74600855600980546001600160a01b038088166001600160a01b031992831617909255600a869055600580549286169290911691909117905560068290558051611b6f906007906020840190612f1e565b60606040518061076001604052806107358152602001613fb96107359139905090565b6001600160a01b038416611c825760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610625565b33611ca281600087611c93886126a3565b611c9c886126a3565b87612419565b60008481526001602090815260408083206001600160a01b038916845290915281208054859290611cd4908490613d36565b909155505060408051858152602081018590526001600160a01b0380881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a461092a816000878787876126ee565b6001600160a01b038316611d965760405162461bcd60e51b815260206004820152602360248201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260448201526265737360e81b6064820152608401610625565b33611dc581856000611da7876126a3565b611db0876126a3565b60405180602001604052806000815250612419565b60008381526001602090815260408083206001600160a01b038816845290915290205482811015611e445760405162461bcd60e51b8152602060048201526024808201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604482015263616e636560e01b6064820152608401610625565b60008481526001602090815260408083206001600160a01b03898116808652918452828520888703905582518981529384018890529092908616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a45050505050565b816001600160a01b0316836001600160a01b03161415611f255760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610625565b6001600160a01b03838116600081815260026020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b038416611fb85760405162461bcd60e51b815260040161062590613af8565b33611fc8818787611c93886126a3565b60008481526001602090815260408083206001600160a01b038a1684529091529020548381101561200b5760405162461bcd60e51b815260040161062590613b7e565b60008581526001602090815260408083206001600160a01b038b811685529252808320878503905590881682528120805486929061204a908490613d36565b909155505060408051868152602081018690526001600160a01b03808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46120aa8288888888886126ee565b50505050505050565b606060008251116120d357604051806020016040528060008152506106a2565b816040516020016120e4919061382d565b60405160208183030381529060405292915050565b60606000836000015160405160200161211291906138a0565b60405160208183030381529060405290506000835160056121339190613d36565b6001600160401b0381111561214a5761214a613e84565b60405190808252806020026020018201604052801561218f57816020015b60408051808201909152606080825260208201528152602001906001900390816121685790505b5090506040518060400160405280604051806040016040528060048152602001636e616d6560e01b81525081526020016121cc87604001516120b3565b815250816000815181106121e2576121e2613e6e565b602002602001018190525060405180604001604052806040518060400160405280600b81526020016a3232b9b1b934b83a34b7b760a91b815250815260200161222e87602001516120b3565b8152508160018151811061224457612244613e6e565b6020026020010181905250604051806040016040528060405180604001604052806005815260200164696d61676560d81b8152508152602001612286846120b3565b8152508160028151811061229c5761229c613e6e565b602002602001018190525060405180604001604052806040518060400160405280601081526020016f3130b1b5b3b937bab7322fb1b7b637b960811b81525081526020016122fc6122f7886060015162ffffff1660036127b8565b6120b3565b8152508160038151811061231257612312613e6e565b602002602001018190525060405180604001604052806040518060400160405280600a8152602001696174747269627574657360b01b815250815260200161235d87608001516128f5565b8152508160048151811061237357612373613e6e565b602002602001018190525060005b84518110156123de5784818151811061239c5761239c613e6e565b6020026020010151828260056123b29190613d36565b815181106123c2576123c2613e6e565b6020026020010181905250806123d790613e3d565b9050612381565b506123f06123eb82612bf7565b612d00565b604051602001612400919061385b565b6040516020818303038152906040529250505092915050565b6001600160a01b0385166124a05760005b835181101561249e5782818151811061244557612445613e6e565b60200260200101516004600086848151811061246357612463613e6e565b6020026020010151815260200190815260200160002060008282546124889190613d36565b90915550612497905081613e3d565b905061242a565b505b6001600160a01b038416611b6f5760005b83518110156120aa578281815181106124cc576124cc613e6e565b6020026020010151600460008684815181106124ea576124ea613e6e565b60200260200101518152602001908152602001600020600082825461250f9190613d8f565b9091555061251e905081613e3d565b90506124b1565b6001600160a01b0384163b15611b6f5760405163bc197c8160e01b81526001600160a01b0385169063bc197c819061256990899089908890889088906004016138e5565b602060405180830381600087803b15801561258357600080fd5b505af19250505080156125b3575060408051601f3d908101601f191682019092526125b0918101906135a1565b60015b612660576125bf613e9a565b806308c379a014156125f957506125d4613eb6565b806125df57506125fb565b8060405162461bcd60e51b81526004016106259190613a2b565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610625565b6001600160e01b0319811663bc197c8160e01b146120aa5760405162461bcd60e51b815260040161062590613a68565b8051610896906003906020840190612f1e565b604080516001808252818301909252606091600091906020808301908036833701905050905082816000815181106126dd576126dd613e6e565b602090810291909101015292915050565b6001600160a01b0384163b15611b6f5760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906127329089908990889088908890600401613943565b602060405180830381600087803b15801561274c57600080fd5b505af192505050801561277c575060408051601f3d908101601f19168201909252612779918101906135a1565b60015b612788576125bf613e9a565b6001600160e01b0319811663f23a6e6160e01b146120aa5760405162461bcd60e51b815260040161062590613a68565b60408051808201909152601081526f181899199a1a9b1b9c1ca0a121a222a360811b602082015260609060006127ef846002613d70565b6001600160401b0381111561280657612806613e84565b6040519080825280601f01601f191660200182016040528015612830576020820181803683370190505b50905060005b612841856002613d70565b8110156128ec578261287387612858846004613d70565b612863906003613d36565b61286e856004613d70565b612e67565b8151811061288357612883613e6e565b01602001516001600160f81b031916828260016128a1896002613d70565b6128ab9190613d8f565b6128b59190613d8f565b815181106128c5576128c5613e6e565b60200101906001600160f81b031916908160001a9053506128e581613e3d565b9050612836565b50949350505050565b604080518082019091526001808252605b60f81b602083015260005b8351811015612bce57600084828151811061292e5761292e613e6e565b602002602001015160400151511115612bbe5760408051600480825260a08201909252600091816020015b604080518082019091526060808252602082015281526020019060019003908161295957905050905060405180604001604052806040518060400160405280600a81526020016974726169745f7479706560b01b81525081526020016129db8785815181106129ca576129ca613e6e565b6020026020010151602001516120b3565b815250816000815181106129f1576129f1613e6e565b602002602001018190525060405180604001604052806040518060400160405280600c81526020016b646973706c61795f7479706560a01b8152508152602001612a57878581518110612a4657612a46613e6e565b6020026020010151600001516120b3565b81525081600181518110612a6d57612a6d613e6e565b602002602001018190525060405180604001604052806040518060400160405280600581526020016476616c756560d81b8152508152602001868481518110612ab857612ab8613e6e565b60200260200101516040015181525081600281518110612ada57612ada613e6e565b60200260200101819052506040518060400160405280604051806040016040528060098152602001686d61785f76616c756560b81b8152508152602001868481518110612b2957612b29613e6e565b60200260200101516060015181525081600381518110612b4b57612b4b613e6e565b60200260200101819052508383612b7b57604051806040016040528060018152602001600b60fa1b815250612b8c565b604051806020016040528060008152505b612b9583612bf7565b604051602001612ba79392919061372c565b604051602081830303815290604052935060009250505b612bc781613e3d565b9050612911565b5081604051602001612be09190613808565b604051602081830303815290604052915050919050565b604080518082019091526001808252607b60f81b602083015260005b8351811015612cee576000848281518110612c3057612c30613e6e565b602002602001015160200151511115612cde578282612c6857604051806040016040528060018152602001600b60fa1b815250612c79565b604051806020016040528060008152505b858381518110612c8b57612c8b613e6e565b602002602001015160000151868481518110612ca957612ca9613e6e565b602002602001015160200151604051602001612cc8949392919061376f565b6040516020818303038152906040529250600091505b612ce781613e3d565b9050612c13565b5081604051602001612be091906137e3565b6060815160001415612d2057505060408051602081019091526000815290565b6000604051806060016040528060408152602001613f796040913990506000600384516002612d4f9190613d36565b612d599190613d4e565b612d64906004613d70565b90506000612d73826020613d36565b6001600160401b03811115612d8a57612d8a613e84565b6040519080825280601f01601f191660200182016040528015612db4576020820181803683370190505b509050818152600183018586518101602084015b81831015612e225760039283018051603f601282901c811687015160f890811b8552600c83901c8216880151811b6001860152600683901c8216880151811b60028601529116860151901b93820193909352600401612dc8565b600389510660018114612e3c5760028114612e4d57612e59565b613d3d60f01b600119830152612e59565b603d60f81b6000198301525b509398975050505050505050565b600081831015612ea85760405162461bcd60e51b815260206004820152600c60248201526b1b19599d080f881c9a59da1d60a21b6044820152606401610625565b60ff831115612ee65760405162461bcd60e51b815260206004820152600a6024820152696c656674203e2032353560b01b6044820152606401610625565b6000612ef28385613d8f565b612efd906001613d36565b90508280612f0e600180851b613d8f565b901b8616901c9150509392505050565b828054612f2a90613dd6565b90600052602060002090601f016020900481019282612f4c5760008555612f92565b82601f10612f6557805160ff1916838001178555612f92565b82800160010185558215612f92579182015b82811115612f92578251825591602001919060010190612f77565b50612f9e929150612fa2565b5090565b5b80821115612f9e5760008155600101612fa3565b6000612fc283613d0f565b604051612fcf8282613e11565b809250848152858585011115612fe457600080fd5b8484602083013760006020868301015250509392505050565b60008083601f84011261300f57600080fd5b5081356001600160401b0381111561302657600080fd5b6020830191508360208260051b850101111561304157600080fd5b9250929050565b600082601f83011261305957600080fd5b8135602061306682613cec565b6040516130738282613e11565b8381528281019150858301600585901b8701840188101561309357600080fd5b60005b858110156130b257813584529284019290840190600101613096565b5090979650505050505050565b60008083601f8401126130d157600080fd5b5081356001600160401b038111156130e857600080fd5b60208301915083602082850101111561304157600080fd5b600082601f83011261311157600080fd5b61312083833560208501612fb7565b9392505050565b60006020828403121561313957600080fd5b813561312081613f3f565b6000806040838503121561315757600080fd5b823561316281613f3f565b9150602083013561317281613f3f565b809150509250929050565b60008060008060008060008060a0898b03121561319957600080fd5b88356131a481613f3f565b975060208901356131b481613f3f565b965060408901356001600160401b03808211156131d057600080fd5b6131dc8c838d01612ffd565b909850965060608b01359150808211156131f557600080fd5b6132018c838d01612ffd565b909650945060808b013591508082111561321a57600080fd5b506132278b828c016130bf565b999c989b5096995094979396929594505050565b600080600080600060a0868803121561325357600080fd5b853561325e81613f3f565b9450602086013561326e81613f3f565b935060408601356001600160401b038082111561328a57600080fd5b61329689838a01613048565b945060608801359150808211156132ac57600080fd5b6132b889838a01613048565b935060808801359150808211156132ce57600080fd5b506132db88828901613100565b9150509295509295909350565b60008060008060008060a0878903121561330157600080fd5b863561330c81613f3f565b9550602087013561331c81613f3f565b9450604087013593506060870135925060808701356001600160401b0381111561334557600080fd5b61335189828a016130bf565b979a9699509497509295939492505050565b600080600080600060a0868803121561337b57600080fd5b853561338681613f3f565b9450602086013561339681613f3f565b9350604086013592506060860135915060808601356001600160401b038111156133bf57600080fd5b6132db88828901613100565b600080604083850312156133de57600080fd5b82356133e981613f3f565b9150602083013561317281613f54565b6000806040838503121561340c57600080fd5b823561341781613f3f565b946020939093013593505050565b6000806000806080858703121561343b57600080fd5b843561344681613f3f565b935060208501359250604085013561345d81613f3f565b9150606085013561346d81613f3f565b939692955090935050565b6000806040838503121561348b57600080fd5b82356001600160401b03808211156134a257600080fd5b818501915085601f8301126134b657600080fd5b813560206134c382613cec565b6040516134d08282613e11565b8381528281019150858301600585901b870184018b10156134f057600080fd5b600096505b8487101561351c57803561350881613f3f565b8352600196909601959183019183016134f5565b509650508601359250508082111561353357600080fd5b5061354085828601613048565b9150509250929050565b60006020828403121561355c57600080fd5b813561312081613f54565b60006020828403121561357957600080fd5b815161312081613f54565b60006020828403121561359657600080fd5b813561312081613f62565b6000602082840312156135b357600080fd5b815161312081613f62565b6000602082840312156135d057600080fd5b81356001600160401b038111156135e657600080fd5b8201601f810184136135f757600080fd5b61198184823560208401612fb7565b60006020828403121561361857600080fd5b81516001600160401b0381111561362e57600080fd5b8201601f8101841361363f57600080fd5b805161364a81613d0f565b6040516136578282613e11565b82815286602084860101111561366c57600080fd5b61367d836020830160208701613da6565b9695505050505050565b60006020828403121561369957600080fd5b5035919050565b600080604083850312156136b357600080fd5b82359150602083013561317281613f3f565b600081518084526020808501945080840160005b838110156136f5578151875295820195908201906001016136d9565b509495945050505050565b60008151808452613718816020860160208601613da6565b601f01601f19169290920160200192915050565b6000845161373e818460208901613da6565b845190830190613752818360208901613da6565b8451910190613765818360208801613da6565b0195945050505050565b60008551613781818460208a01613da6565b855190830190613795818360208a01613da6565b601160f91b910190815284516137b2816001840160208901613da6565b61111d60f11b6001929091019182015283516137d5816003840160208801613da6565b016003019695505050505050565b600082516137f5818460208701613da6565b607d60f81b920191825250600101919050565b6000825161381a818460208701613da6565b605d60f81b920191825250600101919050565b6000601160f91b808352835161384a816001860160208801613da6565b600193019283015250600201919050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161389381601d850160208701613da6565b91909101601d0192915050565b7f646174613a696d6167652f7376672b786d6c3b757466382c00000000000000008152600082516138d8816018850160208701613da6565b9190910160180192915050565b6001600160a01b0386811682528516602082015260a060408201819052600090613911908301866136c5565b828103606084015261392381866136c5565b905082810360808401526139378185613700565b98975050505050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a06080820181905260009061397d90830184613700565b979650505050505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b828110156139dd57603f198886030184526139cb858351613700565b945092850192908501906001016139af565b5092979650505050505050565b60208152600061312060208301846136c5565b604081526000613a1060408301856136c5565b8281036020840152613a2281856136c5565b95945050505050565b6020815260006131206020830184613700565b604081526000613a516040830185613700565b905060018060a01b03831660208301529392505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b60208082526028908201527f436861696e53636f757473457874656e73696f6e3a2063757272656e746c7920604082015267191a5cd8589b195960c21b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526021908201527f436861696e53636f757473457874656e73696f6e3a2061646d696e73206f6e6c6040820152607960f81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b60006020808352835160a082850152613be460c0850182613700565b905081850151601f196040818785030181880152613c028484613700565b93508088015192506060828886030181890152613c1f8585613700565b8982015162ffffff1660808a810191909152808b01518a8303860160a08c01528051808452929750880195509087870190600581901b8801890160005b82811015613cdb57878a830301845288518051868452613c7e87850182613700565b90508c8201518482038e860152613c958282613700565b915050888201518482038a860152613cad8282613700565b91505087820151915083810388850152613cc78183613700565b9a8d019a958d019593505050600101613c5c565b509c9b505050505050505050505050565b60006001600160401b03821115613d0557613d05613e84565b5060051b60200190565b60006001600160401b03821115613d2857613d28613e84565b50601f01601f191660200190565b60008219821115613d4957613d49613e58565b500190565b600082613d6b57634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615613d8a57613d8a613e58565b500290565b600082821015613da157613da1613e58565b500390565b60005b83811015613dc1578181015183820152602001613da9565b83811115613dd0576000848401525b50505050565b600181811c90821680613dea57607f821691505b60208210811415613e0b57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8201601f191681016001600160401b0381118282101715613e3657613e36613e84565b6040525050565b6000600019821415613e5157613e51613e58565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600060033d1115613eb35760046000803e5060005160e01c5b90565b600060443d1015613ec45790565b6040516003193d81016004833e81513d6001600160401b038160248401118184111715613ef357505050505090565b8285019150815181811115613f0b5750505050505090565b843d8701016020828501011115613f255750505050505090565b613f3460208286010187613e11565b509095945050505050565b6001600160a01b0381168114610d5f57600080fd5b8015158114610d5f57600080fd5b6001600160e01b031981168114610d5f57600080fdfe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f41f022e501c28b9a020905370826b808241cfc28b98040d8426122e67102428101114dc4221e04044e4409075f122e501868b99c609aa066aaa46044a866aaac6ade58d1bf6ee19b057c46fdbc866becc6fdbd06fc8d46aded866bedc6044e066aae4609a75e1a2e7f1836101888b99c809aa09126a48044a880eb576203cf720113823f6f920269d7c88b94062a2e672826a829aaa9283cea2ac195d8aadedca0f3e0a6aae4a09a75f2a2e500cc8b990c0d84a6322e673026a8308869303cd538cade5f0300118d8cadedcc0f3e0c221e4c09a75f322e5018e8b99ce09aa0f126a4e0f3a8eac156d3ab7ae38012f3b86b0380118d8eadedce0f3e0f126e4e09ae8e8b9ece1a179f3a2e501908b99d009aa10221a500f354c42b7ad40012e45e1af400118590adedd00f3e10221e5009a75f422e501928b99d209aa126cda520f354b4ab7ac48012d4de1ae4c182f480118592adedd20f3e126aae5209a75f4a2e500d48b99148ba4a6522e675026a850a129503cea52b7ab50012c55e1ad560fee54182f55e1b0500118cd4ade69550013652b7b7503cf85088b95026ba522efb52327c522e9efd48b98168b98562ad8968c94665a2e675826a85834e958112a5ab7ab58012c5de1ad5e0fee5c182f5de1b05c1818cd6004d1783fd56004d96adedd6044e160e4e5609a75c5a2e7d5a2efe5a2ebf58ab60622ba1622ed11988b99d809aa180d3a58044a98adead8004b19786b5983fb99060bd9786c197ce63464183560013662b7b76011386034f960269d7d88b981a8bf4266a2e676826a869afa968112a6ab7ab68012c6de1ad6df3ae6e0fef6c18306de1b16df3b26de199d1b83fd5a02bd9aadedda044e1a6bee5a09ae9a8d4eda8b9f1a8c87bf6a2e5011c8b995c8d499c8e79dc09aa1cfdba5c04454b72b7ac70012d75e1ae75f3af760fd851d060d5c004d9cadeddc044e1cfdbe5c044e9c8e777c72321efdc8b94037a2e647a35257a3ca67a40e77811287bf6e978111531eadeb5e0045d07de198cdf83fd1e0046b67ab7b77811387bf6f978113a7a645df1e8f2f5e8e77df7a32100608b98a08d48e08e79209039602c99a099e9e009aa20fdba6004454d82b7974e000469682b7b780113883f6f98026ba826e3b82647c82427d80ad3e82353f8232208a35218a39e28a43a38a42648a69658a77268a7e678826a889afa98811155a2adede2044e226bee6209aea2a0eee29d4f229b8f62909fa28f2fe28e78248f18648f28a49868e499e9249d4964a0e9a4a289e409aa246bea6404455696213790113891afb99026ba92a9fb92943c9287fd92797e926e3f9264609a40e19a64629a6b639a79649a87e59a9e669ab8a79826a899afa99811155a6adede6044e266bee6609aea6b15ee6ae2f26a6ef66a28fa6a05fe69ad82899e8689c38a89e58e8a39928aa7968b169a8b789e809aa29126a68044aa8ade56ca0886da2b797468221ca8ade675a08876a2b7b7a01138a449b9a026baa2ef7ba2da7ca2bb7da2a2fea2977fa27e60a8ba61aa83a2aa9423aaaf64aac565aaf4a6ab16e7a826a8ac49a9a8112aaab7aba8886caab796baa221beaadec2a221c6aade653a88874aab7b5a88876aab7b7a81138ac49b9a826baab2cbbab0b3caadcbdaac2feaaacbfa8c5e0b28361b29b62b2b123b2d7e4b2f365b31e66b34f67b026a8b449a9b011155acadedec044e2d126e6c09aeacdf9eeccdff2cc47f6cbd2facb50fecabd82ea5086eaed8aeb698eec1492ec9a96ed719aee859ee09aa2e221a6e0f3aaeade56eb8886fbab79846e221caeadecee221d2eaded6e221daeadedee044e2e221e6e09aeaef09eeee60f2ed36f6ec88faebe9feeb43830ac4870b508b0c1d8f0cb2930d8a970e589b0f8d9f009aa306bea700f354bc2b7acc0886dc2b7973f0221c30ade632c08873c2b79a570221db0adedf0044e306bee7009aeb104bef0f61f30e79f70d67fb0c79ff0be9832b16872bfa8b2c888f2d80932ea4972fb79b31089f209aa326bea720f3556cab7b7c83cf8c9afb9c826bacc743bcc18fccbe0bdcb9abecb4f7fcb18a0d2e4e1d31ae2d34f63d3a164d3e0a5d447e6d48a27d026a8d449a9d03cd55b5884df40f3e34fdbe7409aeb52daef51e8f35063f74f6bfb4e53ff4cdf836c14876cdf8b6e2a8f6f6b9370fd9772099b732c9f609aa37126a76044ab60eb576d83cf7d81138dbf6f9d826badcfc7bdcaffcdc743ddc12fedbceffdb7e60e31e61e36662e3bd63e40864e473e5e4bba6e4fc67e026a8e1aaa9e0112ae1aaabe2b796378fdbbb86c15f1e3f6f2e1afb3e3f6f4e3f235e2b7b6e1afb7e01138e1aab9e026bae51cbbe4eb3ce4a97de466fee3f0ffe3b760eb3a61eb7962ebe6e3ec56521ba0049fa090a3a044537e88878e81139e8241d73a004f7b25cfbb11fffaf8283cd9987cef58bd0308fc004487f60fe8f61014afd846b3d8425b6f6119be3d84273cf60ffdf0013ef4743ff3fda0fb86e1fbd862fc4ba3fc9e64f801129ff786509fc181533f786b7f0605d2fde1b3fc181a5bf7866f8fc181ceff786f3e004f7f39bfbf25cfff0f05468652053636f7574205061737320697320746865206b657920746f20756e6c6f636b207065726b7320696e2074686520436861696e2053636f7574732065636f73797374656da26469706673582212204c4c4248214444c6d891ba2e2a970a03cbb09cc97544e5170e57948464bac84964736f6c63430008070033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102315760003560e01c80637e26fbca11610130578063bc197c81116100b8578063efef39a11161007c578063efef39a114610551578063f23a6e6114610564578063f242432a14610584578063fc0c546a14610597578063ff1ff89c146105aa57600080fd5b8063bc197c8114610494578063bd85b039146104cf578063c78a0004146104ef578063c8abd9f214610502578063e985e9c51461051557600080fd5b80639dc29fac116100ff5780639dc29fac14610429578063a035b1fe1461043c578063a22cb46514610445578063a307cf9014610458578063b4375dc91461048157600080fd5b80637e26fbca146103e3578063850dd091146103f65780638ada6b0f1461040957806395d89b411461042157600080fd5b80632eb2c2d6116101be5780634e1273f4116101825780634e1273f4146103505780634f558e7914610370578063513f2862146103925780635e282bc8146103a5578063767bd704146103b857600080fd5b80632eb2c2d6146102f957806332cb6b0c1461030c578063358394d814610315578063392f37e914610328578063454b06081461033d57600080fd5b80630cc3be2f116102055780630cc3be2f1461029d5780630e89341c146102b25780631129accd146102c5578063158ef93e146102d8578063238dafe0146102e557600080fd5b8062fdd58e1461023657806301ffc9a71461025c578063058508441461027f57806306fdde0314610288575b600080fd5b6102496102443660046133f9565b6105bd565b6040519081526020015b60405180910390f35b61026f61026a366004613584565b610656565b6040519015158152602001610253565b610249600a5481565b6102906106a8565b6040516102539190613a2b565b6102b06102ab366004613687565b610736565b005b6102906102c0366004613687565b6107d2565b6102b06102d33660046135be565b6107ec565b600b5461026f9060ff1681565b60005461026f90600160a01b900460ff1681565b6102b061030736600461323b565b61089a565b61024960085481565b6102b0610323366004613425565b610931565b610330610a5a565b6040516102539190613bc8565b6102b061034b366004613687565b610c53565b61036361035e366004613478565b610d62565b60405161025391906139ea565b61026f61037e366004613687565b600090815260046020526040902054151590565b6102b06103a0366004613127565b610e8b565b6102b06103b33660046135be565b610f44565b6009546103cb906001600160a01b031681565b6040516001600160a01b039091168152602001610253565b6102b06103f1366004613127565b610fee565b6102b06104043660046136a0565b6110ad565b600b546103cb9061010090046001600160a01b031681565b6102906111a7565b6102b06104373660046133f9565b611239565b61024960065481565b6102b06104533660046133cb565b611341565b60408051808201909152600d81526c6d65746176657273655061737360981b6020820152610290565b6102b061048f36600461354a565b61134c565b6104b66104a236600461317d565b63bc197c8160e01b98975050505050505050565b6040516001600160e01b03199091168152602001610253565b6102496104dd366004613687565b60009081526004602052604090205490565b6102b06104fd366004613127565b611401565b6102b0610510366004613687565b6114ba565b61026f610523366004613144565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205460ff1690565b6102b061055f366004613687565b611556565b6104b66105723660046132e8565b63f23a6e6160e01b9695505050505050565b6102b0610592366004613363565b6116a5565b6005546103cb906001600160a01b031681565b6102b06105b8366004613127565b61172c565b60006001600160a01b03831661062e5760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084015b60405180910390fd5b5060009081526001602090815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b03198216636cdb3d1360e11b148061068757506001600160e01b031982166303a24d0760e21b145b806106a257506301ffc9a760e01b6001600160e01b03198316145b92915050565b600780546106b590613dd6565b80601f01602080910402602001604051908101604052809291908181526020018280546106e190613dd6565b801561072e5780601f106107035761010080835404028352916020019161072e565b820191906000526020600020905b81548152906001019060200180831161071157829003601f168201915b505050505081565b600054604051630935e01b60e21b81523360048201526001600160a01b03909116906324d7806c9060240160206040518083038186803b15801561077957600080fd5b505afa15801561078d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107b19190613567565b6107cd5760405162461bcd60e51b815260040161062590613b3d565b600655565b60606106a26107df610a5a565b6107e76111a7565b6118e1565b600054604051630935e01b60e21b81523360048201526001600160a01b03909116906324d7806c9060240160206040518083038186803b15801561082f57600080fd5b505afa158015610843573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108679190613567565b6108835760405162461bcd60e51b815260040161062590613b3d565b805161089690600c906020840190612f1e565b5050565b6001600160a01b0385163314806108b657506108b68533610523565b61091d5760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610625565b61092a8585858585611989565b5050505050565b61095a7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103611b77565b6001600160a01b0316336001600160a01b0316146109a65760405162461bcd60e51b81526020600482015260096024820152683737ba1030b236b4b760b91b6044820152606401610625565b600b5460ff16156109b657600080fd5b600b805460ff1916600117905560408051808201909152600a81526953636f7574205061737360b01b60208201526109fe90859085908590680ad78ebc5ac620000090611b81565b6040805180820190915260098082526853434f55545041535360b81b6020909201918252610a2e91600c91612f1e565b50600b80546001600160a01b0390921661010002610100600160a81b0319909216919091179055505050565b610a916040518060a00160405280606081526020016060815260200160608152602001600062ffffff168152602001606081525090565b604080516001808252818301909252600091816020015b6060815260200190600190039081610aa8579050509050610ac7611bff565b81600081518110610ada57610ada613e6e565b6020908102919091010152600b54604051638e182ed760e01b815260009161010090046001600160a01b031690638e182ed790610b1b908590600401613988565b60006040518083038186803b158015610b3357600080fd5b505afa158015610b47573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b6f9190810190613606565b90506040518060a001604052808281526020016040518060800160405280604781526020016146ee6047913981526020016040518060400160405280600a81526020016953636f7574205061737360b01b8152508152602001600062ffffff16815260200160006001600160401b03811115610bed57610bed613e84565b604051908082528060200260200182016040528015610c4957816020015b610c366040518060800160405280606081526020016060815260200160608152602001606081525090565b815260200190600190039081610c0b5790505b5090529392505050565b600054600160a01b900460ff16610c7c5760405162461bcd60e51b815260040161062590613ab0565b60008111610cc35760405162461bcd60e51b81526020600482015260146024820152734d757374206265206174206c65617374206f6e6560601b6044820152606401610625565b600954604051637921219560e11b81523360048201523060248201526000604482018190526064820184905260a0608483015260a48201526001600160a01b039091169063f242432a9060c4015b600060405180830381600087803b158015610d2b57600080fd5b505af1158015610d3f573d6000803e3d6000fd5b50505050610d5f3360008360405180602001604052806000815250611c22565b50565b60608151835114610dc75760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610625565b600083516001600160401b03811115610de257610de2613e84565b604051908082528060200260200182016040528015610e0b578160200160208202803683370190505b50905060005b8451811015610e8357610e56858281518110610e2f57610e2f613e6e565b6020026020010151858381518110610e4957610e49613e6e565b60200260200101516105bd565b828281518110610e6857610e68613e6e565b6020908102919091010152610e7c81613e3d565b9050610e11565b509392505050565b600054604051630935e01b60e21b81523360048201526001600160a01b03909116906324d7806c9060240160206040518083038186803b158015610ece57600080fd5b505afa158015610ee2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f069190613567565b610f225760405162461bcd60e51b815260040161062590613b3d565b600580546001600160a01b0319166001600160a01b0392909216919091179055565b600054604051630935e01b60e21b81523360048201526001600160a01b03909116906324d7806c9060240160206040518083038186803b158015610f8757600080fd5b505afa158015610f9b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fbf9190613567565b610fdb5760405162461bcd60e51b815260040161062590613b3d565b8051610896906007906020840190612f1e565b600054604051630935e01b60e21b81523360048201526001600160a01b03909116906324d7806c9060240160206040518083038186803b15801561103157600080fd5b505afa158015611045573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110699190613567565b6110855760405162461bcd60e51b815260040161062590613b3d565b600b80546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b600054604051630935e01b60e21b81523360048201526001600160a01b03909116906324d7806c9060240160206040518083038186803b1580156110f057600080fd5b505afa158015611104573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111289190613567565b6111445760405162461bcd60e51b815260040161062590613b3d565b6000821161118b5760405162461bcd60e51b81526020600482015260146024820152734d757374206265206174206c65617374206f6e6560601b6044820152606401610625565b6108968160008460405180602001604052806000815250611c22565b6060600c80546111b690613dd6565b80601f01602080910402602001604051908101604052809291908181526020018280546111e290613dd6565b801561122f5780601f106112045761010080835404028352916020019161122f565b820191906000526020600020905b81548152906001019060200180831161121257829003601f168201915b5050505050905090565b600054600160a01b900460ff166112625760405162461bcd60e51b815260040161062590613ab0565b600054604051630935e01b60e21b81523360048201526001600160a01b03909116906324d7806c9060240160206040518083038186803b1580156112a557600080fd5b505afa1580156112b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112dd9190613567565b806112f05750336001600160a01b038316145b6113355760405162461bcd60e51b815260206004820152601660248201527536bab9ba1031329030b236b4b71037b91037bbb732b960511b6044820152606401610625565b61089633600083611d34565b610896338383611eb1565b600054604051630935e01b60e21b81523360048201526001600160a01b03909116906324d7806c9060240160206040518083038186803b15801561138f57600080fd5b505afa1580156113a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113c79190613567565b6113e35760405162461bcd60e51b815260040161062590613b3d565b60008054911515600160a01b0260ff60a01b19909216919091179055565b600054604051630935e01b60e21b81523360048201526001600160a01b03909116906324d7806c9060240160206040518083038186803b15801561144457600080fd5b505afa158015611458573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061147c9190613567565b6114985760405162461bcd60e51b815260040161062590613b3d565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b600054604051630935e01b60e21b81523360048201526001600160a01b03909116906324d7806c9060240160206040518083038186803b1580156114fd57600080fd5b505afa158015611511573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115359190613567565b6115515760405162461bcd60e51b815260040161062590613b3d565b600a55565b600054600160a01b900460ff1661157f5760405162461bcd60e51b815260040161062590613ab0565b600081116115c85760405162461bcd60e51b81526020600482015260166024820152754d757374206d696e74206174206c65617374206f6e6560501b6044820152606401610625565b600a546008546115d89190613d8f565b6000805260046020527f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ec5461160e908390613d36565b11156116505760405162461bcd60e51b8152602060048201526011602482015270457863656564206d617820737570706c7960781b6044820152606401610625565b6005546006546001600160a01b0390911690639dc29fac9033906116749085613d70565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401610d11565b6001600160a01b0385163314806116c157506116c18533610523565b61171f5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201526808185c1c1c9bdd995960ba1b6064820152608401610625565b61092a8585858585611f92565b6000546001600160a01b031615806117ba5750600054604051630935e01b60e21b81523360048201526001600160a01b03909116906324d7806c9060240160206040518083038186803b15801561178257600080fd5b505afa158015611796573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ba9190613567565b6118525760405162461bcd60e51b815260206004820152605760248201527f436861696e53636f757473457874656e73696f6e3a2054686520436861696e2060448201527f53636f75747320636f6e7472616374206d757374206e6f74206265207365742060648201527f6f7220796f75206d75737420626520616e2061646d696e000000000000000000608482015260a401610625565b600080546001600160a01b0319166001600160a01b038316908117909155604080518082018252600d81526c6d65746176657273655061737360981b602082015290516307e9c7c760e11b8152630fd38f8e916118b3913090600401613a3e565b600060405180830381600087803b1580156118cd57600080fd5b505af115801561092a573d6000803e3d6000fd5b60408051600180825281830190925260609160009190816020015b60408051808201909152606080825260208201528152602001906001900390816118fc575050604080516080810182526006918101918252651cde5b589bdb60d21b606082015290815290915060208101611956856120b3565b8152508160008151811061196c5761196c613e6e565b602002602001018190525061198184826120f9565b949350505050565b81518351146119eb5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b6064820152608401610625565b6001600160a01b038416611a115760405162461bcd60e51b815260040161062590613af8565b33611a20818787878787612419565b60005b8451811015611b09576000858281518110611a4057611a40613e6e565b602002602001015190506000858381518110611a5e57611a5e613e6e565b60209081029190910181015160008481526001835260408082206001600160a01b038e168352909352919091205490915081811015611aaf5760405162461bcd60e51b815260040161062590613b7e565b60008381526001602090815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290611aee908490613d36565b9250508190555050505080611b0290613e3d565b9050611a23565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611b599291906139fd565b60405180910390a4611b6f818787878787612525565b505050505050565b60006106a2825490565b611b9960405180602001604052806000815250612690565b6000805460ff60a01b1916600160a01b179055610d74600855600980546001600160a01b038088166001600160a01b031992831617909255600a869055600580549286169290911691909117905560068290558051611b6f906007906020840190612f1e565b60606040518061076001604052806107358152602001613fb96107359139905090565b6001600160a01b038416611c825760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610625565b33611ca281600087611c93886126a3565b611c9c886126a3565b87612419565b60008481526001602090815260408083206001600160a01b038916845290915281208054859290611cd4908490613d36565b909155505060408051858152602081018590526001600160a01b0380881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a461092a816000878787876126ee565b6001600160a01b038316611d965760405162461bcd60e51b815260206004820152602360248201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260448201526265737360e81b6064820152608401610625565b33611dc581856000611da7876126a3565b611db0876126a3565b60405180602001604052806000815250612419565b60008381526001602090815260408083206001600160a01b038816845290915290205482811015611e445760405162461bcd60e51b8152602060048201526024808201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604482015263616e636560e01b6064820152608401610625565b60008481526001602090815260408083206001600160a01b03898116808652918452828520888703905582518981529384018890529092908616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a45050505050565b816001600160a01b0316836001600160a01b03161415611f255760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610625565b6001600160a01b03838116600081815260026020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b038416611fb85760405162461bcd60e51b815260040161062590613af8565b33611fc8818787611c93886126a3565b60008481526001602090815260408083206001600160a01b038a1684529091529020548381101561200b5760405162461bcd60e51b815260040161062590613b7e565b60008581526001602090815260408083206001600160a01b038b811685529252808320878503905590881682528120805486929061204a908490613d36565b909155505060408051868152602081018690526001600160a01b03808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46120aa8288888888886126ee565b50505050505050565b606060008251116120d357604051806020016040528060008152506106a2565b816040516020016120e4919061382d565b60405160208183030381529060405292915050565b60606000836000015160405160200161211291906138a0565b60405160208183030381529060405290506000835160056121339190613d36565b6001600160401b0381111561214a5761214a613e84565b60405190808252806020026020018201604052801561218f57816020015b60408051808201909152606080825260208201528152602001906001900390816121685790505b5090506040518060400160405280604051806040016040528060048152602001636e616d6560e01b81525081526020016121cc87604001516120b3565b815250816000815181106121e2576121e2613e6e565b602002602001018190525060405180604001604052806040518060400160405280600b81526020016a3232b9b1b934b83a34b7b760a91b815250815260200161222e87602001516120b3565b8152508160018151811061224457612244613e6e565b6020026020010181905250604051806040016040528060405180604001604052806005815260200164696d61676560d81b8152508152602001612286846120b3565b8152508160028151811061229c5761229c613e6e565b602002602001018190525060405180604001604052806040518060400160405280601081526020016f3130b1b5b3b937bab7322fb1b7b637b960811b81525081526020016122fc6122f7886060015162ffffff1660036127b8565b6120b3565b8152508160038151811061231257612312613e6e565b602002602001018190525060405180604001604052806040518060400160405280600a8152602001696174747269627574657360b01b815250815260200161235d87608001516128f5565b8152508160048151811061237357612373613e6e565b602002602001018190525060005b84518110156123de5784818151811061239c5761239c613e6e565b6020026020010151828260056123b29190613d36565b815181106123c2576123c2613e6e565b6020026020010181905250806123d790613e3d565b9050612381565b506123f06123eb82612bf7565b612d00565b604051602001612400919061385b565b6040516020818303038152906040529250505092915050565b6001600160a01b0385166124a05760005b835181101561249e5782818151811061244557612445613e6e565b60200260200101516004600086848151811061246357612463613e6e565b6020026020010151815260200190815260200160002060008282546124889190613d36565b90915550612497905081613e3d565b905061242a565b505b6001600160a01b038416611b6f5760005b83518110156120aa578281815181106124cc576124cc613e6e565b6020026020010151600460008684815181106124ea576124ea613e6e565b60200260200101518152602001908152602001600020600082825461250f9190613d8f565b9091555061251e905081613e3d565b90506124b1565b6001600160a01b0384163b15611b6f5760405163bc197c8160e01b81526001600160a01b0385169063bc197c819061256990899089908890889088906004016138e5565b602060405180830381600087803b15801561258357600080fd5b505af19250505080156125b3575060408051601f3d908101601f191682019092526125b0918101906135a1565b60015b612660576125bf613e9a565b806308c379a014156125f957506125d4613eb6565b806125df57506125fb565b8060405162461bcd60e51b81526004016106259190613a2b565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610625565b6001600160e01b0319811663bc197c8160e01b146120aa5760405162461bcd60e51b815260040161062590613a68565b8051610896906003906020840190612f1e565b604080516001808252818301909252606091600091906020808301908036833701905050905082816000815181106126dd576126dd613e6e565b602090810291909101015292915050565b6001600160a01b0384163b15611b6f5760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906127329089908990889088908890600401613943565b602060405180830381600087803b15801561274c57600080fd5b505af192505050801561277c575060408051601f3d908101601f19168201909252612779918101906135a1565b60015b612788576125bf613e9a565b6001600160e01b0319811663f23a6e6160e01b146120aa5760405162461bcd60e51b815260040161062590613a68565b60408051808201909152601081526f181899199a1a9b1b9c1ca0a121a222a360811b602082015260609060006127ef846002613d70565b6001600160401b0381111561280657612806613e84565b6040519080825280601f01601f191660200182016040528015612830576020820181803683370190505b50905060005b612841856002613d70565b8110156128ec578261287387612858846004613d70565b612863906003613d36565b61286e856004613d70565b612e67565b8151811061288357612883613e6e565b01602001516001600160f81b031916828260016128a1896002613d70565b6128ab9190613d8f565b6128b59190613d8f565b815181106128c5576128c5613e6e565b60200101906001600160f81b031916908160001a9053506128e581613e3d565b9050612836565b50949350505050565b604080518082019091526001808252605b60f81b602083015260005b8351811015612bce57600084828151811061292e5761292e613e6e565b602002602001015160400151511115612bbe5760408051600480825260a08201909252600091816020015b604080518082019091526060808252602082015281526020019060019003908161295957905050905060405180604001604052806040518060400160405280600a81526020016974726169745f7479706560b01b81525081526020016129db8785815181106129ca576129ca613e6e565b6020026020010151602001516120b3565b815250816000815181106129f1576129f1613e6e565b602002602001018190525060405180604001604052806040518060400160405280600c81526020016b646973706c61795f7479706560a01b8152508152602001612a57878581518110612a4657612a46613e6e565b6020026020010151600001516120b3565b81525081600181518110612a6d57612a6d613e6e565b602002602001018190525060405180604001604052806040518060400160405280600581526020016476616c756560d81b8152508152602001868481518110612ab857612ab8613e6e565b60200260200101516040015181525081600281518110612ada57612ada613e6e565b60200260200101819052506040518060400160405280604051806040016040528060098152602001686d61785f76616c756560b81b8152508152602001868481518110612b2957612b29613e6e565b60200260200101516060015181525081600381518110612b4b57612b4b613e6e565b60200260200101819052508383612b7b57604051806040016040528060018152602001600b60fa1b815250612b8c565b604051806020016040528060008152505b612b9583612bf7565b604051602001612ba79392919061372c565b604051602081830303815290604052935060009250505b612bc781613e3d565b9050612911565b5081604051602001612be09190613808565b604051602081830303815290604052915050919050565b604080518082019091526001808252607b60f81b602083015260005b8351811015612cee576000848281518110612c3057612c30613e6e565b602002602001015160200151511115612cde578282612c6857604051806040016040528060018152602001600b60fa1b815250612c79565b604051806020016040528060008152505b858381518110612c8b57612c8b613e6e565b602002602001015160000151868481518110612ca957612ca9613e6e565b602002602001015160200151604051602001612cc8949392919061376f565b6040516020818303038152906040529250600091505b612ce781613e3d565b9050612c13565b5081604051602001612be091906137e3565b6060815160001415612d2057505060408051602081019091526000815290565b6000604051806060016040528060408152602001613f796040913990506000600384516002612d4f9190613d36565b612d599190613d4e565b612d64906004613d70565b90506000612d73826020613d36565b6001600160401b03811115612d8a57612d8a613e84565b6040519080825280601f01601f191660200182016040528015612db4576020820181803683370190505b509050818152600183018586518101602084015b81831015612e225760039283018051603f601282901c811687015160f890811b8552600c83901c8216880151811b6001860152600683901c8216880151811b60028601529116860151901b93820193909352600401612dc8565b600389510660018114612e3c5760028114612e4d57612e59565b613d3d60f01b600119830152612e59565b603d60f81b6000198301525b509398975050505050505050565b600081831015612ea85760405162461bcd60e51b815260206004820152600c60248201526b1b19599d080f881c9a59da1d60a21b6044820152606401610625565b60ff831115612ee65760405162461bcd60e51b815260206004820152600a6024820152696c656674203e2032353560b01b6044820152606401610625565b6000612ef28385613d8f565b612efd906001613d36565b90508280612f0e600180851b613d8f565b901b8616901c9150509392505050565b828054612f2a90613dd6565b90600052602060002090601f016020900481019282612f4c5760008555612f92565b82601f10612f6557805160ff1916838001178555612f92565b82800160010185558215612f92579182015b82811115612f92578251825591602001919060010190612f77565b50612f9e929150612fa2565b5090565b5b80821115612f9e5760008155600101612fa3565b6000612fc283613d0f565b604051612fcf8282613e11565b809250848152858585011115612fe457600080fd5b8484602083013760006020868301015250509392505050565b60008083601f84011261300f57600080fd5b5081356001600160401b0381111561302657600080fd5b6020830191508360208260051b850101111561304157600080fd5b9250929050565b600082601f83011261305957600080fd5b8135602061306682613cec565b6040516130738282613e11565b8381528281019150858301600585901b8701840188101561309357600080fd5b60005b858110156130b257813584529284019290840190600101613096565b5090979650505050505050565b60008083601f8401126130d157600080fd5b5081356001600160401b038111156130e857600080fd5b60208301915083602082850101111561304157600080fd5b600082601f83011261311157600080fd5b61312083833560208501612fb7565b9392505050565b60006020828403121561313957600080fd5b813561312081613f3f565b6000806040838503121561315757600080fd5b823561316281613f3f565b9150602083013561317281613f3f565b809150509250929050565b60008060008060008060008060a0898b03121561319957600080fd5b88356131a481613f3f565b975060208901356131b481613f3f565b965060408901356001600160401b03808211156131d057600080fd5b6131dc8c838d01612ffd565b909850965060608b01359150808211156131f557600080fd5b6132018c838d01612ffd565b909650945060808b013591508082111561321a57600080fd5b506132278b828c016130bf565b999c989b5096995094979396929594505050565b600080600080600060a0868803121561325357600080fd5b853561325e81613f3f565b9450602086013561326e81613f3f565b935060408601356001600160401b038082111561328a57600080fd5b61329689838a01613048565b945060608801359150808211156132ac57600080fd5b6132b889838a01613048565b935060808801359150808211156132ce57600080fd5b506132db88828901613100565b9150509295509295909350565b60008060008060008060a0878903121561330157600080fd5b863561330c81613f3f565b9550602087013561331c81613f3f565b9450604087013593506060870135925060808701356001600160401b0381111561334557600080fd5b61335189828a016130bf565b979a9699509497509295939492505050565b600080600080600060a0868803121561337b57600080fd5b853561338681613f3f565b9450602086013561339681613f3f565b9350604086013592506060860135915060808601356001600160401b038111156133bf57600080fd5b6132db88828901613100565b600080604083850312156133de57600080fd5b82356133e981613f3f565b9150602083013561317281613f54565b6000806040838503121561340c57600080fd5b823561341781613f3f565b946020939093013593505050565b6000806000806080858703121561343b57600080fd5b843561344681613f3f565b935060208501359250604085013561345d81613f3f565b9150606085013561346d81613f3f565b939692955090935050565b6000806040838503121561348b57600080fd5b82356001600160401b03808211156134a257600080fd5b818501915085601f8301126134b657600080fd5b813560206134c382613cec565b6040516134d08282613e11565b8381528281019150858301600585901b870184018b10156134f057600080fd5b600096505b8487101561351c57803561350881613f3f565b8352600196909601959183019183016134f5565b509650508601359250508082111561353357600080fd5b5061354085828601613048565b9150509250929050565b60006020828403121561355c57600080fd5b813561312081613f54565b60006020828403121561357957600080fd5b815161312081613f54565b60006020828403121561359657600080fd5b813561312081613f62565b6000602082840312156135b357600080fd5b815161312081613f62565b6000602082840312156135d057600080fd5b81356001600160401b038111156135e657600080fd5b8201601f810184136135f757600080fd5b61198184823560208401612fb7565b60006020828403121561361857600080fd5b81516001600160401b0381111561362e57600080fd5b8201601f8101841361363f57600080fd5b805161364a81613d0f565b6040516136578282613e11565b82815286602084860101111561366c57600080fd5b61367d836020830160208701613da6565b9695505050505050565b60006020828403121561369957600080fd5b5035919050565b600080604083850312156136b357600080fd5b82359150602083013561317281613f3f565b600081518084526020808501945080840160005b838110156136f5578151875295820195908201906001016136d9565b509495945050505050565b60008151808452613718816020860160208601613da6565b601f01601f19169290920160200192915050565b6000845161373e818460208901613da6565b845190830190613752818360208901613da6565b8451910190613765818360208801613da6565b0195945050505050565b60008551613781818460208a01613da6565b855190830190613795818360208a01613da6565b601160f91b910190815284516137b2816001840160208901613da6565b61111d60f11b6001929091019182015283516137d5816003840160208801613da6565b016003019695505050505050565b600082516137f5818460208701613da6565b607d60f81b920191825250600101919050565b6000825161381a818460208701613da6565b605d60f81b920191825250600101919050565b6000601160f91b808352835161384a816001860160208801613da6565b600193019283015250600201919050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161389381601d850160208701613da6565b91909101601d0192915050565b7f646174613a696d6167652f7376672b786d6c3b757466382c00000000000000008152600082516138d8816018850160208701613da6565b9190910160180192915050565b6001600160a01b0386811682528516602082015260a060408201819052600090613911908301866136c5565b828103606084015261392381866136c5565b905082810360808401526139378185613700565b98975050505050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a06080820181905260009061397d90830184613700565b979650505050505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b828110156139dd57603f198886030184526139cb858351613700565b945092850192908501906001016139af565b5092979650505050505050565b60208152600061312060208301846136c5565b604081526000613a1060408301856136c5565b8281036020840152613a2281856136c5565b95945050505050565b6020815260006131206020830184613700565b604081526000613a516040830185613700565b905060018060a01b03831660208301529392505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b60208082526028908201527f436861696e53636f757473457874656e73696f6e3a2063757272656e746c7920604082015267191a5cd8589b195960c21b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526021908201527f436861696e53636f757473457874656e73696f6e3a2061646d696e73206f6e6c6040820152607960f81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b60006020808352835160a082850152613be460c0850182613700565b905081850151601f196040818785030181880152613c028484613700565b93508088015192506060828886030181890152613c1f8585613700565b8982015162ffffff1660808a810191909152808b01518a8303860160a08c01528051808452929750880195509087870190600581901b8801890160005b82811015613cdb57878a830301845288518051868452613c7e87850182613700565b90508c8201518482038e860152613c958282613700565b915050888201518482038a860152613cad8282613700565b91505087820151915083810388850152613cc78183613700565b9a8d019a958d019593505050600101613c5c565b509c9b505050505050505050505050565b60006001600160401b03821115613d0557613d05613e84565b5060051b60200190565b60006001600160401b03821115613d2857613d28613e84565b50601f01601f191660200190565b60008219821115613d4957613d49613e58565b500190565b600082613d6b57634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615613d8a57613d8a613e58565b500290565b600082821015613da157613da1613e58565b500390565b60005b83811015613dc1578181015183820152602001613da9565b83811115613dd0576000848401525b50505050565b600181811c90821680613dea57607f821691505b60208210811415613e0b57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8201601f191681016001600160401b0381118282101715613e3657613e36613e84565b6040525050565b6000600019821415613e5157613e51613e58565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600060033d1115613eb35760046000803e5060005160e01c5b90565b600060443d1015613ec45790565b6040516003193d81016004833e81513d6001600160401b038160248401118184111715613ef357505050505090565b8285019150815181811115613f0b5750505050505090565b843d8701016020828501011115613f255750505050505090565b613f3460208286010187613e11565b509095945050505050565b6001600160a01b0381168114610d5f57600080fd5b8015158114610d5f57600080fd5b6001600160e01b031981168114610d5f57600080fdfe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f41f022e501c28b9a020905370826b808241cfc28b98040d8426122e67102428101114dc4221e04044e4409075f122e501868b99c609aa066aaa46044a866aaac6ade58d1bf6ee19b057c46fdbc866becc6fdbd06fc8d46aded866bedc6044e066aae4609a75e1a2e7f1836101888b99c809aa09126a48044a880eb576203cf720113823f6f920269d7c88b94062a2e672826a829aaa9283cea2ac195d8aadedca0f3e0a6aae4a09a75f2a2e500cc8b990c0d84a6322e673026a8308869303cd538cade5f0300118d8cadedcc0f3e0c221e4c09a75f322e5018e8b99ce09aa0f126a4e0f3a8eac156d3ab7ae38012f3b86b0380118d8eadedce0f3e0f126e4e09ae8e8b9ece1a179f3a2e501908b99d009aa10221a500f354c42b7ad40012e45e1af400118590adedd00f3e10221e5009a75f422e501928b99d209aa126cda520f354b4ab7ac48012d4de1ae4c182f480118592adedd20f3e126aae5209a75f4a2e500d48b99148ba4a6522e675026a850a129503cea52b7ab50012c55e1ad560fee54182f55e1b0500118cd4ade69550013652b7b7503cf85088b95026ba522efb52327c522e9efd48b98168b98562ad8968c94665a2e675826a85834e958112a5ab7ab58012c5de1ad5e0fee5c182f5de1b05c1818cd6004d1783fd56004d96adedd6044e160e4e5609a75c5a2e7d5a2efe5a2ebf58ab60622ba1622ed11988b99d809aa180d3a58044a98adead8004b19786b5983fb99060bd9786c197ce63464183560013662b7b76011386034f960269d7d88b981a8bf4266a2e676826a869afa968112a6ab7ab68012c6de1ad6df3ae6e0fef6c18306de1b16df3b26de199d1b83fd5a02bd9aadedda044e1a6bee5a09ae9a8d4eda8b9f1a8c87bf6a2e5011c8b995c8d499c8e79dc09aa1cfdba5c04454b72b7ac70012d75e1ae75f3af760fd851d060d5c004d9cadeddc044e1cfdbe5c044e9c8e777c72321efdc8b94037a2e647a35257a3ca67a40e77811287bf6e978111531eadeb5e0045d07de198cdf83fd1e0046b67ab7b77811387bf6f978113a7a645df1e8f2f5e8e77df7a32100608b98a08d48e08e79209039602c99a099e9e009aa20fdba6004454d82b7974e000469682b7b780113883f6f98026ba826e3b82647c82427d80ad3e82353f8232208a35218a39e28a43a38a42648a69658a77268a7e678826a889afa98811155a2adede2044e226bee6209aea2a0eee29d4f229b8f62909fa28f2fe28e78248f18648f28a49868e499e9249d4964a0e9a4a289e409aa246bea6404455696213790113891afb99026ba92a9fb92943c9287fd92797e926e3f9264609a40e19a64629a6b639a79649a87e59a9e669ab8a79826a899afa99811155a6adede6044e266bee6609aea6b15ee6ae2f26a6ef66a28fa6a05fe69ad82899e8689c38a89e58e8a39928aa7968b169a8b789e809aa29126a68044aa8ade56ca0886da2b797468221ca8ade675a08876a2b7b7a01138a449b9a026baa2ef7ba2da7ca2bb7da2a2fea2977fa27e60a8ba61aa83a2aa9423aaaf64aac565aaf4a6ab16e7a826a8ac49a9a8112aaab7aba8886caab796baa221beaadec2a221c6aade653a88874aab7b5a88876aab7b7a81138ac49b9a826baab2cbbab0b3caadcbdaac2feaaacbfa8c5e0b28361b29b62b2b123b2d7e4b2f365b31e66b34f67b026a8b449a9b011155acadedec044e2d126e6c09aeacdf9eeccdff2cc47f6cbd2facb50fecabd82ea5086eaed8aeb698eec1492ec9a96ed719aee859ee09aa2e221a6e0f3aaeade56eb8886fbab79846e221caeadecee221d2eaded6e221daeadedee044e2e221e6e09aeaef09eeee60f2ed36f6ec88faebe9feeb43830ac4870b508b0c1d8f0cb2930d8a970e589b0f8d9f009aa306bea700f354bc2b7acc0886dc2b7973f0221c30ade632c08873c2b79a570221db0adedf0044e306bee7009aeb104bef0f61f30e79f70d67fb0c79ff0be9832b16872bfa8b2c888f2d80932ea4972fb79b31089f209aa326bea720f3556cab7b7c83cf8c9afb9c826bacc743bcc18fccbe0bdcb9abecb4f7fcb18a0d2e4e1d31ae2d34f63d3a164d3e0a5d447e6d48a27d026a8d449a9d03cd55b5884df40f3e34fdbe7409aeb52daef51e8f35063f74f6bfb4e53ff4cdf836c14876cdf8b6e2a8f6f6b9370fd9772099b732c9f609aa37126a76044ab60eb576d83cf7d81138dbf6f9d826badcfc7bdcaffcdc743ddc12fedbceffdb7e60e31e61e36662e3bd63e40864e473e5e4bba6e4fc67e026a8e1aaa9e0112ae1aaabe2b796378fdbbb86c15f1e3f6f2e1afb3e3f6f4e3f235e2b7b6e1afb7e01138e1aab9e026bae51cbbe4eb3ce4a97de466fee3f0ffe3b760eb3a61eb7962ebe6e3ec56521ba0049fa090a3a044537e88878e81139e8241d73a004f7b25cfbb11fffaf8283cd9987cef58bd0308fc004487f60fe8f61014afd846b3d8425b6f6119be3d84273cf60ffdf0013ef4743ff3fda0fb86e1fbd862fc4ba3fc9e64f801129ff786509fc181533f786b7f0605d2fde1b3fc181a5bf7866f8fc181ceff786f3e004f7f39bfbf25cfff0f05468652053636f7574205061737320697320746865206b657920746f20756e6c6f636b207065726b7320696e2074686520436861696e2053636f7574732065636f73797374656da26469706673582212204c4c4248214444c6d891ba2e2a970a03cbb09cc97544e5170e57948464bac84964736f6c63430008070033
Deployed Bytecode Sourcemap
83695:5811:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23252:231;;;;;;:::i;:::-;;:::i;:::-;;;34959:25:1;;;34947:2;34932:18;23252:231:0;;;;;;;;22275:310;;;;;;:::i;:::-;;:::i;:::-;;;22004:14:1;;21997:22;21979:41;;21967:2;21952:18;22275:310:0;21839:187:1;76934:24:0;;;;;;76819:18;;;:::i;:::-;;;;;;;:::i;77962:91::-;;;;;;:::i;:::-;;:::i;:::-;;80201:154;;;;;;:::i;:::-;;:::i;84567:94::-;;;;;;:::i;:::-;;:::i;83746:23::-;;;;;;;;;62560:19;;;;;-1:-1:-1;;;62560:19:0;;;;;;25191:442;;;;;;:::i;:::-;;:::i;76844:25::-;;;;;;83839:485;;;;;;:::i;:::-;;:::i;84669:532::-;;;:::i;:::-;;;;;;;:::i;78960:244::-;;;;;;:::i;:::-;;:::i;23649:524::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;37579:122::-;;;;;;:::i;:::-;37636:4;37457:16;;;:12;:16;;;;;;-1:-1:-1;;;37579:122:0;77721:97;;;;;;:::i;:::-;;:::i;77552:93::-;;;;;;:::i;:::-;;:::i;76878:23::-;;;;;-1:-1:-1;;;;;76878:23:0;;;;;;-1:-1:-1;;;;;17939:32:1;;;17921:51;;17909:2;17894:18;76878:23:0;17775:203:1;84454:105:0;;;;;;:::i;:::-;;:::i;79262:167::-;;;;;;:::i;:::-;;:::i;83776:25::-;;;;;;;;-1:-1:-1;;;;;83776:25:0;;;85209:104;;;:::i;78600:256::-;;;;;;:::i;:::-;;:::i;76792:20::-;;;;;;24246:155;;;;;;:::i;:::-;;:::i;84332:110::-;84412:22;;;;;;;;;;;;-1:-1:-1;;;84412:22:0;;;;84332:110;;63029:82;;;;;;:::i;:::-;;:::i;82496:239::-;;;;;;:::i;:::-;-1:-1:-1;;;82496:239:0;;;;;;;;;;;;;;-1:-1:-1;;;;;;22193:33:1;;;22175:52;;22163:2;22148:18;82496:239:0;22031:202:1;37368:113:0;;;;;;:::i;:::-;37430:7;37457:16;;;:12;:16;;;;;;;37368:113;78283:109;;;;;;:::i;:::-;;:::i;78117:104::-;;;;;;:::i;:::-;;:::i;24473:168::-;;;;;;:::i;:::-;-1:-1:-1;;;;;24596:27:0;;;24572:4;24596:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;24473:168;79533:301;;;;;;:::i;:::-;;:::i;81248:225::-;;;;;;:::i;:::-;-1:-1:-1;;;81248:225:0;;;;;;;;;24713:401;;;;;;:::i;:::-;;:::i;76759:26::-;;;;;-1:-1:-1;;;;;76759:26:0;;;63195:341;;;;;;:::i;:::-;;:::i;23252:231::-;23338:7;-1:-1:-1;;;;;23366:21:0;;23358:77;;;;-1:-1:-1;;;23358:77:0;;24862:2:1;23358:77:0;;;24844:21:1;24901:2;24881:18;;;24874:30;24940:34;24920:18;;;24913:62;-1:-1:-1;;;24991:18:1;;;24984:41;25042:19;;23358:77:0;;;;;;;;;-1:-1:-1;23453:13:0;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;23453:22:0;;;;;;;;;;;;23252:231::o;22275:310::-;22377:4;-1:-1:-1;;;;;;22414:41:0;;-1:-1:-1;;;22414:41:0;;:110;;-1:-1:-1;;;;;;;22472:52:0;;-1:-1:-1;;;22472:52:0;22414:110;:163;;;-1:-1:-1;;;;;;;;;;21248:40:0;;;22541:36;22394:183;22275:310;-1:-1:-1;;22275:310:0:o;76819:18::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;77962:91::-;62810:11;;:31;;-1:-1:-1;;;62810:31:0;;62830:10;62810:31;;;17921:51:1;-1:-1:-1;;;;;62810:11:0;;;;:19;;17894:18:1;;62810:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62802:77;;;;-1:-1:-1;;;62802:77:0;;;;;;;:::i;:::-;78031:5:::1;:14:::0;77962:91::o;80201:154::-;80250:13;80283:64;80326:10;:8;:10::i;:::-;80338:8;:6;:8::i;:::-;80283:42;:64::i;84567:94::-;62810:11;;:31;;-1:-1:-1;;;62810:31:0;;62830:10;62810:31;;;17921:51:1;-1:-1:-1;;;;;62810:11:0;;;;:19;;17894:18:1;;62810:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62802:77;;;;-1:-1:-1;;;62802:77:0;;;;;;;:::i;:::-;84640:13;;::::1;::::0;:7:::1;::::0;:13:::1;::::0;::::1;::::0;::::1;:::i;:::-;;84567:94:::0;:::o;25191:442::-;-1:-1:-1;;;;;25424:20:0;;20240:10;25424:20;;:60;;-1:-1:-1;25448:36:0;25465:4;20240:10;24473:168;:::i;25448:36::-;25402:160;;;;-1:-1:-1;;;25402:160:0;;26904:2:1;25402:160:0;;;26886:21:1;26943:2;26923:18;;;26916:30;26982:34;26962:18;;;26955:62;-1:-1:-1;;;27033:18:1;;;27026:48;27091:19;;25402:160:0;26702:414:1;25402:160:0;25573:52;25596:4;25602:2;25606:3;25611:7;25620:4;25573:22;:52::i;:::-;25191:442;;;;;:::o;83839:485::-;83981:23;83135:66;83981:11;:23::i;:::-;-1:-1:-1;;;;;83967:37:0;:10;-1:-1:-1;;;;;83967:37:0;;83959:59;;;;-1:-1:-1;;;83959:59:0;;31243:2:1;83959:59:0;;;31225:21:1;31282:1;31262:18;;;31255:29;-1:-1:-1;;;31300:18:1;;;31293:39;31349:18;;83959:59:0;31041:332:1;83959:59:0;84032:11;;;;84031:12;84023:21;;;;;;84049:11;:18;;-1:-1:-1;;84049:18:0;84063:4;84049:18;;;84194:59;;;;;;;;;;;;-1:-1:-1;;;84194:59:0;;;;;;84199:8;;84209:10;;84221:6;;84229:9;;84194:4;:59::i;:::-;84264:21;;;;;;;;;;;;;-1:-1:-1;;;84264:21:0;;;;;;;;;:7;;:21;:::i;:::-;-1:-1:-1;84296:8:0;:20;;-1:-1:-1;;;;;84296:20:0;;;;;-1:-1:-1;;;;;;84296:20:0;;;;;;;;;-1:-1:-1;;;83839:485:0:o;84669:532::-;84727:22;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;84727:22:0;84790:14;;;84802:1;84790:14;;;;;;;;;84762:25;;84790:14;;;;;;;;;;;;;;;;;;;;84762:42;;84831:15;:13;:15::i;:::-;84815:10;84826:1;84815:13;;;;;;;;:::i;:::-;;;;;;;;;;:31;84880:8;;:27;;-1:-1:-1;;;84880:27:0;;84857:20;;84880:8;;;-1:-1:-1;;;;;84880:8:0;;:15;;:27;;84896:10;;84880:27;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;84880:27:0;;;;;;;;;;;;:::i;:::-;84857:50;;84927:266;;;;;;;;84963:6;84927:266;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;84927:266:0;;;;;;;85135:1;84927:266;;;;;;85179:1;-1:-1:-1;;;;;85163:18:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;85163:18:0;;;;;;;;;;;;;;;;-1:-1:-1;84927:266:0;;84920:273;84669:532;-1:-1:-1;;;84669:532:0:o;78960:244::-;62949:7;;-1:-1:-1;;;62949:7:0;;;;62941:60;;;;-1:-1:-1;;;62941:60:0;;;;;;;:::i;:::-;79046:1:::1;79038:5;:9;79030:42;;;::::0;-1:-1:-1;;;79030:42:0;;30074:2:1;79030:42:0::1;::::0;::::1;30056:21:1::0;30113:2;30093:18;;;30086:30;-1:-1:-1;;;30132:18:1;;;30125:50;30192:18;;79030:42:0::1;29872:344:1::0;79030:42:0::1;79083:7;::::0;:68:::1;::::0;-1:-1:-1;;;79083:68:0;;79108:10:::1;79083:68;::::0;::::1;19155:34:1::0;79128:4:0::1;19205:18:1::0;;;19198:43;79083:7:0::1;19257:18:1::0;;;19250:34;;;19300:18;;;19293:34;;;19135:3;19343:19;;;19336:32;19384:19;;;19377:30;-1:-1:-1;;;;;79083:7:0;;::::1;::::0;:24:::1;::::0;19424:19:1;;79083:68:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;79162:34;79168:10;79180:1;79183:5;79162:34;;;;;;;;;;;::::0;:5:::1;:34::i;:::-;78960:244:::0;:::o;23649:524::-;23805:16;23866:3;:10;23847:8;:15;:29;23839:83;;;;-1:-1:-1;;;23839:83:0;;30833:2:1;23839:83:0;;;30815:21:1;30872:2;30852:18;;;30845:30;30911:34;30891:18;;;30884:62;-1:-1:-1;;;30962:18:1;;;30955:39;31011:19;;23839:83:0;30631:405:1;23839:83:0;23935:30;23982:8;:15;-1:-1:-1;;;;;23968:30:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23968:30:0;;23935:63;;24016:9;24011:122;24035:8;:15;24031:1;:19;24011:122;;;24091:30;24101:8;24110:1;24101:11;;;;;;;;:::i;:::-;;;;;;;24114:3;24118:1;24114:6;;;;;;;;:::i;:::-;;;;;;;24091:9;:30::i;:::-;24072:13;24086:1;24072:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;24052:3;;;:::i;:::-;;;24011:122;;;-1:-1:-1;24152:13:0;23649:524;-1:-1:-1;;;23649:524:0:o;77721:97::-;62810:11;;:31;;-1:-1:-1;;;62810:31:0;;62830:10;62810:31;;;17921:51:1;-1:-1:-1;;;;;62810:11:0;;;;:19;;17894:18:1;;62810:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62802:77;;;;-1:-1:-1;;;62802:77:0;;;;;;;:::i;:::-;77796:5:::1;:14:::0;;-1:-1:-1;;;;;;77796:14:0::1;-1:-1:-1::0;;;;;77796:14:0;;;::::1;::::0;;;::::1;::::0;;77721:97::o;77552:93::-;62810:11;;:31;;-1:-1:-1;;;62810:31:0;;62830:10;62810:31;;;17921:51:1;-1:-1:-1;;;;;62810:11:0;;;;:19;;17894:18:1;;62810:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62802:77;;;;-1:-1:-1;;;62802:77:0;;;;;;;:::i;:::-;77625:12;;::::1;::::0;:4:::1;::::0;:12:::1;::::0;::::1;::::0;::::1;:::i;84454:105::-:0;62810:11;;:31;;-1:-1:-1;;;62810:31:0;;62830:10;62810:31;;;17921:51:1;-1:-1:-1;;;;;62810:11:0;;;;:19;;17894:18:1;;62810:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62802:77;;;;-1:-1:-1;;;62802:77:0;;;;;;;:::i;:::-;84531:8:::1;:20:::0;;-1:-1:-1;;;;;84531:20:0;;::::1;;;-1:-1:-1::0;;;;;;84531:20:0;;::::1;::::0;;;::::1;::::0;;84454:105::o;79262:167::-;62810:11;;:31;;-1:-1:-1;;;62810:31:0;;62830:10;62810:31;;;17921:51:1;-1:-1:-1;;;;;62810:11:0;;;;:19;;17894:18:1;;62810:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62802:77;;;;-1:-1:-1;;;62802:77:0;;;;;;;:::i;:::-;79357:1:::1;79349:5;:9;79341:42;;;::::0;-1:-1:-1;;;79341:42:0;;30074:2:1;79341:42:0::1;::::0;::::1;30056:21:1::0;30113:2;30093:18;;;30086:30;-1:-1:-1;;;30132:18:1;;;30125:50;30192:18;;79341:42:0::1;29872:344:1::0;79341:42:0::1;79394:27;79400:3;79405:1;79408:5;79394:27;;;;;;;;;;;::::0;:5:::1;:27::i;85209:104::-:0;85265:13;85298:7;85291:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;85209:104;:::o;78600:256::-;62949:7;;-1:-1:-1;;;62949:7:0;;;;62941:60;;;;-1:-1:-1;;;62941:60:0;;;;;;;:::i;:::-;78706:11:::1;::::0;:31:::1;::::0;-1:-1:-1;;;78706:31:0;;78726:10:::1;78706:31;::::0;::::1;17921:51:1::0;-1:-1:-1;;;;;78706:11:0;;::::1;::::0;:19:::1;::::0;17894:18:1;;78706:31:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;;-1:-1:-1::0;78741:10:0::1;-1:-1:-1::0;;;;;78741:19:0;::::1;;78706:54;78684:126;;;::::0;-1:-1:-1;;;78684:126:0;;29382:2:1;78684:126:0::1;::::0;::::1;29364:21:1::0;29421:2;29401:18;;;29394:30;-1:-1:-1;;;29440:18:1;;;29433:52;29502:18;;78684:126:0::1;29180:346:1::0;78684:126:0::1;78821:27;78827:10;78839:1;78842:5;78821;:27::i;24246:155::-:0;24341:52;20240:10;24374:8;24384;24341:18;:52::i;63029:82::-;62810:11;;:31;;-1:-1:-1;;;62810:31:0;;62830:10;62810:31;;;17921:51:1;-1:-1:-1;;;;;62810:11:0;;;;:19;;17894:18:1;;62810:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62802:77;;;;-1:-1:-1;;;62802:77:0;;;;;;;:::i;:::-;63092:7:::1;:11:::0;;;::::1;;-1:-1:-1::0;;;63092:11:0::1;-1:-1:-1::0;;;;63092:11:0;;::::1;::::0;;;::::1;::::0;;63029:82::o;78283:109::-;62810:11;;:31;;-1:-1:-1;;;62810:31:0;;62830:10;62810:31;;;17921:51:1;-1:-1:-1;;;;;62810:11:0;;;;:19;;17894:18:1;;62810:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62802:77;;;;-1:-1:-1;;;62802:77:0;;;;;;;:::i;:::-;78356:7:::1;:28:::0;;-1:-1:-1;;;;;;78356:28:0::1;-1:-1:-1::0;;;;;78356:28:0;;;::::1;::::0;;;::::1;::::0;;78283:109::o;78117:104::-;62810:11;;:31;;-1:-1:-1;;;62810:31:0;;62830:10;62810:31;;;17921:51:1;-1:-1:-1;;;;;62810:11:0;;;;:19;;17894:18:1;;62810:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62802:77;;;;-1:-1:-1;;;62802:77:0;;;;;;;:::i;:::-;78191:9:::1;:22:::0;78117:104::o;79533:301::-;62949:7;;-1:-1:-1;;;62949:7:0;;;;62941:60;;;;-1:-1:-1;;;62941:60:0;;;;;;;:::i;:::-;79620:1:::1;79612:5;:9;79604:44;;;::::0;-1:-1:-1;;;79604:44:0;;32391:2:1;79604:44:0::1;::::0;::::1;32373:21:1::0;32430:2;32410:18;;;32403:30;-1:-1:-1;;;32449:18:1;;;32442:52;32511:18;;79604:44:0::1;32189:346:1::0;79604:44:0::1;79702:9;;79691:10;;:20;;;;:::i;:::-;79679:1;37457:16:::0;;:12;:16;;;;79667:20:::1;::::0;79682:5;;79667:20:::1;:::i;:::-;:44;;79659:74;;;::::0;-1:-1:-1;;;79659:74:0;;28540:2:1;79659:74:0::1;::::0;::::1;28522:21:1::0;28579:2;28559:18;;;28552:30;-1:-1:-1;;;28598:18:1;;;28591:47;28655:18;;79659:74:0::1;28338:341:1::0;79659:74:0::1;79744:5;::::0;79775::::1;::::0;-1:-1:-1;;;;;79744:5:0;;::::1;::::0;:10:::1;::::0;79755::::1;::::0;79767:13:::1;::::0;:5;:13:::1;:::i;:::-;79744:37;::::0;-1:-1:-1;;;;;;79744:37:0::1;::::0;;;;;;-1:-1:-1;;;;;20211:32:1;;;79744:37:0::1;::::0;::::1;20193:51:1::0;20260:18;;;20253:34;20166:18;;79744:37:0::1;20019:274:1::0;24713:401:0;-1:-1:-1;;;;;24921:20:0;;20240:10;24921:20;;:60;;-1:-1:-1;24945:36:0;24962:4;20240:10;24473:168;:::i;24945:36::-;24899:151;;;;-1:-1:-1;;;24899:151:0;;25679:2:1;24899:151:0;;;25661:21:1;25718:2;25698:18;;;25691:30;25757:34;25737:18;;;25730:62;-1:-1:-1;;;25808:18:1;;;25801:39;25857:19;;24899:151:0;25477:405:1;24899:151:0;25061:45;25079:4;25085:2;25089;25093:6;25101:4;25061:17;:45::i;63195:341::-;63293:11;;-1:-1:-1;;;;;63293:11:0;63271:34;;:69;;-1:-1:-1;63309:11:0;;:31;;-1:-1:-1;;;63309:31:0;;63329:10;63309:31;;;17921:51:1;-1:-1:-1;;;;;63309:11:0;;;;:19;;17894:18:1;;63309:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63263:169;;;;-1:-1:-1;;;63263:169:0;;28886:2:1;63263:169:0;;;28868:21:1;28925:2;28905:18;;;28898:30;28964:34;28944:18;;;28937:62;29035:34;29015:18;;;29008:62;29107:25;29086:19;;;29079:54;29150:19;;63263:169:0;28684:491:1;63263:169:0;63443:11;:23;;-1:-1:-1;;;;;;63443:23:0;-1:-1:-1;;;;;63443:23:0;;;;;;;;84412:22;;;;;;;;;;;-1:-1:-1;;;84412:22:0;;;;63477:51;;-1:-1:-1;;;63477:51:0;;:29;;:51;;63523:4;;63477:51;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76240:333;76415:27;;;76440:1;76415:27;;;;;;;;;76347:20;;76380:32;;76415:27;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;76415:27:0;;;;;;;;;;;;-1:-1:-1;;76463:43:0;;;;;;;;;;;;;;;-1:-1:-1;;;76463:43:0;;;;;;;76380:62;;-1:-1:-1;76463:43:0;;;76492:13;76498:6;76492:5;:13::i;:::-;76463:43;;;76453:4;76458:1;76453:7;;;;;;;;:::i;:::-;;;;;;:53;;;;76524:41;76550:8;76560:4;76524:25;:41::i;:::-;76517:48;76240:333;-1:-1:-1;;;;76240:333:0:o;27275:1074::-;27502:7;:14;27488:3;:10;:28;27480:81;;;;-1:-1:-1;;;27480:81:0;;31580:2:1;27480:81:0;;;31562:21:1;31619:2;31599:18;;;31592:30;31658:34;31638:18;;;31631:62;-1:-1:-1;;;31709:18:1;;;31702:38;31757:19;;27480:81:0;31378:404:1;27480:81:0;-1:-1:-1;;;;;27580:16:0;;27572:66;;;;-1:-1:-1;;;27572:66:0;;;;;;;:::i;:::-;20240:10;27695:60;20240:10;27726:4;27732:2;27736:3;27741:7;27750:4;27695:20;:60::i;:::-;27773:9;27768:421;27792:3;:10;27788:1;:14;27768:421;;;27824:10;27837:3;27841:1;27837:6;;;;;;;;:::i;:::-;;;;;;;27824:19;;27858:14;27875:7;27883:1;27875:10;;;;;;;;:::i;:::-;;;;;;;;;;;;27902:19;27924:13;;;:9;:13;;;;;;-1:-1:-1;;;;;27924:19:0;;;;;;;;;;;;27875:10;;-1:-1:-1;27966:21:0;;;;27958:76;;;;-1:-1:-1;;;27958:76:0;;;;;;;:::i;:::-;28078:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;28078:19:0;;;;;;;;;;28100:20;;;28078:42;;28150:17;;;;;;;:27;;28100:20;;28078:13;28150:27;;28100:20;;28150:27;:::i;:::-;;;;;;;;27809:380;;;27804:3;;;;:::i;:::-;;;27768:421;;;;28236:2;-1:-1:-1;;;;;28206:47:0;28230:4;-1:-1:-1;;;;;28206:47:0;28220:8;-1:-1:-1;;;;;28206:47:0;;28240:3;28245:7;28206:47;;;;;;;:::i;:::-;;;;;;;;28266:75;28302:8;28312:4;28318:2;28322:3;28327:7;28336:4;28266:35;:75::i;:::-;27469:880;27275:1074;;;;;:::o;83211:140::-;83268:11;83322:18;83336:3;83481:12;;83359:152;77029:410;77206:11;;;;;;;;;;;;;:7;:11::i;:::-;77228:7;:14;;-1:-1:-1;;;;77228:14:0;-1:-1:-1;;;77228:14:0;;;77266:5;77253:10;:18;77282:7;:28;;-1:-1:-1;;;;;77282:28:0;;;-1:-1:-1;;;;;;77282:28:0;;;;;;;77321:9;:22;;;77354:5;:29;;;;;;;;;;;;;;;77394:5;:14;;;77419:12;;;;:4;;:12;;;;;:::i;85321:3796::-;85369:12;85394:3715;;;;;;;;;;;;;;;;;;;85321:3796;:::o;29667:569::-;-1:-1:-1;;;;;29820:16:0;;29812:62;;;;-1:-1:-1;;;29812:62:0;;31989:2:1;29812:62:0;;;31971:21:1;32028:2;32008:18;;;32001:30;32067:34;32047:18;;;32040:62;-1:-1:-1;;;32118:18:1;;;32111:31;32159:19;;29812:62:0;31787:397:1;29812:62:0;20240:10;29931:102;20240:10;29887:16;29974:2;29978:21;29996:2;29978:17;:21::i;:::-;30001:25;30019:6;30001:17;:25::i;:::-;30028:4;29931:20;:102::i;:::-;30046:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;30046:17:0;;;;;;;;;:27;;30067:6;;30046:13;:27;;30067:6;;30046:27;:::i;:::-;;;;-1:-1:-1;;30089:52:0;;;35169:25:1;;;35225:2;35210:18;;35203:34;;;-1:-1:-1;;;;;30089:52:0;;;;30122:1;;30089:52;;;;;;35142:18:1;30089:52:0;;;;;;;30154:74;30185:8;30203:1;30207:2;30211;30215:6;30223:4;30154:30;:74::i;31577:648::-;-1:-1:-1;;;;;31704:18:0;;31696:66;;;;-1:-1:-1;;;31696:66:0;;27725:2:1;31696:66:0;;;27707:21:1;27764:2;27744:18;;;27737:30;27803:34;27783:18;;;27776:62;-1:-1:-1;;;27854:18:1;;;27847:33;27897:19;;31696:66:0;27523:399:1;31696:66:0;20240:10;31819:102;20240:10;31850:4;31775:16;31868:21;31886:2;31868:17;:21::i;:::-;31891:25;31909:6;31891:17;:25::i;:::-;31819:102;;;;;;;;;;;;:20;:102::i;:::-;31934:19;31956:13;;;:9;:13;;;;;;;;-1:-1:-1;;;;;31956:19:0;;;;;;;;;;31994:21;;;;31986:70;;;;-1:-1:-1;;;31986:70:0;;25274:2:1;31986:70:0;;;25256:21:1;25313:2;25293:18;;;25286:30;25352:34;25332:18;;;25325:62;-1:-1:-1;;;25403:18:1;;;25396:34;25447:19;;31986:70:0;25072:400:1;31986:70:0;32092:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;32092:19:0;;;;;;;;;;;;32114:20;;;32092:42;;32163:54;;35169:25:1;;;35210:18;;;35203:34;;;32092:19:0;;32163:54;;;;;;35142:18:1;32163:54:0;;;;;;;31685:540;;31577:648;;;:::o;33461:331::-;33616:8;-1:-1:-1;;;;;33607:17:0;:5;-1:-1:-1;;;;;33607:17:0;;;33599:71;;;;-1:-1:-1;;;33599:71:0;;30423:2:1;33599:71:0;;;30405:21:1;30462:2;30442:18;;;30435:30;30501:34;30481:18;;;30474:62;-1:-1:-1;;;30552:18:1;;;30545:39;30601:19;;33599:71:0;30221:405:1;33599:71:0;-1:-1:-1;;;;;33681:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;33681:46:0;;;;;;;;;;33743:41;;21979::1;;;33743::0;;21952:18:1;33743:41:0;;;;;;;33461:331;;;:::o;26097:820::-;-1:-1:-1;;;;;26285:16:0;;26277:66;;;;-1:-1:-1;;;26277:66:0;;;;;;;:::i;:::-;20240:10;26400:96;20240:10;26431:4;26437:2;26441:21;26459:2;26441:17;:21::i;26400:96::-;26509:19;26531:13;;;:9;:13;;;;;;;;-1:-1:-1;;;;;26531:19:0;;;;;;;;;;26569:21;;;;26561:76;;;;-1:-1:-1;;;26561:76:0;;;;;;;:::i;:::-;26673:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;26673:19:0;;;;;;;;;;26695:20;;;26673:42;;26737:17;;;;;;;:27;;26695:20;;26673:13;26737:27;;26695:20;;26737:27;:::i;:::-;;;;-1:-1:-1;;26782:46:0;;;35169:25:1;;;35225:2;35210:18;;35203:34;;;-1:-1:-1;;;;;26782:46:0;;;;;;;;;;;;;;35142:18:1;26782:46:0;;;;;;;26841:68;26872:8;26882:4;26888:2;26892;26896:6;26904:4;26841:30;:68::i;:::-;26266:651;;26097:820;;;;;:::o;70392:223::-;70449:20;70509:1;70495:3;70489:17;:21;:118;;;;;;;;;;;;;;;;;70569:3;70520:81;;;;;;;;:::i;:::-;;;;;;;;;;;;;70482:125;70392:223;-1:-1:-1;;70392:223:0:o;74779:1255::-;74905:20;75133;75235:8;:12;;;75163:95;;;;;;;;:::i;:::-;;;;;;;;;;;;;75133:126;;75272:32;75336:5;:12;75332:1;:16;;;;:::i;:::-;-1:-1:-1;;;;;75307:42:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;75307:42:0;;;;;;;;;;;;;;;;75272:77;;75370:48;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;75370:48:0;;;;;;;75397:20;75403:8;:13;;;75397:5;:20::i;:::-;75370:48;;;75360:4;75365:1;75360:7;;;;;;;;:::i;:::-;;;;;;:58;;;;75439:62;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;75439:62:0;;;;;;;75473:27;75479:8;:20;;;75473:5;:27::i;:::-;75439:62;;;75429:4;75434:1;75429:7;;;;;;;;:::i;:::-;;;;;;:72;;;;75522:42;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;75522:42:0;;;;;;;75550:13;75556:6;75550:5;:13::i;:::-;75522:42;;;75512:4;75517:1;75512:7;;;;;;;;:::i;:::-;;;;;;:52;;;;75585:93;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;75585:93:0;;;;;;;75624:53;75630:46;75648:8;:24;;;75630:46;;75674:1;75630:17;:46::i;:::-;75624:5;:53::i;:::-;75585:93;;;75575:4;75580:1;75575:7;;;;;;;;:::i;:::-;;;;;;:103;;;;75699:74;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;75699:74:0;;;;;;;75732:40;75752:8;:19;;;75732;:40::i;:::-;75699:74;;;75689:4;75694:1;75689:7;;;;;;;;:::i;:::-;;;;;;:84;;;;75789:6;75784:89;75805:5;:12;75801:1;:16;75784:89;;;75853:5;75859:1;75853:8;;;;;;;;:::i;:::-;;;;;;;75839:4;75844:1;75848;75844:5;;;;:::i;:::-;75839:11;;;;;;;;:::i;:::-;;;;;;:22;;;;75819:3;;;;:::i;:::-;;;75784:89;;;;75976:38;75996:16;76007:4;75996:10;:16::i;:::-;75976:13;:38::i;:::-;75899:126;;;;;;;;:::i;:::-;;;;;;;;;;;;;75885:141;;;;74779:1255;;;;:::o;37776:655::-;-1:-1:-1;;;;;38098:18:0;;38094:160;;38138:9;38133:110;38157:3;:10;38153:1;:14;38133:110;;;38217:7;38225:1;38217:10;;;;;;;;:::i;:::-;;;;;;;38193:12;:20;38206:3;38210:1;38206:6;;;;;;;;:::i;:::-;;;;;;;38193:20;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;-1:-1:-1;38169:3:0;;-1:-1:-1;38169:3:0;;:::i;:::-;;;38133:110;;;;38094:160;-1:-1:-1;;;;;38270:16:0;;38266:158;;38308:9;38303:110;38327:3;:10;38323:1;:14;38303:110;;;38387:7;38395:1;38387:10;;;;;;;;:::i;:::-;;;;;;;38363:12;:20;38376:3;38380:1;38376:6;;;;;;;;:::i;:::-;;;;;;;38363:20;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;-1:-1:-1;38339:3:0;;-1:-1:-1;38339:3:0;;:::i;:::-;;;38303:110;;35729:813;-1:-1:-1;;;;;35969:13:0;;12591:19;:23;35965:570;;36005:79;;-1:-1:-1;;;36005:79:0;;-1:-1:-1;;;;;36005:43:0;;;;;:79;;36049:8;;36059:4;;36065:3;;36070:7;;36079:4;;36005:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36005:79:0;;;;;;;;-1:-1:-1;;36005:79:0;;;;;;;;;;;;:::i;:::-;;;36001:523;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;36397:6;36390:14;;-1:-1:-1;;;36390:14:0;;;;;;;;:::i;36001:523::-;;;36446:62;;-1:-1:-1;;;36446:62:0;;23693:2:1;36446:62:0;;;23675:21:1;23732:2;23712:18;;;23705:30;23771:34;23751:18;;;23744:62;-1:-1:-1;;;23822:18:1;;;23815:50;23882:19;;36446:62:0;23491:416:1;36001:523:0;-1:-1:-1;;;;;;36166:60:0;;-1:-1:-1;;;36166:60:0;36162:159;;36251:50;;-1:-1:-1;;;36251:50:0;;;;;;;:::i;29193:88::-;29260:13;;;;:4;;:13;;;;;:::i;36550:198::-;36670:16;;;36684:1;36670:16;;;;;;;;;36616;;36645:22;;36670:16;;;;;;;;;;;;-1:-1:-1;36670:16:0;36645:41;;36708:7;36697:5;36703:1;36697:8;;;;;;;;:::i;:::-;;;;;;;;;;:18;36735:5;36550:198;-1:-1:-1;;36550:198:0:o;34977:744::-;-1:-1:-1;;;;;35192:13:0;;12591:19;:23;35188:526;;35228:72;;-1:-1:-1;;;35228:72:0;;-1:-1:-1;;;;;35228:38:0;;;;;:72;;35267:8;;35277:4;;35283:2;;35287:6;;35295:4;;35228:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35228:72:0;;;;;;;;-1:-1:-1;;35228:72:0;;;;;;;;;;;;:::i;:::-;;;35224:479;;;;:::i;:::-;-1:-1:-1;;;;;;35350:55:0;;-1:-1:-1;;;35350:55:0;35346:154;;35430:50;;-1:-1:-1;;;35430:50:0;;;;;;;:::i;69997:387::-;70098:41;;;;;;;;;;;;-1:-1:-1;;;70098:41:0;;;;70072:13;;70098:20;70179:10;:6;70188:1;70179:10;:::i;:::-;-1:-1:-1;;;;;70169:21:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;70169:21:0;;70150:40;;70208:6;70203:143;70224:10;:6;70233:1;70224:10;:::i;:::-;70220:1;:14;70203:143;;;70282:7;70290:43;70307:5;70315;:1;70319;70315:5;:::i;:::-;70314:11;;70324:1;70314:11;:::i;:::-;70327:5;:1;70331;70327:5;:::i;:::-;70290:16;:43::i;:::-;70282:52;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;70282:52:0;70256:3;70277:1;70273;70260:10;:6;70269:1;70260:10;:::i;:::-;:14;;;;:::i;:::-;:18;;;;:::i;:::-;70256:23;;;;;;;;:::i;:::-;;;;:78;-1:-1:-1;;;;;70256:78:0;;;;;;;;-1:-1:-1;70236:3:0;;;:::i;:::-;;;70203:143;;;-1:-1:-1;70372:3:0;69997:387;-1:-1:-1;;;;69997:387:0:o;72962:1023::-;73078:12;;;;;;;;;;;;;-1:-1:-1;;;73078:12:0;;;;-1:-1:-1;73131:788:0;73152:10;:17;73148:1;:21;73131:788;;;73241:1;73201:10;73212:1;73201:13;;;;;;;;:::i;:::-;;;;;;;:29;;;73195:43;:47;73191:717;;;73298:27;;;73323:1;73298:27;;;;;;;;;73263:32;;73298:27;;;;-1:-1:-1;;;;;;;;;;;;;;;;;73298:27:0;;;;;;;;;;;;;;;73263:62;;73354:58;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;73354:58:0;;;;;;;73387:24;73393:10;73404:1;73393:13;;;;;;;;:::i;:::-;;;;;;;:17;;;73387:5;:24::i;:::-;73354:58;;;73344:4;73349:1;73344:7;;;;;;;;:::i;:::-;;;;;;:68;;;;73441;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;73441:68:0;;;;;;;73476:32;73482:10;73493:1;73482:13;;;;;;;;:::i;:::-;;;;;;;:25;;;73476:5;:32::i;:::-;73441:68;;;73431:4;73436:1;73431:7;;;;;;;;:::i;:::-;;;;;;:78;;;;73538:58;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;73538:58:0;;;;;;;73566:10;73577:1;73566:13;;;;;;;;:::i;:::-;;;;;;;:29;;;73538:58;;;73528:4;73533:1;73528:7;;;;;;;;:::i;:::-;;;;;;:68;;;;73625:55;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;73625:55:0;;;;;;;73657:10;73668:1;73657:13;;;;;;;;:::i;:::-;;;;;;;:22;;;73625:55;;;73615:4;73620:1;73615:7;;;;;;;;:::i;:::-;;;;;;:65;;;;73756:6;73785:5;:16;;;;;;;;;;;;;;;-1:-1:-1;;;73785:16:0;;;;;;;;;;;;;;;;;;;73824;73835:4;73824:10;:16::i;:::-;73717:142;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;73701:159;;73887:5;73879:13;;73244:664;73191:717;73171:3;;;:::i;:::-;;;73131:788;;;;73964:6;73947:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;73931:46;;73067:918;72962:1023;;;:::o;74110:661::-;74220:12;;;;;;;;;;;;;-1:-1:-1;;;74220:12:0;;;;-1:-1:-1;74273:432:0;74294:4;:11;74290:1;:15;74273:432;;;74371:1;74337:4;74342:1;74337:7;;;;;;;;:::i;:::-;;;;;;;:23;;;74331:37;:41;74327:367;;;74448:6;74477:5;:16;;;;;;;;;;;;;;;-1:-1:-1;;;74477:16:0;;;;;;;;;;;;;;;;;;;74542:4;74547:1;74542:7;;;;;;;;:::i;:::-;;;;;;;:11;;;74603:4;74608:1;74603:7;;;;;;;;:::i;:::-;;;;;;;:23;;;74409:236;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;74393:253;;74673:5;74665:13;;74327:367;74307:3;;;:::i;:::-;;;74273:432;;;;74750:6;74733:29;;;;;;;;:::i;63812:2256::-;63870:13;63900:4;:11;63915:1;63900:16;63896:31;;;-1:-1:-1;;63918:9:0;;;;;;;;;-1:-1:-1;63918:9:0;;;63812:2256::o;63896:31::-;63979:19;64001:5;;;;;;;;;;;;;;;;;63979:27;;64058:18;64104:1;64085:4;:11;64099:1;64085:15;;;;:::i;:::-;64084:21;;;;:::i;:::-;64079:27;;:1;:27;:::i;:::-;64058:48;-1:-1:-1;64189:20:0;64223:15;64058:48;64236:2;64223:15;:::i;:::-;-1:-1:-1;;;;;64212:27:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;64212:27:0;;64189:50;;64336:10;64328:6;64321:26;64431:1;64424:5;64420:13;64490:4;64541;64535:11;64526:7;64522:25;64637:2;64629:6;64625:15;64710:1045;64745:6;64736:7;64733:19;64710:1045;;;64815:1;64802:15;;;64883:14;;65066:4;65054:2;65050:14;;;65046:25;;65032:40;;65026:47;65021:3;65017:57;;;64956:137;;65257:2;65253:14;;;65249:25;;65235:40;;65229:47;65220:57;;65139:1;65124:17;;65159:137;65460:1;65456:13;;;65452:24;;65438:39;;65432:46;65423:56;;65327:17;;;65362:136;65654:16;;65640:31;;65634:38;65625:48;;65529:17;;;65564:128;;;;65723:17;;64710:1045;;;65828:1;65821:4;65815:11;65811:19;65849:1;65844:84;;;;65947:1;65942:82;;;;65804:220;;65844:84;-1:-1:-1;;;;;65877:17:0;;65870:43;65844:84;;65942:82;-1:-1:-1;;;;;65975:17:0;;65968:41;65804:220;-1:-1:-1;66054:6:0;;63812:2256;-1:-1:-1;;;;;;;;63812:2256:0:o;67118:298::-;67196:4;67229:5;67221:4;:13;;67213:38;;;;-1:-1:-1;;;67213:38:0;;29733:2:1;67213:38:0;;;29715:21:1;29772:2;29752:18;;;29745:30;-1:-1:-1;;;29791:18:1;;;29784:42;29843:18;;67213:38:0;29531:336:1;67213:38:0;67278:3;67270:4;:11;;67262:34;;;;-1:-1:-1;;;67262:34:0;;24523:2:1;67262:34:0;;;24505:21:1;24562:2;24542:18;;;24535:30;-1:-1:-1;;;24581:18:1;;;24574:40;24631:18;;67262:34:0;24321:334:1;67262:34:0;67309:10;67322:12;67329:5;67322:4;:12;:::i;:::-;:16;;67337:1;67322:16;:::i;:::-;67309:29;-1:-1:-1;67403:5:0;;67371:16;67386:1;67372:10;;;67371:16;:::i;:::-;67370:27;;67359:7;:39;67358:50;;67351:57;;;67118:298;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:419:1;78:5;108:35;136:6;108:35;:::i;:::-;172:2;166:9;184:31;212:2;204:6;184:31;:::i;:::-;233:6;224:15;;263:6;255;248:22;303:3;294:6;289:3;285:16;282:25;279:45;;;320:1;317;310:12;279:45;370:6;365:3;358:4;350:6;346:17;333:44;425:1;418:4;409:6;401;397:19;393:30;386:41;;;14:419;;;;;:::o;438:367::-;501:8;511:6;565:3;558:4;550:6;546:17;542:27;532:55;;583:1;580;573:12;532:55;-1:-1:-1;606:20:1;;-1:-1:-1;;;;;638:30:1;;635:50;;;681:1;678;671:12;635:50;718:4;710:6;706:17;694:29;;778:3;771:4;761:6;758:1;754:14;746:6;742:27;738:38;735:47;732:67;;;795:1;792;785:12;732:67;438:367;;;;;:::o;810:735::-;864:5;917:3;910:4;902:6;898:17;894:27;884:55;;935:1;932;925:12;884:55;971:6;958:20;997:4;1020:43;1060:2;1020:43;:::i;:::-;1092:2;1086:9;1104:31;1132:2;1124:6;1104:31;:::i;:::-;1170:18;;;1204:15;;;;-1:-1:-1;1239:15:1;;;1289:1;1285:10;;;1273:23;;1269:32;;1266:41;-1:-1:-1;1263:61:1;;;1320:1;1317;1310:12;1263:61;1342:1;1352:163;1366:2;1363:1;1360:9;1352:163;;;1423:17;;1411:30;;1461:12;;;;1493;;;;1384:1;1377:9;1352:163;;;-1:-1:-1;1533:6:1;;810:735;-1:-1:-1;;;;;;;810:735:1:o;1550:347::-;1601:8;1611:6;1665:3;1658:4;1650:6;1646:17;1642:27;1632:55;;1683:1;1680;1673:12;1632:55;-1:-1:-1;1706:20:1;;-1:-1:-1;;;;;1738:30:1;;1735:50;;;1781:1;1778;1771:12;1735:50;1818:4;1810:6;1806:17;1794:29;;1870:3;1863:4;1854:6;1846;1842:19;1838:30;1835:39;1832:59;;;1887:1;1884;1877:12;1902:220;1944:5;1997:3;1990:4;1982:6;1978:17;1974:27;1964:55;;2015:1;2012;2005:12;1964:55;2037:79;2112:3;2103:6;2090:20;2083:4;2075:6;2071:17;2037:79;:::i;:::-;2028:88;1902:220;-1:-1:-1;;;1902:220:1:o;2127:247::-;2186:6;2239:2;2227:9;2218:7;2214:23;2210:32;2207:52;;;2255:1;2252;2245:12;2207:52;2294:9;2281:23;2313:31;2338:5;2313:31;:::i;2379:388::-;2447:6;2455;2508:2;2496:9;2487:7;2483:23;2479:32;2476:52;;;2524:1;2521;2514:12;2476:52;2563:9;2550:23;2582:31;2607:5;2582:31;:::i;:::-;2632:5;-1:-1:-1;2689:2:1;2674:18;;2661:32;2702:33;2661:32;2702:33;:::i;:::-;2754:7;2744:17;;;2379:388;;;;;:::o;2772:1338::-;2932:6;2940;2948;2956;2964;2972;2980;2988;3041:3;3029:9;3020:7;3016:23;3012:33;3009:53;;;3058:1;3055;3048:12;3009:53;3097:9;3084:23;3116:31;3141:5;3116:31;:::i;:::-;3166:5;-1:-1:-1;3223:2:1;3208:18;;3195:32;3236:33;3195:32;3236:33;:::i;:::-;3288:7;-1:-1:-1;3346:2:1;3331:18;;3318:32;-1:-1:-1;;;;;3399:14:1;;;3396:34;;;3426:1;3423;3416:12;3396:34;3465:70;3527:7;3518:6;3507:9;3503:22;3465:70;:::i;:::-;3554:8;;-1:-1:-1;3439:96:1;-1:-1:-1;3642:2:1;3627:18;;3614:32;;-1:-1:-1;3658:16:1;;;3655:36;;;3687:1;3684;3677:12;3655:36;3726:72;3790:7;3779:8;3768:9;3764:24;3726:72;:::i;:::-;3817:8;;-1:-1:-1;3700:98:1;-1:-1:-1;3905:3:1;3890:19;;3877:33;;-1:-1:-1;3922:16:1;;;3919:36;;;3951:1;3948;3941:12;3919:36;;3990:60;4042:7;4031:8;4020:9;4016:24;3990:60;:::i;:::-;2772:1338;;;;-1:-1:-1;2772:1338:1;;-1:-1:-1;2772:1338:1;;;;;;4069:8;-1:-1:-1;;;2772:1338:1:o;4115:1071::-;4269:6;4277;4285;4293;4301;4354:3;4342:9;4333:7;4329:23;4325:33;4322:53;;;4371:1;4368;4361:12;4322:53;4410:9;4397:23;4429:31;4454:5;4429:31;:::i;:::-;4479:5;-1:-1:-1;4536:2:1;4521:18;;4508:32;4549:33;4508:32;4549:33;:::i;:::-;4601:7;-1:-1:-1;4659:2:1;4644:18;;4631:32;-1:-1:-1;;;;;4712:14:1;;;4709:34;;;4739:1;4736;4729:12;4709:34;4762:61;4815:7;4806:6;4795:9;4791:22;4762:61;:::i;:::-;4752:71;;4876:2;4865:9;4861:18;4848:32;4832:48;;4905:2;4895:8;4892:16;4889:36;;;4921:1;4918;4911:12;4889:36;4944:63;4999:7;4988:8;4977:9;4973:24;4944:63;:::i;:::-;4934:73;;5060:3;5049:9;5045:19;5032:33;5016:49;;5090:2;5080:8;5077:16;5074:36;;;5106:1;5103;5096:12;5074:36;;5129:51;5172:7;5161:8;5150:9;5146:24;5129:51;:::i;:::-;5119:61;;;4115:1071;;;;;;;;:::o;5191:823::-;5297:6;5305;5313;5321;5329;5337;5390:3;5378:9;5369:7;5365:23;5361:33;5358:53;;;5407:1;5404;5397:12;5358:53;5446:9;5433:23;5465:31;5490:5;5465:31;:::i;:::-;5515:5;-1:-1:-1;5572:2:1;5557:18;;5544:32;5585:33;5544:32;5585:33;:::i;:::-;5637:7;-1:-1:-1;5691:2:1;5676:18;;5663:32;;-1:-1:-1;5742:2:1;5727:18;;5714:32;;-1:-1:-1;5797:3:1;5782:19;;5769:33;-1:-1:-1;;;;;5814:30:1;;5811:50;;;5857:1;5854;5847:12;5811:50;5896:58;5946:7;5937:6;5926:9;5922:22;5896:58;:::i;:::-;5191:823;;;;-1:-1:-1;5191:823:1;;-1:-1:-1;5191:823:1;;5973:8;;5191:823;-1:-1:-1;;;5191:823:1:o;6019:734::-;6123:6;6131;6139;6147;6155;6208:3;6196:9;6187:7;6183:23;6179:33;6176:53;;;6225:1;6222;6215:12;6176:53;6264:9;6251:23;6283:31;6308:5;6283:31;:::i;:::-;6333:5;-1:-1:-1;6390:2:1;6375:18;;6362:32;6403:33;6362:32;6403:33;:::i;:::-;6455:7;-1:-1:-1;6509:2:1;6494:18;;6481:32;;-1:-1:-1;6560:2:1;6545:18;;6532:32;;-1:-1:-1;6615:3:1;6600:19;;6587:33;-1:-1:-1;;;;;6632:30:1;;6629:50;;;6675:1;6672;6665:12;6629:50;6698:49;6739:7;6730:6;6719:9;6715:22;6698:49;:::i;6758:382::-;6823:6;6831;6884:2;6872:9;6863:7;6859:23;6855:32;6852:52;;;6900:1;6897;6890:12;6852:52;6939:9;6926:23;6958:31;6983:5;6958:31;:::i;:::-;7008:5;-1:-1:-1;7065:2:1;7050:18;;7037:32;7078:30;7037:32;7078:30;:::i;7145:315::-;7213:6;7221;7274:2;7262:9;7253:7;7249:23;7245:32;7242:52;;;7290:1;7287;7280:12;7242:52;7329:9;7316:23;7348:31;7373:5;7348:31;:::i;:::-;7398:5;7450:2;7435:18;;;;7422:32;;-1:-1:-1;;;7145:315:1:o;7465:616::-;7569:6;7577;7585;7593;7646:3;7634:9;7625:7;7621:23;7617:33;7614:53;;;7663:1;7660;7653:12;7614:53;7702:9;7689:23;7721:31;7746:5;7721:31;:::i;:::-;7771:5;-1:-1:-1;7823:2:1;7808:18;;7795:32;;-1:-1:-1;7879:2:1;7864:18;;7851:32;7892:33;7851:32;7892:33;:::i;:::-;7944:7;-1:-1:-1;8003:2:1;7988:18;;7975:32;8016:33;7975:32;8016:33;:::i;:::-;7465:616;;;;-1:-1:-1;7465:616:1;;-1:-1:-1;;7465:616:1:o;8086:1288::-;8204:6;8212;8265:2;8253:9;8244:7;8240:23;8236:32;8233:52;;;8281:1;8278;8271:12;8233:52;8321:9;8308:23;-1:-1:-1;;;;;8391:2:1;8383:6;8380:14;8377:34;;;8407:1;8404;8397:12;8377:34;8445:6;8434:9;8430:22;8420:32;;8490:7;8483:4;8479:2;8475:13;8471:27;8461:55;;8512:1;8509;8502:12;8461:55;8548:2;8535:16;8570:4;8593:43;8633:2;8593:43;:::i;:::-;8665:2;8659:9;8677:31;8705:2;8697:6;8677:31;:::i;:::-;8743:18;;;8777:15;;;;-1:-1:-1;8812:11:1;;;8854:1;8850:10;;;8842:19;;8838:28;;8835:41;-1:-1:-1;8832:61:1;;;8889:1;8886;8879:12;8832:61;8911:1;8902:10;;8921:238;8935:2;8932:1;8929:9;8921:238;;;9006:3;8993:17;9023:31;9048:5;9023:31;:::i;:::-;9067:18;;8953:1;8946:9;;;;;9105:12;;;;9137;;8921:238;;;-1:-1:-1;9178:6:1;-1:-1:-1;;9222:18:1;;9209:32;;-1:-1:-1;;9253:16:1;;;9250:36;;;9282:1;9279;9272:12;9250:36;;9305:63;9360:7;9349:8;9338:9;9334:24;9305:63;:::i;:::-;9295:73;;;8086:1288;;;;;:::o;9379:241::-;9435:6;9488:2;9476:9;9467:7;9463:23;9459:32;9456:52;;;9504:1;9501;9494:12;9456:52;9543:9;9530:23;9562:28;9584:5;9562:28;:::i;9625:245::-;9692:6;9745:2;9733:9;9724:7;9720:23;9716:32;9713:52;;;9761:1;9758;9751:12;9713:52;9793:9;9787:16;9812:28;9834:5;9812:28;:::i;9875:245::-;9933:6;9986:2;9974:9;9965:7;9961:23;9957:32;9954:52;;;10002:1;9999;9992:12;9954:52;10041:9;10028:23;10060:30;10084:5;10060:30;:::i;10125:249::-;10194:6;10247:2;10235:9;10226:7;10222:23;10218:32;10215:52;;;10263:1;10260;10253:12;10215:52;10295:9;10289:16;10314:30;10338:5;10314:30;:::i;11195:450::-;11264:6;11317:2;11305:9;11296:7;11292:23;11288:32;11285:52;;;11333:1;11330;11323:12;11285:52;11373:9;11360:23;-1:-1:-1;;;;;11398:6:1;11395:30;11392:50;;;11438:1;11435;11428:12;11392:50;11461:22;;11514:4;11506:13;;11502:27;-1:-1:-1;11492:55:1;;11543:1;11540;11533:12;11492:55;11566:73;11631:7;11626:2;11613:16;11608:2;11604;11600:11;11566:73;:::i;11650:690::-;11730:6;11783:2;11771:9;11762:7;11758:23;11754:32;11751:52;;;11799:1;11796;11789:12;11751:52;11832:9;11826:16;-1:-1:-1;;;;;11857:6:1;11854:30;11851:50;;;11897:1;11894;11887:12;11851:50;11920:22;;11973:4;11965:13;;11961:27;-1:-1:-1;11951:55:1;;12002:1;11999;11992:12;11951:55;12031:2;12025:9;12053:31;12081:2;12053:31;:::i;:::-;12113:2;12107:9;12125:31;12153:2;12145:6;12125:31;:::i;:::-;12180:2;12172:6;12165:18;12220:7;12215:2;12210;12206;12202:11;12198:20;12195:33;12192:53;;;12241:1;12238;12231:12;12192:53;12254:55;12306:2;12301;12293:6;12289:15;12284:2;12280;12276:11;12254:55;:::i;:::-;12328:6;11650:690;-1:-1:-1;;;;;;11650:690:1:o;12345:180::-;12404:6;12457:2;12445:9;12436:7;12432:23;12428:32;12425:52;;;12473:1;12470;12463:12;12425:52;-1:-1:-1;12496:23:1;;12345:180;-1:-1:-1;12345:180:1:o;12530:315::-;12598:6;12606;12659:2;12647:9;12638:7;12634:23;12630:32;12627:52;;;12675:1;12672;12665:12;12627:52;12711:9;12698:23;12688:33;;12771:2;12760:9;12756:18;12743:32;12784:31;12809:5;12784:31;:::i;12850:435::-;12903:3;12941:5;12935:12;12968:6;12963:3;12956:19;12994:4;13023:2;13018:3;13014:12;13007:19;;13060:2;13053:5;13049:14;13081:1;13091:169;13105:6;13102:1;13099:13;13091:169;;;13166:13;;13154:26;;13200:12;;;;13235:15;;;;13127:1;13120:9;13091:169;;;-1:-1:-1;13276:3:1;;12850:435;-1:-1:-1;;;;;12850:435:1:o;13290:257::-;13331:3;13369:5;13363:12;13396:6;13391:3;13384:19;13412:63;13468:6;13461:4;13456:3;13452:14;13445:4;13438:5;13434:16;13412:63;:::i;:::-;13529:2;13508:15;-1:-1:-1;;13504:29:1;13495:39;;;;13536:4;13491:50;;13290:257;-1:-1:-1;;13290:257:1:o;13552:664::-;13779:3;13817:6;13811:13;13833:53;13879:6;13874:3;13867:4;13859:6;13855:17;13833:53;:::i;:::-;13949:13;;13908:16;;;;13971:57;13949:13;13908:16;14005:4;13993:17;;13971:57;:::i;:::-;14095:13;;14050:20;;;14117:57;14095:13;14050:20;14151:4;14139:17;;14117:57;:::i;:::-;14190:20;;13552:664;-1:-1:-1;;;;;13552:664:1:o;14221:1154::-;14698:3;14736:6;14730:13;14752:53;14798:6;14793:3;14786:4;14778:6;14774:17;14752:53;:::i;:::-;14868:13;;14827:16;;;;14890:57;14868:13;14827:16;14924:4;14912:17;;14890:57;:::i;:::-;-1:-1:-1;;;14969:20:1;;14998:27;;;15050:13;;15072:65;15050:13;15124:1;15113:13;;15106:4;15094:17;;15072:65;:::i;:::-;-1:-1:-1;;;15200:1:1;15156:20;;;;15192:10;;;15185:34;15244:13;;15266:62;15244:13;15315:1;15307:10;;15300:4;15288:17;;15266:62;:::i;:::-;15348:17;15367:1;15344:25;;14221:1154;-1:-1:-1;;;;;;14221:1154:1:o;15380:439::-;15612:3;15650:6;15644:13;15666:53;15712:6;15707:3;15700:4;15692:6;15688:17;15666:53;:::i;:::-;-1:-1:-1;;;15741:16:1;;15766:18;;;-1:-1:-1;15811:1:1;15800:13;;15380:439;-1:-1:-1;15380:439:1:o;15824:::-;16056:3;16094:6;16088:13;16110:53;16156:6;16151:3;16144:4;16136:6;16132:17;16110:53;:::i;:::-;-1:-1:-1;;;16185:16:1;;16210:18;;;-1:-1:-1;16255:1:1;16244:13;;15824:439;-1:-1:-1;15824:439:1:o;16268:601::-;16601:3;16638:2;16633:3;16629:12;16662:2;16657:3;16650:15;16694:6;16688:13;16710:61;16764:6;16760:1;16755:3;16751:11;16744:4;16736:6;16732:17;16710:61;:::i;:::-;16830:1;16790:16;;16822:10;;;16815:22;-1:-1:-1;16861:1:1;16853:10;;16268:601;-1:-1:-1;16268:601:1:o;16874:448::-;17136:31;17131:3;17124:44;17106:3;17197:6;17191:13;17213:62;17268:6;17263:2;17258:3;17254:12;17247:4;17239:6;17235:17;17213:62;:::i;:::-;17295:16;;;;17313:2;17291:25;;16874:448;-1:-1:-1;;16874:448:1:o;17327:443::-;17589:26;17584:3;17577:39;17559:3;17645:6;17639:13;17661:62;17716:6;17711:2;17706:3;17702:12;17695:4;17687:6;17683:17;17661:62;:::i;:::-;17743:16;;;;17761:2;17739:25;;17327:443;-1:-1:-1;;17327:443:1:o;17983:826::-;-1:-1:-1;;;;;18380:15:1;;;18362:34;;18432:15;;18427:2;18412:18;;18405:43;18342:3;18479:2;18464:18;;18457:31;;;18305:4;;18511:57;;18548:19;;18540:6;18511:57;:::i;:::-;18616:9;18608:6;18604:22;18599:2;18588:9;18584:18;18577:50;18650:44;18687:6;18679;18650:44;:::i;:::-;18636:58;;18743:9;18735:6;18731:22;18725:3;18714:9;18710:19;18703:51;18771:32;18796:6;18788;18771:32;:::i;:::-;18763:40;17983:826;-1:-1:-1;;;;;;;;17983:826:1:o;19454:560::-;-1:-1:-1;;;;;19751:15:1;;;19733:34;;19803:15;;19798:2;19783:18;;19776:43;19850:2;19835:18;;19828:34;;;19893:2;19878:18;;19871:34;;;19713:3;19936;19921:19;;19914:32;;;19676:4;;19963:45;;19988:19;;19980:6;19963:45;:::i;:::-;19955:53;19454:560;-1:-1:-1;;;;;;;19454:560:1:o;20298:800::-;20458:4;20487:2;20527;20516:9;20512:18;20557:2;20546:9;20539:21;20580:6;20615;20609:13;20646:6;20638;20631:22;20684:2;20673:9;20669:18;20662:25;;20746:2;20736:6;20733:1;20729:14;20718:9;20714:30;20710:39;20696:53;;20784:2;20776:6;20772:15;20805:1;20815:254;20829:6;20826:1;20823:13;20815:254;;;20922:2;20918:7;20906:9;20898:6;20894:22;20890:36;20885:3;20878:49;20950:39;20982:6;20973;20967:13;20950:39;:::i;:::-;20940:49;-1:-1:-1;21047:12:1;;;;21012:15;;;;20851:1;20844:9;20815:254;;;-1:-1:-1;21086:6:1;;20298:800;-1:-1:-1;;;;;;;20298:800:1:o;21103:261::-;21282:2;21271:9;21264:21;21245:4;21302:56;21354:2;21343:9;21339:18;21331:6;21302:56;:::i;21369:465::-;21626:2;21615:9;21608:21;21589:4;21652:56;21704:2;21693:9;21689:18;21681:6;21652:56;:::i;:::-;21756:9;21748:6;21744:22;21739:2;21728:9;21724:18;21717:50;21784:44;21821:6;21813;21784:44;:::i;:::-;21776:52;21369:465;-1:-1:-1;;;;;21369:465:1:o;22917:219::-;23066:2;23055:9;23048:21;23029:4;23086:44;23126:2;23115:9;23111:18;23103:6;23086:44;:::i;23141:345::-;23347:2;23336:9;23329:21;23310:4;23367:44;23407:2;23396:9;23392:18;23384:6;23367:44;:::i;:::-;23359:52;;23476:1;23472;23467:3;23463:11;23459:19;23451:6;23447:32;23442:2;23431:9;23427:18;23420:60;23141:345;;;;;:::o;23912:404::-;24114:2;24096:21;;;24153:2;24133:18;;;24126:30;24192:34;24187:2;24172:18;;24165:62;-1:-1:-1;;;24258:2:1;24243:18;;24236:38;24306:3;24291:19;;23912:404::o;25887:::-;26089:2;26071:21;;;26128:2;26108:18;;;26101:30;26167:34;26162:2;26147:18;;26140:62;-1:-1:-1;;;26233:2:1;26218:18;;26211:38;26281:3;26266:19;;25887:404::o;26296:401::-;26498:2;26480:21;;;26537:2;26517:18;;;26510:30;26576:34;26571:2;26556:18;;26549:62;-1:-1:-1;;;26642:2:1;26627:18;;26620:35;26687:3;26672:19;;26296:401::o;27121:397::-;27323:2;27305:21;;;27362:2;27342:18;;;27335:30;27401:34;27396:2;27381:18;;27374:62;-1:-1:-1;;;27467:2:1;27452:18;;27445:31;27508:3;27493:19;;27121:397::o;27927:406::-;28129:2;28111:21;;;28168:2;28148:18;;;28141:30;28207:34;28202:2;28187:18;;28180:62;-1:-1:-1;;;28273:2:1;28258:18;;28251:40;28323:3;28308:19;;27927:406::o;32540:2268::-;32698:4;32727:2;32756;32745:9;32738:21;32794:6;32788:13;32837:4;32832:2;32821:9;32817:18;32810:32;32865:51;32911:3;32900:9;32896:19;32882:12;32865:51;:::i;:::-;32851:65;;32965:2;32957:6;32953:15;32947:22;32992:2;32988:7;33014:2;33080;33068:9;33060:6;33056:22;33052:31;33047:2;33036:9;33032:18;33025:59;33107:40;33140:6;33124:14;33107:40;:::i;:::-;33093:54;;33196:2;33188:6;33184:15;33178:22;33156:44;;33219:2;33285;33273:9;33265:6;33261:22;33257:31;33252:2;33241:9;33237:18;33230:59;33312:40;33345:6;33329:14;33312:40;:::i;:::-;33389:15;;;33383:22;33483:8;33463:29;33424:3;33443:18;;;33436:57;;;;33530:15;;;33524:22;33588;;;33584:31;;33577:4;33562:20;;33555:61;33665:21;;33695:22;;;33298:54;;-1:-1:-1;33830:23:1;;;-1:-1:-1;33424:3:1;33733:15;;;;33791:1;33787:14;;;33775:27;;33771:36;;-1:-1:-1;33881:898:1;33895:6;33892:1;33889:13;33881:898;;;33981:2;33972:6;33964;33960:19;33956:28;33951:3;33944:41;34014:6;34008:13;34062:2;34056:9;34093:2;34085:6;34078:18;34123:49;34168:2;34160:6;34156:15;34140:14;34123:49;:::i;:::-;34109:63;;34221:2;34217;34213:11;34207:18;34274:6;34266;34262:19;34257:2;34249:6;34245:15;34238:44;34309:40;34342:6;34326:14;34309:40;:::i;:::-;34295:54;;;34398:2;34394;34390:11;34384:18;34451:6;34443;34439:19;34434:2;34426:6;34422:15;34415:44;34486:40;34519:6;34503:14;34486:40;:::i;:::-;34472:54;;;34575:2;34571;34567:11;34561:18;34539:40;;34628:6;34620;34616:19;34611:2;34603:6;34599:15;34592:44;34659:40;34692:6;34676:14;34659:40;:::i;:::-;34722:15;;;;34757:12;;;;34649:50;-1:-1:-1;;;33917:1:1;33910:9;33881:898;;;-1:-1:-1;34796:6:1;32540:2268;-1:-1:-1;;;;;;;;;;;;32540:2268:1:o;35248:183::-;35308:4;-1:-1:-1;;;;;35333:6:1;35330:30;35327:56;;;35363:18;;:::i;:::-;-1:-1:-1;35408:1:1;35404:14;35420:4;35400:25;;35248:183::o;35436:186::-;35484:4;-1:-1:-1;;;;;35509:6:1;35506:30;35503:56;;;35539:18;;:::i;:::-;-1:-1:-1;35605:2:1;35584:15;-1:-1:-1;;35580:29:1;35611:4;35576:40;;35436:186::o;35627:128::-;35667:3;35698:1;35694:6;35691:1;35688:13;35685:39;;;35704:18;;:::i;:::-;-1:-1:-1;35740:9:1;;35627:128::o;35760:217::-;35800:1;35826;35816:132;;35870:10;35865:3;35861:20;35858:1;35851:31;35905:4;35902:1;35895:15;35933:4;35930:1;35923:15;35816:132;-1:-1:-1;35962:9:1;;35760:217::o;35982:168::-;36022:7;36088:1;36084;36080:6;36076:14;36073:1;36070:21;36065:1;36058:9;36051:17;36047:45;36044:71;;;36095:18;;:::i;:::-;-1:-1:-1;36135:9:1;;35982:168::o;36155:125::-;36195:4;36223:1;36220;36217:8;36214:34;;;36228:18;;:::i;:::-;-1:-1:-1;36265:9:1;;36155:125::o;36285:258::-;36357:1;36367:113;36381:6;36378:1;36375:13;36367:113;;;36457:11;;;36451:18;36438:11;;;36431:39;36403:2;36396:10;36367:113;;;36498:6;36495:1;36492:13;36489:48;;;36533:1;36524:6;36519:3;36515:16;36508:27;36489:48;;36285:258;;;:::o;36548:380::-;36627:1;36623:12;;;;36670;;;36691:61;;36745:4;36737:6;36733:17;36723:27;;36691:61;36798:2;36790:6;36787:14;36767:18;36764:38;36761:161;;;36844:10;36839:3;36835:20;36832:1;36825:31;36879:4;36876:1;36869:15;36907:4;36904:1;36897:15;36761:161;;36548:380;;;:::o;36933:249::-;37043:2;37024:13;;-1:-1:-1;;37020:27:1;37008:40;;-1:-1:-1;;;;;37063:34:1;;37099:22;;;37060:62;37057:88;;;37125:18;;:::i;:::-;37161:2;37154:22;-1:-1:-1;;36933:249:1:o;37187:135::-;37226:3;-1:-1:-1;;37247:17:1;;37244:43;;;37267:18;;:::i;:::-;-1:-1:-1;37314:1:1;37303:13;;37187:135::o;37327:127::-;37388:10;37383:3;37379:20;37376:1;37369:31;37419:4;37416:1;37409:15;37443:4;37440:1;37433:15;37459:127;37520:10;37515:3;37511:20;37508:1;37501:31;37551:4;37548:1;37541:15;37575:4;37572:1;37565:15;37591:127;37652:10;37647:3;37643:20;37640:1;37633:31;37683:4;37680:1;37673:15;37707:4;37704:1;37697:15;37723:179;37758:3;37800:1;37782:16;37779:23;37776:120;;;37846:1;37843;37840;37825:23;-1:-1:-1;37883:1:1;37877:8;37872:3;37868:18;37776:120;37723:179;:::o;37907:671::-;37946:3;37988:4;37970:16;37967:26;37964:39;;;37907:671;:::o;37964:39::-;38030:2;38024:9;-1:-1:-1;;38095:16:1;38091:25;;38088:1;38024:9;38067:50;38146:4;38140:11;38170:16;-1:-1:-1;;;;;38276:2:1;38269:4;38261:6;38257:17;38254:25;38249:2;38241:6;38238:14;38235:45;38232:58;;;38283:5;;;;;37907:671;:::o;38232:58::-;38320:6;38314:4;38310:17;38299:28;;38356:3;38350:10;38383:2;38375:6;38372:14;38369:27;;;38389:5;;;;;;37907:671;:::o;38369:27::-;38473:2;38454:16;38448:4;38444:27;38440:36;38433:4;38424:6;38419:3;38415:16;38411:27;38408:69;38405:82;;;38480:5;;;;;;37907:671;:::o;38405:82::-;38496:57;38547:4;38538:6;38530;38526:19;38522:30;38516:4;38496:57;:::i;:::-;-1:-1:-1;38569:3:1;;37907:671;-1:-1:-1;;;;;37907:671:1:o;38583:131::-;-1:-1:-1;;;;;38658:31:1;;38648:42;;38638:70;;38704:1;38701;38694:12;38719:118;38805:5;38798:13;38791:21;38784:5;38781:32;38771:60;;38827:1;38824;38817:12;38842:131;-1:-1:-1;;;;;;38916:32:1;;38906:43;;38896:71;;38963:1;38960;38953:12
Swarm Source
ipfs://4c4c4248214444c6d891ba2e2a970a03cbb09cc97544e5170e57948464bac849
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.