Feature Tip: Add private address tag to any address under My Name Tag !
Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 17 from a total of 17 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Safe Mint | 20062953 | 637 days ago | IN | 0 ETH | 0.00300664 | ||||
| Safe Batch Mint | 20062940 | 637 days ago | IN | 0 ETH | 0.00588822 | ||||
| Safe Batch Mint | 20062938 | 637 days ago | IN | 0 ETH | 0.00582189 | ||||
| Revoke Role | 20062899 | 637 days ago | IN | 0 ETH | 0.00042197 | ||||
| Revoke Role | 20062896 | 637 days ago | IN | 0 ETH | 0.00042291 | ||||
| Grant Role | 20062534 | 637 days ago | IN | 0 ETH | 0.0009325 | ||||
| Grant Role | 20062480 | 637 days ago | IN | 0 ETH | 0.00064375 | ||||
| Grant Role | 20062480 | 637 days ago | IN | 0 ETH | 0.00113208 | ||||
| Safe Batch Mint | 17371153 | 1014 days ago | IN | 0 ETH | 0.00764335 | ||||
| Safe Batch Mint | 17123721 | 1049 days ago | IN | 0 ETH | 0.00689446 | ||||
| Set Transfer Cal... | 16547526 | 1130 days ago | IN | 0 ETH | 0.00103392 | ||||
| Renounce Role | 16497828 | 1137 days ago | IN | 0 ETH | 0.00036378 | ||||
| Renounce Role | 16497825 | 1137 days ago | IN | 0 ETH | 0.00035234 | ||||
| Grant Role | 16497820 | 1137 days ago | IN | 0 ETH | 0.00072142 | ||||
| Grant Role | 16497817 | 1137 days ago | IN | 0 ETH | 0.00082143 | ||||
| Grant Role | 16497813 | 1137 days ago | IN | 0 ETH | 0.0006504 | ||||
| Grant Role | 16497805 | 1137 days ago | IN | 0 ETH | 0.00072279 |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
BNSNFT
Compiler Version
v0.8.14+commit.80d49f37
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2023-01-27
*/
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.14;
/**
* @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;
}
}
/**
* @dev Contract module which allows children to implement an emergency stop
* mechanism that can be triggered by an authorized account.
*
* This module is used through inheritance. It will make available the
* modifiers `whenNotPaused` and `whenPaused`, which can be applied to
* the functions of your contract. Note that they will not be pausable by
* simply including this module, only once the modifiers are put in place.
*/
abstract contract Pausable is Context {
/**
* @dev Emitted when the pause is triggered by `account`.
*/
event Paused(address account);
/**
* @dev Emitted when the pause is lifted by `account`.
*/
event Unpaused(address account);
bool private _paused;
/**
* @dev Initializes the contract in unpaused state.
*/
constructor() {
_paused = false;
}
/**
* @dev Returns true if the contract is paused, and false otherwise.
*/
function paused() public view virtual returns (bool) {
return _paused;
}
/**
* @dev Modifier to make a function callable only when the contract is not paused.
*
* Requirements:
*
* - The contract must not be paused.
*/
modifier whenNotPaused() {
require(!paused(), "Pausable: paused");
_;
}
/**
* @dev Modifier to make a function callable only when the contract is paused.
*
* Requirements:
*
* - The contract must be paused.
*/
modifier whenPaused() {
require(paused(), "Pausable: not paused");
_;
}
/**
* @dev Triggers stopped state.
*
* Requirements:
*
* - The contract must not be paused.
*/
function _pause() internal virtual whenNotPaused {
_paused = true;
emit Paused(_msgSender());
}
/**
* @dev Returns to normal state.
*
* Requirements:
*
* - The contract must be paused.
*/
function _unpause() internal virtual whenPaused {
_paused = false;
emit Unpaused(_msgSender());
}
}
/**
* @dev External interface of AccessControl declared to support ERC165 detection.
*/
interface IAccessControl {
/**
* @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
*
* `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
* {RoleAdminChanged} not being emitted signaling this.
*
* _Available since v3.1._
*/
event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);
/**
* @dev Emitted when `account` is granted `role`.
*
* `sender` is the account that originated the contract call, an admin role
* bearer except when using {AccessControl-_setupRole}.
*/
event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);
/**
* @dev Emitted when `account` is revoked `role`.
*
* `sender` is the account that originated the contract call:
* - if using `revokeRole`, it is the admin role bearer
* - if using `renounceRole`, it is the role bearer (i.e. `account`)
*/
event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);
/**
* @dev Returns `true` if `account` has been granted `role`.
*/
function hasRole(bytes32 role, address account) external view returns (bool);
/**
* @dev Returns the admin role that controls `role`. See {grantRole} and
* {revokeRole}.
*
* To change a role's admin, use {AccessControl-_setRoleAdmin}.
*/
function getRoleAdmin(bytes32 role) external view returns (bytes32);
/**
* @dev Grants `role` to `account`.
*
* If `account` had not been already granted `role`, emits a {RoleGranted}
* event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function grantRole(bytes32 role, address account) external;
/**
* @dev Revokes `role` from `account`.
*
* If `account` had been granted `role`, emits a {RoleRevoked} event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function revokeRole(bytes32 role, address account) external;
/**
* @dev Revokes `role` from the calling account.
*
* Roles are often managed via {grantRole} and {revokeRole}: this function's
* purpose is to provide a mechanism for accounts to lose their privileges
* if they are compromised (such as when a trusted device is misplaced).
*
* If the calling account had been granted `role`, emits a {RoleRevoked}
* event.
*
* Requirements:
*
* - the caller must be `account`.
*/
function renounceRole(bytes32 role, address account) external;
}
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);
}
abstract contract ERC165 is IERC165 {
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}
library Strings {
bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
/**
* @dev Converts a `uint256` to its ASCII `string` decimal representation.
*/
function toString(uint256 value) internal pure returns (string memory) {
// Inspired by OraclizeAPI's implementation - MIT licence
// https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol
if (value == 0) {
return "0";
}
uint256 temp = value;
uint256 digits;
while (temp != 0) {
digits++;
temp /= 10;
}
bytes memory buffer = new bytes(digits);
while (value != 0) {
digits -= 1;
buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
value /= 10;
}
return string(buffer);
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
*/
function toHexString(uint256 value) internal pure returns (string memory) {
if (value == 0) {
return "0x00";
}
uint256 temp = value;
uint256 length = 0;
while (temp != 0) {
length++;
temp >>= 8;
}
return toHexString(value, length);
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
*/
function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
bytes memory buffer = new bytes(2 * length + 2);
buffer[0] = "0";
buffer[1] = "x";
for (uint256 i = 2 * length + 1; i > 1; --i) {
buffer[i] = _HEX_SYMBOLS[value & 0xf];
value >>= 4;
}
require(value == 0, "Strings: hex length insufficient");
return string(buffer);
}
}
abstract contract AccessControl is Context, IAccessControl, ERC165 {
struct RoleData {
mapping(address => bool) members;
bytes32 adminRole;
}
mapping(bytes32 => RoleData) private _roles;
bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;
/**
* @dev Modifier that checks that an account has a specific role. Reverts
* with a standardized message including the required role.
*
* The format of the revert reason is given by the following regular expression:
*
* /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
*
* _Available since v4.1._
*/
modifier onlyRole(bytes32 role) {
_checkRole(role);
_;
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);
}
/**
* @dev Returns `true` if `account` has been granted `role`.
*/
function hasRole(bytes32 role, address account) public view virtual override returns (bool) {
return _roles[role].members[account];
}
/**
* @dev Revert with a standard message if `_msgSender()` is missing `role`.
* Overriding this function changes the behavior of the {onlyRole} modifier.
*
* Format of the revert message is described in {_checkRole}.
*
* _Available since v4.6._
*/
function _checkRole(bytes32 role) internal view virtual {
_checkRole(role, _msgSender());
}
/**
* @dev Revert with a standard message if `account` is missing `role`.
*
* The format of the revert reason is given by the following regular expression:
*
* /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
*/
function _checkRole(bytes32 role, address account) internal view virtual {
if (!hasRole(role, account)) {
revert(
string(
abi.encodePacked(
"AccessControl: account ",
Strings.toHexString(uint160(account), 20),
" is missing role ",
Strings.toHexString(uint256(role), 32)
)
)
);
}
}
/**
* @dev Returns the admin role that controls `role`. See {grantRole} and
* {revokeRole}.
*
* To change a role's admin, use {_setRoleAdmin}.
*/
function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {
return _roles[role].adminRole;
}
/**
* @dev Grants `role` to `account`.
*
* If `account` had not been already granted `role`, emits a {RoleGranted}
* event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
_grantRole(role, account);
}
/**
* @dev Revokes `role` from `account`.
*
* If `account` had been granted `role`, emits a {RoleRevoked} event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
_revokeRole(role, account);
}
/**
* @dev Revokes `role` from the calling account.
*
* Roles are often managed via {grantRole} and {revokeRole}: this function's
* purpose is to provide a mechanism for accounts to lose their privileges
* if they are compromised (such as when a trusted device is misplaced).
*
* If the calling account had been revoked `role`, emits a {RoleRevoked}
* event.
*
* Requirements:
*
* - the caller must be `account`.
*/
function renounceRole(bytes32 role, address account) public virtual override {
require(account == _msgSender(), "AccessControl: can only renounce roles for self");
_revokeRole(role, account);
}
/**
* @dev Grants `role` to `account`.
*
* If `account` had not been already granted `role`, emits a {RoleGranted}
* event. Note that unlike {grantRole}, this function doesn't perform any
* checks on the calling account.
*
* [WARNING]
* ====
* This function should only be called from the constructor when setting
* up the initial roles for the system.
*
* Using this function in any other way is effectively circumventing the admin
* system imposed by {AccessControl}.
* ====
*
* NOTE: This function is deprecated in favor of {_grantRole}.
*/
function _setupRole(bytes32 role, address account) internal virtual {
_grantRole(role, account);
}
/**
* @dev Sets `adminRole` as ``role``'s admin role.
*
* Emits a {RoleAdminChanged} event.
*/
function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
bytes32 previousAdminRole = getRoleAdmin(role);
_roles[role].adminRole = adminRole;
emit RoleAdminChanged(role, previousAdminRole, adminRole);
}
/**
* @dev Grants `role` to `account`.
*
* Internal function without access restriction.
*/
function _grantRole(bytes32 role, address account) internal virtual {
if (!hasRole(role, account)) {
_roles[role].members[account] = true;
emit RoleGranted(role, account, _msgSender());
}
}
/**
* @dev Revokes `role` from `account`.
*
* Internal function without access restriction.
*/
function _revokeRole(bytes32 role, address account) internal virtual {
if (hasRole(role, account)) {
_roles[role].members[account] = false;
emit RoleRevoked(role, account, _msgSender());
}
}
}
library Counters {
struct Counter {
// This variable should never be directly accessed by users of the library: interactions must be restricted to
// the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
// this feature: see https://github.com/ethereum/solidity/issues/4637
uint256 _value; // default: 0
}
function current(Counter storage counter) internal view returns (uint256) {
return counter._value;
}
function increment(Counter storage counter) internal {
unchecked {
counter._value += 1;
}
}
function decrement(Counter storage counter) internal {
uint256 value = counter._value;
require(value > 0, "Counter: decrement overflow");
unchecked {
counter._value = value - 1;
}
}
function reset(Counter storage counter) internal {
counter._value = 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.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `from` to `to` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address from,
address to,
uint256 amount
) external returns (bool);
}
contract RecoverableFunds {
function _retrieveTokens(address recipient, address tokenAddress) internal {
IERC20 token = IERC20(tokenAddress);
token.transfer(recipient, token.balanceOf(address(this)));
}
function _retrieveETH(address payable recipient) internal {
recipient.transfer(address(this).balance);
}
}
interface IERC721 is IERC165 {
/**
* @dev Emitted when `tokenId` token is transferred from `from` to `to`.
*/
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
*/
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
*/
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
/**
* @dev Returns the number of tokens in ``owner``'s account.
*/
function balanceOf(address owner) external view returns (uint256 balance);
/**
* @dev Returns the owner of the `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function ownerOf(uint256 tokenId) external view returns (address owner);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes calldata data
) external;
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
* are aware of the ERC721 protocol to prevent tokens from being forever locked.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) external;
/**
* @dev Transfers `tokenId` token from `from` to `to`.
*
* WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address from,
address to,
uint256 tokenId
) external;
/**
* @dev Gives permission to `to` to transfer `tokenId` token to another account.
* The approval is cleared when the token is transferred.
*
* Only a single account can be approved at a time, so approving the zero address clears previous approvals.
*
* Requirements:
*
* - The caller must own the token or be an approved operator.
* - `tokenId` must exist.
*
* Emits an {Approval} event.
*/
function approve(address to, uint256 tokenId) external;
/**
* @dev Approve or remove `operator` as an operator for the caller.
* Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
*
* Requirements:
*
* - The `operator` cannot be the caller.
*
* Emits an {ApprovalForAll} event.
*/
function setApprovalForAll(address operator, bool _approved) external;
/**
* @dev Returns the account approved for `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function getApproved(uint256 tokenId) external view returns (address operator);
/**
* @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
*
* See {setApprovalForAll}
*/
function isApprovedForAll(address owner, address operator) external view returns (bool);
}
interface IERC721Enumerable is IERC721 {
/**
* @dev Returns the total amount of tokens stored by the contract.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns a token ID owned by `owner` at a given `index` of its token list.
* Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
*/
function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256);
/**
* @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
* Use along with {totalSupply} to enumerate all tokens.
*/
function tokenByIndex(uint256 index) external view returns (uint256);
}
interface IERC721Metadata is IERC721 {
/**
* @dev Returns the token collection name.
*/
function name() external view returns (string memory);
/**
* @dev Returns the token collection symbol.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
*/
function tokenURI(uint256 tokenId) external view returns (string memory);
}
/**
* @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
* ====
*
* [IMPORTANT]
* ====
* You shouldn't rely on `isContract` to protect against flash loan attacks!
*
* Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
* like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
* constructor.
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize/address.code.length, which returns 0
// for contracts in construction, since the code is only stored at the end
// of the constructor execution.
return account.code.length > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value
) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
require(isContract(target), "Address: call to non-contract");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
require(isContract(target), "Address: delegate call to non-contract");
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason using the provided one.
*
* _Available since v4.3._
*/
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}
interface IContentProvider {
function setContent(string memory name, string memory relativePath, string memory content) external;
function getContent(string memory name, string memory realtivePath) external view returns (string memory);
}
interface IContentRouter {
enum ContentType {
INTERNAL,
EXTERNAL
}
struct ContentRoute {
bool exists;
ContentType contentType;
IContentProvider contentProvider; // used with on-chain content
string contentAddress; // used with off-chain conetent
}
function setContentOrAddress(string memory name, string memory relativePath, string memory content, ContentType contentType, address contentProvider) external;
function getContentOrAddress(string memory name, string memory realtivePath) external view returns (ContentType contentType, string memory);
}
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);
}
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
using Address for address;
using Strings for uint256;
// Token name
string private _name;
// Token symbol
string private _symbol;
// Mapping from token ID to owner address
mapping(uint256 => address) internal _owners;
// Mapping owner address to token count
mapping(address => uint256) internal _balances;
// Mapping from token ID to approved address
mapping(uint256 => address) private _tokenApprovals;
// Mapping from owner to operator approvals
mapping(address => mapping(address => bool)) private _operatorApprovals;
/**
* @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
*/
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
return
interfaceId == type(IERC721).interfaceId ||
interfaceId == type(IERC721Metadata).interfaceId ||
super.supportsInterface(interfaceId);
}
/**
* @dev See {IERC721-balanceOf}.
*/
function balanceOf(address owner) public view virtual override returns (uint256) {
require(owner != address(0), "ERC721: address zero is not a valid owner");
return _balances[owner];
}
/**
* @dev See {IERC721-ownerOf}.
*/
function ownerOf(uint256 tokenId) public view virtual override returns (address) {
address owner = _owners[tokenId];
require(owner != address(0), "ERC721: invalid token ID");
return owner;
}
/**
* @dev See {IERC721Metadata-name}.
*/
function name() public view virtual override returns (string memory) {
return _name;
}
/**
* @dev See {IERC721Metadata-symbol}.
*/
function symbol() public view virtual override returns (string memory) {
return _symbol;
}
/**
* @dev See {IERC721Metadata-tokenURI}.
*/
function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
_requireMinted(tokenId);
string memory baseURI = _baseURI();
return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
}
/**
* @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
* token will be the concatenation of the `baseURI` and the `tokenId`. Empty
* by default, can be overridden in child contracts.
*/
function _baseURI() internal view virtual returns (string memory) {
return "";
}
/**
* @dev See {IERC721-approve}.
*/
function approve(address to, uint256 tokenId) public virtual override {
address owner = ERC721.ownerOf(tokenId);
require(to != owner, "ERC721: approval to current owner");
require(
_msgSender() == owner || isApprovedForAll(owner, _msgSender()),
"ERC721: approve caller is not token owner or approved for all"
);
_approve(to, tokenId);
}
/**
* @dev See {IERC721-getApproved}.
*/
function getApproved(uint256 tokenId) public view virtual override returns (address) {
_requireMinted(tokenId);
return _tokenApprovals[tokenId];
}
/**
* @dev See {IERC721-setApprovalForAll}.
*/
function setApprovalForAll(address operator, bool approved) public virtual override {
_setApprovalForAll(_msgSender(), operator, approved);
}
/**
* @dev See {IERC721-isApprovedForAll}.
*/
function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
return _operatorApprovals[owner][operator];
}
/**
* @dev See {IERC721-transferFrom}.
*/
function transferFrom(
address from,
address to,
uint256 tokenId
) public virtual override {
//solhint-disable-next-line max-line-length
require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved");
_transfer(from, to, tokenId);
}
/**
* @dev See {IERC721-safeTransferFrom}.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) public virtual override {
safeTransferFrom(from, to, tokenId, "");
}
/**
* @dev See {IERC721-safeTransferFrom}.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes memory data
) public virtual override {
require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved");
_safeTransfer(from, to, tokenId, data);
}
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
* are aware of the ERC721 protocol to prevent tokens from being forever locked.
*
* `data` is additional data, it has no specified format and it is sent in call to `to`.
*
* This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
* implement alternative mechanisms to perform token transfer, such as signature-based.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function _safeTransfer(
address from,
address to,
uint256 tokenId,
bytes memory data
) internal virtual {
_transfer(from, to, tokenId);
require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer");
}
/**
* @dev Returns whether `tokenId` exists.
*
* Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
*
* Tokens start existing when they are minted (`_mint`),
* and stop existing when they are burned (`_burn`).
*/
function _exists(uint256 tokenId) internal view virtual returns (bool) {
return _owners[tokenId] != address(0);
}
/**
* @dev Returns whether `spender` is allowed to manage `tokenId`.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
address owner = ERC721.ownerOf(tokenId);
return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);
}
/**
* @dev Safely mints `tokenId` and transfers it to `to`.
*
* Requirements:
*
* - `tokenId` must not exist.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function _safeMint(address to, uint256 tokenId) internal virtual {
_safeMint(to, tokenId, "");
}
/**
* @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
* forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
*/
function _safeMint(
address to,
uint256 tokenId,
bytes memory data
) internal virtual {
_mint(to, tokenId);
require(
_checkOnERC721Received(address(0), to, tokenId, data),
"ERC721: transfer to non ERC721Receiver implementer"
);
}
/**
* @dev Mints `tokenId` and transfers it to `to`.
*
* WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
*
* Requirements:
*
* - `tokenId` must not exist.
* - `to` cannot be the zero address.
*
* Emits a {Transfer} event.
*/
function _mint(address to, uint256 tokenId) internal virtual {
require(to != address(0), "ERC721: mint to the zero address");
require(!_exists(tokenId), "ERC721: token already minted");
_beforeTokenTransfer(address(0), to, tokenId);
// Check that tokenId was not minted by `_beforeTokenTransfer` hook
require(!_exists(tokenId), "ERC721: token already minted");
_balances[to] += 1;
_owners[tokenId] = to;
emit Transfer(address(0), to, tokenId);
_afterTokenTransfer(address(0), to, tokenId);
}
/**
* @dev Destroys `tokenId`.
* The approval is cleared when the token is burned.
* This is an internal function that does not check if the sender is authorized to operate on the token.
*
* Requirements:
*
* - `tokenId` must exist.
*
* Emits a {Transfer} event.
*/
function _burn(uint256 tokenId) internal virtual {
address owner = ERC721.ownerOf(tokenId);
_beforeTokenTransfer(owner, address(0), tokenId);
// Update ownership in case tokenId was transfered by `_beforeTokenTransfer` hook
owner = ERC721.ownerOf(tokenId);
// Clear approvals
delete _tokenApprovals[tokenId];
_balances[owner] -= 1;
delete _owners[tokenId];
emit Transfer(owner, address(0), tokenId);
_afterTokenTransfer(owner, address(0), tokenId);
}
/**
* @dev Transfers `tokenId` from `from` to `to`.
* As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
*
* Emits a {Transfer} event.
*/
function _transfer(
address from,
address to,
uint256 tokenId
) internal virtual {
require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
require(to != address(0), "ERC721: transfer to the zero address");
_beforeTokenTransfer(from, to, tokenId);
// Check that tokenId was not transfered by `_beforeTokenTransfer` hook
require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
// Clear approvals from the previous owner
delete _tokenApprovals[tokenId];
_balances[from] -= 1;
_balances[to] += 1;
_owners[tokenId] = to;
emit Transfer(from, to, tokenId);
_afterTokenTransfer(from, to, tokenId);
}
/**
* @dev Approve `to` to operate on `tokenId`
*
* Emits an {Approval} event.
*/
function _approve(address to, uint256 tokenId) internal virtual {
_tokenApprovals[tokenId] = to;
emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
}
/**
* @dev Approve `operator` to operate on all of `owner` tokens
*
* Emits an {ApprovalForAll} event.
*/
function _setApprovalForAll(
address owner,
address operator,
bool approved
) internal virtual {
require(owner != operator, "ERC721: approve to caller");
_operatorApprovals[owner][operator] = approved;
emit ApprovalForAll(owner, operator, approved);
}
/**
* @dev Reverts if the `tokenId` has not been minted yet.
*/
function _requireMinted(uint256 tokenId) internal view virtual {
require(_exists(tokenId), "ERC721: invalid token ID");
}
/**
* @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
* The call is not executed if the target address is not a contract.
*
* @param from address representing the previous owner of the given token ID
* @param to target address that will receive the tokens
* @param tokenId uint256 ID of the token to be transferred
* @param data bytes optional data to send along with the call
* @return bool whether the call correctly returned the expected magic value
*/
function _checkOnERC721Received(
address from,
address to,
uint256 tokenId,
bytes memory data
) private returns (bool) {
if (to.isContract()) {
try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) {
return retval == IERC721Receiver.onERC721Received.selector;
} catch (bytes memory reason) {
if (reason.length == 0) {
revert("ERC721: transfer to non ERC721Receiver implementer");
} else {
/// @solidity memory-safe-assembly
assembly {
revert(add(32, reason), mload(reason))
}
}
}
} else {
return true;
}
}
/**
* @dev Hook that is called before any token transfer. This includes minting
* and burning.
*
* Calling conditions:
*
* - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
* transferred to `to`.
* - When `from` is zero, `tokenId` will be minted for `to`.
* - When `to` is zero, ``from``'s `tokenId` will be burned.
* - `from` and `to` are never both zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(
address from,
address to,
uint256 tokenId
) internal virtual {}
/**
* @dev Hook that is called after any transfer of tokens. This includes
* minting and burning.
*
* Calling conditions:
*
* - when `from` and `to` are both non-zero.
* - `from` and `to` are never both zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _afterTokenTransfer(
address from,
address to,
uint256 tokenId
) internal virtual {}
}
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
// Mapping from owner to list of owned token IDs
mapping(address => mapping(uint256 => uint256)) private _ownedTokens;
// Mapping from token ID to index of the owner tokens list
mapping(uint256 => uint256) private _ownedTokensIndex;
// Array with all token ids, used for enumeration
uint256[] private _allTokens;
// Mapping from token id to position in the allTokens array
mapping(uint256 => uint256) private _allTokensIndex;
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) {
return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId);
}
/**
* @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
*/
function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
return _ownedTokens[owner][index];
}
/**
* @dev See {IERC721Enumerable-totalSupply}.
*/
function totalSupply() public view virtual override returns (uint256) {
return _allTokens.length;
}
/**
* @dev See {IERC721Enumerable-tokenByIndex}.
*/
function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
return _allTokens[index];
}
/**
* @dev Hook that is called before any token transfer. This includes minting
* and burning.
*
* Calling conditions:
*
* - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
* transferred to `to`.
* - When `from` is zero, `tokenId` will be minted for `to`.
* - When `to` is zero, ``from``'s `tokenId` will be burned.
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(
address from,
address to,
uint256 tokenId
) internal virtual override {
super._beforeTokenTransfer(from, to, tokenId);
if (from == address(0)) {
_addTokenToAllTokensEnumeration(tokenId);
} else if (from != to) {
_removeTokenFromOwnerEnumeration(from, tokenId);
}
if (to == address(0)) {
_removeTokenFromAllTokensEnumeration(tokenId);
} else if (to != from) {
_addTokenToOwnerEnumeration(to, tokenId);
}
}
/**
* @dev Private function to add a token to this extension's ownership-tracking data structures.
* @param to address representing the new owner of the given token ID
* @param tokenId uint256 ID of the token to be added to the tokens list of the given address
*/
function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
uint256 length = ERC721.balanceOf(to);
_ownedTokens[to][length] = tokenId;
_ownedTokensIndex[tokenId] = length;
}
/**
* @dev Private function to add a token to this extension's token tracking data structures.
* @param tokenId uint256 ID of the token to be added to the tokens list
*/
function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
_allTokensIndex[tokenId] = _allTokens.length;
_allTokens.push(tokenId);
}
/**
* @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
* while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
* gas optimizations e.g. when performing a transfer operation (avoiding double writes).
* This has O(1) time complexity, but alters the order of the _ownedTokens array.
* @param from address representing the previous owner of the given token ID
* @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
*/
function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
// To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
// then delete the last slot (swap and pop).
uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
uint256 tokenIndex = _ownedTokensIndex[tokenId];
// When the token to delete is the last token, the swap operation is unnecessary
if (tokenIndex != lastTokenIndex) {
uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];
_ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
_ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
}
// This also deletes the contents at the last position of the array
delete _ownedTokensIndex[tokenId];
delete _ownedTokens[from][lastTokenIndex];
}
/**
* @dev Private function to remove a token from this extension's token tracking data structures.
* This has O(1) time complexity, but alters the order of the _allTokens array.
* @param tokenId uint256 ID of the token to be removed from the tokens list
*/
function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
// To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
// then delete the last slot (swap and pop).
uint256 lastTokenIndex = _allTokens.length - 1;
uint256 tokenIndex = _allTokensIndex[tokenId];
// When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
// rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
// an 'if' statement (like in _removeTokenFromOwnerEnumeration)
uint256 lastTokenId = _allTokens[lastTokenIndex];
_allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
_allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
// This also deletes the contents at the last position of the array
delete _allTokensIndex[tokenId];
_allTokens.pop();
}
}
interface ITransferCallbackContract {
function beforeTransferCallback(address from, address to, uint256 tokenId) external;
function afterTransferCallback(address from, address to, uint256 tokenId) external;
}
contract BNSNFT is ERC721, ERC721Enumerable, Pausable, AccessControl, RecoverableFunds {
using Counters for Counters.Counter;
IContentRouter public contentRouter;
ITransferCallbackContract public transferCallbackContract;
string public baseURI;
mapping(bytes32 => bool) public domainNameExists;
mapping(uint256 => string) public tokenIdToDomainNames;
mapping(bytes32 => uint256) public domainNamesToTokenId;
bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE");
bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE");
Counters.Counter private _tokenIdCounter;
constructor() ERC721("Web3DNA", "W3DNA") {
_grantRole(DEFAULT_ADMIN_ROLE, msg.sender);
_grantRole(PAUSER_ROLE, msg.sender);
_grantRole(MINTER_ROLE, msg.sender);
setBaseURI("https://marketing-service.w3dna.net/api/v1/metadata/");
}
modifier transferCallbacks(address from, address to, uint256 tokenId) {
if (address(transferCallbackContract) != address(0x0)) {
transferCallbackContract.beforeTransferCallback(from, to, tokenId);
}
_;
if (address(transferCallbackContract) != address(0x0)) {
transferCallbackContract.afterTransferCallback(from, to, tokenId);
}
}
function setTransferCallbackContract(address contractAddress) external onlyRole(DEFAULT_ADMIN_ROLE) {
transferCallbackContract = ITransferCallbackContract(contractAddress);
}
function isDomainNameExists(string memory domainName) external view returns (bool) {
return domainNameExists[keccak256(abi.encodePacked(domainName))];
}
function setContentRouter(address newContentRouter) external onlyRole(DEFAULT_ADMIN_ROLE) {
contentRouter = IContentRouter(newContentRouter);
}
function getDomainNameOwner(string calldata domainName) external view returns (address) {
return ownerOf(getTokenIdByDomainName(domainName));
}
function getTokenIdByDomainName(string calldata domainName) public view returns (uint256) {
bytes32 domainNameHash = keccak256(abi.encodePacked(domainName));
require(domainNameExists[domainNameHash], "BNSNFT: Domain name not exists");
return domainNamesToTokenId[domainNameHash];
}
function getRelativeContentByTokenId(uint256 tokenId, string memory relativePath) external view returns (IContentRouter.ContentType contentType, string memory) {
require(_exists(tokenId), "BNSNFT: Content query for nonexistent token");
string memory domainName = tokenIdToDomainNames[tokenId];
return contentRouter.getContentOrAddress(domainName, relativePath);
}
function getContentByTokenId(uint256 tokenId) external view returns (IContentRouter.ContentType contentType, string memory) {
require(_exists(tokenId), "BNSNFT: Content query for nonexistent token");
string memory domainName = tokenIdToDomainNames[tokenId];
return contentRouter.getContentOrAddress(domainName, "");
}
function getRelativeContentByDomainName(string memory domainName, string memory relativePath) external view returns (IContentRouter.ContentType contentType, string memory) {
return contentRouter.getContentOrAddress(domainName, relativePath);
}
function getContentByDomainName(string memory domainName) external view returns (IContentRouter.ContentType contentType, string memory) {
return contentRouter.getContentOrAddress(domainName, "");
}
function setRelativeContentOrAddressByTokenId(uint tokenId, string memory relativePath, string memory content, IContentRouter.ContentType contentType, address contentProvider) external {
require(msg.sender == ownerOf(tokenId) || hasRole(DEFAULT_ADMIN_ROLE, msg.sender), "BNSNFT: Only admin or token owner can set content");
require(_exists(tokenId), "BNSNFT: Content query for nonexistent token");
string memory domainName = tokenIdToDomainNames[tokenId];
contentRouter.setContentOrAddress(domainName, relativePath, content, contentType, contentProvider);
}
function setContentOrAddressByTokenId(uint tokenId, string memory content, IContentRouter.ContentType contentType, address contentProvider) external {
require(msg.sender == ownerOf(tokenId) || hasRole(DEFAULT_ADMIN_ROLE, msg.sender), "BNSNFT: Only admin or token owner can set content");
require(_exists(tokenId), "BNSNFT: Content query for nonexistent token");
string memory domainName = tokenIdToDomainNames[tokenId];
contentRouter.setContentOrAddress(domainName, "", content, contentType, contentProvider);
}
function setContentOrAddressByDomainName(string memory domainName, string memory content, IContentRouter.ContentType contentType, address contentProvider) external {
bytes32 domainNameHash = keccak256(abi.encodePacked(domainName));
uint tokenId = domainNamesToTokenId[domainNameHash];
require(msg.sender == ownerOf(tokenId) || hasRole(DEFAULT_ADMIN_ROLE, msg.sender), "BNSNFT: Only admin or token owner can set content");
require(_exists(tokenId), "BNSNFT: Content query for nonexistent token");
contentRouter.setContentOrAddress(domainName, "", content, contentType, contentProvider);
}
function setRelativeContentOrAddressByDomainName(string memory domainName, string memory relativePath, string memory content, IContentRouter.ContentType contentType, address contentProvider) external {
bytes32 domainNameHash = keccak256(abi.encodePacked(domainName));
uint tokenId = domainNamesToTokenId[domainNameHash];
require(msg.sender == ownerOf(tokenId) || hasRole(DEFAULT_ADMIN_ROLE, msg.sender), "BNSNFT: Only admin or token owner can set content");
require(_exists(tokenId), "BNSNFT: Content query for nonexistent token");
contentRouter.setContentOrAddress(domainName, relativePath, content, contentType, contentProvider);
}
function pause() public onlyRole(PAUSER_ROLE) {
_pause();
}
function unpause() public onlyRole(PAUSER_ROLE) {
_unpause();
}
function setBaseURI(string memory newBaseURI) public onlyRole(DEFAULT_ADMIN_ROLE) {
baseURI = newBaseURI;
}
function _baseURI() internal view override returns (string memory) {
return baseURI;
}
function transferFrom(address from, address to, uint256 tokenId) public override(ERC721, IERC721) transferCallbacks(from, to, tokenId) {
ERC721.transferFrom(from, to, tokenId);
}
function safeTransferFrom(address from, address to, uint256 tokenId) public override(ERC721, IERC721) transferCallbacks(from, to, tokenId) {
ERC721.safeTransferFrom(from, to, tokenId, "");
}
function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public override(ERC721, IERC721) transferCallbacks(from, to, tokenId) {
ERC721.safeTransferFrom(from, to, tokenId, data);
}
function safeBatchMint(address to, string[] calldata domainNames) public onlyRole(MINTER_ROLE) {
for (uint i = 0; i < domainNames.length; i++) {
bytes32 domainNameHash = keccak256(abi.encodePacked(domainNames[i]));
require(!domainNameExists[domainNameHash], "BNSNFT: Domain name already exists");
uint256 tokenId = _tokenIdCounter.current();
_tokenIdCounter.increment();
_safeMint(to, tokenId);
domainNameExists[domainNameHash] = true;
tokenIdToDomainNames[tokenId] = domainNames[i];
domainNamesToTokenId[domainNameHash] = tokenId;
}
}
function safeMint(address to, string calldata domainName) public onlyRole(MINTER_ROLE) returns (uint256) {
bytes32 domainNameHash = keccak256(abi.encodePacked(domainName));
require(!domainNameExists[domainNameHash], "BNSNFT: Domain name already exists");
uint256 tokenId = _tokenIdCounter.current();
_tokenIdCounter.increment();
_safeMint(to, tokenId);
domainNameExists[domainNameHash] = true;
tokenIdToDomainNames[tokenId] = domainName;
domainNamesToTokenId[domainNameHash] = tokenId;
return tokenId;
}
function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal whenNotPaused override(ERC721, ERC721Enumerable) {
super._beforeTokenTransfer(from, to, tokenId);
}
function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721Enumerable, AccessControl) returns (bool) {
return super.supportsInterface(interfaceId);
}
function retrieveTokens(address recipient, address tokenAddress) external onlyRole(DEFAULT_ADMIN_ROLE) {
_retrieveTokens(recipient, tokenAddress);
}
function retrieveETH(address payable recipient) external onlyRole(DEFAULT_ADMIN_ROLE) {
_retrieveETH(recipient);
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAUSER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contentRouter","outputs":[{"internalType":"contract IContentRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"domainNameExists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"domainNamesToTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"domainName","type":"string"}],"name":"getContentByDomainName","outputs":[{"internalType":"enum IContentRouter.ContentType","name":"contentType","type":"uint8"},{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getContentByTokenId","outputs":[{"internalType":"enum IContentRouter.ContentType","name":"contentType","type":"uint8"},{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"domainName","type":"string"}],"name":"getDomainNameOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"domainName","type":"string"},{"internalType":"string","name":"relativePath","type":"string"}],"name":"getRelativeContentByDomainName","outputs":[{"internalType":"enum IContentRouter.ContentType","name":"contentType","type":"uint8"},{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"relativePath","type":"string"}],"name":"getRelativeContentByTokenId","outputs":[{"internalType":"enum IContentRouter.ContentType","name":"contentType","type":"uint8"},{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"domainName","type":"string"}],"name":"getTokenIdByDomainName","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"domainName","type":"string"}],"name":"isDomainNameExists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"recipient","type":"address"}],"name":"retrieveETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"retrieveTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"string[]","name":"domainNames","type":"string[]"}],"name":"safeBatchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"string","name":"domainName","type":"string"}],"name":"safeMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"domainName","type":"string"},{"internalType":"string","name":"content","type":"string"},{"internalType":"enum IContentRouter.ContentType","name":"contentType","type":"uint8"},{"internalType":"address","name":"contentProvider","type":"address"}],"name":"setContentOrAddressByDomainName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"content","type":"string"},{"internalType":"enum IContentRouter.ContentType","name":"contentType","type":"uint8"},{"internalType":"address","name":"contentProvider","type":"address"}],"name":"setContentOrAddressByTokenId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newContentRouter","type":"address"}],"name":"setContentRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"domainName","type":"string"},{"internalType":"string","name":"relativePath","type":"string"},{"internalType":"string","name":"content","type":"string"},{"internalType":"enum IContentRouter.ContentType","name":"contentType","type":"uint8"},{"internalType":"address","name":"contentProvider","type":"address"}],"name":"setRelativeContentOrAddressByDomainName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"relativePath","type":"string"},{"internalType":"string","name":"content","type":"string"},{"internalType":"enum IContentRouter.ContentType","name":"contentType","type":"uint8"},{"internalType":"address","name":"contentProvider","type":"address"}],"name":"setRelativeContentOrAddressByTokenId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"}],"name":"setTransferCallbackContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenIdToDomainNames","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"transferCallbackContract","outputs":[{"internalType":"contract ITransferCallbackContract","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60806040523480156200001157600080fd5b50604080518082018252600781526657656233444e4160c81b6020808301918252835180850190945260058452645733444e4160d81b9084015281519192916200005e9160009162000451565b5080516200007490600190602084019062000451565b5050600a805460ff19169055506200008e60003362000110565b620000ba7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a3362000110565b620000e67f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a63362000110565b6200010a604051806060016040528060348152602001620042ea60349139620001b5565b620006ad565b6000828152600b602090815260408083206001600160a01b038516845290915290205460ff16620001b1576000828152600b602090815260408083206001600160a01b03851684529091529020805460ff19166001179055620001703390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6000620001c281620001dc565b8151620001d790600e90602085019062000451565b505050565b620001e88133620001eb565b50565b6000828152600b602090815260408083206001600160a01b038516845290915290205460ff16620001b15762000237816001600160a01b031660146200029160201b62001c5b1760201c565b6200024d83602062001c5b62000291821b17811c565b604051602001620002609291906200052a565b60408051601f198184030181529082905262461bcd60e51b82526200028891600401620005a3565b60405180910390fd5b60606000620002a2836002620005ee565b620002af90600262000610565b6001600160401b03811115620002c957620002c96200062b565b6040519080825280601f01601f191660200182016040528015620002f4576020820181803683370190505b509050600360fc1b8160008151811062000312576200031262000641565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811062000344576200034462000641565b60200101906001600160f81b031916908160001a90535060006200036a846002620005ee565b6200037790600162000610565b90505b6001811115620003f9576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110620003af57620003af62000641565b1a60f81b828281518110620003c857620003c862000641565b60200101906001600160f81b031916908160001a90535060049490941c93620003f18162000657565b90506200037a565b5083156200044a5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640162000288565b9392505050565b8280546200045f9062000671565b90600052602060002090601f016020900481019282620004835760008555620004ce565b82601f106200049e57805160ff1916838001178555620004ce565b82800160010185558215620004ce579182015b82811115620004ce578251825591602001919060010190620004b1565b50620004dc929150620004e0565b5090565b5b80821115620004dc5760008155600101620004e1565b60005b8381101562000514578181015183820152602001620004fa565b8381111562000524576000848401525b50505050565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081526000835162000564816017850160208801620004f7565b7001034b99036b4b9b9b4b733903937b6329607d1b601791840191820152835162000597816028840160208801620004f7565b01602801949350505050565b6020815260008251806020840152620005c4816040850160208701620004f7565b601f01601f19169190910160400192915050565b634e487b7160e01b600052601160045260246000fd5b60008160001904831182151516156200060b576200060b620005d8565b500290565b60008219821115620006265762000626620005d8565b500190565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b600081620006695762000669620005d8565b506000190190565b600181811c908216806200068657607f821691505b602082108103620006a757634e487b7160e01b600052602260045260246000fd5b50919050565b613c2d80620006bd6000396000f3fe608060405234801561001057600080fd5b50600436106102f15760003560e01c80636341ca0b1161019d578063c87b56dd116100e9578063d91e1a9e116100a2578063e63ab1e91161007c578063e63ab1e9146106b3578063e985e9c5146106da578063ea6ab6ee14610716578063f4a15af21461072957600080fd5b8063d91e1a9e1461067a578063dd8bf9671461068d578063e4329b7c146106a057600080fd5b8063c87b56dd146105f4578063d173126414610607578063d204c45e1461061a578063d53913931461062d578063d547741f14610654578063d65671ab1461066757600080fd5b80638456cb5911610156578063a217fddf11610130578063a217fddf146105b3578063a22cb465146105bb578063a907a897146105ce578063b88d4fde146105e157600080fd5b80638456cb591461059057806391d148541461059857806395d89b41146105ab57600080fd5b80636341ca0b146105295780636352211e1461053c578063649b14a21461054f5780636c0360eb1461056257806370a082311461056a5780637c3b4df71461057d57600080fd5b806336568abe1161025c578063480ad3191161021557806355f804b3116101ef57806355f804b3146104e557806358dd6d95146104f85780635c975abb1461050b5780635e1ee2601461051657600080fd5b8063480ad319146104ac5780634f6ccce7146104bf57806353784aae146104d257600080fd5b806336568abe146104385780633be0f6251461044b5780633f4ba83a1461046b578063420fd0961461047357806342842e0e1461048657806343cefa1d1461049957600080fd5b80631a5d0348116102ae5780631a5d03481461039857806323b872dd146103bb578063248a9ca3146103ce5780632b5ab31b146103f15780632f2ff15d146104125780632f745c591461042557600080fd5b806301ffc9a7146102f657806306fdde031461031e578063081812fc14610333578063095ea7b31461035e57806310a76fb11461037357806318160ddd14610386575b600080fd5b610309610304366004612e3b565b61073c565b60405190151581526020015b60405180910390f35b61032661074d565b6040516103159190612eb0565b610346610341366004612ec3565b6107df565b6040516001600160a01b039091168152602001610315565b61037161036c366004612ef1565b610806565b005b610371610381366004612f1d565b610920565b6008545b604051908152602001610315565b6103096103a6366004612ec3565b600f6020526000908152604090205460ff1681565b6103716103c9366004612f3a565b610938565b61038a6103dc366004612ec3565b6000908152600b602052604090206001015490565b6104046103ff366004613046565b610a41565b60405161031592919061309c565b6103716104203660046130bc565b610ac5565b61038a610433366004612ef1565b610aea565b6103716104463660046130bc565b610b80565b61038a610459366004612ec3565b60116020526000908152604090205481565b610371610bfa565b610371610481366004612f1d565b610c2f565b610371610494366004612f3a565b610c5d565b61038a6104a736600461312d565b610cf6565b6103716104ba366004612f1d565b610d99565b61038a6104cd366004612ec3565b610dc7565b6104046104e036600461316e565b610e5a565b6103716104f3366004613046565b610ee3565b6103716105063660046131d1565b610f01565b600a5460ff16610309565b610371610524366004613265565b61105a565b6103716105373660046132d0565b6111d0565b61034661054a366004612ec3565b6111e5565b61040461055d366004612ec3565b611245565b610326611385565b61038a610578366004612f1d565b611413565b61034661058b36600461312d565b611499565b6103716114af565b6103096105a63660046130bc565b6114e1565b61032661150c565b61038a600081565b6103716105c936600461330c565b61151b565b6104046105dc36600461333a565b611526565b6103716105ef366004613376565b61166a565b610326610602366004612ec3565b611775565b6103716106153660046133f5565b6117db565b61038a610628366004613489565b61191a565b61038a7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b6103716106623660046130bc565b611a15565b610309610675366004613046565b611a3a565b610326610688366004612ec3565b611a80565b61037161069b3660046134dd565b611a99565b600d54610346906001600160a01b031681565b61038a7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b6103096106e83660046132d0565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b600c54610346906001600160a01b031681565b61037161073736600461352e565b611b7b565b600061074782611df6565b92915050565b60606000805461075c9061358a565b80601f01602080910402602001604051908101604052809291908181526020018280546107889061358a565b80156107d55780601f106107aa576101008083540402835291602001916107d5565b820191906000526020600020905b8154815290600101906020018083116107b857829003601f168201915b5050505050905090565b60006107ea82611e1b565b506000908152600460205260409020546001600160a01b031690565b6000610811826111e5565b9050806001600160a01b0316836001600160a01b0316036108835760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b038216148061089f575061089f81336106e8565b6109115760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000606482015260840161087a565b61091b8383611e6b565b505050565b600061092b81611ed9565b61093482611ee3565b5050565b600d548390839083906001600160a01b0316156109b657600d5460405163c771eeef60e01b81526001600160a01b039091169063c771eeef90610983908690869086906004016135c4565b600060405180830381600087803b15801561099d57600080fd5b505af11580156109b1573d6000803e3d6000fd5b505050505b6109c1868686611f18565b600d546001600160a01b031615610a3957600d54604051635cf8305b60e01b81526001600160a01b0390911690635cf8305b90610a06908690869086906004016135c4565b600060405180830381600087803b158015610a2057600080fd5b505af1158015610a34573d6000803e3d6000fd5b505050505b505050505050565b600c5460405163f188737b60e01b81526000916060916001600160a01b039091169063f188737b90610a779086906004016135e8565b600060405180830381865afa158015610a94573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610abc9190810190613612565b91509150915091565b6000828152600b6020526040902060010154610ae081611ed9565b61091b8383611f49565b6000610af583611413565b8210610b575760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161087a565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6001600160a01b0381163314610bf05760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b606482015260840161087a565b6109348282611fcf565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610c2481611ed9565b610c2c612036565b50565b6000610c3a81611ed9565b50600c80546001600160a01b0319166001600160a01b0392909216919091179055565b600d548390839083906001600160a01b031615610cdb57600d5460405163c771eeef60e01b81526001600160a01b039091169063c771eeef90610ca8908690869086906004016135c4565b600060405180830381600087803b158015610cc257600080fd5b505af1158015610cd6573d6000803e3d6000fd5b505050505b6109c1868686604051806020016040528060008152506120c9565b6000808383604051602001610d0c92919061369e565b60408051601f1981840301815291815281516020928301206000818152600f90935291205490915060ff16610d835760405162461bcd60e51b815260206004820152601e60248201527f424e534e46543a20446f6d61696e206e616d65206e6f74206578697374730000604482015260640161087a565b6000908152601160205260409020549392505050565b6000610da481611ed9565b50600d80546001600160a01b0319166001600160a01b0392909216919091179055565b6000610dd260085490565b8210610e355760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161087a565b60088281548110610e4857610e486136ae565b90600052602060002001549050919050565b600c5460405163f188737b60e01b81526000916060916001600160a01b039091169063f188737b90610e9290879087906004016136c4565b600060405180830381865afa158015610eaf573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610ed79190810190613612565b915091505b9250929050565b6000610eee81611ed9565b815161091b90600e906020850190612d18565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6610f2b81611ed9565b60005b82811015611053576000848483818110610f4a57610f4a6136ae565b9050602002810190610f5c91906136f2565b604051602001610f6d92919061369e565b60408051601f1981840301815291815281516020928301206000818152600f90935291205490915060ff1615610fb55760405162461bcd60e51b815260040161087a90613738565b6000610fc060125490565b9050610fd0601280546001019055565b610fda8782612101565b6000828152600f60205260409020805460ff19166001179055858584818110611005576110056136ae565b905060200281019061101791906136f2565b6000838152601060205260409020611030929091612d9c565b50600091825260116020526040909120558061104b81613790565b915050610f2e565b5050505050565b611063846111e5565b6001600160a01b0316336001600160a01b0316148061108857506110886000336114e1565b6110a45760405162461bcd60e51b815260040161087a906137a9565b6110ad8461211b565b6110c95760405162461bcd60e51b815260040161087a906137fa565b600084815260106020526040812080546110e29061358a565b80601f016020809104026020016040519081016040528092919081815260200182805461110e9061358a565b801561115b5780601f106111305761010080835404028352916020019161115b565b820191906000526020600020905b81548152906001019060200180831161113e57829003601f168201915b5050600c5460405163cf468f4560e01b81529495506001600160a01b03169363cf468f4593506111979250859150889088908890600401613845565b600060405180830381600087803b1580156111b157600080fd5b505af11580156111c5573d6000803e3d6000fd5b505050505050505050565b60006111db81611ed9565b61091b8383612138565b6000818152600260205260408120546001600160a01b0316806107475760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b604482015260640161087a565b600060606112528361211b565b61126e5760405162461bcd60e51b815260040161087a906137fa565b600083815260106020526040812080546112879061358a565b80601f01602080910402602001604051908101604052809291908181526020018280546112b39061358a565b80156113005780601f106112d557610100808354040283529160200191611300565b820191906000526020600020905b8154815290600101906020018083116112e357829003601f168201915b5050600c5460405163f188737b60e01b81529495506001600160a01b03169363f188737b935061133692508591506004016135e8565b600060405180830381865afa158015611353573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261137b9190810190613612565b9250925050915091565b600e80546113929061358a565b80601f01602080910402602001604051908101604052809291908181526020018280546113be9061358a565b801561140b5780601f106113e05761010080835404028352916020019161140b565b820191906000526020600020905b8154815290600101906020018083116113ee57829003601f168201915b505050505081565b60006001600160a01b03821661147d5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b606482015260840161087a565b506001600160a01b031660009081526003602052604090205490565b60006114a861054a8484610cf6565b9392505050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a6114d981611ed9565b610c2c61221b565b6000918252600b602090815260408084206001600160a01b0393909316845291905290205460ff1690565b60606001805461075c9061358a565b610934338383612296565b600060606115338461211b565b61154f5760405162461bcd60e51b815260040161087a906137fa565b600084815260106020526040812080546115689061358a565b80601f01602080910402602001604051908101604052809291908181526020018280546115949061358a565b80156115e15780601f106115b6576101008083540402835291602001916115e1565b820191906000526020600020905b8154815290600101906020018083116115c457829003601f168201915b5050600c5460405163f188737b60e01b81529495506001600160a01b03169363f188737b9350611619925085915088906004016136c4565b600060405180830381865afa158015611636573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261165e9190810190613612565b92509250509250929050565b600d548490849084906001600160a01b0316156116e857600d5460405163c771eeef60e01b81526001600160a01b039091169063c771eeef906116b5908690869086906004016135c4565b600060405180830381600087803b1580156116cf57600080fd5b505af11580156116e3573d6000803e3d6000fd5b505050505b6116f4878787876120c9565b600d546001600160a01b03161561176c57600d54604051635cf8305b60e01b81526001600160a01b0390911690635cf8305b90611739908690869086906004016135c4565b600060405180830381600087803b15801561175357600080fd5b505af1158015611767573d6000803e3d6000fd5b505050505b50505050505050565b606061178082611e1b565b600061178a612364565b905060008151116117aa57604051806020016040528060008152506114a8565b806117b484612373565b6040516020016117c59291906138a6565b6040516020818303038152906040529392505050565b6117e4856111e5565b6001600160a01b0316336001600160a01b0316148061180957506118096000336114e1565b6118255760405162461bcd60e51b815260040161087a906137a9565b61182e8561211b565b61184a5760405162461bcd60e51b815260040161087a906137fa565b600085815260106020526040812080546118639061358a565b80601f016020809104026020016040519081016040528092919081815260200182805461188f9061358a565b80156118dc5780601f106118b1576101008083540402835291602001916118dc565b820191906000526020600020905b8154815290600101906020018083116118bf57829003601f168201915b5050600c5460405163cf468f4560e01b81529495506001600160a01b03169363cf468f459350610a06925085915089908990899089906004016138d5565b60007f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a661194681611ed9565b6000848460405160200161195b92919061369e565b60408051601f1981840301815291815281516020928301206000818152600f90935291205490915060ff16156119a35760405162461bcd60e51b815260040161087a90613738565b60006119ae60125490565b90506119be601280546001019055565b6119c88782612101565b6000828152600f60209081526040808320805460ff19166001179055838352601090915290206119f9908787612d9c565b5060009182526011602052604090912081905595945050505050565b6000828152600b6020526040902060010154611a3081611ed9565b61091b8383611fcf565b6000600f600083604051602001611a519190613939565b60408051601f198184030181529181528151602092830120835290820192909252016000205460ff1692915050565b601060205260009081526040902080546113929061358a565b600085604051602001611aac9190613939565b60408051601f19818403018152918152815160209283012060008181526011909352912054909150611add816111e5565b6001600160a01b0316336001600160a01b03161480611b025750611b026000336114e1565b611b1e5760405162461bcd60e51b815260040161087a906137a9565b611b278161211b565b611b435760405162461bcd60e51b815260040161087a906137fa565b600c5460405163cf468f4560e01b81526001600160a01b039091169063cf468f4590611739908a908a908a908a908a906004016138d5565b600084604051602001611b8e9190613939565b60408051601f19818403018152918152815160209283012060008181526011909352912054909150611bbf816111e5565b6001600160a01b0316336001600160a01b03161480611be45750611be46000336114e1565b611c005760405162461bcd60e51b815260040161087a906137a9565b611c098161211b565b611c255760405162461bcd60e51b815260040161087a906137fa565b600c5460405163cf468f4560e01b81526001600160a01b039091169063cf468f4590610a06908990899089908990600401613845565b60606000611c6a836002613955565b611c75906002613974565b6001600160401b03811115611c8c57611c8c612f7b565b6040519080825280601f01601f191660200182016040528015611cb6576020820181803683370190505b509050600360fc1b81600081518110611cd157611cd16136ae565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110611d0057611d006136ae565b60200101906001600160f81b031916908160001a9053506000611d24846002613955565b611d2f906001613974565b90505b6001811115611da7576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110611d6357611d636136ae565b1a60f81b828281518110611d7957611d796136ae565b60200101906001600160f81b031916908160001a90535060049490941c93611da08161398c565b9050611d32565b5083156114a85760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161087a565b60006001600160e01b03198216637965db0b60e01b148061074757506107478261247b565b611e248161211b565b610c2c5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b604482015260640161087a565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611ea0826111e5565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b610c2c81336124a0565b6040516001600160a01b038216904780156108fc02916000818181858888f19350505050158015610934573d6000803e3d6000fd5b611f223382612504565b611f3e5760405162461bcd60e51b815260040161087a906139a3565b61091b838383612582565b611f5382826114e1565b610934576000828152600b602090815260408083206001600160a01b03851684529091529020805460ff19166001179055611f8b3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b611fd982826114e1565b15610934576000828152600b602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b600a5460ff1661207f5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015260640161087a565b600a805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6120d33383612504565b6120ef5760405162461bcd60e51b815260040161087a906139a3565b6120fb84848484612733565b50505050565b610934828260405180602001604052806000815250612766565b6000908152600260205260409020546001600160a01b0316151590565b6040516370a0823160e01b815230600482015281906001600160a01b0382169063a9059cbb90859083906370a0823190602401602060405180830381865afa158015612188573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121ac91906139f0565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af11580156121f7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120fb9190613a09565b600a5460ff16156122615760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640161087a565b600a805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586120ac3390565b816001600160a01b0316836001600160a01b0316036122f75760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161087a565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6060600e805461075c9061358a565b60608160000361239a5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156123c457806123ae81613790565b91506123bd9050600a83613a3c565b915061239e565b6000816001600160401b038111156123de576123de612f7b565b6040519080825280601f01601f191660200182016040528015612408576020820181803683370190505b5090505b84156124735761241d600183613a50565b915061242a600a86613a67565b612435906030613974565b60f81b81838151811061244a5761244a6136ae565b60200101906001600160f81b031916908160001a90535061246c600a86613a3c565b945061240c565b949350505050565b60006001600160e01b0319821663780e9d6360e01b1480610747575061074782612799565b6124aa82826114e1565b610934576124c2816001600160a01b03166014611c5b565b6124cd836020611c5b565b6040516020016124de929190613a7b565b60408051601f198184030181529082905262461bcd60e51b825261087a91600401612eb0565b600080612510836111e5565b9050806001600160a01b0316846001600160a01b0316148061255757506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b806124735750836001600160a01b0316612570846107df565b6001600160a01b031614949350505050565b826001600160a01b0316612595826111e5565b6001600160a01b0316146125bb5760405162461bcd60e51b815260040161087a90613af0565b6001600160a01b03821661261d5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161087a565b6126288383836127e9565b826001600160a01b031661263b826111e5565b6001600160a01b0316146126615760405162461bcd60e51b815260040161087a90613af0565b600081815260046020908152604080832080546001600160a01b03191690556001600160a01b0386168352600390915281208054600192906126a4908490613a50565b90915550506001600160a01b03821660009081526003602052604081208054600192906126d2908490613974565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b61273e848484612582565b61274a8484848461283a565b6120fb5760405162461bcd60e51b815260040161087a90613b35565b612770838361293b565b61277d600084848461283a565b61091b5760405162461bcd60e51b815260040161087a90613b35565b60006001600160e01b031982166380ac58cd60e01b14806127ca57506001600160e01b03198216635b5e139f60e01b145b8061074757506301ffc9a760e01b6001600160e01b0319831614610747565b600a5460ff161561282f5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640161087a565b61091b838383612ad0565b60006001600160a01b0384163b1561293057604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061287e903390899088908890600401613b87565b6020604051808303816000875af19250505080156128b9575060408051601f3d908101601f191682019092526128b691810190613bc4565b60015b612916573d8080156128e7576040519150601f19603f3d011682016040523d82523d6000602084013e6128ec565b606091505b50805160000361290e5760405162461bcd60e51b815260040161087a90613b35565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612473565b506001949350505050565b6001600160a01b0382166129915760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161087a565b61299a8161211b565b156129e75760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161087a565b6129f3600083836127e9565b6129fc8161211b565b15612a495760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161087a565b6001600160a01b0382166000908152600360205260408120805460019290612a72908490613974565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6001600160a01b038316612b2b57612b2681600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612b4e565b816001600160a01b0316836001600160a01b031614612b4e57612b4e8382612b88565b6001600160a01b038216612b655761091b81612c25565b826001600160a01b0316826001600160a01b03161461091b5761091b8282612cd4565b60006001612b9584611413565b612b9f9190613a50565b600083815260076020526040902054909150808214612bf2576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612c3790600190613a50565b60008381526009602052604081205460088054939450909284908110612c5f57612c5f6136ae565b906000526020600020015490508060088381548110612c8057612c806136ae565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612cb857612cb8613be1565b6001900381819060005260206000200160009055905550505050565b6000612cdf83611413565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b828054612d249061358a565b90600052602060002090601f016020900481019282612d465760008555612d8c565b82601f10612d5f57805160ff1916838001178555612d8c565b82800160010185558215612d8c579182015b82811115612d8c578251825591602001919060010190612d71565b50612d98929150612e10565b5090565b828054612da89061358a565b90600052602060002090601f016020900481019282612dca5760008555612d8c565b82601f10612de35782800160ff19823516178555612d8c565b82800160010185558215612d8c579182015b82811115612d8c578235825591602001919060010190612df5565b5b80821115612d985760008155600101612e11565b6001600160e01b031981168114610c2c57600080fd5b600060208284031215612e4d57600080fd5b81356114a881612e25565b60005b83811015612e73578181015183820152602001612e5b565b838111156120fb5750506000910152565b60008151808452612e9c816020860160208601612e58565b601f01601f19169290920160200192915050565b6020815260006114a86020830184612e84565b600060208284031215612ed557600080fd5b5035919050565b6001600160a01b0381168114610c2c57600080fd5b60008060408385031215612f0457600080fd5b8235612f0f81612edc565b946020939093013593505050565b600060208284031215612f2f57600080fd5b81356114a881612edc565b600080600060608486031215612f4f57600080fd5b8335612f5a81612edc565b92506020840135612f6a81612edc565b929592945050506040919091013590565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715612fb957612fb9612f7b565b604052919050565b60006001600160401b03821115612fda57612fda612f7b565b50601f01601f191660200190565b6000612ffb612ff684612fc1565b612f91565b905082815283838301111561300f57600080fd5b828260208301376000602084830101529392505050565b600082601f83011261303757600080fd5b6114a883833560208501612fe8565b60006020828403121561305857600080fd5b81356001600160401b0381111561306e57600080fd5b61247384828501613026565b6002811061309857634e487b7160e01b600052602160045260246000fd5b9052565b6130a6818461307a565b6040602082015260006124736040830184612e84565b600080604083850312156130cf57600080fd5b8235915060208301356130e181612edc565b809150509250929050565b60008083601f8401126130fe57600080fd5b5081356001600160401b0381111561311557600080fd5b602083019150836020828501011115610edc57600080fd5b6000806020838503121561314057600080fd5b82356001600160401b0381111561315657600080fd5b613162858286016130ec565b90969095509350505050565b6000806040838503121561318157600080fd5b82356001600160401b038082111561319857600080fd5b6131a486838701613026565b935060208501359150808211156131ba57600080fd5b506131c785828601613026565b9150509250929050565b6000806000604084860312156131e657600080fd5b83356131f181612edc565b925060208401356001600160401b038082111561320d57600080fd5b818601915086601f83011261322157600080fd5b81358181111561323057600080fd5b8760208260051b850101111561324557600080fd5b6020830194508093505050509250925092565b60028110610c2c57600080fd5b6000806000806080858703121561327b57600080fd5b8435935060208501356001600160401b0381111561329857600080fd5b6132a487828801613026565b93505060408501356132b581613258565b915060608501356132c581612edc565b939692955090935050565b600080604083850312156132e357600080fd5b82356132ee81612edc565b915060208301356130e181612edc565b8015158114610c2c57600080fd5b6000806040838503121561331f57600080fd5b823561332a81612edc565b915060208301356130e1816132fe565b6000806040838503121561334d57600080fd5b8235915060208301356001600160401b0381111561336a57600080fd5b6131c785828601613026565b6000806000806080858703121561338c57600080fd5b843561339781612edc565b935060208501356133a781612edc565b92506040850135915060608501356001600160401b038111156133c957600080fd5b8501601f810187136133da57600080fd5b6133e987823560208401612fe8565b91505092959194509250565b600080600080600060a0868803121561340d57600080fd5b8535945060208601356001600160401b038082111561342b57600080fd5b61343789838a01613026565b9550604088013591508082111561344d57600080fd5b5061345a88828901613026565b935050606086013561346b81613258565b9150608086013561347b81612edc565b809150509295509295909350565b60008060006040848603121561349e57600080fd5b83356134a981612edc565b925060208401356001600160401b038111156134c457600080fd5b6134d0868287016130ec565b9497909650939450505050565b600080600080600060a086880312156134f557600080fd5b85356001600160401b038082111561350c57600080fd5b61351889838a01613026565b9650602088013591508082111561342b57600080fd5b6000806000806080858703121561354457600080fd5b84356001600160401b038082111561355b57600080fd5b61356788838901613026565b9550602087013591508082111561357d57600080fd5b506132a487828801613026565b600181811c9082168061359e57607f821691505b6020821081036135be57634e487b7160e01b600052602260045260246000fd5b50919050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6040815260006135fb6040830184612e84565b828103602093840152600081529190910192915050565b6000806040838503121561362557600080fd5b825161363081613258565b60208401519092506001600160401b0381111561364c57600080fd5b8301601f8101851361365d57600080fd5b805161366b612ff682612fc1565b81815286602083850101111561368057600080fd5b613691826020830160208601612e58565b8093505050509250929050565b8183823760009101908152919050565b634e487b7160e01b600052603260045260246000fd5b6040815260006136d76040830185612e84565b82810360208401526136e98185612e84565b95945050505050565b6000808335601e1984360301811261370957600080fd5b8301803591506001600160401b0382111561372357600080fd5b602001915036819003821315610edc57600080fd5b60208082526022908201527f424e534e46543a20446f6d61696e206e616d6520616c72656164792065786973604082015261747360f01b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b6000600182016137a2576137a261377a565b5060010190565b60208082526031908201527f424e534e46543a204f6e6c792061646d696e206f7220746f6b656e206f776e656040820152701c8818d85b881cd95d0818dbdb9d195b9d607a1b606082015260800190565b6020808252602b908201527f424e534e46543a20436f6e74656e7420717565727920666f72206e6f6e65786960408201526a39ba32b73a103a37b5b2b760a91b606082015260800190565b60a08152600061385860a0830187612e84565b828103806020850152600082526020810160408501525061387c6020820187612e84565b91505061388c606083018561307a565b6001600160a01b0392909216608091909101529392505050565b600083516138b8818460208801612e58565b8351908301906138cc818360208801612e58565b01949350505050565b60a0815260006138e860a0830188612e84565b82810360208401526138fa8188612e84565b9050828103604084015261390e8187612e84565b91505061391e606083018561307a565b6001600160a01b039290921660809190910152949350505050565b6000825161394b818460208701612e58565b9190910192915050565b600081600019048311821515161561396f5761396f61377a565b500290565b600082198211156139875761398761377a565b500190565b60008161399b5761399b61377a565b506000190190565b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b600060208284031215613a0257600080fd5b5051919050565b600060208284031215613a1b57600080fd5b81516114a8816132fe565b634e487b7160e01b600052601260045260246000fd5b600082613a4b57613a4b613a26565b500490565b600082821015613a6257613a6261377a565b500390565b600082613a7657613a76613a26565b500690565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351613ab3816017850160208801612e58565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351613ae4816028840160208801612e58565b01602801949350505050565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613bba90830184612e84565b9695505050505050565b600060208284031215613bd657600080fd5b81516114a881612e25565b634e487b7160e01b600052603160045260246000fdfea2646970667358221220bbe5607bddbb94c3bff97f98a76159b2cb6ddf265813dd41beff45e6a299140f64736f6c634300080e003368747470733a2f2f6d61726b6574696e672d736572766963652e7733646e612e6e65742f6170692f76312f6d657461646174612f
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102f15760003560e01c80636341ca0b1161019d578063c87b56dd116100e9578063d91e1a9e116100a2578063e63ab1e91161007c578063e63ab1e9146106b3578063e985e9c5146106da578063ea6ab6ee14610716578063f4a15af21461072957600080fd5b8063d91e1a9e1461067a578063dd8bf9671461068d578063e4329b7c146106a057600080fd5b8063c87b56dd146105f4578063d173126414610607578063d204c45e1461061a578063d53913931461062d578063d547741f14610654578063d65671ab1461066757600080fd5b80638456cb5911610156578063a217fddf11610130578063a217fddf146105b3578063a22cb465146105bb578063a907a897146105ce578063b88d4fde146105e157600080fd5b80638456cb591461059057806391d148541461059857806395d89b41146105ab57600080fd5b80636341ca0b146105295780636352211e1461053c578063649b14a21461054f5780636c0360eb1461056257806370a082311461056a5780637c3b4df71461057d57600080fd5b806336568abe1161025c578063480ad3191161021557806355f804b3116101ef57806355f804b3146104e557806358dd6d95146104f85780635c975abb1461050b5780635e1ee2601461051657600080fd5b8063480ad319146104ac5780634f6ccce7146104bf57806353784aae146104d257600080fd5b806336568abe146104385780633be0f6251461044b5780633f4ba83a1461046b578063420fd0961461047357806342842e0e1461048657806343cefa1d1461049957600080fd5b80631a5d0348116102ae5780631a5d03481461039857806323b872dd146103bb578063248a9ca3146103ce5780632b5ab31b146103f15780632f2ff15d146104125780632f745c591461042557600080fd5b806301ffc9a7146102f657806306fdde031461031e578063081812fc14610333578063095ea7b31461035e57806310a76fb11461037357806318160ddd14610386575b600080fd5b610309610304366004612e3b565b61073c565b60405190151581526020015b60405180910390f35b61032661074d565b6040516103159190612eb0565b610346610341366004612ec3565b6107df565b6040516001600160a01b039091168152602001610315565b61037161036c366004612ef1565b610806565b005b610371610381366004612f1d565b610920565b6008545b604051908152602001610315565b6103096103a6366004612ec3565b600f6020526000908152604090205460ff1681565b6103716103c9366004612f3a565b610938565b61038a6103dc366004612ec3565b6000908152600b602052604090206001015490565b6104046103ff366004613046565b610a41565b60405161031592919061309c565b6103716104203660046130bc565b610ac5565b61038a610433366004612ef1565b610aea565b6103716104463660046130bc565b610b80565b61038a610459366004612ec3565b60116020526000908152604090205481565b610371610bfa565b610371610481366004612f1d565b610c2f565b610371610494366004612f3a565b610c5d565b61038a6104a736600461312d565b610cf6565b6103716104ba366004612f1d565b610d99565b61038a6104cd366004612ec3565b610dc7565b6104046104e036600461316e565b610e5a565b6103716104f3366004613046565b610ee3565b6103716105063660046131d1565b610f01565b600a5460ff16610309565b610371610524366004613265565b61105a565b6103716105373660046132d0565b6111d0565b61034661054a366004612ec3565b6111e5565b61040461055d366004612ec3565b611245565b610326611385565b61038a610578366004612f1d565b611413565b61034661058b36600461312d565b611499565b6103716114af565b6103096105a63660046130bc565b6114e1565b61032661150c565b61038a600081565b6103716105c936600461330c565b61151b565b6104046105dc36600461333a565b611526565b6103716105ef366004613376565b61166a565b610326610602366004612ec3565b611775565b6103716106153660046133f5565b6117db565b61038a610628366004613489565b61191a565b61038a7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b6103716106623660046130bc565b611a15565b610309610675366004613046565b611a3a565b610326610688366004612ec3565b611a80565b61037161069b3660046134dd565b611a99565b600d54610346906001600160a01b031681565b61038a7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b6103096106e83660046132d0565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b600c54610346906001600160a01b031681565b61037161073736600461352e565b611b7b565b600061074782611df6565b92915050565b60606000805461075c9061358a565b80601f01602080910402602001604051908101604052809291908181526020018280546107889061358a565b80156107d55780601f106107aa576101008083540402835291602001916107d5565b820191906000526020600020905b8154815290600101906020018083116107b857829003601f168201915b5050505050905090565b60006107ea82611e1b565b506000908152600460205260409020546001600160a01b031690565b6000610811826111e5565b9050806001600160a01b0316836001600160a01b0316036108835760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b038216148061089f575061089f81336106e8565b6109115760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000606482015260840161087a565b61091b8383611e6b565b505050565b600061092b81611ed9565b61093482611ee3565b5050565b600d548390839083906001600160a01b0316156109b657600d5460405163c771eeef60e01b81526001600160a01b039091169063c771eeef90610983908690869086906004016135c4565b600060405180830381600087803b15801561099d57600080fd5b505af11580156109b1573d6000803e3d6000fd5b505050505b6109c1868686611f18565b600d546001600160a01b031615610a3957600d54604051635cf8305b60e01b81526001600160a01b0390911690635cf8305b90610a06908690869086906004016135c4565b600060405180830381600087803b158015610a2057600080fd5b505af1158015610a34573d6000803e3d6000fd5b505050505b505050505050565b600c5460405163f188737b60e01b81526000916060916001600160a01b039091169063f188737b90610a779086906004016135e8565b600060405180830381865afa158015610a94573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610abc9190810190613612565b91509150915091565b6000828152600b6020526040902060010154610ae081611ed9565b61091b8383611f49565b6000610af583611413565b8210610b575760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161087a565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6001600160a01b0381163314610bf05760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b606482015260840161087a565b6109348282611fcf565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610c2481611ed9565b610c2c612036565b50565b6000610c3a81611ed9565b50600c80546001600160a01b0319166001600160a01b0392909216919091179055565b600d548390839083906001600160a01b031615610cdb57600d5460405163c771eeef60e01b81526001600160a01b039091169063c771eeef90610ca8908690869086906004016135c4565b600060405180830381600087803b158015610cc257600080fd5b505af1158015610cd6573d6000803e3d6000fd5b505050505b6109c1868686604051806020016040528060008152506120c9565b6000808383604051602001610d0c92919061369e565b60408051601f1981840301815291815281516020928301206000818152600f90935291205490915060ff16610d835760405162461bcd60e51b815260206004820152601e60248201527f424e534e46543a20446f6d61696e206e616d65206e6f74206578697374730000604482015260640161087a565b6000908152601160205260409020549392505050565b6000610da481611ed9565b50600d80546001600160a01b0319166001600160a01b0392909216919091179055565b6000610dd260085490565b8210610e355760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161087a565b60088281548110610e4857610e486136ae565b90600052602060002001549050919050565b600c5460405163f188737b60e01b81526000916060916001600160a01b039091169063f188737b90610e9290879087906004016136c4565b600060405180830381865afa158015610eaf573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610ed79190810190613612565b915091505b9250929050565b6000610eee81611ed9565b815161091b90600e906020850190612d18565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6610f2b81611ed9565b60005b82811015611053576000848483818110610f4a57610f4a6136ae565b9050602002810190610f5c91906136f2565b604051602001610f6d92919061369e565b60408051601f1981840301815291815281516020928301206000818152600f90935291205490915060ff1615610fb55760405162461bcd60e51b815260040161087a90613738565b6000610fc060125490565b9050610fd0601280546001019055565b610fda8782612101565b6000828152600f60205260409020805460ff19166001179055858584818110611005576110056136ae565b905060200281019061101791906136f2565b6000838152601060205260409020611030929091612d9c565b50600091825260116020526040909120558061104b81613790565b915050610f2e565b5050505050565b611063846111e5565b6001600160a01b0316336001600160a01b0316148061108857506110886000336114e1565b6110a45760405162461bcd60e51b815260040161087a906137a9565b6110ad8461211b565b6110c95760405162461bcd60e51b815260040161087a906137fa565b600084815260106020526040812080546110e29061358a565b80601f016020809104026020016040519081016040528092919081815260200182805461110e9061358a565b801561115b5780601f106111305761010080835404028352916020019161115b565b820191906000526020600020905b81548152906001019060200180831161113e57829003601f168201915b5050600c5460405163cf468f4560e01b81529495506001600160a01b03169363cf468f4593506111979250859150889088908890600401613845565b600060405180830381600087803b1580156111b157600080fd5b505af11580156111c5573d6000803e3d6000fd5b505050505050505050565b60006111db81611ed9565b61091b8383612138565b6000818152600260205260408120546001600160a01b0316806107475760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b604482015260640161087a565b600060606112528361211b565b61126e5760405162461bcd60e51b815260040161087a906137fa565b600083815260106020526040812080546112879061358a565b80601f01602080910402602001604051908101604052809291908181526020018280546112b39061358a565b80156113005780601f106112d557610100808354040283529160200191611300565b820191906000526020600020905b8154815290600101906020018083116112e357829003601f168201915b5050600c5460405163f188737b60e01b81529495506001600160a01b03169363f188737b935061133692508591506004016135e8565b600060405180830381865afa158015611353573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261137b9190810190613612565b9250925050915091565b600e80546113929061358a565b80601f01602080910402602001604051908101604052809291908181526020018280546113be9061358a565b801561140b5780601f106113e05761010080835404028352916020019161140b565b820191906000526020600020905b8154815290600101906020018083116113ee57829003601f168201915b505050505081565b60006001600160a01b03821661147d5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b606482015260840161087a565b506001600160a01b031660009081526003602052604090205490565b60006114a861054a8484610cf6565b9392505050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a6114d981611ed9565b610c2c61221b565b6000918252600b602090815260408084206001600160a01b0393909316845291905290205460ff1690565b60606001805461075c9061358a565b610934338383612296565b600060606115338461211b565b61154f5760405162461bcd60e51b815260040161087a906137fa565b600084815260106020526040812080546115689061358a565b80601f01602080910402602001604051908101604052809291908181526020018280546115949061358a565b80156115e15780601f106115b6576101008083540402835291602001916115e1565b820191906000526020600020905b8154815290600101906020018083116115c457829003601f168201915b5050600c5460405163f188737b60e01b81529495506001600160a01b03169363f188737b9350611619925085915088906004016136c4565b600060405180830381865afa158015611636573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261165e9190810190613612565b92509250509250929050565b600d548490849084906001600160a01b0316156116e857600d5460405163c771eeef60e01b81526001600160a01b039091169063c771eeef906116b5908690869086906004016135c4565b600060405180830381600087803b1580156116cf57600080fd5b505af11580156116e3573d6000803e3d6000fd5b505050505b6116f4878787876120c9565b600d546001600160a01b03161561176c57600d54604051635cf8305b60e01b81526001600160a01b0390911690635cf8305b90611739908690869086906004016135c4565b600060405180830381600087803b15801561175357600080fd5b505af1158015611767573d6000803e3d6000fd5b505050505b50505050505050565b606061178082611e1b565b600061178a612364565b905060008151116117aa57604051806020016040528060008152506114a8565b806117b484612373565b6040516020016117c59291906138a6565b6040516020818303038152906040529392505050565b6117e4856111e5565b6001600160a01b0316336001600160a01b0316148061180957506118096000336114e1565b6118255760405162461bcd60e51b815260040161087a906137a9565b61182e8561211b565b61184a5760405162461bcd60e51b815260040161087a906137fa565b600085815260106020526040812080546118639061358a565b80601f016020809104026020016040519081016040528092919081815260200182805461188f9061358a565b80156118dc5780601f106118b1576101008083540402835291602001916118dc565b820191906000526020600020905b8154815290600101906020018083116118bf57829003601f168201915b5050600c5460405163cf468f4560e01b81529495506001600160a01b03169363cf468f459350610a06925085915089908990899089906004016138d5565b60007f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a661194681611ed9565b6000848460405160200161195b92919061369e565b60408051601f1981840301815291815281516020928301206000818152600f90935291205490915060ff16156119a35760405162461bcd60e51b815260040161087a90613738565b60006119ae60125490565b90506119be601280546001019055565b6119c88782612101565b6000828152600f60209081526040808320805460ff19166001179055838352601090915290206119f9908787612d9c565b5060009182526011602052604090912081905595945050505050565b6000828152600b6020526040902060010154611a3081611ed9565b61091b8383611fcf565b6000600f600083604051602001611a519190613939565b60408051601f198184030181529181528151602092830120835290820192909252016000205460ff1692915050565b601060205260009081526040902080546113929061358a565b600085604051602001611aac9190613939565b60408051601f19818403018152918152815160209283012060008181526011909352912054909150611add816111e5565b6001600160a01b0316336001600160a01b03161480611b025750611b026000336114e1565b611b1e5760405162461bcd60e51b815260040161087a906137a9565b611b278161211b565b611b435760405162461bcd60e51b815260040161087a906137fa565b600c5460405163cf468f4560e01b81526001600160a01b039091169063cf468f4590611739908a908a908a908a908a906004016138d5565b600084604051602001611b8e9190613939565b60408051601f19818403018152918152815160209283012060008181526011909352912054909150611bbf816111e5565b6001600160a01b0316336001600160a01b03161480611be45750611be46000336114e1565b611c005760405162461bcd60e51b815260040161087a906137a9565b611c098161211b565b611c255760405162461bcd60e51b815260040161087a906137fa565b600c5460405163cf468f4560e01b81526001600160a01b039091169063cf468f4590610a06908990899089908990600401613845565b60606000611c6a836002613955565b611c75906002613974565b6001600160401b03811115611c8c57611c8c612f7b565b6040519080825280601f01601f191660200182016040528015611cb6576020820181803683370190505b509050600360fc1b81600081518110611cd157611cd16136ae565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110611d0057611d006136ae565b60200101906001600160f81b031916908160001a9053506000611d24846002613955565b611d2f906001613974565b90505b6001811115611da7576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110611d6357611d636136ae565b1a60f81b828281518110611d7957611d796136ae565b60200101906001600160f81b031916908160001a90535060049490941c93611da08161398c565b9050611d32565b5083156114a85760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161087a565b60006001600160e01b03198216637965db0b60e01b148061074757506107478261247b565b611e248161211b565b610c2c5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b604482015260640161087a565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611ea0826111e5565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b610c2c81336124a0565b6040516001600160a01b038216904780156108fc02916000818181858888f19350505050158015610934573d6000803e3d6000fd5b611f223382612504565b611f3e5760405162461bcd60e51b815260040161087a906139a3565b61091b838383612582565b611f5382826114e1565b610934576000828152600b602090815260408083206001600160a01b03851684529091529020805460ff19166001179055611f8b3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b611fd982826114e1565b15610934576000828152600b602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b600a5460ff1661207f5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015260640161087a565b600a805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6120d33383612504565b6120ef5760405162461bcd60e51b815260040161087a906139a3565b6120fb84848484612733565b50505050565b610934828260405180602001604052806000815250612766565b6000908152600260205260409020546001600160a01b0316151590565b6040516370a0823160e01b815230600482015281906001600160a01b0382169063a9059cbb90859083906370a0823190602401602060405180830381865afa158015612188573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121ac91906139f0565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af11580156121f7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120fb9190613a09565b600a5460ff16156122615760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640161087a565b600a805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586120ac3390565b816001600160a01b0316836001600160a01b0316036122f75760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161087a565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6060600e805461075c9061358a565b60608160000361239a5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156123c457806123ae81613790565b91506123bd9050600a83613a3c565b915061239e565b6000816001600160401b038111156123de576123de612f7b565b6040519080825280601f01601f191660200182016040528015612408576020820181803683370190505b5090505b84156124735761241d600183613a50565b915061242a600a86613a67565b612435906030613974565b60f81b81838151811061244a5761244a6136ae565b60200101906001600160f81b031916908160001a90535061246c600a86613a3c565b945061240c565b949350505050565b60006001600160e01b0319821663780e9d6360e01b1480610747575061074782612799565b6124aa82826114e1565b610934576124c2816001600160a01b03166014611c5b565b6124cd836020611c5b565b6040516020016124de929190613a7b565b60408051601f198184030181529082905262461bcd60e51b825261087a91600401612eb0565b600080612510836111e5565b9050806001600160a01b0316846001600160a01b0316148061255757506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b806124735750836001600160a01b0316612570846107df565b6001600160a01b031614949350505050565b826001600160a01b0316612595826111e5565b6001600160a01b0316146125bb5760405162461bcd60e51b815260040161087a90613af0565b6001600160a01b03821661261d5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161087a565b6126288383836127e9565b826001600160a01b031661263b826111e5565b6001600160a01b0316146126615760405162461bcd60e51b815260040161087a90613af0565b600081815260046020908152604080832080546001600160a01b03191690556001600160a01b0386168352600390915281208054600192906126a4908490613a50565b90915550506001600160a01b03821660009081526003602052604081208054600192906126d2908490613974565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b61273e848484612582565b61274a8484848461283a565b6120fb5760405162461bcd60e51b815260040161087a90613b35565b612770838361293b565b61277d600084848461283a565b61091b5760405162461bcd60e51b815260040161087a90613b35565b60006001600160e01b031982166380ac58cd60e01b14806127ca57506001600160e01b03198216635b5e139f60e01b145b8061074757506301ffc9a760e01b6001600160e01b0319831614610747565b600a5460ff161561282f5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640161087a565b61091b838383612ad0565b60006001600160a01b0384163b1561293057604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061287e903390899088908890600401613b87565b6020604051808303816000875af19250505080156128b9575060408051601f3d908101601f191682019092526128b691810190613bc4565b60015b612916573d8080156128e7576040519150601f19603f3d011682016040523d82523d6000602084013e6128ec565b606091505b50805160000361290e5760405162461bcd60e51b815260040161087a90613b35565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612473565b506001949350505050565b6001600160a01b0382166129915760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161087a565b61299a8161211b565b156129e75760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161087a565b6129f3600083836127e9565b6129fc8161211b565b15612a495760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161087a565b6001600160a01b0382166000908152600360205260408120805460019290612a72908490613974565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6001600160a01b038316612b2b57612b2681600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612b4e565b816001600160a01b0316836001600160a01b031614612b4e57612b4e8382612b88565b6001600160a01b038216612b655761091b81612c25565b826001600160a01b0316826001600160a01b03161461091b5761091b8282612cd4565b60006001612b9584611413565b612b9f9190613a50565b600083815260076020526040902054909150808214612bf2576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612c3790600190613a50565b60008381526009602052604081205460088054939450909284908110612c5f57612c5f6136ae565b906000526020600020015490508060088381548110612c8057612c806136ae565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612cb857612cb8613be1565b6001900381819060005260206000200160009055905550505050565b6000612cdf83611413565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b828054612d249061358a565b90600052602060002090601f016020900481019282612d465760008555612d8c565b82601f10612d5f57805160ff1916838001178555612d8c565b82800160010185558215612d8c579182015b82811115612d8c578251825591602001919060010190612d71565b50612d98929150612e10565b5090565b828054612da89061358a565b90600052602060002090601f016020900481019282612dca5760008555612d8c565b82601f10612de35782800160ff19823516178555612d8c565b82800160010185558215612d8c579182015b82811115612d8c578235825591602001919060010190612df5565b5b80821115612d985760008155600101612e11565b6001600160e01b031981168114610c2c57600080fd5b600060208284031215612e4d57600080fd5b81356114a881612e25565b60005b83811015612e73578181015183820152602001612e5b565b838111156120fb5750506000910152565b60008151808452612e9c816020860160208601612e58565b601f01601f19169290920160200192915050565b6020815260006114a86020830184612e84565b600060208284031215612ed557600080fd5b5035919050565b6001600160a01b0381168114610c2c57600080fd5b60008060408385031215612f0457600080fd5b8235612f0f81612edc565b946020939093013593505050565b600060208284031215612f2f57600080fd5b81356114a881612edc565b600080600060608486031215612f4f57600080fd5b8335612f5a81612edc565b92506020840135612f6a81612edc565b929592945050506040919091013590565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715612fb957612fb9612f7b565b604052919050565b60006001600160401b03821115612fda57612fda612f7b565b50601f01601f191660200190565b6000612ffb612ff684612fc1565b612f91565b905082815283838301111561300f57600080fd5b828260208301376000602084830101529392505050565b600082601f83011261303757600080fd5b6114a883833560208501612fe8565b60006020828403121561305857600080fd5b81356001600160401b0381111561306e57600080fd5b61247384828501613026565b6002811061309857634e487b7160e01b600052602160045260246000fd5b9052565b6130a6818461307a565b6040602082015260006124736040830184612e84565b600080604083850312156130cf57600080fd5b8235915060208301356130e181612edc565b809150509250929050565b60008083601f8401126130fe57600080fd5b5081356001600160401b0381111561311557600080fd5b602083019150836020828501011115610edc57600080fd5b6000806020838503121561314057600080fd5b82356001600160401b0381111561315657600080fd5b613162858286016130ec565b90969095509350505050565b6000806040838503121561318157600080fd5b82356001600160401b038082111561319857600080fd5b6131a486838701613026565b935060208501359150808211156131ba57600080fd5b506131c785828601613026565b9150509250929050565b6000806000604084860312156131e657600080fd5b83356131f181612edc565b925060208401356001600160401b038082111561320d57600080fd5b818601915086601f83011261322157600080fd5b81358181111561323057600080fd5b8760208260051b850101111561324557600080fd5b6020830194508093505050509250925092565b60028110610c2c57600080fd5b6000806000806080858703121561327b57600080fd5b8435935060208501356001600160401b0381111561329857600080fd5b6132a487828801613026565b93505060408501356132b581613258565b915060608501356132c581612edc565b939692955090935050565b600080604083850312156132e357600080fd5b82356132ee81612edc565b915060208301356130e181612edc565b8015158114610c2c57600080fd5b6000806040838503121561331f57600080fd5b823561332a81612edc565b915060208301356130e1816132fe565b6000806040838503121561334d57600080fd5b8235915060208301356001600160401b0381111561336a57600080fd5b6131c785828601613026565b6000806000806080858703121561338c57600080fd5b843561339781612edc565b935060208501356133a781612edc565b92506040850135915060608501356001600160401b038111156133c957600080fd5b8501601f810187136133da57600080fd5b6133e987823560208401612fe8565b91505092959194509250565b600080600080600060a0868803121561340d57600080fd5b8535945060208601356001600160401b038082111561342b57600080fd5b61343789838a01613026565b9550604088013591508082111561344d57600080fd5b5061345a88828901613026565b935050606086013561346b81613258565b9150608086013561347b81612edc565b809150509295509295909350565b60008060006040848603121561349e57600080fd5b83356134a981612edc565b925060208401356001600160401b038111156134c457600080fd5b6134d0868287016130ec565b9497909650939450505050565b600080600080600060a086880312156134f557600080fd5b85356001600160401b038082111561350c57600080fd5b61351889838a01613026565b9650602088013591508082111561342b57600080fd5b6000806000806080858703121561354457600080fd5b84356001600160401b038082111561355b57600080fd5b61356788838901613026565b9550602087013591508082111561357d57600080fd5b506132a487828801613026565b600181811c9082168061359e57607f821691505b6020821081036135be57634e487b7160e01b600052602260045260246000fd5b50919050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6040815260006135fb6040830184612e84565b828103602093840152600081529190910192915050565b6000806040838503121561362557600080fd5b825161363081613258565b60208401519092506001600160401b0381111561364c57600080fd5b8301601f8101851361365d57600080fd5b805161366b612ff682612fc1565b81815286602083850101111561368057600080fd5b613691826020830160208601612e58565b8093505050509250929050565b8183823760009101908152919050565b634e487b7160e01b600052603260045260246000fd5b6040815260006136d76040830185612e84565b82810360208401526136e98185612e84565b95945050505050565b6000808335601e1984360301811261370957600080fd5b8301803591506001600160401b0382111561372357600080fd5b602001915036819003821315610edc57600080fd5b60208082526022908201527f424e534e46543a20446f6d61696e206e616d6520616c72656164792065786973604082015261747360f01b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b6000600182016137a2576137a261377a565b5060010190565b60208082526031908201527f424e534e46543a204f6e6c792061646d696e206f7220746f6b656e206f776e656040820152701c8818d85b881cd95d0818dbdb9d195b9d607a1b606082015260800190565b6020808252602b908201527f424e534e46543a20436f6e74656e7420717565727920666f72206e6f6e65786960408201526a39ba32b73a103a37b5b2b760a91b606082015260800190565b60a08152600061385860a0830187612e84565b828103806020850152600082526020810160408501525061387c6020820187612e84565b91505061388c606083018561307a565b6001600160a01b0392909216608091909101529392505050565b600083516138b8818460208801612e58565b8351908301906138cc818360208801612e58565b01949350505050565b60a0815260006138e860a0830188612e84565b82810360208401526138fa8188612e84565b9050828103604084015261390e8187612e84565b91505061391e606083018561307a565b6001600160a01b039290921660809190910152949350505050565b6000825161394b818460208701612e58565b9190910192915050565b600081600019048311821515161561396f5761396f61377a565b500290565b600082198211156139875761398761377a565b500190565b60008161399b5761399b61377a565b506000190190565b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b600060208284031215613a0257600080fd5b5051919050565b600060208284031215613a1b57600080fd5b81516114a8816132fe565b634e487b7160e01b600052601260045260246000fd5b600082613a4b57613a4b613a26565b500490565b600082821015613a6257613a6261377a565b500390565b600082613a7657613a76613a26565b500690565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351613ab3816017850160208801612e58565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351613ae4816028840160208801612e58565b01602801949350505050565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613bba90830184612e84565b9695505050505050565b600060208284031215613bd657600080fd5b81516114a881612e25565b634e487b7160e01b600052603160045260246000fdfea2646970667358221220bbe5607bddbb94c3bff97f98a76159b2cb6ddf265813dd41beff45e6a299140f64736f6c634300080e0033
Deployed Bytecode Sourcemap
56355:9127:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64985:186;;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;64985:186:0;;;;;;;;36543:100;;;:::i;:::-;;;;;;;:::i;38055:171::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1692:32:1;;;1674:51;;1662:2;1647:18;38055:171:0;1528:203:1;37573:416:0;;;;;;:::i;:::-;;:::i;:::-;;65349:128;;;;;;:::i;:::-;;:::i;50618:113::-;50706:10;:17;50618:113;;;2598:25:1;;;2586:2;2571:18;50618:113:0;2452:177:1;56633:48:0;;;;;;:::i;:::-;;;;;;;;;;;;;;;;62870:192;;;;;;:::i;:::-;;:::i;11194:131::-;;;;;;:::i;:::-;11268:7;11295:12;;;:6;:12;;;;;:22;;;;11194:131;59743:212;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;11587:147::-;;;;;;:::i;:::-;;:::i;50286:256::-;;;;;;:::i;:::-;;:::i;12635:218::-;;;;;;:::i;:::-;;:::i;56749:55::-;;;;;;:::i;:::-;;;;;;;;;;;;;;62546:77;;;:::i;58062:157::-;;;;;;:::i;:::-;;:::i;63070:204::-;;;;;;:::i;:::-;;:::i;58393:314::-;;;;;;:::i;:::-;;:::i;57692:188::-;;;;;;:::i;:::-;;:::i;50808:233::-;;;;;;:::i;:::-;;:::i;59477:258::-;;;;;;:::i;:::-;;:::i;62631:121::-;;;;;;:::i;:::-;;:::i;63515:662::-;;;;;;:::i;:::-;;:::i;1807:86::-;1878:7;;;;1807:86;;60569:552;;;;;;:::i;:::-;;:::i;65179:162::-;;;;;;:::i;:::-;;:::i;36254:222::-;;;;;;:::i;:::-;;:::i;59119:350::-;;;;;;:::i;:::-;;:::i;56603:21::-;;;:::i;35985:207::-;;;;;;:::i;:::-;;:::i;58227:158::-;;;;;;:::i;:::-;;:::i;62465:73::-;;;:::i;9686:147::-;;;;;;:::i;:::-;;:::i;36712:104::-;;;:::i;8791:49::-;;8836:4;8791:49;;38298:155;;;;;;:::i;:::-;;:::i;58715:396::-;;;;;;:::i;:::-;;:::i;63282:225::-;;;;;;:::i;:::-;;:::i;36887:281::-;;;;;;:::i;:::-;;:::i;59963:598::-;;;;;;:::i;:::-;;:::i;64185:589::-;;;;;;:::i;:::-;;:::i;56882:62::-;;56920:24;56882:62;;11979:149;;;;;;:::i;:::-;;:::i;57888:166::-;;;;;;:::i;:::-;;:::i;56688:54::-;;;;;;:::i;:::-;;:::i;61774:683::-;;;;;;:::i;:::-;;:::i;56537:57::-;;;;;-1:-1:-1;;;;;56537:57:0;;;56813:62;;56851:24;56813:62;;38524:164;;;;;;:::i;:::-;-1:-1:-1;;;;;38645:25:0;;;38621:4;38645:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;38524:164;56495:35;;;;;-1:-1:-1;;;;;56495:35:0;;;61129:637;;;;;;:::i;:::-;;:::i;64985:186::-;65103:4;65127:36;65151:11;65127:23;:36::i;:::-;65120:43;64985:186;-1:-1:-1;;64985:186:0:o;36543:100::-;36597:13;36630:5;36623:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36543:100;:::o;38055:171::-;38131:7;38151:23;38166:7;38151:14;:23::i;:::-;-1:-1:-1;38194:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;38194:24:0;;38055:171::o;37573:416::-;37654:13;37670:23;37685:7;37670:14;:23::i;:::-;37654:39;;37718:5;-1:-1:-1;;;;;37712:11:0;:2;-1:-1:-1;;;;;37712:11:0;;37704:57;;;;-1:-1:-1;;;37704:57:0;;15535:2:1;37704:57:0;;;15517:21:1;15574:2;15554:18;;;15547:30;15613:34;15593:18;;;15586:62;-1:-1:-1;;;15664:18:1;;;15657:31;15705:19;;37704:57:0;;;;;;;;;690:10;-1:-1:-1;;;;;37796:21:0;;;;:62;;-1:-1:-1;37821:37:0;37838:5;690:10;38524:164;:::i;37821:37::-;37774:173;;;;-1:-1:-1;;;37774:173:0;;15937:2:1;37774:173:0;;;15919:21:1;15976:2;15956:18;;;15949:30;16015:34;15995:18;;;15988:62;16086:31;16066:18;;;16059:59;16135:19;;37774:173:0;15735:425:1;37774:173:0;37960:21;37969:2;37973:7;37960:8;:21::i;:::-;37643:346;37573:416;;:::o;65349:128::-;8836:4;9282:16;8836:4;9282:10;:16::i;:::-;65446:23:::1;65459:9;65446:12;:23::i;:::-;65349:128:::0;;:::o;62870:192::-;57372:24;;62986:4;;62992:2;;62996:7;;-1:-1:-1;;;;;57372:24:0;57364:49;57360:148;;57430:24;;:66;;-1:-1:-1;;;57430:66:0;;-1:-1:-1;;;;;57430:24:0;;;;:47;;:66;;57478:4;;57484:2;;57488:7;;57430:66;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57360:148;63016:38:::1;63036:4;63042:2;63046:7;63016:19;:38::i;:::-;57542:24:::0;;-1:-1:-1;;;;;57542:24:0;57534:49;57530:147;;57600:24;;:65;;-1:-1:-1;;;57600:65:0;;-1:-1:-1;;;;;57600:24:0;;;;:46;;:65;;57647:4;;57653:2;;57657:7;;57600:65;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57530:147;62870:192;;;;;;:::o;59743:212::-;59898:13;;:49;;-1:-1:-1;;;59898:49:0;;59824:38;;59864:13;;-1:-1:-1;;;;;59898:13:0;;;;:33;;:49;;59932:10;;59898:49;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;59898:49:0;;;;;;;;;;;;:::i;:::-;59891:56;;;;59743:212;;;:::o;11587:147::-;11268:7;11295:12;;;:6;:12;;;;;:22;;;9282:16;9293:4;9282:10;:16::i;:::-;11701:25:::1;11712:4;11718:7;11701:10;:25::i;50286:256::-:0;50383:7;50419:23;50436:5;50419:16;:23::i;:::-;50411:5;:31;50403:87;;;;-1:-1:-1;;;50403:87:0;;17990:2:1;50403:87:0;;;17972:21:1;18029:2;18009:18;;;18002:30;18068:34;18048:18;;;18041:62;-1:-1:-1;;;18119:18:1;;;18112:41;18170:19;;50403:87:0;17788:407:1;50403:87:0;-1:-1:-1;;;;;;50508:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;50286:256::o;12635:218::-;-1:-1:-1;;;;;12731:23:0;;690:10;12731:23;12723:83;;;;-1:-1:-1;;;12723:83:0;;18402:2:1;12723:83:0;;;18384:21:1;18441:2;18421:18;;;18414:30;18480:34;18460:18;;;18453:62;-1:-1:-1;;;18531:18:1;;;18524:45;18586:19;;12723:83:0;18200:411:1;12723:83:0;12819:26;12831:4;12837:7;12819:11;:26::i;62546:77::-;56851:24;9282:16;9293:4;9282:10;:16::i;:::-;62605:10:::1;:8;:10::i;:::-;62546:77:::0;:::o;58062:157::-;8836:4;9282:16;8836:4;9282:10;:16::i;:::-;-1:-1:-1;58163:13:0::1;:48:::0;;-1:-1:-1;;;;;;58163:48:0::1;-1:-1:-1::0;;;;;58163:48:0;;;::::1;::::0;;;::::1;::::0;;58062:157::o;63070:204::-;57372:24;;63190:4;;63196:2;;63200:7;;-1:-1:-1;;;;;57372:24:0;57364:49;57360:148;;57430:24;;:66;;-1:-1:-1;;;57430:66:0;;-1:-1:-1;;;;;57430:24:0;;;;:47;;:66;;57478:4;;57484:2;;57488:7;;57430:66;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57360:148;63220:46:::1;63244:4;63250:2;63254:7;63220:46;;;;;;;;;;;::::0;:23:::1;:46::i;58393:314::-:0;58474:7;58495:22;58547:10;;58530:28;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;58530:28:0;;;;;;;;;58520:39;;58530:28;58520:39;;;;58578:32;;;;:16;:32;;;;;;58520:39;;-1:-1:-1;58578:32:0;;58570:75;;;;-1:-1:-1;;;58570:75:0;;19096:2:1;58570:75:0;;;19078:21:1;19135:2;19115:18;;;19108:30;19174:32;19154:18;;;19147:60;19224:18;;58570:75:0;18894:354:1;58570:75:0;58663:36;;;;:20;:36;;;;;;;58393:314;-1:-1:-1;;;58393:314:0:o;57692:188::-;8836:4;9282:16;8836:4;9282:10;:16::i;:::-;-1:-1:-1;57803:24:0::1;:69:::0;;-1:-1:-1;;;;;;57803:69:0::1;-1:-1:-1::0;;;;;57803:69:0;;;::::1;::::0;;;::::1;::::0;;57692:188::o;50808:233::-;50883:7;50919:30;50706:10;:17;;50618:113;50919:30;50911:5;:38;50903:95;;;;-1:-1:-1;;;50903:95:0;;19455:2:1;50903:95:0;;;19437:21:1;19494:2;19474:18;;;19467:30;19533:34;19513:18;;;19506:62;-1:-1:-1;;;19584:18:1;;;19577:42;19636:19;;50903:95:0;19253:408:1;50903:95:0;51016:10;51027:5;51016:17;;;;;;;;:::i;:::-;;;;;;;;;51009:24;;50808:233;;;:::o;59477:258::-;59668:13;;:59;;-1:-1:-1;;;59668:59:0;;59594:38;;59634:13;;-1:-1:-1;;;;;59668:13:0;;;;:33;;:59;;59702:10;;59714:12;;59668:59;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;59668:59:0;;;;;;;;;;;;:::i;:::-;59661:66;;;;59477:258;;;;;;:::o;62631:121::-;8836:4;9282:16;8836:4;9282:10;:16::i;:::-;62724:20;;::::1;::::0;:7:::1;::::0;:20:::1;::::0;::::1;::::0;::::1;:::i;63515:662::-:0;56920:24;9282:16;9293:4;9282:10;:16::i;:::-;63626:6:::1;63621:549;63638:22:::0;;::::1;63621:549;;;63682:22;63734:11;;63746:1;63734:14;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;63717:32;;;;;;;;;:::i;:::-;;::::0;;-1:-1:-1;;63717:32:0;;::::1;::::0;;;;;;63707:43;;63717:32:::1;63707:43:::0;;::::1;::::0;63774:32:::1;::::0;;;:16:::1;:32:::0;;;;;;63707:43;;-1:-1:-1;63774:32:0::1;;63773:33;63765:80;;;;-1:-1:-1::0;;;63765:80:0::1;;;;;;;:::i;:::-;63860:15;63878:25;:15;15255:14:::0;;15163:114;63878:25:::1;63860:43;;63918:27;:15;15366:19:::0;;15384:1;15366:19;;;15285:115;63918:27:::1;63960:22;63970:2;63974:7;63960:9;:22::i;:::-;63997:32;::::0;;;:16:::1;:32;::::0;;;;:39;;-1:-1:-1;;63997:39:0::1;64032:4;63997:39;::::0;;64083:11;;64095:1;64083:14;;::::1;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;64051:29;::::0;;;:20:::1;:29;::::0;;;;:46:::1;::::0;:29;;:46:::1;:::i;:::-;-1:-1:-1::0;64112:36:0::1;::::0;;;:20:::1;:36;::::0;;;;;:46;63662:3;::::1;::::0;::::1;:::i;:::-;;;;63621:549;;;;63515:662:::0;;;;:::o;60569:552::-;60751:16;60759:7;60751;:16::i;:::-;-1:-1:-1;;;;;60737:30:0;:10;-1:-1:-1;;;;;60737:30:0;;:73;;;-1:-1:-1;60771:39:0;8836:4;60799:10;60771:7;:39::i;:::-;60729:135;;;;-1:-1:-1;;;60729:135:0;;;;;;;:::i;:::-;60883:16;60891:7;60883;:16::i;:::-;60875:72;;;;-1:-1:-1;;;60875:72:0;;;;;;;:::i;:::-;60958:24;60985:29;;;:20;:29;;;;;60958:56;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;61025:13:0;;:88;;-1:-1:-1;;;61025:88:0;;60958:56;;-1:-1:-1;;;;;;61025:13:0;;:33;;-1:-1:-1;61025:88:0;;-1:-1:-1;60958:56:0;;-1:-1:-1;61075:7:0;;61084:11;;61097:15;;61025:88;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60718:403;60569:552;;;;:::o;65179:162::-;8836:4;9282:16;8836:4;9282:10;:16::i;:::-;65293:40:::1;65309:9;65320:12;65293:15;:40::i;36254:222::-:0;36326:7;36362:16;;;:7;:16;;;;;;-1:-1:-1;;;;;36362:16:0;;36389:56;;;;-1:-1:-1;;;36389:56:0;;23219:2:1;36389:56:0;;;23201:21:1;23258:2;23238:18;;;23231:30;-1:-1:-1;;;23277:18:1;;;23270:54;23341:18;;36389:56:0;23017:348:1;59119:350:0;59188:38;59228:13;59263:16;59271:7;59263;:16::i;:::-;59255:72;;;;-1:-1:-1;;;59255:72:0;;;;;;;:::i;:::-;59338:24;59365:29;;;:20;:29;;;;;59338:56;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;59412:13:0;;:49;;-1:-1:-1;;;59412:49:0;;59338:56;;-1:-1:-1;;;;;;59412:13:0;;:33;;-1:-1:-1;59412:49:0;;-1:-1:-1;59338:56:0;;-1:-1:-1;59412:49:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;59412:49:0;;;;;;;;;;;;:::i;:::-;59405:56;;;;;59119:350;;;:::o;56603:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;35985:207::-;36057:7;-1:-1:-1;;;;;36085:19:0;;36077:73;;;;-1:-1:-1;;;36077:73:0;;23572:2:1;36077:73:0;;;23554:21:1;23611:2;23591:18;;;23584:30;23650:34;23630:18;;;23623:62;-1:-1:-1;;;23701:18:1;;;23694:39;23750:19;;36077:73:0;23370:405:1;36077:73:0;-1:-1:-1;;;;;;36168:16:0;;;;;:9;:16;;;;;;;35985:207::o;58227:158::-;58306:7;58334:43;58342:34;58365:10;;58342:22;:34::i;58334:43::-;58327:50;58227:158;-1:-1:-1;;;58227:158:0:o;62465:73::-;56851:24;9282:16;9293:4;9282:10;:16::i;:::-;62522:8:::1;:6;:8::i;9686:147::-:0;9772:4;9796:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;9796:29:0;;;;;;;;;;;;;;;9686:147::o;36712:104::-;36768:13;36801:7;36794:14;;;;;:::i;38298:155::-;38393:52;690:10;38426:8;38436;38393:18;:52::i;58715:396::-;58820:38;58860:13;58895:16;58903:7;58895;:16::i;:::-;58887:72;;;;-1:-1:-1;;;58887:72:0;;;;;;;:::i;:::-;58970:24;58997:29;;;:20;:29;;;;;58970:56;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;59044:13:0;;:59;;-1:-1:-1;;;59044:59:0;;58970:56;;-1:-1:-1;;;;;;59044:13:0;;:33;;-1:-1:-1;59044:59:0;;-1:-1:-1;58970:56:0;;-1:-1:-1;59090:12:0;;59044:59;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;59044:59:0;;;;;;;;;;;;:::i;:::-;59037:66;;;;;58715:396;;;;;:::o;63282:225::-;57372:24;;63421:4;;63427:2;;63431:7;;-1:-1:-1;;;;;57372:24:0;57364:49;57360:148;;57430:24;;:66;;-1:-1:-1;;;57430:66:0;;-1:-1:-1;;;;;57430:24:0;;;;:47;;:66;;57478:4;;57484:2;;57488:7;;57430:66;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57360:148;63451:48:::1;63475:4;63481:2;63485:7;63494:4;63451:23;:48::i;:::-;57542:24:::0;;-1:-1:-1;;;;;57542:24:0;57534:49;57530:147;;57600:24;;:65;;-1:-1:-1;;;57600:65:0;;-1:-1:-1;;;;;57600:24:0;;;;:46;;:65;;57647:4;;57653:2;;57657:7;;57600:65;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57530:147;63282:225;;;;;;;:::o;36887:281::-;36960:13;36986:23;37001:7;36986:14;:23::i;:::-;37022:21;37046:10;:8;:10::i;:::-;37022:34;;37098:1;37080:7;37074:21;:25;:86;;;;;;;;;;;;;;;;;37126:7;37135:18;:7;:16;:18::i;:::-;37109:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;37067:93;36887:281;-1:-1:-1;;;36887:281:0:o;59963:598::-;60181:16;60189:7;60181;:16::i;:::-;-1:-1:-1;;;;;60167:30:0;:10;-1:-1:-1;;;;;60167:30:0;;:73;;;-1:-1:-1;60201:39:0;8836:4;60229:10;60201:7;:39::i;:::-;60159:135;;;;-1:-1:-1;;;60159:135:0;;;;;;;:::i;:::-;60313:16;60321:7;60313;:16::i;:::-;60305:72;;;;-1:-1:-1;;;60305:72:0;;;;;;;:::i;:::-;60388:24;60415:29;;;:20;:29;;;;;60388:56;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;60455:13:0;;:98;;-1:-1:-1;;;60455:98:0;;60388:56;;-1:-1:-1;;;;;;60455:13:0;;:33;;-1:-1:-1;60455:98:0;;-1:-1:-1;60388:56:0;;-1:-1:-1;60501:12:0;;60515:7;;60524:11;;60537:15;;60455:98;;;:::i;64185:589::-;64281:7;56920:24;9282:16;9293:4;9282:10;:16::i;:::-;64301:22:::1;64353:10;;64336:28;;;;;;;;;:::i;:::-;;::::0;;-1:-1:-1;;64336:28:0;;::::1;::::0;;;;;;64326:39;;64336:28:::1;64326:39:::0;;::::1;::::0;64385:32:::1;::::0;;;:16:::1;:32:::0;;;;;;64326:39;;-1:-1:-1;64385:32:0::1;;64384:33;64376:80;;;;-1:-1:-1::0;;;64376:80:0::1;;;;;;;:::i;:::-;64467:15;64485:25;:15;15255:14:::0;;15163:114;64485:25:::1;64467:43;;64521:27;:15;15366:19:::0;;15384:1;15366:19;;;15285:115;64521:27:::1;64559:22;64569:2;64573:7;64559:9;:22::i;:::-;64592:32;::::0;;;:16:::1;:32;::::0;;;;;;;:39;;-1:-1:-1;;64592:39:0::1;64627:4;64592:39;::::0;;64642:29;;;:20:::1;:29:::0;;;;;:42:::1;::::0;64674:10;;64642:42:::1;:::i;:::-;-1:-1:-1::0;64695:36:0::1;::::0;;;:20:::1;:36;::::0;;;;;:46;;;:36;64185:589;-1:-1:-1;;;;;64185:589:0:o;11979:149::-;11268:7;11295:12;;;:6;:12;;;;;:22;;;9282:16;9293:4;9282:10;:16::i;:::-;12094:26:::1;12106:4;12112:7;12094:11;:26::i;57888:166::-:0;57965:4;57989:16;:57;58033:10;58016:28;;;;;;;;:::i;:::-;;;;-1:-1:-1;;58016:28:0;;;;;;;;;58006:39;;58016:28;58006:39;;;;57989:57;;;;;;;;;;-1:-1:-1;57989:57:0;;;;;57888:166;-1:-1:-1;;57888:166:0:o;56688:54::-;;;;;;;;;;;;;;;;:::i;61774:683::-;61985:22;62037:10;62020:28;;;;;;;;:::i;:::-;;;;-1:-1:-1;;62020:28:0;;;;;;;;;62010:39;;62020:28;62010:39;;;;62060:12;62075:36;;;:20;:36;;;;;;62010:39;;-1:-1:-1;62144:16:0;62075:36;62144:7;:16::i;:::-;-1:-1:-1;;;;;62130:30:0;:10;-1:-1:-1;;;;;62130:30:0;;:73;;;-1:-1:-1;62164:39:0;8836:4;62192:10;62164:7;:39::i;:::-;62122:135;;;;-1:-1:-1;;;62122:135:0;;;;;;;:::i;:::-;62276:16;62284:7;62276;:16::i;:::-;62268:72;;;;-1:-1:-1;;;62268:72:0;;;;;;;:::i;:::-;62351:13;;:98;;-1:-1:-1;;;62351:98:0;;-1:-1:-1;;;;;62351:13:0;;;;:33;;:98;;62385:10;;62397:12;;62411:7;;62420:11;;62433:15;;62351:98;;;:::i;61129:637::-;61304:22;61356:10;61339:28;;;;;;;;:::i;:::-;;;;-1:-1:-1;;61339:28:0;;;;;;;;;61329:39;;61339:28;61329:39;;;;61379:12;61394:36;;;:20;:36;;;;;;61329:39;;-1:-1:-1;61463:16:0;61394:36;61463:7;:16::i;:::-;-1:-1:-1;;;;;61449:30:0;:10;-1:-1:-1;;;;;61449:30:0;;:73;;;-1:-1:-1;61483:39:0;8836:4;61511:10;61483:7;:39::i;:::-;61441:135;;;;-1:-1:-1;;;61441:135:0;;;;;;;:::i;:::-;61595:16;61603:7;61595;:16::i;:::-;61587:72;;;;-1:-1:-1;;;61587:72:0;;;;;;;:::i;:::-;61670:13;;:88;;-1:-1:-1;;;61670:88:0;;-1:-1:-1;;;;;61670:13:0;;;;:33;;:88;;61704:10;;61720:7;;61729:11;;61742:15;;61670:88;;;:::i;8100:451::-;8175:13;8201:19;8233:10;8237:6;8233:1;:10;:::i;:::-;:14;;8246:1;8233:14;:::i;:::-;-1:-1:-1;;;;;8223:25:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8223:25:0;;8201:47;;-1:-1:-1;;;8259:6:0;8266:1;8259:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;8259:15:0;;;;;;;;;-1:-1:-1;;;8285:6:0;8292:1;8285:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;8285:15:0;;;;;;;;-1:-1:-1;8316:9:0;8328:10;8332:6;8328:1;:10;:::i;:::-;:14;;8341:1;8328:14;:::i;:::-;8316:26;;8311:135;8348:1;8344;:5;8311:135;;;-1:-1:-1;;;8396:5:0;8404:3;8396:11;8383:25;;;;;;;:::i;:::-;;;;8371:6;8378:1;8371:9;;;;;;;;:::i;:::-;;;;:37;-1:-1:-1;;;;;8371:37:0;;;;;;;;-1:-1:-1;8433:1:0;8423:11;;;;;8351:3;;;:::i;:::-;;;8311:135;;;-1:-1:-1;8464:10:0;;8456:55;;;;-1:-1:-1;;;8456:55:0;;25942:2:1;8456:55:0;;;25924:21:1;;;25961:18;;;25954:30;26020:34;26000:18;;;25993:62;26072:18;;8456:55:0;25740:356:1;9390:204:0;9475:4;-1:-1:-1;;;;;;9499:47:0;;-1:-1:-1;;;9499:47:0;;:87;;;9550:36;9574:11;9550:23;:36::i;46600:135::-;46682:16;46690:7;46682;:16::i;:::-;46674:53;;;;-1:-1:-1;;;46674:53:0;;23219:2:1;46674:53:0;;;23201:21:1;23258:2;23238:18;;;23231:30;-1:-1:-1;;;23277:18:1;;;23270:54;23341:18;;46674:53:0;23017:348:1;45879:174:0;45954:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;45954:29:0;-1:-1:-1;;;;;45954:29:0;;;;;;;;:24;;46008:23;45954:24;46008:14;:23::i;:::-;-1:-1:-1;;;;;45999:46:0;;;;;;;;;;;45879:174;;:::o;10137:105::-;10204:30;10215:4;690:10;10204;:30::i;18691:118::-;18760:41;;-1:-1:-1;;;;;18760:18:0;;;18779:21;18760:41;;;;;;;;;18779:21;18760:18;:41;;;;;;;;;;;;;;;;;;;38755:335;38950:41;690:10;38983:7;38950:18;:41::i;:::-;38942:99;;;;-1:-1:-1;;;38942:99:0;;;;;;;:::i;:::-;39054:28;39064:4;39070:2;39074:7;39054:9;:28::i;14136:238::-;14220:22;14228:4;14234:7;14220;:22::i;:::-;14215:152;;14259:12;;;;:6;:12;;;;;;;;-1:-1:-1;;;;;14259:29:0;;;;;;;;;:36;;-1:-1:-1;;14259:36:0;14291:4;14259:36;;;14342:12;690:10;;610:98;14342:12;-1:-1:-1;;;;;14315:40:0;14333:7;-1:-1:-1;;;;;14315:40:0;14327:4;14315:40;;;;;;;;;;14136:238;;:::o;14506:239::-;14590:22;14598:4;14604:7;14590;:22::i;:::-;14586:152;;;14661:5;14629:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;14629:29:0;;;;;;;;;;:37;;-1:-1:-1;;14629:37:0;;;14686:40;690:10;;14629:12;;14686:40;;14661:5;14686:40;14506:239;;:::o;2866:120::-;1878:7;;;;2402:41;;;;-1:-1:-1;;;2402:41:0;;26717:2:1;2402:41:0;;;26699:21:1;26756:2;26736:18;;;26729:30;-1:-1:-1;;;26775:18:1;;;26768:50;26835:18;;2402:41:0;26515:344:1;2402:41:0;2925:7:::1;:15:::0;;-1:-1:-1;;2925:15:0::1;::::0;;2956:22:::1;690:10:::0;2965:12:::1;2956:22;::::0;-1:-1:-1;;;;;1692:32:1;;;1674:51;;1662:2;1647:18;2956:22:0::1;;;;;;;2866:120::o:0;39417:322::-;39591:41;690:10;39624:7;39591:18;:41::i;:::-;39583:99;;;;-1:-1:-1;;;39583:99:0;;;;;;;:::i;:::-;39693:38;39707:4;39713:2;39717:7;39726:4;39693:13;:38::i;:::-;39417:322;;;;:::o;42146:110::-;42222:26;42232:2;42236:7;42222:26;;;;;;;;;;;;:9;:26::i;41246:127::-;41311:4;41335:16;;;:7;:16;;;;;;-1:-1:-1;;;;;41335:16:0;:30;;;41246:127::o;18486:197::-;18644:30;;-1:-1:-1;;;18644:30:0;;18668:4;18644:30;;;1674:51:1;18594:12:0;;-1:-1:-1;;;;;18618:14:0;;;;;18633:9;;18618:14;;18644:15;;1647:18:1;;18644:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18618:57;;-1:-1:-1;;;;;;18618:57:0;;;;;;;-1:-1:-1;;;;;27245:32:1;;;18618:57:0;;;27227:51:1;27294:18;;;27287:34;27200:18;;18618:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;2607:118::-;1878:7;;;;2132:9;2124:38;;;;-1:-1:-1;;;2124:38:0;;27784:2:1;2124:38:0;;;27766:21:1;27823:2;27803:18;;;27796:30;-1:-1:-1;;;27842:18:1;;;27835:46;27898:18;;2124:38:0;27582:340:1;2124:38:0;2667:7:::1;:14:::0;;-1:-1:-1;;2667:14:0::1;2677:4;2667:14;::::0;;2697:20:::1;2704:12;690:10:::0;;610:98;46196:315;46351:8;-1:-1:-1;;;;;46342:17:0;:5;-1:-1:-1;;;;;46342:17:0;;46334:55;;;;-1:-1:-1;;;46334:55:0;;28129:2:1;46334:55:0;;;28111:21:1;28168:2;28148:18;;;28141:30;28207:27;28187:18;;;28180:55;28252:18;;46334:55:0;27927:349:1;46334:55:0;-1:-1:-1;;;;;46400:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;46400:46:0;;;;;;;;;;46462:41;;540::1;;;46462::0;;513:18:1;46462:41:0;;;;;;;46196:315;;;:::o;62760:100::-;62812:13;62845:7;62838:14;;;;;:::i;6799:723::-;6855:13;7076:5;7085:1;7076:10;7072:53;;-1:-1:-1;;7103:10:0;;;;;;;;;;;;-1:-1:-1;;;7103:10:0;;;;;6799:723::o;7072:53::-;7150:5;7135:12;7191:78;7198:9;;7191:78;;7224:8;;;;:::i;:::-;;-1:-1:-1;7247:10:0;;-1:-1:-1;7255:2:0;7247:10;;:::i;:::-;;;7191:78;;;7279:19;7311:6;-1:-1:-1;;;;;7301:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7301:17:0;;7279:39;;7329:154;7336:10;;7329:154;;7363:11;7373:1;7363:11;;:::i;:::-;;-1:-1:-1;7432:10:0;7440:2;7432:5;:10;:::i;:::-;7419:24;;:2;:24;:::i;:::-;7406:39;;7389:6;7396;7389:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;7389:56:0;;;;;;;;-1:-1:-1;7460:11:0;7469:2;7460:11;;:::i;:::-;;;7329:154;;;7507:6;6799:723;-1:-1:-1;;;;6799:723:0:o;49978:224::-;50080:4;-1:-1:-1;;;;;;50104:50:0;;-1:-1:-1;;;50104:50:0;;:90;;;50158:36;50182:11;50158:23;:36::i;10532:473::-;10621:22;10629:4;10635:7;10621;:22::i;:::-;10616:382;;10793:41;10821:7;-1:-1:-1;;;;;10793:41:0;10831:2;10793:19;:41::i;:::-;10899:38;10927:4;10934:2;10899:19;:38::i;:::-;10706:250;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;10706:250:0;;;;;;;;;;-1:-1:-1;;;10660:326:0;;;;;;;:::i;41540:264::-;41633:4;41650:13;41666:23;41681:7;41666:14;:23::i;:::-;41650:39;;41719:5;-1:-1:-1;;;;;41708:16:0;:7;-1:-1:-1;;;;;41708:16:0;;:52;;;-1:-1:-1;;;;;;38645:25:0;;;38621:4;38645:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;41728:32;41708:87;;;;41788:7;-1:-1:-1;;;;;41764:31:0;:20;41776:7;41764:11;:20::i;:::-;-1:-1:-1;;;;;41764:31:0;;41700:96;41540:264;-1:-1:-1;;;;41540:264:0:o;44958:802::-;45117:4;-1:-1:-1;;;;;45090:31:0;:23;45105:7;45090:14;:23::i;:::-;-1:-1:-1;;;;;45090:31:0;;45082:81;;;;-1:-1:-1;;;45082:81:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;45182:16:0;;45174:65;;;;-1:-1:-1;;;45174:65:0;;30184:2:1;45174:65:0;;;30166:21:1;30223:2;30203:18;;;30196:30;30262:34;30242:18;;;30235:62;-1:-1:-1;;;30313:18:1;;;30306:34;30357:19;;45174:65:0;29982:400:1;45174:65:0;45252:39;45273:4;45279:2;45283:7;45252:20;:39::i;:::-;45420:4;-1:-1:-1;;;;;45393:31:0;:23;45408:7;45393:14;:23::i;:::-;-1:-1:-1;;;;;45393:31:0;;45385:81;;;;-1:-1:-1;;;45385:81:0;;;;;;;:::i;:::-;45538:24;;;;:15;:24;;;;;;;;45531:31;;-1:-1:-1;;;;;;45531:31:0;;;-1:-1:-1;;;;;45575:15:0;;;;:9;:15;;;;;:20;;45531:31;;45538:24;45575:20;;45531:31;;45575:20;:::i;:::-;;;;-1:-1:-1;;;;;;;45606:13:0;;;;;;:9;:13;;;;;:18;;45623:1;;45606:13;:18;;45623:1;;45606:18;:::i;:::-;;;;-1:-1:-1;;45635:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;45635:21:0;-1:-1:-1;;;;;45635:21:0;;;;;;;;;45674:27;;45635:16;;45674:27;;;;;;;37643:346;37573:416;;:::o;40620:313::-;40776:28;40786:4;40792:2;40796:7;40776:9;:28::i;:::-;40823:47;40846:4;40852:2;40856:7;40865:4;40823:22;:47::i;:::-;40815:110;;;;-1:-1:-1;;;40815:110:0;;;;;;;:::i;42483:319::-;42612:18;42618:2;42622:7;42612:5;:18::i;:::-;42663:53;42694:1;42698:2;42702:7;42711:4;42663:22;:53::i;:::-;42641:153;;;;-1:-1:-1;;;42641:153:0;;;;;;;:::i;35628:293::-;35730:4;-1:-1:-1;;;;;;35763:40:0;;-1:-1:-1;;;35763:40:0;;:101;;-1:-1:-1;;;;;;;35816:48:0;;-1:-1:-1;;;35816:48:0;35763:101;:150;;;-1:-1:-1;;;;;;;;;;6556:40:0;;;35877:36;6447:157;64782:195;1878:7;;;;2132:9;2124:38;;;;-1:-1:-1;;;2124:38:0;;27784:2:1;2124:38:0;;;27766:21:1;27823:2;27803:18;;;27796:30;-1:-1:-1;;;27842:18:1;;;27835:46;27898:18;;2124:38:0;27582:340:1;2124:38:0;64924:45:::1;64951:4;64957:2;64961:7;64924:26;:45::i;47299:853::-:0;47453:4;-1:-1:-1;;;;;47474:13:0;;26037:19;:23;47470:675;;47510:71;;-1:-1:-1;;;47510:71:0;;-1:-1:-1;;;;;47510:36:0;;;;;:71;;690:10;;47561:4;;47567:7;;47576:4;;47510:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47510:71:0;;;;;;;;-1:-1:-1;;47510:71:0;;;;;;;;;;;;:::i;:::-;;;47506:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47751:6;:13;47768:1;47751:18;47747:328;;47794:60;;-1:-1:-1;;;47794:60:0;;;;;;;:::i;47747:328::-;48025:6;48019:13;48010:6;48006:2;48002:15;47995:38;47506:584;-1:-1:-1;;;;;;47632:51:0;-1:-1:-1;;;47632:51:0;;-1:-1:-1;47625:58:0;;47470:675;-1:-1:-1;48129:4:0;47299:853;;;;;;:::o;43138:587::-;-1:-1:-1;;;;;43218:16:0;;43210:61;;;;-1:-1:-1;;;43210:61:0;;31756:2:1;43210:61:0;;;31738:21:1;;;31775:18;;;31768:30;31834:34;31814:18;;;31807:62;31886:18;;43210:61:0;31554:356:1;43210:61:0;43291:16;43299:7;43291;:16::i;:::-;43290:17;43282:58;;;;-1:-1:-1;;;43282:58:0;;32117:2:1;43282:58:0;;;32099:21:1;32156:2;32136:18;;;32129:30;32195;32175:18;;;32168:58;32243:18;;43282:58:0;31915:352:1;43282:58:0;43353:45;43382:1;43386:2;43390:7;43353:20;:45::i;:::-;43497:16;43505:7;43497;:16::i;:::-;43496:17;43488:58;;;;-1:-1:-1;;;43488:58:0;;32117:2:1;43488:58:0;;;32099:21:1;32156:2;32136:18;;;32129:30;32195;32175:18;;;32168:58;32243:18;;43488:58:0;31915:352:1;43488:58:0;-1:-1:-1;;;;;43559:13:0;;;;;;:9;:13;;;;;:18;;43576:1;;43559:13;:18;;43576:1;;43559:18;:::i;:::-;;;;-1:-1:-1;;43588:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;43588:21:0;-1:-1:-1;;;;;43588:21:0;;;;;;;;43627:33;;43588:16;;;43627:33;;43588:16;;43627:33;65349:128;;:::o;51654:589::-;-1:-1:-1;;;;;51860:18:0;;51856:187;;51895:40;51927:7;53070:10;:17;;53043:24;;;;:15;:24;;;;;:44;;;53098:24;;;;;;;;;;;;52966:164;51895:40;51856:187;;;51965:2;-1:-1:-1;;;;;51957:10:0;:4;-1:-1:-1;;;;;51957:10:0;;51953:90;;51984:47;52017:4;52023:7;51984:32;:47::i;:::-;-1:-1:-1;;;;;52057:16:0;;52053:183;;52090:45;52127:7;52090:36;:45::i;52053:183::-;52163:4;-1:-1:-1;;;;;52157:10:0;:2;-1:-1:-1;;;;;52157:10:0;;52153:83;;52184:40;52212:2;52216:7;52184:27;:40::i;53757:988::-;54023:22;54073:1;54048:22;54065:4;54048:16;:22::i;:::-;:26;;;;:::i;:::-;54085:18;54106:26;;;:17;:26;;;;;;54023:51;;-1:-1:-1;54239:28:0;;;54235:328;;-1:-1:-1;;;;;54306:18:0;;54284:19;54306:18;;;:12;:18;;;;;;;;:34;;;;;;;;;54357:30;;;;;;:44;;;54474:30;;:17;:30;;;;;:43;;;54235:328;-1:-1:-1;54659:26:0;;;;:17;:26;;;;;;;;54652:33;;;-1:-1:-1;;;;;54703:18:0;;;;;:12;:18;;;;;:34;;;;;;;54696:41;53757:988::o;55040:1079::-;55318:10;:17;55293:22;;55318:21;;55338:1;;55318:21;:::i;:::-;55350:18;55371:24;;;:15;:24;;;;;;55744:10;:26;;55293:46;;-1:-1:-1;55371:24:0;;55293:46;;55744:26;;;;;;:::i;:::-;;;;;;;;;55722:48;;55808:11;55783:10;55794;55783:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;55888:28;;;:15;:28;;;;;;;:41;;;56060:24;;;;;56053:31;56095:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;55111:1008;;;55040:1079;:::o;52544:221::-;52629:14;52646:20;52663:2;52646:16;:20::i;:::-;-1:-1:-1;;;;;52677:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;52722:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;52544:221:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;-1:-1:-1;;840:1:1;822:16;;815:27;592:258::o;855:::-;897:3;935:5;929:12;962:6;957:3;950:19;978:63;1034:6;1027:4;1022:3;1018:14;1011:4;1004:5;1000:16;978:63;:::i;:::-;1095:2;1074:15;-1:-1:-1;;1070:29:1;1061:39;;;;1102:4;1057:50;;855:258;-1:-1:-1;;855:258:1:o;1118:220::-;1267:2;1256:9;1249:21;1230:4;1287:45;1328:2;1317:9;1313:18;1305:6;1287:45;:::i;1343:180::-;1402:6;1455:2;1443:9;1434:7;1430:23;1426:32;1423:52;;;1471:1;1468;1461:12;1423:52;-1:-1:-1;1494:23:1;;1343:180;-1:-1:-1;1343:180:1:o;1736:131::-;-1:-1:-1;;;;;1811:31:1;;1801:42;;1791:70;;1857:1;1854;1847:12;1872:315;1940:6;1948;2001:2;1989:9;1980:7;1976:23;1972:32;1969:52;;;2017:1;2014;2007:12;1969:52;2056:9;2043:23;2075:31;2100:5;2075:31;:::i;:::-;2125:5;2177:2;2162:18;;;;2149:32;;-1:-1:-1;;;1872:315:1:o;2192:255::-;2259:6;2312:2;2300:9;2291:7;2287:23;2283:32;2280:52;;;2328:1;2325;2318:12;2280:52;2367:9;2354:23;2386:31;2411:5;2386:31;:::i;2819:456::-;2896:6;2904;2912;2965:2;2953:9;2944:7;2940:23;2936:32;2933:52;;;2981:1;2978;2971:12;2933:52;3020:9;3007:23;3039:31;3064:5;3039:31;:::i;:::-;3089:5;-1:-1:-1;3146:2:1;3131:18;;3118:32;3159:33;3118:32;3159:33;:::i;:::-;2819:456;;3211:7;;-1:-1:-1;;;3265:2:1;3250:18;;;;3237:32;;2819:456::o;3462:127::-;3523:10;3518:3;3514:20;3511:1;3504:31;3554:4;3551:1;3544:15;3578:4;3575:1;3568:15;3594:275;3665:2;3659:9;3730:2;3711:13;;-1:-1:-1;;3707:27:1;3695:40;;-1:-1:-1;;;;;3750:34:1;;3786:22;;;3747:62;3744:88;;;3812:18;;:::i;:::-;3848:2;3841:22;3594:275;;-1:-1:-1;3594:275:1:o;3874:187::-;3923:4;-1:-1:-1;;;;;3948:6:1;3945:30;3942:56;;;3978:18;;:::i;:::-;-1:-1:-1;4044:2:1;4023:15;-1:-1:-1;;4019:29:1;4050:4;4015:40;;3874:187::o;4066:338::-;4131:5;4160:53;4176:36;4205:6;4176:36;:::i;:::-;4160:53;:::i;:::-;4151:62;;4236:6;4229:5;4222:21;4276:3;4267:6;4262:3;4258:16;4255:25;4252:45;;;4293:1;4290;4283:12;4252:45;4342:6;4337:3;4330:4;4323:5;4319:16;4306:43;4396:1;4389:4;4380:6;4373:5;4369:18;4365:29;4358:40;4066:338;;;;;:::o;4409:222::-;4452:5;4505:3;4498:4;4490:6;4486:17;4482:27;4472:55;;4523:1;4520;4513:12;4472:55;4545:80;4621:3;4612:6;4599:20;4592:4;4584:6;4580:17;4545:80;:::i;4636:322::-;4705:6;4758:2;4746:9;4737:7;4733:23;4729:32;4726:52;;;4774:1;4771;4764:12;4726:52;4814:9;4801:23;-1:-1:-1;;;;;4839:6:1;4836:30;4833:50;;;4879:1;4876;4869:12;4833:50;4902;4944:7;4935:6;4924:9;4920:22;4902:50;:::i;4963:239::-;5046:1;5039:5;5036:12;5026:143;;5091:10;5086:3;5082:20;5079:1;5072:31;5126:4;5123:1;5116:15;5154:4;5151:1;5144:15;5026:143;5178:18;;4963:239::o;5207:326::-;5380:46;5416:9;5408:6;5380:46;:::i;:::-;5462:2;5457;5446:9;5442:18;5435:30;5361:4;5482:45;5523:2;5512:9;5508:18;5500:6;5482:45;:::i;5538:315::-;5606:6;5614;5667:2;5655:9;5646:7;5642:23;5638:32;5635:52;;;5683:1;5680;5673:12;5635:52;5719:9;5706:23;5696:33;;5779:2;5768:9;5764:18;5751:32;5792:31;5817:5;5792:31;:::i;:::-;5842:5;5832:15;;;5538:315;;;;;:::o;6110:348::-;6162:8;6172:6;6226:3;6219:4;6211:6;6207:17;6203:27;6193:55;;6244:1;6241;6234:12;6193:55;-1:-1:-1;6267:20:1;;-1:-1:-1;;;;;6299:30:1;;6296:50;;;6342:1;6339;6332:12;6296:50;6379:4;6371:6;6367:17;6355:29;;6431:3;6424:4;6415:6;6407;6403:19;6399:30;6396:39;6393:59;;;6448:1;6445;6438:12;6463:411;6534:6;6542;6595:2;6583:9;6574:7;6570:23;6566:32;6563:52;;;6611:1;6608;6601:12;6563:52;6651:9;6638:23;-1:-1:-1;;;;;6676:6:1;6673:30;6670:50;;;6716:1;6713;6706:12;6670:50;6755:59;6806:7;6797:6;6786:9;6782:22;6755:59;:::i;:::-;6833:8;;6729:85;;-1:-1:-1;6463:411:1;-1:-1:-1;;;;6463:411:1:o;6879:543::-;6967:6;6975;7028:2;7016:9;7007:7;7003:23;6999:32;6996:52;;;7044:1;7041;7034:12;6996:52;7084:9;7071:23;-1:-1:-1;;;;;7154:2:1;7146:6;7143:14;7140:34;;;7170:1;7167;7160:12;7140:34;7193:50;7235:7;7226:6;7215:9;7211:22;7193:50;:::i;:::-;7183:60;;7296:2;7285:9;7281:18;7268:32;7252:48;;7325:2;7315:8;7312:16;7309:36;;;7341:1;7338;7331:12;7309:36;;7364:52;7408:7;7397:8;7386:9;7382:24;7364:52;:::i;:::-;7354:62;;;6879:543;;;;;:::o;7427:762::-;7534:6;7542;7550;7603:2;7591:9;7582:7;7578:23;7574:32;7571:52;;;7619:1;7616;7609:12;7571:52;7658:9;7645:23;7677:31;7702:5;7677:31;:::i;:::-;7727:5;-1:-1:-1;7783:2:1;7768:18;;7755:32;-1:-1:-1;;;;;7836:14:1;;;7833:34;;;7863:1;7860;7853:12;7833:34;7901:6;7890:9;7886:22;7876:32;;7946:7;7939:4;7935:2;7931:13;7927:27;7917:55;;7968:1;7965;7958:12;7917:55;8008:2;7995:16;8034:2;8026:6;8023:14;8020:34;;;8050:1;8047;8040:12;8020:34;8103:7;8098:2;8088:6;8085:1;8081:14;8077:2;8073:23;8069:32;8066:45;8063:65;;;8124:1;8121;8114:12;8063:65;8155:2;8151;8147:11;8137:21;;8177:6;8167:16;;;;;7427:762;;;;;:::o;8194:110::-;8278:1;8271:5;8268:12;8258:40;;8294:1;8291;8284:12;8309:692;8421:6;8429;8437;8445;8498:3;8486:9;8477:7;8473:23;8469:33;8466:53;;;8515:1;8512;8505:12;8466:53;8551:9;8538:23;8528:33;;8612:2;8601:9;8597:18;8584:32;-1:-1:-1;;;;;8631:6:1;8628:30;8625:50;;;8671:1;8668;8661:12;8625:50;8694;8736:7;8727:6;8716:9;8712:22;8694:50;:::i;:::-;8684:60;;;8794:2;8783:9;8779:18;8766:32;8807:40;8841:5;8807:40;:::i;:::-;8866:5;-1:-1:-1;8923:2:1;8908:18;;8895:32;8936:33;8895:32;8936:33;:::i;:::-;8309:692;;;;-1:-1:-1;8309:692:1;;-1:-1:-1;;8309:692:1:o;9006:388::-;9074:6;9082;9135:2;9123:9;9114:7;9110:23;9106:32;9103:52;;;9151:1;9148;9141:12;9103:52;9190:9;9177:23;9209:31;9234:5;9209:31;:::i;:::-;9259:5;-1:-1:-1;9316:2:1;9301:18;;9288:32;9329:33;9288:32;9329:33;:::i;9399:118::-;9485:5;9478:13;9471:21;9464:5;9461:32;9451:60;;9507:1;9504;9497:12;9522:382;9587:6;9595;9648:2;9636:9;9627:7;9623:23;9619:32;9616:52;;;9664:1;9661;9654:12;9616:52;9703:9;9690:23;9722:31;9747:5;9722:31;:::i;:::-;9772:5;-1:-1:-1;9829:2:1;9814:18;;9801:32;9842:30;9801:32;9842:30;:::i;9909:390::-;9987:6;9995;10048:2;10036:9;10027:7;10023:23;10019:32;10016:52;;;10064:1;10061;10054:12;10016:52;10100:9;10087:23;10077:33;;10161:2;10150:9;10146:18;10133:32;-1:-1:-1;;;;;10180:6:1;10177:30;10174:50;;;10220:1;10217;10210:12;10174:50;10243;10285:7;10276:6;10265:9;10261:22;10243:50;:::i;10304:795::-;10399:6;10407;10415;10423;10476:3;10464:9;10455:7;10451:23;10447:33;10444:53;;;10493:1;10490;10483:12;10444:53;10532:9;10519:23;10551:31;10576:5;10551:31;:::i;:::-;10601:5;-1:-1:-1;10658:2:1;10643:18;;10630:32;10671:33;10630:32;10671:33;:::i;:::-;10723:7;-1:-1:-1;10777:2:1;10762:18;;10749:32;;-1:-1:-1;10832:2:1;10817:18;;10804:32;-1:-1:-1;;;;;10848:30:1;;10845:50;;;10891:1;10888;10881:12;10845:50;10914:22;;10967:4;10959:13;;10955:27;-1:-1:-1;10945:55:1;;10996:1;10993;10986:12;10945:55;11019:74;11085:7;11080:2;11067:16;11062:2;11058;11054:11;11019:74;:::i;:::-;11009:84;;;10304:795;;;;;;;:::o;11104:914::-;11235:6;11243;11251;11259;11267;11320:3;11308:9;11299:7;11295:23;11291:33;11288:53;;;11337:1;11334;11327:12;11288:53;11373:9;11360:23;11350:33;;11434:2;11423:9;11419:18;11406:32;-1:-1:-1;;;;;11498:2:1;11490:6;11487:14;11484:34;;;11514:1;11511;11504:12;11484:34;11537:50;11579:7;11570:6;11559:9;11555:22;11537:50;:::i;:::-;11527:60;;11640:2;11629:9;11625:18;11612:32;11596:48;;11669:2;11659:8;11656:16;11653:36;;;11685:1;11682;11675:12;11653:36;;11708:52;11752:7;11741:8;11730:9;11726:24;11708:52;:::i;:::-;11698:62;;;11810:2;11799:9;11795:18;11782:32;11823:40;11857:5;11823:40;:::i;:::-;11882:5;-1:-1:-1;11939:3:1;11924:19;;11911:33;11953;11911;11953;:::i;:::-;12005:7;11995:17;;;11104:914;;;;;;;;:::o;12023:546::-;12103:6;12111;12119;12172:2;12160:9;12151:7;12147:23;12143:32;12140:52;;;12188:1;12185;12178:12;12140:52;12227:9;12214:23;12246:31;12271:5;12246:31;:::i;:::-;12296:5;-1:-1:-1;12352:2:1;12337:18;;12324:32;-1:-1:-1;;;;;12368:30:1;;12365:50;;;12411:1;12408;12401:12;12365:50;12450:59;12501:7;12492:6;12481:9;12477:22;12450:59;:::i;:::-;12023:546;;12528:8;;-1:-1:-1;12424:85:1;;-1:-1:-1;;;;12023:546:1:o;12574:1046::-;12715:6;12723;12731;12739;12747;12800:3;12788:9;12779:7;12775:23;12771:33;12768:53;;;12817:1;12814;12807:12;12768:53;12857:9;12844:23;-1:-1:-1;;;;;12927:2:1;12919:6;12916:14;12913:34;;;12943:1;12940;12933:12;12913:34;12966:50;13008:7;12999:6;12988:9;12984:22;12966:50;:::i;:::-;12956:60;;13069:2;13058:9;13054:18;13041:32;13025:48;;13098:2;13088:8;13085:16;13082:36;;;13114:1;13111;13104:12;14098:845;14220:6;14228;14236;14244;14297:3;14285:9;14276:7;14272:23;14268:33;14265:53;;;14314:1;14311;14304:12;14265:53;14354:9;14341:23;-1:-1:-1;;;;;14424:2:1;14416:6;14413:14;14410:34;;;14440:1;14437;14430:12;14410:34;14463:50;14505:7;14496:6;14485:9;14481:22;14463:50;:::i;:::-;14453:60;;14566:2;14555:9;14551:18;14538:32;14522:48;;14595:2;14585:8;14582:16;14579:36;;;14611:1;14608;14601:12;14579:36;;14634:52;14678:7;14667:8;14656:9;14652:24;14634:52;:::i;14948:380::-;15027:1;15023:12;;;;15070;;;15091:61;;15145:4;15137:6;15133:17;15123:27;;15091:61;15198:2;15190:6;15187:14;15167:18;15164:38;15161:161;;15244:10;15239:3;15235:20;15232:1;15225:31;15279:4;15276:1;15269:15;15307:4;15304:1;15297:15;15161:161;;14948:380;;;:::o;16165:375::-;-1:-1:-1;;;;;16423:15:1;;;16405:34;;16475:15;;;;16470:2;16455:18;;16448:43;16522:2;16507:18;;16500:34;;;;16355:2;16340:18;;16165:375::o;16545:444::-;16795:2;16784:9;16777:21;16758:4;16821:45;16862:2;16851:9;16847:18;16839:6;16821:45;:::i;:::-;16902:22;;;16897:2;16882:18;;;16875:50;16949:1;16934:17;;16968:15;;;;;16545:444;-1:-1:-1;;16545:444:1:o;16994:789::-;17099:6;17107;17160:2;17148:9;17139:7;17135:23;17131:32;17128:52;;;17176:1;17173;17166:12;17128:52;17208:9;17202:16;17227:40;17261:5;17227:40;:::i;:::-;17335:2;17320:18;;17314:25;17286:5;;-1:-1:-1;;;;;;17351:30:1;;17348:50;;;17394:1;17391;17384:12;17348:50;17417:22;;17470:4;17462:13;;17458:27;-1:-1:-1;17448:55:1;;17499:1;17496;17489:12;17448:55;17528:2;17522:9;17553:49;17569:32;17598:2;17569:32;:::i;17553:49::-;17625:2;17618:5;17611:17;17665:7;17660:2;17655;17651;17647:11;17643:20;17640:33;17637:53;;;17686:1;17683;17676:12;17637:53;17699:54;17750:2;17745;17738:5;17734:14;17729:2;17725;17721:11;17699:54;:::i;:::-;17772:5;17762:15;;;;;16994:789;;;;;:::o;18616:273::-;18801:6;18793;18788:3;18775:33;18757:3;18827:16;;18852:13;;;18827:16;18616:273;-1:-1:-1;18616:273:1:o;19666:127::-;19727:10;19722:3;19718:20;19715:1;19708:31;19758:4;19755:1;19748:15;19782:4;19779:1;19772:15;19798:383;19995:2;19984:9;19977:21;19958:4;20021:45;20062:2;20051:9;20047:18;20039:6;20021:45;:::i;:::-;20114:9;20106:6;20102:22;20097:2;20086:9;20082:18;20075:50;20142:33;20168:6;20160;20142:33;:::i;:::-;20134:41;19798:383;-1:-1:-1;;;;;19798:383:1:o;20186:522::-;20264:4;20270:6;20330:11;20317:25;20424:2;20420:7;20409:8;20393:14;20389:29;20385:43;20365:18;20361:68;20351:96;;20443:1;20440;20433:12;20351:96;20470:33;;20522:20;;;-1:-1:-1;;;;;;20554:30:1;;20551:50;;;20597:1;20594;20587:12;20551:50;20630:4;20618:17;;-1:-1:-1;20661:14:1;20657:27;;;20647:38;;20644:58;;;20698:1;20695;20688:12;20713:398;20915:2;20897:21;;;20954:2;20934:18;;;20927:30;20993:34;20988:2;20973:18;;20966:62;-1:-1:-1;;;21059:2:1;21044:18;;21037:32;21101:3;21086:19;;20713:398::o;21116:127::-;21177:10;21172:3;21168:20;21165:1;21158:31;21208:4;21205:1;21198:15;21232:4;21229:1;21222:15;21248:135;21287:3;21308:17;;;21305:43;;21328:18;;:::i;:::-;-1:-1:-1;21375:1:1;21364:13;;21248:135::o;21388:413::-;21590:2;21572:21;;;21629:2;21609:18;;;21602:30;21668:34;21663:2;21648:18;;21641:62;-1:-1:-1;;;21734:2:1;21719:18;;21712:47;21791:3;21776:19;;21388:413::o;21806:407::-;22008:2;21990:21;;;22047:2;22027:18;;;22020:30;22086:34;22081:2;22066:18;;22059:62;-1:-1:-1;;;22152:2:1;22137:18;;22130:41;22203:3;22188:19;;21806:407::o;22218:794::-;22586:3;22575:9;22568:22;22549:4;22613:46;22654:3;22643:9;22639:19;22631:6;22613:46;:::i;:::-;22690:9;22682:6;22678:22;22736:2;22731;22720:9;22716:18;22709:30;22763:1;22755:6;22748:17;22809:2;22805;22801:11;22796:2;22785:9;22781:18;22774:39;;22830:42;22868:2;22860:6;22856:15;22848:6;22830:42;:::i;:::-;22822:50;;;22881:55;22932:2;22921:9;22917:18;22909:6;22881:55;:::i;:::-;-1:-1:-1;;;;;22973:32:1;;;;22967:3;22952:19;;;;22945:61;22218:794;;-1:-1:-1;;;22218:794:1:o;23780:470::-;23959:3;23997:6;23991:13;24013:53;24059:6;24054:3;24047:4;24039:6;24035:17;24013:53;:::i;:::-;24129:13;;24088:16;;;;24151:57;24129:13;24088:16;24185:4;24173:17;;24151:57;:::i;:::-;24224:20;;23780:470;-1:-1:-1;;;;23780:470:1:o;24255:752::-;24570:3;24559:9;24552:22;24533:4;24597:46;24638:3;24627:9;24623:19;24615:6;24597:46;:::i;:::-;24691:9;24683:6;24679:22;24674:2;24663:9;24659:18;24652:50;24725:33;24751:6;24743;24725:33;:::i;:::-;24711:47;;24806:9;24798:6;24794:22;24789:2;24778:9;24774:18;24767:50;24834:33;24860:6;24852;24834:33;:::i;:::-;24826:41;;;24876:55;24927:2;24916:9;24912:18;24904:6;24876:55;:::i;:::-;-1:-1:-1;;;;;24968:32:1;;;;24962:3;24947:19;;;;24940:61;24255:752;;-1:-1:-1;;;;24255:752:1:o;25012:276::-;25143:3;25181:6;25175:13;25197:53;25243:6;25238:3;25231:4;25223:6;25219:17;25197:53;:::i;:::-;25266:16;;;;;25012:276;-1:-1:-1;;25012:276:1:o;25293:168::-;25333:7;25399:1;25395;25391:6;25387:14;25384:1;25381:21;25376:1;25369:9;25362:17;25358:45;25355:71;;;25406:18;;:::i;:::-;-1:-1:-1;25446:9:1;;25293:168::o;25466:128::-;25506:3;25537:1;25533:6;25530:1;25527:13;25524:39;;;25543:18;;:::i;:::-;-1:-1:-1;25579:9:1;;25466:128::o;25599:136::-;25638:3;25666:5;25656:39;;25675:18;;:::i;:::-;-1:-1:-1;;;25711:18:1;;25599:136::o;26101:409::-;26303:2;26285:21;;;26342:2;26322:18;;;26315:30;26381:34;26376:2;26361:18;;26354:62;-1:-1:-1;;;26447:2:1;26432:18;;26425:43;26500:3;26485:19;;26101:409::o;26864:184::-;26934:6;26987:2;26975:9;26966:7;26962:23;26958:32;26955:52;;;27003:1;27000;26993:12;26955:52;-1:-1:-1;27026:16:1;;26864:184;-1:-1:-1;26864:184:1:o;27332:245::-;27399:6;27452:2;27440:9;27431:7;27427:23;27423:32;27420:52;;;27468:1;27465;27458:12;27420:52;27500:9;27494:16;27519:28;27541:5;27519:28;:::i;28281:127::-;28342:10;28337:3;28333:20;28330:1;28323:31;28373:4;28370:1;28363:15;28397:4;28394:1;28387:15;28413:120;28453:1;28479;28469:35;;28484:18;;:::i;:::-;-1:-1:-1;28518:9:1;;28413:120::o;28538:125::-;28578:4;28606:1;28603;28600:8;28597:34;;;28611:18;;:::i;:::-;-1:-1:-1;28648:9:1;;28538:125::o;28668:112::-;28700:1;28726;28716:35;;28731:18;;:::i;:::-;-1:-1:-1;28765:9:1;;28668:112::o;28785:786::-;29196:25;29191:3;29184:38;29166:3;29251:6;29245:13;29267:62;29322:6;29317:2;29312:3;29308:12;29301:4;29293:6;29289:17;29267:62;:::i;:::-;-1:-1:-1;;;29388:2:1;29348:16;;;29380:11;;;29373:40;29438:13;;29460:63;29438:13;29509:2;29501:11;;29494:4;29482:17;;29460:63;:::i;:::-;29543:17;29562:2;29539:26;;28785:786;-1:-1:-1;;;;28785:786:1:o;29576:401::-;29778:2;29760:21;;;29817:2;29797:18;;;29790:30;29856:34;29851:2;29836:18;;29829:62;-1:-1:-1;;;29922:2:1;29907:18;;29900:35;29967:3;29952:19;;29576:401::o;30387:414::-;30589:2;30571:21;;;30628:2;30608:18;;;30601:30;30667:34;30662:2;30647:18;;30640:62;-1:-1:-1;;;30733:2:1;30718:18;;30711:48;30791:3;30776:19;;30387:414::o;30806:489::-;-1:-1:-1;;;;;31075:15:1;;;31057:34;;31127:15;;31122:2;31107:18;;31100:43;31174:2;31159:18;;31152:34;;;31222:3;31217:2;31202:18;;31195:31;;;31000:4;;31243:46;;31269:19;;31261:6;31243:46;:::i;:::-;31235:54;30806:489;-1:-1:-1;;;;;;30806:489:1:o;31300:249::-;31369:6;31422:2;31410:9;31401:7;31397:23;31393:32;31390:52;;;31438:1;31435;31428:12;31390:52;31470:9;31464:16;31489:30;31513:5;31489:30;:::i;32272:127::-;32333:10;32328:3;32324:20;32321:1;32314:31;32364:4;32361:1;32354:15;32388:4;32385:1;32378:15
Swarm Source
ipfs://bbe5607bddbb94c3bff97f98a76159b2cb6ddf265813dd41beff45e6a299140f
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.