Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 88 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Text | 20496229 | 94 days ago | IN | 0 ETH | 0.00010159 | ||||
Multicall | 17759121 | 478 days ago | IN | 0 ETH | 0.00405622 | ||||
Set DNS Records | 17616738 | 498 days ago | IN | 0 ETH | 0.00127886 | ||||
Set Text | 17576329 | 503 days ago | IN | 0 ETH | 0.00113938 | ||||
Multicall | 17576034 | 503 days ago | IN | 0 ETH | 0.00117218 | ||||
Set DNS Records | 17340356 | 536 days ago | IN | 0 ETH | 0.00166242 | ||||
Set DNS Records | 17075631 | 574 days ago | IN | 0 ETH | 0.00433217 | ||||
Set DNS Records | 17075575 | 574 days ago | IN | 0 ETH | 0.01311179 | ||||
Set DNS Records | 16673579 | 630 days ago | IN | 0 ETH | 0.00616596 | ||||
Set DNS Records | 16673574 | 630 days ago | IN | 0 ETH | 0.00216441 | ||||
Multicall | 16657042 | 633 days ago | IN | 0 ETH | 0.00050174 | ||||
Set DNS Records | 16558208 | 647 days ago | IN | 0 ETH | 0.00756806 | ||||
Set DNS Records | 16280996 | 685 days ago | IN | 0 ETH | 0.0010527 | ||||
Multicall | 16248047 | 690 days ago | IN | 0 ETH | 0.00076204 | ||||
Multicall | 16142714 | 705 days ago | IN | 0 ETH | 0.00117313 | ||||
Set DNS Records | 15494891 | 796 days ago | IN | 0 ETH | 0.00198203 | ||||
Multicall | 15494888 | 796 days ago | IN | 0 ETH | 0.00049046 | ||||
Multicall | 15494873 | 796 days ago | IN | 0 ETH | 0.00085655 | ||||
Multicall | 15318171 | 824 days ago | IN | 0 ETH | 0.00214858 | ||||
Multicall | 15286043 | 829 days ago | IN | 0 ETH | 0.00059672 | ||||
Multicall | 15263972 | 833 days ago | IN | 0 ETH | 0.00085789 | ||||
Multicall | 15248042 | 835 days ago | IN | 0 ETH | 0.00708744 | ||||
Set DNS Records | 15193241 | 844 days ago | IN | 0 ETH | 0.00493596 | ||||
Multicall | 15166595 | 848 days ago | IN | 0 ETH | 0.00455465 | ||||
Multicall | 15166582 | 848 days ago | IN | 0 ETH | 0.00417698 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
PublicResolver
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity Standard Json-Input format)
pragma solidity >=0.8.4; import "../registry/ENS.sol"; import "./profiles/ABIResolver.sol"; import "./profiles/AddrResolver.sol"; import "./profiles/ContentHashResolver.sol"; import "./profiles/DNSResolver.sol"; import "./profiles/InterfaceResolver.sol"; import "./profiles/NameResolver.sol"; import "./profiles/PubkeyResolver.sol"; import "./profiles/TextResolver.sol"; /** * A simple resolver anyone can use; only allows the owner of a node to set its * address. */ contract PublicResolver is ABIResolver, AddrResolver, ContentHashResolver, DNSResolver, InterfaceResolver, NameResolver, PubkeyResolver, TextResolver { ENS ens; /** * A mapping of authorisations. An address that is authorised for a name * may make any changes to the name that the owner could, but may not update * the set of authorisations. * (node, owner, caller) => isAuthorised */ mapping(bytes32=>mapping(address=>mapping(address=>bool))) public authorisations; event AuthorisationChanged(bytes32 indexed node, address indexed owner, address indexed target, bool isAuthorised); constructor(ENS _ens) { ens = _ens; } /** * @dev Sets or clears an authorisation. * Authorisations are specific to the caller. Any account can set an authorisation * for any name, but the authorisation that is checked will be that of the * current owner of a name. Thus, transferring a name effectively clears any * existing authorisations, and new authorisations can be set in advance of * an ownership transfer if desired. * * @param node The name to change the authorisation on. * @param target The address that is to be authorised or deauthorised. * @param isAuthorised True if the address should be authorised, or false if it should be deauthorised. */ function setAuthorisation(bytes32 node, address target, bool isAuthorised) external { authorisations[node][msg.sender][target] = isAuthorised; emit AuthorisationChanged(node, msg.sender, target, isAuthorised); } function isAuthorised(bytes32 node) internal override view returns(bool) { address owner = ens.owner(node); return owner == msg.sender || authorisations[node][owner][msg.sender]; } function multicall(bytes[] calldata data) external returns(bytes[] memory results) { results = new bytes[](data.length); for(uint i = 0; i < data.length; i++) { (bool success, bytes memory result) = address(this).delegatecall(data[i]); require(success); results[i] = result; } return results; } function supportsInterface(bytes4 interfaceID) virtual override(ABIResolver, AddrResolver, ContentHashResolver, DNSResolver, InterfaceResolver, NameResolver, PubkeyResolver, TextResolver) public pure returns(bool) { return super.supportsInterface(interfaceID); } }
pragma solidity ^0.8.4; /** * @dev A library for working with mutable byte buffers in Solidity. * * Byte buffers are mutable and expandable, and provide a variety of primitives * for writing to them. At any time you can fetch a bytes object containing the * current contents of the buffer. The bytes object should not be stored between * operations, as it may change due to resizing of the buffer. */ library Buffer { /** * @dev Represents a mutable buffer. Buffers have a current value (buf) and * a capacity. The capacity may be longer than the current value, in * which case it can be extended without the need to allocate more memory. */ struct buffer { bytes buf; uint capacity; } /** * @dev Initializes a buffer with an initial capacity. * @param buf The buffer to initialize. * @param capacity The number of bytes of space to allocate the buffer. * @return The buffer, for chaining. */ function init(buffer memory buf, uint capacity) internal pure returns(buffer memory) { if (capacity % 32 != 0) { capacity += 32 - (capacity % 32); } // Allocate space for the buffer data buf.capacity = capacity; assembly { let ptr := mload(0x40) mstore(buf, ptr) mstore(ptr, 0) mstore(0x40, add(32, add(ptr, capacity))) } return buf; } /** * @dev Initializes a new buffer from an existing bytes object. * Changes to the buffer may mutate the original value. * @param b The bytes object to initialize the buffer with. * @return A new buffer. */ function fromBytes(bytes memory b) internal pure returns(buffer memory) { buffer memory buf; buf.buf = b; buf.capacity = b.length; return buf; } function resize(buffer memory buf, uint capacity) private pure { bytes memory oldbuf = buf.buf; init(buf, capacity); append(buf, oldbuf); } function max(uint a, uint b) private pure returns(uint) { if (a > b) { return a; } return b; } /** * @dev Sets buffer length to 0. * @param buf The buffer to truncate. * @return The original buffer, for chaining.. */ function truncate(buffer memory buf) internal pure returns (buffer memory) { assembly { let bufptr := mload(buf) mstore(bufptr, 0) } return buf; } /** * @dev Writes a byte string to a buffer. Resizes if doing so would exceed * the capacity of the buffer. * @param buf The buffer to append to. * @param off The start offset to write to. * @param data The data to append. * @param len The number of bytes to copy. * @return The original buffer, for chaining. */ function write(buffer memory buf, uint off, bytes memory data, uint len) internal pure returns(buffer memory) { require(len <= data.length); if (off + len > buf.capacity) { resize(buf, max(buf.capacity, len + off) * 2); } uint dest; uint src; assembly { // Memory address of the buffer data let bufptr := mload(buf) // Length of existing buffer data let buflen := mload(bufptr) // Start address = buffer address + offset + sizeof(buffer length) dest := add(add(bufptr, 32), off) // Update buffer length if we're extending it if gt(add(len, off), buflen) { mstore(bufptr, add(len, off)) } src := add(data, 32) } // Copy word-length chunks while possible for (; len >= 32; len -= 32) { assembly { mstore(dest, mload(src)) } dest += 32; src += 32; } // Copy remaining bytes unchecked { uint mask = (256 ** (32 - len)) - 1; assembly { let srcpart := and(mload(src), not(mask)) let destpart := and(mload(dest), mask) mstore(dest, or(destpart, srcpart)) } } return buf; } /** * @dev Appends a byte string to a buffer. Resizes if doing so would exceed * the capacity of the buffer. * @param buf The buffer to append to. * @param data The data to append. * @param len The number of bytes to copy. * @return The original buffer, for chaining. */ function append(buffer memory buf, bytes memory data, uint len) internal pure returns (buffer memory) { return write(buf, buf.buf.length, data, len); } /** * @dev Appends a byte string to a buffer. Resizes if doing so would exceed * the capacity of the buffer. * @param buf The buffer to append to. * @param data The data to append. * @return The original buffer, for chaining. */ function append(buffer memory buf, bytes memory data) internal pure returns (buffer memory) { return write(buf, buf.buf.length, data, data.length); } /** * @dev Writes a byte to the buffer. Resizes if doing so would exceed the * capacity of the buffer. * @param buf The buffer to append to. * @param off The offset to write the byte at. * @param data The data to append. * @return The original buffer, for chaining. */ function writeUint8(buffer memory buf, uint off, uint8 data) internal pure returns(buffer memory) { if (off >= buf.capacity) { resize(buf, buf.capacity * 2); } assembly { // Memory address of the buffer data let bufptr := mload(buf) // Length of existing buffer data let buflen := mload(bufptr) // Address = buffer address + sizeof(buffer length) + off let dest := add(add(bufptr, off), 32) mstore8(dest, data) // Update buffer length if we extended it if eq(off, buflen) { mstore(bufptr, add(buflen, 1)) } } return buf; } /** * @dev Appends a byte to the buffer. Resizes if doing so would exceed the * capacity of the buffer. * @param buf The buffer to append to. * @param data The data to append. * @return The original buffer, for chaining. */ function appendUint8(buffer memory buf, uint8 data) internal pure returns(buffer memory) { return writeUint8(buf, buf.buf.length, data); } /** * @dev Writes up to 32 bytes to the buffer. Resizes if doing so would * exceed the capacity of the buffer. * @param buf The buffer to append to. * @param off The offset to write at. * @param data The data to append. * @param len The number of bytes to write (left-aligned). * @return The original buffer, for chaining. */ function write(buffer memory buf, uint off, bytes32 data, uint len) private pure returns(buffer memory) { if (len + off > buf.capacity) { resize(buf, (len + off) * 2); } unchecked { uint mask = (256 ** len) - 1; // Right-align data data = data >> (8 * (32 - len)); assembly { // Memory address of the buffer data let bufptr := mload(buf) // Address = buffer address + sizeof(buffer length) + off + len let dest := add(add(bufptr, off), len) mstore(dest, or(and(mload(dest), not(mask)), data)) // Update buffer length if we extended it if gt(add(off, len), mload(bufptr)) { mstore(bufptr, add(off, len)) } } } return buf; } /** * @dev Writes a bytes20 to the buffer. Resizes if doing so would exceed the * capacity of the buffer. * @param buf The buffer to append to. * @param off The offset to write at. * @param data The data to append. * @return The original buffer, for chaining. */ function writeBytes20(buffer memory buf, uint off, bytes20 data) internal pure returns (buffer memory) { return write(buf, off, bytes32(data), 20); } /** * @dev Appends a bytes20 to the buffer. Resizes if doing so would exceed * the capacity of the buffer. * @param buf The buffer to append to. * @param data The data to append. * @return The original buffer, for chhaining. */ function appendBytes20(buffer memory buf, bytes20 data) internal pure returns (buffer memory) { return write(buf, buf.buf.length, bytes32(data), 20); } /** * @dev Appends a bytes32 to the buffer. Resizes if doing so would exceed * the capacity of the buffer. * @param buf The buffer to append to. * @param data The data to append. * @return The original buffer, for chaining. */ function appendBytes32(buffer memory buf, bytes32 data) internal pure returns (buffer memory) { return write(buf, buf.buf.length, data, 32); } /** * @dev Writes an integer to the buffer. Resizes if doing so would exceed * the capacity of the buffer. * @param buf The buffer to append to. * @param off The offset to write at. * @param data The data to append. * @param len The number of bytes to write (right-aligned). * @return The original buffer, for chaining. */ function writeInt(buffer memory buf, uint off, uint data, uint len) private pure returns(buffer memory) { if (len + off > buf.capacity) { resize(buf, (len + off) * 2); } uint mask = (256 ** len) - 1; assembly { // Memory address of the buffer data let bufptr := mload(buf) // Address = buffer address + off + sizeof(buffer length) + len let dest := add(add(bufptr, off), len) mstore(dest, or(and(mload(dest), not(mask)), data)) // Update buffer length if we extended it if gt(add(off, len), mload(bufptr)) { mstore(bufptr, add(off, len)) } } return buf; } /** * @dev Appends a byte to the end of the buffer. Resizes if doing so would * exceed the capacity of the buffer. * @param buf The buffer to append to. * @param data The data to append. * @return The original buffer. */ function appendInt(buffer memory buf, uint data, uint len) internal pure returns(buffer memory) { return writeInt(buf, buf.buf.length, data, len); } }
pragma solidity ^0.8.4; library BytesUtils { /* * @dev Returns the keccak-256 hash of a byte range. * @param self The byte string to hash. * @param offset The position to start hashing at. * @param len The number of bytes to hash. * @return The hash of the byte range. */ function keccak(bytes memory self, uint offset, uint len) internal pure returns (bytes32 ret) { require(offset + len <= self.length); assembly { ret := keccak256(add(add(self, 32), offset), len) } } /* * @dev Returns a positive number if `other` comes lexicographically after * `self`, a negative number if it comes before, or zero if the * contents of the two bytes are equal. * @param self The first bytes to compare. * @param other The second bytes to compare. * @return The result of the comparison. */ function compare(bytes memory self, bytes memory other) internal pure returns (int) { return compare(self, 0, self.length, other, 0, other.length); } /* * @dev Returns a positive number if `other` comes lexicographically after * `self`, a negative number if it comes before, or zero if the * contents of the two bytes are equal. Comparison is done per-rune, * on unicode codepoints. * @param self The first bytes to compare. * @param offset The offset of self. * @param len The length of self. * @param other The second bytes to compare. * @param otheroffset The offset of the other string. * @param otherlen The length of the other string. * @return The result of the comparison. */ function compare(bytes memory self, uint offset, uint len, bytes memory other, uint otheroffset, uint otherlen) internal pure returns (int) { uint shortest = len; if (otherlen < len) shortest = otherlen; uint selfptr; uint otherptr; assembly { selfptr := add(self, add(offset, 32)) otherptr := add(other, add(otheroffset, 32)) } for (uint idx = 0; idx < shortest; idx += 32) { uint a; uint b; assembly { a := mload(selfptr) b := mload(otherptr) } if (a != b) { // Mask out irrelevant bytes and check again uint mask; if (shortest > 32) { mask = type(uint256).max; } else { mask = ~(2 ** (8 * (32 - shortest + idx)) - 1); } int diff = int(a & mask) - int(b & mask); if (diff != 0) return diff; } selfptr += 32; otherptr += 32; } return int(len) - int(otherlen); } /* * @dev Returns true if the two byte ranges are equal. * @param self The first byte range to compare. * @param offset The offset into the first byte range. * @param other The second byte range to compare. * @param otherOffset The offset into the second byte range. * @param len The number of bytes to compare * @return True if the byte ranges are equal, false otherwise. */ function equals(bytes memory self, uint offset, bytes memory other, uint otherOffset, uint len) internal pure returns (bool) { return keccak(self, offset, len) == keccak(other, otherOffset, len); } /* * @dev Returns true if the two byte ranges are equal with offsets. * @param self The first byte range to compare. * @param offset The offset into the first byte range. * @param other The second byte range to compare. * @param otherOffset The offset into the second byte range. * @return True if the byte ranges are equal, false otherwise. */ function equals(bytes memory self, uint offset, bytes memory other, uint otherOffset) internal pure returns (bool) { return keccak(self, offset, self.length - offset) == keccak(other, otherOffset, other.length - otherOffset); } /* * @dev Compares a range of 'self' to all of 'other' and returns True iff * they are equal. * @param self The first byte range to compare. * @param offset The offset into the first byte range. * @param other The second byte range to compare. * @return True if the byte ranges are equal, false otherwise. */ function equals(bytes memory self, uint offset, bytes memory other) internal pure returns (bool) { return self.length >= offset + other.length && equals(self, offset, other, 0, other.length); } /* * @dev Returns true if the two byte ranges are equal. * @param self The first byte range to compare. * @param other The second byte range to compare. * @return True if the byte ranges are equal, false otherwise. */ function equals(bytes memory self, bytes memory other) internal pure returns(bool) { return self.length == other.length && equals(self, 0, other, 0, self.length); } /* * @dev Returns the 8-bit number at the specified index of self. * @param self The byte string. * @param idx The index into the bytes * @return The specified 8 bits of the string, interpreted as an integer. */ function readUint8(bytes memory self, uint idx) internal pure returns (uint8 ret) { return uint8(self[idx]); } /* * @dev Returns the 16-bit number at the specified index of self. * @param self The byte string. * @param idx The index into the bytes * @return The specified 16 bits of the string, interpreted as an integer. */ function readUint16(bytes memory self, uint idx) internal pure returns (uint16 ret) { require(idx + 2 <= self.length); assembly { ret := and(mload(add(add(self, 2), idx)), 0xFFFF) } } /* * @dev Returns the 32-bit number at the specified index of self. * @param self The byte string. * @param idx The index into the bytes * @return The specified 32 bits of the string, interpreted as an integer. */ function readUint32(bytes memory self, uint idx) internal pure returns (uint32 ret) { require(idx + 4 <= self.length); assembly { ret := and(mload(add(add(self, 4), idx)), 0xFFFFFFFF) } } /* * @dev Returns the 32 byte value at the specified index of self. * @param self The byte string. * @param idx The index into the bytes * @return The specified 32 bytes of the string. */ function readBytes32(bytes memory self, uint idx) internal pure returns (bytes32 ret) { require(idx + 32 <= self.length); assembly { ret := mload(add(add(self, 32), idx)) } } /* * @dev Returns the 32 byte value at the specified index of self. * @param self The byte string. * @param idx The index into the bytes * @return The specified 32 bytes of the string. */ function readBytes20(bytes memory self, uint idx) internal pure returns (bytes20 ret) { require(idx + 20 <= self.length); assembly { ret := and(mload(add(add(self, 32), idx)), 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000) } } /* * @dev Returns the n byte value at the specified index of self. * @param self The byte string. * @param idx The index into the bytes. * @param len The number of bytes. * @return The specified 32 bytes of the string. */ function readBytesN(bytes memory self, uint idx, uint len) internal pure returns (bytes32 ret) { require(len <= 32); require(idx + len <= self.length); assembly { let mask := not(sub(exp(256, sub(32, len)), 1)) ret := and(mload(add(add(self, 32), idx)), mask) } } function memcpy(uint dest, uint src, uint len) private pure { // Copy word-length chunks while possible for (; len >= 32; len -= 32) { assembly { mstore(dest, mload(src)) } dest += 32; src += 32; } // Copy remaining bytes unchecked { uint mask = (256 ** (32 - len)) - 1; assembly { let srcpart := and(mload(src), not(mask)) let destpart := and(mload(dest), mask) mstore(dest, or(destpart, srcpart)) } } } /* * @dev Copies a substring into a new byte string. * @param self The byte string to copy from. * @param offset The offset to start copying at. * @param len The number of bytes to copy. */ function substring(bytes memory self, uint offset, uint len) internal pure returns(bytes memory) { require(offset + len <= self.length); bytes memory ret = new bytes(len); uint dest; uint src; assembly { dest := add(ret, 32) src := add(add(self, 32), offset) } memcpy(dest, src, len); return ret; } // Maps characters from 0x30 to 0x7A to their base32 values. // 0xFF represents invalid characters in that range. bytes constant base32HexTable = hex'00010203040506070809FFFFFFFFFFFFFF0A0B0C0D0E0F101112131415161718191A1B1C1D1E1FFFFFFFFFFFFFFFFFFFFF0A0B0C0D0E0F101112131415161718191A1B1C1D1E1F'; /** * @dev Decodes unpadded base32 data of up to one word in length. * @param self The data to decode. * @param off Offset into the string to start at. * @param len Number of characters to decode. * @return The decoded data, left aligned. */ function base32HexDecodeWord(bytes memory self, uint off, uint len) internal pure returns(bytes32) { require(len <= 52); uint ret = 0; uint8 decoded; for(uint i = 0; i < len; i++) { bytes1 char = self[off + i]; require(char >= 0x30 && char <= 0x7A); decoded = uint8(base32HexTable[uint(uint8(char)) - 0x30]); require(decoded <= 0x20); if(i == len - 1) { break; } ret = (ret << 5) | decoded; } uint bitlen = len * 5; if(len % 8 == 0) { // Multiple of 8 characters, no padding ret = (ret << 5) | decoded; } else if(len % 8 == 2) { // Two extra characters - 1 byte ret = (ret << 3) | (decoded >> 2); bitlen -= 2; } else if(len % 8 == 4) { // Four extra characters - 2 bytes ret = (ret << 1) | (decoded >> 4); bitlen -= 4; } else if(len % 8 == 5) { // Five extra characters - 3 bytes ret = (ret << 4) | (decoded >> 1); bitlen -= 1; } else if(len % 8 == 7) { // Seven extra characters - 4 bytes ret = (ret << 2) | (decoded >> 3); bitlen -= 3; } else { revert(); } return bytes32(ret << (256 - bitlen)); } }
pragma solidity ^0.8.4; import "./BytesUtils.sol"; import "@ensdomains/buffer/contracts/Buffer.sol"; /** * @dev RRUtils is a library that provides utilities for parsing DNS resource records. */ library RRUtils { using BytesUtils for *; using Buffer for *; /** * @dev Returns the number of bytes in the DNS name at 'offset' in 'self'. * @param self The byte array to read a name from. * @param offset The offset to start reading at. * @return The length of the DNS name at 'offset', in bytes. */ function nameLength(bytes memory self, uint offset) internal pure returns(uint) { uint idx = offset; while (true) { assert(idx < self.length); uint labelLen = self.readUint8(idx); idx += labelLen + 1; if (labelLen == 0) { break; } } return idx - offset; } /** * @dev Returns a DNS format name at the specified offset of self. * @param self The byte array to read a name from. * @param offset The offset to start reading at. * @return ret The name. */ function readName(bytes memory self, uint offset) internal pure returns(bytes memory ret) { uint len = nameLength(self, offset); return self.substring(offset, len); } /** * @dev Returns the number of labels in the DNS name at 'offset' in 'self'. * @param self The byte array to read a name from. * @param offset The offset to start reading at. * @return The number of labels in the DNS name at 'offset', in bytes. */ function labelCount(bytes memory self, uint offset) internal pure returns(uint) { uint count = 0; while (true) { assert(offset < self.length); uint labelLen = self.readUint8(offset); offset += labelLen + 1; if (labelLen == 0) { break; } count += 1; } return count; } uint constant RRSIG_TYPE = 0; uint constant RRSIG_ALGORITHM = 2; uint constant RRSIG_LABELS = 3; uint constant RRSIG_TTL = 4; uint constant RRSIG_EXPIRATION = 8; uint constant RRSIG_INCEPTION = 12; uint constant RRSIG_KEY_TAG = 16; uint constant RRSIG_SIGNER_NAME = 18; struct SignedSet { uint16 typeCovered; uint8 algorithm; uint8 labels; uint32 ttl; uint32 expiration; uint32 inception; uint16 keytag; bytes signerName; bytes data; bytes name; } function readSignedSet(bytes memory data) internal pure returns(SignedSet memory self) { self.typeCovered = data.readUint16(RRSIG_TYPE); self.algorithm = data.readUint8(RRSIG_ALGORITHM); self.labels = data.readUint8(RRSIG_LABELS); self.ttl = data.readUint32(RRSIG_TTL); self.expiration = data.readUint32(RRSIG_EXPIRATION); self.inception = data.readUint32(RRSIG_INCEPTION); self.keytag = data.readUint16(RRSIG_KEY_TAG); self.signerName = readName(data, RRSIG_SIGNER_NAME); self.data = data.substring(RRSIG_SIGNER_NAME + self.signerName.length, data.length - RRSIG_SIGNER_NAME - self.signerName.length); } function rrs(SignedSet memory rrset) internal pure returns(RRIterator memory) { return iterateRRs(rrset.data, 0); } /** * @dev An iterator over resource records. */ struct RRIterator { bytes data; uint offset; uint16 dnstype; uint16 class; uint32 ttl; uint rdataOffset; uint nextOffset; } /** * @dev Begins iterating over resource records. * @param self The byte string to read from. * @param offset The offset to start reading at. * @return ret An iterator object. */ function iterateRRs(bytes memory self, uint offset) internal pure returns (RRIterator memory ret) { ret.data = self; ret.nextOffset = offset; next(ret); } /** * @dev Returns true iff there are more RRs to iterate. * @param iter The iterator to check. * @return True iff the iterator has finished. */ function done(RRIterator memory iter) internal pure returns(bool) { return iter.offset >= iter.data.length; } /** * @dev Moves the iterator to the next resource record. * @param iter The iterator to advance. */ function next(RRIterator memory iter) internal pure { iter.offset = iter.nextOffset; if (iter.offset >= iter.data.length) { return; } // Skip the name uint off = iter.offset + nameLength(iter.data, iter.offset); // Read type, class, and ttl iter.dnstype = iter.data.readUint16(off); off += 2; iter.class = iter.data.readUint16(off); off += 2; iter.ttl = iter.data.readUint32(off); off += 4; // Read the rdata uint rdataLength = iter.data.readUint16(off); off += 2; iter.rdataOffset = off; iter.nextOffset = off + rdataLength; } /** * @dev Returns the name of the current record. * @param iter The iterator. * @return A new bytes object containing the owner name from the RR. */ function name(RRIterator memory iter) internal pure returns(bytes memory) { return iter.data.substring(iter.offset, nameLength(iter.data, iter.offset)); } /** * @dev Returns the rdata portion of the current record. * @param iter The iterator. * @return A new bytes object containing the RR's RDATA. */ function rdata(RRIterator memory iter) internal pure returns(bytes memory) { return iter.data.substring(iter.rdataOffset, iter.nextOffset - iter.rdataOffset); } uint constant DNSKEY_FLAGS = 0; uint constant DNSKEY_PROTOCOL = 2; uint constant DNSKEY_ALGORITHM = 3; uint constant DNSKEY_PUBKEY = 4; struct DNSKEY { uint16 flags; uint8 protocol; uint8 algorithm; bytes publicKey; } function readDNSKEY(bytes memory data, uint offset, uint length) internal pure returns(DNSKEY memory self) { self.flags = data.readUint16(offset + DNSKEY_FLAGS); self.protocol = data.readUint8(offset + DNSKEY_PROTOCOL); self.algorithm = data.readUint8(offset + DNSKEY_ALGORITHM); self.publicKey = data.substring(offset + DNSKEY_PUBKEY, length - DNSKEY_PUBKEY); } uint constant DS_KEY_TAG = 0; uint constant DS_ALGORITHM = 2; uint constant DS_DIGEST_TYPE = 3; uint constant DS_DIGEST = 4; struct DS { uint16 keytag; uint8 algorithm; uint8 digestType; bytes digest; } function readDS(bytes memory data, uint offset, uint length) internal pure returns(DS memory self) { self.keytag = data.readUint16(offset + DS_KEY_TAG); self.algorithm = data.readUint8(offset + DS_ALGORITHM); self.digestType = data.readUint8(offset + DS_DIGEST_TYPE); self.digest = data.substring(offset + DS_DIGEST, length - DS_DIGEST); } struct NSEC3 { uint8 hashAlgorithm; uint8 flags; uint16 iterations; bytes salt; bytes32 nextHashedOwnerName; bytes typeBitmap; } uint constant NSEC3_HASH_ALGORITHM = 0; uint constant NSEC3_FLAGS = 1; uint constant NSEC3_ITERATIONS = 2; uint constant NSEC3_SALT_LENGTH = 4; uint constant NSEC3_SALT = 5; function readNSEC3(bytes memory data, uint offset, uint length) internal pure returns(NSEC3 memory self) { uint end = offset + length; self.hashAlgorithm = data.readUint8(offset + NSEC3_HASH_ALGORITHM); self.flags = data.readUint8(offset + NSEC3_FLAGS); self.iterations = data.readUint16(offset + NSEC3_ITERATIONS); uint8 saltLength = data.readUint8(offset + NSEC3_SALT_LENGTH); offset = offset + NSEC3_SALT; self.salt = data.substring(offset, saltLength); offset += saltLength; uint8 nextLength = data.readUint8(offset); require(nextLength <= 32); offset += 1; self.nextHashedOwnerName = data.readBytesN(offset, nextLength); offset += nextLength; self.typeBitmap = data.substring(offset, end - offset); } function checkTypeBitmap(NSEC3 memory self, uint16 rrtype) internal pure returns(bool) { return checkTypeBitmap(self.typeBitmap, 0, rrtype); } /** * @dev Checks if a given RR type exists in a type bitmap. * @param bitmap The byte string to read the type bitmap from. * @param offset The offset to start reading at. * @param rrtype The RR type to check for. * @return True if the type is found in the bitmap, false otherwise. */ function checkTypeBitmap(bytes memory bitmap, uint offset, uint16 rrtype) internal pure returns (bool) { uint8 typeWindow = uint8(rrtype >> 8); uint8 windowByte = uint8((rrtype & 0xff) / 8); uint8 windowBitmask = uint8(uint8(1) << (uint8(7) - uint8(rrtype & 0x7))); for (uint off = offset; off < bitmap.length;) { uint8 window = bitmap.readUint8(off); uint8 len = bitmap.readUint8(off + 1); if (typeWindow < window) { // We've gone past our window; it's not here. return false; } else if (typeWindow == window) { // Check this type bitmap if (len <= windowByte) { // Our type is past the end of the bitmap return false; } return (bitmap.readUint8(off + windowByte + 2) & windowBitmask) != 0; } else { // Skip this type bitmap off += len + 2; } } return false; } function compareNames(bytes memory self, bytes memory other) internal pure returns (int) { if (self.equals(other)) { return 0; } uint off; uint otheroff; uint prevoff; uint otherprevoff; uint counts = labelCount(self, 0); uint othercounts = labelCount(other, 0); // Keep removing labels from the front of the name until both names are equal length while (counts > othercounts) { prevoff = off; off = progress(self, off); counts--; } while (othercounts > counts) { otherprevoff = otheroff; otheroff = progress(other, otheroff); othercounts--; } // Compare the last nonequal labels to each other while (counts > 0 && !self.equals(off, other, otheroff)) { prevoff = off; off = progress(self, off); otherprevoff = otheroff; otheroff = progress(other, otheroff); counts -= 1; } if (off == 0) { return -1; } if(otheroff == 0) { return 1; } return self.compare(prevoff + 1, self.readUint8(prevoff), other, otherprevoff + 1, other.readUint8(otherprevoff)); } /** * @dev Compares two serial numbers using RFC1982 serial number math. */ function serialNumberGte(uint32 i1, uint32 i2) internal pure returns(bool) { return int32(i1) - int32(i2) >= 0; } function progress(bytes memory body, uint off) internal pure returns(uint) { return off + 1 + body.readUint8(off); } }
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); }
pragma solidity >=0.8.4; abstract contract ResolverBase { bytes4 private constant INTERFACE_META_ID = 0x01ffc9a7; function supportsInterface(bytes4 interfaceID) virtual public pure returns(bool) { return interfaceID == INTERFACE_META_ID; } function isAuthorised(bytes32 node) internal virtual view returns(bool); modifier authorised(bytes32 node) { require(isAuthorised(node)); _; } function bytesToAddress(bytes memory b) internal pure returns(address payable a) { require(b.length == 20); assembly { a := div(mload(add(b, 32)), exp(256, 12)) } } function addressToBytes(address a) internal pure returns(bytes memory b) { b = new bytes(20); assembly { mstore(add(b, 32), mul(a, exp(256, 12))) } } }
pragma solidity >=0.8.4; import "../ResolverBase.sol"; abstract contract ABIResolver is ResolverBase { bytes4 constant private ABI_INTERFACE_ID = 0x2203ab56; event ABIChanged(bytes32 indexed node, uint256 indexed contentType); mapping(bytes32=>mapping(uint256=>bytes)) abis; /** * Sets the ABI associated with an ENS node. * Nodes may have one ABI of each content type. To remove an ABI, set it to * the empty string. * @param node The node to update. * @param contentType The content type of the ABI * @param data The ABI data. */ function setABI(bytes32 node, uint256 contentType, bytes calldata data) external authorised(node) { // Content types must be powers of 2 require(((contentType - 1) & contentType) == 0); abis[node][contentType] = data; emit ABIChanged(node, contentType); } /** * Returns the ABI associated with an ENS node. * Defined in EIP205. * @param node The ENS node to query * @param contentTypes A bitwise OR of the ABI formats accepted by the caller. * @return contentType The content type of the return value * @return data The ABI data */ function ABI(bytes32 node, uint256 contentTypes) external view returns (uint256, bytes memory) { mapping(uint256=>bytes) storage abiset = abis[node]; for (uint256 contentType = 1; contentType <= contentTypes; contentType <<= 1) { if ((contentType & contentTypes) != 0 && abiset[contentType].length > 0) { return (contentType, abiset[contentType]); } } return (0, bytes("")); } function supportsInterface(bytes4 interfaceID) virtual override public pure returns(bool) { return interfaceID == ABI_INTERFACE_ID || super.supportsInterface(interfaceID); } }
pragma solidity >=0.8.4; import "../ResolverBase.sol"; abstract contract AddrResolver is ResolverBase { bytes4 constant private ADDR_INTERFACE_ID = 0x3b3b57de; bytes4 constant private ADDRESS_INTERFACE_ID = 0xf1cb7e06; uint constant private COIN_TYPE_ETH = 60; event AddrChanged(bytes32 indexed node, address a); event AddressChanged(bytes32 indexed node, uint coinType, bytes newAddress); mapping(bytes32=>mapping(uint=>bytes)) _addresses; /** * Sets the address associated with an ENS node. * May only be called by the owner of that node in the ENS registry. * @param node The node to update. * @param a The address to set. */ function setAddr(bytes32 node, address a) external authorised(node) { setAddr(node, COIN_TYPE_ETH, addressToBytes(a)); } /** * Returns the address associated with an ENS node. * @param node The ENS node to query. * @return The associated address. */ function addr(bytes32 node) public view returns (address payable) { bytes memory a = addr(node, COIN_TYPE_ETH); if(a.length == 0) { return payable(0); } return bytesToAddress(a); } function setAddr(bytes32 node, uint coinType, bytes memory a) public authorised(node) { emit AddressChanged(node, coinType, a); if(coinType == COIN_TYPE_ETH) { emit AddrChanged(node, bytesToAddress(a)); } _addresses[node][coinType] = a; } function addr(bytes32 node, uint coinType) public view returns(bytes memory) { return _addresses[node][coinType]; } function supportsInterface(bytes4 interfaceID) virtual override public pure returns(bool) { return interfaceID == ADDR_INTERFACE_ID || interfaceID == ADDRESS_INTERFACE_ID || super.supportsInterface(interfaceID); } }
pragma solidity >=0.8.4; import "../ResolverBase.sol"; abstract contract ContentHashResolver is ResolverBase { bytes4 constant private CONTENT_HASH_INTERFACE_ID = 0xbc1c58d1; event ContenthashChanged(bytes32 indexed node, bytes hash); mapping(bytes32=>bytes) hashes; /** * Sets the contenthash associated with an ENS node. * May only be called by the owner of that node in the ENS registry. * @param node The node to update. * @param hash The contenthash to set */ function setContenthash(bytes32 node, bytes calldata hash) external authorised(node) { hashes[node] = hash; emit ContenthashChanged(node, hash); } /** * Returns the contenthash associated with an ENS node. * @param node The ENS node to query. * @return The associated contenthash. */ function contenthash(bytes32 node) external view returns (bytes memory) { return hashes[node]; } function supportsInterface(bytes4 interfaceID) virtual override public pure returns(bool) { return interfaceID == CONTENT_HASH_INTERFACE_ID || super.supportsInterface(interfaceID); } }
pragma solidity >=0.8.4; import "../ResolverBase.sol"; import "../../dnssec-oracle/RRUtils.sol"; abstract contract DNSResolver is ResolverBase { using RRUtils for *; using BytesUtils for bytes; bytes4 constant private DNS_RECORD_INTERFACE_ID = 0xa8fa5682; bytes4 constant private DNS_ZONE_INTERFACE_ID = 0x5c47637c; // DNSRecordChanged is emitted whenever a given node/name/resource's RRSET is updated. event DNSRecordChanged(bytes32 indexed node, bytes name, uint16 resource, bytes record); // DNSRecordDeleted is emitted whenever a given node/name/resource's RRSET is deleted. event DNSRecordDeleted(bytes32 indexed node, bytes name, uint16 resource); // DNSZoneCleared is emitted whenever a given node's zone information is cleared. event DNSZoneCleared(bytes32 indexed node); // DNSZonehashChanged is emitted whenever a given node's zone hash is updated. event DNSZonehashChanged(bytes32 indexed node, bytes lastzonehash, bytes zonehash); // Zone hashes for the domains. // A zone hash is an EIP-1577 content hash in binary format that should point to a // resource containing a single zonefile. // node => contenthash mapping(bytes32=>bytes) private zonehashes; // Version the mapping for each zone. This allows users who have lost // track of their entries to effectively delete an entire zone by bumping // the version number. // node => version mapping(bytes32=>uint256) private versions; // The records themselves. Stored as binary RRSETs // node => version => name => resource => data mapping(bytes32=>mapping(uint256=>mapping(bytes32=>mapping(uint16=>bytes)))) private records; // Count of number of entries for a given name. Required for DNS resolvers // when resolving wildcards. // node => version => name => number of records mapping(bytes32=>mapping(uint256=>mapping(bytes32=>uint16))) private nameEntriesCount; /** * Set one or more DNS records. Records are supplied in wire-format. * Records with the same node/name/resource must be supplied one after the * other to ensure the data is updated correctly. For example, if the data * was supplied: * a.example.com IN A 1.2.3.4 * a.example.com IN A 5.6.7.8 * www.example.com IN CNAME a.example.com. * then this would store the two A records for a.example.com correctly as a * single RRSET, however if the data was supplied: * a.example.com IN A 1.2.3.4 * www.example.com IN CNAME a.example.com. * a.example.com IN A 5.6.7.8 * then this would store the first A record, the CNAME, then the second A * record which would overwrite the first. * * @param node the namehash of the node for which to set the records * @param data the DNS wire format records to set */ function setDNSRecords(bytes32 node, bytes calldata data) external authorised(node) { uint16 resource = 0; uint256 offset = 0; bytes memory name; bytes memory value; bytes32 nameHash; // Iterate over the data to add the resource records for (RRUtils.RRIterator memory iter = data.iterateRRs(0); !iter.done(); iter.next()) { if (resource == 0) { resource = iter.dnstype; name = iter.name(); nameHash = keccak256(abi.encodePacked(name)); value = bytes(iter.rdata()); } else { bytes memory newName = iter.name(); if (resource != iter.dnstype || !name.equals(newName)) { setDNSRRSet(node, name, resource, data, offset, iter.offset - offset, value.length == 0); resource = iter.dnstype; offset = iter.offset; name = newName; nameHash = keccak256(name); value = bytes(iter.rdata()); } } } if (name.length > 0) { setDNSRRSet(node, name, resource, data, offset, data.length - offset, value.length == 0); } } /** * Obtain a DNS record. * @param node the namehash of the node for which to fetch the record * @param name the keccak-256 hash of the fully-qualified name for which to fetch the record * @param resource the ID of the resource as per https://en.wikipedia.org/wiki/List_of_DNS_record_types * @return the DNS record in wire format if present, otherwise empty */ function dnsRecord(bytes32 node, bytes32 name, uint16 resource) public view returns (bytes memory) { return records[node][versions[node]][name][resource]; } /** * Check if a given node has records. * @param node the namehash of the node for which to check the records * @param name the namehash of the node for which to check the records */ function hasDNSRecords(bytes32 node, bytes32 name) public view returns (bool) { return (nameEntriesCount[node][versions[node]][name] != 0); } /** * Clear all information for a DNS zone. * @param node the namehash of the node for which to clear the zone */ function clearDNSZone(bytes32 node) public authorised(node) { versions[node]++; emit DNSZoneCleared(node); } /** * setZonehash sets the hash for the zone. * May only be called by the owner of that node in the ENS registry. * @param node The node to update. * @param hash The zonehash to set */ function setZonehash(bytes32 node, bytes calldata hash) external authorised(node) { bytes memory oldhash = zonehashes[node]; zonehashes[node] = hash; emit DNSZonehashChanged(node, oldhash, hash); } /** * zonehash obtains the hash for the zone. * @param node The ENS node to query. * @return The associated contenthash. */ function zonehash(bytes32 node) external view returns (bytes memory) { return zonehashes[node]; } function supportsInterface(bytes4 interfaceID) virtual override public pure returns(bool) { return interfaceID == DNS_RECORD_INTERFACE_ID || interfaceID == DNS_ZONE_INTERFACE_ID || super.supportsInterface(interfaceID); } function setDNSRRSet( bytes32 node, bytes memory name, uint16 resource, bytes memory data, uint256 offset, uint256 size, bool deleteRecord) private { uint256 version = versions[node]; bytes32 nameHash = keccak256(name); bytes memory rrData = data.substring(offset, size); if (deleteRecord) { if (records[node][version][nameHash][resource].length != 0) { nameEntriesCount[node][version][nameHash]--; } delete(records[node][version][nameHash][resource]); emit DNSRecordDeleted(node, name, resource); } else { if (records[node][version][nameHash][resource].length == 0) { nameEntriesCount[node][version][nameHash]++; } records[node][version][nameHash][resource] = rrData; emit DNSRecordChanged(node, name, resource, rrData); } } }
pragma solidity >=0.8.4; import "../ResolverBase.sol"; import "./AddrResolver.sol"; abstract contract InterfaceResolver is ResolverBase, AddrResolver { bytes4 constant private INTERFACE_INTERFACE_ID = bytes4(keccak256("interfaceImplementer(bytes32,bytes4)")); bytes4 private constant INTERFACE_META_ID = 0x01ffc9a7; event InterfaceChanged(bytes32 indexed node, bytes4 indexed interfaceID, address implementer); mapping(bytes32=>mapping(bytes4=>address)) interfaces; /** * Sets an interface associated with a name. * Setting the address to 0 restores the default behaviour of querying the contract at `addr()` for interface support. * @param node The node to update. * @param interfaceID The EIP 165 interface ID. * @param implementer The address of a contract that implements this interface for this node. */ function setInterface(bytes32 node, bytes4 interfaceID, address implementer) external authorised(node) { interfaces[node][interfaceID] = implementer; emit InterfaceChanged(node, interfaceID, implementer); } /** * Returns the address of a contract that implements the specified interface for this name. * If an implementer has not been set for this interfaceID and name, the resolver will query * the contract at `addr()`. If `addr()` is set, a contract exists at that address, and that * contract implements EIP165 and returns `true` for the specified interfaceID, its address * will be returned. * @param node The ENS node to query. * @param interfaceID The EIP 165 interface ID to check for. * @return The address that implements this interface, or 0 if the interface is unsupported. */ function interfaceImplementer(bytes32 node, bytes4 interfaceID) external view returns (address) { address implementer = interfaces[node][interfaceID]; if(implementer != address(0)) { return implementer; } address a = addr(node); if(a == address(0)) { return address(0); } (bool success, bytes memory returnData) = a.staticcall(abi.encodeWithSignature("supportsInterface(bytes4)", INTERFACE_META_ID)); if(!success || returnData.length < 32 || returnData[31] == 0) { // EIP 165 not supported by target return address(0); } (success, returnData) = a.staticcall(abi.encodeWithSignature("supportsInterface(bytes4)", interfaceID)); if(!success || returnData.length < 32 || returnData[31] == 0) { // Specified interface not supported by target return address(0); } return a; } function supportsInterface(bytes4 interfaceID) virtual override(AddrResolver, ResolverBase) public pure returns(bool) { return interfaceID == INTERFACE_INTERFACE_ID || super.supportsInterface(interfaceID); } }
pragma solidity >=0.8.4; import "../ResolverBase.sol"; abstract contract NameResolver is ResolverBase { bytes4 constant private NAME_INTERFACE_ID = 0x691f3431; event NameChanged(bytes32 indexed node, string name); mapping(bytes32=>string) names; /** * Sets the name associated with an ENS node, for reverse records. * May only be called by the owner of that node in the ENS registry. * @param node The node to update. * @param name The name to set. */ function setName(bytes32 node, string calldata name) external authorised(node) { names[node] = name; emit NameChanged(node, name); } /** * Returns the name associated with an ENS node, for reverse records. * Defined in EIP181. * @param node The ENS node to query. * @return The associated name. */ function name(bytes32 node) external view returns (string memory) { return names[node]; } function supportsInterface(bytes4 interfaceID) virtual override public pure returns(bool) { return interfaceID == NAME_INTERFACE_ID || super.supportsInterface(interfaceID); } }
pragma solidity >=0.8.4; import "../ResolverBase.sol"; abstract contract PubkeyResolver is ResolverBase { bytes4 constant private PUBKEY_INTERFACE_ID = 0xc8690233; event PubkeyChanged(bytes32 indexed node, bytes32 x, bytes32 y); struct PublicKey { bytes32 x; bytes32 y; } mapping(bytes32=>PublicKey) pubkeys; /** * Sets the SECP256k1 public key associated with an ENS node. * @param node The ENS node to query * @param x the X coordinate of the curve point for the public key. * @param y the Y coordinate of the curve point for the public key. */ function setPubkey(bytes32 node, bytes32 x, bytes32 y) external authorised(node) { pubkeys[node] = PublicKey(x, y); emit PubkeyChanged(node, x, y); } /** * Returns the SECP256k1 public key associated with an ENS node. * Defined in EIP 619. * @param node The ENS node to query * @return x The X coordinate of the curve point for the public key. * @return y The Y coordinate of the curve point for the public key. */ function pubkey(bytes32 node) external view returns (bytes32 x, bytes32 y) { return (pubkeys[node].x, pubkeys[node].y); } function supportsInterface(bytes4 interfaceID) virtual override public pure returns(bool) { return interfaceID == PUBKEY_INTERFACE_ID || super.supportsInterface(interfaceID); } }
pragma solidity >=0.8.4; import "../ResolverBase.sol"; abstract contract TextResolver is ResolverBase { bytes4 constant private TEXT_INTERFACE_ID = 0x59d1d43c; event TextChanged(bytes32 indexed node, string indexed indexedKey, string key); mapping(bytes32=>mapping(string=>string)) texts; /** * Sets the text data associated with an ENS node and key. * May only be called by the owner of that node in the ENS registry. * @param node The node to update. * @param key The key to set. * @param value The text data value to set. */ function setText(bytes32 node, string calldata key, string calldata value) external authorised(node) { texts[node][key] = value; emit TextChanged(node, key, key); } /** * Returns the text data associated with an ENS node and key. * @param node The ENS node to query. * @param key The text data key to query. * @return The associated text data. */ function text(bytes32 node, string calldata key) external view returns (string memory) { return texts[node][key]; } function supportsInterface(bytes4 interfaceID) virtual override public pure returns(bool) { return interfaceID == TEXT_INTERFACE_ID || super.supportsInterface(interfaceID); } }
{ "evmVersion": "istanbul", "libraries": {}, "metadata": { "bytecodeHash": "ipfs", "useLiteralContent": true }, "optimizer": { "enabled": false, "runs": 200 }, "remappings": [], "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract ENS","name":"_ens","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":true,"internalType":"uint256","name":"contentType","type":"uint256"}],"name":"ABIChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"address","name":"a","type":"address"}],"name":"AddrChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"coinType","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"newAddress","type":"bytes"}],"name":"AddressChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"bool","name":"isAuthorised","type":"bool"}],"name":"AuthorisationChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"bytes","name":"hash","type":"bytes"}],"name":"ContenthashChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"bytes","name":"name","type":"bytes"},{"indexed":false,"internalType":"uint16","name":"resource","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"record","type":"bytes"}],"name":"DNSRecordChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"bytes","name":"name","type":"bytes"},{"indexed":false,"internalType":"uint16","name":"resource","type":"uint16"}],"name":"DNSRecordDeleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"DNSZoneCleared","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"bytes","name":"lastzonehash","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"zonehash","type":"bytes"}],"name":"DNSZonehashChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":true,"internalType":"bytes4","name":"interfaceID","type":"bytes4"},{"indexed":false,"internalType":"address","name":"implementer","type":"address"}],"name":"InterfaceChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"string","name":"name","type":"string"}],"name":"NameChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"x","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"y","type":"bytes32"}],"name":"PubkeyChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":true,"internalType":"string","name":"indexedKey","type":"string"},{"indexed":false,"internalType":"string","name":"key","type":"string"}],"name":"TextChanged","type":"event"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"uint256","name":"contentTypes","type":"uint256"}],"name":"ABI","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"addr","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"uint256","name":"coinType","type":"uint256"}],"name":"addr","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"authorisations","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"clearDNSZone","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"contenthash","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes32","name":"name","type":"bytes32"},{"internalType":"uint16","name":"resource","type":"uint16"}],"name":"dnsRecord","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes32","name":"name","type":"bytes32"}],"name":"hasDNSRecords","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes4","name":"interfaceID","type":"bytes4"}],"name":"interfaceImplementer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes[]","name":"data","type":"bytes[]"}],"name":"multicall","outputs":[{"internalType":"bytes[]","name":"results","type":"bytes[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"pubkey","outputs":[{"internalType":"bytes32","name":"x","type":"bytes32"},{"internalType":"bytes32","name":"y","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"uint256","name":"contentType","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"setABI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"uint256","name":"coinType","type":"uint256"},{"internalType":"bytes","name":"a","type":"bytes"}],"name":"setAddr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"address","name":"a","type":"address"}],"name":"setAddr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"address","name":"target","type":"address"},{"internalType":"bool","name":"isAuthorised","type":"bool"}],"name":"setAuthorisation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes","name":"hash","type":"bytes"}],"name":"setContenthash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"setDNSRecords","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes4","name":"interfaceID","type":"bytes4"},{"internalType":"address","name":"implementer","type":"address"}],"name":"setInterface","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"string","name":"name","type":"string"}],"name":"setName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes32","name":"x","type":"bytes32"},{"internalType":"bytes32","name":"y","type":"bytes32"}],"name":"setPubkey","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"string","name":"key","type":"string"},{"internalType":"string","name":"value","type":"string"}],"name":"setText","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes","name":"hash","type":"bytes"}],"name":"setZonehash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"string","name":"key","type":"string"}],"name":"text","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"zonehash","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162003f1538038062003f15833981810160405281019062000037919062000096565b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505062000124565b60008151905062000090816200010a565b92915050565b600060208284031215620000a957600080fd5b6000620000b9848285016200007f565b91505092915050565b6000620000cf82620000ea565b9050919050565b6000620000e382620000c2565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6200011581620000d6565b81146200012157600080fd5b50565b613de180620001346000396000f3fe608060405234801561001057600080fd5b506004361061018e5760003560e01c8063691f3431116100de578063bc1c58d111610097578063d5fa2b0011610071578063d5fa2b00146104ed578063e59d895d14610509578063f1cb7e0614610525578063f86bc879146105555761018e565b8063bc1c58d114610470578063c8690233146104a0578063ce3decdc146104d15761018e565b8063691f34311461038c57806377372213146103bc5780638b95dd71146103d8578063a8fa5682146103f4578063ac9650d814610424578063ad5780af146104545761018e565b8063304e6ade1161014b5780634cbf6ba4116101255780634cbf6ba4146102e057806359d1d43c146103105780635c98042b14610340578063623195b0146103705761018e565b8063304e6ade146102785780633b3b57de146102945780633e9ce794146102c45761018e565b806301ffc9a7146101935780630af179d7146101c357806310f13a8c146101df578063124a319c146101fb5780632203ab561461022b57806329cd62ea1461025c575b600080fd5b6101ad60048036038101906101a89190613353565b610585565b6040516101ba91906136b9565b60405180910390f35b6101dd60048036038101906101d8919061310b565b610597565b005b6101f960048036038101906101f491906131bb565b6107c9565b005b61021560048036038101906102109190613080565b610877565b6040516102229190613646565b60405180910390f35b61024560048036038101906102409190613244565b610cbb565b60405161025392919061386d565b60405180910390f35b61027660048036038101906102719190612fe2565b610def565b005b610292600480360381019061028d919061310b565b610e81565b005b6102ae60048036038101906102a99190612ea3565b610ef7565b6040516102bb919061367c565b60405180910390f35b6102de60048036038101906102d99190612f57565b610f2d565b005b6102fa60048036038101906102f59190612fa6565b61103d565b60405161030791906136b9565b60405180910390f35b61032a60048036038101906103259190613163565b6110a5565b604051610337919061384b565b60405180910390f35b61035a60048036038101906103559190612ea3565b61116a565b6040516103679190613757565b60405180910390f35b61038a60048036038101906103859190613280565b61120f565b005b6103a660048036038101906103a19190612ea3565b6112a5565b6040516103b3919061384b565b60405180910390f35b6103d660048036038101906103d19190613163565b61134a565b005b6103f260048036038101906103ed91906132ec565b6113c0565b005b61040e60048036038101906104099190613031565b611496565b60405161041b9190613757565b60405180910390f35b61043e60048036038101906104399190612e5e565b61158b565b60405161044b9190613697565b60405180910390f35b61046e60048036038101906104699190612ea3565b611737565b005b61048a60048036038101906104859190612ea3565b6117a4565b6040516104979190613757565b60405180910390f35b6104ba60048036038101906104b59190612ea3565b611849565b6040516104c89291906136ef565b60405180910390f35b6104eb60048036038101906104e6919061310b565b611883565b005b61050760048036038101906105029190612ecc565b61199c565b005b610523600480360381019061051e91906130bc565b6119c8565b005b61053f600480360381019061053a9190613244565b611ada565b60405161054c9190613757565b60405180910390f35b61056f600480360381019061056a9190612f08565b611b91565b60405161057c91906136b9565b60405180910390f35b600061059082611bcd565b9050919050565b826105a181611c2e565b6105aa57600080fd5b60008060608060008061060b60008a8a8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611db790919063ffffffff16565b90505b61061781611de1565b61074d5760008661ffff161415610673578060400151955061063881611df7565b93508360405160200161064b9190613616565b60405160208183030381529060405280519060200120915061066c81611e2e565b925061073f565b600061067e82611df7565b9050816040015161ffff168761ffff161415806106ab57506106a98186611e6790919063ffffffff16565b155b1561073d576107168b86898d8d8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508a8b886020015161070c9190613a38565b60008b5114611e8e565b81604001519650816020015195508094508480519060200120925061073a82611e2e565b93505b505b610748816121b9565b61060e565b506000835111156107be576107bd8984878b8b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505088898e8e90506107b39190613a38565b6000895114611e8e565b5b505050505050505050565b846107d381611c2e565b6107dc57600080fd5b8282600a6000898152602001908152602001600020878760405161080192919061362d565b9081526020016040518091039020919061081c929190612a22565b50848460405161082d92919061362d565b6040518091039020867fd8c9334b1a9c2f9da342a0a2b32629c1a229b6445dad78947f674b44444a75508787604051610867929190613827565b60405180910390a3505050505050565b600080600760008581526020019081526020016000206000847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461093c5780915050610cb5565b600061094785610ef7565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561098957600092505050610cb5565b6000808273ffffffffffffffffffffffffffffffffffffffff166301ffc9a760e01b6040516024016109bb9190613718565b6040516020818303038152906040527f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610a459190613616565b600060405180830381855afa9150503d8060008114610a80576040519150601f19603f3d011682016040523d82523d6000602084013e610a85565b606091505b5091509150811580610a98575060208151105b80610b0c5750600060f81b81601f81518110610add577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b15610b1e576000945050505050610cb5565b8273ffffffffffffffffffffffffffffffffffffffff1686604051602401610b469190613718565b6040516020818303038152906040527f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610bd09190613616565b600060405180830381855afa9150503d8060008114610c0b576040519150601f19603f3d011682016040523d82523d6000602084013e610c10565b606091505b508092508193505050811580610c27575060208151105b80610c9b5750600060f81b81601f81518110610c6c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b15610cad576000945050505050610cb5565b829450505050505b92915050565b60006060600080600086815260200190815260200160002090506000600190505b848111610dcf57600085821614158015610d14575060008260008381526020019081526020016000208054610d1090613bac565b9050115b15610dc35780826000838152602001908152602001600020808054610d3890613bac565b80601f0160208091040260200160405190810160405280929190818152602001828054610d6490613bac565b8015610db15780601f10610d8657610100808354040283529160200191610db1565b820191906000526020600020905b815481529060010190602001808311610d9457829003601f168201915b50505050509050935093505050610de8565b600181901b9050610cdc565b5060006040518060200160405280600081525092509250505b9250929050565b82610df981611c2e565b610e0257600080fd5b604051806040016040528084815260200183815250600960008681526020019081526020016000206000820151816000015560208201518160010155905050837f1d6f5e03d3f63eb58751986629a5439baee5079ff04f345becb66e23eb154e468484604051610e739291906136ef565b60405180910390a250505050565b82610e8b81611c2e565b610e9457600080fd5b8282600260008781526020019081526020016000209190610eb6929190612aa8565b50837fe379c1624ed7e714cc0937528a32359d69d5281337765313dba4e081b72d75788484604051610ee9929190613733565b60405180910390a250505050565b600080610f0583603c611ada565b9050600081511415610f1b576000915050610f28565b610f2481612303565b9150505b919050565b80600c600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16847fe1c5610a6e0cbe10764ecd182adcef1ec338dc4e199c99c32ce98f38e12791df8460405161103091906136b9565b60405180910390a4505050565b60008060066000858152602001908152602001600020600060046000878152602001908152602001600020548152602001908152602001600020600084815260200190815260200160002060009054906101000a900461ffff1661ffff161415905092915050565b6060600a600085815260200190815260200160002083836040516110ca92919061362d565b908152602001604051809103902080546110e390613bac565b80601f016020809104026020016040519081016040528092919081815260200182805461110f90613bac565b801561115c5780601f106111315761010080835404028352916020019161115c565b820191906000526020600020905b81548152906001019060200180831161113f57829003601f168201915b505050505090509392505050565b606060036000838152602001908152602001600020805461118a90613bac565b80601f01602080910402602001604051908101604052809291908181526020018280546111b690613bac565b80156112035780601f106111d857610100808354040283529160200191611203565b820191906000526020600020905b8154815290600101906020018083116111e657829003601f168201915b50505050509050919050565b8361121981611c2e565b61122257600080fd5b6000846001866112329190613a38565b161461123d57600080fd5b82826000808881526020019081526020016000206000878152602001908152602001600020919061126f929190612aa8565b5083857faa121bbeef5f32f5961a2a28966e769023910fc9479059ee3495d4c1a696efe360405160405180910390a35050505050565b60606008600083815260200190815260200160002080546112c590613bac565b80601f01602080910402602001604051908101604052809291908181526020018280546112f190613bac565b801561133e5780601f106113135761010080835404028352916020019161133e565b820191906000526020600020905b81548152906001019060200180831161132157829003601f168201915b50505050509050919050565b8261135481611c2e565b61135d57600080fd5b828260086000878152602001908152602001600020919061137f929190612a22565b50837fb7d29e911041e8d9b843369e890bcb72c9388692ba48b65ac54e7214c4c348f784846040516113b2929190613827565b60405180910390a250505050565b826113ca81611c2e565b6113d357600080fd5b837f65412581168e88a1e60c6459d7f44ae83ad0832e670826c05a4e2476b57af752848460405161140592919061386d565b60405180910390a2603c83141561145757837f52d7d861f09ab3d26239d492e8968629f95e9e318cf0b73bfddc441522a15fd261144184612303565b60405161144e9190613661565b60405180910390a25b81600160008681526020019081526020016000206000858152602001908152602001600020908051906020019061148f929190612b2e565b5050505050565b606060056000858152602001908152602001600020600060046000878152602001908152602001600020548152602001908152602001600020600084815260200190815260200160002060008361ffff1661ffff168152602001908152602001600020805461150490613bac565b80601f016020809104026020016040519081016040528092919081815260200182805461153090613bac565b801561157d5780601f106115525761010080835404028352916020019161157d565b820191906000526020600020905b81548152906001019060200180831161156057829003601f168201915b505050505090509392505050565b60608282905067ffffffffffffffff8111156115d0577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405190808252806020026020018201604052801561160357816020015b60608152602001906001900390816115ee5790505b50905060005b83839050811015611730576000803073ffffffffffffffffffffffffffffffffffffffff16868685818110611667577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002810190611679919061389d565b6040516116879291906135fd565b600060405180830381855af49150503d80600081146116c2576040519150601f19603f3d011682016040523d82523d6000602084013e6116c7565b606091505b5091509150816116d657600080fd5b80848481518110611710577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101819052505050808061172890613c3a565b915050611609565b5092915050565b8061174181611c2e565b61174a57600080fd5b60046000838152602001908152602001600020600081548092919061176e90613c3a565b9190505550817fb757169b8492ca2f1c6619d9d76ce22803035c3b1d5f6930dffe7b127c1a198360405160405180910390a25050565b60606002600083815260200190815260200160002080546117c490613bac565b80601f01602080910402602001604051908101604052809291908181526020018280546117f090613bac565b801561183d5780601f106118125761010080835404028352916020019161183d565b820191906000526020600020905b81548152906001019060200180831161182057829003601f168201915b50505050509050919050565b6000806009600084815260200190815260200160002060000154600960008581526020019081526020016000206001015491509150915091565b8261188d81611c2e565b61189657600080fd5b60006003600086815260200190815260200160002080546118b690613bac565b80601f01602080910402602001604051908101604052809291908181526020018280546118e290613bac565b801561192f5780601f106119045761010080835404028352916020019161192f565b820191906000526020600020905b81548152906001019060200180831161191257829003601f168201915b505050505090508383600360008881526020019081526020016000209190611958929190612aa8565b50847f8f15ed4b723ef428f250961da8315675b507046737e19319fc1a4d81bfe87f8582868660405161198d93929190613779565b60405180910390a25050505050565b816119a681611c2e565b6119af57600080fd5b6119c383603c6119be85612326565b6113c0565b505050565b826119d281611c2e565b6119db57600080fd5b81600760008681526020019081526020016000206000857bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916847f7c69f06bea0bdef565b709e93a147836b0063ba2dd89f02d0b7e8d931e6a6daa84604051611acc9190613646565b60405180910390a350505050565b60606001600084815260200190815260200160002060008381526020019081526020016000208054611b0b90613bac565b80601f0160208091040260200160405190810160405280929190818152602001828054611b3790613bac565b8015611b845780601f10611b5957610100808354040283529160200191611b84565b820191906000526020600020905b815481529060010190602001808311611b6757829003601f168201915b5050505050905092915050565b600c602052826000526040600020602052816000526040600020602052806000526040600020600092509250509054906101000a900460ff1681565b60006359d1d43c60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611c275750611c26826123b0565b5b9050919050565b600080600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166302571be3846040518263ffffffff1660e01b8152600401611c8c91906136d4565b60206040518083038186803b158015611ca457600080fd5b505afa158015611cb8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cdc9190612e35565b90503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480611daf5750600c600084815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b915050919050565b611dbf612bb4565b828160000181905250818160c0018181525050611ddb816121b9565b92915050565b6000816000015151826020015110159050919050565b6060611e278260200151611e1384600001518560200151612411565b84600001516124b49092919063ffffffff16565b9050919050565b6060611e608260a001518360a001518460c00151611e4c9190613a38565b84600001516124b49092919063ffffffff16565b9050919050565b600081518351148015611e865750611e85836000846000875161256f565b5b905092915050565b6000600460008981526020019081526020016000205490506000878051906020012090506000611ec98686896124b49092919063ffffffff16565b9050831561203b576000600560008c81526020019081526020016000206000858152602001908152602001600020600084815260200190815260200160002060008a61ffff1661ffff1681526020019081526020016000208054611f2c90613bac565b905014611fa257600660008b815260200190815260200160002060008481526020019081526020016000206000838152602001908152602001600020600081819054906101000a900461ffff1680929190611f8690613b82565b91906101000a81548161ffff021916908361ffff160217905550505b600560008b81526020019081526020016000206000848152602001908152602001600020600083815260200190815260200160002060008961ffff1661ffff1681526020019081526020016000206000611ffc9190612bff565b897f03528ed0c2a3ebc993b12ce3c16bb382f9c7d88ef7d8a1bf290eaf35955a12078a8a60405161202e9291906137b2565b60405180910390a26121ad565b6000600560008c81526020019081526020016000206000858152602001908152602001600020600084815260200190815260200160002060008a61ffff1661ffff168152602001908152602001600020805461209690613bac565b9050141561210d57600660008b815260200190815260200160002060008481526020019081526020016000206000838152602001908152602001600020600081819054906101000a900461ffff16809291906120f190613c0f565b91906101000a81548161ffff021916908361ffff160217905550505b80600560008c81526020019081526020016000206000858152602001908152602001600020600084815260200190815260200160002060008a61ffff1661ffff168152602001908152602001600020908051906020019061216f929190612b2e565b50897f52a608b3303a48862d07a73d82fa221318c0027fbbcfb1b2329bface3f19ff2b8a8a846040516121a4939291906137e2565b60405180910390a25b50505050505050505050565b8060c001518160200181815250508060000151518160200151106121dc57612300565b60006121f082600001518360200151612411565b82602001516121ff91906139e2565b905061221881836000015161259390919063ffffffff16565b826040019061ffff16908161ffff168152505060028161223891906139e2565b905061225181836000015161259390919063ffffffff16565b826060019061ffff16908161ffff168152505060028161227191906139e2565b905061228a8183600001516125c290919063ffffffff16565b826080019063ffffffff16908163ffffffff16815250506004816122ae91906139e2565b905060006122c982846000015161259390919063ffffffff16565b61ffff1690506002826122dc91906139e2565b9150818360a001818152505080826122f491906139e2565b8360c001818152505050505b50565b6000601482511461231357600080fd5b600c6101000a6020830151049050919050565b6060601467ffffffffffffffff811115612369577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561239b5781602001600182028036833780820191505090505b509050600c6101000a82026020820152919050565b600063c869023360e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061240a5750612409826125f3565b5b9050919050565b6000808290505b60011561249f5783518110612456577f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b600061246b828661265490919063ffffffff16565b60ff16905060018161247d91906139e2565b8261248891906139e2565b91506000811415612499575061249f565b50612418565b82816124ab9190613a38565b91505092915050565b6060835182846124c491906139e2565b11156124cf57600080fd5b60008267ffffffffffffffff811115612511577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156125435781602001600182028036833780820191505090505b50905060008060208301915085602088010190506125628282876126a5565b8293505050509392505050565b600061257c848484612709565b612587878785612709565b14905095945050505050565b600082516002836125a491906139e2565b11156125af57600080fd5b61ffff8260028501015116905092915050565b600082516004836125d391906139e2565b11156125de57600080fd5b63ffffffff8260048501015116905092915050565b600063691f343160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061264d575061264c82612735565b5b9050919050565b600082828151811061268f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b60f81c905092915050565b5b602081106126e457815183526020836126bf91906139e2565b92506020826126ce91906139e2565b91506020816126dd9190613a38565b90506126a6565b60006001826020036101000a0390508019835116818551168181178652505050505050565b60008351828461271991906139e2565b111561272457600080fd5b818360208601012090509392505050565b60007f124a319c1247f4318c3c16c7e9cc865d0fb5d80d7bf02f56cafc0d14da0208507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806127a857506127a7826127af565b5b9050919050565b600063a8fa568260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806128485750635c47637c60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061285857506128578261285f565b5b9050919050565b600063bc1c58d160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806128b957506128b8826128c0565b5b9050919050565b6000633b3b57de60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612959575063f1cb7e0660e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612969575061296882612970565b5b9050919050565b6000632203ab5660e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806129ca57506129c9826129d1565b5b9050919050565b60006301ffc9a760e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b828054612a2e90613bac565b90600052602060002090601f016020900481019282612a505760008555612a97565b82601f10612a6957803560ff1916838001178555612a97565b82800160010185558215612a97579182015b82811115612a96578235825591602001919060010190612a7b565b5b509050612aa49190612c3f565b5090565b828054612ab490613bac565b90600052602060002090601f016020900481019282612ad65760008555612b1d565b82601f10612aef57803560ff1916838001178555612b1d565b82800160010185558215612b1d579182015b82811115612b1c578235825591602001919060010190612b01565b5b509050612b2a9190612c3f565b5090565b828054612b3a90613bac565b90600052602060002090601f016020900481019282612b5c5760008555612ba3565b82601f10612b7557805160ff1916838001178555612ba3565b82800160010185558215612ba3579182015b82811115612ba2578251825591602001919060010190612b87565b5b509050612bb09190612c3f565b5090565b6040518060e001604052806060815260200160008152602001600061ffff168152602001600061ffff168152602001600063ffffffff16815260200160008152602001600081525090565b508054612c0b90613bac565b6000825580601f10612c1d5750612c3c565b601f016020900490600052602060002090810190612c3b9190612c3f565b5b50565b5b80821115612c58576000816000905550600101612c40565b5090565b6000612c6f612c6a84613919565b6138f4565b905082815260208101848484011115612c8757600080fd5b612c92848285613b40565b509392505050565b600081359050612ca981613d21565b92915050565b600081519050612cbe81613d21565b92915050565b60008083601f840112612cd657600080fd5b8235905067ffffffffffffffff811115612cef57600080fd5b602083019150836020820283011115612d0757600080fd5b9250929050565b600081359050612d1d81613d38565b92915050565b600081359050612d3281613d4f565b92915050565b600081359050612d4781613d66565b92915050565b60008083601f840112612d5f57600080fd5b8235905067ffffffffffffffff811115612d7857600080fd5b602083019150836001820283011115612d9057600080fd5b9250929050565b600082601f830112612da857600080fd5b8135612db8848260208601612c5c565b91505092915050565b60008083601f840112612dd357600080fd5b8235905067ffffffffffffffff811115612dec57600080fd5b602083019150836001820283011115612e0457600080fd5b9250929050565b600081359050612e1a81613d7d565b92915050565b600081359050612e2f81613d94565b92915050565b600060208284031215612e4757600080fd5b6000612e5584828501612caf565b91505092915050565b60008060208385031215612e7157600080fd5b600083013567ffffffffffffffff811115612e8b57600080fd5b612e9785828601612cc4565b92509250509250929050565b600060208284031215612eb557600080fd5b6000612ec384828501612d23565b91505092915050565b60008060408385031215612edf57600080fd5b6000612eed85828601612d23565b9250506020612efe85828601612c9a565b9150509250929050565b600080600060608486031215612f1d57600080fd5b6000612f2b86828701612d23565b9350506020612f3c86828701612c9a565b9250506040612f4d86828701612c9a565b9150509250925092565b600080600060608486031215612f6c57600080fd5b6000612f7a86828701612d23565b9350506020612f8b86828701612c9a565b9250506040612f9c86828701612d0e565b9150509250925092565b60008060408385031215612fb957600080fd5b6000612fc785828601612d23565b9250506020612fd885828601612d23565b9150509250929050565b600080600060608486031215612ff757600080fd5b600061300586828701612d23565b935050602061301686828701612d23565b925050604061302786828701612d23565b9150509250925092565b60008060006060848603121561304657600080fd5b600061305486828701612d23565b935050602061306586828701612d23565b925050604061307686828701612e0b565b9150509250925092565b6000806040838503121561309357600080fd5b60006130a185828601612d23565b92505060206130b285828601612d38565b9150509250929050565b6000806000606084860312156130d157600080fd5b60006130df86828701612d23565b93505060206130f086828701612d38565b925050604061310186828701612c9a565b9150509250925092565b60008060006040848603121561312057600080fd5b600061312e86828701612d23565b935050602084013567ffffffffffffffff81111561314b57600080fd5b61315786828701612d4d565b92509250509250925092565b60008060006040848603121561317857600080fd5b600061318686828701612d23565b935050602084013567ffffffffffffffff8111156131a357600080fd5b6131af86828701612dc1565b92509250509250925092565b6000806000806000606086880312156131d357600080fd5b60006131e188828901612d23565b955050602086013567ffffffffffffffff8111156131fe57600080fd5b61320a88828901612dc1565b9450945050604086013567ffffffffffffffff81111561322957600080fd5b61323588828901612dc1565b92509250509295509295909350565b6000806040838503121561325757600080fd5b600061326585828601612d23565b925050602061327685828601612e20565b9150509250929050565b6000806000806060858703121561329657600080fd5b60006132a487828801612d23565b94505060206132b587828801612e20565b935050604085013567ffffffffffffffff8111156132d257600080fd5b6132de87828801612d4d565b925092505092959194509250565b60008060006060848603121561330157600080fd5b600061330f86828701612d23565b935050602061332086828701612e20565b925050604084013567ffffffffffffffff81111561333d57600080fd5b61334986828701612d97565b9150509250925092565b60006020828403121561336557600080fd5b600061337384828501612d38565b91505092915050565b600061338883836134b1565b905092915050565b61339981613b0a565b82525050565b6133a881613a7e565b82525050565b6133b781613a6c565b82525050565b60006133c88261395a565b6133d28185613988565b9350836020820285016133e48561394a565b8060005b858110156134205784840389528151613401858261337c565b945061340c8361397b565b925060208a019950506001810190506133e8565b50829750879550505050505092915050565b61343b81613a90565b82525050565b61344a81613a9c565b82525050565b61345981613aa6565b82525050565b600061346b83856139aa565b9350613478838584613b40565b61348183613d10565b840190509392505050565b600061349883856139bb565b93506134a5838584613b40565b82840190509392505050565b60006134bc82613965565b6134c68185613999565b93506134d6818560208601613b4f565b6134df81613d10565b840191505092915050565b60006134f582613965565b6134ff81856139aa565b935061350f818560208601613b4f565b61351881613d10565b840191505092915050565b600061352e82613965565b61353881856139bb565b9350613548818560208601613b4f565b80840191505092915050565b600061356083856139c6565b935061356d838584613b40565b61357683613d10565b840190509392505050565b600061358d83856139d7565b935061359a838584613b40565b82840190509392505050565b60006135b182613970565b6135bb81856139c6565b93506135cb818560208601613b4f565b6135d481613d10565b840191505092915050565b6135e881613ad2565b82525050565b6135f781613b00565b82525050565b600061360a82848661348c565b91508190509392505050565b60006136228284613523565b915081905092915050565b600061363a828486613581565b91508190509392505050565b600060208201905061365b60008301846133ae565b92915050565b60006020820190506136766000830184613390565b92915050565b6000602082019050613691600083018461339f565b92915050565b600060208201905081810360008301526136b181846133bd565b905092915050565b60006020820190506136ce6000830184613432565b92915050565b60006020820190506136e96000830184613441565b92915050565b60006040820190506137046000830185613441565b6137116020830184613441565b9392505050565b600060208201905061372d6000830184613450565b92915050565b6000602082019050818103600083015261374e81848661345f565b90509392505050565b6000602082019050818103600083015261377181846134ea565b905092915050565b6000604082019050818103600083015261379381866134ea565b905081810360208301526137a881848661345f565b9050949350505050565b600060408201905081810360008301526137cc81856134ea565b90506137db60208301846135df565b9392505050565b600060608201905081810360008301526137fc81866134ea565b905061380b60208301856135df565b818103604083015261381d81846134ea565b9050949350505050565b60006020820190508181036000830152613842818486613554565b90509392505050565b6000602082019050818103600083015261386581846135a6565b905092915050565b600060408201905061388260008301856135ee565b818103602083015261389481846134ea565b90509392505050565b600080833560016020038436030381126138b657600080fd5b80840192508235915067ffffffffffffffff8211156138d457600080fd5b6020830192506001820236038313156138ec57600080fd5b509250929050565b60006138fe61390f565b905061390a8282613bde565b919050565b6000604051905090565b600067ffffffffffffffff82111561393457613933613ce1565b5b61393d82613d10565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006139ed82613b00565b91506139f883613b00565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613a2d57613a2c613c83565b5b828201905092915050565b6000613a4382613b00565b9150613a4e83613b00565b925082821015613a6157613a60613c83565b5b828203905092915050565b6000613a7782613ae0565b9050919050565b6000613a8982613ae0565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000613b1582613b1c565b9050919050565b6000613b2782613b2e565b9050919050565b6000613b3982613ae0565b9050919050565b82818337600083830152505050565b60005b83811015613b6d578082015181840152602081019050613b52565b83811115613b7c576000848401525b50505050565b6000613b8d82613ad2565b91506000821415613ba157613ba0613c83565b5b600182039050919050565b60006002820490506001821680613bc457607f821691505b60208210811415613bd857613bd7613cb2565b5b50919050565b613be782613d10565b810181811067ffffffffffffffff82111715613c0657613c05613ce1565b5b80604052505050565b6000613c1a82613ad2565b915061ffff821415613c2f57613c2e613c83565b5b600182019050919050565b6000613c4582613b00565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613c7857613c77613c83565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b613d2a81613a6c565b8114613d3557600080fd5b50565b613d4181613a90565b8114613d4c57600080fd5b50565b613d5881613a9c565b8114613d6357600080fd5b50565b613d6f81613aa6565b8114613d7a57600080fd5b50565b613d8681613ad2565b8114613d9157600080fd5b50565b613d9d81613b00565b8114613da857600080fd5b5056fea26469706673582212208d77b0b1b9f2cb9b93c0c8c762cab53614cc997d02808b009ac79c0c2d2291f764736f6c634300080400330000000000000000000000000001af047e9fb5dcd99e6823c900f3d8f5b2c5f4
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061018e5760003560e01c8063691f3431116100de578063bc1c58d111610097578063d5fa2b0011610071578063d5fa2b00146104ed578063e59d895d14610509578063f1cb7e0614610525578063f86bc879146105555761018e565b8063bc1c58d114610470578063c8690233146104a0578063ce3decdc146104d15761018e565b8063691f34311461038c57806377372213146103bc5780638b95dd71146103d8578063a8fa5682146103f4578063ac9650d814610424578063ad5780af146104545761018e565b8063304e6ade1161014b5780634cbf6ba4116101255780634cbf6ba4146102e057806359d1d43c146103105780635c98042b14610340578063623195b0146103705761018e565b8063304e6ade146102785780633b3b57de146102945780633e9ce794146102c45761018e565b806301ffc9a7146101935780630af179d7146101c357806310f13a8c146101df578063124a319c146101fb5780632203ab561461022b57806329cd62ea1461025c575b600080fd5b6101ad60048036038101906101a89190613353565b610585565b6040516101ba91906136b9565b60405180910390f35b6101dd60048036038101906101d8919061310b565b610597565b005b6101f960048036038101906101f491906131bb565b6107c9565b005b61021560048036038101906102109190613080565b610877565b6040516102229190613646565b60405180910390f35b61024560048036038101906102409190613244565b610cbb565b60405161025392919061386d565b60405180910390f35b61027660048036038101906102719190612fe2565b610def565b005b610292600480360381019061028d919061310b565b610e81565b005b6102ae60048036038101906102a99190612ea3565b610ef7565b6040516102bb919061367c565b60405180910390f35b6102de60048036038101906102d99190612f57565b610f2d565b005b6102fa60048036038101906102f59190612fa6565b61103d565b60405161030791906136b9565b60405180910390f35b61032a60048036038101906103259190613163565b6110a5565b604051610337919061384b565b60405180910390f35b61035a60048036038101906103559190612ea3565b61116a565b6040516103679190613757565b60405180910390f35b61038a60048036038101906103859190613280565b61120f565b005b6103a660048036038101906103a19190612ea3565b6112a5565b6040516103b3919061384b565b60405180910390f35b6103d660048036038101906103d19190613163565b61134a565b005b6103f260048036038101906103ed91906132ec565b6113c0565b005b61040e60048036038101906104099190613031565b611496565b60405161041b9190613757565b60405180910390f35b61043e60048036038101906104399190612e5e565b61158b565b60405161044b9190613697565b60405180910390f35b61046e60048036038101906104699190612ea3565b611737565b005b61048a60048036038101906104859190612ea3565b6117a4565b6040516104979190613757565b60405180910390f35b6104ba60048036038101906104b59190612ea3565b611849565b6040516104c89291906136ef565b60405180910390f35b6104eb60048036038101906104e6919061310b565b611883565b005b61050760048036038101906105029190612ecc565b61199c565b005b610523600480360381019061051e91906130bc565b6119c8565b005b61053f600480360381019061053a9190613244565b611ada565b60405161054c9190613757565b60405180910390f35b61056f600480360381019061056a9190612f08565b611b91565b60405161057c91906136b9565b60405180910390f35b600061059082611bcd565b9050919050565b826105a181611c2e565b6105aa57600080fd5b60008060608060008061060b60008a8a8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611db790919063ffffffff16565b90505b61061781611de1565b61074d5760008661ffff161415610673578060400151955061063881611df7565b93508360405160200161064b9190613616565b60405160208183030381529060405280519060200120915061066c81611e2e565b925061073f565b600061067e82611df7565b9050816040015161ffff168761ffff161415806106ab57506106a98186611e6790919063ffffffff16565b155b1561073d576107168b86898d8d8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508a8b886020015161070c9190613a38565b60008b5114611e8e565b81604001519650816020015195508094508480519060200120925061073a82611e2e565b93505b505b610748816121b9565b61060e565b506000835111156107be576107bd8984878b8b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505088898e8e90506107b39190613a38565b6000895114611e8e565b5b505050505050505050565b846107d381611c2e565b6107dc57600080fd5b8282600a6000898152602001908152602001600020878760405161080192919061362d565b9081526020016040518091039020919061081c929190612a22565b50848460405161082d92919061362d565b6040518091039020867fd8c9334b1a9c2f9da342a0a2b32629c1a229b6445dad78947f674b44444a75508787604051610867929190613827565b60405180910390a3505050505050565b600080600760008581526020019081526020016000206000847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461093c5780915050610cb5565b600061094785610ef7565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561098957600092505050610cb5565b6000808273ffffffffffffffffffffffffffffffffffffffff166301ffc9a760e01b6040516024016109bb9190613718565b6040516020818303038152906040527f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610a459190613616565b600060405180830381855afa9150503d8060008114610a80576040519150601f19603f3d011682016040523d82523d6000602084013e610a85565b606091505b5091509150811580610a98575060208151105b80610b0c5750600060f81b81601f81518110610add577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b15610b1e576000945050505050610cb5565b8273ffffffffffffffffffffffffffffffffffffffff1686604051602401610b469190613718565b6040516020818303038152906040527f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610bd09190613616565b600060405180830381855afa9150503d8060008114610c0b576040519150601f19603f3d011682016040523d82523d6000602084013e610c10565b606091505b508092508193505050811580610c27575060208151105b80610c9b5750600060f81b81601f81518110610c6c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b15610cad576000945050505050610cb5565b829450505050505b92915050565b60006060600080600086815260200190815260200160002090506000600190505b848111610dcf57600085821614158015610d14575060008260008381526020019081526020016000208054610d1090613bac565b9050115b15610dc35780826000838152602001908152602001600020808054610d3890613bac565b80601f0160208091040260200160405190810160405280929190818152602001828054610d6490613bac565b8015610db15780601f10610d8657610100808354040283529160200191610db1565b820191906000526020600020905b815481529060010190602001808311610d9457829003601f168201915b50505050509050935093505050610de8565b600181901b9050610cdc565b5060006040518060200160405280600081525092509250505b9250929050565b82610df981611c2e565b610e0257600080fd5b604051806040016040528084815260200183815250600960008681526020019081526020016000206000820151816000015560208201518160010155905050837f1d6f5e03d3f63eb58751986629a5439baee5079ff04f345becb66e23eb154e468484604051610e739291906136ef565b60405180910390a250505050565b82610e8b81611c2e565b610e9457600080fd5b8282600260008781526020019081526020016000209190610eb6929190612aa8565b50837fe379c1624ed7e714cc0937528a32359d69d5281337765313dba4e081b72d75788484604051610ee9929190613733565b60405180910390a250505050565b600080610f0583603c611ada565b9050600081511415610f1b576000915050610f28565b610f2481612303565b9150505b919050565b80600c600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16847fe1c5610a6e0cbe10764ecd182adcef1ec338dc4e199c99c32ce98f38e12791df8460405161103091906136b9565b60405180910390a4505050565b60008060066000858152602001908152602001600020600060046000878152602001908152602001600020548152602001908152602001600020600084815260200190815260200160002060009054906101000a900461ffff1661ffff161415905092915050565b6060600a600085815260200190815260200160002083836040516110ca92919061362d565b908152602001604051809103902080546110e390613bac565b80601f016020809104026020016040519081016040528092919081815260200182805461110f90613bac565b801561115c5780601f106111315761010080835404028352916020019161115c565b820191906000526020600020905b81548152906001019060200180831161113f57829003601f168201915b505050505090509392505050565b606060036000838152602001908152602001600020805461118a90613bac565b80601f01602080910402602001604051908101604052809291908181526020018280546111b690613bac565b80156112035780601f106111d857610100808354040283529160200191611203565b820191906000526020600020905b8154815290600101906020018083116111e657829003601f168201915b50505050509050919050565b8361121981611c2e565b61122257600080fd5b6000846001866112329190613a38565b161461123d57600080fd5b82826000808881526020019081526020016000206000878152602001908152602001600020919061126f929190612aa8565b5083857faa121bbeef5f32f5961a2a28966e769023910fc9479059ee3495d4c1a696efe360405160405180910390a35050505050565b60606008600083815260200190815260200160002080546112c590613bac565b80601f01602080910402602001604051908101604052809291908181526020018280546112f190613bac565b801561133e5780601f106113135761010080835404028352916020019161133e565b820191906000526020600020905b81548152906001019060200180831161132157829003601f168201915b50505050509050919050565b8261135481611c2e565b61135d57600080fd5b828260086000878152602001908152602001600020919061137f929190612a22565b50837fb7d29e911041e8d9b843369e890bcb72c9388692ba48b65ac54e7214c4c348f784846040516113b2929190613827565b60405180910390a250505050565b826113ca81611c2e565b6113d357600080fd5b837f65412581168e88a1e60c6459d7f44ae83ad0832e670826c05a4e2476b57af752848460405161140592919061386d565b60405180910390a2603c83141561145757837f52d7d861f09ab3d26239d492e8968629f95e9e318cf0b73bfddc441522a15fd261144184612303565b60405161144e9190613661565b60405180910390a25b81600160008681526020019081526020016000206000858152602001908152602001600020908051906020019061148f929190612b2e565b5050505050565b606060056000858152602001908152602001600020600060046000878152602001908152602001600020548152602001908152602001600020600084815260200190815260200160002060008361ffff1661ffff168152602001908152602001600020805461150490613bac565b80601f016020809104026020016040519081016040528092919081815260200182805461153090613bac565b801561157d5780601f106115525761010080835404028352916020019161157d565b820191906000526020600020905b81548152906001019060200180831161156057829003601f168201915b505050505090509392505050565b60608282905067ffffffffffffffff8111156115d0577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405190808252806020026020018201604052801561160357816020015b60608152602001906001900390816115ee5790505b50905060005b83839050811015611730576000803073ffffffffffffffffffffffffffffffffffffffff16868685818110611667577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002810190611679919061389d565b6040516116879291906135fd565b600060405180830381855af49150503d80600081146116c2576040519150601f19603f3d011682016040523d82523d6000602084013e6116c7565b606091505b5091509150816116d657600080fd5b80848481518110611710577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101819052505050808061172890613c3a565b915050611609565b5092915050565b8061174181611c2e565b61174a57600080fd5b60046000838152602001908152602001600020600081548092919061176e90613c3a565b9190505550817fb757169b8492ca2f1c6619d9d76ce22803035c3b1d5f6930dffe7b127c1a198360405160405180910390a25050565b60606002600083815260200190815260200160002080546117c490613bac565b80601f01602080910402602001604051908101604052809291908181526020018280546117f090613bac565b801561183d5780601f106118125761010080835404028352916020019161183d565b820191906000526020600020905b81548152906001019060200180831161182057829003601f168201915b50505050509050919050565b6000806009600084815260200190815260200160002060000154600960008581526020019081526020016000206001015491509150915091565b8261188d81611c2e565b61189657600080fd5b60006003600086815260200190815260200160002080546118b690613bac565b80601f01602080910402602001604051908101604052809291908181526020018280546118e290613bac565b801561192f5780601f106119045761010080835404028352916020019161192f565b820191906000526020600020905b81548152906001019060200180831161191257829003601f168201915b505050505090508383600360008881526020019081526020016000209190611958929190612aa8565b50847f8f15ed4b723ef428f250961da8315675b507046737e19319fc1a4d81bfe87f8582868660405161198d93929190613779565b60405180910390a25050505050565b816119a681611c2e565b6119af57600080fd5b6119c383603c6119be85612326565b6113c0565b505050565b826119d281611c2e565b6119db57600080fd5b81600760008681526020019081526020016000206000857bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916847f7c69f06bea0bdef565b709e93a147836b0063ba2dd89f02d0b7e8d931e6a6daa84604051611acc9190613646565b60405180910390a350505050565b60606001600084815260200190815260200160002060008381526020019081526020016000208054611b0b90613bac565b80601f0160208091040260200160405190810160405280929190818152602001828054611b3790613bac565b8015611b845780601f10611b5957610100808354040283529160200191611b84565b820191906000526020600020905b815481529060010190602001808311611b6757829003601f168201915b5050505050905092915050565b600c602052826000526040600020602052816000526040600020602052806000526040600020600092509250509054906101000a900460ff1681565b60006359d1d43c60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611c275750611c26826123b0565b5b9050919050565b600080600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166302571be3846040518263ffffffff1660e01b8152600401611c8c91906136d4565b60206040518083038186803b158015611ca457600080fd5b505afa158015611cb8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cdc9190612e35565b90503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480611daf5750600c600084815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b915050919050565b611dbf612bb4565b828160000181905250818160c0018181525050611ddb816121b9565b92915050565b6000816000015151826020015110159050919050565b6060611e278260200151611e1384600001518560200151612411565b84600001516124b49092919063ffffffff16565b9050919050565b6060611e608260a001518360a001518460c00151611e4c9190613a38565b84600001516124b49092919063ffffffff16565b9050919050565b600081518351148015611e865750611e85836000846000875161256f565b5b905092915050565b6000600460008981526020019081526020016000205490506000878051906020012090506000611ec98686896124b49092919063ffffffff16565b9050831561203b576000600560008c81526020019081526020016000206000858152602001908152602001600020600084815260200190815260200160002060008a61ffff1661ffff1681526020019081526020016000208054611f2c90613bac565b905014611fa257600660008b815260200190815260200160002060008481526020019081526020016000206000838152602001908152602001600020600081819054906101000a900461ffff1680929190611f8690613b82565b91906101000a81548161ffff021916908361ffff160217905550505b600560008b81526020019081526020016000206000848152602001908152602001600020600083815260200190815260200160002060008961ffff1661ffff1681526020019081526020016000206000611ffc9190612bff565b897f03528ed0c2a3ebc993b12ce3c16bb382f9c7d88ef7d8a1bf290eaf35955a12078a8a60405161202e9291906137b2565b60405180910390a26121ad565b6000600560008c81526020019081526020016000206000858152602001908152602001600020600084815260200190815260200160002060008a61ffff1661ffff168152602001908152602001600020805461209690613bac565b9050141561210d57600660008b815260200190815260200160002060008481526020019081526020016000206000838152602001908152602001600020600081819054906101000a900461ffff16809291906120f190613c0f565b91906101000a81548161ffff021916908361ffff160217905550505b80600560008c81526020019081526020016000206000858152602001908152602001600020600084815260200190815260200160002060008a61ffff1661ffff168152602001908152602001600020908051906020019061216f929190612b2e565b50897f52a608b3303a48862d07a73d82fa221318c0027fbbcfb1b2329bface3f19ff2b8a8a846040516121a4939291906137e2565b60405180910390a25b50505050505050505050565b8060c001518160200181815250508060000151518160200151106121dc57612300565b60006121f082600001518360200151612411565b82602001516121ff91906139e2565b905061221881836000015161259390919063ffffffff16565b826040019061ffff16908161ffff168152505060028161223891906139e2565b905061225181836000015161259390919063ffffffff16565b826060019061ffff16908161ffff168152505060028161227191906139e2565b905061228a8183600001516125c290919063ffffffff16565b826080019063ffffffff16908163ffffffff16815250506004816122ae91906139e2565b905060006122c982846000015161259390919063ffffffff16565b61ffff1690506002826122dc91906139e2565b9150818360a001818152505080826122f491906139e2565b8360c001818152505050505b50565b6000601482511461231357600080fd5b600c6101000a6020830151049050919050565b6060601467ffffffffffffffff811115612369577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561239b5781602001600182028036833780820191505090505b509050600c6101000a82026020820152919050565b600063c869023360e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061240a5750612409826125f3565b5b9050919050565b6000808290505b60011561249f5783518110612456577f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b600061246b828661265490919063ffffffff16565b60ff16905060018161247d91906139e2565b8261248891906139e2565b91506000811415612499575061249f565b50612418565b82816124ab9190613a38565b91505092915050565b6060835182846124c491906139e2565b11156124cf57600080fd5b60008267ffffffffffffffff811115612511577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156125435781602001600182028036833780820191505090505b50905060008060208301915085602088010190506125628282876126a5565b8293505050509392505050565b600061257c848484612709565b612587878785612709565b14905095945050505050565b600082516002836125a491906139e2565b11156125af57600080fd5b61ffff8260028501015116905092915050565b600082516004836125d391906139e2565b11156125de57600080fd5b63ffffffff8260048501015116905092915050565b600063691f343160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061264d575061264c82612735565b5b9050919050565b600082828151811061268f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b60f81c905092915050565b5b602081106126e457815183526020836126bf91906139e2565b92506020826126ce91906139e2565b91506020816126dd9190613a38565b90506126a6565b60006001826020036101000a0390508019835116818551168181178652505050505050565b60008351828461271991906139e2565b111561272457600080fd5b818360208601012090509392505050565b60007f124a319c1247f4318c3c16c7e9cc865d0fb5d80d7bf02f56cafc0d14da0208507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806127a857506127a7826127af565b5b9050919050565b600063a8fa568260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806128485750635c47637c60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061285857506128578261285f565b5b9050919050565b600063bc1c58d160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806128b957506128b8826128c0565b5b9050919050565b6000633b3b57de60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612959575063f1cb7e0660e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612969575061296882612970565b5b9050919050565b6000632203ab5660e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806129ca57506129c9826129d1565b5b9050919050565b60006301ffc9a760e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b828054612a2e90613bac565b90600052602060002090601f016020900481019282612a505760008555612a97565b82601f10612a6957803560ff1916838001178555612a97565b82800160010185558215612a97579182015b82811115612a96578235825591602001919060010190612a7b565b5b509050612aa49190612c3f565b5090565b828054612ab490613bac565b90600052602060002090601f016020900481019282612ad65760008555612b1d565b82601f10612aef57803560ff1916838001178555612b1d565b82800160010185558215612b1d579182015b82811115612b1c578235825591602001919060010190612b01565b5b509050612b2a9190612c3f565b5090565b828054612b3a90613bac565b90600052602060002090601f016020900481019282612b5c5760008555612ba3565b82601f10612b7557805160ff1916838001178555612ba3565b82800160010185558215612ba3579182015b82811115612ba2578251825591602001919060010190612b87565b5b509050612bb09190612c3f565b5090565b6040518060e001604052806060815260200160008152602001600061ffff168152602001600061ffff168152602001600063ffffffff16815260200160008152602001600081525090565b508054612c0b90613bac565b6000825580601f10612c1d5750612c3c565b601f016020900490600052602060002090810190612c3b9190612c3f565b5b50565b5b80821115612c58576000816000905550600101612c40565b5090565b6000612c6f612c6a84613919565b6138f4565b905082815260208101848484011115612c8757600080fd5b612c92848285613b40565b509392505050565b600081359050612ca981613d21565b92915050565b600081519050612cbe81613d21565b92915050565b60008083601f840112612cd657600080fd5b8235905067ffffffffffffffff811115612cef57600080fd5b602083019150836020820283011115612d0757600080fd5b9250929050565b600081359050612d1d81613d38565b92915050565b600081359050612d3281613d4f565b92915050565b600081359050612d4781613d66565b92915050565b60008083601f840112612d5f57600080fd5b8235905067ffffffffffffffff811115612d7857600080fd5b602083019150836001820283011115612d9057600080fd5b9250929050565b600082601f830112612da857600080fd5b8135612db8848260208601612c5c565b91505092915050565b60008083601f840112612dd357600080fd5b8235905067ffffffffffffffff811115612dec57600080fd5b602083019150836001820283011115612e0457600080fd5b9250929050565b600081359050612e1a81613d7d565b92915050565b600081359050612e2f81613d94565b92915050565b600060208284031215612e4757600080fd5b6000612e5584828501612caf565b91505092915050565b60008060208385031215612e7157600080fd5b600083013567ffffffffffffffff811115612e8b57600080fd5b612e9785828601612cc4565b92509250509250929050565b600060208284031215612eb557600080fd5b6000612ec384828501612d23565b91505092915050565b60008060408385031215612edf57600080fd5b6000612eed85828601612d23565b9250506020612efe85828601612c9a565b9150509250929050565b600080600060608486031215612f1d57600080fd5b6000612f2b86828701612d23565b9350506020612f3c86828701612c9a565b9250506040612f4d86828701612c9a565b9150509250925092565b600080600060608486031215612f6c57600080fd5b6000612f7a86828701612d23565b9350506020612f8b86828701612c9a565b9250506040612f9c86828701612d0e565b9150509250925092565b60008060408385031215612fb957600080fd5b6000612fc785828601612d23565b9250506020612fd885828601612d23565b9150509250929050565b600080600060608486031215612ff757600080fd5b600061300586828701612d23565b935050602061301686828701612d23565b925050604061302786828701612d23565b9150509250925092565b60008060006060848603121561304657600080fd5b600061305486828701612d23565b935050602061306586828701612d23565b925050604061307686828701612e0b565b9150509250925092565b6000806040838503121561309357600080fd5b60006130a185828601612d23565b92505060206130b285828601612d38565b9150509250929050565b6000806000606084860312156130d157600080fd5b60006130df86828701612d23565b93505060206130f086828701612d38565b925050604061310186828701612c9a565b9150509250925092565b60008060006040848603121561312057600080fd5b600061312e86828701612d23565b935050602084013567ffffffffffffffff81111561314b57600080fd5b61315786828701612d4d565b92509250509250925092565b60008060006040848603121561317857600080fd5b600061318686828701612d23565b935050602084013567ffffffffffffffff8111156131a357600080fd5b6131af86828701612dc1565b92509250509250925092565b6000806000806000606086880312156131d357600080fd5b60006131e188828901612d23565b955050602086013567ffffffffffffffff8111156131fe57600080fd5b61320a88828901612dc1565b9450945050604086013567ffffffffffffffff81111561322957600080fd5b61323588828901612dc1565b92509250509295509295909350565b6000806040838503121561325757600080fd5b600061326585828601612d23565b925050602061327685828601612e20565b9150509250929050565b6000806000806060858703121561329657600080fd5b60006132a487828801612d23565b94505060206132b587828801612e20565b935050604085013567ffffffffffffffff8111156132d257600080fd5b6132de87828801612d4d565b925092505092959194509250565b60008060006060848603121561330157600080fd5b600061330f86828701612d23565b935050602061332086828701612e20565b925050604084013567ffffffffffffffff81111561333d57600080fd5b61334986828701612d97565b9150509250925092565b60006020828403121561336557600080fd5b600061337384828501612d38565b91505092915050565b600061338883836134b1565b905092915050565b61339981613b0a565b82525050565b6133a881613a7e565b82525050565b6133b781613a6c565b82525050565b60006133c88261395a565b6133d28185613988565b9350836020820285016133e48561394a565b8060005b858110156134205784840389528151613401858261337c565b945061340c8361397b565b925060208a019950506001810190506133e8565b50829750879550505050505092915050565b61343b81613a90565b82525050565b61344a81613a9c565b82525050565b61345981613aa6565b82525050565b600061346b83856139aa565b9350613478838584613b40565b61348183613d10565b840190509392505050565b600061349883856139bb565b93506134a5838584613b40565b82840190509392505050565b60006134bc82613965565b6134c68185613999565b93506134d6818560208601613b4f565b6134df81613d10565b840191505092915050565b60006134f582613965565b6134ff81856139aa565b935061350f818560208601613b4f565b61351881613d10565b840191505092915050565b600061352e82613965565b61353881856139bb565b9350613548818560208601613b4f565b80840191505092915050565b600061356083856139c6565b935061356d838584613b40565b61357683613d10565b840190509392505050565b600061358d83856139d7565b935061359a838584613b40565b82840190509392505050565b60006135b182613970565b6135bb81856139c6565b93506135cb818560208601613b4f565b6135d481613d10565b840191505092915050565b6135e881613ad2565b82525050565b6135f781613b00565b82525050565b600061360a82848661348c565b91508190509392505050565b60006136228284613523565b915081905092915050565b600061363a828486613581565b91508190509392505050565b600060208201905061365b60008301846133ae565b92915050565b60006020820190506136766000830184613390565b92915050565b6000602082019050613691600083018461339f565b92915050565b600060208201905081810360008301526136b181846133bd565b905092915050565b60006020820190506136ce6000830184613432565b92915050565b60006020820190506136e96000830184613441565b92915050565b60006040820190506137046000830185613441565b6137116020830184613441565b9392505050565b600060208201905061372d6000830184613450565b92915050565b6000602082019050818103600083015261374e81848661345f565b90509392505050565b6000602082019050818103600083015261377181846134ea565b905092915050565b6000604082019050818103600083015261379381866134ea565b905081810360208301526137a881848661345f565b9050949350505050565b600060408201905081810360008301526137cc81856134ea565b90506137db60208301846135df565b9392505050565b600060608201905081810360008301526137fc81866134ea565b905061380b60208301856135df565b818103604083015261381d81846134ea565b9050949350505050565b60006020820190508181036000830152613842818486613554565b90509392505050565b6000602082019050818103600083015261386581846135a6565b905092915050565b600060408201905061388260008301856135ee565b818103602083015261389481846134ea565b90509392505050565b600080833560016020038436030381126138b657600080fd5b80840192508235915067ffffffffffffffff8211156138d457600080fd5b6020830192506001820236038313156138ec57600080fd5b509250929050565b60006138fe61390f565b905061390a8282613bde565b919050565b6000604051905090565b600067ffffffffffffffff82111561393457613933613ce1565b5b61393d82613d10565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006139ed82613b00565b91506139f883613b00565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613a2d57613a2c613c83565b5b828201905092915050565b6000613a4382613b00565b9150613a4e83613b00565b925082821015613a6157613a60613c83565b5b828203905092915050565b6000613a7782613ae0565b9050919050565b6000613a8982613ae0565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000613b1582613b1c565b9050919050565b6000613b2782613b2e565b9050919050565b6000613b3982613ae0565b9050919050565b82818337600083830152505050565b60005b83811015613b6d578082015181840152602081019050613b52565b83811115613b7c576000848401525b50505050565b6000613b8d82613ad2565b91506000821415613ba157613ba0613c83565b5b600182039050919050565b60006002820490506001821680613bc457607f821691505b60208210811415613bd857613bd7613cb2565b5b50919050565b613be782613d10565b810181811067ffffffffffffffff82111715613c0657613c05613ce1565b5b80604052505050565b6000613c1a82613ad2565b915061ffff821415613c2f57613c2e613c83565b5b600182019050919050565b6000613c4582613b00565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613c7857613c77613c83565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b613d2a81613a6c565b8114613d3557600080fd5b50565b613d4181613a90565b8114613d4c57600080fd5b50565b613d5881613a9c565b8114613d6357600080fd5b50565b613d6f81613aa6565b8114613d7a57600080fd5b50565b613d8681613ad2565b8114613d9157600080fd5b50565b613d9d81613b00565b8114613da857600080fd5b5056fea26469706673582212208d77b0b1b9f2cb9b93c0c8c762cab53614cc997d02808b009ac79c0c2d2291f764736f6c63430008040033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000001af047e9fb5dcd99e6823c900f3d8f5b2c5f4
-----Decoded View---------------
Arg [0] : _ens (address): 0x0001af047E9fb5dCD99E6823C900f3D8f5b2c5f4
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000000001af047e9fb5dcd99e6823c900f3d8f5b2c5f4
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.