Source Code
Overview
ETH Balance
0 ETH
ETH Value
$0.00| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
Latest 1 internal transaction
Advanced mode:
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 17417926 | 60 days ago | Contract Creation | 0 ETH |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
ENSRegistry
Compiler Version
v0.8.28+commit.7893614a
Optimization Enabled:
Yes with 200 runs
Other Settings:
cancun EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
pragma solidity >=0.8.4;
import "./ENS.sol";
/**
* The ENS registry contract.
*/
contract ENSRegistry is ENS {
struct Record {
address owner;
address resolver;
uint64 ttl;
}
mapping (bytes32 => Record) records;
mapping (address => mapping(address => bool)) operators;
// Permits modifications only by the owner of the specified node.
modifier authorised(bytes32 node) {
address owner = records[node].owner;
require(owner == msg.sender || operators[owner][msg.sender]);
_;
}
/**
* @dev Constructs a new ENS registrar.
*/
constructor() public {
records[0x0].owner = msg.sender;
}
/**
* @dev Sets the record for a node.
* @param node The node to update.
* @param owner The address of the new owner.
* @param resolver The address of the resolver.
* @param ttl The TTL in seconds.
*/
function setRecord(bytes32 node, address owner, address resolver, uint64 ttl) external virtual override {
setOwner(node, owner);
_setResolverAndTTL(node, resolver, ttl);
}
/**
* @dev Sets the record for a subnode.
* @param node The parent node.
* @param label The hash of the label specifying the subnode.
* @param owner The address of the new owner.
* @param resolver The address of the resolver.
* @param ttl The TTL in seconds.
*/
function setSubnodeRecord(bytes32 node, bytes32 label, address owner, address resolver, uint64 ttl) external virtual override {
bytes32 subnode = setSubnodeOwner(node, label, owner);
_setResolverAndTTL(subnode, resolver, ttl);
}
/**
* @dev Transfers ownership of a node to a new address. May only be called by the current owner of the node.
* @param node The node to transfer ownership of.
* @param owner The address of the new owner.
*/
function setOwner(bytes32 node, address owner) public virtual override authorised(node) {
_setOwner(node, owner);
emit Transfer(node, owner);
}
/**
* @dev Transfers ownership of a subnode keccak256(node, label) to a new address. May only be called by the owner of the parent node.
* @param node The parent node.
* @param label The hash of the label specifying the subnode.
* @param owner The address of the new owner.
*/
function setSubnodeOwner(bytes32 node, bytes32 label, address owner) public virtual override authorised(node) returns(bytes32) {
bytes32 subnode = keccak256(abi.encodePacked(node, label));
_setOwner(subnode, owner);
emit NewOwner(node, label, owner);
return subnode;
}
/**
* @dev Sets the resolver address for the specified node.
* @param node The node to update.
* @param resolver The address of the resolver.
*/
function setResolver(bytes32 node, address resolver) public virtual override authorised(node) {
emit NewResolver(node, resolver);
records[node].resolver = resolver;
}
/**
* @dev Sets the TTL for the specified node.
* @param node The node to update.
* @param ttl The TTL in seconds.
*/
function setTTL(bytes32 node, uint64 ttl) public virtual override authorised(node) {
emit NewTTL(node, ttl);
records[node].ttl = ttl;
}
/**
* @dev Enable or disable approval for a third party ("operator") to manage
* all of `msg.sender`'s ENS records. Emits the ApprovalForAll event.
* @param operator Address to add to the set of authorized operators.
* @param approved True if the operator is approved, false to revoke approval.
*/
function setApprovalForAll(address operator, bool approved) external virtual override {
operators[msg.sender][operator] = approved;
emit ApprovalForAll(msg.sender, operator, approved);
}
/**
* @dev Returns the address that owns the specified node.
* @param node The specified node.
* @return address of the owner.
*/
function owner(bytes32 node) public virtual override view returns (address) {
address addr = records[node].owner;
if (addr == address(this)) {
return address(0x0);
}
return addr;
}
/**
* @dev Returns the address of the resolver for the specified node.
* @param node The specified node.
* @return address of the resolver.
*/
function resolver(bytes32 node) public virtual override view returns (address) {
return records[node].resolver;
}
/**
* @dev Returns the TTL of a node, and any records associated with it.
* @param node The specified node.
* @return ttl of the node.
*/
function ttl(bytes32 node) public virtual override view returns (uint64) {
return records[node].ttl;
}
/**
* @dev Returns whether a record has been imported to the registry.
* @param node The specified node.
* @return Bool if record exists
*/
function recordExists(bytes32 node) public virtual override view returns (bool) {
return records[node].owner != address(0x0);
}
/**
* @dev Query if an address is an authorized operator for another address.
* @param owner The address that owns the records.
* @param operator The address that acts on behalf of the owner.
* @return True if `operator` is an approved operator for `owner`, false otherwise.
*/
function isApprovedForAll(address owner, address operator) external virtual override view returns (bool) {
return operators[owner][operator];
}
function _setOwner(bytes32 node, address owner) internal virtual {
records[node].owner = owner;
}
function _setResolverAndTTL(bytes32 node, address resolver, uint64 ttl) internal {
if(resolver != records[node].resolver) {
records[node].resolver = resolver;
emit NewResolver(node, resolver);
}
if(ttl != records[node].ttl) {
records[node].ttl = ttl;
emit NewTTL(node, ttl);
}
}
}pragma solidity >=0.8.4;
interface ENS {
// Logged when the owner of a node assigns a new owner to a subnode.
event NewOwner(bytes32 indexed node, bytes32 indexed label, address owner);
// Logged when the owner of a node transfers ownership to a new account.
event Transfer(bytes32 indexed node, address owner);
// Logged when the resolver for a node changes.
event NewResolver(bytes32 indexed node, address resolver);
// Logged when the TTL of a node changes
event NewTTL(bytes32 indexed node, uint64 ttl);
// Logged when an operator is added or removed.
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
function setRecord(bytes32 node, address owner, address resolver, uint64 ttl) external virtual;
function setSubnodeRecord(bytes32 node, bytes32 label, address owner, address resolver, uint64 ttl) external virtual;
function setSubnodeOwner(bytes32 node, bytes32 label, address owner) external virtual returns(bytes32);
function setResolver(bytes32 node, address resolver) external virtual;
function setOwner(bytes32 node, address owner) external virtual;
function setTTL(bytes32 node, uint64 ttl) external virtual;
function setApprovalForAll(address operator, bool approved) external virtual;
function owner(bytes32 node) external virtual view returns (address);
function resolver(bytes32 node) external virtual view returns (address);
function ttl(bytes32 node) external virtual view returns (uint64);
function recordExists(bytes32 node) external virtual view returns (bool);
function isApprovedForAll(address owner, address operator) external virtual view returns (bool);
}{
"remappings": [
"@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/",
"@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/",
"@aragon/osx/=lib/osx/packages/contracts/src/",
"@aragon/osx-commons-contracts/=lib/osx-commons/contracts/",
"@aragon/admin-plugin/=lib/admin-plugin/packages/contracts/src/",
"@aragon/multisig-plugin/=lib/multisig-plugin/packages/contracts/src/",
"@aragon/token-voting-plugin/=lib/token-voting-plugin/src/",
"@aragon/staged-proposal-processor-plugin/=lib/staged-proposal-processor-plugin/src/",
"@ensdomains/ens-contracts/=lib/ens-contracts/",
"@ensdomains/buffer/=lib/buffer/",
"forge-std/=lib/forge-std/src/",
"@openzeppelin/openzeppelin-foundry-upgrades/=lib/staged-proposal-processor-plugin/node_modules/@openzeppelin/openzeppelin-foundry-upgrades/src/",
"admin-plugin/=lib/admin-plugin/",
"buffer/=lib/buffer/contracts/",
"ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/",
"ens-contracts/=lib/ens-contracts/contracts/",
"erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/",
"multisig-plugin/=lib/multisig-plugin/",
"openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/",
"openzeppelin-contracts/=lib/openzeppelin-contracts/",
"openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/",
"osx-commons/=lib/osx-commons/",
"osx/=lib/osx/",
"plugin-version-1.3/=lib/token-voting-plugin/lib/plugin-version-1.3/packages/contracts/src/",
"solidity-stringutils/=lib/staged-proposal-processor-plugin/node_modules/solidity-stringutils/",
"staged-proposal-processor-plugin/=lib/staged-proposal-processor-plugin/src/",
"token-voting-plugin/=lib/token-voting-plugin/src/"
],
"optimizer": {
"enabled": true,
"runs": 200
},
"metadata": {
"useLiteralContent": false,
"bytecodeHash": "ipfs",
"appendCBOR": true
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"evmVersion": "cancun",
"viaIR": true
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"label","type":"bytes32"},{"indexed":false,"internalType":"address","name":"owner","type":"address"}],"name":"NewOwner","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"address","name":"resolver","type":"address"}],"name":"NewResolver","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"uint64","name":"ttl","type":"uint64"}],"name":"NewTTL","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"address","name":"owner","type":"address"}],"name":"Transfer","type":"event"},{"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":"bytes32","name":"node","type":"bytes32"}],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"recordExists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"resolver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"address","name":"owner","type":"address"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"resolver","type":"address"},{"internalType":"uint64","name":"ttl","type":"uint64"}],"name":"setRecord","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"address","name":"resolver","type":"address"}],"name":"setResolver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes32","name":"label","type":"bytes32"},{"internalType":"address","name":"owner","type":"address"}],"name":"setSubnodeOwner","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes32","name":"label","type":"bytes32"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"resolver","type":"address"},{"internalType":"uint64","name":"ttl","type":"uint64"}],"name":"setSubnodeRecord","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"uint64","name":"ttl","type":"uint64"}],"name":"setTTL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"ttl","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"}]Contract Creation Code
60808060405234604d575f8080526020527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb580546001600160a01b031916331790556108b990816100528239f35b5f80fdfe6080806040526004361015610012575f80fd5b5f3560e01c9081630178b8bf146105ea5750806302571be3146105ba57806306ab59231461058957806314ab9038146104b157806316a25cbd146104785780631896f70a146103ac5780635b0fc9c3146102f25780635ef2c7f01461029a578063a22cb46514610211578063cf4088231461012e578063e985e9c5146100d75763f79fe538146100a0575f80fd5b346100d35760203660031901126100d3576004355f525f602052602060018060a01b0360405f2054161515604051908152f35b5f80fd5b346100d35760403660031901126100d3576100f061064a565b6100f8610634565b9060018060a01b03165f52600160205260405f209060018060a01b03165f52602052602060ff60405f2054166040519015158152f35b346100d35760803660031901126100d35760043561014a610634565b9061015361061e565b6064359167ffffffffffffffff831683036100d357805f525f60205260018060a01b0360405f2054163381149081156101ed575b50156100d3575f818152602081815260409182902080546001600160a01b0319166001600160a01b03909716968717905590519485526101eb9482917fd4735d920b0f87494915f556dd9b54c8f309026070caea5c737245152564d26691a2610769565b005b5f90815260016020908152604080832033845290915290205460ff16905085610187565b346100d35760403660031901126100d35761022a61064a565b602435908115158092036100d357335f52600160205260405f2060018060a01b0382165f5260205260405f2060ff1981541660ff841617905560405191825260018060a01b0316907f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a3005b346100d35760a03660031901126100d3576102b361061e565b6064356001600160a01b03811681036100d3576084359067ffffffffffffffff821682036100d3576102ed6101eb93602435600435610686565b610769565b346100d35760403660031901126100d35760043561030e610634565b815f525f60205260018060a01b0360405f205416338114908115610388575b50156100d3575f828152602081815260409182902080546001600160a01b0319166001600160a01b03909416938417905590519182527fd4735d920b0f87494915f556dd9b54c8f309026070caea5c737245152564d26691a2005b5f90815260016020908152604080832033845290915290205460ff1690508361032d565b346100d35760403660031901126100d3576004356103c8610634565b90805f525f60205260018060a01b0360405f205416338114908115610454575b50156100d3576040516001600160a01b038316815281907f335721b01866dc23fbee8b6b2c7b1e14d6f05c28cd35a2c934239f94095602a090602090a25f90815260208190526040902060010180546001600160a01b0319166001600160a01b03909216919091179055005b5f90815260016020908152604080832033845290915290205460ff169050836103e8565b346100d35760203660031901126100d3576004355f525f602052602067ffffffffffffffff600160405f20015460a01c16604051908152f35b346100d35760403660031901126100d35760043560243567ffffffffffffffff8116918282036100d357805f525f60205260018060a01b0360405f205416338114908115610565575b50156100d357807f1d4f9bbfc9cab89d66e1a1562f2233ccbf1308cb4f63de2ead5787adddb8fa6860206101eb95604051908152a25f525f602052600160405f20019081549067ffffffffffffffff60a01b9060a01b169067ffffffffffffffff60a01b1916179055565b5f90815260016020908152604080832033845290915290205460ff169050846104fa565b346100d35760603660031901126100d35760206105b26105a761061e565b602435600435610686565b604051908152f35b346100d35760203660031901126100d35760206105d8600435610660565b6040516001600160a01b039091168152f35b346100d35760203660031901126100d3576004355f90815260208181526040909120600101546001600160a01b0316825290f35b604435906001600160a01b03821682036100d357565b602435906001600160a01b03821682036100d357565b600435906001600160a01b03821682036100d357565b5f908152602081905260409020546001600160a01b03163081146106815790565b505f90565b805f525f60205260018060a01b0360405f205416338114908115610746575b50156100d3576040516020810190828252836040820152604081526060810181811067ffffffffffffffff82111761073257604081815291519092205f818152602081815292902080546001600160a01b0319166001600160a01b0390971696871790559482527fce0457fe73731f824cc272376169235128c118b49d344817417c6d108d155e8291a390565b634e487b7160e01b5f52604160045260245ffd5b5f90815260016020908152604080832033845290915281205460ff1691506106a5565b5f8181526020819052604090206001015490929183916001600160a01b039182169116810361082d575b505f525f60205267ffffffffffffffff600160405f20015460a01c169067ffffffffffffffff81169182036107c757505050565b5f83815260208181526040909120600101805467ffffffffffffffff60a01b191660a09390931b67ffffffffffffffff60a01b16929092179091557f1d4f9bbfc9cab89d66e1a1562f2233ccbf1308cb4f63de2ead5787adddb8fa6891604051908152a2565b60207f335721b01866dc23fbee8b6b2c7b1e14d6f05c28cd35a2c934239f94095602a091835f525f8252600160405f2001816bffffffffffffffffffffffff60a01b825416179055604051908152a2815f61079356fea2646970667358221220d8e6bbe1b3bd6763448b4df5df2eeb4813ed4f6522e9e37056efce8a0908e4ea64736f6c634300081c0033
Deployed Bytecode
0x6080806040526004361015610012575f80fd5b5f3560e01c9081630178b8bf146105ea5750806302571be3146105ba57806306ab59231461058957806314ab9038146104b157806316a25cbd146104785780631896f70a146103ac5780635b0fc9c3146102f25780635ef2c7f01461029a578063a22cb46514610211578063cf4088231461012e578063e985e9c5146100d75763f79fe538146100a0575f80fd5b346100d35760203660031901126100d3576004355f525f602052602060018060a01b0360405f2054161515604051908152f35b5f80fd5b346100d35760403660031901126100d3576100f061064a565b6100f8610634565b9060018060a01b03165f52600160205260405f209060018060a01b03165f52602052602060ff60405f2054166040519015158152f35b346100d35760803660031901126100d35760043561014a610634565b9061015361061e565b6064359167ffffffffffffffff831683036100d357805f525f60205260018060a01b0360405f2054163381149081156101ed575b50156100d3575f818152602081815260409182902080546001600160a01b0319166001600160a01b03909716968717905590519485526101eb9482917fd4735d920b0f87494915f556dd9b54c8f309026070caea5c737245152564d26691a2610769565b005b5f90815260016020908152604080832033845290915290205460ff16905085610187565b346100d35760403660031901126100d35761022a61064a565b602435908115158092036100d357335f52600160205260405f2060018060a01b0382165f5260205260405f2060ff1981541660ff841617905560405191825260018060a01b0316907f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a3005b346100d35760a03660031901126100d3576102b361061e565b6064356001600160a01b03811681036100d3576084359067ffffffffffffffff821682036100d3576102ed6101eb93602435600435610686565b610769565b346100d35760403660031901126100d35760043561030e610634565b815f525f60205260018060a01b0360405f205416338114908115610388575b50156100d3575f828152602081815260409182902080546001600160a01b0319166001600160a01b03909416938417905590519182527fd4735d920b0f87494915f556dd9b54c8f309026070caea5c737245152564d26691a2005b5f90815260016020908152604080832033845290915290205460ff1690508361032d565b346100d35760403660031901126100d3576004356103c8610634565b90805f525f60205260018060a01b0360405f205416338114908115610454575b50156100d3576040516001600160a01b038316815281907f335721b01866dc23fbee8b6b2c7b1e14d6f05c28cd35a2c934239f94095602a090602090a25f90815260208190526040902060010180546001600160a01b0319166001600160a01b03909216919091179055005b5f90815260016020908152604080832033845290915290205460ff169050836103e8565b346100d35760203660031901126100d3576004355f525f602052602067ffffffffffffffff600160405f20015460a01c16604051908152f35b346100d35760403660031901126100d35760043560243567ffffffffffffffff8116918282036100d357805f525f60205260018060a01b0360405f205416338114908115610565575b50156100d357807f1d4f9bbfc9cab89d66e1a1562f2233ccbf1308cb4f63de2ead5787adddb8fa6860206101eb95604051908152a25f525f602052600160405f20019081549067ffffffffffffffff60a01b9060a01b169067ffffffffffffffff60a01b1916179055565b5f90815260016020908152604080832033845290915290205460ff169050846104fa565b346100d35760603660031901126100d35760206105b26105a761061e565b602435600435610686565b604051908152f35b346100d35760203660031901126100d35760206105d8600435610660565b6040516001600160a01b039091168152f35b346100d35760203660031901126100d3576004355f90815260208181526040909120600101546001600160a01b0316825290f35b604435906001600160a01b03821682036100d357565b602435906001600160a01b03821682036100d357565b600435906001600160a01b03821682036100d357565b5f908152602081905260409020546001600160a01b03163081146106815790565b505f90565b805f525f60205260018060a01b0360405f205416338114908115610746575b50156100d3576040516020810190828252836040820152604081526060810181811067ffffffffffffffff82111761073257604081815291519092205f818152602081815292902080546001600160a01b0319166001600160a01b0390971696871790559482527fce0457fe73731f824cc272376169235128c118b49d344817417c6d108d155e8291a390565b634e487b7160e01b5f52604160045260245ffd5b5f90815260016020908152604080832033845290915281205460ff1691506106a5565b5f8181526020819052604090206001015490929183916001600160a01b039182169116810361082d575b505f525f60205267ffffffffffffffff600160405f20015460a01c169067ffffffffffffffff81169182036107c757505050565b5f83815260208181526040909120600101805467ffffffffffffffff60a01b191660a09390931b67ffffffffffffffff60a01b16929092179091557f1d4f9bbfc9cab89d66e1a1562f2233ccbf1308cb4f63de2ead5787adddb8fa6891604051908152a2565b60207f335721b01866dc23fbee8b6b2c7b1e14d6f05c28cd35a2c934239f94095602a091835f525f8252600160405f2001816bffffffffffffffffffffffff60a01b825416179055604051908152a2815f61079356fea2646970667358221220d8e6bbe1b3bd6763448b4df5df2eeb4813ed4f6522e9e37056efce8a0908e4ea64736f6c634300081c0033
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.