ETH Price: $3,431.36 (-0.05%)
 

Overview

Max Total Supply

511,412

Holders

391,785

Market

Volume (24H)

0.241 ETH

Min Price (24H)

$5.15 @ 0.001500 ETH

Max Price (24H)

$480.39 @ 0.140000 ETH
Filtered by Token Holder
mainviv.eth
0xb63674bc975b96c4a89dc0661d8affbc9413c131
Loading...
Loading
Loading...
Loading

OVERVIEW

Ethereum Name Service (ENS) domains are secure domain names for the decentralized world. ENS domains provide a way for users to map human readable names to blockchain and non-blockchain resources, like Ethereum addresses, IPFS hashes, or website URLs. ENS domains can be bought and sold on secondary markets.

# Exchange Pair Price  24H Volume % Volume

Similar Match Source Code
This contract matches the deployed Bytecode of the Source Code for Contract 0x6d372bA8...4e87dB67A
The constructor portion of the code might be different and could alter the actual behaviour of the contract

Contract Name:
NameWrapper

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 1300 runs

Other Settings:
default evmVersion, MIT license
File 1 of 23 : NameWrapper.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//SPDX-License-Identifier: MIT
pragma solidity ~0.8.17;
import {ERC1155Fuse, IERC165, IERC1155MetadataURI} from "./ERC1155Fuse.sol";
import {Controllable} from "./Controllable.sol";
import {INameWrapper, CANNOT_UNWRAP, CANNOT_BURN_FUSES, CANNOT_TRANSFER, CANNOT_SET_RESOLVER, CANNOT_SET_TTL, CANNOT_CREATE_SUBDOMAIN,
    CANNOT_APPROVE, PARENT_CANNOT_CONTROL, CAN_DO_EVERYTHING, IS_DOT_ETH, CAN_EXTEND_EXPIRY, PARENT_CONTROLLED_FUSES, USER_SETTABLE_FUSES} from "
    ./INameWrapper.sol";
import {INameWrapperUpgrade} from "./INameWrapperUpgrade.sol";
import {IMetadataService} from "./IMetadataService.sol";
import {ENS} from "../registry/ENS.sol";
import {IReverseRegistrar} from "../reverseRegistrar/IReverseRegistrar.sol";
import {ReverseClaimer} from "../reverseRegistrar/ReverseClaimer.sol";
import {IBaseRegistrar} from "../ethregistrar/IBaseRegistrar.sol";
import {IERC721Receiver} from "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol";
import "@openzeppelin/contracts/token/ERC1155/IERC1155.sol";
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
import {BytesUtils} from "./BytesUtils.sol";
import {ERC20Recoverable} from "../utils/ERC20Recoverable.sol";
error Unauthorised(bytes32 node, address addr);
error IncompatibleParent();
error IncorrectTokenType();
error LabelMismatch(bytes32 labelHash, bytes32 expectedLabelhash);
error LabelTooShort();
error LabelTooLong(string label);
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 2 of 23 : Ownable.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)
pragma solidity ^0.8.0;
import "../utils/Context.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 3 of 23 : IERC1155.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/IERC1155.sol)
pragma solidity ^0.8.0;
import "../../utils/introspection/IERC165.sol";
/**
* @dev Required interface of an ERC1155 compliant contract, as defined in the
* https://eips.ethereum.org/EIPS/eip-1155[EIP].
*
* _Available since v3.1._
*/
interface IERC1155 is IERC165 {
/**
* @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
*/
event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);
/**
* @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
* transfers.
*/
event TransferBatch(
address indexed operator,
address indexed from,
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 4 of 23 : IERC1155Receiver.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)
pragma solidity ^0.8.0;
import "../../utils/introspection/IERC165.sol";
/**
* @dev _Available since v3.1._
*/
interface IERC1155Receiver is IERC165 {
/**
* @dev Handles the receipt of a single ERC1155 token type. This function is
* called at the end of a `safeTransferFrom` after the balance has been updated.
*
* NOTE: To accept the transfer, this must return
* `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
* (i.e. 0xf23a6e61, or its own function selector).
*
* @param operator The address which initiated the transfer (i.e. msg.sender)
* @param from The address which previously owned the token
* @param id The ID of the token being transferred
* @param value The amount of tokens being transferred
* @param data Additional data with no specified format
* @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
*/
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 5 of 23 : IERC1155MetadataURI.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol)
pragma solidity ^0.8.0;
import "../IERC1155.sol";
/**
* @dev Interface of the optional ERC1155MetadataExtension interface, as defined
* in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].
*
* _Available since v3.1._
*/
interface IERC1155MetadataURI is IERC1155 {
/**
* @dev Returns the URI for token type `id`.
*
* If the `\{id\}` substring is present in the URI, it must be replaced by
* clients with the actual token type ID.
*/
function uri(uint256 id) external view returns (string memory);
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 6 of 23 : IERC20.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
/**
* @dev Returns the amount of tokens in existence.
*/
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 7 of 23 : IERC721.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol)
pragma solidity ^0.8.0;
import "../../utils/introspection/IERC165.sol";
/**
* @dev Required interface of an ERC721 compliant contract.
*/
interface IERC721 is IERC165 {
/**
* @dev Emitted when `tokenId` token is transferred from `from` to `to`.
*/
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
*/
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
*/
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 8 of 23 : IERC721Receiver.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)
pragma solidity ^0.8.0;
/**
* @title ERC721 token receiver interface
* @dev Interface for any contract that wants to support safeTransfers
* from ERC721 asset contracts.
*/
interface IERC721Receiver {
/**
* @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
* by `operator` from `from`, this function is called.
*
* It must return its Solidity selector to confirm the token transfer.
* If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
*
* The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.
*/
function onERC721Received(
address operator,
address from,
uint256 tokenId,
bytes calldata data
) external returns (bytes4);
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 9 of 23 : Address.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)
pragma solidity ^0.8.1;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 10 of 23 : Context.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^0.8.0;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 11 of 23 : ERC165.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)
pragma solidity ^0.8.0;
import "./IERC165.sol";
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
* for the additional interface id that will be supported. For example:
*
* ```solidity
* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
* return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
* }
* ```
*
* Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
*/
abstract contract ERC165 is IERC165 {
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 12 of 23 : IERC165.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 13 of 23 : IBaseRegistrar.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import "../registry/ENS.sol";
import "./IBaseRegistrar.sol";
import "@openzeppelin/contracts/token/ERC721/IERC721.sol";
interface IBaseRegistrar is IERC721 {
event ControllerAdded(address indexed controller);
event ControllerRemoved(address indexed controller);
event NameMigrated(
uint256 indexed id,
address indexed owner,
uint256 expires
);
event NameRegistered(
uint256 indexed id,
address indexed owner,
uint256 expires
);
event NameRenewed(uint256 indexed id, uint256 expires);
// Authorises a controller, who can register and renew domains.
function addController(address controller) external;
// Revoke controller permission for an address.
function removeController(address controller) external;
// Set the resolver for the TLD this registrar manages.
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 14 of 23 : ENS.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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,
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 15 of 23 : IReverseRegistrar.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
pragma solidity >=0.8.4;
interface IReverseRegistrar {
function setDefaultResolver(address resolver) external;
function claim(address owner) external returns (bytes32);
function claimForAddr(
address addr,
address owner,
address resolver
) external returns (bytes32);
function claimWithResolver(
address owner,
address resolver
) external returns (bytes32);
function setName(string memory name) external returns (bytes32);
function setNameForAddr(
address addr,
address owner,
address resolver,
string memory name
) external returns (bytes32);
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 16 of 23 : ReverseClaimer.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//SPDX-License-Identifier: MIT
pragma solidity >=0.8.17 <0.9.0;
import {ENS} from "../registry/ENS.sol";
import {IReverseRegistrar} from "../reverseRegistrar/IReverseRegistrar.sol";
contract ReverseClaimer {
bytes32 constant ADDR_REVERSE_NODE =
0x91d1777781884d03a6757a803996e38de2a42967fb37eeaca72729271025a9e2;
constructor(ENS ens, address claimant) {
IReverseRegistrar reverseRegistrar = IReverseRegistrar(
ens.owner(ADDR_REVERSE_NODE)
);
reverseRegistrar.claim(claimant);
}
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 17 of 23 : ERC20Recoverable.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//SPDX-License-Identifier: MIT
pragma solidity >=0.8.17 <0.9.0;
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
/**
@notice Contract is used to recover ERC20 tokens sent to the contract by mistake.
*/
contract ERC20Recoverable is Ownable {
/**
@notice Recover ERC20 tokens sent to the contract by mistake.
@dev The contract is Ownable and only the owner can call the recover function.
@param _to The address to send the tokens to.
@param _token The address of the ERC20 token to recover
@param _amount The amount of tokens to recover.
*/
function recoverFunds(
address _token,
address _to,
uint256 _amount
) external onlyOwner {
IERC20(_token).transfer(_to, _amount);
}
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 18 of 23 : BytesUtils.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//SPDX-License-Identifier: MIT
pragma solidity ~0.8.17;
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,
uint256 offset,
uint256 len
) internal pure returns (bytes32 ret) {
require(offset + len <= self.length);
assembly {
ret := keccak256(add(add(self, 32), offset), len)
}
}
/**
* @dev Returns the ENS namehash of a DNS-encoded name.
* @param self The DNS-encoded name to hash.
* @param offset The offset at which to start hashing.
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 19 of 23 : Controllable.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//SPDX-License-Identifier: MIT
pragma solidity ~0.8.17;
import "@openzeppelin/contracts/access/Ownable.sol";
contract Controllable is Ownable {
mapping(address => bool) public controllers;
event ControllerChanged(address indexed controller, bool active);
function setController(address controller, bool active) public onlyOwner {
controllers[controller] = active;
emit ControllerChanged(controller, active);
}
modifier onlyController() {
require(
controllers[msg.sender],
"Controllable: Caller is not a controller"
);
_;
}
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 20 of 23 : ERC1155Fuse.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//SPDX-License-Identifier: MIT
pragma solidity ~0.8.17;
import "@openzeppelin/contracts/utils/introspection/ERC165.sol";
import "@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol";
import "@openzeppelin/contracts/token/ERC1155/IERC1155.sol";
import "@openzeppelin/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol";
import "@openzeppelin/contracts/utils/Address.sol";
/* This contract is a variation on ERC1155 with the additions of _setData, getData and _beforeTransfer and ownerOf. _setData and getData allows the
    use of the other 96 bits next to the address of the owner for extra data. We use this to store 'fuses' that control permissions that can be burnt
    . 32 bits are used for the fuses themselves and 64 bits are used for the expiry of the name. When a name has expired, its fuses will be be set
    back to 0 */
abstract contract ERC1155Fuse is ERC165, IERC1155, IERC1155MetadataURI {
using Address for address;
/**
* @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
*/
event Approval(
address indexed owner,
address indexed approved,
uint256 indexed tokenId
);
mapping(uint256 => uint256) public _tokens;
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 21 of 23 : IMetadataService.sol
1
2
3
4
5
6
//SPDX-License-Identifier: MIT
pragma solidity ~0.8.17;
interface IMetadataService {
function uri(uint256) external view returns (string memory);
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 22 of 23 : INameWrapper.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//SPDX-License-Identifier: MIT
pragma solidity ~0.8.17;
import "../registry/ENS.sol";
import "../ethregistrar/IBaseRegistrar.sol";
import "@openzeppelin/contracts/token/ERC1155/IERC1155.sol";
import "./IMetadataService.sol";
import "./INameWrapperUpgrade.sol";
uint32 constant CANNOT_UNWRAP = 1;
uint32 constant CANNOT_BURN_FUSES = 2;
uint32 constant CANNOT_TRANSFER = 4;
uint32 constant CANNOT_SET_RESOLVER = 8;
uint32 constant CANNOT_SET_TTL = 16;
uint32 constant CANNOT_CREATE_SUBDOMAIN = 32;
uint32 constant CANNOT_APPROVE = 64;
//uint16 reserved for parent controlled fuses from bit 17 to bit 32
uint32 constant PARENT_CANNOT_CONTROL = 1 << 16;
uint32 constant IS_DOT_ETH = 1 << 17;
uint32 constant CAN_EXTEND_EXPIRY = 1 << 18;
uint32 constant CAN_DO_EVERYTHING = 0;
uint32 constant PARENT_CONTROLLED_FUSES = 0xFFFF0000;
// all fuses apart from IS_DOT_ETH
uint32 constant USER_SETTABLE_FUSES = 0xFFFDFFFF;
interface INameWrapper is IERC1155 {
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 23 of 23 : INameWrapperUpgrade.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
//SPDX-License-Identifier: MIT
pragma solidity ~0.8.17;
interface INameWrapperUpgrade {
function wrapFromUpgrade(
bytes calldata name,
address wrappedOwner,
uint32 fuses,
uint64 expiry,
address approved,
bytes calldata extraData
) external;
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Settings
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
{
"evmVersion": "london",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs",
"useLiteralContent": true
},
"optimizer": {
"enabled": true,
"runs": 1300
},
"remappings": [],
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
}
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"contract ENS","name":"_ens","type":"address"},{"internalType":"contract IBaseRegistrar","name":"_registrar","type":"address"},{"internalType":"contract IMetadataService","name":"_metadataService","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"CannotUpgrade","type":"error"},{"inputs":[],"name":"IncompatibleParent","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"IncorrectTargetOwner","type":"error"},{"inputs":[],"name":"IncorrectTokenType","type":"error"},{"inputs":[{"internalType":"bytes32","name":"labelHash","type":"bytes32"},{"internalType":"bytes32","name":"expectedLabelhash","type":"bytes32"}],"name":"LabelMismatch","type":"error"},{"inputs":[{"internalType":"string","name":"label","type":"string"}],"name":"LabelTooLong","type":"error"},{"inputs":[],"name":"LabelTooShort","type":"error"},{"inputs":[],"name":"NameIsNotWrapped","type":"error"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"OperationProhibited","type":"error"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"address","name":"addr","type":"address"}],"name":"Unauthorised","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"controller","type":"address"},{"indexed":false,"internalType":"bool","name":"active","type":"bool"}],"name":"ControllerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"uint64","name":"expiry","type":"uint64"}],"name":"ExpiryExtended","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"uint32","name":"fuses","type":"uint32"}],"name":"FusesSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"address","name":"owner","type":"address"}],"name":"NameUnwrapped","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"bytes","name":"name","type":"bytes"},{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint32","name":"fuses","type":"uint32"},{"indexed":false,"internalType":"uint64","name":"expiry","type":"uint64"}],"name":"NameWrapped","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_tokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"uint32","name":"fuseMask","type":"uint32"}],"name":"allFusesBurned","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"address","name":"addr","type":"address"}],"name":"canExtendSubnames","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"address","name":"addr","type":"address"}],"name":"canModifyName","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"controllers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ens","outputs":[{"internalType":"contract ENS","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"parentNode","type":"bytes32"},{"internalType":"bytes32","name":"labelhash","type":"bytes32"},{"internalType":"uint64","name":"expiry","type":"uint64"}],"name":"extendExpiry","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"operator","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getData","outputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint32","name":"fuses","type":"uint32"},{"internalType":"uint64","name":"expiry","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"parentNode","type":"bytes32"},{"internalType":"bytes32","name":"labelhash","type":"bytes32"}],"name":"isWrapped","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"isWrapped","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"metadataService","outputs":[{"internalType":"contract IMetadataService","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"names","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"recoverFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"label","type":"string"},{"internalType":"address","name":"wrappedOwner","type":"address"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"address","name":"resolver","type":"address"},{"internalType":"uint16","name":"ownerControlledFuses","type":"uint16"}],"name":"registerAndWrapETH2LD","outputs":[{"internalType":"uint256","name":"registrarExpiry","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"registrar","outputs":[{"internalType":"contract IBaseRegistrar","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"}],"name":"renew","outputs":[{"internalType":"uint256","name":"expires","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"parentNode","type":"bytes32"},{"internalType":"bytes32","name":"labelhash","type":"bytes32"},{"internalType":"uint32","name":"fuses","type":"uint32"},{"internalType":"uint64","name":"expiry","type":"uint64"}],"name":"setChildFuses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"controller","type":"address"},{"internalType":"bool","name":"active","type":"bool"}],"name":"setController","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"uint16","name":"ownerControlledFuses","type":"uint16"}],"name":"setFuses","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IMetadataService","name":"_metadataService","type":"address"}],"name":"setMetadataService","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"resolver","type":"address"},{"internalType":"uint64","name":"ttl","type":"uint64"}],"name":"setRecord","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"address","name":"resolver","type":"address"}],"name":"setResolver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"parentNode","type":"bytes32"},{"internalType":"string","name":"label","type":"string"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint32","name":"fuses","type":"uint32"},{"internalType":"uint64","name":"expiry","type":"uint64"}],"name":"setSubnodeOwner","outputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"parentNode","type":"bytes32"},{"internalType":"string","name":"label","type":"string"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"resolver","type":"address"},{"internalType":"uint64","name":"ttl","type":"uint64"},{"internalType":"uint32","name":"fuses","type":"uint32"},{"internalType":"uint64","name":"expiry","type":"uint64"}],"name":"setSubnodeRecord","outputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"uint64","name":"ttl","type":"uint64"}],"name":"setTTL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract INameWrapperUpgrade","name":"_upgradeAddress","type":"address"}],"name":"setUpgradeContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"parentNode","type":"bytes32"},{"internalType":"bytes32","name":"labelhash","type":"bytes32"},{"internalType":"address","name":"controller","type":"address"}],"name":"unwrap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"labelhash","type":"bytes32"},{"internalType":"address","name":"registrant","type":"address"},{"internalType":"address","name":"controller","type":"address"}],"name":"unwrapETH2LD","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"name","type":"bytes"},{"internalType":"bytes","name":"extraData","type":"bytes"}],"name":"upgrade","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"upgradeContract","outputs":[{"internalType":"contract INameWrapperUpgrade","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"name","type":"bytes"},{"internalType":"address","name":"wrappedOwner","type":"address"},{"internalType":"address","name":"resolver","type":"address"}],"name":"wrap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"label","type":"string"},{"internalType":"address","name":"wrappedOwner","type":"address"},{"internalType":"uint16","name":"ownerControlledFuses","type":"uint16"},{"internalType":"address","name":"resolver","type":"address"}],"name":"wrapETH2LD","outputs":[{"internalType":"uint64","name":"expiry","type":"uint64"}],"stateMutability":"nonpayable","type":"function"}]

