Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 9 from a total of 9 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Approval For... | 21200337 | 40 days ago | IN | 0 ETH | 0.00057977 | ||||
Withdraw | 14022419 | 1075 days ago | IN | 0 ETH | 0.00339512 | ||||
Mint Supergirl | 13463045 | 1162 days ago | IN | 0.07 ETH | 0.01338312 | ||||
Mint Supergirl | 13462493 | 1162 days ago | IN | 0.07 ETH | 0.01788026 | ||||
Mint Supergirl | 13456426 | 1163 days ago | IN | 0.07 ETH | 0.01590707 | ||||
Flip Sale State | 13443836 | 1165 days ago | IN | 0 ETH | 0.00443299 | ||||
Flip Sale State | 13443819 | 1165 days ago | IN | 0 ETH | 0.00245643 | ||||
Flip Sale State | 13443819 | 1165 days ago | IN | 0 ETH | 0.00469792 | ||||
Set Base URI | 13442174 | 1165 days ago | IN | 0 ETH | 0.00327038 |
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
14022419 | 1075 days ago | 0.21 ETH |
Loading...
Loading
Contract Name:
SuperGirlzNFT
Compiler Version
v0.7.6+commit.7338295f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-10-18 */ // SPDX-License-Identifier: MIT // GO TO LINE 1904 TO SEE WHERE THE SUPERGIRLZ CONTRACT STARTS // File: @openzeppelin/contracts/utils/Context.sol pragma solidity >=0.6.0 <0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN 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 payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File: @openzeppelin/contracts/introspection/IERC165.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol pragma solidity >=0.6.2 <0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 tokenId) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external; } // File: @openzeppelin/contracts/token/ERC721/IERC721Metadata.sol pragma solidity >=0.6.2 <0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC721/IERC721Enumerable.sol pragma solidity >=0.6.2 <0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol pragma solidity >=0.6.0 <0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4); } // File: @openzeppelin/contracts/introspection/ERC165.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts may inherit from this and call {_registerInterface} to declare * their support of an interface. */ abstract contract ERC165 is IERC165 { /* * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7 */ bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7; /** * @dev Mapping of interface ids to whether or not it's supported. */ mapping(bytes4 => bool) private _supportedInterfaces; constructor () internal { // Derived contracts need only register support for their own interfaces, // we register support for ERC165 itself here _registerInterface(_INTERFACE_ID_ERC165); } /** * @dev See {IERC165-supportsInterface}. * * Time complexity O(1), guaranteed to always use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return _supportedInterfaces[interfaceId]; } /** * @dev Registers the contract as an implementer of the interface defined by * `interfaceId`. Support of the actual ERC165 interface is automatic and * registering its interface id is not required. * * See {IERC165-supportsInterface}. * * Requirements: * * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`). */ function _registerInterface(bytes4 interfaceId) internal virtual { require(interfaceId != 0xffffffff, "ERC165: invalid interface id"); _supportedInterfaces[interfaceId] = true; } } // File: @openzeppelin/contracts/math/SafeMath.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b > a) return (false, 0); return (true, a - b); } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a / b); } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a % b); } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SafeMath: subtraction overflow"); return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) return 0; uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: division by zero"); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: modulo by zero"); return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); return a - b; } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryDiv}. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a % b; } } // File: @openzeppelin/contracts/utils/Address.sol pragma solidity >=0.6.2 <0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (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"); // solhint-disable-next-line avoid-low-level-calls (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"); // solhint-disable-next-line avoid-low-level-calls (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"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/utils/EnumerableSet.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping (bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement. bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { require(set._values.length > index, "EnumerableSet: index out of bounds"); return set._values[index]; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } } // File: @openzeppelin/contracts/utils/EnumerableMap.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Library for managing an enumerable variant of Solidity's * https://solidity.readthedocs.io/en/latest/types.html#mapping-types[`mapping`] * type. * * Maps have the following properties: * * - Entries are added, removed, and checked for existence in constant time * (O(1)). * - Entries are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableMap for EnumerableMap.UintToAddressMap; * * // Declare a set state variable * EnumerableMap.UintToAddressMap private myMap; * } * ``` * * As of v3.0.0, only maps of type `uint256 -> address` (`UintToAddressMap`) are * supported. */ library EnumerableMap { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Map type with // bytes32 keys and values. // The Map implementation uses private functions, and user-facing // implementations (such as Uint256ToAddressMap) are just wrappers around // the underlying Map. // This means that we can only create new EnumerableMaps for types that fit // in bytes32. struct MapEntry { bytes32 _key; bytes32 _value; } struct Map { // Storage of map keys and values MapEntry[] _entries; // Position of the entry defined by a key in the `entries` array, plus 1 // because index 0 means a key is not in the map. mapping (bytes32 => uint256) _indexes; } /** * @dev Adds a key-value pair to a map, or updates the value for an existing * key. O(1). * * Returns true if the key was added to the map, that is if it was not * already present. */ function _set(Map storage map, bytes32 key, bytes32 value) private returns (bool) { // We read and store the key's index to prevent multiple reads from the same storage slot uint256 keyIndex = map._indexes[key]; if (keyIndex == 0) { // Equivalent to !contains(map, key) map._entries.push(MapEntry({ _key: key, _value: value })); // The entry is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value map._indexes[key] = map._entries.length; return true; } else { map._entries[keyIndex - 1]._value = value; return false; } } /** * @dev Removes a key-value pair from a map. O(1). * * Returns true if the key was removed from the map, that is if it was present. */ function _remove(Map storage map, bytes32 key) private returns (bool) { // We read and store the key's index to prevent multiple reads from the same storage slot uint256 keyIndex = map._indexes[key]; if (keyIndex != 0) { // Equivalent to contains(map, key) // To delete a key-value pair from the _entries array in O(1), we swap the entry to delete with the last one // in the array, and then remove the last entry (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = keyIndex - 1; uint256 lastIndex = map._entries.length - 1; // When the entry to delete is the last one, the swap operation is unnecessary. However, since this occurs // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement. MapEntry storage lastEntry = map._entries[lastIndex]; // Move the last entry to the index where the entry to delete is map._entries[toDeleteIndex] = lastEntry; // Update the index for the moved entry map._indexes[lastEntry._key] = toDeleteIndex + 1; // All indexes are 1-based // Delete the slot where the moved entry was stored map._entries.pop(); // Delete the index for the deleted slot delete map._indexes[key]; return true; } else { return false; } } /** * @dev Returns true if the key is in the map. O(1). */ function _contains(Map storage map, bytes32 key) private view returns (bool) { return map._indexes[key] != 0; } /** * @dev Returns the number of key-value pairs in the map. O(1). */ function _length(Map storage map) private view returns (uint256) { return map._entries.length; } /** * @dev Returns the key-value pair stored at position `index` in the map. O(1). * * Note that there are no guarantees on the ordering of entries inside the * array, and it may change when more entries are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Map storage map, uint256 index) private view returns (bytes32, bytes32) { require(map._entries.length > index, "EnumerableMap: index out of bounds"); MapEntry storage entry = map._entries[index]; return (entry._key, entry._value); } /** * @dev Tries to returns the value associated with `key`. O(1). * Does not revert if `key` is not in the map. */ function _tryGet(Map storage map, bytes32 key) private view returns (bool, bytes32) { uint256 keyIndex = map._indexes[key]; if (keyIndex == 0) return (false, 0); // Equivalent to contains(map, key) return (true, map._entries[keyIndex - 1]._value); // All indexes are 1-based } /** * @dev Returns the value associated with `key`. O(1). * * Requirements: * * - `key` must be in the map. */ function _get(Map storage map, bytes32 key) private view returns (bytes32) { uint256 keyIndex = map._indexes[key]; require(keyIndex != 0, "EnumerableMap: nonexistent key"); // Equivalent to contains(map, key) return map._entries[keyIndex - 1]._value; // All indexes are 1-based } /** * @dev Same as {_get}, with a custom error message when `key` is not in the map. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {_tryGet}. */ function _get(Map storage map, bytes32 key, string memory errorMessage) private view returns (bytes32) { uint256 keyIndex = map._indexes[key]; require(keyIndex != 0, errorMessage); // Equivalent to contains(map, key) return map._entries[keyIndex - 1]._value; // All indexes are 1-based } // UintToAddressMap struct UintToAddressMap { Map _inner; } /** * @dev Adds a key-value pair to a map, or updates the value for an existing * key. O(1). * * Returns true if the key was added to the map, that is if it was not * already present. */ function set(UintToAddressMap storage map, uint256 key, address value) internal returns (bool) { return _set(map._inner, bytes32(key), bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the key was removed from the map, that is if it was present. */ function remove(UintToAddressMap storage map, uint256 key) internal returns (bool) { return _remove(map._inner, bytes32(key)); } /** * @dev Returns true if the key is in the map. O(1). */ function contains(UintToAddressMap storage map, uint256 key) internal view returns (bool) { return _contains(map._inner, bytes32(key)); } /** * @dev Returns the number of elements in the map. O(1). */ function length(UintToAddressMap storage map) internal view returns (uint256) { return _length(map._inner); } /** * @dev Returns the element stored at position `index` in the set. O(1). * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintToAddressMap storage map, uint256 index) internal view returns (uint256, address) { (bytes32 key, bytes32 value) = _at(map._inner, index); return (uint256(key), address(uint160(uint256(value)))); } /** * @dev Tries to returns the value associated with `key`. O(1). * Does not revert if `key` is not in the map. * * _Available since v3.4._ */ function tryGet(UintToAddressMap storage map, uint256 key) internal view returns (bool, address) { (bool success, bytes32 value) = _tryGet(map._inner, bytes32(key)); return (success, address(uint160(uint256(value)))); } /** * @dev Returns the value associated with `key`. O(1). * * Requirements: * * - `key` must be in the map. */ function get(UintToAddressMap storage map, uint256 key) internal view returns (address) { return address(uint160(uint256(_get(map._inner, bytes32(key))))); } /** * @dev Same as {get}, with a custom error message when `key` is not in the map. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryGet}. */ function get(UintToAddressMap storage map, uint256 key, string memory errorMessage) internal view returns (address) { return address(uint160(uint256(_get(map._inner, bytes32(key), errorMessage)))); } } // File: @openzeppelin/contracts/utils/Strings.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev String operations. */ library Strings { /** * @dev Converts a `uint256` to its ASCII `string` 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); uint256 index = digits - 1; temp = value; while (temp != 0) { buffer[index--] = bytes1(uint8(48 + temp % 10)); temp /= 10; } return string(buffer); } } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol pragma solidity >=0.6.0 <0.8.0; /** * @title ERC721 Non-Fungible Token Standard basic implementation * @dev see https://eips.ethereum.org/EIPS/eip-721 */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable { using SafeMath for uint256; using Address for address; using EnumerableSet for EnumerableSet.UintSet; using EnumerableMap for EnumerableMap.UintToAddressMap; using Strings for uint256; // Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` // which can be also obtained as `IERC721Receiver(0).onERC721Received.selector` bytes4 private constant _ERC721_RECEIVED = 0x150b7a02; // Mapping from holder address to their (enumerable) set of owned tokens mapping (address => EnumerableSet.UintSet) private _holderTokens; // Enumerable mapping from token ids to their owners EnumerableMap.UintToAddressMap private _tokenOwners; // Mapping from token ID to approved address mapping (uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping (address => mapping (address => bool)) private _operatorApprovals; // Token name string private _name; // Token symbol string private _symbol; // Optional mapping for token URIs mapping (uint256 => string) private _tokenURIs; // Base URI string private _baseURI; /* * bytes4(keccak256('balanceOf(address)')) == 0x70a08231 * bytes4(keccak256('ownerOf(uint256)')) == 0x6352211e * bytes4(keccak256('approve(address,uint256)')) == 0x095ea7b3 * bytes4(keccak256('getApproved(uint256)')) == 0x081812fc * bytes4(keccak256('setApprovalForAll(address,bool)')) == 0xa22cb465 * bytes4(keccak256('isApprovedForAll(address,address)')) == 0xe985e9c5 * bytes4(keccak256('transferFrom(address,address,uint256)')) == 0x23b872dd * bytes4(keccak256('safeTransferFrom(address,address,uint256)')) == 0x42842e0e * bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)')) == 0xb88d4fde * * => 0x70a08231 ^ 0x6352211e ^ 0x095ea7b3 ^ 0x081812fc ^ * 0xa22cb465 ^ 0xe985e9c5 ^ 0x23b872dd ^ 0x42842e0e ^ 0xb88d4fde == 0x80ac58cd */ bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd; /* * bytes4(keccak256('name()')) == 0x06fdde03 * bytes4(keccak256('symbol()')) == 0x95d89b41 * bytes4(keccak256('tokenURI(uint256)')) == 0xc87b56dd * * => 0x06fdde03 ^ 0x95d89b41 ^ 0xc87b56dd == 0x5b5e139f */ bytes4 private constant _INTERFACE_ID_ERC721_METADATA = 0x5b5e139f; /* * bytes4(keccak256('totalSupply()')) == 0x18160ddd * bytes4(keccak256('tokenOfOwnerByIndex(address,uint256)')) == 0x2f745c59 * bytes4(keccak256('tokenByIndex(uint256)')) == 0x4f6ccce7 * * => 0x18160ddd ^ 0x2f745c59 ^ 0x4f6ccce7 == 0x780e9d63 */ bytes4 private constant _INTERFACE_ID_ERC721_ENUMERABLE = 0x780e9d63; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor (string memory name_, string memory symbol_) public { _name = name_; _symbol = symbol_; // register the supported interfaces to conform to ERC721 via ERC165 _registerInterface(_INTERFACE_ID_ERC721); _registerInterface(_INTERFACE_ID_ERC721_METADATA); _registerInterface(_INTERFACE_ID_ERC721_ENUMERABLE); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _holderTokens[owner].length(); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { return _tokenOwners.get(tokenId, "ERC721: owner query for nonexistent token"); } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory _tokenURI = _tokenURIs[tokenId]; string memory base = baseURI(); // If there is no base URI, return the token URI. if (bytes(base).length == 0) { return _tokenURI; } // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked). if (bytes(_tokenURI).length > 0) { return string(abi.encodePacked(base, _tokenURI)); } // If there is a baseURI but no tokenURI, concatenate the tokenID to the baseURI. return string(abi.encodePacked(base, tokenId.toString())); } /** * @dev Returns the base URI set via {_setBaseURI}. This will be * automatically added as a prefix in {tokenURI} to each token's URI, or * to the token ID if no specific URI is set for that token ID. */ function baseURI() public view virtual returns (string memory) { return _baseURI; } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { return _holderTokens[owner].at(index); } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { // _tokenOwners are indexed by tokenIds, so .length() returns the number of tokenIds return _tokenOwners.length(); } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { (uint256 tokenId, ) = _tokenOwners.at(index); return tokenId; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require(_msgSender() == owner || ERC721.isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom(address from, address to, uint256 tokenId) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer(address from, address to, uint256 tokenId, bytes memory _data) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _tokenOwners.contains(tokenId); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || ERC721.isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: d* * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint(address to, uint256 tokenId, bytes memory _data) internal virtual { _mint(to, tokenId); require(_checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _holderTokens[to].add(tokenId); _tokenOwners.set(tokenId, to); emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); // internal owner _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); // Clear metadata (if any) if (bytes(_tokenURIs[tokenId]).length != 0) { delete _tokenURIs[tokenId]; } _holderTokens[owner].remove(tokenId); _tokenOwners.remove(tokenId); emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer(address from, address to, uint256 tokenId) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); // internal owner require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _holderTokens[from].remove(tokenId); _holderTokens[to].add(tokenId); _tokenOwners.set(tokenId, to); emit Transfer(from, to, tokenId); } /** * @dev Sets `_tokenURI` as the tokenURI of `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual { require(_exists(tokenId), "ERC721Metadata: URI set of nonexistent token"); _tokenURIs[tokenId] = _tokenURI; } /** * @dev Internal function to set the base URI for all token IDs. It is * automatically added as a prefix to the value returned in {tokenURI}, * or to the token ID if {tokenURI} is empty. */ function _setBaseURI(string memory baseURI_) internal virtual { _baseURI = baseURI_; } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data) private returns (bool) { if (!to.isContract()) { return true; } bytes memory returndata = to.functionCall(abi.encodeWithSelector( IERC721Receiver(to).onERC721Received.selector, _msgSender(), from, tokenId, _data ), "ERC721: transfer to non ERC721Receiver implementer"); bytes4 retval = abi.decode(returndata, (bytes4)); return (retval == _ERC721_RECEIVED); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); // internal owner } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual { } } // File: @openzeppelin/contracts/access/Ownable.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () internal { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // SuperGirlz have been created to defend Ether City against the SuperVillains. // SUPERGIRLZ RESEARCH TEAM: // KASHMIR : mayor, programming, and design. // VIZION : senator, lead design and marketing. pragma solidity ^0.7.0; pragma abicoder v2; contract SuperGirlzNFT is ERC721, Ownable { using SafeMath for uint256; string public GIRL_PROVENANCE = ""; // IPFS URL WILL BE ADDED WHEN GIRLZ ARE ALL SOLD OUT string public LICENSE_TEXT = ""; // IT IS WHAT IT SAYS bool licenseLocked = false; // TEAM CAN'T EDIT THE LICENSE AFTER THIS GETS TRUE uint256 public constant girlPrice = 70000000000000000; // 0.025 ETH uint public constant maxGirlPurchase = 20; uint256 public constant MAX_GIRLZ = 7142; bool public saleIsActive = false; mapping(uint => string) public girlNames; // Reserve 100 Girlz for team - Giveaways/Prizes etc uint public girlReserve = 100; event girlNameChange(address _by, uint _tokenId, string _name); event licenseisLocked(string _licenseText); constructor() ERC721("SuperGirlzNFT", "SGN") { } function withdraw() public onlyOwner { uint balance = address(this).balance; msg.sender.transfer(balance); } function reserveGirlz(address _to, uint256 _reserveAmount) public onlyOwner { uint supply = totalSupply(); require(_reserveAmount > 0 && _reserveAmount <= girlReserve, "Not enough reserve left for team"); for (uint i = 0; i < _reserveAmount; i++) { _safeMint(_to, supply + i); } girlReserve = girlReserve.sub(_reserveAmount); } function setProvenanceHash(string memory provenanceHash) public onlyOwner { GIRL_PROVENANCE = provenanceHash; } function setBaseURI(string memory baseURI) public onlyOwner { _setBaseURI(baseURI); } function flipSaleState() public onlyOwner { saleIsActive = !saleIsActive; } function tokensOfOwner(address _owner) external view returns(uint256[] memory ) { uint256 tokenCount = balanceOf(_owner); if (tokenCount == 0) { // Return an empty array return new uint256[](0); } else { uint256[] memory result = new uint256[](tokenCount); uint256 index; for (index = 0; index < tokenCount; index++) { result[index] = tokenOfOwnerByIndex(_owner, index); } return result; } } // Returns the license for tokens function tokenLicense(uint _id) public view returns(string memory) { require(_id < totalSupply(), "CHOOSE A GIRL WITHIN RANGE"); return LICENSE_TEXT; } // Locks the license to prevent further changes function lockLicense() public onlyOwner { licenseLocked = true; emit licenseisLocked(LICENSE_TEXT); } // Change the license function changeLicense(string memory _license) public onlyOwner { require(licenseLocked == false, "License already locked"); LICENSE_TEXT = _license; } function mintSupergirl(uint numberOfTokens) public payable { require(saleIsActive, "Sale must be active to mint SuperGirl"); require(numberOfTokens > 0 && numberOfTokens <= maxGirlPurchase, "Can only mint 20 tokens at a time"); require(totalSupply().add(numberOfTokens) <= MAX_GIRLZ, "Purchase would exceed max supply of Girlz"); require(msg.value >= girlPrice.mul(numberOfTokens), "Ether value sent is not correct"); for(uint i = 0; i < numberOfTokens; i++) { uint mintIndex = totalSupply(); if (totalSupply() < MAX_GIRLZ) { _safeMint(msg.sender, mintIndex); } } } function changeGirlName(uint _tokenId, string memory _name) public { require(ownerOf(_tokenId) == msg.sender, "Hey, your wallet doesn't own this Girl!"); require(sha256(bytes(_name)) != sha256(bytes(girlNames[_tokenId])), "New name is same as the current one"); girlNames[_tokenId] = _name; emit girlNameChange(msg.sender, _tokenId, _name); } function viewGirlName(uint _tokenId) public view returns( string memory ){ require( _tokenId < totalSupply(), "Choose a girl within range" ); return girlNames[_tokenId]; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_by","type":"address"},{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"_name","type":"string"}],"name":"girlNameChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"_licenseText","type":"string"}],"name":"licenseisLocked","type":"event"},{"inputs":[],"name":"GIRL_PROVENANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LICENSE_TEXT","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_GIRLZ","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"_name","type":"string"}],"name":"changeGirlName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_license","type":"string"}],"name":"changeLicense","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"girlNames","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"girlPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"girlReserve","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockLicense","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxGirlPurchase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mintSupergirl","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_reserveAmount","type":"uint256"}],"name":"reserveGirlz","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"provenanceHash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"tokenLicense","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"viewGirlName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405260405180602001604052806000815250600b90805190602001906200002b92919062000334565b5060405180602001604052806000815250600c90805190602001906200005392919062000334565b506000600d60006101000a81548160ff0219169083151502179055506000600d60016101000a81548160ff0219169083151502179055506064600f553480156200009c57600080fd5b506040518060400160405280600d81526020017f53757065724769726c7a4e4654000000000000000000000000000000000000008152506040518060400160405280600381526020017f53474e0000000000000000000000000000000000000000000000000000000000815250620001216301ffc9a760e01b6200025460201b60201c565b81600690805190602001906200013992919062000334565b5080600790805190602001906200015292919062000334565b506200016b6380ac58cd60e01b6200025460201b60201c565b62000183635b5e139f60e01b6200025460201b60201c565b6200019b63780e9d6360e01b6200025460201b60201c565b50506000620001af6200032c60201b60201c565b905080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3506200045f565b63ffffffff60e01b817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415620002c0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002b7906200042c565b60405180910390fd5b6001600080837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600033905090565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826200036c5760008555620003b8565b82601f106200038757805160ff1916838001178555620003b8565b82800160010185558215620003b8579182015b82811115620003b75782518255916020019190600101906200039a565b5b509050620003c79190620003cb565b5090565b5b80821115620003e6576000816000905550600101620003cc565b5090565b6000620003f9601c836200044e565b91507f4552433136353a20696e76616c696420696e74657266616365206964000000006000830152602082019050919050565b600060208201905081810360008301526200044781620003ea565b9050919050565b600082825260208201905092915050565b6150a0806200046f6000396000f3fe60806040526004361061023b5760003560e01c80636c0360eb1161012e578063b6e3a8a0116100ab578063d9b137b21161006f578063d9b137b214610862578063e985e9c51461089f578063eb8d2444146108dc578063f2fde38b14610907578063f99695cc146109305761023b565b8063b6e3a8a01461078f578063b88d4fde146107ba578063bf4702fc146107e3578063c87b56dd146107fa578063d8273fae146108375761023b565b80638da5cb5b116100f25780638da5cb5b146106bc57806395d89b41146106e75780639c3e72bd14610712578063a22cb4651461073d578063b09904b5146107665761023b565b80636c0360eb146105e45780636f460cd91461060f57806370a082311461062b578063715018a6146106685780638462151c1461067f5761023b565b806334918dfd116101bc57806352ecbe041161018057806352ecbe04146104ed57806355f804b31461052a5780635b80e3d1146105535780636352211e1461057c5780636b3c78d7146105b95761023b565b806334918dfd1461042e5780633ccfd60b146104455780633e27c0521461045c57806342842e0e146104875780634f6ccce7146104b05761023b565b806314fad0531161020357806314fad0531461033757806318160ddd146103745780631cdcab021461039f57806323b872dd146103c85780632f745c59146103f15761023b565b806301ffc9a71461024057806306fdde031461027d578063081812fc146102a8578063095ea7b3146102e5578063109695231461030e575b600080fd5b34801561024c57600080fd5b50610267600480360381019061026291906138e3565b61095b565b60405161027491906148c5565b60405180910390f35b34801561028957600080fd5b506102926109c2565b60405161029f91906148e0565b60405180910390f35b3480156102b457600080fd5b506102cf60048036038101906102ca9190613976565b610a64565b6040516102dc91906147fe565b60405180910390f35b3480156102f157600080fd5b5061030c6004803603810190610307919061387e565b610ae9565b005b34801561031a57600080fd5b5061033560048036038101906103309190613935565b610c01565b005b34801561034357600080fd5b5061035e60048036038101906103599190613976565b610c97565b60405161036b91906148e0565b60405180910390f35b34801561038057600080fd5b50610389610d95565b6040516103969190614d24565b60405180910390f35b3480156103ab57600080fd5b506103c660048036038101906103c1919061387e565b610da6565b005b3480156103d457600080fd5b506103ef60048036038101906103ea9190613778565b610ec4565b005b3480156103fd57600080fd5b506104186004803603810190610413919061387e565b610f24565b6040516104259190614d24565b60405180910390f35b34801561043a57600080fd5b50610443610f7f565b005b34801561045157600080fd5b5061045a611027565b005b34801561046857600080fd5b506104716110f2565b60405161047e9190614d24565b60405180910390f35b34801561049357600080fd5b506104ae60048036038101906104a99190613778565b6110f7565b005b3480156104bc57600080fd5b506104d760048036038101906104d29190613976565b611117565b6040516104e49190614d24565b60405180910390f35b3480156104f957600080fd5b50610514600480360381019061050f9190613976565b61113a565b60405161052191906148e0565b60405180910390f35b34801561053657600080fd5b50610551600480360381019061054c9190613935565b6111ea565b005b34801561055f57600080fd5b5061057a6004803603810190610575919061399f565b611272565b005b34801561058857600080fd5b506105a3600480360381019061059e9190613976565b611442565b6040516105b091906147fe565b60405180910390f35b3480156105c557600080fd5b506105ce611479565b6040516105db91906148e0565b60405180910390f35b3480156105f057600080fd5b506105f9611517565b60405161060691906148e0565b60405180910390f35b61062960048036038101906106249190613976565b6115b9565b005b34801561063757600080fd5b50610652600480360381019061064d9190613713565b611757565b60405161065f9190614d24565b60405180910390f35b34801561067457600080fd5b5061067d611816565b005b34801561068b57600080fd5b506106a660048036038101906106a19190613713565b611953565b6040516106b391906148a3565b60405180910390f35b3480156106c857600080fd5b506106d1611a4c565b6040516106de91906147fe565b60405180910390f35b3480156106f357600080fd5b506106fc611a76565b60405161070991906148e0565b60405180910390f35b34801561071e57600080fd5b50610727611b18565b60405161073491906148e0565b60405180910390f35b34801561074957600080fd5b50610764600480360381019061075f9190613842565b611bb6565b005b34801561077257600080fd5b5061078d60048036038101906107889190613935565b611d37565b005b34801561079b57600080fd5b506107a4611e23565b6040516107b19190614d24565b60405180910390f35b3480156107c657600080fd5b506107e160048036038101906107dc91906137c7565b611e2e565b005b3480156107ef57600080fd5b506107f8611e90565b005b34801561080657600080fd5b50610821600480360381019061081c9190613976565b611f61565b60405161082e91906148e0565b60405180910390f35b34801561084357600080fd5b5061084c6120e4565b6040516108599190614d24565b60405180910390f35b34801561086e57600080fd5b5061088960048036038101906108849190613976565b6120ea565b60405161089691906148e0565b60405180910390f35b3480156108ab57600080fd5b506108c660048036038101906108c1919061373c565b6121d7565b6040516108d391906148c5565b60405180910390f35b3480156108e857600080fd5b506108f161226b565b6040516108fe91906148c5565b60405180910390f35b34801561091357600080fd5b5061092e60048036038101906109299190613713565b61227e565b005b34801561093c57600080fd5b5061094561242a565b6040516109529190614d24565b60405180910390f35b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060068054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610a5a5780601f10610a2f57610100808354040283529160200191610a5a565b820191906000526020600020905b815481529060010190602001808311610a3d57829003601f168201915b5050505050905090565b6000610a6f82612430565b610aae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa590614be4565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610af482611442565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5c90614c84565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b8461244d565b73ffffffffffffffffffffffffffffffffffffffff161480610bb35750610bb281610bad61244d565b6121d7565b5b610bf2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be990614b44565b60405180910390fd5b610bfc8383612455565b505050565b610c0961244d565b73ffffffffffffffffffffffffffffffffffffffff16610c27611a4c565b73ffffffffffffffffffffffffffffffffffffffff1614610c7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7490614c04565b60405180910390fd5b80600b9080519060200190610c9392919061351a565b5050565b6060610ca1610d95565b8210610ce2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd990614944565b60405180910390fd5b600e60008381526020019081526020016000208054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610d895780601f10610d5e57610100808354040283529160200191610d89565b820191906000526020600020905b815481529060010190602001808311610d6c57829003601f168201915b50505050509050919050565b6000610da1600261250e565b905090565b610dae61244d565b73ffffffffffffffffffffffffffffffffffffffff16610dcc611a4c565b73ffffffffffffffffffffffffffffffffffffffff1614610e22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1990614c04565b60405180910390fd5b6000610e2c610d95565b9050600082118015610e405750600f548211155b610e7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7690614a24565b60405180910390fd5b60005b82811015610ea357610e9684828401612523565b8080600101915050610e82565b50610eb982600f5461254190919063ffffffff16565b600f81905550505050565b610ed5610ecf61244d565b82612591565b610f14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0b90614cc4565b60405180910390fd5b610f1f83838361266f565b505050565b6000610f7782600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061288690919063ffffffff16565b905092915050565b610f8761244d565b73ffffffffffffffffffffffffffffffffffffffff16610fa5611a4c565b73ffffffffffffffffffffffffffffffffffffffff1614610ffb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff290614c04565b60405180910390fd5b600d60019054906101000a900460ff1615600d60016101000a81548160ff021916908315150217905550565b61102f61244d565b73ffffffffffffffffffffffffffffffffffffffff1661104d611a4c565b73ffffffffffffffffffffffffffffffffffffffff16146110a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109a90614c04565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156110ee573d6000803e3d6000fd5b5050565b601481565b61111283838360405180602001604052806000815250611e2e565b505050565b60008061112e8360026128a090919063ffffffff16565b50905080915050919050565b600e6020528060005260406000206000915090508054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156111e25780601f106111b7576101008083540402835291602001916111e2565b820191906000526020600020905b8154815290600101906020018083116111c557829003601f168201915b505050505081565b6111f261244d565b73ffffffffffffffffffffffffffffffffffffffff16611210611a4c565b73ffffffffffffffffffffffffffffffffffffffff1614611266576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125d90614c04565b60405180910390fd5b61126f816128cc565b50565b3373ffffffffffffffffffffffffffffffffffffffff1661129283611442565b73ffffffffffffffffffffffffffffffffffffffff16146112e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112df90614d04565b60405180910390fd5b6002600e600084815260200190815260200160002060405161130a91906147c3565b602060405180830381855afa158015611327573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061134a91906138ba565b60028260405161135a91906147ac565b602060405180830381855afa158015611377573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061139a91906138ba565b14156113db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d290614c64565b60405180910390fd5b80600e6000848152602001908152602001600020908051906020019061140292919061351a565b507f8a468a24cdcc6f593c75f170397d8efbf8e17bd5188df3a2038a9e28d8f7cb6133838360405161143693929190614865565b60405180910390a15050565b6000611472826040518060600160405280602981526020016150426029913960026128e69092919063ffffffff16565b9050919050565b600b8054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561150f5780601f106114e45761010080835404028352916020019161150f565b820191906000526020600020905b8154815290600101906020018083116114f257829003601f168201915b505050505081565b606060098054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156115af5780601f10611584576101008083540402835291602001916115af565b820191906000526020600020905b81548152906001019060200180831161159257829003601f168201915b5050505050905090565b600d60019054906101000a900460ff16611608576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ff906149a4565b60405180910390fd5b600081118015611619575060148111155b611658576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164f90614b04565b60405180910390fd5b611be661167582611667610d95565b61290590919063ffffffff16565b11156116b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ad90614b24565b60405180910390fd5b6116d08166f8b0a10e47000061295a90919063ffffffff16565b341015611712576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170990614a84565b60405180910390fd5b60005b81811015611753576000611727610d95565b9050611be6611734610d95565b1015611745576117443382612523565b5b508080600101915050611715565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117bf90614b64565b60405180910390fd5b61180f600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206129ca565b9050919050565b61181e61244d565b73ffffffffffffffffffffffffffffffffffffffff1661183c611a4c565b73ffffffffffffffffffffffffffffffffffffffff1614611892576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188990614c04565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6060600061196083611757565b905060008114156119bb57600067ffffffffffffffff8111801561198357600080fd5b506040519080825280602002602001820160405280156119b25781602001602082028036833780820191505090505b50915050611a47565b60008167ffffffffffffffff811180156119d457600080fd5b50604051908082528060200260200182016040528015611a035781602001602082028036833780820191505090505b50905060005b82811015611a4057611a1b8582610f24565b828281518110611a2757fe5b6020026020010181815250508080600101915050611a09565b8193505050505b919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060078054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611b0e5780601f10611ae357610100808354040283529160200191611b0e565b820191906000526020600020905b815481529060010190602001808311611af157829003601f168201915b5050505050905090565b600c8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611bae5780601f10611b8357610100808354040283529160200191611bae565b820191906000526020600020905b815481529060010190602001808311611b9157829003601f168201915b505050505081565b611bbe61244d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2390614a64565b60405180910390fd5b8060056000611c3961244d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611ce661244d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611d2b91906148c5565b60405180910390a35050565b611d3f61244d565b73ffffffffffffffffffffffffffffffffffffffff16611d5d611a4c565b73ffffffffffffffffffffffffffffffffffffffff1614611db3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611daa90614c04565b60405180910390fd5b60001515600d60009054906101000a900460ff16151514611e09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0090614ca4565b60405180910390fd5b80600c9080519060200190611e1f92919061351a565b5050565b66f8b0a10e47000081565b611e3f611e3961244d565b83612591565b611e7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7590614cc4565b60405180910390fd5b611e8a848484846129df565b50505050565b611e9861244d565b73ffffffffffffffffffffffffffffffffffffffff16611eb6611a4c565b73ffffffffffffffffffffffffffffffffffffffff1614611f0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0390614c04565b60405180910390fd5b6001600d60006101000a81548160ff0219169083151502179055507f92423ccd40e13759d50d24569dcbaccb20ade47247f3cf3e3951a9f29d2048b0600c604051611f579190614902565b60405180910390a1565b6060611f6c82612430565b611fab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa290614c44565b60405180910390fd5b6000600860008481526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156120545780601f1061202957610100808354040283529160200191612054565b820191906000526020600020905b81548152906001019060200180831161203757829003601f168201915b505050505090506000612065611517565b905060008151141561207b5781925050506120df565b6000825111156120b05780826040516020016120989291906147da565b604051602081830303815290604052925050506120df565b806120ba85612a3b565b6040516020016120cb9291906147da565b604051602081830303815290604052925050505b919050565b611be681565b60606120f4610d95565b8210612135576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212c90614a04565b60405180910390fd5b600c8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156121cb5780601f106121a0576101008083540402835291602001916121cb565b820191906000526020600020905b8154815290600101906020018083116121ae57829003601f168201915b50505050509050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600d60019054906101000a900460ff1681565b61228661244d565b73ffffffffffffffffffffffffffffffffffffffff166122a4611a4c565b73ffffffffffffffffffffffffffffffffffffffff16146122fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f190614c04565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561236a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236190614984565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600f5481565b6000612446826002612b8290919063ffffffff16565b9050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166124c883611442565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061251c82600001612b9c565b9050919050565b61253d828260405180602001604052806000815250612bad565b5050565b600082821115612586576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257d90614aa4565b60405180910390fd5b818303905092915050565b600061259c82612430565b6125db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125d290614ae4565b60405180910390fd5b60006125e683611442565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061265557508373ffffffffffffffffffffffffffffffffffffffff1661263d84610a64565b73ffffffffffffffffffffffffffffffffffffffff16145b80612666575061266581856121d7565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661268f82611442565b73ffffffffffffffffffffffffffffffffffffffff16146126e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126dc90614c24565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612755576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161274c90614a44565b60405180910390fd5b612760838383612c08565b61276b600082612455565b6127bc81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612c0d90919063ffffffff16565b5061280e81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612c2790919063ffffffff16565b5061282581836002612c419092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60006128958360000183612c76565b60001c905092915050565b6000806000806128b38660000186612ce3565b915091508160001c8160001c9350935050509250929050565b80600990805190602001906128e292919061351a565b5050565b60006128f9846000018460001b84612d66565b60001c90509392505050565b600080828401905083811015612950576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612947906149e4565b60405180910390fd5b8091505092915050565b60008083141561296d57600090506129c4565b600082840290508284828161297e57fe5b04146129bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129b690614bc4565b60405180910390fd5b809150505b92915050565b60006129d882600001612df7565b9050919050565b6129ea84848461266f565b6129f684848484612e08565b612a35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a2c90614964565b60405180910390fd5b50505050565b60606000821415612a83576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612b7d565b600082905060005b60008214612aad578080600101915050600a8281612aa557fe5b049150612a8b565b60008167ffffffffffffffff81118015612ac657600080fd5b506040519080825280601f01601f191660200182016040528015612af95781602001600182028036833780820191505090505b50905060006001830390508593505b60008414612b7557600a8481612b1a57fe5b0660300160f81b82828060019003935081518110612b3457fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8481612b6d57fe5b049350612b08565b819450505050505b919050565b6000612b94836000018360001b612f6c565b905092915050565b600081600001805490509050919050565b612bb78383612f8f565b612bc46000848484612e08565b612c03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bfa90614964565b60405180910390fd5b505050565b505050565b6000612c1f836000018360001b61311d565b905092915050565b6000612c39836000018360001b613205565b905092915050565b6000612c6d846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b613275565b90509392505050565b600081836000018054905011612cc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cb890614924565b60405180910390fd5b826000018281548110612cd057fe5b9060005260206000200154905092915050565b60008082846000018054905011612d2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d2690614b84565b60405180910390fd5b6000846000018481548110612d4057fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b60008084600101600085815260200190815260200160002054905060008114158390612dc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dbf91906148e0565b60405180910390fd5b50846000016001820381548110612ddb57fe5b9060005260206000209060020201600101549150509392505050565b600081600001805490509050919050565b6000612e298473ffffffffffffffffffffffffffffffffffffffff16613351565b612e365760019050612f64565b6000612efd63150b7a0260e01b612e4b61244d565b888787604051602401612e619493929190614819565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051806060016040528060328152602001615010603291398773ffffffffffffffffffffffffffffffffffffffff166133649092919063ffffffff16565b9050600081806020019051810190612f15919061390c565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614925050505b949350505050565b600080836001016000848152602001908152602001600020541415905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612fff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ff690614ba4565b60405180910390fd5b61300881612430565b15613048576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161303f906149c4565b60405180910390fd5b61305460008383612c08565b6130a581600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612c2790919063ffffffff16565b506130bc81836002612c419092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080836001016000848152602001908152602001600020549050600081146131f9576000600182039050600060018660000180549050039050600086600001828154811061316857fe5b906000526020600020015490508087600001848154811061318557fe5b90600052602060002001819055506001830187600101600083815260200190815260200160002081905550866000018054806131bd57fe5b600190038181906000526020600020016000905590558660010160008781526020019081526020016000206000905560019450505050506131ff565b60009150505b92915050565b6000613211838361337c565b61326a57826000018290806001815401808255809150506001900390600052602060002001600090919091909150558260000180549050836001016000848152602001908152602001600020819055506001905061326f565b600090505b92915050565b600080846001016000858152602001908152602001600020549050600081141561331c5784600001604051806040016040528086815260200185815250908060018154018082558091505060019003906000526020600020906002020160009091909190915060008201518160000155602082015181600101555050846000018054905085600101600086815260200190815260200160002081905550600191505061334a565b8285600001600183038154811061332f57fe5b90600052602060002090600202016001018190555060009150505b9392505050565b600080823b905060008111915050919050565b6060613373848460008561339f565b90509392505050565b600080836001016000848152602001908152602001600020541415905092915050565b6060824710156133e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133db90614ac4565b60405180910390fd5b6133ed85613351565b61342c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161342390614ce4565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161345591906147ac565b60006040518083038185875af1925050503d8060008114613492576040519150601f19603f3d011682016040523d82523d6000602084013e613497565b606091505b50915091506134a78282866134b3565b92505050949350505050565b606083156134c357829050613513565b6000835111156134d65782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161350a91906148e0565b60405180910390fd5b9392505050565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826135505760008555613597565b82601f1061356957805160ff1916838001178555613597565b82800160010185558215613597579182015b8281111561359657825182559160200191906001019061357b565b5b5090506135a491906135a8565b5090565b5b808211156135c15760008160009055506001016135a9565b5090565b60006135d86135d384614d70565b614d3f565b9050828152602081018484840111156135f057600080fd5b6135fb848285614f47565b509392505050565b600061361661361184614da0565b614d3f565b90508281526020810184848401111561362e57600080fd5b613639848285614f47565b509392505050565b60008135905061365081614f9c565b92915050565b60008135905061366581614fb3565b92915050565b60008151905061367a81614fca565b92915050565b60008135905061368f81614fe1565b92915050565b6000815190506136a481614fe1565b92915050565b600082601f8301126136bb57600080fd5b81356136cb8482602086016135c5565b91505092915050565b600082601f8301126136e557600080fd5b81356136f5848260208601613603565b91505092915050565b60008135905061370d81614ff8565b92915050565b60006020828403121561372557600080fd5b600061373384828501613641565b91505092915050565b6000806040838503121561374f57600080fd5b600061375d85828601613641565b925050602061376e85828601613641565b9150509250929050565b60008060006060848603121561378d57600080fd5b600061379b86828701613641565b93505060206137ac86828701613641565b92505060406137bd868287016136fe565b9150509250925092565b600080600080608085870312156137dd57600080fd5b60006137eb87828801613641565b94505060206137fc87828801613641565b935050604061380d878288016136fe565b925050606085013567ffffffffffffffff81111561382a57600080fd5b613836878288016136aa565b91505092959194509250565b6000806040838503121561385557600080fd5b600061386385828601613641565b925050602061387485828601613656565b9150509250929050565b6000806040838503121561389157600080fd5b600061389f85828601613641565b92505060206138b0858286016136fe565b9150509250929050565b6000602082840312156138cc57600080fd5b60006138da8482850161366b565b91505092915050565b6000602082840312156138f557600080fd5b600061390384828501613680565b91505092915050565b60006020828403121561391e57600080fd5b600061392c84828501613695565b91505092915050565b60006020828403121561394757600080fd5b600082013567ffffffffffffffff81111561396157600080fd5b61396d848285016136d4565b91505092915050565b60006020828403121561398857600080fd5b6000613996848285016136fe565b91505092915050565b600080604083850312156139b257600080fd5b60006139c0858286016136fe565b925050602083013567ffffffffffffffff8111156139dd57600080fd5b6139e9858286016136d4565b9150509250929050565b60006139ff838361478e565b60208301905092915050565b613a1481614f11565b82525050565b613a2381614e93565b82525050565b613a3281614e81565b82525050565b6000613a4382614e0a565b613a4d8185614e38565b9350613a5883614dd0565b8060005b83811015613a89578151613a7088826139f3565b9750613a7b83614e2b565b925050600181019050613a5c565b5085935050505092915050565b613a9f81614ea5565b82525050565b6000613ab082614e15565b613aba8185614e49565b9350613aca818560208601614f56565b613ad381614f8b565b840191505092915050565b6000613ae982614e15565b613af38185614e5a565b9350613b03818560208601614f56565b80840191505092915050565b600081546001811660008114613b2c5760018114613b5157613b95565b607f6002830416613b3d8187614e5a565b955060ff1983168652808601935050613b95565b60028204613b5f8187614e5a565b9550613b6a85614de0565b60005b82811015613b8c57815481890152600182019150602081019050613b6d565b82880195505050505b505092915050565b6000613ba882614e20565b613bb28185614e65565b9350613bc2818560208601614f56565b613bcb81614f8b565b840191505092915050565b6000613be182614e20565b613beb8185614e76565b9350613bfb818560208601614f56565b80840191505092915050565b600081546001811660008114613c245760018114613c4a57613c8e565b607f6002830416613c358187614e65565b955060ff198316865260208601935050613c8e565b60028204613c588187614e65565b9550613c6385614df5565b60005b82811015613c8557815481890152600182019150602081019050613c66565b80880195505050505b505092915050565b6000613ca3602283614e65565b91507f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613d09601a83614e65565b91507f43686f6f73652061206769726c2077697468696e2072616e67650000000000006000830152602082019050919050565b6000613d49603283614e65565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000613daf602683614e65565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613e15602583614e65565b91507f53616c65206d7573742062652061637469766520746f206d696e74205375706560008301527f724769726c0000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613e7b601c83614e65565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613ebb601b83614e65565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b6000613efb601a83614e65565b91507f43484f4f53452041204749524c2057495448494e2052414e47450000000000006000830152602082019050919050565b6000613f3b602083614e65565b91507f4e6f7420656e6f7567682072657365727665206c65667420666f72207465616d6000830152602082019050919050565b6000613f7b602483614e65565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613fe1601983614e65565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000614021601f83614e65565b91507f45746865722076616c75652073656e74206973206e6f7420636f7272656374006000830152602082019050919050565b6000614061601e83614e65565b91507f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006000830152602082019050919050565b60006140a1602683614e65565b91507f416464726573733a20696e73756666696369656e742062616c616e636520666f60008301527f722063616c6c00000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614107602c83614e65565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061416d602183614e65565b91507f43616e206f6e6c79206d696e7420323020746f6b656e7320617420612074696d60008301527f65000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006141d3602983614e65565b91507f507572636861736520776f756c6420657863656564206d617820737570706c7960008301527f206f66204769726c7a00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614239603883614e65565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b600061429f602a83614e65565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000614305602283614e65565b91507f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061436b602083614e65565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b60006143ab602183614e65565b91507f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008301527f77000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614411602c83614e65565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000614477602083614e65565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006144b7602983614e65565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061451d602f83614e65565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000614583602383614e65565b91507f4e6577206e616d652069732073616d65206173207468652063757272656e742060008301527f6f6e6500000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006145e9602183614e65565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061464f601683614e65565b91507f4c6963656e736520616c7265616479206c6f636b6564000000000000000000006000830152602082019050919050565b600061468f603183614e65565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b60006146f5601d83614e65565b91507f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006000830152602082019050919050565b6000614735602783614e65565b91507f4865792c20796f75722077616c6c657420646f65736e2774206f776e2074686960008301527f73204769726c21000000000000000000000000000000000000000000000000006020830152604082019050919050565b61479781614f07565b82525050565b6147a681614f07565b82525050565b60006147b88284613ade565b915081905092915050565b60006147cf8284613b0f565b915081905092915050565b60006147e68285613bd6565b91506147f28284613bd6565b91508190509392505050565b60006020820190506148136000830184613a29565b92915050565b600060808201905061482e6000830187613a1a565b61483b6020830186613a29565b614848604083018561479d565b818103606083015261485a8184613aa5565b905095945050505050565b600060608201905061487a6000830186613a0b565b614887602083018561479d565b81810360408301526148998184613b9d565b9050949350505050565b600060208201905081810360008301526148bd8184613a38565b905092915050565b60006020820190506148da6000830184613a96565b92915050565b600060208201905081810360008301526148fa8184613b9d565b905092915050565b6000602082019050818103600083015261491c8184613c07565b905092915050565b6000602082019050818103600083015261493d81613c96565b9050919050565b6000602082019050818103600083015261495d81613cfc565b9050919050565b6000602082019050818103600083015261497d81613d3c565b9050919050565b6000602082019050818103600083015261499d81613da2565b9050919050565b600060208201905081810360008301526149bd81613e08565b9050919050565b600060208201905081810360008301526149dd81613e6e565b9050919050565b600060208201905081810360008301526149fd81613eae565b9050919050565b60006020820190508181036000830152614a1d81613eee565b9050919050565b60006020820190508181036000830152614a3d81613f2e565b9050919050565b60006020820190508181036000830152614a5d81613f6e565b9050919050565b60006020820190508181036000830152614a7d81613fd4565b9050919050565b60006020820190508181036000830152614a9d81614014565b9050919050565b60006020820190508181036000830152614abd81614054565b9050919050565b60006020820190508181036000830152614add81614094565b9050919050565b60006020820190508181036000830152614afd816140fa565b9050919050565b60006020820190508181036000830152614b1d81614160565b9050919050565b60006020820190508181036000830152614b3d816141c6565b9050919050565b60006020820190508181036000830152614b5d8161422c565b9050919050565b60006020820190508181036000830152614b7d81614292565b9050919050565b60006020820190508181036000830152614b9d816142f8565b9050919050565b60006020820190508181036000830152614bbd8161435e565b9050919050565b60006020820190508181036000830152614bdd8161439e565b9050919050565b60006020820190508181036000830152614bfd81614404565b9050919050565b60006020820190508181036000830152614c1d8161446a565b9050919050565b60006020820190508181036000830152614c3d816144aa565b9050919050565b60006020820190508181036000830152614c5d81614510565b9050919050565b60006020820190508181036000830152614c7d81614576565b9050919050565b60006020820190508181036000830152614c9d816145dc565b9050919050565b60006020820190508181036000830152614cbd81614642565b9050919050565b60006020820190508181036000830152614cdd81614682565b9050919050565b60006020820190508181036000830152614cfd816146e8565b9050919050565b60006020820190508181036000830152614d1d81614728565b9050919050565b6000602082019050614d39600083018461479d565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614d6657614d65614f89565b5b8060405250919050565b600067ffffffffffffffff821115614d8b57614d8a614f89565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614dbb57614dba614f89565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614e8c82614ee7565b9050919050565b6000614e9e82614ee7565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000614f1c82614f23565b9050919050565b6000614f2e82614f35565b9050919050565b6000614f4082614ee7565b9050919050565b82818337600083830152505050565b60005b83811015614f74578082015181840152602081019050614f59565b83811115614f83576000848401525b50505050565bfe5b6000601f19601f8301169050919050565b614fa581614e81565b8114614fb057600080fd5b50565b614fbc81614ea5565b8114614fc757600080fd5b50565b614fd381614eb1565b8114614fde57600080fd5b50565b614fea81614ebb565b8114614ff557600080fd5b50565b61500181614f07565b811461500c57600080fd5b5056fe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea2646970667358221220630fe0efaf933b21f6eddb2342fdefaae7854fc1a30db7a7e391b956d053760464736f6c63430007060033
Deployed Bytecode
0x60806040526004361061023b5760003560e01c80636c0360eb1161012e578063b6e3a8a0116100ab578063d9b137b21161006f578063d9b137b214610862578063e985e9c51461089f578063eb8d2444146108dc578063f2fde38b14610907578063f99695cc146109305761023b565b8063b6e3a8a01461078f578063b88d4fde146107ba578063bf4702fc146107e3578063c87b56dd146107fa578063d8273fae146108375761023b565b80638da5cb5b116100f25780638da5cb5b146106bc57806395d89b41146106e75780639c3e72bd14610712578063a22cb4651461073d578063b09904b5146107665761023b565b80636c0360eb146105e45780636f460cd91461060f57806370a082311461062b578063715018a6146106685780638462151c1461067f5761023b565b806334918dfd116101bc57806352ecbe041161018057806352ecbe04146104ed57806355f804b31461052a5780635b80e3d1146105535780636352211e1461057c5780636b3c78d7146105b95761023b565b806334918dfd1461042e5780633ccfd60b146104455780633e27c0521461045c57806342842e0e146104875780634f6ccce7146104b05761023b565b806314fad0531161020357806314fad0531461033757806318160ddd146103745780631cdcab021461039f57806323b872dd146103c85780632f745c59146103f15761023b565b806301ffc9a71461024057806306fdde031461027d578063081812fc146102a8578063095ea7b3146102e5578063109695231461030e575b600080fd5b34801561024c57600080fd5b50610267600480360381019061026291906138e3565b61095b565b60405161027491906148c5565b60405180910390f35b34801561028957600080fd5b506102926109c2565b60405161029f91906148e0565b60405180910390f35b3480156102b457600080fd5b506102cf60048036038101906102ca9190613976565b610a64565b6040516102dc91906147fe565b60405180910390f35b3480156102f157600080fd5b5061030c6004803603810190610307919061387e565b610ae9565b005b34801561031a57600080fd5b5061033560048036038101906103309190613935565b610c01565b005b34801561034357600080fd5b5061035e60048036038101906103599190613976565b610c97565b60405161036b91906148e0565b60405180910390f35b34801561038057600080fd5b50610389610d95565b6040516103969190614d24565b60405180910390f35b3480156103ab57600080fd5b506103c660048036038101906103c1919061387e565b610da6565b005b3480156103d457600080fd5b506103ef60048036038101906103ea9190613778565b610ec4565b005b3480156103fd57600080fd5b506104186004803603810190610413919061387e565b610f24565b6040516104259190614d24565b60405180910390f35b34801561043a57600080fd5b50610443610f7f565b005b34801561045157600080fd5b5061045a611027565b005b34801561046857600080fd5b506104716110f2565b60405161047e9190614d24565b60405180910390f35b34801561049357600080fd5b506104ae60048036038101906104a99190613778565b6110f7565b005b3480156104bc57600080fd5b506104d760048036038101906104d29190613976565b611117565b6040516104e49190614d24565b60405180910390f35b3480156104f957600080fd5b50610514600480360381019061050f9190613976565b61113a565b60405161052191906148e0565b60405180910390f35b34801561053657600080fd5b50610551600480360381019061054c9190613935565b6111ea565b005b34801561055f57600080fd5b5061057a6004803603810190610575919061399f565b611272565b005b34801561058857600080fd5b506105a3600480360381019061059e9190613976565b611442565b6040516105b091906147fe565b60405180910390f35b3480156105c557600080fd5b506105ce611479565b6040516105db91906148e0565b60405180910390f35b3480156105f057600080fd5b506105f9611517565b60405161060691906148e0565b60405180910390f35b61062960048036038101906106249190613976565b6115b9565b005b34801561063757600080fd5b50610652600480360381019061064d9190613713565b611757565b60405161065f9190614d24565b60405180910390f35b34801561067457600080fd5b5061067d611816565b005b34801561068b57600080fd5b506106a660048036038101906106a19190613713565b611953565b6040516106b391906148a3565b60405180910390f35b3480156106c857600080fd5b506106d1611a4c565b6040516106de91906147fe565b60405180910390f35b3480156106f357600080fd5b506106fc611a76565b60405161070991906148e0565b60405180910390f35b34801561071e57600080fd5b50610727611b18565b60405161073491906148e0565b60405180910390f35b34801561074957600080fd5b50610764600480360381019061075f9190613842565b611bb6565b005b34801561077257600080fd5b5061078d60048036038101906107889190613935565b611d37565b005b34801561079b57600080fd5b506107a4611e23565b6040516107b19190614d24565b60405180910390f35b3480156107c657600080fd5b506107e160048036038101906107dc91906137c7565b611e2e565b005b3480156107ef57600080fd5b506107f8611e90565b005b34801561080657600080fd5b50610821600480360381019061081c9190613976565b611f61565b60405161082e91906148e0565b60405180910390f35b34801561084357600080fd5b5061084c6120e4565b6040516108599190614d24565b60405180910390f35b34801561086e57600080fd5b5061088960048036038101906108849190613976565b6120ea565b60405161089691906148e0565b60405180910390f35b3480156108ab57600080fd5b506108c660048036038101906108c1919061373c565b6121d7565b6040516108d391906148c5565b60405180910390f35b3480156108e857600080fd5b506108f161226b565b6040516108fe91906148c5565b60405180910390f35b34801561091357600080fd5b5061092e60048036038101906109299190613713565b61227e565b005b34801561093c57600080fd5b5061094561242a565b6040516109529190614d24565b60405180910390f35b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060068054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610a5a5780601f10610a2f57610100808354040283529160200191610a5a565b820191906000526020600020905b815481529060010190602001808311610a3d57829003601f168201915b5050505050905090565b6000610a6f82612430565b610aae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa590614be4565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610af482611442565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5c90614c84565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b8461244d565b73ffffffffffffffffffffffffffffffffffffffff161480610bb35750610bb281610bad61244d565b6121d7565b5b610bf2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be990614b44565b60405180910390fd5b610bfc8383612455565b505050565b610c0961244d565b73ffffffffffffffffffffffffffffffffffffffff16610c27611a4c565b73ffffffffffffffffffffffffffffffffffffffff1614610c7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7490614c04565b60405180910390fd5b80600b9080519060200190610c9392919061351a565b5050565b6060610ca1610d95565b8210610ce2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd990614944565b60405180910390fd5b600e60008381526020019081526020016000208054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610d895780601f10610d5e57610100808354040283529160200191610d89565b820191906000526020600020905b815481529060010190602001808311610d6c57829003601f168201915b50505050509050919050565b6000610da1600261250e565b905090565b610dae61244d565b73ffffffffffffffffffffffffffffffffffffffff16610dcc611a4c565b73ffffffffffffffffffffffffffffffffffffffff1614610e22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1990614c04565b60405180910390fd5b6000610e2c610d95565b9050600082118015610e405750600f548211155b610e7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7690614a24565b60405180910390fd5b60005b82811015610ea357610e9684828401612523565b8080600101915050610e82565b50610eb982600f5461254190919063ffffffff16565b600f81905550505050565b610ed5610ecf61244d565b82612591565b610f14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0b90614cc4565b60405180910390fd5b610f1f83838361266f565b505050565b6000610f7782600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061288690919063ffffffff16565b905092915050565b610f8761244d565b73ffffffffffffffffffffffffffffffffffffffff16610fa5611a4c565b73ffffffffffffffffffffffffffffffffffffffff1614610ffb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff290614c04565b60405180910390fd5b600d60019054906101000a900460ff1615600d60016101000a81548160ff021916908315150217905550565b61102f61244d565b73ffffffffffffffffffffffffffffffffffffffff1661104d611a4c565b73ffffffffffffffffffffffffffffffffffffffff16146110a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109a90614c04565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156110ee573d6000803e3d6000fd5b5050565b601481565b61111283838360405180602001604052806000815250611e2e565b505050565b60008061112e8360026128a090919063ffffffff16565b50905080915050919050565b600e6020528060005260406000206000915090508054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156111e25780601f106111b7576101008083540402835291602001916111e2565b820191906000526020600020905b8154815290600101906020018083116111c557829003601f168201915b505050505081565b6111f261244d565b73ffffffffffffffffffffffffffffffffffffffff16611210611a4c565b73ffffffffffffffffffffffffffffffffffffffff1614611266576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125d90614c04565b60405180910390fd5b61126f816128cc565b50565b3373ffffffffffffffffffffffffffffffffffffffff1661129283611442565b73ffffffffffffffffffffffffffffffffffffffff16146112e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112df90614d04565b60405180910390fd5b6002600e600084815260200190815260200160002060405161130a91906147c3565b602060405180830381855afa158015611327573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061134a91906138ba565b60028260405161135a91906147ac565b602060405180830381855afa158015611377573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061139a91906138ba565b14156113db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d290614c64565b60405180910390fd5b80600e6000848152602001908152602001600020908051906020019061140292919061351a565b507f8a468a24cdcc6f593c75f170397d8efbf8e17bd5188df3a2038a9e28d8f7cb6133838360405161143693929190614865565b60405180910390a15050565b6000611472826040518060600160405280602981526020016150426029913960026128e69092919063ffffffff16565b9050919050565b600b8054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561150f5780601f106114e45761010080835404028352916020019161150f565b820191906000526020600020905b8154815290600101906020018083116114f257829003601f168201915b505050505081565b606060098054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156115af5780601f10611584576101008083540402835291602001916115af565b820191906000526020600020905b81548152906001019060200180831161159257829003601f168201915b5050505050905090565b600d60019054906101000a900460ff16611608576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ff906149a4565b60405180910390fd5b600081118015611619575060148111155b611658576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164f90614b04565b60405180910390fd5b611be661167582611667610d95565b61290590919063ffffffff16565b11156116b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ad90614b24565b60405180910390fd5b6116d08166f8b0a10e47000061295a90919063ffffffff16565b341015611712576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170990614a84565b60405180910390fd5b60005b81811015611753576000611727610d95565b9050611be6611734610d95565b1015611745576117443382612523565b5b508080600101915050611715565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117bf90614b64565b60405180910390fd5b61180f600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206129ca565b9050919050565b61181e61244d565b73ffffffffffffffffffffffffffffffffffffffff1661183c611a4c565b73ffffffffffffffffffffffffffffffffffffffff1614611892576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188990614c04565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6060600061196083611757565b905060008114156119bb57600067ffffffffffffffff8111801561198357600080fd5b506040519080825280602002602001820160405280156119b25781602001602082028036833780820191505090505b50915050611a47565b60008167ffffffffffffffff811180156119d457600080fd5b50604051908082528060200260200182016040528015611a035781602001602082028036833780820191505090505b50905060005b82811015611a4057611a1b8582610f24565b828281518110611a2757fe5b6020026020010181815250508080600101915050611a09565b8193505050505b919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060078054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611b0e5780601f10611ae357610100808354040283529160200191611b0e565b820191906000526020600020905b815481529060010190602001808311611af157829003601f168201915b5050505050905090565b600c8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611bae5780601f10611b8357610100808354040283529160200191611bae565b820191906000526020600020905b815481529060010190602001808311611b9157829003601f168201915b505050505081565b611bbe61244d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2390614a64565b60405180910390fd5b8060056000611c3961244d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611ce661244d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611d2b91906148c5565b60405180910390a35050565b611d3f61244d565b73ffffffffffffffffffffffffffffffffffffffff16611d5d611a4c565b73ffffffffffffffffffffffffffffffffffffffff1614611db3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611daa90614c04565b60405180910390fd5b60001515600d60009054906101000a900460ff16151514611e09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0090614ca4565b60405180910390fd5b80600c9080519060200190611e1f92919061351a565b5050565b66f8b0a10e47000081565b611e3f611e3961244d565b83612591565b611e7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7590614cc4565b60405180910390fd5b611e8a848484846129df565b50505050565b611e9861244d565b73ffffffffffffffffffffffffffffffffffffffff16611eb6611a4c565b73ffffffffffffffffffffffffffffffffffffffff1614611f0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0390614c04565b60405180910390fd5b6001600d60006101000a81548160ff0219169083151502179055507f92423ccd40e13759d50d24569dcbaccb20ade47247f3cf3e3951a9f29d2048b0600c604051611f579190614902565b60405180910390a1565b6060611f6c82612430565b611fab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa290614c44565b60405180910390fd5b6000600860008481526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156120545780601f1061202957610100808354040283529160200191612054565b820191906000526020600020905b81548152906001019060200180831161203757829003601f168201915b505050505090506000612065611517565b905060008151141561207b5781925050506120df565b6000825111156120b05780826040516020016120989291906147da565b604051602081830303815290604052925050506120df565b806120ba85612a3b565b6040516020016120cb9291906147da565b604051602081830303815290604052925050505b919050565b611be681565b60606120f4610d95565b8210612135576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212c90614a04565b60405180910390fd5b600c8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156121cb5780601f106121a0576101008083540402835291602001916121cb565b820191906000526020600020905b8154815290600101906020018083116121ae57829003601f168201915b50505050509050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600d60019054906101000a900460ff1681565b61228661244d565b73ffffffffffffffffffffffffffffffffffffffff166122a4611a4c565b73ffffffffffffffffffffffffffffffffffffffff16146122fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f190614c04565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561236a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236190614984565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600f5481565b6000612446826002612b8290919063ffffffff16565b9050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166124c883611442565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061251c82600001612b9c565b9050919050565b61253d828260405180602001604052806000815250612bad565b5050565b600082821115612586576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257d90614aa4565b60405180910390fd5b818303905092915050565b600061259c82612430565b6125db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125d290614ae4565b60405180910390fd5b60006125e683611442565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061265557508373ffffffffffffffffffffffffffffffffffffffff1661263d84610a64565b73ffffffffffffffffffffffffffffffffffffffff16145b80612666575061266581856121d7565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661268f82611442565b73ffffffffffffffffffffffffffffffffffffffff16146126e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126dc90614c24565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612755576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161274c90614a44565b60405180910390fd5b612760838383612c08565b61276b600082612455565b6127bc81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612c0d90919063ffffffff16565b5061280e81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612c2790919063ffffffff16565b5061282581836002612c419092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60006128958360000183612c76565b60001c905092915050565b6000806000806128b38660000186612ce3565b915091508160001c8160001c9350935050509250929050565b80600990805190602001906128e292919061351a565b5050565b60006128f9846000018460001b84612d66565b60001c90509392505050565b600080828401905083811015612950576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612947906149e4565b60405180910390fd5b8091505092915050565b60008083141561296d57600090506129c4565b600082840290508284828161297e57fe5b04146129bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129b690614bc4565b60405180910390fd5b809150505b92915050565b60006129d882600001612df7565b9050919050565b6129ea84848461266f565b6129f684848484612e08565b612a35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a2c90614964565b60405180910390fd5b50505050565b60606000821415612a83576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612b7d565b600082905060005b60008214612aad578080600101915050600a8281612aa557fe5b049150612a8b565b60008167ffffffffffffffff81118015612ac657600080fd5b506040519080825280601f01601f191660200182016040528015612af95781602001600182028036833780820191505090505b50905060006001830390508593505b60008414612b7557600a8481612b1a57fe5b0660300160f81b82828060019003935081518110612b3457fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8481612b6d57fe5b049350612b08565b819450505050505b919050565b6000612b94836000018360001b612f6c565b905092915050565b600081600001805490509050919050565b612bb78383612f8f565b612bc46000848484612e08565b612c03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bfa90614964565b60405180910390fd5b505050565b505050565b6000612c1f836000018360001b61311d565b905092915050565b6000612c39836000018360001b613205565b905092915050565b6000612c6d846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b613275565b90509392505050565b600081836000018054905011612cc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cb890614924565b60405180910390fd5b826000018281548110612cd057fe5b9060005260206000200154905092915050565b60008082846000018054905011612d2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d2690614b84565b60405180910390fd5b6000846000018481548110612d4057fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b60008084600101600085815260200190815260200160002054905060008114158390612dc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dbf91906148e0565b60405180910390fd5b50846000016001820381548110612ddb57fe5b9060005260206000209060020201600101549150509392505050565b600081600001805490509050919050565b6000612e298473ffffffffffffffffffffffffffffffffffffffff16613351565b612e365760019050612f64565b6000612efd63150b7a0260e01b612e4b61244d565b888787604051602401612e619493929190614819565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051806060016040528060328152602001615010603291398773ffffffffffffffffffffffffffffffffffffffff166133649092919063ffffffff16565b9050600081806020019051810190612f15919061390c565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614925050505b949350505050565b600080836001016000848152602001908152602001600020541415905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612fff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ff690614ba4565b60405180910390fd5b61300881612430565b15613048576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161303f906149c4565b60405180910390fd5b61305460008383612c08565b6130a581600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612c2790919063ffffffff16565b506130bc81836002612c419092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080836001016000848152602001908152602001600020549050600081146131f9576000600182039050600060018660000180549050039050600086600001828154811061316857fe5b906000526020600020015490508087600001848154811061318557fe5b90600052602060002001819055506001830187600101600083815260200190815260200160002081905550866000018054806131bd57fe5b600190038181906000526020600020016000905590558660010160008781526020019081526020016000206000905560019450505050506131ff565b60009150505b92915050565b6000613211838361337c565b61326a57826000018290806001815401808255809150506001900390600052602060002001600090919091909150558260000180549050836001016000848152602001908152602001600020819055506001905061326f565b600090505b92915050565b600080846001016000858152602001908152602001600020549050600081141561331c5784600001604051806040016040528086815260200185815250908060018154018082558091505060019003906000526020600020906002020160009091909190915060008201518160000155602082015181600101555050846000018054905085600101600086815260200190815260200160002081905550600191505061334a565b8285600001600183038154811061332f57fe5b90600052602060002090600202016001018190555060009150505b9392505050565b600080823b905060008111915050919050565b6060613373848460008561339f565b90509392505050565b600080836001016000848152602001908152602001600020541415905092915050565b6060824710156133e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133db90614ac4565b60405180910390fd5b6133ed85613351565b61342c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161342390614ce4565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161345591906147ac565b60006040518083038185875af1925050503d8060008114613492576040519150601f19603f3d011682016040523d82523d6000602084013e613497565b606091505b50915091506134a78282866134b3565b92505050949350505050565b606083156134c357829050613513565b6000835111156134d65782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161350a91906148e0565b60405180910390fd5b9392505050565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826135505760008555613597565b82601f1061356957805160ff1916838001178555613597565b82800160010185558215613597579182015b8281111561359657825182559160200191906001019061357b565b5b5090506135a491906135a8565b5090565b5b808211156135c15760008160009055506001016135a9565b5090565b60006135d86135d384614d70565b614d3f565b9050828152602081018484840111156135f057600080fd5b6135fb848285614f47565b509392505050565b600061361661361184614da0565b614d3f565b90508281526020810184848401111561362e57600080fd5b613639848285614f47565b509392505050565b60008135905061365081614f9c565b92915050565b60008135905061366581614fb3565b92915050565b60008151905061367a81614fca565b92915050565b60008135905061368f81614fe1565b92915050565b6000815190506136a481614fe1565b92915050565b600082601f8301126136bb57600080fd5b81356136cb8482602086016135c5565b91505092915050565b600082601f8301126136e557600080fd5b81356136f5848260208601613603565b91505092915050565b60008135905061370d81614ff8565b92915050565b60006020828403121561372557600080fd5b600061373384828501613641565b91505092915050565b6000806040838503121561374f57600080fd5b600061375d85828601613641565b925050602061376e85828601613641565b9150509250929050565b60008060006060848603121561378d57600080fd5b600061379b86828701613641565b93505060206137ac86828701613641565b92505060406137bd868287016136fe565b9150509250925092565b600080600080608085870312156137dd57600080fd5b60006137eb87828801613641565b94505060206137fc87828801613641565b935050604061380d878288016136fe565b925050606085013567ffffffffffffffff81111561382a57600080fd5b613836878288016136aa565b91505092959194509250565b6000806040838503121561385557600080fd5b600061386385828601613641565b925050602061387485828601613656565b9150509250929050565b6000806040838503121561389157600080fd5b600061389f85828601613641565b92505060206138b0858286016136fe565b9150509250929050565b6000602082840312156138cc57600080fd5b60006138da8482850161366b565b91505092915050565b6000602082840312156138f557600080fd5b600061390384828501613680565b91505092915050565b60006020828403121561391e57600080fd5b600061392c84828501613695565b91505092915050565b60006020828403121561394757600080fd5b600082013567ffffffffffffffff81111561396157600080fd5b61396d848285016136d4565b91505092915050565b60006020828403121561398857600080fd5b6000613996848285016136fe565b91505092915050565b600080604083850312156139b257600080fd5b60006139c0858286016136fe565b925050602083013567ffffffffffffffff8111156139dd57600080fd5b6139e9858286016136d4565b9150509250929050565b60006139ff838361478e565b60208301905092915050565b613a1481614f11565b82525050565b613a2381614e93565b82525050565b613a3281614e81565b82525050565b6000613a4382614e0a565b613a4d8185614e38565b9350613a5883614dd0565b8060005b83811015613a89578151613a7088826139f3565b9750613a7b83614e2b565b925050600181019050613a5c565b5085935050505092915050565b613a9f81614ea5565b82525050565b6000613ab082614e15565b613aba8185614e49565b9350613aca818560208601614f56565b613ad381614f8b565b840191505092915050565b6000613ae982614e15565b613af38185614e5a565b9350613b03818560208601614f56565b80840191505092915050565b600081546001811660008114613b2c5760018114613b5157613b95565b607f6002830416613b3d8187614e5a565b955060ff1983168652808601935050613b95565b60028204613b5f8187614e5a565b9550613b6a85614de0565b60005b82811015613b8c57815481890152600182019150602081019050613b6d565b82880195505050505b505092915050565b6000613ba882614e20565b613bb28185614e65565b9350613bc2818560208601614f56565b613bcb81614f8b565b840191505092915050565b6000613be182614e20565b613beb8185614e76565b9350613bfb818560208601614f56565b80840191505092915050565b600081546001811660008114613c245760018114613c4a57613c8e565b607f6002830416613c358187614e65565b955060ff198316865260208601935050613c8e565b60028204613c588187614e65565b9550613c6385614df5565b60005b82811015613c8557815481890152600182019150602081019050613c66565b80880195505050505b505092915050565b6000613ca3602283614e65565b91507f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613d09601a83614e65565b91507f43686f6f73652061206769726c2077697468696e2072616e67650000000000006000830152602082019050919050565b6000613d49603283614e65565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000613daf602683614e65565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613e15602583614e65565b91507f53616c65206d7573742062652061637469766520746f206d696e74205375706560008301527f724769726c0000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613e7b601c83614e65565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613ebb601b83614e65565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b6000613efb601a83614e65565b91507f43484f4f53452041204749524c2057495448494e2052414e47450000000000006000830152602082019050919050565b6000613f3b602083614e65565b91507f4e6f7420656e6f7567682072657365727665206c65667420666f72207465616d6000830152602082019050919050565b6000613f7b602483614e65565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613fe1601983614e65565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000614021601f83614e65565b91507f45746865722076616c75652073656e74206973206e6f7420636f7272656374006000830152602082019050919050565b6000614061601e83614e65565b91507f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006000830152602082019050919050565b60006140a1602683614e65565b91507f416464726573733a20696e73756666696369656e742062616c616e636520666f60008301527f722063616c6c00000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614107602c83614e65565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061416d602183614e65565b91507f43616e206f6e6c79206d696e7420323020746f6b656e7320617420612074696d60008301527f65000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006141d3602983614e65565b91507f507572636861736520776f756c6420657863656564206d617820737570706c7960008301527f206f66204769726c7a00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614239603883614e65565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b600061429f602a83614e65565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000614305602283614e65565b91507f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061436b602083614e65565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b60006143ab602183614e65565b91507f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008301527f77000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614411602c83614e65565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000614477602083614e65565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006144b7602983614e65565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061451d602f83614e65565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000614583602383614e65565b91507f4e6577206e616d652069732073616d65206173207468652063757272656e742060008301527f6f6e6500000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006145e9602183614e65565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061464f601683614e65565b91507f4c6963656e736520616c7265616479206c6f636b6564000000000000000000006000830152602082019050919050565b600061468f603183614e65565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b60006146f5601d83614e65565b91507f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006000830152602082019050919050565b6000614735602783614e65565b91507f4865792c20796f75722077616c6c657420646f65736e2774206f776e2074686960008301527f73204769726c21000000000000000000000000000000000000000000000000006020830152604082019050919050565b61479781614f07565b82525050565b6147a681614f07565b82525050565b60006147b88284613ade565b915081905092915050565b60006147cf8284613b0f565b915081905092915050565b60006147e68285613bd6565b91506147f28284613bd6565b91508190509392505050565b60006020820190506148136000830184613a29565b92915050565b600060808201905061482e6000830187613a1a565b61483b6020830186613a29565b614848604083018561479d565b818103606083015261485a8184613aa5565b905095945050505050565b600060608201905061487a6000830186613a0b565b614887602083018561479d565b81810360408301526148998184613b9d565b9050949350505050565b600060208201905081810360008301526148bd8184613a38565b905092915050565b60006020820190506148da6000830184613a96565b92915050565b600060208201905081810360008301526148fa8184613b9d565b905092915050565b6000602082019050818103600083015261491c8184613c07565b905092915050565b6000602082019050818103600083015261493d81613c96565b9050919050565b6000602082019050818103600083015261495d81613cfc565b9050919050565b6000602082019050818103600083015261497d81613d3c565b9050919050565b6000602082019050818103600083015261499d81613da2565b9050919050565b600060208201905081810360008301526149bd81613e08565b9050919050565b600060208201905081810360008301526149dd81613e6e565b9050919050565b600060208201905081810360008301526149fd81613eae565b9050919050565b60006020820190508181036000830152614a1d81613eee565b9050919050565b60006020820190508181036000830152614a3d81613f2e565b9050919050565b60006020820190508181036000830152614a5d81613f6e565b9050919050565b60006020820190508181036000830152614a7d81613fd4565b9050919050565b60006020820190508181036000830152614a9d81614014565b9050919050565b60006020820190508181036000830152614abd81614054565b9050919050565b60006020820190508181036000830152614add81614094565b9050919050565b60006020820190508181036000830152614afd816140fa565b9050919050565b60006020820190508181036000830152614b1d81614160565b9050919050565b60006020820190508181036000830152614b3d816141c6565b9050919050565b60006020820190508181036000830152614b5d8161422c565b9050919050565b60006020820190508181036000830152614b7d81614292565b9050919050565b60006020820190508181036000830152614b9d816142f8565b9050919050565b60006020820190508181036000830152614bbd8161435e565b9050919050565b60006020820190508181036000830152614bdd8161439e565b9050919050565b60006020820190508181036000830152614bfd81614404565b9050919050565b60006020820190508181036000830152614c1d8161446a565b9050919050565b60006020820190508181036000830152614c3d816144aa565b9050919050565b60006020820190508181036000830152614c5d81614510565b9050919050565b60006020820190508181036000830152614c7d81614576565b9050919050565b60006020820190508181036000830152614c9d816145dc565b9050919050565b60006020820190508181036000830152614cbd81614642565b9050919050565b60006020820190508181036000830152614cdd81614682565b9050919050565b60006020820190508181036000830152614cfd816146e8565b9050919050565b60006020820190508181036000830152614d1d81614728565b9050919050565b6000602082019050614d39600083018461479d565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614d6657614d65614f89565b5b8060405250919050565b600067ffffffffffffffff821115614d8b57614d8a614f89565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614dbb57614dba614f89565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614e8c82614ee7565b9050919050565b6000614e9e82614ee7565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000614f1c82614f23565b9050919050565b6000614f2e82614f35565b9050919050565b6000614f4082614ee7565b9050919050565b82818337600083830152505050565b60005b83811015614f74578082015181840152602081019050614f59565b83811115614f83576000848401525b50505050565bfe5b6000601f19601f8301169050919050565b614fa581614e81565b8114614fb057600080fd5b50565b614fbc81614ea5565b8114614fc757600080fd5b50565b614fd381614eb1565b8114614fde57600080fd5b50565b614fea81614ebb565b8114614ff557600080fd5b50565b61500181614f07565b811461500c57600080fd5b5056fe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea2646970667358221220630fe0efaf933b21f6eddb2342fdefaae7854fc1a30db7a7e391b956d053760464736f6c63430007060033
Deployed Bytecode Sourcemap
67120:4324:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10302:150;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51587:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54373:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53903:404;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68573:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71229:194;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53381:211;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68165:398;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55263:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53143:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68815:89;;;;;;;;;;;;;:::i;:::-;;68022:131;;;;;;;;;;;;;:::i;:::-;;67539:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55639:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53669:172;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67683:40;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68706:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70814:403;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51343:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67210:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52962:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70109:692;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51060:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66298:148;;;;;;;;;;;;;:::i;:::-;;68922:540;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65647:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51756:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67311:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54666:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69917:174;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67464:53;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55861:285;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69753:125;;;;;;;;;;;;;:::i;:::-;;51931:792;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67589:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69513:174;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55032:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67638:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66601:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67794:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10302:150;10387:4;10411:20;:33;10432:11;10411:33;;;;;;;;;;;;;;;;;;;;;;;;;;;10404:40;;10302:150;;;:::o;51587:100::-;51641:13;51674:5;51667:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51587:100;:::o;54373:221::-;54449:7;54477:16;54485:7;54477;:16::i;:::-;54469:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;54562:15;:24;54578:7;54562:24;;;;;;;;;;;;;;;;;;;;;54555:31;;54373:221;;;:::o;53903:404::-;53984:13;54000:23;54015:7;54000:14;:23::i;:::-;53984:39;;54048:5;54042:11;;:2;:11;;;;54034:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;54128:5;54112:21;;:12;:10;:12::i;:::-;:21;;;:69;;;;54137:44;54161:5;54168:12;:10;:12::i;:::-;54137:23;:44::i;:::-;54112:69;54104:161;;;;;;;;;;;;:::i;:::-;;;;;;;;;54278:21;54287:2;54291:7;54278:8;:21::i;:::-;53903:404;;;:::o;68573:125::-;65878:12;:10;:12::i;:::-;65867:23;;:7;:5;:7::i;:::-;:23;;;65859:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;68676:14:::1;68658:15;:32;;;;;;;;;;;;:::i;:::-;;68573:125:::0;:::o;71229:194::-;71287:13;71333;:11;:13::i;:::-;71322:8;:24;71313:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;71396:9;:19;71406:8;71396:19;;;;;;;;;;;71389:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71229:194;;;:::o;53381:211::-;53442:7;53563:21;:12;:19;:21::i;:::-;53556:28;;53381:211;:::o;68165:398::-;65878:12;:10;:12::i;:::-;65867:23;;:7;:5;:7::i;:::-;:23;;;65859:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;68260:11:::1;68274:13;:11;:13::i;:::-;68260:27;;68323:1;68306:14;:18;:51;;;;;68346:11;;68328:14;:29;;68306:51;68298:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;68410:6;68405:95;68426:14;68422:1;:18;68405:95;;;68462:26;68472:3;68486:1;68477:6;:10;68462:9;:26::i;:::-;68442:3;;;;;;;68405:95;;;;68524:31;68540:14;68524:11;;:15;;:31;;;;:::i;:::-;68510:11;:45;;;;65938:1;68165:398:::0;;:::o;55263:305::-;55424:41;55443:12;:10;:12::i;:::-;55457:7;55424:18;:41::i;:::-;55416:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;55532:28;55542:4;55548:2;55552:7;55532:9;:28::i;:::-;55263:305;;;:::o;53143:162::-;53240:7;53267:30;53291:5;53267:13;:20;53281:5;53267:20;;;;;;;;;;;;;;;:23;;:30;;;;:::i;:::-;53260:37;;53143:162;;;;:::o;68815:89::-;65878:12;:10;:12::i;:::-;65867:23;;:7;:5;:7::i;:::-;:23;;;65859:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;68884:12:::1;;;;;;;;;;;68883:13;68868:12;;:28;;;;;;;;;;;;;;;;;;68815:89::o:0;68022:131::-;65878:12;:10;:12::i;:::-;65867:23;;:7;:5;:7::i;:::-;:23;;;65859:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;68070:12:::1;68085:21;68070:36;;68117:10;:19;;:28;68137:7;68117:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;65938:1;68022:131::o:0;67539:41::-;67578:2;67539:41;:::o;55639:151::-;55743:39;55760:4;55766:2;55770:7;55743:39;;;;;;;;;;;;:16;:39::i;:::-;55639:151;;;:::o;53669:172::-;53744:7;53765:15;53786:22;53802:5;53786:12;:15;;:22;;;;:::i;:::-;53764:44;;;53826:7;53819:14;;;53669:172;;;:::o;67683:40::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;68706:99::-;65878:12;:10;:12::i;:::-;65867:23;;:7;:5;:7::i;:::-;:23;;;65859:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;68777:20:::1;68789:7;68777:11;:20::i;:::-;68706:99:::0;:::o;70814:403::-;70921:10;70900:31;;:17;70908:8;70900:7;:17::i;:::-;:31;;;70892:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;71018:34;71031:9;:19;71041:8;71031:19;;;;;;;;;;;71018:34;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;70994:20;71007:5;70994:20;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:58;;70986:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;71125:5;71103:9;:19;71113:8;71103:19;;;;;;;;;;;:27;;;;;;;;;;;;:::i;:::-;;71156:43;71171:10;71183:8;71193:5;71156:43;;;;;;;;:::i;:::-;;;;;;;;70814:403;;:::o;51343:177::-;51415:7;51442:70;51459:7;51442:70;;;;;;;;;;;;;;;;;:12;:16;;:70;;;;;:::i;:::-;51435:77;;51343:177;;;:::o;67210:34::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;52962:97::-;53010:13;53043:8;53036:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52962:97;:::o;70109:692::-;70187:12;;;;;;;;;;;70179:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;70277:1;70260:14;:18;:55;;;;;67578:2;70282:14;:33;;70260:55;70252:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;67625:4;70372:33;70390:14;70372:13;:11;:13::i;:::-;:17;;:33;;;;:::i;:::-;:46;;70364:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;70496:29;70510:14;67500:17;70496:13;;:29;;;;:::i;:::-;70483:9;:42;;70475:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;70586:6;70582:210;70602:14;70598:1;:18;70582:210;;;70638:14;70655:13;:11;:13::i;:::-;70638:30;;67625:4;70687:13;:11;:13::i;:::-;:25;70683:98;;;70733:32;70743:10;70755:9;70733;:32::i;:::-;70683:98;70582:210;70618:3;;;;;;;70582:210;;;;70109:692;:::o;51060:221::-;51132:7;51177:1;51160:19;;:5;:19;;;;51152:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;51244:29;:13;:20;51258:5;51244:20;;;;;;;;;;;;;;;:27;:29::i;:::-;51237:36;;51060:221;;;:::o;66298:148::-;65878:12;:10;:12::i;:::-;65867:23;;:7;:5;:7::i;:::-;:23;;;65859:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66405:1:::1;66368:40;;66389:6;;;;;;;;;;;66368:40;;;;;;;;;;;;66436:1;66419:6;;:19;;;;;;;;;;;;;;;;;;66298:148::o:0;68922:540::-;68983:16;69013:18;69034:17;69044:6;69034:9;:17::i;:::-;69013:38;;69080:1;69066:10;:15;69062:393;;;69157:1;69143:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69136:23;;;;;69062:393;69192:23;69232:10;69218:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69192:51;;69258:13;69286:130;69310:10;69302:5;:18;69286:130;;;69366:34;69386:6;69394:5;69366:19;:34::i;:::-;69350:6;69357:5;69350:13;;;;;;;;;;;;;:50;;;;;69322:7;;;;;;;69286:130;;;69437:6;69430:13;;;;;68922:540;;;;:::o;65647:87::-;65693:7;65720:6;;;;;;;;;;;65713:13;;65647:87;:::o;51756:104::-;51812:13;51845:7;51838:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51756:104;:::o;67311:31::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;54666:295::-;54781:12;:10;:12::i;:::-;54769:24;;:8;:24;;;;54761:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;54881:8;54836:18;:32;54855:12;:10;:12::i;:::-;54836:32;;;;;;;;;;;;;;;:42;54869:8;54836:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;54934:8;54905:48;;54920:12;:10;:12::i;:::-;54905:48;;;54944:8;54905:48;;;;;;:::i;:::-;;;;;;;;54666:295;;:::o;69917:174::-;65878:12;:10;:12::i;:::-;65867:23;;:7;:5;:7::i;:::-;:23;;;65859:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;70017:5:::1;70000:22;;:13;;;;;;;;;;;:22;;;69992:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;70075:8;70060:12;:23;;;;;;;;;;;;:::i;:::-;;69917:174:::0;:::o;67464:53::-;67500:17;67464:53;:::o;55861:285::-;55993:41;56012:12;:10;:12::i;:::-;56026:7;55993:18;:41::i;:::-;55985:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;56099:39;56113:4;56119:2;56123:7;56132:5;56099:13;:39::i;:::-;55861:285;;;;:::o;69753:125::-;65878:12;:10;:12::i;:::-;65867:23;;:7;:5;:7::i;:::-;:23;;;65859:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;69821:4:::1;69804:13;;:21;;;;;;;;;;;;;;;;;;69841:29;69857:12;69841:29;;;;;;:::i;:::-;;;;;;;;69753:125::o:0;51931:792::-;52004:13;52038:16;52046:7;52038;:16::i;:::-;52030:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;52119:23;52145:10;:19;52156:7;52145:19;;;;;;;;;;;52119:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52175:18;52196:9;:7;:9::i;:::-;52175:30;;52303:1;52287:4;52281:18;:23;52277:72;;;52328:9;52321:16;;;;;;52277:72;52479:1;52459:9;52453:23;:27;52449:108;;;52528:4;52534:9;52511:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52497:48;;;;;;52449:108;52689:4;52695:18;:7;:16;:18::i;:::-;52672:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52658:57;;;;51931:792;;;;:::o;67589:40::-;67625:4;67589:40;:::o;69513:174::-;69565:13;69605;:11;:13::i;:::-;69599:3;:19;69591:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;69667:12;69660:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69513:174;;;:::o;55032:164::-;55129:4;55153:18;:25;55172:5;55153:25;;;;;;;;;;;;;;;:35;55179:8;55153:35;;;;;;;;;;;;;;;;;;;;;;;;;55146:42;;55032:164;;;;:::o;67638:32::-;;;;;;;;;;;;;:::o;66601:244::-;65878:12;:10;:12::i;:::-;65867:23;;:7;:5;:7::i;:::-;:23;;;65859:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66710:1:::1;66690:22;;:8;:22;;;;66682:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;66800:8;66771:38;;66792:6;;;;;;;;;;;66771:38;;;;;;;;;;;;66829:8;66820:6;;:17;;;;;;;;;;;;;;;;;;66601:244:::0;:::o;67794:29::-;;;;:::o;57613:127::-;57678:4;57702:30;57724:7;57702:12;:21;;:30;;;;:::i;:::-;57695:37;;57613:127;;;:::o;734:106::-;787:15;822:10;815:17;;734:106;:::o;63631:192::-;63733:2;63706:15;:24;63722:7;63706:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;63789:7;63785:2;63751:46;;63760:23;63775:7;63760:14;:23::i;:::-;63751:46;;;;;;;;;;;;63631:192;;:::o;44345:123::-;44414:7;44441:19;44449:3;:10;;44441:7;:19::i;:::-;44434:26;;44345:123;;;:::o;58605:110::-;58681:26;58691:2;58695:7;58681:26;;;;;;;;;;;;:9;:26::i;:::-;58605:110;;:::o;14326:158::-;14384:7;14417:1;14412;:6;;14404:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;14475:1;14471;:5;14464:12;;14326:158;;;;:::o;57907:355::-;58000:4;58025:16;58033:7;58025;:16::i;:::-;58017:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;58101:13;58117:23;58132:7;58117:14;:23::i;:::-;58101:39;;58170:5;58159:16;;:7;:16;;;:51;;;;58203:7;58179:31;;:20;58191:7;58179:11;:20::i;:::-;:31;;;58159:51;:94;;;;58214:39;58238:5;58245:7;58214:23;:39::i;:::-;58159:94;58151:103;;;57907:355;;;;:::o;61043:599::-;61168:4;61141:31;;:23;61156:7;61141:14;:23::i;:::-;:31;;;61133:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;61269:1;61255:16;;:2;:16;;;;61247:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;61325:39;61346:4;61352:2;61356:7;61325:20;:39::i;:::-;61429:29;61446:1;61450:7;61429:8;:29::i;:::-;61471:35;61498:7;61471:13;:19;61485:4;61471:19;;;;;;;;;;;;;;;:26;;:35;;;;:::i;:::-;;61517:30;61539:7;61517:13;:17;61531:2;61517:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;61560:29;61577:7;61586:2;61560:12;:16;;:29;;;;;:::i;:::-;;61626:7;61622:2;61607:27;;61616:4;61607:27;;;;;;;;;;;;61043:599;;;:::o;36136:137::-;36207:7;36242:22;36246:3;:10;;36258:5;36242:3;:22::i;:::-;36234:31;;36227:38;;36136:137;;;;:::o;44807:236::-;44887:7;44896;44917:11;44930:13;44947:22;44951:3;:10;;44963:5;44947:3;:22::i;:::-;44916:53;;;;44996:3;44988:12;;45026:5;45018:14;;44980:55;;;;;;44807:236;;;;;:::o;62243:100::-;62327:8;62316;:19;;;;;;;;;;;;:::i;:::-;;62243:100;:::o;46093:213::-;46200:7;46251:44;46256:3;:10;;46276:3;46268:12;;46282;46251:4;:44::i;:::-;46243:53;;46220:78;;46093:213;;;;;:::o;13864:179::-;13922:7;13942:9;13958:1;13954;:5;13942:17;;13983:1;13978;:6;;13970:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;14034:1;14027:8;;;13864:179;;;;:::o;14743:220::-;14801:7;14830:1;14825;:6;14821:20;;;14840:1;14833:8;;;;14821:20;14852:9;14868:1;14864;:5;14852:17;;14897:1;14892;14888;:5;;;;;;:10;14880:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;14954:1;14947:8;;;14743:220;;;;;:::o;35678:114::-;35738:7;35765:19;35773:3;:10;;35765:7;:19::i;:::-;35758:26;;35678:114;;;:::o;57028:272::-;57142:28;57152:4;57158:2;57162:7;57142:9;:28::i;:::-;57189:48;57212:4;57218:2;57222:7;57231:5;57189:22;:48::i;:::-;57181:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;57028:272;;;;:::o;46557:746::-;46613:13;46843:1;46834:5;:10;46830:53;;;46861:10;;;;;;;;;;;;;;;;;;;;;46830:53;46893:12;46908:5;46893:20;;46924:14;46949:78;46964:1;46956:4;:9;46949:78;;46982:8;;;;;;;47013:2;47005:10;;;;;;;;;46949:78;;;47037:19;47069:6;47059:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47037:39;;47087:13;47112:1;47103:6;:10;47087:26;;47131:5;47124:12;;47147:117;47162:1;47154:4;:9;47147:117;;47223:2;47216:4;:9;;;;;;47211:2;:14;47198:29;;47180:6;47187:7;;;;;;;47180:15;;;;;;;;;;;:47;;;;;;;;;;;47250:2;47242:10;;;;;;;;;47147:117;;;47288:6;47274:21;;;;;;46557:746;;;;:::o;44106:151::-;44190:4;44214:35;44224:3;:10;;44244:3;44236:12;;44214:9;:35::i;:::-;44207:42;;44106:151;;;;:::o;40924:110::-;40980:7;41007:3;:12;;:19;;;;41000:26;;40924:110;;;:::o;58942:250::-;59038:18;59044:2;59048:7;59038:5;:18::i;:::-;59075:54;59106:1;59110:2;59114:7;59123:5;59075:22;:54::i;:::-;59067:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;58942:250;;;:::o;64436:93::-;;;;:::o;35223:137::-;35293:4;35317:35;35325:3;:10;;35345:5;35337:14;;35317:7;:35::i;:::-;35310:42;;35223:137;;;;:::o;34916:131::-;34983:4;35007:32;35012:3;:10;;35032:5;35024:14;;35007:4;:32::i;:::-;35000:39;;34916:131;;;;:::o;43529:185::-;43618:4;43642:64;43647:3;:10;;43667:3;43659:12;;43697:5;43681:23;;43673:32;;43642:4;:64::i;:::-;43635:71;;43529:185;;;;;:::o;31174:204::-;31241:7;31290:5;31269:3;:11;;:18;;;;:26;31261:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;31352:3;:11;;31364:5;31352:18;;;;;;;;;;;;;;;;31345:25;;31174:204;;;;:::o;41389:279::-;41456:7;41465;41515:5;41493:3;:12;;:19;;;;:27;41485:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;41572:22;41597:3;:12;;41610:5;41597:19;;;;;;;;;;;;;;;;;;41572:44;;41635:5;:10;;;41647:5;:12;;;41627:33;;;;;41389:279;;;;;:::o;42886:319::-;42980:7;43000:16;43019:3;:12;;:17;43032:3;43019:17;;;;;;;;;;;;43000:36;;43067:1;43055:8;:13;;43070:12;43047:36;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;43137:3;:12;;43161:1;43150:8;:12;43137:26;;;;;;;;;;;;;;;;;;:33;;;43130:40;;;42886:319;;;;;:::o;30721:109::-;30777:7;30804:3;:11;;:18;;;;30797:25;;30721:109;;;:::o;62908:604::-;63029:4;63056:15;:2;:13;;;:15::i;:::-;63051:60;;63095:4;63088:11;;;;63051:60;63121:23;63147:252;63200:45;;;63260:12;:10;:12::i;:::-;63287:4;63306:7;63328:5;63163:181;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63147:252;;;;;;;;;;;;;;;;;:2;:15;;;;:252;;;;;:::i;:::-;63121:278;;63410:13;63437:10;63426:32;;;;;;;;;;;;:::i;:::-;63410:48;;48057:10;63487:16;;63477:26;;;:6;:26;;;;63469:35;;;;62908:604;;;;;;;:::o;40704:125::-;40775:4;40820:1;40799:3;:12;;:17;40812:3;40799:17;;;;;;;;;;;;:22;;40792:29;;40704:125;;;;:::o;59528:404::-;59622:1;59608:16;;:2;:16;;;;59600:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;59681:16;59689:7;59681;:16::i;:::-;59680:17;59672:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;59743:45;59772:1;59776:2;59780:7;59743:20;:45::i;:::-;59801:30;59823:7;59801:13;:17;59815:2;59801:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;59844:29;59861:7;59870:2;59844:12;:16;;:29;;;;;:::i;:::-;;59916:7;59912:2;59891:33;;59908:1;59891:33;;;;;;;;;;;;59528:404;;:::o;28876:1544::-;28942:4;29060:18;29081:3;:12;;:19;29094:5;29081:19;;;;;;;;;;;;29060:40;;29131:1;29117:10;:15;29113:1300;;29479:21;29516:1;29503:10;:14;29479:38;;29532:17;29573:1;29552:3;:11;;:18;;;;:22;29532:42;;29819:17;29839:3;:11;;29851:9;29839:22;;;;;;;;;;;;;;;;29819:42;;29985:9;29956:3;:11;;29968:13;29956:26;;;;;;;;;;;;;;;:38;;;;30104:1;30088:13;:17;30062:3;:12;;:23;30075:9;30062:23;;;;;;;;;;;:43;;;;30214:3;:11;;:17;;;;;;;;;;;;;;;;;;;;;;;;30309:3;:12;;:19;30322:5;30309:19;;;;;;;;;;;30302:26;;;30352:4;30345:11;;;;;;;;29113:1300;30396:5;30389:12;;;28876:1544;;;;;:::o;28286:414::-;28349:4;28371:21;28381:3;28386:5;28371:9;:21::i;:::-;28366:327;;28409:3;:11;;28426:5;28409:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28592:3;:11;;:18;;;;28570:3;:12;;:19;28583:5;28570:19;;;;;;;;;;;:40;;;;28632:4;28625:11;;;;28366:327;28676:5;28669:12;;28286:414;;;;;:::o;38204:692::-;38280:4;38396:16;38415:3;:12;;:17;38428:3;38415:17;;;;;;;;;;;;38396:36;;38461:1;38449:8;:13;38445:444;;;38516:3;:12;;38534:38;;;;;;;;38551:3;38534:38;;;;38564:5;38534:38;;;38516:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38731:3;:12;;:19;;;;38711:3;:12;;:17;38724:3;38711:17;;;;;;;;;;;:39;;;;38772:4;38765:11;;;;;38445:444;38845:5;38809:3;:12;;38833:1;38822:8;:12;38809:26;;;;;;;;;;;;;;;;;;:33;;:41;;;;38872:5;38865:12;;;38204:692;;;;;;:::o;19305:422::-;19365:4;19573:12;19684:7;19672:20;19664:28;;19718:1;19711:4;:8;19704:15;;;19305:422;;;:::o;22223:195::-;22326:12;22358:52;22380:6;22388:4;22394:1;22397:12;22358:21;:52::i;:::-;22351:59;;22223:195;;;;;:::o;30506:129::-;30579:4;30626:1;30603:3;:12;;:19;30616:5;30603:19;;;;;;;;;;;;:24;;30596:31;;30506:129;;;;:::o;23275:530::-;23402:12;23460:5;23435:21;:30;;23427:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;23527:18;23538:6;23527:10;:18::i;:::-;23519:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;23653:12;23667:23;23694:6;:11;;23714:5;23722:4;23694:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23652:75;;;;23745:52;23763:7;23772:10;23784:12;23745:17;:52::i;:::-;23738:59;;;;23275:530;;;;;;:::o;25815:742::-;25930:12;25959:7;25955:595;;;25990:10;25983:17;;;;25955:595;26124:1;26104:10;:17;:21;26100:439;;;26367:10;26361:17;26428:15;26415:10;26411:2;26407:19;26400:44;26315:148;26510:12;26503:20;;;;;;;;;;;:::i;:::-;;;;;;;;25815:742;;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:342:1:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:344::-;;458:65;473:49;515:6;473:49;:::i;:::-;458:65;:::i;:::-;449:74;;546:6;539:5;532:21;584:4;577:5;573:16;622:3;613:6;608:3;604:16;601:25;598:2;;;639:1;636;629:12;598:2;652:41;686:6;681:3;676;652:41;:::i;:::-;439:260;;;;;;:::o;705:139::-;;789:6;776:20;767:29;;805:33;832:5;805:33;:::i;:::-;757:87;;;;:::o;850:133::-;;931:6;918:20;909:29;;947:30;971:5;947:30;:::i;:::-;899:84;;;;:::o;989:143::-;;1077:6;1071:13;1062:22;;1093:33;1120:5;1093:33;:::i;:::-;1052:80;;;;:::o;1138:137::-;;1221:6;1208:20;1199:29;;1237:32;1263:5;1237:32;:::i;:::-;1189:86;;;;:::o;1281:141::-;;1368:6;1362:13;1353:22;;1384:32;1410:5;1384:32;:::i;:::-;1343:79;;;;:::o;1441:271::-;;1545:3;1538:4;1530:6;1526:17;1522:27;1512:2;;1563:1;1560;1553:12;1512:2;1603:6;1590:20;1628:78;1702:3;1694:6;1687:4;1679:6;1675:17;1628:78;:::i;:::-;1619:87;;1502:210;;;;;:::o;1732:273::-;;1837:3;1830:4;1822:6;1818:17;1814:27;1804:2;;1855:1;1852;1845:12;1804:2;1895:6;1882:20;1920:79;1995:3;1987:6;1980:4;1972:6;1968:17;1920:79;:::i;:::-;1911:88;;1794:211;;;;;:::o;2011:139::-;;2095:6;2082:20;2073:29;;2111:33;2138:5;2111:33;:::i;:::-;2063:87;;;;:::o;2156:262::-;;2264:2;2252:9;2243:7;2239:23;2235:32;2232:2;;;2280:1;2277;2270:12;2232:2;2323:1;2348:53;2393:7;2384:6;2373:9;2369:22;2348:53;:::i;:::-;2338:63;;2294:117;2222:196;;;;:::o;2424:407::-;;;2549:2;2537:9;2528:7;2524:23;2520:32;2517:2;;;2565:1;2562;2555:12;2517:2;2608:1;2633:53;2678:7;2669:6;2658:9;2654:22;2633:53;:::i;:::-;2623:63;;2579:117;2735:2;2761:53;2806:7;2797:6;2786:9;2782:22;2761:53;:::i;:::-;2751:63;;2706:118;2507:324;;;;;:::o;2837:552::-;;;;2979:2;2967:9;2958:7;2954:23;2950:32;2947:2;;;2995:1;2992;2985:12;2947:2;3038:1;3063:53;3108:7;3099:6;3088:9;3084:22;3063:53;:::i;:::-;3053:63;;3009:117;3165:2;3191:53;3236:7;3227:6;3216:9;3212:22;3191:53;:::i;:::-;3181:63;;3136:118;3293:2;3319:53;3364:7;3355:6;3344:9;3340:22;3319:53;:::i;:::-;3309:63;;3264:118;2937:452;;;;;:::o;3395:809::-;;;;;3563:3;3551:9;3542:7;3538:23;3534:33;3531:2;;;3580:1;3577;3570:12;3531:2;3623:1;3648:53;3693:7;3684:6;3673:9;3669:22;3648:53;:::i;:::-;3638:63;;3594:117;3750:2;3776:53;3821:7;3812:6;3801:9;3797:22;3776:53;:::i;:::-;3766:63;;3721:118;3878:2;3904:53;3949:7;3940:6;3929:9;3925:22;3904:53;:::i;:::-;3894:63;;3849:118;4034:2;4023:9;4019:18;4006:32;4065:18;4057:6;4054:30;4051:2;;;4097:1;4094;4087:12;4051:2;4125:62;4179:7;4170:6;4159:9;4155:22;4125:62;:::i;:::-;4115:72;;3977:220;3521:683;;;;;;;:::o;4210:401::-;;;4332:2;4320:9;4311:7;4307:23;4303:32;4300:2;;;4348:1;4345;4338:12;4300:2;4391:1;4416:53;4461:7;4452:6;4441:9;4437:22;4416:53;:::i;:::-;4406:63;;4362:117;4518:2;4544:50;4586:7;4577:6;4566:9;4562:22;4544:50;:::i;:::-;4534:60;;4489:115;4290:321;;;;;:::o;4617:407::-;;;4742:2;4730:9;4721:7;4717:23;4713:32;4710:2;;;4758:1;4755;4748:12;4710:2;4801:1;4826:53;4871:7;4862:6;4851:9;4847:22;4826:53;:::i;:::-;4816:63;;4772:117;4928:2;4954:53;4999:7;4990:6;4979:9;4975:22;4954:53;:::i;:::-;4944:63;;4899:118;4700:324;;;;;:::o;5030:284::-;;5149:2;5137:9;5128:7;5124:23;5120:32;5117:2;;;5165:1;5162;5155:12;5117:2;5208:1;5233:64;5289:7;5280:6;5269:9;5265:22;5233:64;:::i;:::-;5223:74;;5179:128;5107:207;;;;:::o;5320:260::-;;5427:2;5415:9;5406:7;5402:23;5398:32;5395:2;;;5443:1;5440;5433:12;5395:2;5486:1;5511:52;5555:7;5546:6;5535:9;5531:22;5511:52;:::i;:::-;5501:62;;5457:116;5385:195;;;;:::o;5586:282::-;;5704:2;5692:9;5683:7;5679:23;5675:32;5672:2;;;5720:1;5717;5710:12;5672:2;5763:1;5788:63;5843:7;5834:6;5823:9;5819:22;5788:63;:::i;:::-;5778:73;;5734:127;5662:206;;;;:::o;5874:375::-;;5992:2;5980:9;5971:7;5967:23;5963:32;5960:2;;;6008:1;6005;5998:12;5960:2;6079:1;6068:9;6064:17;6051:31;6109:18;6101:6;6098:30;6095:2;;;6141:1;6138;6131:12;6095:2;6169:63;6224:7;6215:6;6204:9;6200:22;6169:63;:::i;:::-;6159:73;;6022:220;5950:299;;;;:::o;6255:262::-;;6363:2;6351:9;6342:7;6338:23;6334:32;6331:2;;;6379:1;6376;6369:12;6331:2;6422:1;6447:53;6492:7;6483:6;6472:9;6468:22;6447:53;:::i;:::-;6437:63;;6393:117;6321:196;;;;:::o;6523:520::-;;;6658:2;6646:9;6637:7;6633:23;6629:32;6626:2;;;6674:1;6671;6664:12;6626:2;6717:1;6742:53;6787:7;6778:6;6767:9;6763:22;6742:53;:::i;:::-;6732:63;;6688:117;6872:2;6861:9;6857:18;6844:32;6903:18;6895:6;6892:30;6889:2;;;6935:1;6932;6925:12;6889:2;6963:63;7018:7;7009:6;6998:9;6994:22;6963:63;:::i;:::-;6953:73;;6815:221;6616:427;;;;;:::o;7049:179::-;;7139:46;7181:3;7173:6;7139:46;:::i;:::-;7217:4;7212:3;7208:14;7194:28;;7129:99;;;;:::o;7234:147::-;7329:45;7368:5;7329:45;:::i;:::-;7324:3;7317:58;7307:74;;:::o;7387:142::-;7490:32;7516:5;7490:32;:::i;:::-;7485:3;7478:45;7468:61;;:::o;7535:118::-;7622:24;7640:5;7622:24;:::i;:::-;7617:3;7610:37;7600:53;;:::o;7689:732::-;;7837:54;7885:5;7837:54;:::i;:::-;7907:86;7986:6;7981:3;7907:86;:::i;:::-;7900:93;;8017:56;8067:5;8017:56;:::i;:::-;8096:7;8127:1;8112:284;8137:6;8134:1;8131:13;8112:284;;;8213:6;8207:13;8240:63;8299:3;8284:13;8240:63;:::i;:::-;8233:70;;8326:60;8379:6;8326:60;:::i;:::-;8316:70;;8172:224;8159:1;8156;8152:9;8147:14;;8112:284;;;8116:14;8412:3;8405:10;;7813:608;;;;;;;:::o;8427:109::-;8508:21;8523:5;8508:21;:::i;:::-;8503:3;8496:34;8486:50;;:::o;8542:360::-;;8656:38;8688:5;8656:38;:::i;:::-;8710:70;8773:6;8768:3;8710:70;:::i;:::-;8703:77;;8789:52;8834:6;8829:3;8822:4;8815:5;8811:16;8789:52;:::i;:::-;8866:29;8888:6;8866:29;:::i;:::-;8861:3;8857:39;8850:46;;8632:270;;;;;:::o;8908:373::-;;9040:38;9072:5;9040:38;:::i;:::-;9094:88;9175:6;9170:3;9094:88;:::i;:::-;9087:95;;9191:52;9236:6;9231:3;9224:4;9217:5;9213:16;9191:52;:::i;:::-;9268:6;9263:3;9259:16;9252:23;;9016:265;;;;;:::o;9309:1001::-;;9451:5;9445:12;9488:1;9477:9;9473:17;9504:1;9499:300;;;;9813:1;9808:496;;;;9466:838;;9499:300;9589:4;9585:1;9574:9;9570:17;9566:28;9614:88;9695:6;9690:3;9614:88;:::i;:::-;9607:95;;9746:4;9742:9;9731;9727:25;9722:3;9715:38;9782:6;9777:3;9773:16;9766:23;;9506:293;9499:300;;9808:496;9889:1;9878:9;9874:17;9911:88;9992:6;9987:3;9911:88;:::i;:::-;9904:95;;10027:41;10062:5;10027:41;:::i;:::-;10090:1;10104:154;10118:6;10115:1;10112:13;10104:154;;;10192:7;10186:14;10182:1;10177:3;10173:11;10166:35;10242:1;10233:7;10229:15;10218:26;;10140:4;10137:1;10133:12;10128:17;;10104:154;;;10287:6;10282:3;10278:16;10271:23;;9815:489;;;9466:838;;9418:892;;;;;:::o;10316:364::-;;10432:39;10465:5;10432:39;:::i;:::-;10487:71;10551:6;10546:3;10487:71;:::i;:::-;10480:78;;10567:52;10612:6;10607:3;10600:4;10593:5;10589:16;10567:52;:::i;:::-;10644:29;10666:6;10644:29;:::i;:::-;10639:3;10635:39;10628:46;;10408:272;;;;;:::o;10686:377::-;;10820:39;10853:5;10820:39;:::i;:::-;10875:89;10957:6;10952:3;10875:89;:::i;:::-;10868:96;;10973:52;11018:6;11013:3;11006:4;10999:5;10995:16;10973:52;:::i;:::-;11050:6;11045:3;11041:16;11034:23;;10796:267;;;;;:::o;11093:937::-;;11215:5;11209:12;11252:1;11241:9;11237:17;11268:1;11263:281;;;;11558:1;11553:471;;;;11230:794;;11263:281;11353:4;11349:1;11338:9;11334:17;11330:28;11378:71;11442:6;11437:3;11378:71;:::i;:::-;11371:78;;11493:4;11489:9;11478;11474:25;11469:3;11462:38;11529:4;11524:3;11520:14;11513:21;;11270:274;11263:281;;11553:471;11634:1;11623:9;11619:17;11656:71;11720:6;11715:3;11656:71;:::i;:::-;11649:78;;11755:38;11787:5;11755:38;:::i;:::-;11815:1;11829:154;11843:6;11840:1;11837:13;11829:154;;;11917:7;11911:14;11907:1;11902:3;11898:11;11891:35;11967:1;11958:7;11954:15;11943:26;;11865:4;11862:1;11858:12;11853:17;;11829:154;;;12012:1;12007:3;12003:11;11996:18;;11560:464;;;11230:794;;11182:848;;;;;:::o;12036:366::-;;12199:67;12263:2;12258:3;12199:67;:::i;:::-;12192:74;;12296:34;12292:1;12287:3;12283:11;12276:55;12362:4;12357:2;12352:3;12348:12;12341:26;12393:2;12388:3;12384:12;12377:19;;12182:220;;;:::o;12408:324::-;;12571:67;12635:2;12630:3;12571:67;:::i;:::-;12564:74;;12668:28;12664:1;12659:3;12655:11;12648:49;12723:2;12718:3;12714:12;12707:19;;12554:178;;;:::o;12738:382::-;;12901:67;12965:2;12960:3;12901:67;:::i;:::-;12894:74;;12998:34;12994:1;12989:3;12985:11;12978:55;13064:20;13059:2;13054:3;13050:12;13043:42;13111:2;13106:3;13102:12;13095:19;;12884:236;;;:::o;13126:370::-;;13289:67;13353:2;13348:3;13289:67;:::i;:::-;13282:74;;13386:34;13382:1;13377:3;13373:11;13366:55;13452:8;13447:2;13442:3;13438:12;13431:30;13487:2;13482:3;13478:12;13471:19;;13272:224;;;:::o;13502:369::-;;13665:67;13729:2;13724:3;13665:67;:::i;:::-;13658:74;;13762:34;13758:1;13753:3;13749:11;13742:55;13828:7;13823:2;13818:3;13814:12;13807:29;13862:2;13857:3;13853:12;13846:19;;13648:223;;;:::o;13877:326::-;;14040:67;14104:2;14099:3;14040:67;:::i;:::-;14033:74;;14137:30;14133:1;14128:3;14124:11;14117:51;14194:2;14189:3;14185:12;14178:19;;14023:180;;;:::o;14209:325::-;;14372:67;14436:2;14431:3;14372:67;:::i;:::-;14365:74;;14469:29;14465:1;14460:3;14456:11;14449:50;14525:2;14520:3;14516:12;14509:19;;14355:179;;;:::o;14540:324::-;;14703:67;14767:2;14762:3;14703:67;:::i;:::-;14696:74;;14800:28;14796:1;14791:3;14787:11;14780:49;14855:2;14850:3;14846:12;14839:19;;14686:178;;;:::o;14870:330::-;;15033:67;15097:2;15092:3;15033:67;:::i;:::-;15026:74;;15130:34;15126:1;15121:3;15117:11;15110:55;15191:2;15186:3;15182:12;15175:19;;15016:184;;;:::o;15206:368::-;;15369:67;15433:2;15428:3;15369:67;:::i;:::-;15362:74;;15466:34;15462:1;15457:3;15453:11;15446:55;15532:6;15527:2;15522:3;15518:12;15511:28;15565:2;15560:3;15556:12;15549:19;;15352:222;;;:::o;15580:323::-;;15743:67;15807:2;15802:3;15743:67;:::i;:::-;15736:74;;15840:27;15836:1;15831:3;15827:11;15820:48;15894:2;15889:3;15885:12;15878:19;;15726:177;;;:::o;15909:329::-;;16072:67;16136:2;16131:3;16072:67;:::i;:::-;16065:74;;16169:33;16165:1;16160:3;16156:11;16149:54;16229:2;16224:3;16220:12;16213:19;;16055:183;;;:::o;16244:328::-;;16407:67;16471:2;16466:3;16407:67;:::i;:::-;16400:74;;16504:32;16500:1;16495:3;16491:11;16484:53;16563:2;16558:3;16554:12;16547:19;;16390:182;;;:::o;16578:370::-;;16741:67;16805:2;16800:3;16741:67;:::i;:::-;16734:74;;16838:34;16834:1;16829:3;16825:11;16818:55;16904:8;16899:2;16894:3;16890:12;16883:30;16939:2;16934:3;16930:12;16923:19;;16724:224;;;:::o;16954:376::-;;17117:67;17181:2;17176:3;17117:67;:::i;:::-;17110:74;;17214:34;17210:1;17205:3;17201:11;17194:55;17280:14;17275:2;17270:3;17266:12;17259:36;17321:2;17316:3;17312:12;17305:19;;17100:230;;;:::o;17336:365::-;;17499:67;17563:2;17558:3;17499:67;:::i;:::-;17492:74;;17596:34;17592:1;17587:3;17583:11;17576:55;17662:3;17657:2;17652:3;17648:12;17641:25;17692:2;17687:3;17683:12;17676:19;;17482:219;;;:::o;17707:373::-;;17870:67;17934:2;17929:3;17870:67;:::i;:::-;17863:74;;17967:34;17963:1;17958:3;17954:11;17947:55;18033:11;18028:2;18023:3;18019:12;18012:33;18071:2;18066:3;18062:12;18055:19;;17853:227;;;:::o;18086:388::-;;18249:67;18313:2;18308:3;18249:67;:::i;:::-;18242:74;;18346:34;18342:1;18337:3;18333:11;18326:55;18412:26;18407:2;18402:3;18398:12;18391:48;18465:2;18460:3;18456:12;18449:19;;18232:242;;;:::o;18480:374::-;;18643:67;18707:2;18702:3;18643:67;:::i;:::-;18636:74;;18740:34;18736:1;18731:3;18727:11;18720:55;18806:12;18801:2;18796:3;18792:12;18785:34;18845:2;18840:3;18836:12;18829:19;;18626:228;;;:::o;18860:366::-;;19023:67;19087:2;19082:3;19023:67;:::i;:::-;19016:74;;19120:34;19116:1;19111:3;19107:11;19100:55;19186:4;19181:2;19176:3;19172:12;19165:26;19217:2;19212:3;19208:12;19201:19;;19006:220;;;:::o;19232:330::-;;19395:67;19459:2;19454:3;19395:67;:::i;:::-;19388:74;;19492:34;19488:1;19483:3;19479:11;19472:55;19553:2;19548:3;19544:12;19537:19;;19378:184;;;:::o;19568:365::-;;19731:67;19795:2;19790:3;19731:67;:::i;:::-;19724:74;;19828:34;19824:1;19819:3;19815:11;19808:55;19894:3;19889:2;19884:3;19880:12;19873:25;19924:2;19919:3;19915:12;19908:19;;19714:219;;;:::o;19939:376::-;;20102:67;20166:2;20161:3;20102:67;:::i;:::-;20095:74;;20199:34;20195:1;20190:3;20186:11;20179:55;20265:14;20260:2;20255:3;20251:12;20244:36;20306:2;20301:3;20297:12;20290:19;;20085:230;;;:::o;20321:330::-;;20484:67;20548:2;20543:3;20484:67;:::i;:::-;20477:74;;20581:34;20577:1;20572:3;20568:11;20561:55;20642:2;20637:3;20633:12;20626:19;;20467:184;;;:::o;20657:373::-;;20820:67;20884:2;20879:3;20820:67;:::i;:::-;20813:74;;20917:34;20913:1;20908:3;20904:11;20897:55;20983:11;20978:2;20973:3;20969:12;20962:33;21021:2;21016:3;21012:12;21005:19;;20803:227;;;:::o;21036:379::-;;21199:67;21263:2;21258:3;21199:67;:::i;:::-;21192:74;;21296:34;21292:1;21287:3;21283:11;21276:55;21362:17;21357:2;21352:3;21348:12;21341:39;21406:2;21401:3;21397:12;21390:19;;21182:233;;;:::o;21421:367::-;;21584:67;21648:2;21643:3;21584:67;:::i;:::-;21577:74;;21681:34;21677:1;21672:3;21668:11;21661:55;21747:5;21742:2;21737:3;21733:12;21726:27;21779:2;21774:3;21770:12;21763:19;;21567:221;;;:::o;21794:365::-;;21957:67;22021:2;22016:3;21957:67;:::i;:::-;21950:74;;22054:34;22050:1;22045:3;22041:11;22034:55;22120:3;22115:2;22110:3;22106:12;22099:25;22150:2;22145:3;22141:12;22134:19;;21940:219;;;:::o;22165:320::-;;22328:67;22392:2;22387:3;22328:67;:::i;:::-;22321:74;;22425:24;22421:1;22416:3;22412:11;22405:45;22476:2;22471:3;22467:12;22460:19;;22311:174;;;:::o;22491:381::-;;22654:67;22718:2;22713:3;22654:67;:::i;:::-;22647:74;;22751:34;22747:1;22742:3;22738:11;22731:55;22817:19;22812:2;22807:3;22803:12;22796:41;22863:2;22858:3;22854:12;22847:19;;22637:235;;;:::o;22878:327::-;;23041:67;23105:2;23100:3;23041:67;:::i;:::-;23034:74;;23138:31;23134:1;23129:3;23125:11;23118:52;23196:2;23191:3;23187:12;23180:19;;23024:181;;;:::o;23211:371::-;;23374:67;23438:2;23433:3;23374:67;:::i;:::-;23367:74;;23471:34;23467:1;23462:3;23458:11;23451:55;23537:9;23532:2;23527:3;23523:12;23516:31;23573:2;23568:3;23564:12;23557:19;;23357:225;;;:::o;23588:108::-;23665:24;23683:5;23665:24;:::i;:::-;23660:3;23653:37;23643:53;;:::o;23702:118::-;23789:24;23807:5;23789:24;:::i;:::-;23784:3;23777:37;23767:53;;:::o;23826:271::-;;23978:93;24067:3;24058:6;23978:93;:::i;:::-;23971:100;;24088:3;24081:10;;23960:137;;;;:::o;24103:273::-;;24256:94;24346:3;24337:6;24256:94;:::i;:::-;24249:101;;24367:3;24360:10;;24238:138;;;;:::o;24382:435::-;;24584:95;24675:3;24666:6;24584:95;:::i;:::-;24577:102;;24696:95;24787:3;24778:6;24696:95;:::i;:::-;24689:102;;24808:3;24801:10;;24566:251;;;;;:::o;24823:222::-;;24954:2;24943:9;24939:18;24931:26;;24967:71;25035:1;25024:9;25020:17;25011:6;24967:71;:::i;:::-;24921:124;;;;:::o;25051:672::-;;25300:3;25289:9;25285:19;25277:27;;25314:87;25398:1;25387:9;25383:17;25374:6;25314:87;:::i;:::-;25411:72;25479:2;25468:9;25464:18;25455:6;25411:72;:::i;:::-;25493;25561:2;25550:9;25546:18;25537:6;25493:72;:::i;:::-;25612:9;25606:4;25602:20;25597:2;25586:9;25582:18;25575:48;25640:76;25711:4;25702:6;25640:76;:::i;:::-;25632:84;;25267:456;;;;;;;:::o;25729:549::-;;25944:2;25933:9;25929:18;25921:26;;25957:79;26033:1;26022:9;26018:17;26009:6;25957:79;:::i;:::-;26046:72;26114:2;26103:9;26099:18;26090:6;26046:72;:::i;:::-;26165:9;26159:4;26155:20;26150:2;26139:9;26135:18;26128:48;26193:78;26266:4;26257:6;26193:78;:::i;:::-;26185:86;;25911:367;;;;;;:::o;26284:373::-;;26465:2;26454:9;26450:18;26442:26;;26514:9;26508:4;26504:20;26500:1;26489:9;26485:17;26478:47;26542:108;26645:4;26636:6;26542:108;:::i;:::-;26534:116;;26432:225;;;;:::o;26663:210::-;;26788:2;26777:9;26773:18;26765:26;;26801:65;26863:1;26852:9;26848:17;26839:6;26801:65;:::i;:::-;26755:118;;;;:::o;26879:313::-;;27030:2;27019:9;27015:18;27007:26;;27079:9;27073:4;27069:20;27065:1;27054:9;27050:17;27043:47;27107:78;27180:4;27171:6;27107:78;:::i;:::-;27099:86;;26997:195;;;;:::o;27198:307::-;;27346:2;27335:9;27331:18;27323:26;;27395:9;27389:4;27385:20;27381:1;27370:9;27366:17;27359:47;27423:75;27493:4;27484:6;27423:75;:::i;:::-;27415:83;;27313:192;;;;:::o;27511:419::-;;27715:2;27704:9;27700:18;27692:26;;27764:9;27758:4;27754:20;27750:1;27739:9;27735:17;27728:47;27792:131;27918:4;27792:131;:::i;:::-;27784:139;;27682:248;;;:::o;27936:419::-;;28140:2;28129:9;28125:18;28117:26;;28189:9;28183:4;28179:20;28175:1;28164:9;28160:17;28153:47;28217:131;28343:4;28217:131;:::i;:::-;28209:139;;28107:248;;;:::o;28361:419::-;;28565:2;28554:9;28550:18;28542:26;;28614:9;28608:4;28604:20;28600:1;28589:9;28585:17;28578:47;28642:131;28768:4;28642:131;:::i;:::-;28634:139;;28532:248;;;:::o;28786:419::-;;28990:2;28979:9;28975:18;28967:26;;29039:9;29033:4;29029:20;29025:1;29014:9;29010:17;29003:47;29067:131;29193:4;29067:131;:::i;:::-;29059:139;;28957:248;;;:::o;29211:419::-;;29415:2;29404:9;29400:18;29392:26;;29464:9;29458:4;29454:20;29450:1;29439:9;29435:17;29428:47;29492:131;29618:4;29492:131;:::i;:::-;29484:139;;29382:248;;;:::o;29636:419::-;;29840:2;29829:9;29825:18;29817:26;;29889:9;29883:4;29879:20;29875:1;29864:9;29860:17;29853:47;29917:131;30043:4;29917:131;:::i;:::-;29909:139;;29807:248;;;:::o;30061:419::-;;30265:2;30254:9;30250:18;30242:26;;30314:9;30308:4;30304:20;30300:1;30289:9;30285:17;30278:47;30342:131;30468:4;30342:131;:::i;:::-;30334:139;;30232:248;;;:::o;30486:419::-;;30690:2;30679:9;30675:18;30667:26;;30739:9;30733:4;30729:20;30725:1;30714:9;30710:17;30703:47;30767:131;30893:4;30767:131;:::i;:::-;30759:139;;30657:248;;;:::o;30911:419::-;;31115:2;31104:9;31100:18;31092:26;;31164:9;31158:4;31154:20;31150:1;31139:9;31135:17;31128:47;31192:131;31318:4;31192:131;:::i;:::-;31184:139;;31082:248;;;:::o;31336:419::-;;31540:2;31529:9;31525:18;31517:26;;31589:9;31583:4;31579:20;31575:1;31564:9;31560:17;31553:47;31617:131;31743:4;31617:131;:::i;:::-;31609:139;;31507:248;;;:::o;31761:419::-;;31965:2;31954:9;31950:18;31942:26;;32014:9;32008:4;32004:20;32000:1;31989:9;31985:17;31978:47;32042:131;32168:4;32042:131;:::i;:::-;32034:139;;31932:248;;;:::o;32186:419::-;;32390:2;32379:9;32375:18;32367:26;;32439:9;32433:4;32429:20;32425:1;32414:9;32410:17;32403:47;32467:131;32593:4;32467:131;:::i;:::-;32459:139;;32357:248;;;:::o;32611:419::-;;32815:2;32804:9;32800:18;32792:26;;32864:9;32858:4;32854:20;32850:1;32839:9;32835:17;32828:47;32892:131;33018:4;32892:131;:::i;:::-;32884:139;;32782:248;;;:::o;33036:419::-;;33240:2;33229:9;33225:18;33217:26;;33289:9;33283:4;33279:20;33275:1;33264:9;33260:17;33253:47;33317:131;33443:4;33317:131;:::i;:::-;33309:139;;33207:248;;;:::o;33461:419::-;;33665:2;33654:9;33650:18;33642:26;;33714:9;33708:4;33704:20;33700:1;33689:9;33685:17;33678:47;33742:131;33868:4;33742:131;:::i;:::-;33734:139;;33632:248;;;:::o;33886:419::-;;34090:2;34079:9;34075:18;34067:26;;34139:9;34133:4;34129:20;34125:1;34114:9;34110:17;34103:47;34167:131;34293:4;34167:131;:::i;:::-;34159:139;;34057:248;;;:::o;34311:419::-;;34515:2;34504:9;34500:18;34492:26;;34564:9;34558:4;34554:20;34550:1;34539:9;34535:17;34528:47;34592:131;34718:4;34592:131;:::i;:::-;34584:139;;34482:248;;;:::o;34736:419::-;;34940:2;34929:9;34925:18;34917:26;;34989:9;34983:4;34979:20;34975:1;34964:9;34960:17;34953:47;35017:131;35143:4;35017:131;:::i;:::-;35009:139;;34907:248;;;:::o;35161:419::-;;35365:2;35354:9;35350:18;35342:26;;35414:9;35408:4;35404:20;35400:1;35389:9;35385:17;35378:47;35442:131;35568:4;35442:131;:::i;:::-;35434:139;;35332:248;;;:::o;35586:419::-;;35790:2;35779:9;35775:18;35767:26;;35839:9;35833:4;35829:20;35825:1;35814:9;35810:17;35803:47;35867:131;35993:4;35867:131;:::i;:::-;35859:139;;35757:248;;;:::o;36011:419::-;;36215:2;36204:9;36200:18;36192:26;;36264:9;36258:4;36254:20;36250:1;36239:9;36235:17;36228:47;36292:131;36418:4;36292:131;:::i;:::-;36284:139;;36182:248;;;:::o;36436:419::-;;36640:2;36629:9;36625:18;36617:26;;36689:9;36683:4;36679:20;36675:1;36664:9;36660:17;36653:47;36717:131;36843:4;36717:131;:::i;:::-;36709:139;;36607:248;;;:::o;36861:419::-;;37065:2;37054:9;37050:18;37042:26;;37114:9;37108:4;37104:20;37100:1;37089:9;37085:17;37078:47;37142:131;37268:4;37142:131;:::i;:::-;37134:139;;37032:248;;;:::o;37286:419::-;;37490:2;37479:9;37475:18;37467:26;;37539:9;37533:4;37529:20;37525:1;37514:9;37510:17;37503:47;37567:131;37693:4;37567:131;:::i;:::-;37559:139;;37457:248;;;:::o;37711:419::-;;37915:2;37904:9;37900:18;37892:26;;37964:9;37958:4;37954:20;37950:1;37939:9;37935:17;37928:47;37992:131;38118:4;37992:131;:::i;:::-;37984:139;;37882:248;;;:::o;38136:419::-;;38340:2;38329:9;38325:18;38317:26;;38389:9;38383:4;38379:20;38375:1;38364:9;38360:17;38353:47;38417:131;38543:4;38417:131;:::i;:::-;38409:139;;38307:248;;;:::o;38561:419::-;;38765:2;38754:9;38750:18;38742:26;;38814:9;38808:4;38804:20;38800:1;38789:9;38785:17;38778:47;38842:131;38968:4;38842:131;:::i;:::-;38834:139;;38732:248;;;:::o;38986:419::-;;39190:2;39179:9;39175:18;39167:26;;39239:9;39233:4;39229:20;39225:1;39214:9;39210:17;39203:47;39267:131;39393:4;39267:131;:::i;:::-;39259:139;;39157:248;;;:::o;39411:419::-;;39615:2;39604:9;39600:18;39592:26;;39664:9;39658:4;39654:20;39650:1;39639:9;39635:17;39628:47;39692:131;39818:4;39692:131;:::i;:::-;39684:139;;39582:248;;;:::o;39836:419::-;;40040:2;40029:9;40025:18;40017:26;;40089:9;40083:4;40079:20;40075:1;40064:9;40060:17;40053:47;40117:131;40243:4;40117:131;:::i;:::-;40109:139;;40007:248;;;:::o;40261:419::-;;40465:2;40454:9;40450:18;40442:26;;40514:9;40508:4;40504:20;40500:1;40489:9;40485:17;40478:47;40542:131;40668:4;40542:131;:::i;:::-;40534:139;;40432:248;;;:::o;40686:419::-;;40890:2;40879:9;40875:18;40867:26;;40939:9;40933:4;40929:20;40925:1;40914:9;40910:17;40903:47;40967:131;41093:4;40967:131;:::i;:::-;40959:139;;40857:248;;;:::o;41111:222::-;;41242:2;41231:9;41227:18;41219:26;;41255:71;41323:1;41312:9;41308:17;41299:6;41255:71;:::i;:::-;41209:124;;;;:::o;41339:278::-;;41405:2;41399:9;41389:19;;41447:4;41439:6;41435:17;41554:6;41542:10;41539:22;41518:18;41506:10;41503:34;41500:62;41497:2;;;41565:13;;:::i;:::-;41497:2;41600:10;41596:2;41589:22;41379:238;;;;:::o;41623:326::-;;41774:18;41766:6;41763:30;41760:2;;;41796:13;;:::i;:::-;41760:2;41876:4;41872:9;41865:4;41857:6;41853:17;41849:33;41841:41;;41937:4;41931;41927:15;41919:23;;41689:260;;;:::o;41955:327::-;;42107:18;42099:6;42096:30;42093:2;;;42129:13;;:::i;:::-;42093:2;42209:4;42205:9;42198:4;42190:6;42186:17;42182:33;42174:41;;42270:4;42264;42260:15;42252:23;;42022:260;;;:::o;42288:132::-;;42378:3;42370:11;;42408:4;42403:3;42399:14;42391:22;;42360:60;;;:::o;42426:144::-;;42501:3;42493:11;;42524:3;42521:1;42514:14;42558:4;42555:1;42545:18;42537:26;;42483:87;;;:::o;42576:141::-;;42648:3;42640:11;;42671:3;42668:1;42661:14;42705:4;42702:1;42692:18;42684:26;;42630:87;;;:::o;42723:114::-;;42824:5;42818:12;42808:22;;42797:40;;;:::o;42843:98::-;;42928:5;42922:12;42912:22;;42901:40;;;:::o;42947:99::-;;43033:5;43027:12;43017:22;;43006:40;;;:::o;43052:113::-;;43154:4;43149:3;43145:14;43137:22;;43127:38;;;:::o;43171:184::-;;43304:6;43299:3;43292:19;43344:4;43339:3;43335:14;43320:29;;43282:73;;;;:::o;43361:168::-;;43478:6;43473:3;43466:19;43518:4;43513:3;43509:14;43494:29;;43456:73;;;;:::o;43535:147::-;;43673:3;43658:18;;43648:34;;;;:::o;43688:169::-;;43806:6;43801:3;43794:19;43846:4;43841:3;43837:14;43822:29;;43784:73;;;;:::o;43863:148::-;;44002:3;43987:18;;43977:34;;;;:::o;44017:96::-;;44083:24;44101:5;44083:24;:::i;:::-;44072:35;;44062:51;;;:::o;44119:104::-;;44193:24;44211:5;44193:24;:::i;:::-;44182:35;;44172:51;;;:::o;44229:90::-;;44306:5;44299:13;44292:21;44281:32;;44271:48;;;:::o;44325:77::-;;44391:5;44380:16;;44370:32;;;:::o;44408:149::-;;44484:66;44477:5;44473:78;44462:89;;44452:105;;;:::o;44563:126::-;;44640:42;44633:5;44629:54;44618:65;;44608:81;;;:::o;44695:77::-;;44761:5;44750:16;;44740:32;;;:::o;44778:134::-;;44869:37;44900:5;44869:37;:::i;:::-;44856:50;;44846:66;;;:::o;44918:126::-;;45001:37;45032:5;45001:37;:::i;:::-;44988:50;;44978:66;;;:::o;45050:113::-;;45133:24;45151:5;45133:24;:::i;:::-;45120:37;;45110:53;;;:::o;45169:154::-;45253:6;45248:3;45243;45230:30;45315:1;45306:6;45301:3;45297:16;45290:27;45220:103;;;:::o;45329:307::-;45397:1;45407:113;45421:6;45418:1;45415:13;45407:113;;;45506:1;45501:3;45497:11;45491:18;45487:1;45482:3;45478:11;45471:39;45443:2;45440:1;45436:10;45431:15;;45407:113;;;45538:6;45535:1;45532:13;45529:2;;;45618:1;45609:6;45604:3;45600:16;45593:27;45529:2;45378:258;;;;:::o;45642:48::-;45675:9;45696:102;;45788:2;45784:7;45779:2;45772:5;45768:14;45764:28;45754:38;;45744:54;;;:::o;45804:122::-;45877:24;45895:5;45877:24;:::i;:::-;45870:5;45867:35;45857:2;;45916:1;45913;45906:12;45857:2;45847:79;:::o;45932:116::-;46002:21;46017:5;46002:21;:::i;:::-;45995:5;45992:32;45982:2;;46038:1;46035;46028:12;45982:2;45972:76;:::o;46054:122::-;46127:24;46145:5;46127:24;:::i;:::-;46120:5;46117:35;46107:2;;46166:1;46163;46156:12;46107:2;46097:79;:::o;46182:120::-;46254:23;46271:5;46254:23;:::i;:::-;46247:5;46244:34;46234:2;;46292:1;46289;46282:12;46234:2;46224:78;:::o;46308:122::-;46381:24;46399:5;46381:24;:::i;:::-;46374:5;46371:35;46361:2;;46420:1;46417;46410:12;46361:2;46351:79;:::o
Swarm Source
ipfs://630fe0efaf933b21f6eddb2342fdefaae7854fc1a30db7a7e391b956d0537604
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.