Overview
TokenID
6000008
Total Transfers
-
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Source Code Verified (Exact Match)
Contract Name:
DoTxNFT
Compiler Version
v0.8.1+commit.df193b15
Contract Source Code (Solidity Multiple files format)
pragma solidity ^0.8.0; import "./ERC721Burnable.sol"; import "./ERC721Pausable.sol"; import "./Ownable.sol"; contract DoTxNFT is ERC721, ERC721Burnable, ERC721Pausable, Ownable { mapping(uint256 => uint256) public nextHouseId; mapping(uint256 => uint256) public supply; uint32 public constant ID_TO_HOUSE = 1000000; event NewHouse(uint256 id, uint256 maxSupply); constructor(string memory _baseUrl) public ERC721("DeFi of Thrones", "DoTxNFT"){ setBaseURI(_baseUrl); } function newHouse(uint256 _houseId, uint256 _maxSupply) external onlyOwner { require(_maxSupply <= ID_TO_HOUSE, "DoTxNFT: max supply too high"); require(supply[_houseId] == 0, "DoTxNFT: house already exist"); supply[_houseId] = _maxSupply; NewHouse(_houseId, _maxSupply); } function mintHousesBatch(address _to, uint256[] memory _houseIds, uint256[] memory _count) public onlyOwner { for(uint256 i=0; i < _houseIds.length; i++){ mintBatch(_to, _houseIds[i], _count[i]); } } function mintBatch(address _to, uint256 _houseId, uint256 _count) public onlyOwner { require(supply[_houseId] != 0, "DoTxNFT: house does not exist"); for(uint256 i=0; i < _count; i++){ mint(_to, _houseId); } } function mint(address _to, uint256 _houseId) private onlyOwner { require(nextHouseId[_houseId] < supply[_houseId], "DoTxNFT: house sold out"); nextHouseId[_houseId]++; uint256 tokenId = _houseId * ID_TO_HOUSE + nextHouseId[_houseId]; _mint(_to, tokenId); } function pause() public onlyOwner { _pause(); } function unpause() public onlyOwner { _unpause(); } function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual override(ERC721, ERC721Pausable) { super._beforeTokenTransfer(from, to, tokenId); } function setBaseURI(string memory _baseUrl) public onlyOwner{ _setBaseURI(_baseUrl); } function getTokensByOwner(address _owner) public view returns(uint256[] memory ownerTokens) { uint256 tokenCount = balanceOf(_owner); if (tokenCount == 0) { // Return an empty array return new uint256[](0); } else { uint256[] memory result = new uint256[](tokenCount); for (uint256 index = 0; index < tokenCount; index++) { result[index] = tokenOfOwnerByIndex(_owner, index); } return result; } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./EnumerableSet.sol"; import "./Address.sol"; import "./Context.sol"; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context { using EnumerableSet for EnumerableSet.AddressSet; using Address for address; struct RoleData { EnumerableSet.AddressSet members; bytes32 adminRole; } mapping (bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view returns (bool) { return _roles[role].members.contains(account); } /** * @dev Returns the number of accounts that have `role`. Can be used * together with {getRoleMember} to enumerate all bearers of a role. */ function getRoleMemberCount(bytes32 role) public view returns (uint256) { return _roles[role].members.length(); } /** * @dev Returns one of the accounts that have `role`. `index` must be a * value between 0 and {getRoleMemberCount}, non-inclusive. * * Role bearers are not sorted in any particular way, and their ordering may * change at any point. * * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure * you perform all queries on the same block. See the following * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] * for more information. */ function getRoleMember(bytes32 role, uint256 index) public view returns (address) { return _roles[role].members.at(index); } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) public virtual { require(hasRole(_roles[role].adminRole, _msgSender()), "AccessControl: sender must be an admin to grant"); _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) public virtual { require(hasRole(_roles[role].adminRole, _msgSender()), "AccessControl: sender must be an admin to revoke"); _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) public virtual { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { emit RoleAdminChanged(role, _roles[role].adminRole, adminRole); _roles[role].adminRole = adminRole; } function _grantRole(bytes32 role, address account) private { if (_roles[role].members.add(account)) { emit RoleGranted(role, account, _msgSender()); } } function _revokeRole(bytes32 role, address account) private { if (_roles[role].members.remove(account)) { emit RoleRevoked(role, account, _msgSender()); } } }
// SPDX-License-Identifier: MIT pragma solidity ^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); } } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with 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) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } }
// SPDX-License-Identifier: MIT pragma solidity ^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)))); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. */ library 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)); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @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 { /** * @dev Mapping of interface ids to whether or not it's supported. */ mapping(bytes4 => bool) private _supportedInterfaces; constructor () { // Derived contracts need only register support for their own interfaces, // we register support for ERC165 itself here _registerInterface(type(IERC165).interfaceId); } /** * @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; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./Context.sol"; import "./IERC721.sol"; import "./IERC721Metadata.sol"; import "./IERC721Enumerable.sol"; import "./IERC721Receiver.sol"; import "./ERC165.sol"; import "./Address.sol"; import "./EnumerableSet.sol"; import "./EnumerableMap.sol"; import "./Strings.sol"; /** * @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 Address for address; using EnumerableSet for EnumerableSet.UintSet; using EnumerableMap for EnumerableMap.UintToAddressMap; using Strings for uint256; // 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; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor (string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; // register the supported interfaces to conform to ERC721 via ERC165 _registerInterface(type(IERC721).interfaceId); _registerInterface(type(IERC721Metadata).interfaceId); _registerInterface(type(IERC721Enumerable).interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _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()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { // solhint-disable-next-line no-inline-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } function _approve(address to, uint256 tokenId) private { _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 { } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./Context.sol"; import "./ERC721.sol"; /** * @title ERC721 Burnable Token * @dev ERC721 Token that can be irreversibly burned (destroyed). */ abstract contract ERC721Burnable is Context, ERC721 { /** * @dev Burns `tokenId`. See {ERC721-_burn}. * * Requirements: * * - The caller must own `tokenId` or be an approved operator. */ function burn(uint256 tokenId) public virtual { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved"); _burn(tokenId); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC721Receiver.sol"; /** * @dev Implementation of the {IERC721Receiver} interface. * * Accepts all token transfers. * Make sure the contract is able to use its token with {IERC721-safeTransferFrom}, {IERC721-approve} or {IERC721-setApprovalForAll}. */ contract ERC721Holder is IERC721Receiver { /** * @dev See {IERC721Receiver-onERC721Received}. * * Always returns `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received(address, address, uint256, bytes memory) public virtual override returns (bytes4) { return this.onERC721Received.selector; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./ERC721.sol"; import "./Pausable.sol"; /** * @dev ERC721 token with pausable token transfers, minting and burning. * * Useful for scenarios such as preventing trades until the end of an evaluation * period, or having an emergency switch for freezing all token transfers in the * event of a large bug. */ abstract contract ERC721Pausable is ERC721, Pausable { /** * @dev See {ERC721-_beforeTokenTransfer}. * * Requirements: * * - the contract must not be paused. */ function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); require(!paused(), "ERC721Pausable: token transfer while paused"); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 tokenId) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 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); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC721.sol"; /** * @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); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface 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); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./Context.sol"; /** * @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 () { 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; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./Context.sol"; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor () { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant alphabet = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = alphabet[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"string","name":"_baseUrl","type":"string"}],"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":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"maxSupply","type":"uint256"}],"name":"NewHouse","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"ID_TO_HOUSE","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"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"}],"name":"burn","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":"address","name":"_owner","type":"address"}],"name":"getTokensByOwner","outputs":[{"internalType":"uint256[]","name":"ownerTokens","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":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_houseId","type":"uint256"},{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"mintBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256[]","name":"_houseIds","type":"uint256[]"},{"internalType":"uint256[]","name":"_count","type":"uint256[]"}],"name":"mintHousesBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_houseId","type":"uint256"},{"internalType":"uint256","name":"_maxSupply","type":"uint256"}],"name":"newHouse","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"nextHouseId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseUrl","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"supply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b50604051620053353803806200533583398181016040528101906200003791906200056a565b6040518060400160405280600f81526020017f44654669206f66205468726f6e657300000000000000000000000000000000008152506040518060400160405280600781526020017f446f54784e465400000000000000000000000000000000000000000000000000815250620000d47f01ffc9a7000000000000000000000000000000000000000000000000000000006200027f60201b60201c565b8160069080519060200190620000ec92919062000448565b5080600790805190602001906200010592919062000448565b50620001377f80ac58cd000000000000000000000000000000000000000000000000000000006200027f60201b60201c565b620001687f5b5e139f000000000000000000000000000000000000000000000000000000006200027f60201b60201c565b620001997f780e9d63000000000000000000000000000000000000000000000000000000006200027f60201b60201c565b50506000600a60006101000a81548160ff0219169083151502179055506000620001c86200035760201b60201c565b905080600a60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35062000278816200035f60201b60201c565b5062000814565b63ffffffff60e01b817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415620002eb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002e290620005fd565b60405180910390fd5b6001600080837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600033905090565b6200036f6200035760201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620003956200040260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620003ee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003e5906200061f565b60405180910390fd5b620003ff816200042c60201b60201c565b50565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b80600990805190602001906200044492919062000448565b5050565b8280546200045690620006e7565b90600052602060002090601f0160209004810192826200047a5760008555620004c6565b82601f106200049557805160ff1916838001178555620004c6565b82800160010185558215620004c6579182015b82811115620004c5578251825591602001919060010190620004a8565b5b509050620004d59190620004d9565b5090565b5b80821115620004f4576000816000905550600101620004da565b5090565b60006200050f62000509846200066a565b62000641565b9050828152602081018484840111156200052857600080fd5b62000535848285620006b1565b509392505050565b600082601f8301126200054f57600080fd5b815162000561848260208601620004f8565b91505092915050565b6000602082840312156200057d57600080fd5b600082015167ffffffffffffffff8111156200059857600080fd5b620005a6848285016200053d565b91505092915050565b6000620005be601c83620006a0565b9150620005cb82620007c2565b602082019050919050565b6000620005e5602083620006a0565b9150620005f282620007eb565b602082019050919050565b600060208201905081810360008301526200061881620005af565b9050919050565b600060208201905081810360008301526200063a81620005d6565b9050919050565b60006200064d62000660565b90506200065b82826200071d565b919050565b6000604051905090565b600067ffffffffffffffff82111562000688576200068762000782565b5b6200069382620007b1565b9050602081019050919050565b600082825260208201905092915050565b60005b83811015620006d1578082015181840152602081019050620006b4565b83811115620006e1576000848401525b50505050565b600060028204905060018216806200070057607f821691505b6020821081141562000717576200071662000753565b5b50919050565b6200072882620007b1565b810181811067ffffffffffffffff821117156200074a576200074962000782565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4552433136353a20696e76616c696420696e7465726661636520696400000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b614b1180620008246000396000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c80635c975abb1161010f57806395d89b41116100a2578063c87b56dd11610071578063c87b56dd1461057d578063e81c9d6c146105ad578063e985e9c5146105dd578063f2fde38b1461060d576101f0565b806395d89b411461050b578063a22cb46514610529578063b565eda614610545578063b88d4fde14610561576101f0565b8063715018a6116100de578063715018a6146104bd5780638456cb59146104c75780638da5cb5b146104d15780638ec9c91b146104ef576101f0565b80635c975abb146104215780636352211e1461043f5780636c0360eb1461046f57806370a082311461048d576101f0565b80632f745c591161018757806342842e0e1161015657806342842e0e1461039d57806342966c68146103b95780634f6ccce7146103d557806355f804b314610405576101f0565b80632f745c591461030357806335403023146103335780633f4ba83a1461036357806340398d671461036d576101f0565b806318160ddd116101c357806318160ddd1461028f57806323b872dd146102ad5780632be7ba53146102c95780632e81aaea146102e7576101f0565b806301ffc9a7146101f557806306fdde0314610225578063081812fc14610243578063095ea7b314610273575b600080fd5b61020f600480360381019061020a9190613537565b610629565b60405161021c9190613bab565b60405180910390f35b61022d610690565b60405161023a9190613bc6565b60405180910390f35b61025d600480360381019061025891906135ca565b610722565b60405161026a9190613b22565b60405180910390f35b61028d600480360381019061028891906134ac565b6107a7565b005b6102976108bf565b6040516102a49190613f08565b60405180910390f35b6102c760048036038101906102c29190613327565b6108d0565b005b6102d1610930565b6040516102de9190613f4c565b60405180910390f35b61030160048036038101906102fc91906134e8565b610937565b005b61031d600480360381019061031891906134ac565b610a38565b60405161032a9190613f08565b60405180910390f35b61034d600480360381019061034891906135ca565b610a93565b60405161035a9190613f08565b60405180910390f35b61036b610aab565b005b610387600480360381019061038291906132c2565b610b31565b6040516103949190613b89565b60405180910390f35b6103b760048036038101906103b29190613327565b610cad565b005b6103d360048036038101906103ce91906135ca565b610ccd565b005b6103ef60048036038101906103ea91906135ca565b610d29565b6040516103fc9190613f08565b60405180910390f35b61041f600480360381019061041a9190613589565b610d4c565b005b610429610dd4565b6040516104369190613bab565b60405180910390f35b610459600480360381019061045491906135ca565b610deb565b6040516104669190613b22565b60405180910390f35b610477610e22565b6040516104849190613bc6565b60405180910390f35b6104a760048036038101906104a291906132c2565b610eb4565b6040516104b49190613f08565b60405180910390f35b6104c5610f73565b005b6104cf6110b0565b005b6104d9611136565b6040516104e69190613b22565b60405180910390f35b610509600480360381019061050491906135f3565b611160565b005b6105136112d3565b6040516105209190613bc6565b60405180910390f35b610543600480360381019061053e9190613470565b611365565b005b61055f600480360381019061055a91906133f1565b6114e6565b005b61057b60048036038101906105769190613376565b611612565b005b610597600480360381019061059291906135ca565b611674565b6040516105a49190613bc6565b60405180910390f35b6105c760048036038101906105c291906135ca565b6117e7565b6040516105d49190613f08565b60405180910390f35b6105f760048036038101906105f291906132eb565b6117ff565b6040516106049190613bab565b60405180910390f35b610627600480360381019061062291906132c2565b611893565b005b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b60606006805461069f90614271565b80601f01602080910402602001604051908101604052809291908181526020018280546106cb90614271565b80156107185780601f106106ed57610100808354040283529160200191610718565b820191906000526020600020905b8154815290600101906020018083116106fb57829003601f168201915b5050505050905090565b600061072d82611a3f565b61076c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161076390613dc8565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107b282610deb565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610823576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161081a90613e68565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610842611a5c565b73ffffffffffffffffffffffffffffffffffffffff16148061087157506108708161086b611a5c565b6117ff565b5b6108b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a790613d48565b60405180910390fd5b6108ba8383611a64565b505050565b60006108cb6002611b1d565b905090565b6108e16108db611a5c565b82611b32565b610920576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091790613ea8565b60405180910390fd5b61092b838383611c10565b505050565b620f424081565b61093f611a5c565b73ffffffffffffffffffffffffffffffffffffffff1661095d611136565b73ffffffffffffffffffffffffffffffffffffffff16146109b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109aa90613de8565b60405180910390fd5b6000600c6000848152602001908152602001600020541415610a0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0190613ec8565b60405180910390fd5b60005b81811015610a3257610a1f8484611e27565b8080610a2a906142d4565b915050610a0d565b50505050565b6000610a8b82600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611f7a90919063ffffffff16565b905092915050565b600c6020528060005260406000206000915090505481565b610ab3611a5c565b73ffffffffffffffffffffffffffffffffffffffff16610ad1611136565b73ffffffffffffffffffffffffffffffffffffffff1614610b27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1e90613de8565b60405180910390fd5b610b2f611f94565b565b60606000610b3e83610eb4565b90506000811415610bc157600067ffffffffffffffff811115610b8a577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015610bb85781602001602082028036833780820191505090505b50915050610ca8565b60008167ffffffffffffffff811115610c03577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015610c315781602001602082028036833780820191505090505b50905060005b82811015610ca157610c498582610a38565b828281518110610c82577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508080610c99906142d4565b915050610c37565b5080925050505b919050565b610cc883838360405180602001604052806000815250611612565b505050565b610cde610cd8611a5c565b82611b32565b610d1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1490613ee8565b60405180910390fd5b610d2681612036565b50565b600080610d4083600261216890919063ffffffff16565b50905080915050919050565b610d54611a5c565b73ffffffffffffffffffffffffffffffffffffffff16610d72611136565b73ffffffffffffffffffffffffffffffffffffffff1614610dc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbf90613de8565b60405180910390fd5b610dd181612194565b50565b6000600a60009054906101000a900460ff16905090565b6000610e1b82604051806060016040528060298152602001614ab36029913960026121ae9092919063ffffffff16565b9050919050565b606060098054610e3190614271565b80601f0160208091040260200160405190810160405280929190818152602001828054610e5d90614271565b8015610eaa5780601f10610e7f57610100808354040283529160200191610eaa565b820191906000526020600020905b815481529060010190602001808311610e8d57829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1c90613d68565b60405180910390fd5b610f6c600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206121cd565b9050919050565b610f7b611a5c565b73ffffffffffffffffffffffffffffffffffffffff16610f99611136565b73ffffffffffffffffffffffffffffffffffffffff1614610fef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe690613de8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6110b8611a5c565b73ffffffffffffffffffffffffffffffffffffffff166110d6611136565b73ffffffffffffffffffffffffffffffffffffffff161461112c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112390613de8565b60405180910390fd5b6111346121e2565b565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611168611a5c565b73ffffffffffffffffffffffffffffffffffffffff16611186611136565b73ffffffffffffffffffffffffffffffffffffffff16146111dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d390613de8565b60405180910390fd5b620f424063ffffffff16811115611228576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121f90613d28565b60405180910390fd5b6000600c6000848152602001908152602001600020541461127e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127590613e88565b60405180910390fd5b80600c6000848152602001908152602001600020819055507fcf353f71444262efaf9c5e8d11283d4660cc9bcb9ba350a51fef51a3d64a0ef882826040516112c7929190613f23565b60405180910390a15050565b6060600780546112e290614271565b80601f016020809104026020016040519081016040528092919081815260200182805461130e90614271565b801561135b5780601f106113305761010080835404028352916020019161135b565b820191906000526020600020905b81548152906001019060200180831161133e57829003601f168201915b5050505050905090565b61136d611a5c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d290613cc8565b60405180910390fd5b80600560006113e8611a5c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611495611a5c565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516114da9190613bab565b60405180910390a35050565b6114ee611a5c565b73ffffffffffffffffffffffffffffffffffffffff1661150c611136565b73ffffffffffffffffffffffffffffffffffffffff1614611562576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155990613de8565b60405180910390fd5b60005b825181101561160c576115f9848483815181106115ab577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101518484815181106115ec577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151610937565b8080611604906142d4565b915050611565565b50505050565b61162361161d611a5c565b83611b32565b611662576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165990613ea8565b60405180910390fd5b61166e84848484612285565b50505050565b606061167f82611a3f565b6116be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b590613e28565b60405180910390fd5b60006008600084815260200190815260200160002080546116de90614271565b80601f016020809104026020016040519081016040528092919081815260200182805461170a90614271565b80156117575780601f1061172c57610100808354040283529160200191611757565b820191906000526020600020905b81548152906001019060200180831161173a57829003601f168201915b505050505090506000611768610e22565b905060008151141561177e5781925050506117e2565b6000825111156117b357808260405160200161179b929190613afe565b604051602081830303815290604052925050506117e2565b806117bd856122e1565b6040516020016117ce929190613afe565b604051602081830303815290604052925050505b919050565b600b6020528060005260406000206000915090505481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61189b611a5c565b73ffffffffffffffffffffffffffffffffffffffff166118b9611136565b73ffffffffffffffffffffffffffffffffffffffff161461190f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190690613de8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561197f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197690613c68565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000611a5582600261248e90919063ffffffff16565b9050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611ad783610deb565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611b2b826000016124a8565b9050919050565b6000611b3d82611a3f565b611b7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7390613ce8565b60405180910390fd5b6000611b8783610deb565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611bf657508373ffffffffffffffffffffffffffffffffffffffff16611bde84610722565b73ffffffffffffffffffffffffffffffffffffffff16145b80611c075750611c0681856117ff565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611c3082610deb565b73ffffffffffffffffffffffffffffffffffffffff1614611c86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7d90613e08565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611cf6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ced90613ca8565b60405180910390fd5b611d018383836124b9565b611d0c600082611a64565b611d5d81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206124c990919063ffffffff16565b50611daf81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206124e390919063ffffffff16565b50611dc6818360026124fd9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611e2f611a5c565b73ffffffffffffffffffffffffffffffffffffffff16611e4d611136565b73ffffffffffffffffffffffffffffffffffffffff1614611ea3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9a90613de8565b60405180910390fd5b600c600082815260200190815260200160002054600b60008381526020019081526020016000205410611f0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0290613e48565b60405180910390fd5b600b60008281526020019081526020016000206000815480929190611f2f906142d4565b91905055506000600b600083815260200190815260200160002054620f424063ffffffff1683611f5f919061411d565b611f699190614096565b9050611f758382612532565b505050565b6000611f8983600001836126c0565b60001c905092915050565b611f9c610dd4565b611fdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd290613c28565b60405180910390fd5b6000600a60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa61201f611a5c565b60405161202c9190613b22565b60405180910390a1565b600061204182610deb565b905061204f816000846124b9565b61205a600083611a64565b600060086000848152602001908152602001600020805461207a90614271565b9050146120a1576008600083815260200190815260200160002060006120a09190613010565b5b6120f282600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206124c990919063ffffffff16565b5061210782600261275a90919063ffffffff16565b5081600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60008060008061217b8660000186612774565b915091508160001c8160001c9350935050509250929050565b80600990805190602001906121aa929190613050565b5050565b60006121c1846000018460001b84612824565b60001c90509392505050565b60006121db826000016128eb565b9050919050565b6121ea610dd4565b1561222a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222190613d08565b60405180910390fd5b6001600a60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861226e611a5c565b60405161227b9190613b22565b60405180910390a1565b612290848484611c10565b61229c848484846128fc565b6122db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122d290613c48565b60405180910390fd5b50505050565b60606000821415612329576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612489565b600082905060005b6000821461235b578080612344906142d4565b915050600a8261235491906140ec565b9150612331565b60008167ffffffffffffffff81111561239d577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156123cf5781602001600182028036833780820191505090505b5090505b60008514612482576001826123e89190614177565b9150600a856123f7919061431d565b60306124039190614096565b60f81b81838151811061243f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561247b91906140ec565b94506123d3565b8093505050505b919050565b60006124a0836000018360001b612a93565b905092915050565b600081600001805490509050919050565b6124c4838383612ab6565b505050565b60006124db836000018360001b612b0e565b905092915050565b60006124f5836000018360001b612c98565b905092915050565b6000612529846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b612d08565b90509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156125a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161259990613da8565b60405180910390fd5b6125ab81611a3f565b156125eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e290613c88565b60405180910390fd5b6125f7600083836124b9565b61264881600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206124e390919063ffffffff16565b5061265f818360026124fd9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60008183600001805490501161270b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270290613be8565b60405180910390fd5b826000018281548110612747577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905092915050565b600061276c836000018360001b612e1a565b905092915050565b600080828460000180549050116127c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127b790613d88565b60405180910390fd5b60008460000184815481106127fe577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906002020190508060000154816001015492509250509250929050565b60008084600101600085815260200190815260200160002054905060008114158390612886576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287d9190613bc6565b60405180910390fd5b50846000016001826128989190614177565b815481106128cf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060020201600101549150509392505050565b600081600001805490509050919050565b600061291d8473ffffffffffffffffffffffffffffffffffffffff16612fd5565b15612a86578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612946611a5c565b8786866040518563ffffffff1660e01b81526004016129689493929190613b3d565b602060405180830381600087803b15801561298257600080fd5b505af19250505080156129b357506040513d601f19601f820116820180604052508101906129b09190613560565b60015b612a36573d80600081146129e3576040519150601f19603f3d011682016040523d82523d6000602084013e6129e8565b606091505b50600081511415612a2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a2590613c48565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612a8b565b600190505b949350505050565b600080836001016000848152602001908152602001600020541415905092915050565b612ac1838383612fe8565b612ac9610dd4565b15612b09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b0090613c08565b60405180910390fd5b505050565b60008083600101600084815260200190815260200160002054905060008114612c8c576000600182612b409190614177565b9050600060018660000180549050612b589190614177565b90506000866000018281548110612b98577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080876000018481548110612be2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550600183612bfd9190614096565b8760010160008381526020019081526020016000208190555086600001805480612c50577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050612c92565b60009150505b92915050565b6000612ca48383612fed565b612cfd578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050612d02565b600090505b92915050565b6000808460010160008581526020019081526020016000205490506000811415612daf57846000016040518060400160405280868152602001858152509080600181540180825580915050600190039060005260206000209060020201600090919091909150600082015181600001556020820151816001015550508460000180549050856001016000868152602001908152602001600020819055506001915050612e13565b8285600001600183612dc19190614177565b81548110612df8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600202016001018190555060009150505b9392505050565b60008083600101600084815260200190815260200160002054905060008114612fc9576000600182612e4c9190614177565b9050600060018660000180549050612e649190614177565b90506000866000018281548110612ea4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060020201905080876000018481548110612ef1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600202016000820154816000015560018201548160010155905050600183612f239190614096565b876001016000836000015481526020019081526020016000208190555086600001805480612f7a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000209060020201600080820160009055600182016000905550509055866001016000878152602001908152602001600020600090556001945050505050612fcf565b60009150505b92915050565b600080823b905060008111915050919050565b505050565b600080836001016000848152602001908152602001600020541415905092915050565b50805461301c90614271565b6000825580601f1061302e575061304d565b601f01602090049060005260206000209081019061304c91906130d6565b5b50565b82805461305c90614271565b90600052602060002090601f01602090048101928261307e57600085556130c5565b82601f1061309757805160ff19168380011785556130c5565b828001600101855582156130c5579182015b828111156130c45782518255916020019190600101906130a9565b5b5090506130d291906130d6565b5090565b5b808211156130ef5760008160009055506001016130d7565b5090565b600061310661310184613f8c565b613f67565b9050808382526020820190508285602086028201111561312557600080fd5b60005b85811015613155578161313b88826132ad565b845260208401935060208301925050600181019050613128565b5050509392505050565b600061317261316d84613fb8565b613f67565b90508281526020810184848401111561318a57600080fd5b61319584828561422f565b509392505050565b60006131b06131ab84613fe9565b613f67565b9050828152602081018484840111156131c857600080fd5b6131d384828561422f565b509392505050565b6000813590506131ea81614a56565b92915050565b600082601f83011261320157600080fd5b81356132118482602086016130f3565b91505092915050565b60008135905061322981614a6d565b92915050565b60008135905061323e81614a84565b92915050565b60008151905061325381614a84565b92915050565b600082601f83011261326a57600080fd5b813561327a84826020860161315f565b91505092915050565b600082601f83011261329457600080fd5b81356132a484826020860161319d565b91505092915050565b6000813590506132bc81614a9b565b92915050565b6000602082840312156132d457600080fd5b60006132e2848285016131db565b91505092915050565b600080604083850312156132fe57600080fd5b600061330c858286016131db565b925050602061331d858286016131db565b9150509250929050565b60008060006060848603121561333c57600080fd5b600061334a868287016131db565b935050602061335b868287016131db565b925050604061336c868287016132ad565b9150509250925092565b6000806000806080858703121561338c57600080fd5b600061339a878288016131db565b94505060206133ab878288016131db565b93505060406133bc878288016132ad565b925050606085013567ffffffffffffffff8111156133d957600080fd5b6133e587828801613259565b91505092959194509250565b60008060006060848603121561340657600080fd5b6000613414868287016131db565b935050602084013567ffffffffffffffff81111561343157600080fd5b61343d868287016131f0565b925050604084013567ffffffffffffffff81111561345a57600080fd5b613466868287016131f0565b9150509250925092565b6000806040838503121561348357600080fd5b6000613491858286016131db565b92505060206134a28582860161321a565b9150509250929050565b600080604083850312156134bf57600080fd5b60006134cd858286016131db565b92505060206134de858286016132ad565b9150509250929050565b6000806000606084860312156134fd57600080fd5b600061350b868287016131db565b935050602061351c868287016132ad565b925050604061352d868287016132ad565b9150509250925092565b60006020828403121561354957600080fd5b60006135578482850161322f565b91505092915050565b60006020828403121561357257600080fd5b600061358084828501613244565b91505092915050565b60006020828403121561359b57600080fd5b600082013567ffffffffffffffff8111156135b557600080fd5b6135c184828501613283565b91505092915050565b6000602082840312156135dc57600080fd5b60006135ea848285016132ad565b91505092915050565b6000806040838503121561360657600080fd5b6000613614858286016132ad565b9250506020613625858286016132ad565b9150509250929050565b600061363b8383613ad1565b60208301905092915050565b613650816141ab565b82525050565b60006136618261402a565b61366b8185614058565b93506136768361401a565b8060005b838110156136a757815161368e888261362f565b97506136998361404b565b92505060018101905061367a565b5085935050505092915050565b6136bd816141bd565b82525050565b60006136ce82614035565b6136d88185614069565b93506136e881856020860161423e565b6136f18161440a565b840191505092915050565b600061370782614040565b613711818561407a565b935061372181856020860161423e565b61372a8161440a565b840191505092915050565b600061374082614040565b61374a818561408b565b935061375a81856020860161423e565b80840191505092915050565b600061377360228361407a565b915061377e8261441b565b604082019050919050565b6000613796602b8361407a565b91506137a18261446a565b604082019050919050565b60006137b960148361407a565b91506137c4826144b9565b602082019050919050565b60006137dc60328361407a565b91506137e7826144e2565b604082019050919050565b60006137ff60268361407a565b915061380a82614531565b604082019050919050565b6000613822601c8361407a565b915061382d82614580565b602082019050919050565b600061384560248361407a565b9150613850826145a9565b604082019050919050565b600061386860198361407a565b9150613873826145f8565b602082019050919050565b600061388b602c8361407a565b915061389682614621565b604082019050919050565b60006138ae60108361407a565b91506138b982614670565b602082019050919050565b60006138d1601c8361407a565b91506138dc82614699565b602082019050919050565b60006138f460388361407a565b91506138ff826146c2565b604082019050919050565b6000613917602a8361407a565b915061392282614711565b604082019050919050565b600061393a60228361407a565b915061394582614760565b604082019050919050565b600061395d60208361407a565b9150613968826147af565b602082019050919050565b6000613980602c8361407a565b915061398b826147d8565b604082019050919050565b60006139a360208361407a565b91506139ae82614827565b602082019050919050565b60006139c660298361407a565b91506139d182614850565b604082019050919050565b60006139e9602f8361407a565b91506139f48261489f565b604082019050919050565b6000613a0c60178361407a565b9150613a17826148ee565b602082019050919050565b6000613a2f60218361407a565b9150613a3a82614917565b604082019050919050565b6000613a52601c8361407a565b9150613a5d82614966565b602082019050919050565b6000613a7560318361407a565b9150613a808261498f565b604082019050919050565b6000613a98601d8361407a565b9150613aa3826149de565b602082019050919050565b6000613abb60308361407a565b9150613ac682614a07565b604082019050919050565b613ada81614215565b82525050565b613ae981614215565b82525050565b613af88161421f565b82525050565b6000613b0a8285613735565b9150613b168284613735565b91508190509392505050565b6000602082019050613b376000830184613647565b92915050565b6000608082019050613b526000830187613647565b613b5f6020830186613647565b613b6c6040830185613ae0565b8181036060830152613b7e81846136c3565b905095945050505050565b60006020820190508181036000830152613ba38184613656565b905092915050565b6000602082019050613bc060008301846136b4565b92915050565b60006020820190508181036000830152613be081846136fc565b905092915050565b60006020820190508181036000830152613c0181613766565b9050919050565b60006020820190508181036000830152613c2181613789565b9050919050565b60006020820190508181036000830152613c41816137ac565b9050919050565b60006020820190508181036000830152613c61816137cf565b9050919050565b60006020820190508181036000830152613c81816137f2565b9050919050565b60006020820190508181036000830152613ca181613815565b9050919050565b60006020820190508181036000830152613cc181613838565b9050919050565b60006020820190508181036000830152613ce18161385b565b9050919050565b60006020820190508181036000830152613d018161387e565b9050919050565b60006020820190508181036000830152613d21816138a1565b9050919050565b60006020820190508181036000830152613d41816138c4565b9050919050565b60006020820190508181036000830152613d61816138e7565b9050919050565b60006020820190508181036000830152613d818161390a565b9050919050565b60006020820190508181036000830152613da18161392d565b9050919050565b60006020820190508181036000830152613dc181613950565b9050919050565b60006020820190508181036000830152613de181613973565b9050919050565b60006020820190508181036000830152613e0181613996565b9050919050565b60006020820190508181036000830152613e21816139b9565b9050919050565b60006020820190508181036000830152613e41816139dc565b9050919050565b60006020820190508181036000830152613e61816139ff565b9050919050565b60006020820190508181036000830152613e8181613a22565b9050919050565b60006020820190508181036000830152613ea181613a45565b9050919050565b60006020820190508181036000830152613ec181613a68565b9050919050565b60006020820190508181036000830152613ee181613a8b565b9050919050565b60006020820190508181036000830152613f0181613aae565b9050919050565b6000602082019050613f1d6000830184613ae0565b92915050565b6000604082019050613f386000830185613ae0565b613f456020830184613ae0565b9392505050565b6000602082019050613f616000830184613aef565b92915050565b6000613f71613f82565b9050613f7d82826142a3565b919050565b6000604051905090565b600067ffffffffffffffff821115613fa757613fa66143db565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613fd357613fd26143db565b5b613fdc8261440a565b9050602081019050919050565b600067ffffffffffffffff821115614004576140036143db565b5b61400d8261440a565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006140a182614215565b91506140ac83614215565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156140e1576140e061434e565b5b828201905092915050565b60006140f782614215565b915061410283614215565b9250826141125761411161437d565b5b828204905092915050565b600061412882614215565b915061413383614215565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561416c5761416b61434e565b5b828202905092915050565b600061418282614215565b915061418d83614215565b9250828210156141a05761419f61434e565b5b828203905092915050565b60006141b6826141f5565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b82818337600083830152505050565b60005b8381101561425c578082015181840152602081019050614241565b8381111561426b576000848401525b50505050565b6000600282049050600182168061428957607f821691505b6020821081141561429d5761429c6143ac565b5b50919050565b6142ac8261440a565b810181811067ffffffffffffffff821117156142cb576142ca6143db565b5b80604052505050565b60006142df82614215565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156143125761431161434e565b5b600182019050919050565b600061432882614215565b915061433383614215565b9250826143435761434261437d565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732315061757361626c653a20746f6b656e207472616e73666572207760008201527f68696c6520706175736564000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f446f54784e46543a206d617820737570706c7920746f6f206869676800000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f446f54784e46543a20686f75736520736f6c64206f7574000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f446f54784e46543a20686f75736520616c726561647920657869737400000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f446f54784e46543a20686f75736520646f6573206e6f74206578697374000000600082015250565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b614a5f816141ab565b8114614a6a57600080fd5b50565b614a76816141bd565b8114614a8157600080fd5b50565b614a8d816141c9565b8114614a9857600080fd5b50565b614aa481614215565b8114614aaf57600080fd5b5056fe4552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea26469706673582212209d30b28bd2aae6da941a21888cce82f607c5c4ee2bd01832ca5da1fbe2b0209964736f6c634300080100330000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001d68747470733a2f2f6e66742e646566696f667468726f6e65732e696f2f000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101f05760003560e01c80635c975abb1161010f57806395d89b41116100a2578063c87b56dd11610071578063c87b56dd1461057d578063e81c9d6c146105ad578063e985e9c5146105dd578063f2fde38b1461060d576101f0565b806395d89b411461050b578063a22cb46514610529578063b565eda614610545578063b88d4fde14610561576101f0565b8063715018a6116100de578063715018a6146104bd5780638456cb59146104c75780638da5cb5b146104d15780638ec9c91b146104ef576101f0565b80635c975abb146104215780636352211e1461043f5780636c0360eb1461046f57806370a082311461048d576101f0565b80632f745c591161018757806342842e0e1161015657806342842e0e1461039d57806342966c68146103b95780634f6ccce7146103d557806355f804b314610405576101f0565b80632f745c591461030357806335403023146103335780633f4ba83a1461036357806340398d671461036d576101f0565b806318160ddd116101c357806318160ddd1461028f57806323b872dd146102ad5780632be7ba53146102c95780632e81aaea146102e7576101f0565b806301ffc9a7146101f557806306fdde0314610225578063081812fc14610243578063095ea7b314610273575b600080fd5b61020f600480360381019061020a9190613537565b610629565b60405161021c9190613bab565b60405180910390f35b61022d610690565b60405161023a9190613bc6565b60405180910390f35b61025d600480360381019061025891906135ca565b610722565b60405161026a9190613b22565b60405180910390f35b61028d600480360381019061028891906134ac565b6107a7565b005b6102976108bf565b6040516102a49190613f08565b60405180910390f35b6102c760048036038101906102c29190613327565b6108d0565b005b6102d1610930565b6040516102de9190613f4c565b60405180910390f35b61030160048036038101906102fc91906134e8565b610937565b005b61031d600480360381019061031891906134ac565b610a38565b60405161032a9190613f08565b60405180910390f35b61034d600480360381019061034891906135ca565b610a93565b60405161035a9190613f08565b60405180910390f35b61036b610aab565b005b610387600480360381019061038291906132c2565b610b31565b6040516103949190613b89565b60405180910390f35b6103b760048036038101906103b29190613327565b610cad565b005b6103d360048036038101906103ce91906135ca565b610ccd565b005b6103ef60048036038101906103ea91906135ca565b610d29565b6040516103fc9190613f08565b60405180910390f35b61041f600480360381019061041a9190613589565b610d4c565b005b610429610dd4565b6040516104369190613bab565b60405180910390f35b610459600480360381019061045491906135ca565b610deb565b6040516104669190613b22565b60405180910390f35b610477610e22565b6040516104849190613bc6565b60405180910390f35b6104a760048036038101906104a291906132c2565b610eb4565b6040516104b49190613f08565b60405180910390f35b6104c5610f73565b005b6104cf6110b0565b005b6104d9611136565b6040516104e69190613b22565b60405180910390f35b610509600480360381019061050491906135f3565b611160565b005b6105136112d3565b6040516105209190613bc6565b60405180910390f35b610543600480360381019061053e9190613470565b611365565b005b61055f600480360381019061055a91906133f1565b6114e6565b005b61057b60048036038101906105769190613376565b611612565b005b610597600480360381019061059291906135ca565b611674565b6040516105a49190613bc6565b60405180910390f35b6105c760048036038101906105c291906135ca565b6117e7565b6040516105d49190613f08565b60405180910390f35b6105f760048036038101906105f291906132eb565b6117ff565b6040516106049190613bab565b60405180910390f35b610627600480360381019061062291906132c2565b611893565b005b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b60606006805461069f90614271565b80601f01602080910402602001604051908101604052809291908181526020018280546106cb90614271565b80156107185780601f106106ed57610100808354040283529160200191610718565b820191906000526020600020905b8154815290600101906020018083116106fb57829003601f168201915b5050505050905090565b600061072d82611a3f565b61076c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161076390613dc8565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107b282610deb565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610823576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161081a90613e68565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610842611a5c565b73ffffffffffffffffffffffffffffffffffffffff16148061087157506108708161086b611a5c565b6117ff565b5b6108b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a790613d48565b60405180910390fd5b6108ba8383611a64565b505050565b60006108cb6002611b1d565b905090565b6108e16108db611a5c565b82611b32565b610920576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091790613ea8565b60405180910390fd5b61092b838383611c10565b505050565b620f424081565b61093f611a5c565b73ffffffffffffffffffffffffffffffffffffffff1661095d611136565b73ffffffffffffffffffffffffffffffffffffffff16146109b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109aa90613de8565b60405180910390fd5b6000600c6000848152602001908152602001600020541415610a0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0190613ec8565b60405180910390fd5b60005b81811015610a3257610a1f8484611e27565b8080610a2a906142d4565b915050610a0d565b50505050565b6000610a8b82600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611f7a90919063ffffffff16565b905092915050565b600c6020528060005260406000206000915090505481565b610ab3611a5c565b73ffffffffffffffffffffffffffffffffffffffff16610ad1611136565b73ffffffffffffffffffffffffffffffffffffffff1614610b27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1e90613de8565b60405180910390fd5b610b2f611f94565b565b60606000610b3e83610eb4565b90506000811415610bc157600067ffffffffffffffff811115610b8a577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015610bb85781602001602082028036833780820191505090505b50915050610ca8565b60008167ffffffffffffffff811115610c03577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015610c315781602001602082028036833780820191505090505b50905060005b82811015610ca157610c498582610a38565b828281518110610c82577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508080610c99906142d4565b915050610c37565b5080925050505b919050565b610cc883838360405180602001604052806000815250611612565b505050565b610cde610cd8611a5c565b82611b32565b610d1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1490613ee8565b60405180910390fd5b610d2681612036565b50565b600080610d4083600261216890919063ffffffff16565b50905080915050919050565b610d54611a5c565b73ffffffffffffffffffffffffffffffffffffffff16610d72611136565b73ffffffffffffffffffffffffffffffffffffffff1614610dc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbf90613de8565b60405180910390fd5b610dd181612194565b50565b6000600a60009054906101000a900460ff16905090565b6000610e1b82604051806060016040528060298152602001614ab36029913960026121ae9092919063ffffffff16565b9050919050565b606060098054610e3190614271565b80601f0160208091040260200160405190810160405280929190818152602001828054610e5d90614271565b8015610eaa5780601f10610e7f57610100808354040283529160200191610eaa565b820191906000526020600020905b815481529060010190602001808311610e8d57829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1c90613d68565b60405180910390fd5b610f6c600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206121cd565b9050919050565b610f7b611a5c565b73ffffffffffffffffffffffffffffffffffffffff16610f99611136565b73ffffffffffffffffffffffffffffffffffffffff1614610fef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe690613de8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6110b8611a5c565b73ffffffffffffffffffffffffffffffffffffffff166110d6611136565b73ffffffffffffffffffffffffffffffffffffffff161461112c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112390613de8565b60405180910390fd5b6111346121e2565b565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611168611a5c565b73ffffffffffffffffffffffffffffffffffffffff16611186611136565b73ffffffffffffffffffffffffffffffffffffffff16146111dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d390613de8565b60405180910390fd5b620f424063ffffffff16811115611228576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121f90613d28565b60405180910390fd5b6000600c6000848152602001908152602001600020541461127e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127590613e88565b60405180910390fd5b80600c6000848152602001908152602001600020819055507fcf353f71444262efaf9c5e8d11283d4660cc9bcb9ba350a51fef51a3d64a0ef882826040516112c7929190613f23565b60405180910390a15050565b6060600780546112e290614271565b80601f016020809104026020016040519081016040528092919081815260200182805461130e90614271565b801561135b5780601f106113305761010080835404028352916020019161135b565b820191906000526020600020905b81548152906001019060200180831161133e57829003601f168201915b5050505050905090565b61136d611a5c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d290613cc8565b60405180910390fd5b80600560006113e8611a5c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611495611a5c565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516114da9190613bab565b60405180910390a35050565b6114ee611a5c565b73ffffffffffffffffffffffffffffffffffffffff1661150c611136565b73ffffffffffffffffffffffffffffffffffffffff1614611562576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155990613de8565b60405180910390fd5b60005b825181101561160c576115f9848483815181106115ab577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101518484815181106115ec577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151610937565b8080611604906142d4565b915050611565565b50505050565b61162361161d611a5c565b83611b32565b611662576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165990613ea8565b60405180910390fd5b61166e84848484612285565b50505050565b606061167f82611a3f565b6116be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b590613e28565b60405180910390fd5b60006008600084815260200190815260200160002080546116de90614271565b80601f016020809104026020016040519081016040528092919081815260200182805461170a90614271565b80156117575780601f1061172c57610100808354040283529160200191611757565b820191906000526020600020905b81548152906001019060200180831161173a57829003601f168201915b505050505090506000611768610e22565b905060008151141561177e5781925050506117e2565b6000825111156117b357808260405160200161179b929190613afe565b604051602081830303815290604052925050506117e2565b806117bd856122e1565b6040516020016117ce929190613afe565b604051602081830303815290604052925050505b919050565b600b6020528060005260406000206000915090505481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61189b611a5c565b73ffffffffffffffffffffffffffffffffffffffff166118b9611136565b73ffffffffffffffffffffffffffffffffffffffff161461190f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190690613de8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561197f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197690613c68565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000611a5582600261248e90919063ffffffff16565b9050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611ad783610deb565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611b2b826000016124a8565b9050919050565b6000611b3d82611a3f565b611b7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7390613ce8565b60405180910390fd5b6000611b8783610deb565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611bf657508373ffffffffffffffffffffffffffffffffffffffff16611bde84610722565b73ffffffffffffffffffffffffffffffffffffffff16145b80611c075750611c0681856117ff565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611c3082610deb565b73ffffffffffffffffffffffffffffffffffffffff1614611c86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7d90613e08565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611cf6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ced90613ca8565b60405180910390fd5b611d018383836124b9565b611d0c600082611a64565b611d5d81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206124c990919063ffffffff16565b50611daf81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206124e390919063ffffffff16565b50611dc6818360026124fd9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611e2f611a5c565b73ffffffffffffffffffffffffffffffffffffffff16611e4d611136565b73ffffffffffffffffffffffffffffffffffffffff1614611ea3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9a90613de8565b60405180910390fd5b600c600082815260200190815260200160002054600b60008381526020019081526020016000205410611f0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0290613e48565b60405180910390fd5b600b60008281526020019081526020016000206000815480929190611f2f906142d4565b91905055506000600b600083815260200190815260200160002054620f424063ffffffff1683611f5f919061411d565b611f699190614096565b9050611f758382612532565b505050565b6000611f8983600001836126c0565b60001c905092915050565b611f9c610dd4565b611fdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd290613c28565b60405180910390fd5b6000600a60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa61201f611a5c565b60405161202c9190613b22565b60405180910390a1565b600061204182610deb565b905061204f816000846124b9565b61205a600083611a64565b600060086000848152602001908152602001600020805461207a90614271565b9050146120a1576008600083815260200190815260200160002060006120a09190613010565b5b6120f282600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206124c990919063ffffffff16565b5061210782600261275a90919063ffffffff16565b5081600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60008060008061217b8660000186612774565b915091508160001c8160001c9350935050509250929050565b80600990805190602001906121aa929190613050565b5050565b60006121c1846000018460001b84612824565b60001c90509392505050565b60006121db826000016128eb565b9050919050565b6121ea610dd4565b1561222a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222190613d08565b60405180910390fd5b6001600a60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861226e611a5c565b60405161227b9190613b22565b60405180910390a1565b612290848484611c10565b61229c848484846128fc565b6122db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122d290613c48565b60405180910390fd5b50505050565b60606000821415612329576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612489565b600082905060005b6000821461235b578080612344906142d4565b915050600a8261235491906140ec565b9150612331565b60008167ffffffffffffffff81111561239d577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156123cf5781602001600182028036833780820191505090505b5090505b60008514612482576001826123e89190614177565b9150600a856123f7919061431d565b60306124039190614096565b60f81b81838151811061243f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561247b91906140ec565b94506123d3565b8093505050505b919050565b60006124a0836000018360001b612a93565b905092915050565b600081600001805490509050919050565b6124c4838383612ab6565b505050565b60006124db836000018360001b612b0e565b905092915050565b60006124f5836000018360001b612c98565b905092915050565b6000612529846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b612d08565b90509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156125a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161259990613da8565b60405180910390fd5b6125ab81611a3f565b156125eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e290613c88565b60405180910390fd5b6125f7600083836124b9565b61264881600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206124e390919063ffffffff16565b5061265f818360026124fd9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60008183600001805490501161270b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270290613be8565b60405180910390fd5b826000018281548110612747577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905092915050565b600061276c836000018360001b612e1a565b905092915050565b600080828460000180549050116127c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127b790613d88565b60405180910390fd5b60008460000184815481106127fe577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906002020190508060000154816001015492509250509250929050565b60008084600101600085815260200190815260200160002054905060008114158390612886576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287d9190613bc6565b60405180910390fd5b50846000016001826128989190614177565b815481106128cf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060020201600101549150509392505050565b600081600001805490509050919050565b600061291d8473ffffffffffffffffffffffffffffffffffffffff16612fd5565b15612a86578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612946611a5c565b8786866040518563ffffffff1660e01b81526004016129689493929190613b3d565b602060405180830381600087803b15801561298257600080fd5b505af19250505080156129b357506040513d601f19601f820116820180604052508101906129b09190613560565b60015b612a36573d80600081146129e3576040519150601f19603f3d011682016040523d82523d6000602084013e6129e8565b606091505b50600081511415612a2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a2590613c48565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612a8b565b600190505b949350505050565b600080836001016000848152602001908152602001600020541415905092915050565b612ac1838383612fe8565b612ac9610dd4565b15612b09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b0090613c08565b60405180910390fd5b505050565b60008083600101600084815260200190815260200160002054905060008114612c8c576000600182612b409190614177565b9050600060018660000180549050612b589190614177565b90506000866000018281548110612b98577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080876000018481548110612be2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550600183612bfd9190614096565b8760010160008381526020019081526020016000208190555086600001805480612c50577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050612c92565b60009150505b92915050565b6000612ca48383612fed565b612cfd578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050612d02565b600090505b92915050565b6000808460010160008581526020019081526020016000205490506000811415612daf57846000016040518060400160405280868152602001858152509080600181540180825580915050600190039060005260206000209060020201600090919091909150600082015181600001556020820151816001015550508460000180549050856001016000868152602001908152602001600020819055506001915050612e13565b8285600001600183612dc19190614177565b81548110612df8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600202016001018190555060009150505b9392505050565b60008083600101600084815260200190815260200160002054905060008114612fc9576000600182612e4c9190614177565b9050600060018660000180549050612e649190614177565b90506000866000018281548110612ea4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060020201905080876000018481548110612ef1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600202016000820154816000015560018201548160010155905050600183612f239190614096565b876001016000836000015481526020019081526020016000208190555086600001805480612f7a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000209060020201600080820160009055600182016000905550509055866001016000878152602001908152602001600020600090556001945050505050612fcf565b60009150505b92915050565b600080823b905060008111915050919050565b505050565b600080836001016000848152602001908152602001600020541415905092915050565b50805461301c90614271565b6000825580601f1061302e575061304d565b601f01602090049060005260206000209081019061304c91906130d6565b5b50565b82805461305c90614271565b90600052602060002090601f01602090048101928261307e57600085556130c5565b82601f1061309757805160ff19168380011785556130c5565b828001600101855582156130c5579182015b828111156130c45782518255916020019190600101906130a9565b5b5090506130d291906130d6565b5090565b5b808211156130ef5760008160009055506001016130d7565b5090565b600061310661310184613f8c565b613f67565b9050808382526020820190508285602086028201111561312557600080fd5b60005b85811015613155578161313b88826132ad565b845260208401935060208301925050600181019050613128565b5050509392505050565b600061317261316d84613fb8565b613f67565b90508281526020810184848401111561318a57600080fd5b61319584828561422f565b509392505050565b60006131b06131ab84613fe9565b613f67565b9050828152602081018484840111156131c857600080fd5b6131d384828561422f565b509392505050565b6000813590506131ea81614a56565b92915050565b600082601f83011261320157600080fd5b81356132118482602086016130f3565b91505092915050565b60008135905061322981614a6d565b92915050565b60008135905061323e81614a84565b92915050565b60008151905061325381614a84565b92915050565b600082601f83011261326a57600080fd5b813561327a84826020860161315f565b91505092915050565b600082601f83011261329457600080fd5b81356132a484826020860161319d565b91505092915050565b6000813590506132bc81614a9b565b92915050565b6000602082840312156132d457600080fd5b60006132e2848285016131db565b91505092915050565b600080604083850312156132fe57600080fd5b600061330c858286016131db565b925050602061331d858286016131db565b9150509250929050565b60008060006060848603121561333c57600080fd5b600061334a868287016131db565b935050602061335b868287016131db565b925050604061336c868287016132ad565b9150509250925092565b6000806000806080858703121561338c57600080fd5b600061339a878288016131db565b94505060206133ab878288016131db565b93505060406133bc878288016132ad565b925050606085013567ffffffffffffffff8111156133d957600080fd5b6133e587828801613259565b91505092959194509250565b60008060006060848603121561340657600080fd5b6000613414868287016131db565b935050602084013567ffffffffffffffff81111561343157600080fd5b61343d868287016131f0565b925050604084013567ffffffffffffffff81111561345a57600080fd5b613466868287016131f0565b9150509250925092565b6000806040838503121561348357600080fd5b6000613491858286016131db565b92505060206134a28582860161321a565b9150509250929050565b600080604083850312156134bf57600080fd5b60006134cd858286016131db565b92505060206134de858286016132ad565b9150509250929050565b6000806000606084860312156134fd57600080fd5b600061350b868287016131db565b935050602061351c868287016132ad565b925050604061352d868287016132ad565b9150509250925092565b60006020828403121561354957600080fd5b60006135578482850161322f565b91505092915050565b60006020828403121561357257600080fd5b600061358084828501613244565b91505092915050565b60006020828403121561359b57600080fd5b600082013567ffffffffffffffff8111156135b557600080fd5b6135c184828501613283565b91505092915050565b6000602082840312156135dc57600080fd5b60006135ea848285016132ad565b91505092915050565b6000806040838503121561360657600080fd5b6000613614858286016132ad565b9250506020613625858286016132ad565b9150509250929050565b600061363b8383613ad1565b60208301905092915050565b613650816141ab565b82525050565b60006136618261402a565b61366b8185614058565b93506136768361401a565b8060005b838110156136a757815161368e888261362f565b97506136998361404b565b92505060018101905061367a565b5085935050505092915050565b6136bd816141bd565b82525050565b60006136ce82614035565b6136d88185614069565b93506136e881856020860161423e565b6136f18161440a565b840191505092915050565b600061370782614040565b613711818561407a565b935061372181856020860161423e565b61372a8161440a565b840191505092915050565b600061374082614040565b61374a818561408b565b935061375a81856020860161423e565b80840191505092915050565b600061377360228361407a565b915061377e8261441b565b604082019050919050565b6000613796602b8361407a565b91506137a18261446a565b604082019050919050565b60006137b960148361407a565b91506137c4826144b9565b602082019050919050565b60006137dc60328361407a565b91506137e7826144e2565b604082019050919050565b60006137ff60268361407a565b915061380a82614531565b604082019050919050565b6000613822601c8361407a565b915061382d82614580565b602082019050919050565b600061384560248361407a565b9150613850826145a9565b604082019050919050565b600061386860198361407a565b9150613873826145f8565b602082019050919050565b600061388b602c8361407a565b915061389682614621565b604082019050919050565b60006138ae60108361407a565b91506138b982614670565b602082019050919050565b60006138d1601c8361407a565b91506138dc82614699565b602082019050919050565b60006138f460388361407a565b91506138ff826146c2565b604082019050919050565b6000613917602a8361407a565b915061392282614711565b604082019050919050565b600061393a60228361407a565b915061394582614760565b604082019050919050565b600061395d60208361407a565b9150613968826147af565b602082019050919050565b6000613980602c8361407a565b915061398b826147d8565b604082019050919050565b60006139a360208361407a565b91506139ae82614827565b602082019050919050565b60006139c660298361407a565b91506139d182614850565b604082019050919050565b60006139e9602f8361407a565b91506139f48261489f565b604082019050919050565b6000613a0c60178361407a565b9150613a17826148ee565b602082019050919050565b6000613a2f60218361407a565b9150613a3a82614917565b604082019050919050565b6000613a52601c8361407a565b9150613a5d82614966565b602082019050919050565b6000613a7560318361407a565b9150613a808261498f565b604082019050919050565b6000613a98601d8361407a565b9150613aa3826149de565b602082019050919050565b6000613abb60308361407a565b9150613ac682614a07565b604082019050919050565b613ada81614215565b82525050565b613ae981614215565b82525050565b613af88161421f565b82525050565b6000613b0a8285613735565b9150613b168284613735565b91508190509392505050565b6000602082019050613b376000830184613647565b92915050565b6000608082019050613b526000830187613647565b613b5f6020830186613647565b613b6c6040830185613ae0565b8181036060830152613b7e81846136c3565b905095945050505050565b60006020820190508181036000830152613ba38184613656565b905092915050565b6000602082019050613bc060008301846136b4565b92915050565b60006020820190508181036000830152613be081846136fc565b905092915050565b60006020820190508181036000830152613c0181613766565b9050919050565b60006020820190508181036000830152613c2181613789565b9050919050565b60006020820190508181036000830152613c41816137ac565b9050919050565b60006020820190508181036000830152613c61816137cf565b9050919050565b60006020820190508181036000830152613c81816137f2565b9050919050565b60006020820190508181036000830152613ca181613815565b9050919050565b60006020820190508181036000830152613cc181613838565b9050919050565b60006020820190508181036000830152613ce18161385b565b9050919050565b60006020820190508181036000830152613d018161387e565b9050919050565b60006020820190508181036000830152613d21816138a1565b9050919050565b60006020820190508181036000830152613d41816138c4565b9050919050565b60006020820190508181036000830152613d61816138e7565b9050919050565b60006020820190508181036000830152613d818161390a565b9050919050565b60006020820190508181036000830152613da18161392d565b9050919050565b60006020820190508181036000830152613dc181613950565b9050919050565b60006020820190508181036000830152613de181613973565b9050919050565b60006020820190508181036000830152613e0181613996565b9050919050565b60006020820190508181036000830152613e21816139b9565b9050919050565b60006020820190508181036000830152613e41816139dc565b9050919050565b60006020820190508181036000830152613e61816139ff565b9050919050565b60006020820190508181036000830152613e8181613a22565b9050919050565b60006020820190508181036000830152613ea181613a45565b9050919050565b60006020820190508181036000830152613ec181613a68565b9050919050565b60006020820190508181036000830152613ee181613a8b565b9050919050565b60006020820190508181036000830152613f0181613aae565b9050919050565b6000602082019050613f1d6000830184613ae0565b92915050565b6000604082019050613f386000830185613ae0565b613f456020830184613ae0565b9392505050565b6000602082019050613f616000830184613aef565b92915050565b6000613f71613f82565b9050613f7d82826142a3565b919050565b6000604051905090565b600067ffffffffffffffff821115613fa757613fa66143db565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613fd357613fd26143db565b5b613fdc8261440a565b9050602081019050919050565b600067ffffffffffffffff821115614004576140036143db565b5b61400d8261440a565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006140a182614215565b91506140ac83614215565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156140e1576140e061434e565b5b828201905092915050565b60006140f782614215565b915061410283614215565b9250826141125761411161437d565b5b828204905092915050565b600061412882614215565b915061413383614215565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561416c5761416b61434e565b5b828202905092915050565b600061418282614215565b915061418d83614215565b9250828210156141a05761419f61434e565b5b828203905092915050565b60006141b6826141f5565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b82818337600083830152505050565b60005b8381101561425c578082015181840152602081019050614241565b8381111561426b576000848401525b50505050565b6000600282049050600182168061428957607f821691505b6020821081141561429d5761429c6143ac565b5b50919050565b6142ac8261440a565b810181811067ffffffffffffffff821117156142cb576142ca6143db565b5b80604052505050565b60006142df82614215565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156143125761431161434e565b5b600182019050919050565b600061432882614215565b915061433383614215565b9250826143435761434261437d565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732315061757361626c653a20746f6b656e207472616e73666572207760008201527f68696c6520706175736564000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f446f54784e46543a206d617820737570706c7920746f6f206869676800000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f446f54784e46543a20686f75736520736f6c64206f7574000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f446f54784e46543a20686f75736520616c726561647920657869737400000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f446f54784e46543a20686f75736520646f6573206e6f74206578697374000000600082015250565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b614a5f816141ab565b8114614a6a57600080fd5b50565b614a76816141bd565b8114614a8157600080fd5b50565b614a8d816141c9565b8114614a9857600080fd5b50565b614aa481614215565b8114614aaf57600080fd5b5056fe4552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea26469706673582212209d30b28bd2aae6da941a21888cce82f607c5c4ee2bd01832ca5da1fbe2b0209964736f6c63430008010033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001d68747470733a2f2f6e66742e646566696f667468726f6e65732e696f2f000000
-----Decoded View---------------
Arg [0] : _baseUrl (string): https://nft.defiofthrones.io/
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 000000000000000000000000000000000000000000000000000000000000001d
Arg [2] : 68747470733a2f2f6e66742e646566696f667468726f6e65732e696f2f000000
Deployed Bytecode Sourcemap
112:2511:3:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;835:150:4;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2591:100:5;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5377:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4907:404;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4385:211;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6267:305;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;292:44:3;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1081:258;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4147:162:5;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;239:41:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1730:63;;;:::i;:::-;;2098:523;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6643:151:5;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;456:245:6;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4673:172:5;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1994:98:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1073:86:17;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2347:177:5;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3966:97;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2064:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1746:148:16;;;:::i;:::-;;1665:59:3;;;:::i;:::-;;1095:87:16;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;520:310:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2760:104:5;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5670:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;840:231:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6865:285:5;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2935:792;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;187:46:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6036:164:5;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2049:244:16;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;835:150:4;920:4;944:20;:33;965:11;944:33;;;;;;;;;;;;;;;;;;;;;;;;;;;937:40;;835:150;;;:::o;2591:100:5:-;2645:13;2678:5;2671:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2591:100;:::o;5377:221::-;5453:7;5481:16;5489:7;5481;:16::i;:::-;5473:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;5566:15;:24;5582:7;5566:24;;;;;;;;;;;;;;;;;;;;;5559:31;;5377:221;;;:::o;4907:404::-;4988:13;5004:23;5019:7;5004:14;:23::i;:::-;4988:39;;5052:5;5046:11;;:2;:11;;;;5038:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;5132:5;5116:21;;:12;:10;:12::i;:::-;:21;;;:69;;;;5141:44;5165:5;5172:12;:10;:12::i;:::-;5141:23;:44::i;:::-;5116:69;5108:161;;;;;;;;;;;;:::i;:::-;;;;;;;;;5282:21;5291:2;5295:7;5282:8;:21::i;:::-;4907:404;;;:::o;4385:211::-;4446:7;4567:21;:12;:19;:21::i;:::-;4560:28;;4385:211;:::o;6267:305::-;6428:41;6447:12;:10;:12::i;:::-;6461:7;6428:18;:41::i;:::-;6420:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;6536:28;6546:4;6552:2;6556:7;6536:9;:28::i;:::-;6267:305;;;:::o;292:44:3:-;329:7;292:44;:::o;1081:258::-;1326:12:16;:10;:12::i;:::-;1315:23;;:7;:5;:7::i;:::-;:23;;;1307:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1202:1:3::1;1182:6;:16;1189:8;1182:16;;;;;;;;;;;;:21;;1174:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1260:9;1256:77;1277:6;1273:1;:10;1256:77;;;1303:19;1308:3;1313:8;1303:4;:19::i;:::-;1285:3;;;;;:::i;:::-;;;;1256:77;;;;1081:258:::0;;;:::o;4147:162:5:-;4244:7;4271:30;4295:5;4271:13;:20;4285:5;4271:20;;;;;;;;;;;;;;;:23;;:30;;;;:::i;:::-;4264:37;;4147:162;;;;:::o;239:41:3:-;;;;;;;;;;;;;;;;;:::o;1730:63::-;1326:12:16;:10;:12::i;:::-;1315:23;;:7;:5;:7::i;:::-;:23;;;1307:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1776:10:3::1;:8;:10::i;:::-;1730:63::o:0;2098:523::-;2160:28;2200:18;2221:17;2231:6;2221:9;:17::i;:::-;2200:38;;2267:1;2253:10;:15;2249:366;;;2342:1;2328:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2321:23;;;;;2249:366;2375:23;2415:10;2401:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2375:51;;2446:13;2441:136;2473:10;2465:5;:18;2441:136;;;2528:34;2548:6;2556:5;2528:19;:34::i;:::-;2512:6;2519:5;2512:13;;;;;;;;;;;;;;;;;;;;;:50;;;;;2485:7;;;;;:::i;:::-;;;;2441:136;;;;2598:6;2591:13;;;;2098:523;;;;:::o;6643:151:5:-;6747:39;6764:4;6770:2;6774:7;6747:39;;;;;;;;;;;;:16;:39::i;:::-;6643:151;;;:::o;456:245:6:-;574:41;593:12;:10;:12::i;:::-;607:7;574:18;:41::i;:::-;566:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;679:14;685:7;679:5;:14::i;:::-;456:245;:::o;4673:172:5:-;4748:7;4769:15;4790:22;4806:5;4790:12;:15;;:22;;;;:::i;:::-;4768:44;;;4830:7;4823:14;;;4673:172;;;:::o;1994:98:3:-;1326:12:16;:10;:12::i;:::-;1315:23;;:7;:5;:7::i;:::-;:23;;;1307:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2064:21:3::1;2076:8;2064:11;:21::i;:::-;1994:98:::0;:::o;1073:86:17:-;1120:4;1144:7;;;;;;;;;;;1137:14;;1073:86;:::o;2347:177:5:-;2419:7;2446:70;2463:7;2446:70;;;;;;;;;;;;;;;;;:12;:16;;:70;;;;;:::i;:::-;2439:77;;2347:177;;;:::o;3966:97::-;4014:13;4047:8;4040:15;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3966:97;:::o;2064:221::-;2136:7;2181:1;2164:19;;:5;:19;;;;2156:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;2248:29;:13;:20;2262:5;2248:20;;;;;;;;;;;;;;;:27;:29::i;:::-;2241:36;;2064:221;;;:::o;1746:148:16:-;1326:12;:10;:12::i;:::-;1315:23;;:7;:5;:7::i;:::-;:23;;;1307:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1853:1:::1;1816:40;;1837:6;;;;;;;;;;;1816:40;;;;;;;;;;;;1884:1;1867:6;;:19;;;;;;;;;;;;;;;;;;1746:148::o:0;1665:59:3:-;1326:12:16;:10;:12::i;:::-;1315:23;;:7;:5;:7::i;:::-;:23;;;1307:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1709:8:3::1;:6;:8::i;:::-;1665:59::o:0;1095:87:16:-;1141:7;1168:6;;;;;;;;;;;1161:13;;1095:87;:::o;520:310:3:-;1326:12:16;:10;:12::i;:::-;1315:23;;:7;:5;:7::i;:::-;:23;;;1307:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;329:7:3::1;613:25;;:10;:25;;605:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;709:1;689:6;:16;696:8;689:16;;;;;;;;;;;;:21;681:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;773:10;754:6;:16;761:8;754:16;;;;;;;;;;;:29;;;;793:30;802:8;812:10;793:30;;;;;;;:::i;:::-;;;;;;;;520:310:::0;;:::o;2760:104:5:-;2816:13;2849:7;2842:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2760:104;:::o;5670:295::-;5785:12;:10;:12::i;:::-;5773:24;;:8;:24;;;;5765:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;5885:8;5840:18;:32;5859:12;:10;:12::i;:::-;5840:32;;;;;;;;;;;;;;;:42;5873:8;5840:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;5938:8;5909:48;;5924:12;:10;:12::i;:::-;5909:48;;;5948:8;5909:48;;;;;;:::i;:::-;;;;;;;;5670:295;;:::o;840:231:3:-;1326:12:16;:10;:12::i;:::-;1315:23;;:7;:5;:7::i;:::-;:23;;;1307:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;962:9:3::1;958:107;979:9;:16;975:1;:20;958:107;;;1015:39;1025:3;1030:9;1040:1;1030:12;;;;;;;;;;;;;;;;;;;;;;1044:6;1051:1;1044:9;;;;;;;;;;;;;;;;;;;;;;1015;:39::i;:::-;997:3;;;;;:::i;:::-;;;;958:107;;;;840:231:::0;;;:::o;6865:285:5:-;6997:41;7016:12;:10;:12::i;:::-;7030:7;6997:18;:41::i;:::-;6989:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;7103:39;7117:4;7123:2;7127:7;7136:5;7103:13;:39::i;:::-;6865:285;;;;:::o;2935:792::-;3008:13;3042:16;3050:7;3042;:16::i;:::-;3034:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;3123:23;3149:10;:19;3160:7;3149:19;;;;;;;;;;;3123:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3179:18;3200:9;:7;:9::i;:::-;3179:30;;3307:1;3291:4;3285:18;:23;3281:72;;;3332:9;3325:16;;;;;;3281:72;3483:1;3463:9;3457:23;:27;3453:108;;;3532:4;3538:9;3515:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3501:48;;;;;;3453:108;3693:4;3699:18;:7;:16;:18::i;:::-;3676:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3662:57;;;;2935:792;;;;:::o;187:46:3:-;;;;;;;;;;;;;;;;;:::o;6036:164:5:-;6133:4;6157:18;:25;6176:5;6157:25;;;;;;;;;;;;;;;:35;6183:8;6157:35;;;;;;;;;;;;;;;;;;;;;;;;;6150:42;;6036:164;;;;:::o;2049:244:16:-;1326:12;:10;:12::i;:::-;1315:23;;:7;:5;:7::i;:::-;:23;;;1307:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2158:1:::1;2138:22;;:8;:22;;;;2130:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2248:8;2219:38;;2240:6;;;;;;;;;;;2219:38;;;;;;;;;;;;2277:8;2268:6;;:17;;;;;;;;;;;;;;;;;;2049:244:::0;:::o;8617:127:5:-;8682:4;8706:30;8728:7;8706:12;:21;;:30;;;;:::i;:::-;8699:37;;8617:127;;;:::o;605:98:2:-;658:7;685:10;678:17;;605:98;:::o;14763:183:5:-;14856:2;14829:15;:24;14845:7;14829:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;14912:7;14908:2;14874:46;;14883:23;14898:7;14883:14;:23::i;:::-;14874:46;;;;;;;;;;;;14763:183;;:::o;8028:123:9:-;8097:7;8124:19;8132:3;:10;;8124:7;:19::i;:::-;8117:26;;8028:123;;;:::o;8911:355:5:-;9004:4;9029:16;9037:7;9029;:16::i;:::-;9021:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;9105:13;9121:23;9136:7;9121:14;:23::i;:::-;9105:39;;9174:5;9163:16;;:7;:16;;;:51;;;;9207:7;9183:31;;:20;9195:7;9183:11;:20::i;:::-;:31;;;9163:51;:94;;;;9218:39;9242:5;9249:7;9218:23;:39::i;:::-;9163:94;9155:103;;;8911:355;;;;:::o;12047:599::-;12172:4;12145:31;;:23;12160:7;12145:14;:23::i;:::-;:31;;;12137:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;12273:1;12259:16;;:2;:16;;;;12251:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;12329:39;12350:4;12356:2;12360:7;12329:20;:39::i;:::-;12433:29;12450:1;12454:7;12433:8;:29::i;:::-;12475:35;12502:7;12475:13;:19;12489:4;12475:19;;;;;;;;;;;;;;;:26;;:35;;;;:::i;:::-;;12521:30;12543:7;12521:13;:17;12535:2;12521:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;12564:29;12581:7;12590:2;12564:12;:16;;:29;;;;;:::i;:::-;;12630:7;12626:2;12611:27;;12620:4;12611:27;;;;;;;;;;;;12047:599;;;:::o;1349:310:3:-;1326:12:16;:10;:12::i;:::-;1315:23;;:7;:5;:7::i;:::-;:23;;;1307:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1454:6:3::1;:16;1461:8;1454:16;;;;;;;;;;;;1430:11;:21;1442:8;1430:21;;;;;;;;;;;;:40;1422:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;1517:11;:21;1529:8;1517:21;;;;;;;;;;;;:23;;;;;;;;;:::i;:::-;;;;;;1550:15;1593:11;:21;1605:8;1593:21;;;;;;;;;;;;329:7;1568:22;;:8;:22;;;;:::i;:::-;:46;;;;:::i;:::-;1550:64;;1633:19;1639:3;1644:7;1633:5;:19::i;:::-;1386:1:16;1349:310:3::0;;:::o;9535:137:10:-;9606:7;9641:22;9645:3;:10;;9657:5;9641:3;:22::i;:::-;9633:31;;9626:38;;9535:137;;;;:::o;2132:120:17:-;1676:8;:6;:8::i;:::-;1668:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;2201:5:::1;2191:7;;:15;;;;;;;;;;;;;;;;;;2222:22;2231:12;:10;:12::i;:::-;2222:22;;;;;;:::i;:::-;;;;;;;;2132:120::o:0;11165:545:5:-;11225:13;11241:23;11256:7;11241:14;:23::i;:::-;11225:39;;11295:48;11316:5;11331:1;11335:7;11295:20;:48::i;:::-;11384:29;11401:1;11405:7;11384:8;:29::i;:::-;11503:1;11472:10;:19;11483:7;11472:19;;;;;;;;;;;11466:33;;;;;:::i;:::-;;;:38;11462:97;;11528:10;:19;11539:7;11528:19;;;;;;;;;;;;11521:26;;;;:::i;:::-;11462:97;11571:36;11599:7;11571:13;:20;11585:5;11571:20;;;;;;;;;;;;;;;:27;;:36;;;;:::i;:::-;;11620:28;11640:7;11620:12;:19;;:28;;;;:::i;:::-;;11694:7;11690:1;11666:36;;11675:5;11666:36;;;;;;;;;;;;11165:545;;:::o;8490:236:9:-;8570:7;8579;8600:11;8613:13;8630:22;8634:3;:10;;8646:5;8630:3;:22::i;:::-;8599:53;;;;8679:3;8671:12;;8709:5;8701:14;;8663:55;;;;;;8490:236;;;;;:::o;13247:100:5:-;13331:8;13320;:19;;;;;;;;;;;;:::i;:::-;;13247:100;:::o;9776:213:9:-;9883:7;9934:44;9939:3;:10;;9959:3;9951:12;;9965;9934:4;:44::i;:::-;9926:53;;9903:78;;9776:213;;;;;:::o;9077:114:10:-;9137:7;9164:19;9172:3;:10;;9164:7;:19::i;:::-;9157:26;;9077:114;;;:::o;1873:118:17:-;1399:8;:6;:8::i;:::-;1398:9;1390:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;1943:4:::1;1933:7;;:14;;;;;;;;;;;;;;;;;;1963:20;1970:12;:10;:12::i;:::-;1963:20;;;;;;:::i;:::-;;;;;;;;1873:118::o:0;8032:272:5:-;8146:28;8156:4;8162:2;8166:7;8146:9;:28::i;:::-;8193:48;8216:4;8222:2;8226:7;8235:5;8193:22;:48::i;:::-;8185:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;8032:272;;;;:::o;284:723:18:-;340:13;570:1;561:5;:10;557:53;;;588:10;;;;;;;;;;;;;;;;;;;;;557:53;620:12;635:5;620:20;;651:14;676:78;691:1;683:4;:9;676:78;;709:8;;;;;:::i;:::-;;;;740:2;732:10;;;;;:::i;:::-;;;676:78;;;764:19;796:6;786:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;764:39;;814:154;830:1;821:5;:10;814:154;;858:1;848:11;;;;;:::i;:::-;;;925:2;917:5;:10;;;;:::i;:::-;904:2;:24;;;;:::i;:::-;891:39;;874:6;881;874:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;954:2;945:11;;;;;:::i;:::-;;;814:154;;;992:6;978:21;;;;;284:723;;;;:::o;7789:151:9:-;7873:4;7897:35;7907:3;:10;;7927:3;7919:12;;7897:9;:35::i;:::-;7890:42;;7789:151;;;;:::o;4607:110::-;4663:7;4690:3;:12;;:19;;;;4683:26;;4607:110;;;:::o;1799:185:3:-;1932:45;1959:4;1965:2;1969:7;1932:26;:45::i;:::-;1799:185;;;:::o;8622:137:10:-;8692:4;8716:35;8724:3;:10;;8744:5;8736:14;;8716:7;:35::i;:::-;8709:42;;8622:137;;;;:::o;8315:131::-;8382:4;8406:32;8411:3;:10;;8431:5;8423:14;;8406:4;:32::i;:::-;8399:39;;8315:131;;;;:::o;7212:185:9:-;7301:4;7325:64;7330:3;:10;;7350:3;7342:12;;7380:5;7364:23;;7356:32;;7325:4;:64::i;:::-;7318:71;;7212:185;;;;;:::o;10532:404:5:-;10626:1;10612:16;;:2;:16;;;;10604:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;10685:16;10693:7;10685;:16::i;:::-;10684:17;10676:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;10747:45;10776:1;10780:2;10784:7;10747:20;:45::i;:::-;10805:30;10827:7;10805:13;:17;10819:2;10805:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;10848:29;10865:7;10874:2;10848:12;:16;;:29;;;;;:::i;:::-;;10920:7;10916:2;10895:33;;10912:1;10895:33;;;;;;;;;;;;10532:404;;:::o;4573:204:10:-;4640:7;4689:5;4668:3;:11;;:18;;;;:26;4660:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4751:3;:11;;4763:5;4751:18;;;;;;;;;;;;;;;;;;;;;;;;4744:25;;4573:204;;;;:::o;7563:142:9:-;7640:4;7664:33;7672:3;:10;;7692:3;7684:12;;7664:7;:33::i;:::-;7657:40;;7563:142;;;;:::o;5072:279::-;5139:7;5148;5198:5;5176:3;:12;;:19;;;;:27;5168:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;5255:22;5280:3;:12;;5293:5;5280:19;;;;;;;;;;;;;;;;;;;;;;;;;;5255:44;;5318:5;:10;;;5330:5;:12;;;5310:33;;;;;5072:279;;;;;:::o;6569:319::-;6663:7;6683:16;6702:3;:12;;:17;6715:3;6702:17;;;;;;;;;;;;6683:36;;6750:1;6738:8;:13;;6753:12;6730:36;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;6820:3;:12;;6844:1;6833:8;:12;;;;:::i;:::-;6820:26;;;;;;;;;;;;;;;;;;;;;;;;;;:33;;;6813:40;;;6569:319;;;;;:::o;4120:109:10:-;4176:7;4203:3;:11;;:18;;;;4196:25;;4120:109;;;:::o;13912:843:5:-;14033:4;14059:15;:2;:13;;;:15::i;:::-;14055:693;;;14111:2;14095:36;;;14132:12;:10;:12::i;:::-;14146:4;14152:7;14161:5;14095:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;14091:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14358:1;14341:6;:13;:18;14337:341;;;14384:60;;;;;;;;;;:::i;:::-;;;;;;;;14337:341;14628:6;14622:13;14613:6;14609:2;14605:15;14598:38;14091:602;14228:45;;;14218:55;;;:6;:55;;;;14211:62;;;;;14055:693;14732:4;14725:11;;13912:843;;;;;;;:::o;4387:125:9:-;4458:4;4503:1;4482:3;:12;;:17;4495:3;4482:17;;;;;;;;;;;;:22;;4475:29;;4387:125;;;;:::o;599:241:8:-;709:45;736:4;742:2;746:7;709:26;:45::i;:::-;776:8;:6;:8::i;:::-;775:9;767:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;599:241;;;:::o;2275:1544:10:-;2341:4;2459:18;2480:3;:12;;:19;2493:5;2480:19;;;;;;;;;;;;2459:40;;2530:1;2516:10;:15;2512:1300;;2878:21;2915:1;2902:10;:14;;;;:::i;:::-;2878:38;;2931:17;2972:1;2951:3;:11;;:18;;;;:22;;;;:::i;:::-;2931:42;;3218:17;3238:3;:11;;3250:9;3238:22;;;;;;;;;;;;;;;;;;;;;;;;3218:42;;3384:9;3355:3;:11;;3367:13;3355:26;;;;;;;;;;;;;;;;;;;;;;;:38;;;;3503:1;3487:13;:17;;;;:::i;:::-;3461:3;:12;;:23;3474:9;3461:23;;;;;;;;;;;:43;;;;3613:3;:11;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3708:3;:12;;:19;3721:5;3708:19;;;;;;;;;;;3701:26;;;3751:4;3744:11;;;;;;;;2512:1300;3795:5;3788:12;;;2275:1544;;;;;:::o;1685:414::-;1748:4;1770:21;1780:3;1785:5;1770:9;:21::i;:::-;1765:327;;1808:3;:11;;1825:5;1808:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1991:3;:11;;:18;;;;1969:3;:12;;:19;1982:5;1969:19;;;;;;;;;;;:40;;;;2031:4;2024:11;;;;1765:327;2075:5;2068:12;;1685:414;;;;;:::o;1887:692:9:-;1963:4;2079:16;2098:3;:12;;:17;2111:3;2098:17;;;;;;;;;;;;2079:36;;2144:1;2132:8;:13;2128:444;;;2199:3;:12;;2217:38;;;;;;;;2234:3;2217:38;;;;2247:5;2217:38;;;2199:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2414:3;:12;;:19;;;;2394:3;:12;;:17;2407:3;2394:17;;;;;;;;;;;:39;;;;2455:4;2448:11;;;;;2128:444;2528:5;2492:3;:12;;2516:1;2505:8;:12;;;;:::i;:::-;2492:26;;;;;;;;;;;;;;;;;;;;;;;;;;:33;;:41;;;;2555:5;2548:12;;;1887:692;;;;;;:::o;2754:1549::-;2818:4;2934:16;2953:3;:12;;:17;2966:3;2953:17;;;;;;;;;;;;2934:36;;2999:1;2987:8;:13;2983:1313;;3348:21;3383:1;3372:8;:12;;;;:::i;:::-;3348:36;;3399:17;3441:1;3419:3;:12;;:19;;;;:23;;;;:::i;:::-;3399:43;;3687:26;3716:3;:12;;3729:9;3716:23;;;;;;;;;;;;;;;;;;;;;;;;;;3687:52;;3864:9;3834:3;:12;;3847:13;3834:27;;;;;;;;;;;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;;3988:1;3972:13;:17;;;;:::i;:::-;3941:3;:12;;:28;3954:9;:14;;;3941:28;;;;;;;;;;;:48;;;;4098:3;:12;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4194:3;:12;;:17;4207:3;4194:17;;;;;;;;;;;4187:24;;;4235:4;4228:11;;;;;;;;2983:1313;4279:5;4272:12;;;2754:1549;;;;;:::o;743:422:1:-;803:4;1011:12;1122:7;1110:20;1102:28;;1156:1;1149:4;:8;1142:15;;;743:422;;;:::o;15559:93:5:-;;;;:::o;3905:129:10:-;3978:4;4025:1;4002:3;:12;;:19;4015:5;4002:19;;;;;;;;;;;;:24;;3995:31;;3905:129;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:623:19:-;;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;274:6;267:5;260:21;300:4;293:5;289:16;282:23;;325:6;375:3;367:4;359:6;355:17;350:3;346:27;343:36;340:2;;;392:1;389;382:12;340:2;420:1;405:236;430:6;427:1;424:13;405:236;;;497:3;525:37;558:3;546:10;525:37;:::i;:::-;520:3;513:50;592:4;587:3;583:14;576:21;;626:4;621:3;617:14;610:21;;465:176;452:1;449;445:9;440:14;;405:236;;;409:14;126:521;;;;;;;:::o;653:343::-;;755:65;771:48;812:6;771:48;:::i;:::-;755:65;:::i;:::-;746:74;;843:6;836:5;829:21;881:4;874:5;870:16;919:3;910:6;905:3;901:16;898:25;895:2;;;936:1;933;926:12;895:2;949:41;983:6;978:3;973;949:41;:::i;:::-;736:260;;;;;;:::o;1002:345::-;;1105:66;1121:49;1163:6;1121:49;:::i;:::-;1105:66;:::i;:::-;1096:75;;1194:6;1187:5;1180:21;1232:4;1225:5;1221:16;1270:3;1261:6;1256:3;1252:16;1249:25;1246:2;;;1287:1;1284;1277:12;1246:2;1300:41;1334:6;1329:3;1324;1300:41;:::i;:::-;1086:261;;;;;;:::o;1353:139::-;;1437:6;1424:20;1415:29;;1453:33;1480:5;1453:33;:::i;:::-;1405:87;;;;:::o;1515:303::-;;1635:3;1628:4;1620:6;1616:17;1612:27;1602:2;;1653:1;1650;1643:12;1602:2;1693:6;1680:20;1718:94;1808:3;1800:6;1793:4;1785:6;1781:17;1718:94;:::i;:::-;1709:103;;1592:226;;;;;:::o;1824:133::-;;1905:6;1892:20;1883:29;;1921:30;1945:5;1921:30;:::i;:::-;1873:84;;;;:::o;1963:137::-;;2046:6;2033:20;2024:29;;2062:32;2088:5;2062:32;:::i;:::-;2014:86;;;;:::o;2106:141::-;;2193:6;2187:13;2178:22;;2209:32;2235:5;2209:32;:::i;:::-;2168:79;;;;:::o;2266:271::-;;2370:3;2363:4;2355:6;2351:17;2347:27;2337:2;;2388:1;2385;2378:12;2337:2;2428:6;2415:20;2453:78;2527:3;2519:6;2512:4;2504:6;2500:17;2453:78;:::i;:::-;2444:87;;2327:210;;;;;:::o;2557:273::-;;2662:3;2655:4;2647:6;2643:17;2639:27;2629:2;;2680:1;2677;2670:12;2629:2;2720:6;2707:20;2745:79;2820:3;2812:6;2805:4;2797:6;2793:17;2745:79;:::i;:::-;2736:88;;2619:211;;;;;:::o;2836:139::-;;2920:6;2907:20;2898:29;;2936:33;2963:5;2936:33;:::i;:::-;2888:87;;;;:::o;2981:262::-;;3089:2;3077:9;3068:7;3064:23;3060:32;3057:2;;;3105:1;3102;3095:12;3057:2;3148:1;3173:53;3218:7;3209:6;3198:9;3194:22;3173:53;:::i;:::-;3163:63;;3119:117;3047:196;;;;:::o;3249:407::-;;;3374:2;3362:9;3353:7;3349:23;3345:32;3342:2;;;3390:1;3387;3380:12;3342:2;3433:1;3458:53;3503:7;3494:6;3483:9;3479:22;3458:53;:::i;:::-;3448:63;;3404:117;3560:2;3586:53;3631:7;3622:6;3611:9;3607:22;3586:53;:::i;:::-;3576:63;;3531:118;3332:324;;;;;:::o;3662:552::-;;;;3804:2;3792:9;3783:7;3779:23;3775:32;3772:2;;;3820:1;3817;3810:12;3772:2;3863:1;3888:53;3933:7;3924:6;3913:9;3909:22;3888:53;:::i;:::-;3878:63;;3834:117;3990:2;4016:53;4061:7;4052:6;4041:9;4037:22;4016:53;:::i;:::-;4006:63;;3961:118;4118:2;4144:53;4189:7;4180:6;4169:9;4165:22;4144:53;:::i;:::-;4134:63;;4089:118;3762:452;;;;;:::o;4220:809::-;;;;;4388:3;4376:9;4367:7;4363:23;4359:33;4356:2;;;4405:1;4402;4395:12;4356:2;4448:1;4473:53;4518:7;4509:6;4498:9;4494:22;4473:53;:::i;:::-;4463:63;;4419:117;4575:2;4601:53;4646:7;4637:6;4626:9;4622:22;4601:53;:::i;:::-;4591:63;;4546:118;4703:2;4729:53;4774:7;4765:6;4754:9;4750:22;4729:53;:::i;:::-;4719:63;;4674:118;4859:2;4848:9;4844:18;4831:32;4890:18;4882:6;4879:30;4876:2;;;4922:1;4919;4912:12;4876:2;4950:62;5004:7;4995:6;4984:9;4980:22;4950:62;:::i;:::-;4940:72;;4802:220;4346:683;;;;;;;:::o;5035:838::-;;;;5227:2;5215:9;5206:7;5202:23;5198:32;5195:2;;;5243:1;5240;5233:12;5195:2;5286:1;5311:53;5356:7;5347:6;5336:9;5332:22;5311:53;:::i;:::-;5301:63;;5257:117;5441:2;5430:9;5426:18;5413:32;5472:18;5464:6;5461:30;5458:2;;;5504:1;5501;5494:12;5458:2;5532:78;5602:7;5593:6;5582:9;5578:22;5532:78;:::i;:::-;5522:88;;5384:236;5687:2;5676:9;5672:18;5659:32;5718:18;5710:6;5707:30;5704:2;;;5750:1;5747;5740:12;5704:2;5778:78;5848:7;5839:6;5828:9;5824:22;5778:78;:::i;:::-;5768:88;;5630:236;5185:688;;;;;:::o;5879:401::-;;;6001:2;5989:9;5980:7;5976:23;5972:32;5969:2;;;6017:1;6014;6007:12;5969:2;6060:1;6085:53;6130:7;6121:6;6110:9;6106:22;6085:53;:::i;:::-;6075:63;;6031:117;6187:2;6213:50;6255:7;6246:6;6235:9;6231:22;6213:50;:::i;:::-;6203:60;;6158:115;5959:321;;;;;:::o;6286:407::-;;;6411:2;6399:9;6390:7;6386:23;6382:32;6379:2;;;6427:1;6424;6417:12;6379:2;6470:1;6495:53;6540:7;6531:6;6520:9;6516:22;6495:53;:::i;:::-;6485:63;;6441:117;6597:2;6623:53;6668:7;6659:6;6648:9;6644:22;6623:53;:::i;:::-;6613:63;;6568:118;6369:324;;;;;:::o;6699:552::-;;;;6841:2;6829:9;6820:7;6816:23;6812:32;6809:2;;;6857:1;6854;6847:12;6809:2;6900:1;6925:53;6970:7;6961:6;6950:9;6946:22;6925:53;:::i;:::-;6915:63;;6871:117;7027:2;7053:53;7098:7;7089:6;7078:9;7074:22;7053:53;:::i;:::-;7043:63;;6998:118;7155:2;7181:53;7226:7;7217:6;7206:9;7202:22;7181:53;:::i;:::-;7171:63;;7126:118;6799:452;;;;;:::o;7257:260::-;;7364:2;7352:9;7343:7;7339:23;7335:32;7332:2;;;7380:1;7377;7370:12;7332:2;7423:1;7448:52;7492:7;7483:6;7472:9;7468:22;7448:52;:::i;:::-;7438:62;;7394:116;7322:195;;;;:::o;7523:282::-;;7641:2;7629:9;7620:7;7616:23;7612:32;7609:2;;;7657:1;7654;7647:12;7609:2;7700:1;7725:63;7780:7;7771:6;7760:9;7756:22;7725:63;:::i;:::-;7715:73;;7671:127;7599:206;;;;:::o;7811:375::-;;7929:2;7917:9;7908:7;7904:23;7900:32;7897:2;;;7945:1;7942;7935:12;7897:2;8016:1;8005:9;8001:17;7988:31;8046:18;8038:6;8035:30;8032:2;;;8078:1;8075;8068:12;8032:2;8106:63;8161:7;8152:6;8141:9;8137:22;8106:63;:::i;:::-;8096:73;;7959:220;7887:299;;;;:::o;8192:262::-;;8300:2;8288:9;8279:7;8275:23;8271:32;8268:2;;;8316:1;8313;8306:12;8268:2;8359:1;8384:53;8429:7;8420:6;8409:9;8405:22;8384:53;:::i;:::-;8374:63;;8330:117;8258:196;;;;:::o;8460:407::-;;;8585:2;8573:9;8564:7;8560:23;8556:32;8553:2;;;8601:1;8598;8591:12;8553:2;8644:1;8669:53;8714:7;8705:6;8694:9;8690:22;8669:53;:::i;:::-;8659:63;;8615:117;8771:2;8797:53;8842:7;8833:6;8822:9;8818:22;8797:53;:::i;:::-;8787:63;;8742:118;8543:324;;;;;:::o;8873:179::-;;8963:46;9005:3;8997:6;8963:46;:::i;:::-;9041:4;9036:3;9032:14;9018:28;;8953:99;;;;:::o;9058:118::-;9145:24;9163:5;9145:24;:::i;:::-;9140:3;9133:37;9123:53;;:::o;9212:732::-;;9360:54;9408:5;9360:54;:::i;:::-;9430:86;9509:6;9504:3;9430:86;:::i;:::-;9423:93;;9540:56;9590:5;9540:56;:::i;:::-;9619:7;9650:1;9635:284;9660:6;9657:1;9654:13;9635:284;;;9736:6;9730:13;9763:63;9822:3;9807:13;9763:63;:::i;:::-;9756:70;;9849:60;9902:6;9849:60;:::i;:::-;9839:70;;9695:224;9682:1;9679;9675:9;9670:14;;9635:284;;;9639:14;9935:3;9928:10;;9336:608;;;;;;;:::o;9950:109::-;10031:21;10046:5;10031:21;:::i;:::-;10026:3;10019:34;10009:50;;:::o;10065:360::-;;10179:38;10211:5;10179:38;:::i;:::-;10233:70;10296:6;10291:3;10233:70;:::i;:::-;10226:77;;10312:52;10357:6;10352:3;10345:4;10338:5;10334:16;10312:52;:::i;:::-;10389:29;10411:6;10389:29;:::i;:::-;10384:3;10380:39;10373:46;;10155:270;;;;;:::o;10431:364::-;;10547:39;10580:5;10547:39;:::i;:::-;10602:71;10666:6;10661:3;10602:71;:::i;:::-;10595:78;;10682:52;10727:6;10722:3;10715:4;10708:5;10704:16;10682:52;:::i;:::-;10759:29;10781:6;10759:29;:::i;:::-;10754:3;10750:39;10743:46;;10523:272;;;;;:::o;10801:377::-;;10935:39;10968:5;10935:39;:::i;:::-;10990:89;11072:6;11067:3;10990:89;:::i;:::-;10983:96;;11088:52;11133:6;11128:3;11121:4;11114:5;11110:16;11088:52;:::i;:::-;11165:6;11160:3;11156:16;11149:23;;10911:267;;;;;:::o;11184:366::-;;11347:67;11411:2;11406:3;11347:67;:::i;:::-;11340:74;;11423:93;11512:3;11423:93;:::i;:::-;11541:2;11536:3;11532:12;11525:19;;11330:220;;;:::o;11556:366::-;;11719:67;11783:2;11778:3;11719:67;:::i;:::-;11712:74;;11795:93;11884:3;11795:93;:::i;:::-;11913:2;11908:3;11904:12;11897:19;;11702:220;;;:::o;11928:366::-;;12091:67;12155:2;12150:3;12091:67;:::i;:::-;12084:74;;12167:93;12256:3;12167:93;:::i;:::-;12285:2;12280:3;12276:12;12269:19;;12074:220;;;:::o;12300:366::-;;12463:67;12527:2;12522:3;12463:67;:::i;:::-;12456:74;;12539:93;12628:3;12539:93;:::i;:::-;12657:2;12652:3;12648:12;12641:19;;12446:220;;;:::o;12672:366::-;;12835:67;12899:2;12894:3;12835:67;:::i;:::-;12828:74;;12911:93;13000:3;12911:93;:::i;:::-;13029:2;13024:3;13020:12;13013:19;;12818:220;;;:::o;13044:366::-;;13207:67;13271:2;13266:3;13207:67;:::i;:::-;13200:74;;13283:93;13372:3;13283:93;:::i;:::-;13401:2;13396:3;13392:12;13385:19;;13190:220;;;:::o;13416:366::-;;13579:67;13643:2;13638:3;13579:67;:::i;:::-;13572:74;;13655:93;13744:3;13655:93;:::i;:::-;13773:2;13768:3;13764:12;13757:19;;13562:220;;;:::o;13788:366::-;;13951:67;14015:2;14010:3;13951:67;:::i;:::-;13944:74;;14027:93;14116:3;14027:93;:::i;:::-;14145:2;14140:3;14136:12;14129:19;;13934:220;;;:::o;14160:366::-;;14323:67;14387:2;14382:3;14323:67;:::i;:::-;14316:74;;14399:93;14488:3;14399:93;:::i;:::-;14517:2;14512:3;14508:12;14501:19;;14306:220;;;:::o;14532:366::-;;14695:67;14759:2;14754:3;14695:67;:::i;:::-;14688:74;;14771:93;14860:3;14771:93;:::i;:::-;14889:2;14884:3;14880:12;14873:19;;14678:220;;;:::o;14904:366::-;;15067:67;15131:2;15126:3;15067:67;:::i;:::-;15060:74;;15143:93;15232:3;15143:93;:::i;:::-;15261:2;15256:3;15252:12;15245:19;;15050:220;;;:::o;15276:366::-;;15439:67;15503:2;15498:3;15439:67;:::i;:::-;15432:74;;15515:93;15604:3;15515:93;:::i;:::-;15633:2;15628:3;15624:12;15617:19;;15422:220;;;:::o;15648:366::-;;15811:67;15875:2;15870:3;15811:67;:::i;:::-;15804:74;;15887:93;15976:3;15887:93;:::i;:::-;16005:2;16000:3;15996:12;15989:19;;15794:220;;;:::o;16020:366::-;;16183:67;16247:2;16242:3;16183:67;:::i;:::-;16176:74;;16259:93;16348:3;16259:93;:::i;:::-;16377:2;16372:3;16368:12;16361:19;;16166:220;;;:::o;16392:366::-;;16555:67;16619:2;16614:3;16555:67;:::i;:::-;16548:74;;16631:93;16720:3;16631:93;:::i;:::-;16749:2;16744:3;16740:12;16733:19;;16538:220;;;:::o;16764:366::-;;16927:67;16991:2;16986:3;16927:67;:::i;:::-;16920:74;;17003:93;17092:3;17003:93;:::i;:::-;17121:2;17116:3;17112:12;17105:19;;16910:220;;;:::o;17136:366::-;;17299:67;17363:2;17358:3;17299:67;:::i;:::-;17292:74;;17375:93;17464:3;17375:93;:::i;:::-;17493:2;17488:3;17484:12;17477:19;;17282:220;;;:::o;17508:366::-;;17671:67;17735:2;17730:3;17671:67;:::i;:::-;17664:74;;17747:93;17836:3;17747:93;:::i;:::-;17865:2;17860:3;17856:12;17849:19;;17654:220;;;:::o;17880:366::-;;18043:67;18107:2;18102:3;18043:67;:::i;:::-;18036:74;;18119:93;18208:3;18119:93;:::i;:::-;18237:2;18232:3;18228:12;18221:19;;18026:220;;;:::o;18252:366::-;;18415:67;18479:2;18474:3;18415:67;:::i;:::-;18408:74;;18491:93;18580:3;18491:93;:::i;:::-;18609:2;18604:3;18600:12;18593:19;;18398:220;;;:::o;18624:366::-;;18787:67;18851:2;18846:3;18787:67;:::i;:::-;18780:74;;18863:93;18952:3;18863:93;:::i;:::-;18981:2;18976:3;18972:12;18965:19;;18770:220;;;:::o;18996:366::-;;19159:67;19223:2;19218:3;19159:67;:::i;:::-;19152:74;;19235:93;19324:3;19235:93;:::i;:::-;19353:2;19348:3;19344:12;19337:19;;19142:220;;;:::o;19368:366::-;;19531:67;19595:2;19590:3;19531:67;:::i;:::-;19524:74;;19607:93;19696:3;19607:93;:::i;:::-;19725:2;19720:3;19716:12;19709:19;;19514:220;;;:::o;19740:366::-;;19903:67;19967:2;19962:3;19903:67;:::i;:::-;19896:74;;19979:93;20068:3;19979:93;:::i;:::-;20097:2;20092:3;20088:12;20081:19;;19886:220;;;:::o;20112:366::-;;20275:67;20339:2;20334:3;20275:67;:::i;:::-;20268:74;;20351:93;20440:3;20351:93;:::i;:::-;20469:2;20464:3;20460:12;20453:19;;20258:220;;;:::o;20484:108::-;20561:24;20579:5;20561:24;:::i;:::-;20556:3;20549:37;20539:53;;:::o;20598:118::-;20685:24;20703:5;20685:24;:::i;:::-;20680:3;20673:37;20663:53;;:::o;20722:115::-;20807:23;20824:5;20807:23;:::i;:::-;20802:3;20795:36;20785:52;;:::o;20843:435::-;;21045:95;21136:3;21127:6;21045:95;:::i;:::-;21038:102;;21157:95;21248:3;21239:6;21157:95;:::i;:::-;21150:102;;21269:3;21262:10;;21027:251;;;;;:::o;21284:222::-;;21415:2;21404:9;21400:18;21392:26;;21428:71;21496:1;21485:9;21481:17;21472:6;21428:71;:::i;:::-;21382:124;;;;:::o;21512:640::-;;21745:3;21734:9;21730:19;21722:27;;21759:71;21827:1;21816:9;21812:17;21803:6;21759:71;:::i;:::-;21840:72;21908:2;21897:9;21893:18;21884:6;21840:72;:::i;:::-;21922;21990:2;21979:9;21975:18;21966:6;21922:72;:::i;:::-;22041:9;22035:4;22031:20;22026:2;22015:9;22011:18;22004:48;22069:76;22140:4;22131:6;22069:76;:::i;:::-;22061:84;;21712:440;;;;;;;:::o;22158:373::-;;22339:2;22328:9;22324:18;22316:26;;22388:9;22382:4;22378:20;22374:1;22363:9;22359:17;22352:47;22416:108;22519:4;22510:6;22416:108;:::i;:::-;22408:116;;22306:225;;;;:::o;22537:210::-;;22662:2;22651:9;22647:18;22639:26;;22675:65;22737:1;22726:9;22722:17;22713:6;22675:65;:::i;:::-;22629:118;;;;:::o;22753:313::-;;22904:2;22893:9;22889:18;22881:26;;22953:9;22947:4;22943:20;22939:1;22928:9;22924:17;22917:47;22981:78;23054:4;23045:6;22981:78;:::i;:::-;22973:86;;22871:195;;;;:::o;23072:419::-;;23276:2;23265:9;23261:18;23253:26;;23325:9;23319:4;23315:20;23311:1;23300:9;23296:17;23289:47;23353:131;23479:4;23353:131;:::i;:::-;23345:139;;23243:248;;;:::o;23497:419::-;;23701:2;23690:9;23686:18;23678:26;;23750:9;23744:4;23740:20;23736:1;23725:9;23721:17;23714:47;23778:131;23904:4;23778:131;:::i;:::-;23770:139;;23668:248;;;:::o;23922:419::-;;24126:2;24115:9;24111:18;24103:26;;24175:9;24169:4;24165:20;24161:1;24150:9;24146:17;24139:47;24203:131;24329:4;24203:131;:::i;:::-;24195:139;;24093:248;;;:::o;24347:419::-;;24551:2;24540:9;24536:18;24528:26;;24600:9;24594:4;24590:20;24586:1;24575:9;24571:17;24564:47;24628:131;24754:4;24628:131;:::i;:::-;24620:139;;24518:248;;;:::o;24772:419::-;;24976:2;24965:9;24961:18;24953:26;;25025:9;25019:4;25015:20;25011:1;25000:9;24996:17;24989:47;25053:131;25179:4;25053:131;:::i;:::-;25045:139;;24943:248;;;:::o;25197:419::-;;25401:2;25390:9;25386:18;25378:26;;25450:9;25444:4;25440:20;25436:1;25425:9;25421:17;25414:47;25478:131;25604:4;25478:131;:::i;:::-;25470:139;;25368:248;;;:::o;25622:419::-;;25826:2;25815:9;25811:18;25803:26;;25875:9;25869:4;25865:20;25861:1;25850:9;25846:17;25839:47;25903:131;26029:4;25903:131;:::i;:::-;25895:139;;25793:248;;;:::o;26047:419::-;;26251:2;26240:9;26236:18;26228:26;;26300:9;26294:4;26290:20;26286:1;26275:9;26271:17;26264:47;26328:131;26454:4;26328:131;:::i;:::-;26320:139;;26218:248;;;:::o;26472:419::-;;26676:2;26665:9;26661:18;26653:26;;26725:9;26719:4;26715:20;26711:1;26700:9;26696:17;26689:47;26753:131;26879:4;26753:131;:::i;:::-;26745:139;;26643:248;;;:::o;26897:419::-;;27101:2;27090:9;27086:18;27078:26;;27150:9;27144:4;27140:20;27136:1;27125:9;27121:17;27114:47;27178:131;27304:4;27178:131;:::i;:::-;27170:139;;27068:248;;;:::o;27322:419::-;;27526:2;27515:9;27511:18;27503:26;;27575:9;27569:4;27565:20;27561:1;27550:9;27546:17;27539:47;27603:131;27729:4;27603:131;:::i;:::-;27595:139;;27493:248;;;:::o;27747:419::-;;27951:2;27940:9;27936:18;27928:26;;28000:9;27994:4;27990:20;27986:1;27975:9;27971:17;27964:47;28028:131;28154:4;28028:131;:::i;:::-;28020:139;;27918:248;;;:::o;28172:419::-;;28376:2;28365:9;28361:18;28353:26;;28425:9;28419:4;28415:20;28411:1;28400:9;28396:17;28389:47;28453:131;28579:4;28453:131;:::i;:::-;28445:139;;28343:248;;;:::o;28597:419::-;;28801:2;28790:9;28786:18;28778:26;;28850:9;28844:4;28840:20;28836:1;28825:9;28821:17;28814:47;28878:131;29004:4;28878:131;:::i;:::-;28870:139;;28768:248;;;:::o;29022:419::-;;29226:2;29215:9;29211:18;29203:26;;29275:9;29269:4;29265:20;29261:1;29250:9;29246:17;29239:47;29303:131;29429:4;29303:131;:::i;:::-;29295:139;;29193:248;;;:::o;29447:419::-;;29651:2;29640:9;29636:18;29628:26;;29700:9;29694:4;29690:20;29686:1;29675:9;29671:17;29664:47;29728:131;29854:4;29728:131;:::i;:::-;29720:139;;29618:248;;;:::o;29872:419::-;;30076:2;30065:9;30061:18;30053:26;;30125:9;30119:4;30115:20;30111:1;30100:9;30096:17;30089:47;30153:131;30279:4;30153:131;:::i;:::-;30145:139;;30043:248;;;:::o;30297:419::-;;30501:2;30490:9;30486:18;30478:26;;30550:9;30544:4;30540:20;30536:1;30525:9;30521:17;30514:47;30578:131;30704:4;30578:131;:::i;:::-;30570:139;;30468:248;;;:::o;30722:419::-;;30926:2;30915:9;30911:18;30903:26;;30975:9;30969:4;30965:20;30961:1;30950:9;30946:17;30939:47;31003:131;31129:4;31003:131;:::i;:::-;30995:139;;30893:248;;;:::o;31147:419::-;;31351:2;31340:9;31336:18;31328:26;;31400:9;31394:4;31390:20;31386:1;31375:9;31371:17;31364:47;31428:131;31554:4;31428:131;:::i;:::-;31420:139;;31318:248;;;:::o;31572:419::-;;31776:2;31765:9;31761:18;31753:26;;31825:9;31819:4;31815:20;31811:1;31800:9;31796:17;31789:47;31853:131;31979:4;31853:131;:::i;:::-;31845:139;;31743:248;;;:::o;31997:419::-;;32201:2;32190:9;32186:18;32178:26;;32250:9;32244:4;32240:20;32236:1;32225:9;32221:17;32214:47;32278:131;32404:4;32278:131;:::i;:::-;32270:139;;32168:248;;;:::o;32422:419::-;;32626:2;32615:9;32611:18;32603:26;;32675:9;32669:4;32665:20;32661:1;32650:9;32646:17;32639:47;32703:131;32829:4;32703:131;:::i;:::-;32695:139;;32593:248;;;:::o;32847:419::-;;33051:2;33040:9;33036:18;33028:26;;33100:9;33094:4;33090:20;33086:1;33075:9;33071:17;33064:47;33128:131;33254:4;33128:131;:::i;:::-;33120:139;;33018:248;;;:::o;33272:419::-;;33476:2;33465:9;33461:18;33453:26;;33525:9;33519:4;33515:20;33511:1;33500:9;33496:17;33489:47;33553:131;33679:4;33553:131;:::i;:::-;33545:139;;33443:248;;;:::o;33697:222::-;;33828:2;33817:9;33813:18;33805:26;;33841:71;33909:1;33898:9;33894:17;33885:6;33841:71;:::i;:::-;33795:124;;;;:::o;33925:332::-;;34084:2;34073:9;34069:18;34061:26;;34097:71;34165:1;34154:9;34150:17;34141:6;34097:71;:::i;:::-;34178:72;34246:2;34235:9;34231:18;34222:6;34178:72;:::i;:::-;34051:206;;;;;:::o;34263:218::-;;34392:2;34381:9;34377:18;34369:26;;34405:69;34471:1;34460:9;34456:17;34447:6;34405:69;:::i;:::-;34359:122;;;;:::o;34487:129::-;;34548:20;;:::i;:::-;34538:30;;34577:33;34605:4;34597:6;34577:33;:::i;:::-;34528:88;;;:::o;34622:75::-;;34688:2;34682:9;34672:19;;34662:35;:::o;34703:311::-;;34870:18;34862:6;34859:30;34856:2;;;34892:18;;:::i;:::-;34856:2;34942:4;34934:6;34930:17;34922:25;;35002:4;34996;34992:15;34984:23;;34785:229;;;:::o;35020:307::-;;35171:18;35163:6;35160:30;35157:2;;;35193:18;;:::i;:::-;35157:2;35231:29;35253:6;35231:29;:::i;:::-;35223:37;;35315:4;35309;35305:15;35297:23;;35086:241;;;:::o;35333:308::-;;35485:18;35477:6;35474:30;35471:2;;;35507:18;;:::i;:::-;35471:2;35545:29;35567:6;35545:29;:::i;:::-;35537:37;;35629:4;35623;35619:15;35611:23;;35400:241;;;:::o;35647:132::-;;35737:3;35729:11;;35767:4;35762:3;35758:14;35750:22;;35719:60;;;:::o;35785:114::-;;35886:5;35880:12;35870:22;;35859:40;;;:::o;35905:98::-;;35990:5;35984:12;35974:22;;35963:40;;;:::o;36009:99::-;;36095:5;36089:12;36079:22;;36068:40;;;:::o;36114:113::-;;36216:4;36211:3;36207:14;36199:22;;36189:38;;;:::o;36233:184::-;;36366:6;36361:3;36354:19;36406:4;36401:3;36397:14;36382:29;;36344:73;;;;:::o;36423:168::-;;36540:6;36535:3;36528:19;36580:4;36575:3;36571:14;36556:29;;36518:73;;;;:::o;36597:169::-;;36715:6;36710:3;36703:19;36755:4;36750:3;36746:14;36731:29;;36693:73;;;;:::o;36772:148::-;;36911:3;36896:18;;36886:34;;;;:::o;36926:305::-;;36985:20;37003:1;36985:20;:::i;:::-;36980:25;;37019:20;37037:1;37019:20;:::i;:::-;37014:25;;37173:1;37105:66;37101:74;37098:1;37095:81;37092:2;;;37179:18;;:::i;:::-;37092:2;37223:1;37220;37216:9;37209:16;;36970:261;;;;:::o;37237:185::-;;37294:20;37312:1;37294:20;:::i;:::-;37289:25;;37328:20;37346:1;37328:20;:::i;:::-;37323:25;;37367:1;37357:2;;37372:18;;:::i;:::-;37357:2;37414:1;37411;37407:9;37402:14;;37279:143;;;;:::o;37428:348::-;;37491:20;37509:1;37491:20;:::i;:::-;37486:25;;37525:20;37543:1;37525:20;:::i;:::-;37520:25;;37713:1;37645:66;37641:74;37638:1;37635:81;37630:1;37623:9;37616:17;37612:105;37609:2;;;37720:18;;:::i;:::-;37609:2;37768:1;37765;37761:9;37750:20;;37476:300;;;;:::o;37782:191::-;;37842:20;37860:1;37842:20;:::i;:::-;37837:25;;37876:20;37894:1;37876:20;:::i;:::-;37871:25;;37915:1;37912;37909:8;37906:2;;;37920:18;;:::i;:::-;37906:2;37965:1;37962;37958:9;37950:17;;37827:146;;;;:::o;37979:96::-;;38045:24;38063:5;38045:24;:::i;:::-;38034:35;;38024:51;;;:::o;38081:90::-;;38158:5;38151:13;38144:21;38133:32;;38123:48;;;:::o;38177:149::-;;38253:66;38246:5;38242:78;38231:89;;38221:105;;;:::o;38332:126::-;;38409:42;38402:5;38398:54;38387:65;;38377:81;;;:::o;38464:77::-;;38530:5;38519:16;;38509:32;;;:::o;38547:93::-;;38623:10;38616:5;38612:22;38601:33;;38591:49;;;:::o;38646:154::-;38730:6;38725:3;38720;38707:30;38792:1;38783:6;38778:3;38774:16;38767:27;38697:103;;;:::o;38806:307::-;38874:1;38884:113;38898:6;38895:1;38892:13;38884:113;;;38983:1;38978:3;38974:11;38968:18;38964:1;38959:3;38955:11;38948:39;38920:2;38917:1;38913:10;38908:15;;38884:113;;;39015:6;39012:1;39009:13;39006:2;;;39095:1;39086:6;39081:3;39077:16;39070:27;39006:2;38855:258;;;;:::o;39119:320::-;;39200:1;39194:4;39190:12;39180:22;;39247:1;39241:4;39237:12;39268:18;39258:2;;39324:4;39316:6;39312:17;39302:27;;39258:2;39386;39378:6;39375:14;39355:18;39352:38;39349:2;;;39405:18;;:::i;:::-;39349:2;39170:269;;;;:::o;39445:281::-;39528:27;39550:4;39528:27;:::i;:::-;39520:6;39516:40;39658:6;39646:10;39643:22;39622:18;39610:10;39607:34;39604:62;39601:2;;;39669:18;;:::i;:::-;39601:2;39709:10;39705:2;39698:22;39488:238;;;:::o;39732:233::-;;39794:24;39812:5;39794:24;:::i;:::-;39785:33;;39840:66;39833:5;39830:77;39827:2;;;39910:18;;:::i;:::-;39827:2;39957:1;39950:5;39946:13;39939:20;;39775:190;;;:::o;39971:176::-;;40020:20;40038:1;40020:20;:::i;:::-;40015:25;;40054:20;40072:1;40054:20;:::i;:::-;40049:25;;40093:1;40083:2;;40098:18;;:::i;:::-;40083:2;40139:1;40136;40132:9;40127:14;;40005:142;;;;:::o;40153:180::-;40201:77;40198:1;40191:88;40298:4;40295:1;40288:15;40322:4;40319:1;40312:15;40339:180;40387:77;40384:1;40377:88;40484:4;40481:1;40474:15;40508:4;40505:1;40498:15;40525:180;40573:77;40570:1;40563:88;40670:4;40667:1;40660:15;40694:4;40691:1;40684:15;40711:180;40759:77;40756:1;40749:88;40856:4;40853:1;40846:15;40880:4;40877:1;40870:15;40897:102;;40989:2;40985:7;40980:2;40973:5;40969:14;40965:28;40955:38;;40945:54;;;:::o;41005:221::-;41145:34;41141:1;41133:6;41129:14;41122:58;41214:4;41209:2;41201:6;41197:15;41190:29;41111:115;:::o;41232:230::-;41372:34;41368:1;41360:6;41356:14;41349:58;41441:13;41436:2;41428:6;41424:15;41417:38;41338:124;:::o;41468:170::-;41608:22;41604:1;41596:6;41592:14;41585:46;41574:64;:::o;41644:237::-;41784:34;41780:1;41772:6;41768:14;41761:58;41853:20;41848:2;41840:6;41836:15;41829:45;41750:131;:::o;41887:225::-;42027:34;42023:1;42015:6;42011:14;42004:58;42096:8;42091:2;42083:6;42079:15;42072:33;41993:119;:::o;42118:178::-;42258:30;42254:1;42246:6;42242:14;42235:54;42224:72;:::o;42302:223::-;42442:34;42438:1;42430:6;42426:14;42419:58;42511:6;42506:2;42498:6;42494:15;42487:31;42408:117;:::o;42531:175::-;42671:27;42667:1;42659:6;42655:14;42648:51;42637:69;:::o;42712:231::-;42852:34;42848:1;42840:6;42836:14;42829:58;42921:14;42916:2;42908:6;42904:15;42897:39;42818:125;:::o;42949:166::-;43089:18;43085:1;43077:6;43073:14;43066:42;43055:60;:::o;43121:178::-;43261:30;43257:1;43249:6;43245:14;43238:54;43227:72;:::o;43305:243::-;43445:34;43441:1;43433:6;43429:14;43422:58;43514:26;43509:2;43501:6;43497:15;43490:51;43411:137;:::o;43554:229::-;43694:34;43690:1;43682:6;43678:14;43671:58;43763:12;43758:2;43750:6;43746:15;43739:37;43660:123;:::o;43789:221::-;43929:34;43925:1;43917:6;43913:14;43906:58;43998:4;43993:2;43985:6;43981:15;43974:29;43895:115;:::o;44016:182::-;44156:34;44152:1;44144:6;44140:14;44133:58;44122:76;:::o;44204:231::-;44344:34;44340:1;44332:6;44328:14;44321:58;44413:14;44408:2;44400:6;44396:15;44389:39;44310:125;:::o;44441:182::-;44581:34;44577:1;44569:6;44565:14;44558:58;44547:76;:::o;44629:228::-;44769:34;44765:1;44757:6;44753:14;44746:58;44838:11;44833:2;44825:6;44821:15;44814:36;44735:122;:::o;44863:234::-;45003:34;44999:1;44991:6;44987:14;44980:58;45072:17;45067:2;45059:6;45055:15;45048:42;44969:128;:::o;45103:173::-;45243:25;45239:1;45231:6;45227:14;45220:49;45209:67;:::o;45282:220::-;45422:34;45418:1;45410:6;45406:14;45399:58;45491:3;45486:2;45478:6;45474:15;45467:28;45388:114;:::o;45508:178::-;45648:30;45644:1;45636:6;45632:14;45625:54;45614:72;:::o;45692:236::-;45832:34;45828:1;45820:6;45816:14;45809:58;45901:19;45896:2;45888:6;45884:15;45877:44;45798:130;:::o;45934:179::-;46074:31;46070:1;46062:6;46058:14;46051:55;46040:73;:::o;46119:235::-;46259:34;46255:1;46247:6;46243:14;46236:58;46328:18;46323:2;46315:6;46311:15;46304:43;46225:129;:::o;46360:122::-;46433:24;46451:5;46433:24;:::i;:::-;46426:5;46423:35;46413:2;;46472:1;46469;46462:12;46413:2;46403:79;:::o;46488:116::-;46558:21;46573:5;46558:21;:::i;:::-;46551:5;46548:32;46538:2;;46594:1;46591;46584:12;46538:2;46528:76;:::o;46610:120::-;46682:23;46699:5;46682:23;:::i;:::-;46675:5;46672:34;46662:2;;46720:1;46717;46710:12;46662:2;46652:78;:::o;46736:122::-;46809:24;46827:5;46809:24;:::i;:::-;46802:5;46799:35;46789:2;;46848:1;46845;46838:12;46789:2;46779:79;:::o
Swarm Source
ipfs://9d30b28bd2aae6da941a21888cce82f607c5c4ee2bd01832ca5da1fbe2b02099
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.