60c06040523480156200001157600080fd5b5060405162006550380380620065508339810160408190526200003491620002f8565b823362000041816200028f565b6040516302571be360e01b81527f91d1777781884d03a6757a803996e38de2a42967fb37eeaca72729271025a9e260048201526000906001600160a01b038416906302571be390602401602060405180830381865afa158015620000a9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000cf91906200034c565b604051630f41a04d60e11b81526001600160a01b03848116600483015291925090821690631e83409a906024016020604051808303816000875af11580156200011c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000142919062000373565b505050506001600160a01b0383811660805282811660a052600580546001600160a01b031916918316919091179055600163fffeffff60a01b03197fafa26c20e8b3d9a2853d642cfe1021dae26242ffedfac91c97aab212c1a4b93b8190557fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb4955604080518082019091526001815260006020808301829052908052600690527f54cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4f89062000210908262000432565b506040805180820190915260058152626cae8d60e31b6020808301919091527f93cdeb708b7545dc668eb9280176169d1c33cfd8ed6f04690a0bcc88a93fc4ae600052600690527ffb9e8e321b8a5ec48f12a7b41f22c6e595d761285c9eb19d8dda7c99edf1b54f9062000285908262000432565b50505050620004fe565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0381168114620002f557600080fd5b50565b6000806000606084860312156200030e57600080fd5b83516200031b81620002df565b60208501519093506200032e81620002df565b60408501519092506200034181620002df565b809150509250925092565b6000602082840312156200035f57600080fd5b81516200036c81620002df565b9392505050565b6000602082840312156200038657600080fd5b5051919050565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620003b857607f821691505b602082108103620003d957634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200042d57600081815260208120601f850160051c81016020861015620004085750805b601f850160051c820191505b81811015620004295782815560010162000414565b5050505b505050565b81516001600160401b038111156200044e576200044e6200038d565b62000466816200045f8454620003a3565b84620003df565b602080601f8311600181146200049e5760008415620004855750858301515b600019600386901b1c1916600185901b17855562000429565b600085815260208120601f198616915b82811015620004cf57888601518255948401946001909101908401620004ae565b5085821015620004ee5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a051615f456200060b6000396000818161050601528181610c1501528181610cef01528181610d7901528181611c7301528181611d0901528181611db701528181611ed901528181611f4f01528181611fcf015281816122510152818161238d015281816124cc015281816126b1015281816127370152612f6c01526000818161055301528181610b9b01528181610ee4015281816110980152818161114a015281816115620152818161241201528181612551015281816127e2015281816129d901528181612ce701528181613197015281816132450152818161330e01528181613387015281816139e401528181613aff01528181613d6701526143c10152615f456000f3fe608060405234801561001057600080fd5b506004361061031f5760003560e01c80636352211e116101a7578063c93ab3fd116100ee578063e985e9c511610097578063f242432a11610071578063f242432a146107d7578063f2fde38b146107ea578063fd0cd0d9146107fd57600080fd5b8063e985e9c514610768578063eb8ae530146107a4578063ed70554d146107b757600080fd5b8063d9a50c12116100c8578063d9a50c121461071f578063da8c229e14610732578063e0dba60f1461075557600080fd5b8063c93ab3fd146106e6578063cf408823146106f9578063d8c9921a1461070c57600080fd5b8063a22cb46511610150578063b6bcad261161012a578063b6bcad26146106ad578063c475abff146106c0578063c658e086146106d357600080fd5b8063a22cb46514610674578063a401498214610687578063adf4960a1461069a57600080fd5b80638b4dfa75116101815780638b4dfa751461063d5780638cf8b41e146106505780638da5cb5b1461066357600080fd5b80636352211e146105f65780636e5d6ad214610609578063715018a61461063557600080fd5b80631f4e15041161026b5780633f15457f116102145780634e1273f4116101ee5780634e1273f4146105b057806353095467146105d05780635d3590d5146105e357600080fd5b80633f15457f1461054e578063402906fc1461057557806341415eab1461059d57600080fd5b80632b20e397116102455780632b20e397146105015780632eb2c2d61461052857806333c69ea91461053b57600080fd5b80631f4e1504146104c857806320c38e2b146104db57806324c1af44146104ee57600080fd5b80630e4cd725116102cd578063150b7a02116102a7578063150b7a02146104765780631534e177146104a25780631896f70a146104b557600080fd5b80630e4cd7251461043d5780630e89341c1461045057806314ab90381461046357600080fd5b806306fdde03116102fe57806306fdde03146103b4578063081812fc146103fd578063095ea7b31461042857600080fd5b8062fdd58e146103245780630178fe3f1461034a57806301ffc9a714610391575b600080fd5b610337610332366004614d74565b610810565b6040519081526020015b60405180910390f35b61035d610358366004614da0565b6108cf565b604080516001600160a01b03909416845263ffffffff909216602084015267ffffffffffffffff1690820152606001610341565b6103a461039f366004614dcf565b6108ff565b6040519015158152602001610341565b6103f06040518060400160405280600b81526020017f4e616d655772617070657200000000000000000000000000000000000000000081525081565b6040516103419190614e3c565b61041061040b366004614da0565b610958565b6040516001600160a01b039091168152602001610341565b61043b610436366004614d74565b61099d565b005b6103a461044b366004614e4f565b6109e3565b6103f061045e366004614da0565b610a7d565b61043b610471366004614e9c565b610aef565b610489610484366004614f11565b610c08565b6040516001600160e01b03199091168152602001610341565b61043b6104b0366004614f84565b610e1a565b61043b6104c3366004614e4f565b610e51565b600754610410906001600160a01b031681565b6103f06104e9366004614da0565b610f13565b6103376104fc36600461507c565b610fad565b6104107f000000000000000000000000000000000000000000000000000000000000000081565b61043b6105363660046151a4565b6111c1565b61043b610549366004615252565b6114eb565b6104107f000000000000000000000000000000000000000000000000000000000000000081565b6105886105833660046152aa565b6116e0565b60405163ffffffff9091168152602001610341565b6103a46105ab366004614e4f565b611782565b6105c36105be3660046152cd565b6117df565b60405161034191906153cb565b600554610410906001600160a01b031681565b61043b6105f13660046153de565b61191d565b610410610604366004614da0565b6119b7565b61061c61061736600461541f565b6119c2565b60405167ffffffffffffffff9091168152602001610341565b61043b611b17565b61043b61064b366004615454565b611b2b565b61061c61065e366004615496565b611cd5565b6000546001600160a01b0316610410565b61043b61068236600461551f565b6120a1565b61033761069536600461554d565b61218b565b6103a46106a83660046155ce565b612326565b61043b6106bb366004614f84565b61234b565b6103376106ce3660046155f1565b6125b0565b6103376106e1366004615613565b6128a7565b61043b6106f4366004615686565b612ab4565b61043b6107073660046156f2565b612c25565b61043b61071a36600461572a565b612dde565b6103a461072d3660046155f1565b612eee565b6103a4610740366004614f84565b60046020526000908152604090205460ff1681565b61043b61076336600461551f565b612ffb565b6103a4610776366004615758565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205460ff1690565b61043b6107b2366004615786565b613063565b6103376107c5366004614da0565b60016020526000908152604090205481565b61043b6107e53660046157ee565b61342e565b61043b6107f8366004614f84565b61354b565b6103a461080b366004614da0565b6135d8565b60006001600160a01b0383166108935760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201527f65726f206164647265737300000000000000000000000000000000000000000060648201526084015b60405180910390fd5b600061089e836119b7565b9050836001600160a01b0316816001600160a01b0316036108c35760019150506108c9565b60009150505b92915050565b60008181526001602052604090205460a081901c60c082901c6108f38383836136b0565b90959094509092509050565b60006001600160e01b031982167fd82c42d800000000000000000000000000000000000000000000000000000000148061094957506001600160e01b03198216630a85bd0160e11b145b806108c957506108c9826136e7565b600080610964836119b7565b90506001600160a01b03811661097d5750600092915050565b6000838152600360205260409020546001600160a01b03165b9392505050565b60006109a8826108cf565b50915050603f1960408216016109d45760405163a2a7201360e01b81526004810183905260240161088a565b6109de8383613769565b505050565b60008080806109f1866108cf565b925092509250846001600160a01b0316836001600160a01b03161480610a3c57506001600160a01b0380841660009081526002602090815260408083209389168352929052205460ff165b80610a6057506001600160a01b038516610a5587610958565b6001600160a01b0316145b8015610a735750610a7182826138b3565b155b9695505050505050565b6005546040516303a24d0760e21b8152600481018390526060916001600160a01b031690630e89341c90602401600060405180830381865afa158015610ac7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108c99190810190615857565b81610afa8133611782565b610b205760405163168ab55d60e31b81526004810182905233602482015260440161088a565b8260106000610b2e836108cf565b5091505063ffffffff8282161615610b5c5760405163a2a7201360e01b81526004810184905260240161088a565b6040517f14ab90380000000000000000000000000000000000000000000000000000000081526004810187905267ffffffffffffffff861660248201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906314ab9038906044015b600060405180830381600087803b158015610be857600080fd5b505af1158015610bfc573d6000803e3d6000fd5b50505050505050505050565b6000336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610c6c576040517f1931a53800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000808080610c7d868801886158cf565b83516020850120939750919550935091508890808214610cd3576040517fc65c3ccc000000000000000000000000000000000000000000000000000000008152600481018290526024810183905260440161088a565b604051630a3b53db60e21b8152600481018390523060248201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906328ed4f6c90604401600060405180830381600087803b158015610d3b57600080fd5b505af1158015610d4f573d6000803e3d6000fd5b5050604051636b727d4360e11b8152600481018d9052600092506276a70091506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063d6e4fa8690602401602060405180830381865afa158015610dc0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610de49190615937565b610dee9190615966565b9050610e0187878761ffff1684886138e4565b50630a85bd0160e11b9c9b505050505050505050505050565b610e22613a4a565b6005805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b81610e5c8133611782565b610e825760405163168ab55d60e31b81526004810182905233602482015260440161088a565b8260086000610e90836108cf565b5091505063ffffffff8282161615610ebe5760405163a2a7201360e01b81526004810184905260240161088a565b604051630c4b7b8560e11b8152600481018790526001600160a01b0386811660248301527f00000000000000000000000000000000000000000000000000000000000000001690631896f70a90604401610bce565b60066020526000908152604090208054610f2c9061598e565b80601f0160208091040260200160405190810160405280929190818152602001828054610f589061598e565b8015610fa55780601f10610f7a57610100808354040283529160200191610fa5565b820191906000526020600020905b815481529060010190602001808311610f8857829003601f168201915b505050505081565b600087610fba8133611782565b610fe05760405163168ab55d60e31b81526004810182905233602482015260440161088a565b875160208901206110188a82604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b92506110248a84613aa4565b61102e8386613be3565b6110398a848b613c16565b506110468a848787613ce3565b935061105183613d29565b611107576040516305ef2c7f60e41b8152600481018b9052602481018290523060448201526001600160a01b03888116606483015267ffffffffffffffff881660848301527f00000000000000000000000000000000000000000000000000000000000000001690635ef2c7f09060a401600060405180830381600087803b1580156110dc57600080fd5b505af11580156110f0573d6000803e3d6000fd5b505050506111028a848b8b8989613de2565b6111b4565b6040516305ef2c7f60e41b8152600481018b9052602481018290523060448201526001600160a01b03888116606483015267ffffffffffffffff881660848301527f00000000000000000000000000000000000000000000000000000000000000001690635ef2c7f09060a401600060405180830381600087803b15801561118e57600080fd5b505af11580156111a2573d6000803e3d6000fd5b505050506111b48a848b8b8989613e19565b5050979650505050505050565b81518351146112385760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060448201527f6d69736d61746368000000000000000000000000000000000000000000000000606482015260840161088a565b6001600160a01b03841661129c5760405162461bcd60e51b815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b606482015260840161088a565b6001600160a01b0385163314806112d657506001600160a01b038516600090815260026020908152604080832033845290915290205460ff165b6113485760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f742060448201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000606482015260840161088a565b60005b835181101561147e576000848281518110611368576113686159c8565b602002602001015190506000848381518110611386576113866159c8565b60200260200101519050600080600061139e856108cf565b9250925092506113af858383613edd565b8360011480156113d057508a6001600160a01b0316836001600160a01b0316145b61142f5760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201526939103a3930b739b332b960b11b606482015260840161088a565b60008581526001602052604090206001600160a01b038b1663ffffffff60a01b60a085901b16176001600160c01b031960c084901b16179055505050505080611477906159de565b905061134b565b50836001600160a01b0316856001600160a01b0316336001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb86866040516114ce9291906159f7565b60405180910390a46114e4338686868686613fd7565b5050505050565b6040805160208082018790528183018690528251808303840181526060909201909252805191012061151d8184613be3565b6000808061152a846108cf565b919450925090506001600160a01b03831615806115d957506040516302571be360e01b81526004810185905230906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906302571be390602401602060405180830381865afa1580156115a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115cd9190615a25565b6001600160a01b031614155b156115f757604051635374b59960e01b815260040160405180910390fd5b6000806116038a6108cf565b90935091508a9050611644576116198633611782565b61163f5760405163168ab55d60e31b81526004810187905233602482015260440161088a565b611674565b61164e8a33611782565b6116745760405163168ab55d60e31b8152600481018b905233602482015260440161088a565b61167f86898461417c565b61168a8784836141b7565b9650620100008416158015906116ae57508363ffffffff1688851763ffffffff1614155b156116cf5760405163a2a7201360e01b81526004810187905260240161088a565b96831796610bfc86868a868b614201565b6000826116ed8133611782565b6117135760405163168ab55d60e31b81526004810182905233602482015260440161088a565b8360026000611721836108cf565b5091505063ffffffff828216161561174f5760405163a2a7201360e01b81526004810184905260240161088a565b6000808061175c8a6108cf565b9250925092506117758a84848c61ffff16178485614201565b5098975050505050505050565b6000808080611790866108cf565b925092509250846001600160a01b0316836001600160a01b03161480610a6057506001600160a01b0380841660009081526002602090815260408083209389168352929052205460ff16610a60565b606081518351146118585760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e67746860448201527f206d69736d617463680000000000000000000000000000000000000000000000606482015260840161088a565b6000835167ffffffffffffffff81111561187457611874614fa1565b60405190808252806020026020018201604052801561189d578160200160208202803683370190505b50905060005b8451811015611915576118e88582815181106118c1576118c16159c8565b60200260200101518583815181106118db576118db6159c8565b6020026020010151610810565b8282815181106118fa576118fa6159c8565b602090810291909101015261190e816159de565b90506118a3565b509392505050565b611925613a4a565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301526024820183905284169063a9059cbb906044016020604051808303816000875af115801561198d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119b19190615a42565b50505050565b60006108c9826142ab565b604080516020808201869052818301859052825180830384018152606090920190925280519101206000906119f681613d29565b611a1357604051635374b59960e01b815260040160405180910390fd5b6000611a1f86336109e3565b905080158015611a365750611a348233611782565b155b15611a5d5760405163168ab55d60e31b81526004810183905233602482015260440161088a565b60008080611a6a856108cf565b92509250925083158015611a815750620400008216155b15611aa25760405163a2a7201360e01b81526004810186905260240161088a565b6000611aad8a6108cf565b92505050611abc8883836141b7565b9750611aca8685858b6142c1565b60405167ffffffffffffffff8916815286907ff675815a0817338f93a7da433f6bd5f5542f1029b11b455191ac96c7f6a9b1329060200160405180910390a2509598975050505050505050565b611b1f613a4a565b611b296000614309565b565b604080517f93cdeb708b7545dc668eb9280176169d1c33cfd8ed6f04690a0bcc88a93fc4ae60208083019190915281830186905282518083038401815260609092019092528051910120611b7f8133611782565b611ba55760405163168ab55d60e31b81526004810182905233602482015260440161088a565b306001600160a01b03841603611bd957604051632ca49b0d60e11b81526001600160a01b038416600482015260240161088a565b604080517f93cdeb708b7545dc668eb9280176169d1c33cfd8ed6f04690a0bcc88a93fc4ae60208083019190915281830187905282518083038401815260609092019092528051910120611c2e905b83614366565b6040517f42842e0e0000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b038481166024830152604482018690527f000000000000000000000000000000000000000000000000000000000000000016906342842e0e90606401600060405180830381600087803b158015611cb757600080fd5b505af1158015611ccb573d6000803e3d6000fd5b5050505050505050565b6000808686604051611ce8929190615a5f565b6040519081900381206331a9108f60e11b82526004820181905291506000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690636352211e90602401602060405180830381865afa158015611d58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d7c9190615a25565b90506001600160a01b0381163314801590611e24575060405163e985e9c560e01b81526001600160a01b0382811660048301523360248301527f0000000000000000000000000000000000000000000000000000000000000000169063e985e9c590604401602060405180830381865afa158015611dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e229190615a42565b155b15611e9457604080517f93cdeb708b7545dc668eb9280176169d1c33cfd8ed6f04690a0bcc88a93fc4ae6020808301919091528183018590528251808303840181526060830193849052805191012063168ab55d60e31b909252606481019190915233608482015260a40161088a565b6040517f23b872dd0000000000000000000000000000000000000000000000000000000081526001600160a01b038281166004830152306024830152604482018490527f000000000000000000000000000000000000000000000000000000000000000016906323b872dd90606401600060405180830381600087803b158015611f1d57600080fd5b505af1158015611f31573d6000803e3d6000fd5b5050604051630a3b53db60e21b8152600481018590523060248201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031692506328ed4f6c9150604401600060405180830381600087803b158015611f9d57600080fd5b505af1158015611fb1573d6000803e3d6000fd5b5050604051636b727d4360e11b8152600481018590526276a70092507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316915063d6e4fa8690602401602060405180830381865afa15801561201f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120439190615937565b61204d9190615966565b925061209688888080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508a9250505061ffff881686886138e4565b505095945050505050565b6001600160a01b038216330361211f5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c2073746174757360448201527f20666f722073656c660000000000000000000000000000000000000000000000606482015260840161088a565b3360008181526002602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b3360009081526004602052604081205460ff166121fb5760405162461bcd60e51b815260206004820152602860248201527f436f6e74726f6c6c61626c653a2043616c6c6572206973206e6f74206120636f604482015267373a3937b63632b960c11b606482015260840161088a565b6000878760405161220d929190615a5f565b6040519081900381207ffca247ac000000000000000000000000000000000000000000000000000000008252600482018190523060248301526044820187905291507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063fca247ac906064016020604051808303816000875af11580156122a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122c69190615937565b915061231b88888080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508a9250505061ffff86166123156276a70087615966565b886138e4565b509695505050505050565b600080612332846108cf565b50841663ffffffff908116908516149250505092915050565b612353613a4a565b6007546001600160a01b0316156124735760075460405163a22cb46560e01b81526001600160a01b039182166004820152600060248201527f00000000000000000000000000000000000000000000000000000000000000009091169063a22cb46590604401600060405180830381600087803b1580156123d357600080fd5b505af11580156123e7573d6000803e3d6000fd5b505060075460405163a22cb46560e01b81526001600160a01b039182166004820152600060248201527f0000000000000000000000000000000000000000000000000000000000000000909116925063a22cb4659150604401600060405180830381600087803b15801561245a57600080fd5b505af115801561246e573d6000803e3d6000fd5b505050505b6007805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038316908117909155156125ad5760075460405163a22cb46560e01b81526001600160a01b039182166004820152600160248201527f00000000000000000000000000000000000000000000000000000000000000009091169063a22cb46590604401600060405180830381600087803b15801561251257600080fd5b505af1158015612526573d6000803e3d6000fd5b505060075460405163a22cb46560e01b81526001600160a01b039182166004820152600160248201527f0000000000000000000000000000000000000000000000000000000000000000909116925063a22cb4659150604401600060405180830381600087803b15801561259957600080fd5b505af11580156114e4573d6000803e3d6000fd5b50565b3360009081526004602052604081205460ff166126205760405162461bcd60e51b815260206004820152602860248201527f436f6e74726f6c6c61626c653a2043616c6c6572206973206e6f74206120636f604482015267373a3937b63632b960c11b606482015260840161088a565b604080517f93cdeb708b7545dc668eb9280176169d1c33cfd8ed6f04690a0bcc88a93fc4ae602080830191909152818301869052825180830384018152606090920190925280519101206000906040517fc475abff00000000000000000000000000000000000000000000000000000000815260048101869052602481018590529091506000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063c475abff906044016020604051808303816000875af11580156126fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061271e9190615937565b6040516331a9108f60e11b8152600481018790529091507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690636352211e90602401602060405180830381865afa9250505080156127a2575060408051601f3d908101601f1916820190925261279f91810190615a25565b60015b6127af5791506108c99050565b6001600160a01b0381163014158061285957506040516302571be360e01b81526004810184905230906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906302571be390602401602060405180830381865afa158015612829573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061284d9190615a25565b6001600160a01b031614155b15612868575091506108c99050565b5060006128786276a70083615966565b60008481526001602052604090205490915060a081901c61289b858383866142c1565b50919695505050505050565b6000866128b48133611782565b6128da5760405163168ab55d60e31b81526004810182905233602482015260440161088a565b600087876040516128ec929190615a5f565b604051809103902090506129278982604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b92506129338984613aa4565b61293d8386613be3565b60006129808a858b8b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250613c1692505050565b905061298e8a858888613ce3565b945061299984613d29565b612a61576040517f06ab5923000000000000000000000000000000000000000000000000000000008152600481018b9052602481018390523060448201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906306ab5923906064016020604051808303816000875af1158015612a2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a4e9190615937565b50612a5c8482898989614458565b612aa7565b612aa78a858b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508d92508c91508b9050613e19565b5050509695505050505050565b6000612afa600086868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505061449a9050565b6007549091506001600160a01b0316612b3f576040517f24c1d6d400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612b498133611782565b612b6f5760405163168ab55d60e31b81526004810182905233602482015260440161088a565b60008080612b7c846108cf565b919450925090506000612b8e85610958565b9050612b9985614559565b600760009054906101000a90046001600160a01b03166001600160a01b0316639198c2768a8a878787878e8e6040518963ffffffff1660e01b8152600401612be8989796959493929190615a98565b600060405180830381600087803b158015612c0257600080fd5b505af1158015612c16573d6000803e3d6000fd5b50505050505050505050505050565b83612c308133611782565b612c565760405163168ab55d60e31b81526004810182905233602482015260440161088a565b84601c6000612c64836108cf565b5091505063ffffffff8282161615612c925760405163a2a7201360e01b81526004810184905260240161088a565b6040517fcf408823000000000000000000000000000000000000000000000000000000008152600481018990523060248201526001600160a01b03878116604483015267ffffffffffffffff871660648301527f0000000000000000000000000000000000000000000000000000000000000000169063cf40882390608401600060405180830381600087803b158015612d2b57600080fd5b505af1158015612d3f573d6000803e3d6000fd5b5050506001600160a01b0388169050612da6576000612d5d896108cf565b509150506201ffff1962020000821601612d9557604051632ca49b0d60e11b81526001600160a01b038916600482015260240161088a565b612da0896000614366565b50611ccb565b6000612db1896119b7565b9050612dd381898b60001c600160405180602001604052806000815250614628565b505050505050505050565b60408051602080820186905281830185905282518083038401815260609092019092528051910120612e108133611782565b612e365760405163168ab55d60e31b81526004810182905233602482015260440161088a565b7f6c32148f748aba23997146d7fe89e962e3cc30271290fb96f5f4337756c03b528401612e765760405163615a470360e01b815260040160405180910390fd5b6001600160a01b0382161580612e9457506001600160a01b03821630145b15612ebd57604051632ca49b0d60e11b81526001600160a01b038316600482015260240161088a565b604080516020808201879052818301869052825180830384018152606090920190925280519101206119b190611c28565b604080516020808201859052818301849052825180830384018152606090920190925280519101206000906000612f2482613d29565b90507f93cdeb708b7545dc668eb9280176169d1c33cfd8ed6f04690a0bcc88a93fc4ae8514612f565791506108c99050565b6040516331a9108f60e11b8152600481018590527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690636352211e90602401602060405180830381865afa925050508015612fd7575060408051601f3d908101601f19168201909252612fd491810190615a25565b60015b612fe6576000925050506108c9565b6001600160a01b0316301492506108c9915050565b613003613a4a565b6001600160a01b038216600081815260046020908152604091829020805460ff191685151590811790915591519182527f4c97694570a07277810af7e5669ffd5f6a2d6b74b6e9a274b8b870fd5114cf8791015b60405180910390a25050565b6000806130aa600087878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505061477a9050565b9150915060006130f38288888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505061449a9050565b60408051602080820184905281830187905282518083038401815260609092019092528051910120909150600090600081815260066020526040902090915061313d888a83615b47565b507f6c32148f748aba23997146d7fe89e962e3cc30271290fb96f5f4337756c03b52820161317e5760405163615a470360e01b815260040160405180910390fd5b6040516302571be360e01b8152600481018290526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906302571be390602401602060405180830381865afa1580156131e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061320a9190615a25565b90506001600160a01b03811633148015906132b2575060405163e985e9c560e01b81526001600160a01b0382811660048301523360248301527f0000000000000000000000000000000000000000000000000000000000000000169063e985e9c590604401602060405180830381865afa15801561328c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132b09190615a42565b155b156132d95760405163168ab55d60e31b81526004810183905233602482015260440161088a565b6001600160a01b0386161561336b57604051630c4b7b8560e11b8152600481018390526001600160a01b0387811660248301527f00000000000000000000000000000000000000000000000000000000000000001690631896f70a90604401600060405180830381600087803b15801561335257600080fd5b505af1158015613366573d6000803e3d6000fd5b505050505b604051635b0fc9c360e01b8152600481018390523060248201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635b0fc9c390604401600060405180830381600087803b1580156133d357600080fd5b505af11580156133e7573d6000803e3d6000fd5b50505050612dd3828a8a8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052508d93509150819050614458565b6001600160a01b0384166134925760405162461bcd60e51b815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b606482015260840161088a565b6001600160a01b0385163314806134cc57506001600160a01b038516600090815260026020908152604080832033845290915290205460ff165b61353e5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201527f20617070726f7665640000000000000000000000000000000000000000000000606482015260840161088a565b6114e48585858585614628565b613553613a4a565b6001600160a01b0381166135cf5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161088a565b6125ad81614309565b600081815260066020526040812080548291906135f49061598e565b80601f01602080910402602001604051908101604052809291908181526020018280546136209061598e565b801561366d5780601f106136425761010080835404028352916020019161366d565b820191906000526020600020905b81548152906001019060200180831161365057829003601f168201915b5050505050905080516000036136865750600092915050565b600080613693838261477a565b909250905060006136a4848361449a565b9050610a738184612eee565b600080428367ffffffffffffffff1610156136de5761ffff19620100008516016136d957600094505b600093505b50929391925050565b60006001600160e01b031982167fd9b67a2600000000000000000000000000000000000000000000000000000000148061373157506001600160e01b031982166303a24d0760e21b145b806108c957507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b03198316146108c9565b6000613774826119b7565b9050806001600160a01b0316836001600160a01b0316036137fd5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f7200000000000000000000000000000000000000000000000000000000000000606482015260840161088a565b336001600160a01b038216148061383757506001600160a01b038116600090815260026020908152604080832033845290915290205460ff165b6138a95760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000606482015260840161088a565b6109de8383614831565b6000620200008381161480156109965750426138d26276a70084615c07565b67ffffffffffffffff16109392505050565b84516020860120600061393e7f93cdeb708b7545dc668eb9280176169d1c33cfd8ed6f04690a0bcc88a93fc4ae83604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b90506000613981886040518060400160405280600581526020017f03657468000000000000000000000000000000000000000000000000000000008152506148ac565b600083815260066020526040902090915061399c8282615c28565b506139af828289620300008a1789614458565b6001600160a01b03841615611ccb57604051630c4b7b8560e11b8152600481018390526001600160a01b0385811660248301527f00000000000000000000000000000000000000000000000000000000000000001690631896f70a90604401600060405180830381600087803b158015613a2857600080fd5b505af1158015613a3c573d6000803e3d6000fd5b505050505050505050505050565b6000546001600160a01b03163314611b295760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161088a565b60008080613ab1846108cf565b919450925090504267ffffffffffffffff821610808015613b7557506001600160a01b0384161580613b7557506040516302571be360e01b8152600481018690526000906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906302571be390602401602060405180830381865afa158015613b46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b6a9190615a25565b6001600160a01b0316145b15613bb4576000613b85876108cf565b509150506020811615613bae5760405163a2a7201360e01b81526004810187905260240161088a565b50613bdb565b62010000831615613bdb5760405163a2a7201360e01b81526004810186905260240161088a565b505050505050565b63fffdffff81811763ffffffff1614613c125760405163a2a7201360e01b81526004810183905260240161088a565b5050565b60606000613cbf83600660008881526020019081526020016000208054613c3c9061598e565b80601f0160208091040260200160405190810160405280929190818152602001828054613c689061598e565b8015613cb55780601f10613c8a57610100808354040283529160200191613cb5565b820191906000526020600020905b815481529060010190602001808311613c9857829003601f168201915b50505050506148ac565b6000858152600660205260409020909150613cda8282615c28565b50949350505050565b600080613cef856108cf565b92505050600080613d028860001c6108cf565b9250925050613d1287878461417c565b613d1d8584836141b7565b98975050505050505050565b600080613d35836119b7565b6001600160a01b0316141580156108c957506040516302571be360e01b81526004810183905230906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906302571be390602401602060405180830381865afa158015613dae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613dd29190615a25565b6001600160a01b03161492915050565b60008681526006602052604081208054613e01918791613c3c9061598e565b9050613e108682868686614458565b50505050505050565b60008080613e26886108cf565b9250925092506000613e5088600660008d81526020019081526020016000208054613c3c9061598e565b60008a8152600660205260409020805491925090613e6d9061598e565b9050600003613e90576000898152600660205260409020613e8e8282615c28565b505b613e9f89858886178589614201565b6001600160a01b038716613ebd57613eb8896000614366565b610bfc565b610bfc84888b60001c600160405180602001604052806000815250614628565b6201ffff1962020000831601613efd57613efa6276a70082615c07565b90505b428167ffffffffffffffff161015613f7a5762010000821615613f755760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201526939103a3930b739b332b960b11b606482015260840161088a565b613f9f565b6004821615613f9f5760405163a2a7201360e01b81526004810184905260240161088a565b604082166000036109de5750506000908152600360205260409020805473ffffffffffffffffffffffffffffffffffffffff19169055565b6001600160a01b0384163b15613bdb5760405163bc197c8160e01b81526001600160a01b0385169063bc197c819061401b9089908990889088908890600401615ce8565b6020604051808303816000875af1925050508015614056575060408051601f3d908101601f1916820190925261405391810190615d3a565b60015b61410b57614062615d57565b806308c379a00361409b5750614076615d73565b80614081575061409d565b8060405162461bcd60e51b815260040161088a9190614e3c565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e204552433131353560448201527f526563656976657220696d706c656d656e746572000000000000000000000000606482015260840161088a565b6001600160e01b0319811663bc197c8160e01b14613e105760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a656374656044820152676420746f6b656e7360c01b606482015260840161088a565b63ffff000082161580159060018316159082906141965750805b156114e45760405163a2a7201360e01b81526004810186905260240161088a565b60008167ffffffffffffffff168467ffffffffffffffff1611156141d9578193505b8267ffffffffffffffff168467ffffffffffffffff1610156141f9578293505b509192915050565b61420d858585846142c1565b60405163ffffffff8416815285907f39873f00c80f4f94b7bd1594aebcf650f003545b74824d57ddf4939e3ff3a34b9060200160405180910390a28167ffffffffffffffff168167ffffffffffffffff1611156114e45760405167ffffffffffffffff8216815285907ff675815a0817338f93a7da433f6bd5f5542f1029b11b455191ac96c7f6a9b132906020015b60405180910390a25050505050565b6000806142b7836108cf565b5090949350505050565b6142cb8483614955565b60008481526001602052604090206001600160a01b03841663ffffffff60a01b60a085901b16176001600160c01b031960c084901b161790556119b1565b600080546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b614371826001612326565b156143925760405163a2a7201360e01b81526004810183905260240161088a565b61439b82614559565b604051635b0fc9c360e01b8152600481018390526001600160a01b0382811660248301527f00000000000000000000000000000000000000000000000000000000000000001690635b0fc9c390604401600060405180830381600087803b15801561440557600080fd5b505af1158015614419573d6000803e3d6000fd5b50506040516001600160a01b03841681528492507fee2ba1195c65bcf218a83d874335c6bf9d9067b4c672f3c3bf16cf40de7586c49150602001613057565b6144648584848461498e565b847f8ce7013e8abebc55c3890a68f5a27c67c3f7efa64e584de5fb22363c606fd3408585858560405161429c9493929190615dfd565b60008060006144a9858561477a565b90925090508161451b57600185516144c19190615e45565b841461450f5760405162461bcd60e51b815260206004820152601d60248201527f6e616d65686173683a204a756e6b20617420656e64206f66206e616d65000000604482015260640161088a565b50600091506108c99050565b614525858261449a565b6040805160208101929092528101839052606001604051602081830303815290604052805190602001209250505092915050565b60008181526001602052604090205460a081901c60c082901c61457d8383836136b0565b6000868152600360209081526040808320805473ffffffffffffffffffffffffffffffffffffffff191690556001909152902063ffffffff60a01b60a083901b166001600160c01b031960c086901b1617905592506145d99050565b60408051858152600160208201526000916001600160a01b0386169133917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a450505050565b6000806000614636866108cf565b925092509250614647868383613edd565b8460011480156146685750876001600160a01b0316836001600160a01b0316145b6146c75760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201526939103a3930b739b332b960b11b606482015260840161088a565b866001600160a01b0316836001600160a01b0316036146e8575050506114e4565b60008681526001602052604090206001600160a01b03881663ffffffff60a01b60a085901b16176001600160c01b031960c084901b1617905560408051878152602081018790526001600160a01b03808a1692908b169133917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611ccb338989898989614a02565b600080835183106147cd5760405162461bcd60e51b815260206004820152601e60248201527f726561644c6162656c3a20496e646578206f7574206f6620626f756e64730000604482015260640161088a565b60008484815181106147e1576147e16159c8565b016020015160f81c9050801561480d5761480685614800866001615e58565b83614afe565b9250614812565b600092505b61481c8185615e58565b614827906001615e58565b9150509250929050565b6000818152600360205260409020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0384169081179091558190614873826119b7565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60606001835110156148ea576040517f280dacb600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60ff8351111561492857826040517fe3ba295f00000000000000000000000000000000000000000000000000000000815260040161088a9190614e3c565b8251838360405160200161493e93929190615e6b565b604051602081830303815290604052905092915050565b61ffff81161580159061496d57506201000181811614155b15613c125760405163a2a7201360e01b81526004810183905260240161088a565b6149988483614955565b6000848152600160205260409020546001600160a01b038116156149f6576149bf85614559565b6040516000815285907fee2ba1195c65bcf218a83d874335c6bf9d9067b4c672f3c3bf16cf40de7586c49060200160405180910390a25b6114e485858585614b22565b6001600160a01b0384163b15613bdb5760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190614a469089908990889088908890600401615ecc565b6020604051808303816000875af1925050508015614a81575060408051601f3d908101601f19168201909252614a7e91810190615d3a565b60015b614a8d57614062615d57565b6001600160e01b0319811663f23a6e6160e01b14613e105760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a656374656044820152676420746f6b656e7360c01b606482015260840161088a565b8251600090614b0d8385615e58565b1115614b1857600080fd5b5091016020012090565b8360008080614b30846108cf565b9194509250905063ffff0000821667ffffffffffffffff8087169083161115614b57578195505b428267ffffffffffffffff1610614b6d57958617955b6001600160a01b03841615614bc45760405162461bcd60e51b815260206004820152601f60248201527f455243313135353a206d696e74206f66206578697374696e6720746f6b656e00604482015260640161088a565b6001600160a01b038816614c405760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f2061646472657360448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161088a565b306001600160a01b03891603614cbe5760405162461bcd60e51b815260206004820152603460248201527f455243313135353a206e65774f776e65722063616e6e6f74206265207468652060448201527f4e616d655772617070657220636f6e7472616374000000000000000000000000606482015260840161088a565b60008581526001602052604090206001600160a01b03891663ffffffff60a01b60a08a901b16176001600160c01b031960c089901b1617905560408051868152600160208201526001600160a01b038a169160009133917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4612dd33360008a88600160405180602001604052806000815250614a02565b6001600160a01b03811681146125ad57600080fd5b60008060408385031215614d8757600080fd5b8235614d9281614d5f565b946020939093013593505050565b600060208284031215614db257600080fd5b5035919050565b6001600160e01b0319811681146125ad57600080fd5b600060208284031215614de157600080fd5b813561099681614db9565b60005b83811015614e07578181015183820152602001614def565b50506000910152565b60008151808452614e28816020860160208601614dec565b601f01601f19169290920160200192915050565b6020815260006109966020830184614e10565b60008060408385031215614e6257600080fd5b823591506020830135614e7481614d5f565b809150509250929050565b803567ffffffffffffffff81168114614e9757600080fd5b919050565b60008060408385031215614eaf57600080fd5b82359150614ebf60208401614e7f565b90509250929050565b60008083601f840112614eda57600080fd5b50813567ffffffffffffffff811115614ef257600080fd5b602083019150836020828501011115614f0a57600080fd5b9250929050565b600080600080600060808688031215614f2957600080fd5b8535614f3481614d5f565b94506020860135614f4481614d5f565b935060408601359250606086013567ffffffffffffffff811115614f6757600080fd5b614f7388828901614ec8565b969995985093965092949392505050565b600060208284031215614f9657600080fd5b813561099681614d5f565b634e487b7160e01b600052604160045260246000fd5b601f8201601f1916810167ffffffffffffffff81118282101715614fdd57614fdd614fa1565b6040525050565b600067ffffffffffffffff821115614ffe57614ffe614fa1565b50601f01601f191660200190565b600082601f83011261501d57600080fd5b813561502881614fe4565b6040516150358282614fb7565b82815285602084870101111561504a57600080fd5b82602086016020830137600092810160200192909252509392505050565b803563ffffffff81168114614e9757600080fd5b600080600080600080600060e0888a03121561509757600080fd5b87359650602088013567ffffffffffffffff8111156150b557600080fd5b6150c18a828b0161500c565b96505060408801356150d281614d5f565b945060608801356150e281614d5f565b93506150f060808901614e7f565b92506150fe60a08901615068565b915061510c60c08901614e7f565b905092959891949750929550565b600067ffffffffffffffff82111561513457615134614fa1565b5060051b60200190565b600082601f83011261514f57600080fd5b8135602061515c8261511a565b6040516151698282614fb7565b83815260059390931b850182019282810191508684111561518957600080fd5b8286015b8481101561231b578035835291830191830161518d565b600080600080600060a086880312156151bc57600080fd5b85356151c781614d5f565b945060208601356151d781614d5f565b9350604086013567ffffffffffffffff808211156151f457600080fd5b61520089838a0161513e565b9450606088013591508082111561521657600080fd5b61522289838a0161513e565b9350608088013591508082111561523857600080fd5b506152458882890161500c565b9150509295509295909350565b6000806000806080858703121561526857600080fd5b843593506020850135925061527f60408601615068565b915061528d60608601614e7f565b905092959194509250565b803561ffff81168114614e9757600080fd5b600080604083850312156152bd57600080fd5b82359150614ebf60208401615298565b600080604083850312156152e057600080fd5b823567ffffffffffffffff808211156152f857600080fd5b818501915085601f83011261530c57600080fd5b813560206153198261511a565b6040516153268282614fb7565b83815260059390931b850182019282810191508984111561534657600080fd5b948201945b8386101561536d57853561535e81614d5f565b8252948201949082019061534b565b9650508601359250508082111561538357600080fd5b506148278582860161513e565b600081518084526020808501945080840160005b838110156153c0578151875295820195908201906001016153a4565b509495945050505050565b6020815260006109966020830184615390565b6000806000606084860312156153f357600080fd5b83356153fe81614d5f565b9250602084013561540e81614d5f565b929592945050506040919091013590565b60008060006060848603121561543457600080fd5b833592506020840135915061544b60408501614e7f565b90509250925092565b60008060006060848603121561546957600080fd5b83359250602084013561547b81614d5f565b9150604084013561548b81614d5f565b809150509250925092565b6000806000806000608086880312156154ae57600080fd5b853567ffffffffffffffff8111156154c557600080fd5b6154d188828901614ec8565b90965094505060208601356154e581614d5f565b92506154f360408701615298565b9150606086013561550381614d5f565b809150509295509295909350565b80151581146125ad57600080fd5b6000806040838503121561553257600080fd5b823561553d81614d5f565b91506020830135614e7481615511565b60008060008060008060a0878903121561556657600080fd5b863567ffffffffffffffff81111561557d57600080fd5b61558989828a01614ec8565b909750955050602087013561559d81614d5f565b93506040870135925060608701356155b481614d5f565b91506155c260808801615298565b90509295509295509295565b600080604083850312156155e157600080fd5b82359150614ebf60208401615068565b6000806040838503121561560457600080fd5b50508035926020909101359150565b60008060008060008060a0878903121561562c57600080fd5b86359550602087013567ffffffffffffffff81111561564a57600080fd5b61565689828a01614ec8565b909650945050604087013561566a81614d5f565b925061567860608801615068565b91506155c260808801614e7f565b6000806000806040858703121561569c57600080fd5b843567ffffffffffffffff808211156156b457600080fd5b6156c088838901614ec8565b909650945060208701359150808211156156d957600080fd5b506156e687828801614ec8565b95989497509550505050565b6000806000806080858703121561570857600080fd5b84359350602085013561571a81614d5f565b9250604085013561527f81614d5f565b60008060006060848603121561573f57600080fd5b8335925060208401359150604084013561548b81614d5f565b6000806040838503121561576b57600080fd5b823561577681614d5f565b91506020830135614e7481614d5f565b6000806000806060858703121561579c57600080fd5b843567ffffffffffffffff8111156157b357600080fd5b6157bf87828801614ec8565b90955093505060208501356157d381614d5f565b915060408501356157e381614d5f565b939692955090935050565b600080600080600060a0868803121561580657600080fd5b853561581181614d5f565b9450602086013561582181614d5f565b93506040860135925060608601359150608086013567ffffffffffffffff81111561584b57600080fd5b6152458882890161500c565b60006020828403121561586957600080fd5b815167ffffffffffffffff81111561588057600080fd5b8201601f8101841361589157600080fd5b805161589c81614fe4565b6040516158a98282614fb7565b8281528660208486010111156158be57600080fd5b610a73836020830160208701614dec565b600080600080608085870312156158e557600080fd5b843567ffffffffffffffff8111156158fc57600080fd5b6159088782880161500c565b945050602085013561591981614d5f565b925061592760408601615298565b915060608501356157e381614d5f565b60006020828403121561594957600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b67ffffffffffffffff81811683821601908082111561598757615987615950565b5092915050565b600181811c908216806159a257607f821691505b6020821081036159c257634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b6000600182016159f0576159f0615950565b5060010190565b604081526000615a0a6040830185615390565b8281036020840152615a1c8185615390565b95945050505050565b600060208284031215615a3757600080fd5b815161099681614d5f565b600060208284031215615a5457600080fd5b815161099681615511565b8183823760009101908152919050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60c081526000615aac60c083018a8c615a6f565b6001600160a01b03898116602085015263ffffffff8916604085015267ffffffffffffffff881660608501528616608084015282810360a0840152615af2818587615a6f565b9b9a5050505050505050505050565b601f8211156109de57600081815260208120601f850160051c81016020861015615b285750805b601f850160051c820191505b81811015613bdb57828155600101615b34565b67ffffffffffffffff831115615b5f57615b5f614fa1565b615b7383615b6d835461598e565b83615b01565b6000601f841160018114615ba75760008515615b8f5750838201355b600019600387901b1c1916600186901b1783556114e4565b600083815260209020601f19861690835b82811015615bd85786850135825560209485019460019092019101615bb8565b5086821015615bf55760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b67ffffffffffffffff82811682821603908082111561598757615987615950565b815167ffffffffffffffff811115615c4257615c42614fa1565b615c5681615c50845461598e565b84615b01565b602080601f831160018114615c8b5760008415615c735750858301515b600019600386901b1c1916600185901b178555613bdb565b600085815260208120601f198616915b82811015615cba57888601518255948401946001909101908401615c9b565b5085821015615cd85787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006001600160a01b03808816835280871660208401525060a06040830152615d1460a0830186615390565b8281036060840152615d268186615390565b90508281036080840152613d1d8185614e10565b600060208284031215615d4c57600080fd5b815161099681614db9565b600060033d1115615d705760046000803e5060005160e01c5b90565b600060443d1015615d815790565b6040516003193d81016004833e81513d67ffffffffffffffff8160248401118184111715615db157505050505090565b8285019150815181811115615dc95750505050505090565b843d8701016020828501011115615de35750505050505090565b615df260208286010187614fb7565b509095945050505050565b608081526000615e106080830187614e10565b6001600160a01b039590951660208301525063ffffffff92909216604083015267ffffffffffffffff16606090910152919050565b818103818111156108c9576108c9615950565b808201808211156108c9576108c9615950565b7fff000000000000000000000000000000000000000000000000000000000000008460f81b16815260008351615ea8816001850160208801614dec565b835190830190615ebf816001840160208801614dec565b0160010195945050505050565b60006001600160a01b03808816835280871660208401525084604083015283606083015260a06080830152615f0460a0830184614e10565b97965050505050505056fea26469706673582212203420d6b763d82b1b590fea45d804e16953e66816411da10be7022bec2bfbbe2064736f6c6343000811003300000000000000000000000000000000000c2e074ec69a0dfb2997ba6c7d2e1e00000000000000000000000057f1887a8bf19b14fc0df6fd9b2acc9af147ea850000000000000000000000006a455690af4c1581934ff810da146249f8e676ed

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061031f5760003560e01c80636352211e116101a7578063c93ab3fd116100ee578063e985e9c511610097578063f242432a11610071578063f242432a146107d7578063f2fde38b146107ea578063fd0cd0d9146107fd57600080fd5b8063e985e9c514610768578063eb8ae530146107a4578063ed70554d146107b757600080fd5b8063d9a50c12116100c8578063d9a50c121461071f578063da8c229e14610732578063e0dba60f1461075557600080fd5b8063c93ab3fd146106e6578063cf408823146106f9578063d8c9921a1461070c57600080fd5b8063a22cb46511610150578063b6bcad261161012a578063b6bcad26146106ad578063c475abff146106c0578063c658e086146106d357600080fd5b8063a22cb46514610674578063a401498214610687578063adf4960a1461069a57600080fd5b80638b4dfa75116101815780638b4dfa751461063d5780638cf8b41e146106505780638da5cb5b1461066357600080fd5b80636352211e146105f65780636e5d6ad214610609578063715018a61461063557600080fd5b80631f4e15041161026b5780633f15457f116102145780634e1273f4116101ee5780634e1273f4146105b057806353095467146105d05780635d3590d5146105e357600080fd5b80633f15457f1461054e578063402906fc1461057557806341415eab1461059d57600080fd5b80632b20e397116102455780632b20e397146105015780632eb2c2d61461052857806333c69ea91461053b57600080fd5b80631f4e1504146104c857806320c38e2b146104db57806324c1af44146104ee57600080fd5b80630e4cd725116102cd578063150b7a02116102a7578063150b7a02146104765780631534e177146104a25780631896f70a146104b557600080fd5b80630e4cd7251461043d5780630e89341c1461045057806314ab90381461046357600080fd5b806306fdde03116102fe57806306fdde03146103b4578063081812fc146103fd578063095ea7b31461042857600080fd5b8062fdd58e146103245780630178fe3f1461034a57806301ffc9a714610391575b600080fd5b610337610332366004614d74565b610810565b6040519081526020015b60405180910390f35b61035d610358366004614da0565b6108cf565b604080516001600160a01b03909416845263ffffffff909216602084015267ffffffffffffffff1690820152606001610341565b6103a461039f366004614dcf565b6108ff565b6040519015158152602001610341565b6103f06040518060400160405280600b81526020017f4e616d655772617070657200000000000000000000000000000000000000000081525081565b6040516103419190614e3c565b61041061040b366004614da0565b610958565b6040516001600160a01b039091168152602001610341565b61043b610436366004614d74565b61099d565b005b6103a461044b366004614e4f565b6109e3565b6103f061045e366004614da0565b610a7d565b61043b610471366004614e9c565b610aef565b610489610484366004614f11565b610c08565b6040516001600160e01b03199091168152602001610341565b61043b6104b0366004614f84565b610e1a565b61043b6104c3366004614e4f565b610e51565b600754610410906001600160a01b031681565b6103f06104e9366004614da0565b610f13565b6103376104fc36600461507c565b610fad565b6104107f00000000000000000000000057f1887a8bf19b14fc0df6fd9b2acc9af147ea8581565b61043b6105363660046151a4565b6111c1565b61043b610549366004615252565b6114eb565b6104107f00000000000000000000000000000000000c2e074ec69a0dfb2997ba6c7d2e1e81565b6105886105833660046152aa565b6116e0565b60405163ffffffff9091168152602001610341565b6103a46105ab366004614e4f565b611782565b6105c36105be3660046152cd565b6117df565b60405161034191906153cb565b600554610410906001600160a01b031681565b61043b6105f13660046153de565b61191d565b610410610604366004614da0565b6119b7565b61061c61061736600461541f565b6119c2565b60405167ffffffffffffffff9091168152602001610341565b61043b611b17565b61043b61064b366004615454565b611b2b565b61061c61065e366004615496565b611cd5565b6000546001600160a01b0316610410565b61043b61068236600461551f565b6120a1565b61033761069536600461554d565b61218b565b6103a46106a83660046155ce565b612326565b61043b6106bb366004614f84565b61234b565b6103376106ce3660046155f1565b6125b0565b6103376106e1366004615613565b6128a7565b61043b6106f4366004615686565b612ab4565b61043b6107073660046156f2565b612c25565b61043b61071a36600461572a565b612dde565b6103a461072d3660046155f1565b612eee565b6103a4610740366004614f84565b60046020526000908152604090205460ff1681565b61043b61076336600461551f565b612ffb565b6103a4610776366004615758565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205460ff1690565b61043b6107b2366004615786565b613063565b6103376107c5366004614da0565b60016020526000908152604090205481565b61043b6107e53660046157ee565b61342e565b61043b6107f8366004614f84565b61354b565b6103a461080b366004614da0565b6135d8565b60006001600160a01b0383166108935760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201527f65726f206164647265737300000000000000000000000000000000000000000060648201526084015b60405180910390fd5b600061089e836119b7565b9050836001600160a01b0316816001600160a01b0316036108c35760019150506108c9565b60009150505b92915050565b60008181526001602052604090205460a081901c60c082901c6108f38383836136b0565b90959094509092509050565b60006001600160e01b031982167fd82c42d800000000000000000000000000000000000000000000000000000000148061094957506001600160e01b03198216630a85bd0160e11b145b806108c957506108c9826136e7565b600080610964836119b7565b90506001600160a01b03811661097d5750600092915050565b6000838152600360205260409020546001600160a01b03165b9392505050565b60006109a8826108cf565b50915050603f1960408216016109d45760405163a2a7201360e01b81526004810183905260240161088a565b6109de8383613769565b505050565b60008080806109f1866108cf565b925092509250846001600160a01b0316836001600160a01b03161480610a3c57506001600160a01b0380841660009081526002602090815260408083209389168352929052205460ff165b80610a6057506001600160a01b038516610a5587610958565b6001600160a01b0316145b8015610a735750610a7182826138b3565b155b9695505050505050565b6005546040516303a24d0760e21b8152600481018390526060916001600160a01b031690630e89341c90602401600060405180830381865afa158015610ac7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108c99190810190615857565b81610afa8133611782565b610b205760405163168ab55d60e31b81526004810182905233602482015260440161088a565b8260106000610b2e836108cf565b5091505063ffffffff8282161615610b5c5760405163a2a7201360e01b81526004810184905260240161088a565b6040517f14ab90380000000000000000000000000000000000000000000000000000000081526004810187905267ffffffffffffffff861660248201527f00000000000000000000000000000000000c2e074ec69a0dfb2997ba6c7d2e1e6001600160a01b0316906314ab9038906044015b600060405180830381600087803b158015610be857600080fd5b505af1158015610bfc573d6000803e3d6000fd5b50505050505050505050565b6000336001600160a01b037f00000000000000000000000057f1887a8bf19b14fc0df6fd9b2acc9af147ea851614610c6c576040517f1931a53800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000808080610c7d868801886158cf565b83516020850120939750919550935091508890808214610cd3576040517fc65c3ccc000000000000000000000000000000000000000000000000000000008152600481018290526024810183905260440161088a565b604051630a3b53db60e21b8152600481018390523060248201527f00000000000000000000000057f1887a8bf19b14fc0df6fd9b2acc9af147ea856001600160a01b0316906328ed4f6c90604401600060405180830381600087803b158015610d3b57600080fd5b505af1158015610d4f573d6000803e3d6000fd5b5050604051636b727d4360e11b8152600481018d9052600092506276a70091506001600160a01b037f00000000000000000000000057f1887a8bf19b14fc0df6fd9b2acc9af147ea85169063d6e4fa8690602401602060405180830381865afa158015610dc0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610de49190615937565b610dee9190615966565b9050610e0187878761ffff1684886138e4565b50630a85bd0160e11b9c9b505050505050505050505050565b610e22613a4a565b6005805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b81610e5c8133611782565b610e825760405163168ab55d60e31b81526004810182905233602482015260440161088a565b8260086000610e90836108cf565b5091505063ffffffff8282161615610ebe5760405163a2a7201360e01b81526004810184905260240161088a565b604051630c4b7b8560e11b8152600481018790526001600160a01b0386811660248301527f00000000000000000000000000000000000c2e074ec69a0dfb2997ba6c7d2e1e1690631896f70a90604401610bce565b60066020526000908152604090208054610f2c9061598e565b80601f0160208091040260200160405190810160405280929190818152602001828054610f589061598e565b8015610fa55780601f10610f7a57610100808354040283529160200191610fa5565b820191906000526020600020905b815481529060010190602001808311610f8857829003601f168201915b505050505081565b600087610fba8133611782565b610fe05760405163168ab55d60e31b81526004810182905233602482015260440161088a565b875160208901206110188a82604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b92506110248a84613aa4565b61102e8386613be3565b6110398a848b613c16565b506110468a848787613ce3565b935061105183613d29565b611107576040516305ef2c7f60e41b8152600481018b9052602481018290523060448201526001600160a01b03888116606483015267ffffffffffffffff881660848301527f00000000000000000000000000000000000c2e074ec69a0dfb2997ba6c7d2e1e1690635ef2c7f09060a401600060405180830381600087803b1580156110dc57600080fd5b505af11580156110f0573d6000803e3d6000fd5b505050506111028a848b8b8989613de2565b6111b4565b6040516305ef2c7f60e41b8152600481018b9052602481018290523060448201526001600160a01b03888116606483015267ffffffffffffffff881660848301527f00000000000000000000000000000000000c2e074ec69a0dfb2997ba6c7d2e1e1690635ef2c7f09060a401600060405180830381600087803b15801561118e57600080fd5b505af11580156111a2573d6000803e3d6000fd5b505050506111b48a848b8b8989613e19565b5050979650505050505050565b81518351146112385760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060448201527f6d69736d61746368000000000000000000000000000000000000000000000000606482015260840161088a565b6001600160a01b03841661129c5760405162461bcd60e51b815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b606482015260840161088a565b6001600160a01b0385163314806112d657506001600160a01b038516600090815260026020908152604080832033845290915290205460ff165b6113485760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f742060448201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000606482015260840161088a565b60005b835181101561147e576000848281518110611368576113686159c8565b602002602001015190506000848381518110611386576113866159c8565b60200260200101519050600080600061139e856108cf565b9250925092506113af858383613edd565b8360011480156113d057508a6001600160a01b0316836001600160a01b0316145b61142f5760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201526939103a3930b739b332b960b11b606482015260840161088a565b60008581526001602052604090206001600160a01b038b1663ffffffff60a01b60a085901b16176001600160c01b031960c084901b16179055505050505080611477906159de565b905061134b565b50836001600160a01b0316856001600160a01b0316336001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb86866040516114ce9291906159f7565b60405180910390a46114e4338686868686613fd7565b5050505050565b6040805160208082018790528183018690528251808303840181526060909201909252805191012061151d8184613be3565b6000808061152a846108cf565b919450925090506001600160a01b03831615806115d957506040516302571be360e01b81526004810185905230906001600160a01b037f00000000000000000000000000000000000c2e074ec69a0dfb2997ba6c7d2e1e16906302571be390602401602060405180830381865afa1580156115a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115cd9190615a25565b6001600160a01b031614155b156115f757604051635374b59960e01b815260040160405180910390fd5b6000806116038a6108cf565b90935091508a9050611644576116198633611782565b61163f5760405163168ab55d60e31b81526004810187905233602482015260440161088a565b611674565b61164e8a33611782565b6116745760405163168ab55d60e31b8152600481018b905233602482015260440161088a565b61167f86898461417c565b61168a8784836141b7565b9650620100008416158015906116ae57508363ffffffff1688851763ffffffff1614155b156116cf5760405163a2a7201360e01b81526004810187905260240161088a565b96831796610bfc86868a868b614201565b6000826116ed8133611782565b6117135760405163168ab55d60e31b81526004810182905233602482015260440161088a565b8360026000611721836108cf565b5091505063ffffffff828216161561174f5760405163a2a7201360e01b81526004810184905260240161088a565b6000808061175c8a6108cf565b9250925092506117758a84848c61ffff16178485614201565b5098975050505050505050565b6000808080611790866108cf565b925092509250846001600160a01b0316836001600160a01b03161480610a6057506001600160a01b0380841660009081526002602090815260408083209389168352929052205460ff16610a60565b606081518351146118585760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e67746860448201527f206d69736d617463680000000000000000000000000000000000000000000000606482015260840161088a565b6000835167ffffffffffffffff81111561187457611874614fa1565b60405190808252806020026020018201604052801561189d578160200160208202803683370190505b50905060005b8451811015611915576118e88582815181106118c1576118c16159c8565b60200260200101518583815181106118db576118db6159c8565b6020026020010151610810565b8282815181106118fa576118fa6159c8565b602090810291909101015261190e816159de565b90506118a3565b509392505050565b611925613a4a565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301526024820183905284169063a9059cbb906044016020604051808303816000875af115801561198d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119b19190615a42565b50505050565b60006108c9826142ab565b604080516020808201869052818301859052825180830384018152606090920190925280519101206000906119f681613d29565b611a1357604051635374b59960e01b815260040160405180910390fd5b6000611a1f86336109e3565b905080158015611a365750611a348233611782565b155b15611a5d5760405163168ab55d60e31b81526004810183905233602482015260440161088a565b60008080611a6a856108cf565b92509250925083158015611a815750620400008216155b15611aa25760405163a2a7201360e01b81526004810186905260240161088a565b6000611aad8a6108cf565b92505050611abc8883836141b7565b9750611aca8685858b6142c1565b60405167ffffffffffffffff8916815286907ff675815a0817338f93a7da433f6bd5f5542f1029b11b455191ac96c7f6a9b1329060200160405180910390a2509598975050505050505050565b611b1f613a4a565b611b296000614309565b565b604080517f93cdeb708b7545dc668eb9280176169d1c33cfd8ed6f04690a0bcc88a93fc4ae60208083019190915281830186905282518083038401815260609092019092528051910120611b7f8133611782565b611ba55760405163168ab55d60e31b81526004810182905233602482015260440161088a565b306001600160a01b03841603611bd957604051632ca49b0d60e11b81526001600160a01b038416600482015260240161088a565b604080517f93cdeb708b7545dc668eb9280176169d1c33cfd8ed6f04690a0bcc88a93fc4ae60208083019190915281830187905282518083038401815260609092019092528051910120611c2e905b83614366565b6040517f42842e0e0000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b038481166024830152604482018690527f00000000000000000000000057f1887a8bf19b14fc0df6fd9b2acc9af147ea8516906342842e0e90606401600060405180830381600087803b158015611cb757600080fd5b505af1158015611ccb573d6000803e3d6000fd5b5050505050505050565b6000808686604051611ce8929190615a5f565b6040519081900381206331a9108f60e11b82526004820181905291506000907f00000000000000000000000057f1887a8bf19b14fc0df6fd9b2acc9af147ea856001600160a01b031690636352211e90602401602060405180830381865afa158015611d58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d7c9190615a25565b90506001600160a01b0381163314801590611e24575060405163e985e9c560e01b81526001600160a01b0382811660048301523360248301527f00000000000000000000000057f1887a8bf19b14fc0df6fd9b2acc9af147ea85169063e985e9c590604401602060405180830381865afa158015611dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e229190615a42565b155b15611e9457604080517f93cdeb708b7545dc668eb9280176169d1c33cfd8ed6f04690a0bcc88a93fc4ae6020808301919091528183018590528251808303840181526060830193849052805191012063168ab55d60e31b909252606481019190915233608482015260a40161088a565b6040517f23b872dd0000000000000000000000000000000000000000000000000000000081526001600160a01b038281166004830152306024830152604482018490527f00000000000000000000000057f1887a8bf19b14fc0df6fd9b2acc9af147ea8516906323b872dd90606401600060405180830381600087803b158015611f1d57600080fd5b505af1158015611f31573d6000803e3d6000fd5b5050604051630a3b53db60e21b8152600481018590523060248201527f00000000000000000000000057f1887a8bf19b14fc0df6fd9b2acc9af147ea856001600160a01b031692506328ed4f6c9150604401600060405180830381600087803b158015611f9d57600080fd5b505af1158015611fb1573d6000803e3d6000fd5b5050604051636b727d4360e11b8152600481018590526276a70092507f00000000000000000000000057f1887a8bf19b14fc0df6fd9b2acc9af147ea856001600160a01b0316915063d6e4fa8690602401602060405180830381865afa15801561201f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120439190615937565b61204d9190615966565b925061209688888080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508a9250505061ffff881686886138e4565b505095945050505050565b6001600160a01b038216330361211f5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c2073746174757360448201527f20666f722073656c660000000000000000000000000000000000000000000000606482015260840161088a565b3360008181526002602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b3360009081526004602052604081205460ff166121fb5760405162461bcd60e51b815260206004820152602860248201527f436f6e74726f6c6c61626c653a2043616c6c6572206973206e6f74206120636f604482015267373a3937b63632b960c11b606482015260840161088a565b6000878760405161220d929190615a5f565b6040519081900381207ffca247ac000000000000000000000000000000000000000000000000000000008252600482018190523060248301526044820187905291507f00000000000000000000000057f1887a8bf19b14fc0df6fd9b2acc9af147ea856001600160a01b03169063fca247ac906064016020604051808303816000875af11580156122a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122c69190615937565b915061231b88888080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508a9250505061ffff86166123156276a70087615966565b886138e4565b509695505050505050565b600080612332846108cf565b50841663ffffffff908116908516149250505092915050565b612353613a4a565b6007546001600160a01b0316156124735760075460405163a22cb46560e01b81526001600160a01b039182166004820152600060248201527f00000000000000000000000057f1887a8bf19b14fc0df6fd9b2acc9af147ea859091169063a22cb46590604401600060405180830381600087803b1580156123d357600080fd5b505af11580156123e7573d6000803e3d6000fd5b505060075460405163a22cb46560e01b81526001600160a01b039182166004820152600060248201527f00000000000000000000000000000000000c2e074ec69a0dfb2997ba6c7d2e1e909116925063a22cb4659150604401600060405180830381600087803b15801561245a57600080fd5b505af115801561246e573d6000803e3d6000fd5b505050505b6007805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038316908117909155156125ad5760075460405163a22cb46560e01b81526001600160a01b039182166004820152600160248201527f00000000000000000000000057f1887a8bf19b14fc0df6fd9b2acc9af147ea859091169063a22cb46590604401600060405180830381600087803b15801561251257600080fd5b505af1158015612526573d6000803e3d6000fd5b505060075460405163a22cb46560e01b81526001600160a01b039182166004820152600160248201527f00000000000000000000000000000000000c2e074ec69a0dfb2997ba6c7d2e1e909116925063a22cb4659150604401600060405180830381600087803b15801561259957600080fd5b505af11580156114e4573d6000803e3d6000fd5b50565b3360009081526004602052604081205460ff166126205760405162461bcd60e51b815260206004820152602860248201527f436f6e74726f6c6c61626c653a2043616c6c6572206973206e6f74206120636f604482015267373a3937b63632b960c11b606482015260840161088a565b604080517f93cdeb708b7545dc668eb9280176169d1c33cfd8ed6f04690a0bcc88a93fc4ae602080830191909152818301869052825180830384018152606090920190925280519101206000906040517fc475abff00000000000000000000000000000000000000000000000000000000815260048101869052602481018590529091506000906001600160a01b037f00000000000000000000000057f1887a8bf19b14fc0df6fd9b2acc9af147ea85169063c475abff906044016020604051808303816000875af11580156126fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061271e9190615937565b6040516331a9108f60e11b8152600481018790529091507f00000000000000000000000057f1887a8bf19b14fc0df6fd9b2acc9af147ea856001600160a01b031690636352211e90602401602060405180830381865afa9250505080156127a2575060408051601f3d908101601f1916820190925261279f91810190615a25565b60015b6127af5791506108c99050565b6001600160a01b0381163014158061285957506040516302571be360e01b81526004810184905230906001600160a01b037f00000000000000000000000000000000000c2e074ec69a0dfb2997ba6c7d2e1e16906302571be390602401602060405180830381865afa158015612829573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061284d9190615a25565b6001600160a01b031614155b15612868575091506108c99050565b5060006128786276a70083615966565b60008481526001602052604090205490915060a081901c61289b858383866142c1565b50919695505050505050565b6000866128b48133611782565b6128da5760405163168ab55d60e31b81526004810182905233602482015260440161088a565b600087876040516128ec929190615a5f565b604051809103902090506129278982604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b92506129338984613aa4565b61293d8386613be3565b60006129808a858b8b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250613c1692505050565b905061298e8a858888613ce3565b945061299984613d29565b612a61576040517f06ab5923000000000000000000000000000000000000000000000000000000008152600481018b9052602481018390523060448201527f00000000000000000000000000000000000c2e074ec69a0dfb2997ba6c7d2e1e6001600160a01b0316906306ab5923906064016020604051808303816000875af1158015612a2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a4e9190615937565b50612a5c8482898989614458565b612aa7565b612aa78a858b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508d92508c91508b9050613e19565b5050509695505050505050565b6000612afa600086868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505061449a9050565b6007549091506001600160a01b0316612b3f576040517f24c1d6d400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612b498133611782565b612b6f5760405163168ab55d60e31b81526004810182905233602482015260440161088a565b60008080612b7c846108cf565b919450925090506000612b8e85610958565b9050612b9985614559565b600760009054906101000a90046001600160a01b03166001600160a01b0316639198c2768a8a878787878e8e6040518963ffffffff1660e01b8152600401612be8989796959493929190615a98565b600060405180830381600087803b158015612c0257600080fd5b505af1158015612c16573d6000803e3d6000fd5b50505050505050505050505050565b83612c308133611782565b612c565760405163168ab55d60e31b81526004810182905233602482015260440161088a565b84601c6000612c64836108cf565b5091505063ffffffff8282161615612c925760405163a2a7201360e01b81526004810184905260240161088a565b6040517fcf408823000000000000000000000000000000000000000000000000000000008152600481018990523060248201526001600160a01b03878116604483015267ffffffffffffffff871660648301527f00000000000000000000000000000000000c2e074ec69a0dfb2997ba6c7d2e1e169063cf40882390608401600060405180830381600087803b158015612d2b57600080fd5b505af1158015612d3f573d6000803e3d6000fd5b5050506001600160a01b0388169050612da6576000612d5d896108cf565b509150506201ffff1962020000821601612d9557604051632ca49b0d60e11b81526001600160a01b038916600482015260240161088a565b612da0896000614366565b50611ccb565b6000612db1896119b7565b9050612dd381898b60001c600160405180602001604052806000815250614628565b505050505050505050565b60408051602080820186905281830185905282518083038401815260609092019092528051910120612e108133611782565b612e365760405163168ab55d60e31b81526004810182905233602482015260440161088a565b7f6c32148f748aba23997146d7fe89e962e3cc30271290fb96f5f4337756c03b528401612e765760405163615a470360e01b815260040160405180910390fd5b6001600160a01b0382161580612e9457506001600160a01b03821630145b15612ebd57604051632ca49b0d60e11b81526001600160a01b038316600482015260240161088a565b604080516020808201879052818301869052825180830384018152606090920190925280519101206119b190611c28565b604080516020808201859052818301849052825180830384018152606090920190925280519101206000906000612f2482613d29565b90507f93cdeb708b7545dc668eb9280176169d1c33cfd8ed6f04690a0bcc88a93fc4ae8514612f565791506108c99050565b6040516331a9108f60e11b8152600481018590527f00000000000000000000000057f1887a8bf19b14fc0df6fd9b2acc9af147ea856001600160a01b031690636352211e90602401602060405180830381865afa925050508015612fd7575060408051601f3d908101601f19168201909252612fd491810190615a25565b60015b612fe6576000925050506108c9565b6001600160a01b0316301492506108c9915050565b613003613a4a565b6001600160a01b038216600081815260046020908152604091829020805460ff191685151590811790915591519182527f4c97694570a07277810af7e5669ffd5f6a2d6b74b6e9a274b8b870fd5114cf8791015b60405180910390a25050565b6000806130aa600087878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505061477a9050565b9150915060006130f38288888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505061449a9050565b60408051602080820184905281830187905282518083038401815260609092019092528051910120909150600090600081815260066020526040902090915061313d888a83615b47565b507f6c32148f748aba23997146d7fe89e962e3cc30271290fb96f5f4337756c03b52820161317e5760405163615a470360e01b815260040160405180910390fd5b6040516302571be360e01b8152600481018290526000907f00000000000000000000000000000000000c2e074ec69a0dfb2997ba6c7d2e1e6001600160a01b0316906302571be390602401602060405180830381865afa1580156131e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061320a9190615a25565b90506001600160a01b03811633148015906132b2575060405163e985e9c560e01b81526001600160a01b0382811660048301523360248301527f00000000000000000000000000000000000c2e074ec69a0dfb2997ba6c7d2e1e169063e985e9c590604401602060405180830381865afa15801561328c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132b09190615a42565b155b156132d95760405163168ab55d60e31b81526004810183905233602482015260440161088a565b6001600160a01b0386161561336b57604051630c4b7b8560e11b8152600481018390526001600160a01b0387811660248301527f00000000000000000000000000000000000c2e074ec69a0dfb2997ba6c7d2e1e1690631896f70a90604401600060405180830381600087803b15801561335257600080fd5b505af1158015613366573d6000803e3d6000fd5b505050505b604051635b0fc9c360e01b8152600481018390523060248201527f00000000000000000000000000000000000c2e074ec69a0dfb2997ba6c7d2e1e6001600160a01b031690635b0fc9c390604401600060405180830381600087803b1580156133d357600080fd5b505af11580156133e7573d6000803e3d6000fd5b50505050612dd3828a8a8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052508d93509150819050614458565b6001600160a01b0384166134925760405162461bcd60e51b815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b606482015260840161088a565b6001600160a01b0385163314806134cc57506001600160a01b038516600090815260026020908152604080832033845290915290205460ff165b61353e5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201527f20617070726f7665640000000000000000000000000000000000000000000000606482015260840161088a565b6114e48585858585614628565b613553613a4a565b6001600160a01b0381166135cf5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161088a565b6125ad81614309565b600081815260066020526040812080548291906135f49061598e565b80601f01602080910402602001604051908101604052809291908181526020018280546136209061598e565b801561366d5780601f106136425761010080835404028352916020019161366d565b820191906000526020600020905b81548152906001019060200180831161365057829003601f168201915b5050505050905080516000036136865750600092915050565b600080613693838261477a565b909250905060006136a4848361449a565b9050610a738184612eee565b600080428367ffffffffffffffff1610156136de5761ffff19620100008516016136d957600094505b600093505b50929391925050565b60006001600160e01b031982167fd9b67a2600000000000000000000000000000000000000000000000000000000148061373157506001600160e01b031982166303a24d0760e21b145b806108c957507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b03198316146108c9565b6000613774826119b7565b9050806001600160a01b0316836001600160a01b0316036137fd5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f7200000000000000000000000000000000000000000000000000000000000000606482015260840161088a565b336001600160a01b038216148061383757506001600160a01b038116600090815260026020908152604080832033845290915290205460ff165b6138a95760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000606482015260840161088a565b6109de8383614831565b6000620200008381161480156109965750426138d26276a70084615c07565b67ffffffffffffffff16109392505050565b84516020860120600061393e7f93cdeb708b7545dc668eb9280176169d1c33cfd8ed6f04690a0bcc88a93fc4ae83604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b90506000613981886040518060400160405280600581526020017f03657468000000000000000000000000000000000000000000000000000000008152506148ac565b600083815260066020526040902090915061399c8282615c28565b506139af828289620300008a1789614458565b6001600160a01b03841615611ccb57604051630c4b7b8560e11b8152600481018390526001600160a01b0385811660248301527f00000000000000000000000000000000000c2e074ec69a0dfb2997ba6c7d2e1e1690631896f70a90604401600060405180830381600087803b158015613a2857600080fd5b505af1158015613a3c573d6000803e3d6000fd5b505050505050505050505050565b6000546001600160a01b03163314611b295760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161088a565b60008080613ab1846108cf565b919450925090504267ffffffffffffffff821610808015613b7557506001600160a01b0384161580613b7557506040516302571be360e01b8152600481018690526000906001600160a01b037f00000000000000000000000000000000000c2e074ec69a0dfb2997ba6c7d2e1e16906302571be390602401602060405180830381865afa158015613b46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b6a9190615a25565b6001600160a01b0316145b15613bb4576000613b85876108cf565b509150506020811615613bae5760405163a2a7201360e01b81526004810187905260240161088a565b50613bdb565b62010000831615613bdb5760405163a2a7201360e01b81526004810186905260240161088a565b505050505050565b63fffdffff81811763ffffffff1614613c125760405163a2a7201360e01b81526004810183905260240161088a565b5050565b60606000613cbf83600660008881526020019081526020016000208054613c3c9061598e565b80601f0160208091040260200160405190810160405280929190818152602001828054613c689061598e565b8015613cb55780601f10613c8a57610100808354040283529160200191613cb5565b820191906000526020600020905b815481529060010190602001808311613c9857829003601f168201915b50505050506148ac565b6000858152600660205260409020909150613cda8282615c28565b50949350505050565b600080613cef856108cf565b92505050600080613d028860001c6108cf565b9250925050613d1287878461417c565b613d1d8584836141b7565b98975050505050505050565b600080613d35836119b7565b6001600160a01b0316141580156108c957506040516302571be360e01b81526004810183905230906001600160a01b037f00000000000000000000000000000000000c2e074ec69a0dfb2997ba6c7d2e1e16906302571be390602401602060405180830381865afa158015613dae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613dd29190615a25565b6001600160a01b03161492915050565b60008681526006602052604081208054613e01918791613c3c9061598e565b9050613e108682868686614458565b50505050505050565b60008080613e26886108cf565b9250925092506000613e5088600660008d81526020019081526020016000208054613c3c9061598e565b60008a8152600660205260409020805491925090613e6d9061598e565b9050600003613e90576000898152600660205260409020613e8e8282615c28565b505b613e9f89858886178589614201565b6001600160a01b038716613ebd57613eb8896000614366565b610bfc565b610bfc84888b60001c600160405180602001604052806000815250614628565b6201ffff1962020000831601613efd57613efa6276a70082615c07565b90505b428167ffffffffffffffff161015613f7a5762010000821615613f755760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201526939103a3930b739b332b960b11b606482015260840161088a565b613f9f565b6004821615613f9f5760405163a2a7201360e01b81526004810184905260240161088a565b604082166000036109de5750506000908152600360205260409020805473ffffffffffffffffffffffffffffffffffffffff19169055565b6001600160a01b0384163b15613bdb5760405163bc197c8160e01b81526001600160a01b0385169063bc197c819061401b9089908990889088908890600401615ce8565b6020604051808303816000875af1925050508015614056575060408051601f3d908101601f1916820190925261405391810190615d3a565b60015b61410b57614062615d57565b806308c379a00361409b5750614076615d73565b80614081575061409d565b8060405162461bcd60e51b815260040161088a9190614e3c565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e204552433131353560448201527f526563656976657220696d706c656d656e746572000000000000000000000000606482015260840161088a565b6001600160e01b0319811663bc197c8160e01b14613e105760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a656374656044820152676420746f6b656e7360c01b606482015260840161088a565b63ffff000082161580159060018316159082906141965750805b156114e45760405163a2a7201360e01b81526004810186905260240161088a565b60008167ffffffffffffffff168467ffffffffffffffff1611156141d9578193505b8267ffffffffffffffff168467ffffffffffffffff1610156141f9578293505b509192915050565b61420d858585846142c1565b60405163ffffffff8416815285907f39873f00c80f4f94b7bd1594aebcf650f003545b74824d57ddf4939e3ff3a34b9060200160405180910390a28167ffffffffffffffff168167ffffffffffffffff1611156114e45760405167ffffffffffffffff8216815285907ff675815a0817338f93a7da433f6bd5f5542f1029b11b455191ac96c7f6a9b132906020015b60405180910390a25050505050565b6000806142b7836108cf565b5090949350505050565b6142cb8483614955565b60008481526001602052604090206001600160a01b03841663ffffffff60a01b60a085901b16176001600160c01b031960c084901b161790556119b1565b600080546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b614371826001612326565b156143925760405163a2a7201360e01b81526004810183905260240161088a565b61439b82614559565b604051635b0fc9c360e01b8152600481018390526001600160a01b0382811660248301527f00000000000000000000000000000000000c2e074ec69a0dfb2997ba6c7d2e1e1690635b0fc9c390604401600060405180830381600087803b15801561440557600080fd5b505af1158015614419573d6000803e3d6000fd5b50506040516001600160a01b03841681528492507fee2ba1195c65bcf218a83d874335c6bf9d9067b4c672f3c3bf16cf40de7586c49150602001613057565b6144648584848461498e565b847f8ce7013e8abebc55c3890a68f5a27c67c3f7efa64e584de5fb22363c606fd3408585858560405161429c9493929190615dfd565b60008060006144a9858561477a565b90925090508161451b57600185516144c19190615e45565b841461450f5760405162461bcd60e51b815260206004820152601d60248201527f6e616d65686173683a204a756e6b20617420656e64206f66206e616d65000000604482015260640161088a565b50600091506108c99050565b614525858261449a565b6040805160208101929092528101839052606001604051602081830303815290604052805190602001209250505092915050565b60008181526001602052604090205460a081901c60c082901c61457d8383836136b0565b6000868152600360209081526040808320805473ffffffffffffffffffffffffffffffffffffffff191690556001909152902063ffffffff60a01b60a083901b166001600160c01b031960c086901b1617905592506145d99050565b60408051858152600160208201526000916001600160a01b0386169133917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a450505050565b6000806000614636866108cf565b925092509250614647868383613edd565b8460011480156146685750876001600160a01b0316836001600160a01b0316145b6146c75760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201526939103a3930b739b332b960b11b606482015260840161088a565b866001600160a01b0316836001600160a01b0316036146e8575050506114e4565b60008681526001602052604090206001600160a01b03881663ffffffff60a01b60a085901b16176001600160c01b031960c084901b1617905560408051878152602081018790526001600160a01b03808a1692908b169133917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611ccb338989898989614a02565b600080835183106147cd5760405162461bcd60e51b815260206004820152601e60248201527f726561644c6162656c3a20496e646578206f7574206f6620626f756e64730000604482015260640161088a565b60008484815181106147e1576147e16159c8565b016020015160f81c9050801561480d5761480685614800866001615e58565b83614afe565b9250614812565b600092505b61481c8185615e58565b614827906001615e58565b9150509250929050565b6000818152600360205260409020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0384169081179091558190614873826119b7565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60606001835110156148ea576040517f280dacb600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60ff8351111561492857826040517fe3ba295f00000000000000000000000000000000000000000000000000000000815260040161088a9190614e3c565b8251838360405160200161493e93929190615e6b565b604051602081830303815290604052905092915050565b61ffff81161580159061496d57506201000181811614155b15613c125760405163a2a7201360e01b81526004810183905260240161088a565b6149988483614955565b6000848152600160205260409020546001600160a01b038116156149f6576149bf85614559565b6040516000815285907fee2ba1195c65bcf218a83d874335c6bf9d9067b4c672f3c3bf16cf40de7586c49060200160405180910390a25b6114e485858585614b22565b6001600160a01b0384163b15613bdb5760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190614a469089908990889088908890600401615ecc565b6020604051808303816000875af1925050508015614a81575060408051601f3d908101601f19168201909252614a7e91810190615d3a565b60015b614a8d57614062615d57565b6001600160e01b0319811663f23a6e6160e01b14613e105760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a656374656044820152676420746f6b656e7360c01b606482015260840161088a565b8251600090614b0d8385615e58565b1115614b1857600080fd5b5091016020012090565b8360008080614b30846108cf565b9194509250905063ffff0000821667ffffffffffffffff8087169083161115614b57578195505b428267ffffffffffffffff1610614b6d57958617955b6001600160a01b03841615614bc45760405162461bcd60e51b815260206004820152601f60248201527f455243313135353a206d696e74206f66206578697374696e6720746f6b656e00604482015260640161088a565b6001600160a01b038816614c405760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f2061646472657360448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161088a565b306001600160a01b03891603614cbe5760405162461bcd60e51b815260206004820152603460248201527f455243313135353a206e65774f776e65722063616e6e6f74206265207468652060448201527f4e616d655772617070657220636f6e7472616374000000000000000000000000606482015260840161088a565b60008581526001602052604090206001600160a01b03891663ffffffff60a01b60a08a901b16176001600160c01b031960c089901b1617905560408051868152600160208201526001600160a01b038a169160009133917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4612dd33360008a88600160405180602001604052806000815250614a02565b6001600160a01b03811681146125ad57600080fd5b60008060408385031215614d8757600080fd5b8235614d9281614d5f565b946020939093013593505050565b600060208284031215614db257600080fd5b5035919050565b6001600160e01b0319811681146125ad57600080fd5b600060208284031215614de157600080fd5b813561099681614db9565b60005b83811015614e07578181015183820152602001614def565b50506000910152565b60008151808452614e28816020860160208601614dec565b601f01601f19169290920160200192915050565b6020815260006109966020830184614e10565b60008060408385031215614e6257600080fd5b823591506020830135614e7481614d5f565b809150509250929050565b803567ffffffffffffffff81168114614e9757600080fd5b919050565b60008060408385031215614eaf57600080fd5b82359150614ebf60208401614e7f565b90509250929050565b60008083601f840112614eda57600080fd5b50813567ffffffffffffffff811115614ef257600080fd5b602083019150836020828501011115614f0a57600080fd5b9250929050565b600080600080600060808688031215614f2957600080fd5b8535614f3481614d5f565b94506020860135614f4481614d5f565b935060408601359250606086013567ffffffffffffffff811115614f6757600080fd5b614f7388828901614ec8565b969995985093965092949392505050565b600060208284031215614f9657600080fd5b813561099681614d5f565b634e487b7160e01b600052604160045260246000fd5b601f8201601f1916810167ffffffffffffffff81118282101715614fdd57614fdd614fa1565b6040525050565b600067ffffffffffffffff821115614ffe57614ffe614fa1565b50601f01601f191660200190565b600082601f83011261501d57600080fd5b813561502881614fe4565b6040516150358282614fb7565b82815285602084870101111561504a57600080fd5b82602086016020830137600092810160200192909252509392505050565b803563ffffffff81168114614e9757600080fd5b600080600080600080600060e0888a03121561509757600080fd5b87359650602088013567ffffffffffffffff8111156150b557600080fd5b6150c18a828b0161500c565b96505060408801356150d281614d5f565b945060608801356150e281614d5f565b93506150f060808901614e7f565b92506150fe60a08901615068565b915061510c60c08901614e7f565b905092959891949750929550565b600067ffffffffffffffff82111561513457615134614fa1565b5060051b60200190565b600082601f83011261514f57600080fd5b8135602061515c8261511a565b6040516151698282614fb7565b83815260059390931b850182019282810191508684111561518957600080fd5b8286015b8481101561231b578035835291830191830161518d565b600080600080600060a086880312156151bc57600080fd5b85356151c781614d5f565b945060208601356151d781614d5f565b9350604086013567ffffffffffffffff808211156151f457600080fd5b61520089838a0161513e565b9450606088013591508082111561521657600080fd5b61522289838a0161513e565b9350608088013591508082111561523857600080fd5b506152458882890161500c565b9150509295509295909350565b6000806000806080858703121561526857600080fd5b843593506020850135925061527f60408601615068565b915061528d60608601614e7f565b905092959194509250565b803561ffff81168114614e9757600080fd5b600080604083850312156152bd57600080fd5b82359150614ebf60208401615298565b600080604083850312156152e057600080fd5b823567ffffffffffffffff808211156152f857600080fd5b818501915085601f83011261530c57600080fd5b813560206153198261511a565b6040516153268282614fb7565b83815260059390931b850182019282810191508984111561534657600080fd5b948201945b8386101561536d57853561535e81614d5f565b8252948201949082019061534b565b9650508601359250508082111561538357600080fd5b506148278582860161513e565b600081518084526020808501945080840160005b838110156153c0578151875295820195908201906001016153a4565b509495945050505050565b6020815260006109966020830184615390565b6000806000606084860312156153f357600080fd5b83356153fe81614d5f565b9250602084013561540e81614d5f565b929592945050506040919091013590565b60008060006060848603121561543457600080fd5b833592506020840135915061544b60408501614e7f565b90509250925092565b60008060006060848603121561546957600080fd5b83359250602084013561547b81614d5f565b9150604084013561548b81614d5f565b809150509250925092565b6000806000806000608086880312156154ae57600080fd5b853567ffffffffffffffff8111156154c557600080fd5b6154d188828901614ec8565b90965094505060208601356154e581614d5f565b92506154f360408701615298565b9150606086013561550381614d5f565b809150509295509295909350565b80151581146125ad57600080fd5b6000806040838503121561553257600080fd5b823561553d81614d5f565b91506020830135614e7481615511565b60008060008060008060a0878903121561556657600080fd5b863567ffffffffffffffff81111561557d57600080fd5b61558989828a01614ec8565b909750955050602087013561559d81614d5f565b93506040870135925060608701356155b481614d5f565b91506155c260808801615298565b90509295509295509295565b600080604083850312156155e157600080fd5b82359150614ebf60208401615068565b6000806040838503121561560457600080fd5b50508035926020909101359150565b60008060008060008060a0878903121561562c57600080fd5b86359550602087013567ffffffffffffffff81111561564a57600080fd5b61565689828a01614ec8565b909650945050604087013561566a81614d5f565b925061567860608801615068565b91506155c260808801614e7f565b6000806000806040858703121561569c57600080fd5b843567ffffffffffffffff808211156156b457600080fd5b6156c088838901614ec8565b909650945060208701359150808211156156d957600080fd5b506156e687828801614ec8565b95989497509550505050565b6000806000806080858703121561570857600080fd5b84359350602085013561571a81614d5f565b9250604085013561527f81614d5f565b60008060006060848603121561573f57600080fd5b8335925060208401359150604084013561548b81614d5f565b6000806040838503121561576b57600080fd5b823561577681614d5f565b91506020830135614e7481614d5f565b6000806000806060858703121561579c57600080fd5b843567ffffffffffffffff8111156157b357600080fd5b6157bf87828801614ec8565b90955093505060208501356157d381614d5f565b915060408501356157e381614d5f565b939692955090935050565b600080600080600060a0868803121561580657600080fd5b853561581181614d5f565b9450602086013561582181614d5f565b93506040860135925060608601359150608086013567ffffffffffffffff81111561584b57600080fd5b6152458882890161500c565b60006020828403121561586957600080fd5b815167ffffffffffffffff81111561588057600080fd5b8201601f8101841361589157600080fd5b805161589c81614fe4565b6040516158a98282614fb7565b8281528660208486010111156158be57600080fd5b610a73836020830160208701614dec565b600080600080608085870312156158e557600080fd5b843567ffffffffffffffff8111156158fc57600080fd5b6159088782880161500c565b945050602085013561591981614d5f565b925061592760408601615298565b915060608501356157e381614d5f565b60006020828403121561594957600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b67ffffffffffffffff81811683821601908082111561598757615987615950565b5092915050565b600181811c908216806159a257607f821691505b6020821081036159c257634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b6000600182016159f0576159f0615950565b5060010190565b604081526000615a0a6040830185615390565b8281036020840152615a1c8185615390565b95945050505050565b600060208284031215615a3757600080fd5b815161099681614d5f565b600060208284031215615a5457600080fd5b815161099681615511565b8183823760009101908152919050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60c081526000615aac60c083018a8c615a6f565b6001600160a01b03898116602085015263ffffffff8916604085015267ffffffffffffffff881660608501528616608084015282810360a0840152615af2818587615a6f565b9b9a5050505050505050505050565b601f8211156109de57600081815260208120601f850160051c81016020861015615b285750805b601f850160051c820191505b81811015613bdb57828155600101615b34565b67ffffffffffffffff831115615b5f57615b5f614fa1565b615b7383615b6d835461598e565b83615b01565b6000601f841160018114615ba75760008515615b8f5750838201355b600019600387901b1c1916600186901b1783556114e4565b600083815260209020601f19861690835b82811015615bd85786850135825560209485019460019092019101615bb8565b5086821015615bf55760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b67ffffffffffffffff82811682821603908082111561598757615987615950565b815167ffffffffffffffff811115615c4257615c42614fa1565b615c5681615c50845461598e565b84615b01565b602080601f831160018114615c8b5760008415615c735750858301515b600019600386901b1c1916600185901b178555613bdb565b600085815260208120601f198616915b82811015615cba57888601518255948401946001909101908401615c9b565b5085821015615cd85787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006001600160a01b03808816835280871660208401525060a06040830152615d1460a0830186615390565b8281036060840152615d268186615390565b90508281036080840152613d1d8185614e10565b600060208284031215615d4c57600080fd5b815161099681614db9565b600060033d1115615d705760046000803e5060005160e01c5b90565b600060443d1015615d815790565b6040516003193d81016004833e81513d67ffffffffffffffff8160248401118184111715615db157505050505090565b8285019150815181811115615dc95750505050505090565b843d8701016020828501011115615de35750505050505090565b615df260208286010187614fb7565b509095945050505050565b608081526000615e106080830187614e10565b6001600160a01b039590951660208301525063ffffffff92909216604083015267ffffffffffffffff16606090910152919050565b818103818111156108c9576108c9615950565b808201808211156108c9576108c9615950565b7fff000000000000000000000000000000000000000000000000000000000000008460f81b16815260008351615ea8816001850160208801614dec565b835190830190615ebf816001840160208801614dec565b0160010195945050505050565b60006001600160a01b03808816835280871660208401525084604083015283606083015260a06080830152615f0460a0830184614e10565b97965050505050505056fea26469706673582212203420d6b763d82b1b590fea45d804e16953e66816411da10be7022bec2bfbbe2064736f6c63430008110033

Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.