Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
BoredCryptoApes
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2022-05-03
*/
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
return msg.data;
}
}
interface IERC721Receiver {
/**
* @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
* by `operator` from `from`, this function is called.
*
* It must return its Solidity selector to confirm the token transfer.
* If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
*
* The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
*/
function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4);
}
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize, which returns 0 for contracts in
// construction, since the code is only stored at the end of the
// constructor execution.
uint256 size;
// solhint-disable-next-line no-inline-assembly
assembly { size := extcodesize(account) }
return size > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
// solhint-disable-next-line avoid-low-level-calls, avoid-call-value
(bool success, ) = recipient.call{ value: amount }("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain`call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
require(isContract(target), "Address: call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.call{ value: value }(data);
return _verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.staticcall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
require(isContract(target), "Address: delegate call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.delegatecall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
// solhint-disable-next-line no-inline-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}
library Strings {
bytes16 private constant alphabet = "0123456789abcdef";
/**
* @dev Converts a `uint256` to its ASCII `string` decimal representation.
*/
function toString(uint256 value) internal pure returns (string memory) {
// Inspired by OraclizeAPI's implementation - MIT licence
// https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol
if (value == 0) {
return "0";
}
uint256 temp = value;
uint256 digits;
while (temp != 0) {
digits++;
temp /= 10;
}
bytes memory buffer = new bytes(digits);
while (value != 0) {
digits -= 1;
buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
value /= 10;
}
return string(buffer);
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
*/
function toHexString(uint256 value) internal pure returns (string memory) {
if (value == 0) {
return "0x00";
}
uint256 temp = value;
uint256 length = 0;
while (temp != 0) {
length++;
temp >>= 8;
}
return toHexString(value, length);
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
*/
function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
bytes memory buffer = new bytes(2 * length + 2);
buffer[0] = "0";
buffer[1] = "x";
for (uint256 i = 2 * length + 1; i > 1; --i) {
buffer[i] = alphabet[value & 0xf];
value >>= 4;
}
require(value == 0, "Strings: hex length insufficient");
return string(buffer);
}
}
library EnumerableSet {
// To implement this library for multiple types with as little code
// repetition as possible, we write it in terms of a generic Set type with
// bytes32 values.
// The Set implementation uses private functions, and user-facing
// implementations (such as AddressSet) are just wrappers around the
// underlying Set.
// This means that we can only create new EnumerableSets for types that fit
// in bytes32.
struct Set {
// Storage of set values
bytes32[] _values;
// Position of the value in the `values` array, plus 1 because index 0
// means a value is not in the set.
mapping (bytes32 => uint256) _indexes;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function _add(Set storage set, bytes32 value) private returns (bool) {
if (!_contains(set, value)) {
set._values.push(value);
// The value is stored at length-1, but we add 1 to all indexes
// and use 0 as a sentinel value
set._indexes[value] = set._values.length;
return true;
} else {
return false;
}
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function _remove(Set storage set, bytes32 value) private returns (bool) {
// We read and store the value's index to prevent multiple reads from the same storage slot
uint256 valueIndex = set._indexes[value];
if (valueIndex != 0) { // Equivalent to contains(set, value)
// To delete an element from the _values array in O(1), we swap the element to delete with the last one in
// the array, and then remove the last element (sometimes called as 'swap and pop').
// This modifies the order of the array, as noted in {at}.
uint256 toDeleteIndex = valueIndex - 1;
uint256 lastIndex = set._values.length - 1;
// When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs
// so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.
bytes32 lastvalue = set._values[lastIndex];
// Move the last value to the index where the value to delete is
set._values[toDeleteIndex] = lastvalue;
// Update the index for the moved value
set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based
// Delete the slot where the moved value was stored
set._values.pop();
// Delete the index for the deleted slot
delete set._indexes[value];
return true;
} else {
return false;
}
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function _contains(Set storage set, bytes32 value) private view returns (bool) {
return set._indexes[value] != 0;
}
/**
* @dev Returns the number of values on the set. O(1).
*/
function _length(Set storage set) private view returns (uint256) {
return set._values.length;
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function _at(Set storage set, uint256 index) private view returns (bytes32) {
require(set._values.length > index, "EnumerableSet: index out of bounds");
return set._values[index];
}
// Bytes32Set
struct Bytes32Set {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
return _add(set._inner, value);
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
return _remove(set._inner, value);
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
return _contains(set._inner, value);
}
/**
* @dev Returns the number of values in the set. O(1).
*/
function length(Bytes32Set storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
return _at(set._inner, index);
}
// AddressSet
struct AddressSet {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(AddressSet storage set, address value) internal returns (bool) {
return _add(set._inner, bytes32(uint256(uint160(value))));
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(AddressSet storage set, address value) internal returns (bool) {
return _remove(set._inner, bytes32(uint256(uint160(value))));
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(AddressSet storage set, address value) internal view returns (bool) {
return _contains(set._inner, bytes32(uint256(uint160(value))));
}
/**
* @dev Returns the number of values in the set. O(1).
*/
function length(AddressSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(AddressSet storage set, uint256 index) internal view returns (address) {
return address(uint160(uint256(_at(set._inner, index))));
}
// UintSet
struct UintSet {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(UintSet storage set, uint256 value) internal returns (bool) {
return _add(set._inner, bytes32(value));
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(UintSet storage set, uint256 value) internal returns (bool) {
return _remove(set._inner, bytes32(value));
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(UintSet storage set, uint256 value) internal view returns (bool) {
return _contains(set._inner, bytes32(value));
}
/**
* @dev Returns the number of values on the set. O(1).
*/
function length(UintSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(UintSet storage set, uint256 index) internal view returns (uint256) {
return uint256(_at(set._inner, index));
}
}
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;
}
}
}
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 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());
}
}
interface IERC721 is IERC165 {
/**
* @dev Emitted when `tokenId` token is transferred from `from` to `to`.
*/
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
*/
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
*/
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
/**
* @dev Returns the number of tokens in ``owner``'s account.
*/
function balanceOf(address owner) external view returns (uint256 balance);
/**
* @dev Returns the owner of the `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function ownerOf(uint256 tokenId) external view returns (address owner);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
* are aware of the ERC721 protocol to prevent tokens from being forever locked.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(address from, address to, uint256 tokenId) external;
/**
* @dev Transfers `tokenId` token from `from` to `to`.
*
* WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
*
* Emits a {Transfer} event.
*/
function transferFrom(address from, address to, uint256 tokenId) external;
/**
* @dev Gives permission to `to` to transfer `tokenId` token to another account.
* The approval is cleared when the token is transferred.
*
* Only a single account can be approved at a time, so approving the zero address clears previous approvals.
*
* Requirements:
*
* - The caller must own the token or be an approved operator.
* - `tokenId` must exist.
*
* Emits an {Approval} event.
*/
function approve(address to, uint256 tokenId) external;
/**
* @dev Returns the account approved for `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function getApproved(uint256 tokenId) external view returns (address operator);
/**
* @dev Approve or remove `operator` as an operator for the caller.
* Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
*
* Requirements:
*
* - The `operator` cannot be the caller.
*
* Emits an {ApprovalForAll} event.
*/
function setApprovalForAll(address operator, bool _approved) external;
/**
* @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
*
* See {setApprovalForAll}
*/
function isApprovedForAll(address owner, address operator) external view returns (bool);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;
}
abstract contract ERC165 is IERC165 {
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}
interface IAccessControl {
function hasRole(bytes32 role, address account) external view returns (bool);
function getRoleAdmin(bytes32 role) external view returns (bytes32);
function grantRole(bytes32 role, address account) external;
function revokeRole(bytes32 role, address account) external;
function renounceRole(bytes32 role, address account) external;
}
/**
* @dev Contract module that allows children to implement role-based access
* control mechanisms. This is a lightweight version that doesn't allow enumerating role
* members except through off-chain means by accessing the contract event logs. Some
* applications may benefit from on-chain enumerability, for those cases see
* {AccessControlEnumerable}.
*
* Roles are referred to by their `bytes32` identifier. These should be exposed
* in the external API and be unique. The best way to achieve this is by
* using `public constant` hash digests:
*
* ```
* bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
* ```
*
* Roles can be used to represent a set of permissions. To restrict access to a
* function call, use {hasRole}:
*
* ```
* function foo() public {
* require(hasRole(MY_ROLE, msg.sender));
* ...
* }
* ```
*
* Roles can be granted and revoked dynamically via the {grantRole} and
* {revokeRole} functions. Each role has an associated admin role, and only
* accounts that have a role's admin role can call {grantRole} and {revokeRole}.
*
* By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
* that only accounts with this role will be able to grant or revoke other
* roles. More complex role relationships can be created by using
* {_setRoleAdmin}.
*
* WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
* grant and revoke this role. Extra precautions should be taken to secure
* accounts that have been granted it.
*/
abstract contract AccessControl is Context, IAccessControl, ERC165 {
struct RoleData {
mapping (address => bool) members;
bytes32 adminRole;
}
mapping (bytes32 => RoleData) private _roles;
bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;
/**
* @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
*
* `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
* {RoleAdminChanged} not being emitted signaling this.
*
* _Available since v3.1._
*/
event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);
/**
* @dev Emitted when `account` is granted `role`.
*
* `sender` is the account that originated the contract call, an admin role
* bearer except when using {_setupRole}.
*/
event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);
/**
* @dev Emitted when `account` is revoked `role`.
*
* `sender` is the account that originated the contract call:
* - if using `revokeRole`, it is the admin role bearer
* - if using `renounceRole`, it is the role bearer (i.e. `account`)
*/
event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);
/**
* @dev 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 override returns (bool) {
return _roles[role].members[account];
}
/**
* @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 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 {
require(hasRole(getRoleAdmin(role), _msgSender()), "AccessControl: sender must be an admin to grant");
_grantRole(role, account);
}
/**
* @dev Revokes `role` from `account`.
*
* If `account` had been granted `role`, emits a {RoleRevoked} event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function revokeRole(bytes32 role, address account) public virtual override {
require(hasRole(getRoleAdmin(role), _msgSender()), "AccessControl: sender must be an admin to revoke");
_revokeRole(role, account);
}
/**
* @dev Revokes `role` from the calling account.
*
* Roles are often managed via {grantRole} and {revokeRole}: this function's
* purpose is to provide a mechanism for accounts to lose their privileges
* if they are compromised (such as when a trusted device is misplaced).
*
* If the calling account had been granted `role`, emits a {RoleRevoked}
* event.
*
* Requirements:
*
* - the caller must be `account`.
*/
function renounceRole(bytes32 role, address account) public virtual 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}.
* ====
*/
function _setupRole(bytes32 role, address account) internal virtual {
_grantRole(role, account);
}
/**
* @dev Sets `adminRole` as ``role``'s admin role.
*
* Emits a {RoleAdminChanged} event.
*/
function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
emit RoleAdminChanged(role, getRoleAdmin(role), adminRole);
_roles[role].adminRole = adminRole;
}
function _grantRole(bytes32 role, address account) private {
if (!hasRole(role, account)) {
_roles[role].members[account] = true;
emit RoleGranted(role, account, _msgSender());
}
}
function _revokeRole(bytes32 role, address account) private {
if (hasRole(role, account)) {
_roles[role].members[account] = false;
emit RoleRevoked(role, account, _msgSender());
}
}
}
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);
}
interface IERC721Enumerable is IERC721 {
/**
* @dev Returns the total amount of tokens stored by the contract.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns a token ID owned by `owner` at a given `index` of its token list.
* Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
*/
function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);
/**
* @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
* Use along with {totalSupply} to enumerate all tokens.
*/
function tokenByIndex(uint256 index) external view returns (uint256);
}
interface IAccessControlEnumerable {
function getRoleMember(bytes32 role, uint256 index) external view returns (address);
function getRoleMemberCount(bytes32 role) external view returns (uint256);
}
/**
* @dev Extension of {AccessControl} that allows enumerating the members of each role.
*/
abstract contract AccessControlEnumerable is IAccessControlEnumerable, AccessControl {
using EnumerableSet for EnumerableSet.AddressSet;
mapping (bytes32 => EnumerableSet.AddressSet) private _roleMembers;
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IAccessControlEnumerable).interfaceId
|| super.supportsInterface(interfaceId);
}
/**
* @dev Returns one of the accounts that have `role`. `index` must be a
* value between 0 and {getRoleMemberCount}, non-inclusive.
*
* Role bearers are not sorted in any particular way, and their ordering may
* change at any point.
*
* WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure
* you perform all queries on the same block. See the following
* https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post]
* for more information.
*/
function getRoleMember(bytes32 role, uint256 index) public view override returns (address) {
return _roleMembers[role].at(index);
}
/**
* @dev Returns the number of accounts that have `role`. Can be used
* together with {getRoleMember} to enumerate all bearers of a role.
*/
function getRoleMemberCount(bytes32 role) public view override returns (uint256) {
return _roleMembers[role].length();
}
/**
* @dev Overload {grantRole} to track enumerable memberships
*/
function grantRole(bytes32 role, address account) public virtual override {
super.grantRole(role, account);
_roleMembers[role].add(account);
}
/**
* @dev Overload {revokeRole} to track enumerable memberships
*/
function revokeRole(bytes32 role, address account) public virtual override {
super.revokeRole(role, account);
_roleMembers[role].remove(account);
}
/**
* @dev Overload {renounceRole} to track enumerable memberships
*/
function renounceRole(bytes32 role, address account) public virtual override {
super.renounceRole(role, account);
_roleMembers[role].remove(account);
}
/**
* @dev Overload {_setupRole} to track enumerable memberships
*/
function _setupRole(bytes32 role, address account) internal virtual override {
super._setupRole(role, account);
_roleMembers[role].add(account);
}
}
error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerQueryForNonexistentToken();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();
error TokenIndexOutOfBounds();
/**
* @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
* the Metadata extension. Built to optimize for lower gas during batch mints.
*
* Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..).
*
* Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
*
* Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
*/
contract ERC721A is Context, ERC165, IERC721, IERC721Metadata {
using Address for address;
using Strings for uint256;
// Compiler will pack this into a single 256bit word.
struct TokenOwnership {
// The address of the owner.
address addr;
// Keeps track of the start time of ownership with minimal overhead for tokenomics.
uint64 startTimestamp;
// Whether the token has been burned.
bool burned;
}
// Compiler will pack this into a single 256bit word.
struct AddressData {
// Realistically, 2**64-1 is more than enough.
uint64 balance;
// Keeps track of mint count with minimal overhead for tokenomics.
uint64 numberMinted;
// Keeps track of burn count with minimal overhead for tokenomics.
uint64 numberBurned;
// For miscellaneous variable(s) pertaining to the address
// (e.g. number of whitelist mint slots used).
// If there are multiple variables, please pack them into a uint64.
uint64 aux;
}
// The tokenId of the next token to be minted.
uint256 internal _currentIndex;
// The number of tokens burned.
uint256 internal _burnCounter;
// Token name
string private _name;
// Token symbol
string private _symbol;
// Mapping from token ID to ownership details
// An empty struct value does not necessarily mean the token is unowned. See _ownershipOf implementation for details.
mapping(uint256 => TokenOwnership) internal _ownerships;
// Mapping owner address to address data
mapping(address => AddressData) private _addressData;
// 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;
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
_currentIndex = _startTokenId();
}
/**
* To change the starting tokenId, please override this function.
*/
function _startTokenId() internal view virtual returns (uint256) {
return 0;
}
/**
* @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
*/
function totalSupply() public view returns (uint256) {
// Counter underflow is impossible as _burnCounter cannot be incremented
// more than _currentIndex - _startTokenId() times
unchecked {
return _currentIndex - _burnCounter - _startTokenId();
}
}
/**
* @dev See {IERC721Enumerable-tokenByIndex}.
*/
function tokenByIndex(uint256 index) public view returns (uint256) {
if (index >= totalSupply()) revert TokenIndexOutOfBounds();
return index;
}
/**
* Returns the total amount of tokens minted in the contract.
*/
function _totalMinted() internal view returns (uint256) {
// Counter underflow is impossible as _currentIndex does not decrement,
// and it is initialized to _startTokenId()
unchecked {
return _currentIndex - _startTokenId();
}
}
/**
* @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 override returns (uint256) {
if (owner == address(0)) revert BalanceQueryForZeroAddress();
return uint256(_addressData[owner].balance);
}
/**
* Returns the number of tokens minted by `owner`.
*/
function _numberMinted(address owner) internal view returns (uint256) {
return uint256(_addressData[owner].numberMinted);
}
/**
* Returns the number of tokens burned by or on behalf of `owner`.
*/
function _numberBurned(address owner) internal view returns (uint256) {
return uint256(_addressData[owner].numberBurned);
}
/**
* Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
*/
function _getAux(address owner) internal view returns (uint64) {
return _addressData[owner].aux;
}
/**
* Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
* If there are multiple variables, please pack them into a uint64.
*/
function _setAux(address owner, uint64 aux) internal {
_addressData[owner].aux = aux;
}
/**
* Gas spent here starts off proportional to the maximum mint batch size.
* It gradually moves to O(1) as tokens get transferred around in the collection over time.
*/
function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
uint256 curr = tokenId;
unchecked {
if (_startTokenId() <= curr && curr < _currentIndex) {
TokenOwnership memory ownership = _ownerships[curr];
if (!ownership.burned) {
if (ownership.addr != address(0)) {
return ownership;
}
// Invariant:
// There will always be an ownership that has an address and is not burned
// before an ownership that does not have an address and is not burned.
// Hence, curr will not underflow.
while (true) {
curr--;
ownership = _ownerships[curr];
if (ownership.addr != address(0)) {
return ownership;
}
}
}
}
}
revert OwnerQueryForNonexistentToken();
}
/**
* @dev See {IERC721-ownerOf}.
*/
function ownerOf(uint256 tokenId) public view override returns (address) {
return _ownershipOf(tokenId).addr;
}
/**
* @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) {
if (!_exists(tokenId)) revert URIQueryForNonexistentToken();
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 overriden in child contracts.
*/
function _baseURI() internal view virtual returns (string memory) {
return '';
}
/**
* @dev See {IERC721-approve}.
*/
function approve(address to, uint256 tokenId) public override {
address owner = ERC721A.ownerOf(tokenId);
if (to == owner) revert ApprovalToCurrentOwner();
if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) {
revert ApprovalCallerNotOwnerNorApproved();
}
_approve(to, tokenId, owner);
}
/**
* @dev See {IERC721-getApproved}.
*/
function getApproved(uint256 tokenId) public view override returns (address) {
if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();
return _tokenApprovals[tokenId];
}
/**
* @dev See {IERC721-setApprovalForAll}.
*/
function setApprovalForAll(address operator, bool approved) public virtual override {
if (operator == _msgSender()) revert ApproveToCaller();
_operatorApprovals[_msgSender()][operator] = approved;
emit ApprovalForAll(_msgSender(), operator, approved);
}
/**
* @dev See {IERC721-isApprovedForAll}.
*/
function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
return _operatorApprovals[owner][operator];
}
/**
* @dev See {IERC721-transferFrom}.
*/
function transferFrom(
address from,
address to,
uint256 tokenId
) public virtual override {
_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 {
_transfer(from, to, tokenId);
if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) {
revert TransferToNonERC721ReceiverImplementer();
}
}
/**
* @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`),
*/
function _exists(uint256 tokenId) internal view returns (bool) {
return _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned;
}
function _safeMint(address to, uint256 quantity) internal {
_safeMint(to, quantity, '');
}
/**
* @dev Safely mints `quantity` tokens and transfers them to `to`.
*
* Requirements:
*
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
* - `quantity` must be greater than 0.
*
* Emits a {Transfer} event.
*/
function _safeMint(
address to,
uint256 quantity,
bytes memory _data
) internal {
_mint(to, quantity, _data, true);
}
/**
* @dev Mints `quantity` tokens and transfers them to `to`.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - `quantity` must be greater than 0.
*
* Emits a {Transfer} event.
*/
function _mint(
address to,
uint256 quantity,
bytes memory _data,
bool safe
) internal {
uint256 startTokenId = _currentIndex;
if (to == address(0)) revert MintToZeroAddress();
if (quantity == 0) revert MintZeroQuantity();
_beforeTokenTransfers(address(0), to, startTokenId, quantity);
// Overflows are incredibly unrealistic.
// balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
// updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
unchecked {
_addressData[to].balance += uint64(quantity);
_addressData[to].numberMinted += uint64(quantity);
_ownerships[startTokenId].addr = to;
_ownerships[startTokenId].startTimestamp = uint64(block.timestamp);
uint256 updatedIndex = startTokenId;
uint256 end = updatedIndex + quantity;
if (safe && to.isContract()) {
do {
emit Transfer(address(0), to, updatedIndex);
if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
revert TransferToNonERC721ReceiverImplementer();
}
} while (updatedIndex != end);
// Reentrancy protection
if (_currentIndex != startTokenId) revert();
} else {
do {
emit Transfer(address(0), to, updatedIndex++);
} while (updatedIndex != end);
}
_currentIndex = updatedIndex;
}
_afterTokenTransfers(address(0), to, startTokenId, quantity);
}
/**
* @dev Transfers `tokenId` from `from` to `to`.
*
* 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
) private {
TokenOwnership memory prevOwnership = _ownershipOf(tokenId);
if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();
bool isApprovedOrOwner = (_msgSender() == from ||
isApprovedForAll(from, _msgSender()) ||
getApproved(tokenId) == _msgSender());
if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
if (to == address(0)) revert TransferToZeroAddress();
_beforeTokenTransfers(from, to, tokenId, 1);
// Clear approvals from the previous owner
_approve(address(0), tokenId, from);
// Underflow of the sender's balance is impossible because we check for
// ownership above and the recipient's balance can't realistically overflow.
// Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
unchecked {
_addressData[from].balance -= 1;
_addressData[to].balance += 1;
TokenOwnership storage currSlot = _ownerships[tokenId];
currSlot.addr = to;
currSlot.startTimestamp = uint64(block.timestamp);
// If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
// Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
uint256 nextTokenId = tokenId + 1;
TokenOwnership storage nextSlot = _ownerships[nextTokenId];
if (nextSlot.addr == address(0)) {
// This will suffice for checking _exists(nextTokenId),
// as a burned slot cannot contain the zero address.
if (nextTokenId != _currentIndex) {
nextSlot.addr = from;
nextSlot.startTimestamp = prevOwnership.startTimestamp;
}
}
}
emit Transfer(from, to, tokenId);
_afterTokenTransfers(from, to, tokenId, 1);
}
/**
* @dev This is equivalent to _burn(tokenId, false)
*/
function _burn(uint256 tokenId) internal virtual {
_burn(tokenId, false);
}
/**
* @dev Destroys `tokenId`.
* The approval is cleared when the token is burned.
*
* Requirements:
*
* - `tokenId` must exist.
*
* Emits a {Transfer} event.
*/
function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
TokenOwnership memory prevOwnership = _ownershipOf(tokenId);
address from = prevOwnership.addr;
if (approvalCheck) {
bool isApprovedOrOwner = (_msgSender() == from ||
isApprovedForAll(from, _msgSender()) ||
getApproved(tokenId) == _msgSender());
if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
}
_beforeTokenTransfers(from, address(0), tokenId, 1);
// Clear approvals from the previous owner
_approve(address(0), tokenId, from);
// Underflow of the sender's balance is impossible because we check for
// ownership above and the recipient's balance can't realistically overflow.
// Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
unchecked {
AddressData storage addressData = _addressData[from];
addressData.balance -= 1;
addressData.numberBurned += 1;
// Keep track of who burned the token, and the timestamp of burning.
TokenOwnership storage currSlot = _ownerships[tokenId];
currSlot.addr = from;
currSlot.startTimestamp = uint64(block.timestamp);
currSlot.burned = true;
// If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
// Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
uint256 nextTokenId = tokenId + 1;
TokenOwnership storage nextSlot = _ownerships[nextTokenId];
if (nextSlot.addr == address(0)) {
// This will suffice for checking _exists(nextTokenId),
// as a burned slot cannot contain the zero address.
if (nextTokenId != _currentIndex) {
nextSlot.addr = from;
nextSlot.startTimestamp = prevOwnership.startTimestamp;
}
}
}
emit Transfer(from, address(0), tokenId);
_afterTokenTransfers(from, address(0), tokenId, 1);
// Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
unchecked {
_burnCounter++;
}
}
/**
* @dev Approve `to` to operate on `tokenId`
*
* Emits a {Approval} event.
*/
function _approve(
address to,
uint256 tokenId,
address owner
) private {
_tokenApprovals[tokenId] = to;
emit Approval(owner, to, tokenId);
}
/**
* @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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 _checkContractOnERC721Received(
address from,
address to,
uint256 tokenId,
bytes memory _data
) private returns (bool) {
try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
return retval == IERC721Receiver(to).onERC721Received.selector;
} catch (bytes memory reason) {
if (reason.length == 0) {
revert TransferToNonERC721ReceiverImplementer();
} else {
assembly {
revert(add(32, reason), mload(reason))
}
}
}
}
/**
* @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
* And also called before burning one token.
*
* startTokenId - the first token id to be transferred
* quantity - the amount to be transferred
*
* 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, `tokenId` will be burned by `from`.
* - `from` and `to` are never both zero.
*/
function _beforeTokenTransfers(
address from,
address to,
uint256 startTokenId,
uint256 quantity
) internal virtual {}
/**
* @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
* minting.
* And also called after one token has been burned.
*
* startTokenId - the first token id to be transferred
* quantity - the amount to be transferred
*
* Calling conditions:
*
* - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
* transferred to `to`.
* - When `from` is zero, `tokenId` has been minted for `to`.
* - When `to` is zero, `tokenId` has been burned by `from`.
* - `from` and `to` are never both zero.
*/
function _afterTokenTransfers(
address from,
address to,
uint256 startTokenId,
uint256 quantity
) internal virtual {}
}
/** ERC721APausable */
error ContractPaused();
/**
* @dev ERC721A token with pausable token transfers, minting and burning.
*
* Based off of OpenZeppelin's ERC721Pausable extension.
*
* Useful for scenarios such as preventing trades until the end of an evaluation
* period, or having an emergency switch for freezing all token transfers in the
* event of a large bug.
*/
abstract contract ERC721APausable is ERC721A, Pausable {
/**
* @dev See {ERC721A-_beforeTokenTransfers}.
*
* Requirements:
*
* - the contract must not be paused.
*/
function _beforeTokenTransfers(
address from,
address to,
uint256 startTokenId,
uint256 quantity
) internal virtual override(ERC721A) {
super._beforeTokenTransfers(from, to, startTokenId, quantity);
if (paused()) revert ContractPaused();
}
}
/** ERC721ABurnable */
/**
* @title ERC721A Burnable Token
* @dev ERC721A Token that can be irreversibly burned (destroyed).
*/
abstract contract ERC721ABurnable is ERC721A {
/**
* @dev Burns `tokenId`. See {ERC721A-_burn}.
*
* Requirements:
*
* - The caller must own `tokenId` or be an approved operator.
*/
function burn(uint256 tokenId) public virtual {
_burn(tokenId, true);
}
}
contract ERC721PresetMinterPauserAutoId is Context, AccessControlEnumerable, ERC721A, ERC721ABurnable, ERC721APausable {
bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE");
bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE");
string private _baseTokenURI;
/**
* @dev Grants `DEFAULT_ADMIN_ROLE`, `MINTER_ROLE` and `PAUSER_ROLE` to the
* account that deploys the contract.
*
* Token URIs will be autogenerated based on `baseURI` and their token IDs.
* See {ERC721-tokenURI}.
*/
constructor(string memory name, string memory symbol, string memory baseTokenURI) ERC721A(name, symbol) {
_baseTokenURI = baseTokenURI;
_setupRole(DEFAULT_ADMIN_ROLE, _msgSender());
_setupRole(MINTER_ROLE, _msgSender());
_setupRole(PAUSER_ROLE, _msgSender());
}
function _baseURI() internal view virtual override returns (string memory) {
return _baseTokenURI;
}
function mint(
address to,
uint256 quantity,
bytes memory _data,
bool safe
) public virtual {
require(hasRole(MINTER_ROLE, _msgSender()), "ERC721PresetMinterPauserAutoId: must have minter role to mint");
_mint(to, quantity, _data, safe);
}
/**
* @dev Pauses all token transfers.
*
* See {ERC721Pausable} and {Pausable-_pause}.
*
* Requirements:
*
* - the caller must have the `PAUSER_ROLE`.
*/
function pause() public virtual {
require(hasRole(PAUSER_ROLE, _msgSender()), "ERC721PresetMinterPauserAutoId: must have pauser role to pause");
_pause();
}
/**
* @dev Unpauses all token transfers.
*
* See {ERC721Pausable} and {Pausable-_unpause}.
*
* Requirements:
*
* - the caller must have the `PAUSER_ROLE`.
*/
function unpause() public virtual {
require(hasRole(PAUSER_ROLE, _msgSender()), "ERC721PresetMinterPauserAutoId: must have pauser role to unpause");
_unpause();
}
function _beforeTokenTransfers(
address from,
address to,
uint256 startTokenId,
uint256 quantity
) internal virtual override(ERC721APausable, ERC721A) {
super._beforeTokenTransfers(from, to, startTokenId, quantity);
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override(AccessControlEnumerable, ERC721A) returns (bool) {
return super.supportsInterface(interfaceId);
}
}
contract BoredCryptoApes is ERC721PresetMinterPauserAutoId {
using Strings for uint256;
constructor() ERC721PresetMinterPauserAutoId("Bored Crypto Apes", "BCA", "https://boredcryptoapes.io/api/item/view/") {}
function mintMain(uint256 _quantity) external {
_safeMint(msg.sender, _quantity);
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"ContractPaused","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TokenIndexOutOfBounds","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","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":"address","name":"to","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"},{"internalType":"bool","name":"safe","type":"bool"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"mintMain","outputs":[],"stateMutability":"nonpayable","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":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"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":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60806040523480156200001157600080fd5b506040518060400160405280601181526020017f426f7265642043727970746f20417065730000000000000000000000000000008152506040518060400160405280600381526020017f4243410000000000000000000000000000000000000000000000000000000000815250604051806060016040528060298152602001620044146029913982828160049080519060200190620000b292919062000462565b508060059080519060200190620000cb92919062000462565b50620000dc620001c760201b60201c565b60028190555050506000600a60006101000a81548160ff02191690831515021790555080600b90805190602001906200011792919062000462565b506200013c6000801b62000130620001cc60201b60201c565b620001d460201b60201c565b6200017d7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a662000171620001cc60201b60201c565b620001d460201b60201c565b620001be7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a620001b2620001cc60201b60201c565b620001d460201b60201c565b50505062000577565b600090565b600033905090565b620001eb82826200021c60201b620010de1760201c565b6200021781600160008581526020019081526020016000206200023260201b620010ec1790919060201c565b505050565b6200022e82826200026a60201b60201c565b5050565b600062000262836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6200035b60201b60201c565b905092915050565b6200027c8282620003d560201b60201c565b6200035757600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620002fc620001cc60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b60006200036f83836200043f60201b60201c565b620003ca578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050620003cf565b600090505b92915050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600080836001016000848152602001908152602001600020541415905092915050565b828054620004709062000512565b90600052602060002090601f016020900481019282620004945760008555620004e0565b82601f10620004af57805160ff1916838001178555620004e0565b82800160010185558215620004e0579182015b82811115620004df578251825591602001919060010190620004c2565b5b509050620004ef9190620004f3565b5090565b5b808211156200050e576000816000905550600101620004f4565b5090565b600060028204905060018216806200052b57607f821691505b6020821081141562000542576200054162000548565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b613e8d80620005876000396000f3fe608060405234801561001057600080fd5b50600436106101e55760003560e01c806370a082311161010f578063ad9df9c7116100a2578063d539139311610071578063d53913931461058c578063d547741f146105aa578063e63ab1e9146105c6578063e985e9c5146105e4576101e5565b8063ad9df9c7146104f4578063b88d4fde14610510578063c87b56dd1461052c578063ca15c8731461055c576101e5565b806391d14854116100de57806391d148541461046c57806395d89b411461049c578063a217fddf146104ba578063a22cb465146104d8576101e5565b806370a08231146103e65780638456cb59146104165780638abc67a5146104205780639010d07c1461043c576101e5565b80632f2ff15d1161018757806342966c681161015657806342966c681461034c5780634f6ccce7146103685780635c975abb146103985780636352211e146103b6576101e5565b80632f2ff15d146102ee57806336568abe1461030a5780633f4ba83a1461032657806342842e0e14610330576101e5565b8063095ea7b3116101c3578063095ea7b31461026857806318160ddd1461028457806323b872dd146102a2578063248a9ca3146102be576101e5565b806301ffc9a7146101ea57806306fdde031461021a578063081812fc14610238575b600080fd5b61020460048036038101906101ff919061327a565b610614565b60405161021191906135a6565b60405180910390f35b610222610626565b60405161022f91906135dc565b60405180910390f35b610252600480360381019061024d91906132d4565b6106b8565b60405161025f919061353f565b60405180910390f35b610282600480360381019061027d919061310a565b610734565b005b61028c61083f565b604051610299919061371e565b60405180910390f35b6102bc60048036038101906102b79190612ff4565b610856565b005b6102d860048036038101906102d391906131cd565b610866565b6040516102e591906135c1565b60405180910390f35b610308600480360381019061030391906131fa565b610885565b005b610324600480360381019061031f91906131fa565b6108b9565b005b61032e6108ed565b005b61034a60048036038101906103459190612ff4565b610967565b005b610366600480360381019061036191906132d4565b610987565b005b610382600480360381019061037d91906132d4565b610995565b60405161038f919061371e565b60405180910390f35b6103a06109df565b6040516103ad91906135a6565b60405180910390f35b6103d060048036038101906103cb91906132d4565b6109f6565b6040516103dd919061353f565b60405180910390f35b61040060048036038101906103fb9190612f87565b610a0c565b60405161040d919061371e565b60405180910390f35b61041e610adc565b005b61043a600480360381019061043591906132d4565b610b56565b005b6104566004803603810190610451919061323a565b610b63565b604051610463919061353f565b60405180910390f35b610486600480360381019061048191906131fa565b610b92565b60405161049391906135a6565b60405180910390f35b6104a4610bfc565b6040516104b191906135dc565b60405180910390f35b6104c2610c8e565b6040516104cf91906135c1565b60405180910390f35b6104f260048036038101906104ed91906130ca565b610c95565b005b61050e6004803603810190610509919061314a565b610e0d565b005b61052a60048036038101906105259190613047565b610e8f565b005b610546600480360381019061054191906132d4565b610f0b565b60405161055391906135dc565b60405180910390f35b610576600480360381019061057191906131cd565b610faa565b604051610583919061371e565b60405180910390f35b610594610fce565b6040516105a191906135c1565b60405180910390f35b6105c460048036038101906105bf91906131fa565b610ff2565b005b6105ce611026565b6040516105db91906135c1565b60405180910390f35b6105fe60048036038101906105f99190612fb4565b61104a565b60405161060b91906135a6565b60405180910390f35b600061061f8261111c565b9050919050565b6060600480546106359061394d565b80601f01602080910402602001604051908101604052809291908181526020018280546106619061394d565b80156106ae5780601f10610683576101008083540402835291602001916106ae565b820191906000526020600020905b81548152906001019060200180831161069157829003601f168201915b5050505050905090565b60006106c3826111fe565b6106f9576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6008600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061073f826109f6565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156107a7576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166107c661124c565b73ffffffffffffffffffffffffffffffffffffffff16141580156107f857506107f6816107f161124c565b61104a565b155b1561082f576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61083a838383611254565b505050565b6000610849611306565b6003546002540303905090565b61086183838361130b565b505050565b6000806000838152602001908152602001600020600101549050919050565b61088f82826117c1565b6108b481600160008581526020019081526020016000206110ec90919063ffffffff16565b505050565b6108c38282611827565b6108e881600160008581526020019081526020016000206118aa90919063ffffffff16565b505050565b61091e7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61091961124c565b610b92565b61095d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610954906136de565b60405180910390fd5b6109656118da565b565b61098283838360405180602001604052806000815250610e8f565b505050565b61099281600161197c565b50565b600061099f61083f565b82106109d7576040517fa723001c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b819050919050565b6000600a60009054906101000a900460ff16905090565b6000610a0182611d6c565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610a74576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b610b0d7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610b0861124c565b610b92565b610b4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b439061365e565b60405180910390fd5b610b54611ffb565b565b610b60338261209e565b50565b6000610b8a82600160008681526020019081526020016000206120bc90919063ffffffff16565b905092915050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060058054610c0b9061394d565b80601f0160208091040260200160405190810160405280929190818152602001828054610c379061394d565b8015610c845780601f10610c5957610100808354040283529160200191610c84565b820191906000526020600020905b815481529060010190602001808311610c6757829003601f168201915b5050505050905090565b6000801b81565b610c9d61124c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d02576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060096000610d0f61124c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610dbc61124c565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610e0191906135a6565b60405180910390a35050565b610e3e7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6610e3961124c565b610b92565b610e7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e74906136be565b60405180910390fd5b610e89848484846120d6565b50505050565b610e9a84848461130b565b610eb98373ffffffffffffffffffffffffffffffffffffffff166124a5565b8015610ece5750610ecc848484846124b8565b155b15610f05576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6060610f16826111fe565b610f4c576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610f56612618565b9050600081511415610f775760405180602001604052806000815250610fa2565b80610f81846126aa565b604051602001610f9292919061351b565b6040516020818303038152906040525b915050919050565b6000610fc76001600084815260200190815260200160002061280b565b9050919050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b610ffc8282612820565b61102181600160008581526020019081526020016000206118aa90919063ffffffff16565b505050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6110e88282612886565b5050565b6000611114836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612966565b905092915050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806111e757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806111f757506111f6826129d6565b5b9050919050565b600081611209611306565b11158015611218575060025482105b8015611245575060066000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826008600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b600061131682611d6c565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611381576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166113a261124c565b73ffffffffffffffffffffffffffffffffffffffff1614806113d157506113d0856113cb61124c565b61104a565b5b8061141657506113df61124c565b73ffffffffffffffffffffffffffffffffffffffff166113fe846106b8565b73ffffffffffffffffffffffffffffffffffffffff16145b90508061144f576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156114b6576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6114c38585856001612a50565b6114cf60008487611254565b6001600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600660008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600660008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561174f57600254821461174e57878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46117ba8585856001612a62565b5050505050565b6117da6117cd83610866565b6117d561124c565b610b92565b611819576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118109061361e565b60405180910390fd5b6118238282612886565b5050565b61182f61124c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461189c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611893906136fe565b60405180910390fd5b6118a68282612a68565b5050565b60006118d2836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612b49565b905092915050565b6118e26109df565b611921576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119189061363e565b60405180910390fd5b6000600a60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa61196561124c565b604051611972919061353f565b60405180910390a1565b600061198783611d6c565b90506000816000015190508215611a685760008173ffffffffffffffffffffffffffffffffffffffff166119b961124c565b73ffffffffffffffffffffffffffffffffffffffff1614806119e857506119e7826119e261124c565b61104a565b5b80611a2d57506119f661124c565b73ffffffffffffffffffffffffffffffffffffffff16611a15866106b8565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611a66576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b611a76816000866001612a50565b611a8260008583611254565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060018160000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060018160000160108282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600660008781526020019081526020016000209050828160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600181600001601c6101000a81548160ff02191690831515021790555060006001870190506000600660008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611ce6576002548214611ce557848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555085602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b5050505083600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611d54816000866001612a62565b60036000815480929190600101919050555050505050565b611d74612e56565b600082905080611d82611306565b11158015611d91575060025481105b15611fc4576000600660008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151611fc257600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611ea6578092505050611ff6565b5b600115611fc157818060019003925050600660008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611fbc578092505050611ff6565b611ea7565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6120036109df565b15612043576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203a9061369e565b60405180910390fd5b6001600a60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861208761124c565b604051612094919061353f565b60405180910390a1565b6120b8828260405180602001604052806000815250612c61565b5050565b60006120cb8360000183612c73565b60001c905092915050565b60006002549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612144576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084141561217f576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61218c6000868387612a50565b83600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846006600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426006600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008190506000858201905083801561235657506123558773ffffffffffffffffffffffffffffffffffffffff166124a5565b5b1561241c575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46123cb60008884806001019550886124b8565b612401576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082141561235c57826002541461241757600080fd5b612488565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082141561241d575b81600281905550505061249e6000868387612a62565b5050505050565b600080823b905060008111915050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026124de61124c565b8786866040518563ffffffff1660e01b8152600401612500949392919061355a565b602060405180830381600087803b15801561251a57600080fd5b505af192505050801561254b57506040513d601f19601f8201168201806040525081019061254891906132a7565b60015b6125c5573d806000811461257b576040519150601f19603f3d011682016040523d82523d6000602084013e612580565b606091505b506000815114156125bd576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600b80546126279061394d565b80601f01602080910402602001604051908101604052809291908181526020018280546126539061394d565b80156126a05780601f10612675576101008083540402835291602001916126a0565b820191906000526020600020905b81548152906001019060200180831161268357829003601f168201915b5050505050905090565b606060008214156126f2576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612806565b600082905060005b6000821461272457808061270d906139b0565b915050600a8261271d9190613828565b91506126fa565b60008167ffffffffffffffff8111156127405761273f613b15565b5b6040519080825280601f01601f1916602001820160405280156127725781602001600182028036833780820191505090505b5090505b600085146127ff5760018261278b9190613859565b9150600a8561279a91906139f9565b60306127a691906137d2565b60f81b8183815181106127bc576127bb613ae6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856127f89190613828565b9450612776565b8093505050505b919050565b600061281982600001612ce7565b9050919050565b61283961282c83610866565b61283461124c565b610b92565b612878576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286f9061367e565b60405180910390fd5b6128828282612a68565b5050565b6128908282610b92565b61296257600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061290761124c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b60006129728383612cf8565b6129cb5782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506129d0565b600090505b92915050565b60007f5a05180f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612a495750612a4882612d1b565b5b9050919050565b612a5c84848484612d95565b50505050565b50505050565b612a728282610b92565b15612b4557600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550612aea61124c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b60008083600101600084815260200190815260200160002054905060008114612c55576000600182612b7b9190613859565b9050600060018660000180549050612b939190613859565b90506000866000018281548110612bad57612bac613ae6565b5b9060005260206000200154905080876000018481548110612bd157612bd0613ae6565b5b9060005260206000200181905550600183612bec91906137d2565b8760010160008381526020019081526020016000208190555086600001805480612c1957612c18613ab7565b5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050612c5b565b60009150505b92915050565b612c6e83838360016120d6565b505050565b600081836000018054905011612cbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cb5906135fe565b60405180910390fd5b826000018281548110612cd457612cd3613ae6565b5b9060005260206000200154905092915050565b600081600001805490509050919050565b600080836001016000848152602001908152602001600020541415905092915050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612d8e5750612d8d82612de6565b5b9050919050565b612da184848484612e50565b612da96109df565b15612de0576040517fab35696f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b50505050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b6000612eac612ea78461375e565b613739565b905082815260208101848484011115612ec857612ec7613b49565b5b612ed384828561390b565b509392505050565b600081359050612eea81613de4565b92915050565b600081359050612eff81613dfb565b92915050565b600081359050612f1481613e12565b92915050565b600081359050612f2981613e29565b92915050565b600081519050612f3e81613e29565b92915050565b600082601f830112612f5957612f58613b44565b5b8135612f69848260208601612e99565b91505092915050565b600081359050612f8181613e40565b92915050565b600060208284031215612f9d57612f9c613b53565b5b6000612fab84828501612edb565b91505092915050565b60008060408385031215612fcb57612fca613b53565b5b6000612fd985828601612edb565b9250506020612fea85828601612edb565b9150509250929050565b60008060006060848603121561300d5761300c613b53565b5b600061301b86828701612edb565b935050602061302c86828701612edb565b925050604061303d86828701612f72565b9150509250925092565b6000806000806080858703121561306157613060613b53565b5b600061306f87828801612edb565b945050602061308087828801612edb565b935050604061309187828801612f72565b925050606085013567ffffffffffffffff8111156130b2576130b1613b4e565b5b6130be87828801612f44565b91505092959194509250565b600080604083850312156130e1576130e0613b53565b5b60006130ef85828601612edb565b925050602061310085828601612ef0565b9150509250929050565b6000806040838503121561312157613120613b53565b5b600061312f85828601612edb565b925050602061314085828601612f72565b9150509250929050565b6000806000806080858703121561316457613163613b53565b5b600061317287828801612edb565b945050602061318387828801612f72565b935050604085013567ffffffffffffffff8111156131a4576131a3613b4e565b5b6131b087828801612f44565b92505060606131c187828801612ef0565b91505092959194509250565b6000602082840312156131e3576131e2613b53565b5b60006131f184828501612f05565b91505092915050565b6000806040838503121561321157613210613b53565b5b600061321f85828601612f05565b925050602061323085828601612edb565b9150509250929050565b6000806040838503121561325157613250613b53565b5b600061325f85828601612f05565b925050602061327085828601612f72565b9150509250929050565b6000602082840312156132905761328f613b53565b5b600061329e84828501612f1a565b91505092915050565b6000602082840312156132bd576132bc613b53565b5b60006132cb84828501612f2f565b91505092915050565b6000602082840312156132ea576132e9613b53565b5b60006132f884828501612f72565b91505092915050565b61330a8161388d565b82525050565b6133198161389f565b82525050565b613328816138ab565b82525050565b60006133398261378f565b61334381856137a5565b935061335381856020860161391a565b61335c81613b58565b840191505092915050565b60006133728261379a565b61337c81856137b6565b935061338c81856020860161391a565b61339581613b58565b840191505092915050565b60006133ab8261379a565b6133b581856137c7565b93506133c581856020860161391a565b80840191505092915050565b60006133de6022836137b6565b91506133e982613b69565b604082019050919050565b6000613401602f836137b6565b915061340c82613bb8565b604082019050919050565b60006134246014836137b6565b915061342f82613c07565b602082019050919050565b6000613447603e836137b6565b915061345282613c30565b604082019050919050565b600061346a6030836137b6565b915061347582613c7f565b604082019050919050565b600061348d6010836137b6565b915061349882613cce565b602082019050919050565b60006134b0603d836137b6565b91506134bb82613cf7565b604082019050919050565b60006134d36040836137b6565b91506134de82613d46565b604082019050919050565b60006134f6602f836137b6565b915061350182613d95565b604082019050919050565b61351581613901565b82525050565b600061352782856133a0565b915061353382846133a0565b91508190509392505050565b60006020820190506135546000830184613301565b92915050565b600060808201905061356f6000830187613301565b61357c6020830186613301565b613589604083018561350c565b818103606083015261359b818461332e565b905095945050505050565b60006020820190506135bb6000830184613310565b92915050565b60006020820190506135d6600083018461331f565b92915050565b600060208201905081810360008301526135f68184613367565b905092915050565b60006020820190508181036000830152613617816133d1565b9050919050565b60006020820190508181036000830152613637816133f4565b9050919050565b6000602082019050818103600083015261365781613417565b9050919050565b600060208201905081810360008301526136778161343a565b9050919050565b600060208201905081810360008301526136978161345d565b9050919050565b600060208201905081810360008301526136b781613480565b9050919050565b600060208201905081810360008301526136d7816134a3565b9050919050565b600060208201905081810360008301526136f7816134c6565b9050919050565b60006020820190508181036000830152613717816134e9565b9050919050565b6000602082019050613733600083018461350c565b92915050565b6000613743613754565b905061374f828261397f565b919050565b6000604051905090565b600067ffffffffffffffff82111561377957613778613b15565b5b61378282613b58565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006137dd82613901565b91506137e883613901565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561381d5761381c613a2a565b5b828201905092915050565b600061383382613901565b915061383e83613901565b92508261384e5761384d613a59565b5b828204905092915050565b600061386482613901565b915061386f83613901565b92508282101561388257613881613a2a565b5b828203905092915050565b6000613898826138e1565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561393857808201518184015260208101905061391d565b83811115613947576000848401525b50505050565b6000600282049050600182168061396557607f821691505b6020821081141561397957613978613a88565b5b50919050565b61398882613b58565b810181811067ffffffffffffffff821117156139a7576139a6613b15565b5b80604052505050565b60006139bb82613901565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156139ee576139ed613a2a565b5b600182019050919050565b6000613a0482613901565b9150613a0f83613901565b925082613a1f57613a1e613a59565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e60008201527f2061646d696e20746f206772616e740000000000000000000000000000000000602082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f4552433732315072657365744d696e7465725061757365724175746f49643a2060008201527f6d75737420686176652070617573657220726f6c6520746f2070617573650000602082015250565b7f416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e60008201527f2061646d696e20746f207265766f6b6500000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732315072657365744d696e7465725061757365724175746f49643a2060008201527f6d7573742068617665206d696e74657220726f6c6520746f206d696e74000000602082015250565b7f4552433732315072657365744d696e7465725061757365724175746f49643a2060008201527f6d75737420686176652070617573657220726f6c6520746f20756e7061757365602082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b613ded8161388d565b8114613df857600080fd5b50565b613e048161389f565b8114613e0f57600080fd5b50565b613e1b816138ab565b8114613e2657600080fd5b50565b613e32816138b5565b8114613e3d57600080fd5b50565b613e4981613901565b8114613e5457600080fd5b5056fea26469706673582212205b76151551a9739a9f61a71f39932f59ae7c1f7698c74e8a0ffb2aecd7eb96d464736f6c6343000807003368747470733a2f2f626f72656463727970746f617065732e696f2f6170692f6974656d2f766965772f
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101e55760003560e01c806370a082311161010f578063ad9df9c7116100a2578063d539139311610071578063d53913931461058c578063d547741f146105aa578063e63ab1e9146105c6578063e985e9c5146105e4576101e5565b8063ad9df9c7146104f4578063b88d4fde14610510578063c87b56dd1461052c578063ca15c8731461055c576101e5565b806391d14854116100de57806391d148541461046c57806395d89b411461049c578063a217fddf146104ba578063a22cb465146104d8576101e5565b806370a08231146103e65780638456cb59146104165780638abc67a5146104205780639010d07c1461043c576101e5565b80632f2ff15d1161018757806342966c681161015657806342966c681461034c5780634f6ccce7146103685780635c975abb146103985780636352211e146103b6576101e5565b80632f2ff15d146102ee57806336568abe1461030a5780633f4ba83a1461032657806342842e0e14610330576101e5565b8063095ea7b3116101c3578063095ea7b31461026857806318160ddd1461028457806323b872dd146102a2578063248a9ca3146102be576101e5565b806301ffc9a7146101ea57806306fdde031461021a578063081812fc14610238575b600080fd5b61020460048036038101906101ff919061327a565b610614565b60405161021191906135a6565b60405180910390f35b610222610626565b60405161022f91906135dc565b60405180910390f35b610252600480360381019061024d91906132d4565b6106b8565b60405161025f919061353f565b60405180910390f35b610282600480360381019061027d919061310a565b610734565b005b61028c61083f565b604051610299919061371e565b60405180910390f35b6102bc60048036038101906102b79190612ff4565b610856565b005b6102d860048036038101906102d391906131cd565b610866565b6040516102e591906135c1565b60405180910390f35b610308600480360381019061030391906131fa565b610885565b005b610324600480360381019061031f91906131fa565b6108b9565b005b61032e6108ed565b005b61034a60048036038101906103459190612ff4565b610967565b005b610366600480360381019061036191906132d4565b610987565b005b610382600480360381019061037d91906132d4565b610995565b60405161038f919061371e565b60405180910390f35b6103a06109df565b6040516103ad91906135a6565b60405180910390f35b6103d060048036038101906103cb91906132d4565b6109f6565b6040516103dd919061353f565b60405180910390f35b61040060048036038101906103fb9190612f87565b610a0c565b60405161040d919061371e565b60405180910390f35b61041e610adc565b005b61043a600480360381019061043591906132d4565b610b56565b005b6104566004803603810190610451919061323a565b610b63565b604051610463919061353f565b60405180910390f35b610486600480360381019061048191906131fa565b610b92565b60405161049391906135a6565b60405180910390f35b6104a4610bfc565b6040516104b191906135dc565b60405180910390f35b6104c2610c8e565b6040516104cf91906135c1565b60405180910390f35b6104f260048036038101906104ed91906130ca565b610c95565b005b61050e6004803603810190610509919061314a565b610e0d565b005b61052a60048036038101906105259190613047565b610e8f565b005b610546600480360381019061054191906132d4565b610f0b565b60405161055391906135dc565b60405180910390f35b610576600480360381019061057191906131cd565b610faa565b604051610583919061371e565b60405180910390f35b610594610fce565b6040516105a191906135c1565b60405180910390f35b6105c460048036038101906105bf91906131fa565b610ff2565b005b6105ce611026565b6040516105db91906135c1565b60405180910390f35b6105fe60048036038101906105f99190612fb4565b61104a565b60405161060b91906135a6565b60405180910390f35b600061061f8261111c565b9050919050565b6060600480546106359061394d565b80601f01602080910402602001604051908101604052809291908181526020018280546106619061394d565b80156106ae5780601f10610683576101008083540402835291602001916106ae565b820191906000526020600020905b81548152906001019060200180831161069157829003601f168201915b5050505050905090565b60006106c3826111fe565b6106f9576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6008600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061073f826109f6565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156107a7576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166107c661124c565b73ffffffffffffffffffffffffffffffffffffffff16141580156107f857506107f6816107f161124c565b61104a565b155b1561082f576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61083a838383611254565b505050565b6000610849611306565b6003546002540303905090565b61086183838361130b565b505050565b6000806000838152602001908152602001600020600101549050919050565b61088f82826117c1565b6108b481600160008581526020019081526020016000206110ec90919063ffffffff16565b505050565b6108c38282611827565b6108e881600160008581526020019081526020016000206118aa90919063ffffffff16565b505050565b61091e7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a61091961124c565b610b92565b61095d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610954906136de565b60405180910390fd5b6109656118da565b565b61098283838360405180602001604052806000815250610e8f565b505050565b61099281600161197c565b50565b600061099f61083f565b82106109d7576040517fa723001c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b819050919050565b6000600a60009054906101000a900460ff16905090565b6000610a0182611d6c565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610a74576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b610b0d7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610b0861124c565b610b92565b610b4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b439061365e565b60405180910390fd5b610b54611ffb565b565b610b60338261209e565b50565b6000610b8a82600160008681526020019081526020016000206120bc90919063ffffffff16565b905092915050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060058054610c0b9061394d565b80601f0160208091040260200160405190810160405280929190818152602001828054610c379061394d565b8015610c845780601f10610c5957610100808354040283529160200191610c84565b820191906000526020600020905b815481529060010190602001808311610c6757829003601f168201915b5050505050905090565b6000801b81565b610c9d61124c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d02576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060096000610d0f61124c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610dbc61124c565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610e0191906135a6565b60405180910390a35050565b610e3e7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6610e3961124c565b610b92565b610e7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e74906136be565b60405180910390fd5b610e89848484846120d6565b50505050565b610e9a84848461130b565b610eb98373ffffffffffffffffffffffffffffffffffffffff166124a5565b8015610ece5750610ecc848484846124b8565b155b15610f05576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6060610f16826111fe565b610f4c576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610f56612618565b9050600081511415610f775760405180602001604052806000815250610fa2565b80610f81846126aa565b604051602001610f9292919061351b565b6040516020818303038152906040525b915050919050565b6000610fc76001600084815260200190815260200160002061280b565b9050919050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b610ffc8282612820565b61102181600160008581526020019081526020016000206118aa90919063ffffffff16565b505050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6110e88282612886565b5050565b6000611114836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612966565b905092915050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806111e757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806111f757506111f6826129d6565b5b9050919050565b600081611209611306565b11158015611218575060025482105b8015611245575060066000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826008600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b600061131682611d6c565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611381576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166113a261124c565b73ffffffffffffffffffffffffffffffffffffffff1614806113d157506113d0856113cb61124c565b61104a565b5b8061141657506113df61124c565b73ffffffffffffffffffffffffffffffffffffffff166113fe846106b8565b73ffffffffffffffffffffffffffffffffffffffff16145b90508061144f576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156114b6576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6114c38585856001612a50565b6114cf60008487611254565b6001600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600660008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600660008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561174f57600254821461174e57878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46117ba8585856001612a62565b5050505050565b6117da6117cd83610866565b6117d561124c565b610b92565b611819576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118109061361e565b60405180910390fd5b6118238282612886565b5050565b61182f61124c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461189c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611893906136fe565b60405180910390fd5b6118a68282612a68565b5050565b60006118d2836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612b49565b905092915050565b6118e26109df565b611921576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119189061363e565b60405180910390fd5b6000600a60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa61196561124c565b604051611972919061353f565b60405180910390a1565b600061198783611d6c565b90506000816000015190508215611a685760008173ffffffffffffffffffffffffffffffffffffffff166119b961124c565b73ffffffffffffffffffffffffffffffffffffffff1614806119e857506119e7826119e261124c565b61104a565b5b80611a2d57506119f661124c565b73ffffffffffffffffffffffffffffffffffffffff16611a15866106b8565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611a66576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b611a76816000866001612a50565b611a8260008583611254565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060018160000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060018160000160108282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600660008781526020019081526020016000209050828160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600181600001601c6101000a81548160ff02191690831515021790555060006001870190506000600660008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611ce6576002548214611ce557848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555085602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b5050505083600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611d54816000866001612a62565b60036000815480929190600101919050555050505050565b611d74612e56565b600082905080611d82611306565b11158015611d91575060025481105b15611fc4576000600660008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151611fc257600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611ea6578092505050611ff6565b5b600115611fc157818060019003925050600660008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611fbc578092505050611ff6565b611ea7565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6120036109df565b15612043576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203a9061369e565b60405180910390fd5b6001600a60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861208761124c565b604051612094919061353f565b60405180910390a1565b6120b8828260405180602001604052806000815250612c61565b5050565b60006120cb8360000183612c73565b60001c905092915050565b60006002549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612144576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084141561217f576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61218c6000868387612a50565b83600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846006600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426006600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008190506000858201905083801561235657506123558773ffffffffffffffffffffffffffffffffffffffff166124a5565b5b1561241c575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46123cb60008884806001019550886124b8565b612401576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082141561235c57826002541461241757600080fd5b612488565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082141561241d575b81600281905550505061249e6000868387612a62565b5050505050565b600080823b905060008111915050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026124de61124c565b8786866040518563ffffffff1660e01b8152600401612500949392919061355a565b602060405180830381600087803b15801561251a57600080fd5b505af192505050801561254b57506040513d601f19601f8201168201806040525081019061254891906132a7565b60015b6125c5573d806000811461257b576040519150601f19603f3d011682016040523d82523d6000602084013e612580565b606091505b506000815114156125bd576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600b80546126279061394d565b80601f01602080910402602001604051908101604052809291908181526020018280546126539061394d565b80156126a05780601f10612675576101008083540402835291602001916126a0565b820191906000526020600020905b81548152906001019060200180831161268357829003601f168201915b5050505050905090565b606060008214156126f2576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612806565b600082905060005b6000821461272457808061270d906139b0565b915050600a8261271d9190613828565b91506126fa565b60008167ffffffffffffffff8111156127405761273f613b15565b5b6040519080825280601f01601f1916602001820160405280156127725781602001600182028036833780820191505090505b5090505b600085146127ff5760018261278b9190613859565b9150600a8561279a91906139f9565b60306127a691906137d2565b60f81b8183815181106127bc576127bb613ae6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856127f89190613828565b9450612776565b8093505050505b919050565b600061281982600001612ce7565b9050919050565b61283961282c83610866565b61283461124c565b610b92565b612878576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286f9061367e565b60405180910390fd5b6128828282612a68565b5050565b6128908282610b92565b61296257600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061290761124c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b60006129728383612cf8565b6129cb5782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506129d0565b600090505b92915050565b60007f5a05180f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612a495750612a4882612d1b565b5b9050919050565b612a5c84848484612d95565b50505050565b50505050565b612a728282610b92565b15612b4557600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550612aea61124c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b60008083600101600084815260200190815260200160002054905060008114612c55576000600182612b7b9190613859565b9050600060018660000180549050612b939190613859565b90506000866000018281548110612bad57612bac613ae6565b5b9060005260206000200154905080876000018481548110612bd157612bd0613ae6565b5b9060005260206000200181905550600183612bec91906137d2565b8760010160008381526020019081526020016000208190555086600001805480612c1957612c18613ab7565b5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050612c5b565b60009150505b92915050565b612c6e83838360016120d6565b505050565b600081836000018054905011612cbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cb5906135fe565b60405180910390fd5b826000018281548110612cd457612cd3613ae6565b5b9060005260206000200154905092915050565b600081600001805490509050919050565b600080836001016000848152602001908152602001600020541415905092915050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612d8e5750612d8d82612de6565b5b9050919050565b612da184848484612e50565b612da96109df565b15612de0576040517fab35696f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b50505050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b6000612eac612ea78461375e565b613739565b905082815260208101848484011115612ec857612ec7613b49565b5b612ed384828561390b565b509392505050565b600081359050612eea81613de4565b92915050565b600081359050612eff81613dfb565b92915050565b600081359050612f1481613e12565b92915050565b600081359050612f2981613e29565b92915050565b600081519050612f3e81613e29565b92915050565b600082601f830112612f5957612f58613b44565b5b8135612f69848260208601612e99565b91505092915050565b600081359050612f8181613e40565b92915050565b600060208284031215612f9d57612f9c613b53565b5b6000612fab84828501612edb565b91505092915050565b60008060408385031215612fcb57612fca613b53565b5b6000612fd985828601612edb565b9250506020612fea85828601612edb565b9150509250929050565b60008060006060848603121561300d5761300c613b53565b5b600061301b86828701612edb565b935050602061302c86828701612edb565b925050604061303d86828701612f72565b9150509250925092565b6000806000806080858703121561306157613060613b53565b5b600061306f87828801612edb565b945050602061308087828801612edb565b935050604061309187828801612f72565b925050606085013567ffffffffffffffff8111156130b2576130b1613b4e565b5b6130be87828801612f44565b91505092959194509250565b600080604083850312156130e1576130e0613b53565b5b60006130ef85828601612edb565b925050602061310085828601612ef0565b9150509250929050565b6000806040838503121561312157613120613b53565b5b600061312f85828601612edb565b925050602061314085828601612f72565b9150509250929050565b6000806000806080858703121561316457613163613b53565b5b600061317287828801612edb565b945050602061318387828801612f72565b935050604085013567ffffffffffffffff8111156131a4576131a3613b4e565b5b6131b087828801612f44565b92505060606131c187828801612ef0565b91505092959194509250565b6000602082840312156131e3576131e2613b53565b5b60006131f184828501612f05565b91505092915050565b6000806040838503121561321157613210613b53565b5b600061321f85828601612f05565b925050602061323085828601612edb565b9150509250929050565b6000806040838503121561325157613250613b53565b5b600061325f85828601612f05565b925050602061327085828601612f72565b9150509250929050565b6000602082840312156132905761328f613b53565b5b600061329e84828501612f1a565b91505092915050565b6000602082840312156132bd576132bc613b53565b5b60006132cb84828501612f2f565b91505092915050565b6000602082840312156132ea576132e9613b53565b5b60006132f884828501612f72565b91505092915050565b61330a8161388d565b82525050565b6133198161389f565b82525050565b613328816138ab565b82525050565b60006133398261378f565b61334381856137a5565b935061335381856020860161391a565b61335c81613b58565b840191505092915050565b60006133728261379a565b61337c81856137b6565b935061338c81856020860161391a565b61339581613b58565b840191505092915050565b60006133ab8261379a565b6133b581856137c7565b93506133c581856020860161391a565b80840191505092915050565b60006133de6022836137b6565b91506133e982613b69565b604082019050919050565b6000613401602f836137b6565b915061340c82613bb8565b604082019050919050565b60006134246014836137b6565b915061342f82613c07565b602082019050919050565b6000613447603e836137b6565b915061345282613c30565b604082019050919050565b600061346a6030836137b6565b915061347582613c7f565b604082019050919050565b600061348d6010836137b6565b915061349882613cce565b602082019050919050565b60006134b0603d836137b6565b91506134bb82613cf7565b604082019050919050565b60006134d36040836137b6565b91506134de82613d46565b604082019050919050565b60006134f6602f836137b6565b915061350182613d95565b604082019050919050565b61351581613901565b82525050565b600061352782856133a0565b915061353382846133a0565b91508190509392505050565b60006020820190506135546000830184613301565b92915050565b600060808201905061356f6000830187613301565b61357c6020830186613301565b613589604083018561350c565b818103606083015261359b818461332e565b905095945050505050565b60006020820190506135bb6000830184613310565b92915050565b60006020820190506135d6600083018461331f565b92915050565b600060208201905081810360008301526135f68184613367565b905092915050565b60006020820190508181036000830152613617816133d1565b9050919050565b60006020820190508181036000830152613637816133f4565b9050919050565b6000602082019050818103600083015261365781613417565b9050919050565b600060208201905081810360008301526136778161343a565b9050919050565b600060208201905081810360008301526136978161345d565b9050919050565b600060208201905081810360008301526136b781613480565b9050919050565b600060208201905081810360008301526136d7816134a3565b9050919050565b600060208201905081810360008301526136f7816134c6565b9050919050565b60006020820190508181036000830152613717816134e9565b9050919050565b6000602082019050613733600083018461350c565b92915050565b6000613743613754565b905061374f828261397f565b919050565b6000604051905090565b600067ffffffffffffffff82111561377957613778613b15565b5b61378282613b58565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006137dd82613901565b91506137e883613901565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561381d5761381c613a2a565b5b828201905092915050565b600061383382613901565b915061383e83613901565b92508261384e5761384d613a59565b5b828204905092915050565b600061386482613901565b915061386f83613901565b92508282101561388257613881613a2a565b5b828203905092915050565b6000613898826138e1565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561393857808201518184015260208101905061391d565b83811115613947576000848401525b50505050565b6000600282049050600182168061396557607f821691505b6020821081141561397957613978613a88565b5b50919050565b61398882613b58565b810181811067ffffffffffffffff821117156139a7576139a6613b15565b5b80604052505050565b60006139bb82613901565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156139ee576139ed613a2a565b5b600182019050919050565b6000613a0482613901565b9150613a0f83613901565b925082613a1f57613a1e613a59565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e60008201527f2061646d696e20746f206772616e740000000000000000000000000000000000602082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f4552433732315072657365744d696e7465725061757365724175746f49643a2060008201527f6d75737420686176652070617573657220726f6c6520746f2070617573650000602082015250565b7f416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e60008201527f2061646d696e20746f207265766f6b6500000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732315072657365744d696e7465725061757365724175746f49643a2060008201527f6d7573742068617665206d696e74657220726f6c6520746f206d696e74000000602082015250565b7f4552433732315072657365744d696e7465725061757365724175746f49643a2060008201527f6d75737420686176652070617573657220726f6c6520746f20756e7061757365602082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b613ded8161388d565b8114613df857600080fd5b50565b613e048161389f565b8114613e0f57600080fd5b50565b613e1b816138ab565b8114613e2657600080fd5b50565b613e32816138b5565b8114613e3d57600080fd5b50565b613e4981613901565b8114613e5457600080fd5b5056fea26469706673582212205b76151551a9739a9f61a71f39932f59ae7c1f7698c74e8a0ffb2aecd7eb96d464736f6c63430008070033
Deployed Bytecode Sourcemap
65490:336:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65296:187;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46814:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48317:204;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47880:371;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42706:303;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49182:170;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31781:123;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38298:165;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38821:174;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64759:185;;;:::i;:::-;;49423;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62732:85;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43086:167;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21722:86;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46622:125;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44070:206;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64361:179;;;:::i;:::-;;65724:97;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37753:145;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31453:139;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46983:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29909:49;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48593:287;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63843:303;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49679:369;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47158:318;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38072:134;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62968:62;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38556:170;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63037:62;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48951:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65296:187;65415:4;65439:36;65463:11;65439:23;:36::i;:::-;65432:43;;65296:187;;;:::o;46814:100::-;46868:13;46901:5;46894:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46814:100;:::o;48317:204::-;48385:7;48410:16;48418:7;48410;:16::i;:::-;48405:64;;48435:34;;;;;;;;;;;;;;48405:64;48489:15;:24;48505:7;48489:24;;;;;;;;;;;;;;;;;;;;;48482:31;;48317:204;;;:::o;47880:371::-;47953:13;47969:24;47985:7;47969:15;:24::i;:::-;47953:40;;48014:5;48008:11;;:2;:11;;;48004:48;;;48028:24;;;;;;;;;;;;;;48004:48;48085:5;48069:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;48095:37;48112:5;48119:12;:10;:12::i;:::-;48095:16;:37::i;:::-;48094:38;48069:63;48065:138;;;48156:35;;;;;;;;;;;;;;48065:138;48215:28;48224:2;48228:7;48237:5;48215:8;:28::i;:::-;47942:309;47880:371;;:::o;42706:303::-;42750:7;42975:15;:13;:15::i;:::-;42960:12;;42944:13;;:28;:46;42937:53;;42706:303;:::o;49182:170::-;49316:28;49326:4;49332:2;49336:7;49316:9;:28::i;:::-;49182:170;;;:::o;31781:123::-;31847:7;31874:6;:12;31881:4;31874:12;;;;;;;;;;;:22;;;31867:29;;31781:123;;;:::o;38298:165::-;38383:30;38399:4;38405:7;38383:15;:30::i;:::-;38424:31;38447:7;38424:12;:18;38437:4;38424:18;;;;;;;;;;;:22;;:31;;;;:::i;:::-;;38298:165;;:::o;38821:174::-;38909:33;38928:4;38934:7;38909:18;:33::i;:::-;38953:34;38979:7;38953:12;:18;38966:4;38953:18;;;;;;;;;;;:25;;:34;;;;:::i;:::-;;38821:174;;:::o;64759:185::-;64812:34;63075:24;64833:12;:10;:12::i;:::-;64812:7;:34::i;:::-;64804:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;64926:10;:8;:10::i;:::-;64759:185::o;49423:::-;49561:39;49578:4;49584:2;49588:7;49561:39;;;;;;;;;;;;:16;:39::i;:::-;49423:185;;;:::o;62732:85::-;62789:20;62795:7;62804:4;62789:5;:20::i;:::-;62732:85;:::o;43086:167::-;43144:7;43177:13;:11;:13::i;:::-;43168:5;:22;43164:58;;43199:23;;;;;;;;;;;;;;43164:58;43240:5;43233:12;;43086:167;;;:::o;21722:86::-;21769:4;21793:7;;;;;;;;;;;21786:14;;21722:86;:::o;46622:125::-;46686:7;46713:21;46726:7;46713:12;:21::i;:::-;:26;;;46706:33;;46622:125;;;:::o;44070:206::-;44134:7;44175:1;44158:19;;:5;:19;;;44154:60;;;44186:28;;;;;;;;;;;;;;44154:60;44240:12;:19;44253:5;44240:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;44232:36;;44225:43;;44070:206;;;:::o;64361:179::-;64412:34;63075:24;64433:12;:10;:12::i;:::-;64412:7;:34::i;:::-;64404:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;64524:8;:6;:8::i;:::-;64361:179::o;65724:97::-;65781:32;65791:10;65803:9;65781;:32::i;:::-;65724:97;:::o;37753:145::-;37835:7;37862:28;37884:5;37862:12;:18;37875:4;37862:18;;;;;;;;;;;:21;;:28;;;;:::i;:::-;37855:35;;37753:145;;;;:::o;31453:139::-;31531:4;31555:6;:12;31562:4;31555:12;;;;;;;;;;;:20;;:29;31576:7;31555:29;;;;;;;;;;;;;;;;;;;;;;;;;31548:36;;31453:139;;;;:::o;46983:104::-;47039:13;47072:7;47065:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46983:104;:::o;29909:49::-;29954:4;29909:49;;;:::o;48593:287::-;48704:12;:10;:12::i;:::-;48692:24;;:8;:24;;;48688:54;;;48725:17;;;;;;;;;;;;;;48688:54;48800:8;48755:18;:32;48774:12;:10;:12::i;:::-;48755:32;;;;;;;;;;;;;;;:42;48788:8;48755:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;48853:8;48824:48;;48839:12;:10;:12::i;:::-;48824:48;;;48863:8;48824:48;;;;;;:::i;:::-;;;;;;;;48593:287;;:::o;63843:303::-;63995:34;63006:24;64016:12;:10;:12::i;:::-;63995:7;:34::i;:::-;63987:108;;;;;;;;;;;;:::i;:::-;;;;;;;;;64106:32;64112:2;64116:8;64126:5;64133:4;64106:5;:32::i;:::-;63843:303;;;;:::o;49679:369::-;49846:28;49856:4;49862:2;49866:7;49846:9;:28::i;:::-;49889:15;:2;:13;;;:15::i;:::-;:76;;;;;49909:56;49940:4;49946:2;49950:7;49959:5;49909:30;:56::i;:::-;49908:57;49889:76;49885:156;;;49989:40;;;;;;;;;;;;;;49885:156;49679:369;;;;:::o;47158:318::-;47231:13;47262:16;47270:7;47262;:16::i;:::-;47257:59;;47287:29;;;;;;;;;;;;;;47257:59;47329:21;47353:10;:8;:10::i;:::-;47329:34;;47406:1;47387:7;47381:21;:26;;:87;;;;;;;;;;;;;;;;;47434:7;47443:18;:7;:16;:18::i;:::-;47417:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47381:87;47374:94;;;47158:318;;;:::o;38072:134::-;38144:7;38171:27;:12;:18;38184:4;38171:18;;;;;;;;;;;:25;:27::i;:::-;38164:34;;38072:134;;;:::o;62968:62::-;63006:24;62968:62;:::o;38556:170::-;38642:31;38659:4;38665:7;38642:16;:31::i;:::-;38684:34;38710:7;38684:12;:18;38697:4;38684:18;;;;;;;;;;;:25;;:34;;;;:::i;:::-;;38556:170;;:::o;63037:62::-;63075:24;63037:62;:::o;48951:164::-;49048:4;49072:18;:25;49091:5;49072:25;;;;;;;;;;;;;;;:35;49098:8;49072:35;;;;;;;;;;;;;;;;;;;;;;;;;49065:42;;48951:164;;;;:::o;34186:112::-;34265:25;34276:4;34282:7;34265:10;:25::i;:::-;34186:112;;:::o;16758:152::-;16828:4;16852:50;16857:3;:10;;16893:5;16877:23;;16869:32;;16852:4;:50::i;:::-;16845:57;;16758:152;;;;:::o;43701:305::-;43803:4;43855:25;43840:40;;;:11;:40;;;;:105;;;;43912:33;43897:48;;;:11;:48;;;;43840:105;:158;;;;43962:36;43986:11;43962:23;:36::i;:::-;43840:158;43820:178;;43701:305;;;:::o;50303:174::-;50360:4;50403:7;50384:15;:13;:15::i;:::-;:26;;:53;;;;;50424:13;;50414:7;:23;50384:53;:85;;;;;50442:11;:20;50454:7;50442:20;;;;;;;;;;;:27;;;;;;;;;;;;50441:28;50384:85;50377:92;;50303:174;;;:::o;91:98::-;144:7;171:10;164:17;;91:98;:::o;58460:196::-;58602:2;58575:15;:24;58591:7;58575:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;58640:7;58636:2;58620:28;;58629:5;58620:28;;;;;;;;;;;;58460:196;;;:::o;42480:92::-;42536:7;42480:92;:::o;53403:2130::-;53518:35;53556:21;53569:7;53556:12;:21::i;:::-;53518:59;;53616:4;53594:26;;:13;:18;;;:26;;;53590:67;;53629:28;;;;;;;;;;;;;;53590:67;53670:22;53712:4;53696:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;53733:36;53750:4;53756:12;:10;:12::i;:::-;53733:16;:36::i;:::-;53696:73;:126;;;;53810:12;:10;:12::i;:::-;53786:36;;:20;53798:7;53786:11;:20::i;:::-;:36;;;53696:126;53670:153;;53841:17;53836:66;;53867:35;;;;;;;;;;;;;;53836:66;53931:1;53917:16;;:2;:16;;;53913:52;;;53942:23;;;;;;;;;;;;;;53913:52;53978:43;54000:4;54006:2;54010:7;54019:1;53978:21;:43::i;:::-;54086:35;54103:1;54107:7;54116:4;54086:8;:35::i;:::-;54447:1;54417:12;:18;54430:4;54417:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54491:1;54463:12;:16;54476:2;54463:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54509:31;54543:11;:20;54555:7;54543:20;;;;;;;;;;;54509:54;;54594:2;54578:8;:13;;;:18;;;;;;;;;;;;;;;;;;54644:15;54611:8;:23;;;:49;;;;;;;;;;;;;;;;;;54912:19;54944:1;54934:7;:11;54912:33;;54960:31;54994:11;:24;55006:11;54994:24;;;;;;;;;;;54960:58;;55062:1;55037:27;;:8;:13;;;;;;;;;;;;:27;;;55033:384;;;55247:13;;55232:11;:28;55228:174;;55301:4;55285:8;:13;;;:20;;;;;;;;;;;;;;;;;;55354:13;:28;;;55328:8;:23;;;:54;;;;;;;;;;;;;;;;;;55228:174;55033:384;54392:1036;;;55464:7;55460:2;55445:27;;55454:4;55445:27;;;;;;;;;;;;55483:42;55504:4;55510:2;55514:7;55523:1;55483:20;:42::i;:::-;53507:2026;;53403:2130;;;:::o;32166:232::-;32259:41;32267:18;32280:4;32267:12;:18::i;:::-;32287:12;:10;:12::i;:::-;32259:7;:41::i;:::-;32251:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;32365:25;32376:4;32382:7;32365:10;:25::i;:::-;32166:232;;:::o;33385:218::-;33492:12;:10;:12::i;:::-;33481:23;;:7;:23;;;33473:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;33569:26;33581:4;33587:7;33569:11;:26::i;:::-;33385:218;;:::o;17086:158::-;17159:4;17183:53;17191:3;:10;;17227:5;17211:23;;17203:32;;17183:7;:53::i;:::-;17176:60;;17086:158;;;;:::o;22781:120::-;22325:8;:6;:8::i;:::-;22317:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;22850:5:::1;22840:7;;:15;;;;;;;;;;;;;;;;;;22871:22;22880:12;:10;:12::i;:::-;22871:22;;;;;;:::i;:::-;;;;;;;;22781:120::o:0;55934:2408::-;56014:35;56052:21;56065:7;56052:12;:21::i;:::-;56014:59;;56086:12;56101:13;:18;;;56086:33;;56136:13;56132:290;;;56166:22;56208:4;56192:20;;:12;:10;:12::i;:::-;:20;;;:77;;;;56233:36;56250:4;56256:12;:10;:12::i;:::-;56233:16;:36::i;:::-;56192:77;:134;;;;56314:12;:10;:12::i;:::-;56290:36;;:20;56302:7;56290:11;:20::i;:::-;:36;;;56192:134;56166:161;;56349:17;56344:66;;56375:35;;;;;;;;;;;;;;56344:66;56151:271;56132:290;56434:51;56456:4;56470:1;56474:7;56483:1;56434:21;:51::i;:::-;56550:35;56567:1;56571:7;56580:4;56550:8;:35::i;:::-;56881:31;56915:12;:18;56928:4;56915:18;;;;;;;;;;;;;;;56881:52;;56971:1;56948:11;:19;;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57015:1;56987:11;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57115:31;57149:11;:20;57161:7;57149:20;;;;;;;;;;;57115:54;;57200:4;57184:8;:13;;;:20;;;;;;;;;;;;;;;;;;57252:15;57219:8;:23;;;:49;;;;;;;;;;;;;;;;;;57301:4;57283:8;:15;;;:22;;;;;;;;;;;;;;;;;;57553:19;57585:1;57575:7;:11;57553:33;;57601:31;57635:11;:24;57647:11;57635:24;;;;;;;;;;;57601:58;;57703:1;57678:27;;:8;:13;;;;;;;;;;;;:27;;;57674:384;;;57888:13;;57873:11;:28;57869:174;;57942:4;57926:8;:13;;;:20;;;;;;;;;;;;;;;;;;57995:13;:28;;;57969:8;:23;;;:54;;;;;;;;;;;;;;;;;;57869:174;57674:384;56856:1213;;;;58113:7;58109:1;58086:35;;58095:4;58086:35;;;;;;;;;;;;58132:50;58153:4;58167:1;58171:7;58180:1;58132:20;:50::i;:::-;58309:12;;:14;;;;;;;;;;;;;56003:2339;;55934:2408;;:::o;45451:1109::-;45513:21;;:::i;:::-;45547:12;45562:7;45547:22;;45630:4;45611:15;:13;:15::i;:::-;:23;;:47;;;;;45645:13;;45638:4;:20;45611:47;45607:886;;;45679:31;45713:11;:17;45725:4;45713:17;;;;;;;;;;;45679:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45754:9;:16;;;45749:729;;45825:1;45799:28;;:9;:14;;;:28;;;45795:101;;45863:9;45856:16;;;;;;45795:101;46198:261;46205:4;46198:261;;;46238:6;;;;;;;;46283:11;:17;46295:4;46283:17;;;;;;;;;;;46271:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46357:1;46331:28;;:9;:14;;;:28;;;46327:109;;46399:9;46392:16;;;;;;46327:109;46198:261;;;45749:729;45660:833;45607:886;46521:31;;;;;;;;;;;;;;45451:1109;;;;:::o;22522:118::-;22048:8;:6;:8::i;:::-;22047:9;22039:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;22592:4:::1;22582:7;;:14;;;;;;;;;;;;;;;;;;22612:20;22619:12;:10;:12::i;:::-;22612:20;;;;;;:::i;:::-;;;;;;;;22522:118::o:0;50485:104::-;50554:27;50564:2;50568:8;50554:27;;;;;;;;;;;;:9;:27::i;:::-;50485:104;;:::o;18044:158::-;18118:7;18169:22;18173:3;:10;;18185:5;18169:3;:22::i;:::-;18161:31;;18138:56;;18044:158;;;;:::o;51374:1775::-;51513:20;51536:13;;51513:36;;51578:1;51564:16;;:2;:16;;;51560:48;;;51589:19;;;;;;;;;;;;;;51560:48;51635:1;51623:8;:13;51619:44;;;51645:18;;;;;;;;;;;;;;51619:44;51676:61;51706:1;51710:2;51714:12;51728:8;51676:21;:61::i;:::-;52049:8;52014:12;:16;52027:2;52014:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52113:8;52073:12;:16;52086:2;52073:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52172:2;52139:11;:25;52151:12;52139:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;52239:15;52189:11;:25;52201:12;52189:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;52272:20;52295:12;52272:35;;52322:11;52351:8;52336:12;:23;52322:37;;52380:4;:23;;;;;52388:15;:2;:13;;;:15::i;:::-;52380:23;52376:641;;;52424:314;52480:12;52476:2;52455:38;;52472:1;52455:38;;;;;;;;;;;;52521:69;52560:1;52564:2;52568:14;;;;;;52584:5;52521:30;:69::i;:::-;52516:174;;52626:40;;;;;;;;;;;;;;52516:174;52733:3;52717:12;:19;;52424:314;;52819:12;52802:13;;:29;52798:43;;52833:8;;;52798:43;52376:641;;;52882:120;52938:14;;;;;;52934:2;52913:40;;52930:1;52913:40;;;;;;;;;;;;52997:3;52981:12;:19;;52882:120;;52376:641;53047:12;53031:13;:28;;;;51989:1082;;53081:60;53110:1;53114:2;53118:12;53132:8;53081:20;:60::i;:::-;51502:1647;51374:1775;;;;:::o;1710:422::-;1770:4;1978:12;2089:7;2077:20;2069:28;;2123:1;2116:4;:8;2109:15;;;1710:422;;;:::o;59148:667::-;59311:4;59348:2;59332:36;;;59369:12;:10;:12::i;:::-;59383:4;59389:7;59398:5;59332:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;59328:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59583:1;59566:6;:13;:18;59562:235;;;59612:40;;;;;;;;;;;;;;59562:235;59755:6;59749:13;59740:6;59736:2;59732:15;59725:38;59328:480;59461:45;;;59451:55;;;:6;:55;;;;59444:62;;;59148:667;;;;;;:::o;63721:114::-;63781:13;63814;63807:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63721:114;:::o;9153:723::-;9209:13;9439:1;9430:5;:10;9426:53;;;9457:10;;;;;;;;;;;;;;;;;;;;;9426:53;9489:12;9504:5;9489:20;;9520:14;9545:78;9560:1;9552:4;:9;9545:78;;9578:8;;;;;:::i;:::-;;;;9609:2;9601:10;;;;;:::i;:::-;;;9545:78;;;9633:19;9665:6;9655:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9633:39;;9683:154;9699:1;9690:5;:10;9683:154;;9727:1;9717:11;;;;;:::i;:::-;;;9794:2;9786:5;:10;;;;:::i;:::-;9773:2;:24;;;;:::i;:::-;9760:39;;9743:6;9750;9743:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;9823:2;9814:11;;;;;:::i;:::-;;;9683:154;;;9861:6;9847:21;;;;;9153:723;;;;:::o;17583:117::-;17646:7;17673:19;17681:3;:10;;17673:7;:19::i;:::-;17666:26;;17583:117;;;:::o;32643:235::-;32737:41;32745:18;32758:4;32745:12;:18::i;:::-;32765:12;:10;:12::i;:::-;32737:7;:41::i;:::-;32729:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;32844:26;32856:4;32862:7;32844:11;:26::i;:::-;32643:235;;:::o;34633:229::-;34708:22;34716:4;34722:7;34708;:22::i;:::-;34703:152;;34779:4;34747:6;:12;34754:4;34747:12;;;;;;;;;;;:20;;:29;34768:7;34747:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;34830:12;:10;:12::i;:::-;34803:40;;34821:7;34803:40;;34815:4;34803:40;;;;;;;;;;34703:152;34633:229;;:::o;11822:414::-;11885:4;11907:21;11917:3;11922:5;11907:9;:21::i;:::-;11902:327;;11945:3;:11;;11962:5;11945:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12128:3;:11;;:18;;;;12106:3;:12;;:19;12119:5;12106:19;;;;;;;;;;;:40;;;;12168:4;12161:11;;;;11902:327;12212:5;12205:12;;11822:414;;;;;:::o;36927:227::-;37012:4;37051:42;37036:57;;;:11;:57;;;;:110;;;;37110:36;37134:11;37110:23;:36::i;:::-;37036:110;37029:117;;36927:227;;;:::o;64952:272::-;65155:61;65183:4;65189:2;65193:12;65207:8;65155:27;:61::i;:::-;64952:272;;;;:::o;61281:158::-;;;;;:::o;34870:230::-;34945:22;34953:4;34959:7;34945;:22::i;:::-;34941:152;;;35016:5;34984:6;:12;34991:4;34984:12;;;;;;;;;;;:20;;:29;35005:7;34984:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;35068:12;:10;:12::i;:::-;35041:40;;35059:7;35041:40;;35053:4;35041:40;;;;;;;;;;34941:152;34870:230;;:::o;12412:1544::-;12478:4;12596:18;12617:3;:12;;:19;12630:5;12617:19;;;;;;;;;;;;12596:40;;12667:1;12653:10;:15;12649:1300;;13015:21;13052:1;13039:10;:14;;;;:::i;:::-;13015:38;;13068:17;13109:1;13088:3;:11;;:18;;;;:22;;;;:::i;:::-;13068:42;;13355:17;13375:3;:11;;13387:9;13375:22;;;;;;;;:::i;:::-;;;;;;;;;;13355:42;;13521:9;13492:3;:11;;13504:13;13492:26;;;;;;;;:::i;:::-;;;;;;;;;:38;;;;13640:1;13624:13;:17;;;;:::i;:::-;13598:3;:12;;:23;13611:9;13598:23;;;;;;;;;;;:43;;;;13750:3;:11;;:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;13845:3;:12;;:19;13858:5;13845:19;;;;;;;;;;;13838:26;;;13888:4;13881:11;;;;;;;;12649:1300;13932:5;13925:12;;;12412:1544;;;;;:::o;50952:163::-;51075:32;51081:2;51085:8;51095:5;51102:4;51075:5;:32::i;:::-;50952:163;;;:::o;14710:204::-;14777:7;14826:5;14805:3;:11;;:18;;;;:26;14797:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;14888:3;:11;;14900:5;14888:18;;;;;;;;:::i;:::-;;;;;;;;;;14881:25;;14710:204;;;;:::o;14257:109::-;14313:7;14340:3;:11;;:18;;;;14333:25;;14257:109;;;:::o;14042:129::-;14115:4;14162:1;14139:3;:12;;:19;14152:5;14139:19;;;;;;;;;;;;:24;;14132:31;;14042:129;;;;:::o;31144:217::-;31229:4;31268:32;31253:47;;;:11;:47;;;;:100;;;;31317:36;31341:11;31317:23;:36::i;:::-;31253:100;31246:107;;31144:217;;;:::o;62053:303::-;62239:61;62267:4;62273:2;62277:12;62291:8;62239:27;:61::i;:::-;62315:8;:6;:8::i;:::-;62311:37;;;62332:16;;;;;;;;;;;;;;62311:37;62053:303;;;;:::o;27552:157::-;27637:4;27676:25;27661:40;;;:11;:40;;;;27654:47;;27552:157;;;:::o;60463:159::-;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:139::-;469:5;507:6;494:20;485:29;;523:33;550:5;523:33;:::i;:::-;423:139;;;;:::o;568:133::-;611:5;649:6;636:20;627:29;;665:30;689:5;665:30;:::i;:::-;568:133;;;;:::o;707:139::-;753:5;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;707:139;;;;:::o;852:137::-;897:5;935:6;922:20;913:29;;951:32;977:5;951:32;:::i;:::-;852:137;;;;:::o;995:141::-;1051:5;1082:6;1076:13;1067:22;;1098:32;1124:5;1098:32;:::i;:::-;995:141;;;;:::o;1155:338::-;1210:5;1259:3;1252:4;1244:6;1240:17;1236:27;1226:122;;1267:79;;:::i;:::-;1226:122;1384:6;1371:20;1409:78;1483:3;1475:6;1468:4;1460:6;1456:17;1409:78;:::i;:::-;1400:87;;1216:277;1155:338;;;;:::o;1499:139::-;1545:5;1583:6;1570:20;1561:29;;1599:33;1626:5;1599:33;:::i;:::-;1499:139;;;;:::o;1644:329::-;1703:6;1752:2;1740:9;1731:7;1727:23;1723:32;1720:119;;;1758:79;;:::i;:::-;1720:119;1878:1;1903:53;1948:7;1939:6;1928:9;1924:22;1903:53;:::i;:::-;1893:63;;1849:117;1644:329;;;;:::o;1979:474::-;2047:6;2055;2104:2;2092:9;2083:7;2079:23;2075:32;2072:119;;;2110:79;;:::i;:::-;2072:119;2230:1;2255:53;2300:7;2291:6;2280:9;2276:22;2255:53;:::i;:::-;2245:63;;2201:117;2357:2;2383:53;2428:7;2419:6;2408:9;2404:22;2383:53;:::i;:::-;2373:63;;2328:118;1979:474;;;;;:::o;2459:619::-;2536:6;2544;2552;2601:2;2589:9;2580:7;2576:23;2572:32;2569:119;;;2607:79;;:::i;:::-;2569:119;2727:1;2752:53;2797:7;2788:6;2777:9;2773:22;2752:53;:::i;:::-;2742:63;;2698:117;2854:2;2880:53;2925:7;2916:6;2905:9;2901:22;2880:53;:::i;:::-;2870:63;;2825:118;2982:2;3008:53;3053:7;3044:6;3033:9;3029:22;3008:53;:::i;:::-;2998:63;;2953:118;2459:619;;;;;:::o;3084:943::-;3179:6;3187;3195;3203;3252:3;3240:9;3231:7;3227:23;3223:33;3220:120;;;3259:79;;:::i;:::-;3220:120;3379:1;3404:53;3449:7;3440:6;3429:9;3425:22;3404:53;:::i;:::-;3394:63;;3350:117;3506:2;3532:53;3577:7;3568:6;3557:9;3553:22;3532:53;:::i;:::-;3522:63;;3477:118;3634:2;3660:53;3705:7;3696:6;3685:9;3681:22;3660:53;:::i;:::-;3650:63;;3605:118;3790:2;3779:9;3775:18;3762:32;3821:18;3813:6;3810:30;3807:117;;;3843:79;;:::i;:::-;3807:117;3948:62;4002:7;3993:6;3982:9;3978:22;3948:62;:::i;:::-;3938:72;;3733:287;3084:943;;;;;;;:::o;4033:468::-;4098:6;4106;4155:2;4143:9;4134:7;4130:23;4126:32;4123:119;;;4161:79;;:::i;:::-;4123:119;4281:1;4306:53;4351:7;4342:6;4331:9;4327:22;4306:53;:::i;:::-;4296:63;;4252:117;4408:2;4434:50;4476:7;4467:6;4456:9;4452:22;4434:50;:::i;:::-;4424:60;;4379:115;4033:468;;;;;:::o;4507:474::-;4575:6;4583;4632:2;4620:9;4611:7;4607:23;4603:32;4600:119;;;4638:79;;:::i;:::-;4600:119;4758:1;4783:53;4828:7;4819:6;4808:9;4804:22;4783:53;:::i;:::-;4773:63;;4729:117;4885:2;4911:53;4956:7;4947:6;4936:9;4932:22;4911:53;:::i;:::-;4901:63;;4856:118;4507:474;;;;;:::o;4987:937::-;5079:6;5087;5095;5103;5152:3;5140:9;5131:7;5127:23;5123:33;5120:120;;;5159:79;;:::i;:::-;5120:120;5279:1;5304:53;5349:7;5340:6;5329:9;5325:22;5304:53;:::i;:::-;5294:63;;5250:117;5406:2;5432:53;5477:7;5468:6;5457:9;5453:22;5432:53;:::i;:::-;5422:63;;5377:118;5562:2;5551:9;5547:18;5534:32;5593:18;5585:6;5582:30;5579:117;;;5615:79;;:::i;:::-;5579:117;5720:62;5774:7;5765:6;5754:9;5750:22;5720:62;:::i;:::-;5710:72;;5505:287;5831:2;5857:50;5899:7;5890:6;5879:9;5875:22;5857:50;:::i;:::-;5847:60;;5802:115;4987:937;;;;;;;:::o;5930:329::-;5989:6;6038:2;6026:9;6017:7;6013:23;6009:32;6006:119;;;6044:79;;:::i;:::-;6006:119;6164:1;6189:53;6234:7;6225:6;6214:9;6210:22;6189:53;:::i;:::-;6179:63;;6135:117;5930:329;;;;:::o;6265:474::-;6333:6;6341;6390:2;6378:9;6369:7;6365:23;6361:32;6358:119;;;6396:79;;:::i;:::-;6358:119;6516:1;6541:53;6586:7;6577:6;6566:9;6562:22;6541:53;:::i;:::-;6531:63;;6487:117;6643:2;6669:53;6714:7;6705:6;6694:9;6690:22;6669:53;:::i;:::-;6659:63;;6614:118;6265:474;;;;;:::o;6745:::-;6813:6;6821;6870:2;6858:9;6849:7;6845:23;6841:32;6838:119;;;6876:79;;:::i;:::-;6838:119;6996:1;7021:53;7066:7;7057:6;7046:9;7042:22;7021:53;:::i;:::-;7011:63;;6967:117;7123:2;7149:53;7194:7;7185:6;7174:9;7170:22;7149:53;:::i;:::-;7139:63;;7094:118;6745:474;;;;;:::o;7225:327::-;7283:6;7332:2;7320:9;7311:7;7307:23;7303:32;7300:119;;;7338:79;;:::i;:::-;7300:119;7458:1;7483:52;7527:7;7518:6;7507:9;7503:22;7483:52;:::i;:::-;7473:62;;7429:116;7225:327;;;;:::o;7558:349::-;7627:6;7676:2;7664:9;7655:7;7651:23;7647:32;7644:119;;;7682:79;;:::i;:::-;7644:119;7802:1;7827:63;7882:7;7873:6;7862:9;7858:22;7827:63;:::i;:::-;7817:73;;7773:127;7558:349;;;;:::o;7913:329::-;7972:6;8021:2;8009:9;8000:7;7996:23;7992:32;7989:119;;;8027:79;;:::i;:::-;7989:119;8147:1;8172:53;8217:7;8208:6;8197:9;8193:22;8172:53;:::i;:::-;8162:63;;8118:117;7913:329;;;;:::o;8248:118::-;8335:24;8353:5;8335:24;:::i;:::-;8330:3;8323:37;8248:118;;:::o;8372:109::-;8453:21;8468:5;8453:21;:::i;:::-;8448:3;8441:34;8372:109;;:::o;8487:118::-;8574:24;8592:5;8574:24;:::i;:::-;8569:3;8562:37;8487:118;;:::o;8611:360::-;8697:3;8725:38;8757:5;8725:38;:::i;:::-;8779:70;8842:6;8837:3;8779:70;:::i;:::-;8772:77;;8858:52;8903:6;8898:3;8891:4;8884:5;8880:16;8858:52;:::i;:::-;8935:29;8957:6;8935:29;:::i;:::-;8930:3;8926:39;8919:46;;8701:270;8611:360;;;;:::o;8977:364::-;9065:3;9093:39;9126:5;9093:39;:::i;:::-;9148:71;9212:6;9207:3;9148:71;:::i;:::-;9141:78;;9228:52;9273:6;9268:3;9261:4;9254:5;9250:16;9228:52;:::i;:::-;9305:29;9327:6;9305:29;:::i;:::-;9300:3;9296:39;9289:46;;9069:272;8977:364;;;;:::o;9347:377::-;9453:3;9481:39;9514:5;9481:39;:::i;:::-;9536:89;9618:6;9613:3;9536:89;:::i;:::-;9529:96;;9634:52;9679:6;9674:3;9667:4;9660:5;9656:16;9634:52;:::i;:::-;9711:6;9706:3;9702:16;9695:23;;9457:267;9347:377;;;;:::o;9730:366::-;9872:3;9893:67;9957:2;9952:3;9893:67;:::i;:::-;9886:74;;9969:93;10058:3;9969:93;:::i;:::-;10087:2;10082:3;10078:12;10071:19;;9730:366;;;:::o;10102:::-;10244:3;10265:67;10329:2;10324:3;10265:67;:::i;:::-;10258:74;;10341:93;10430:3;10341:93;:::i;:::-;10459:2;10454:3;10450:12;10443:19;;10102:366;;;:::o;10474:::-;10616:3;10637:67;10701:2;10696:3;10637:67;:::i;:::-;10630:74;;10713:93;10802:3;10713:93;:::i;:::-;10831:2;10826:3;10822:12;10815:19;;10474:366;;;:::o;10846:::-;10988:3;11009:67;11073:2;11068:3;11009:67;:::i;:::-;11002:74;;11085:93;11174:3;11085:93;:::i;:::-;11203:2;11198:3;11194:12;11187:19;;10846:366;;;:::o;11218:::-;11360:3;11381:67;11445:2;11440:3;11381:67;:::i;:::-;11374:74;;11457:93;11546:3;11457:93;:::i;:::-;11575:2;11570:3;11566:12;11559:19;;11218:366;;;:::o;11590:::-;11732:3;11753:67;11817:2;11812:3;11753:67;:::i;:::-;11746:74;;11829:93;11918:3;11829:93;:::i;:::-;11947:2;11942:3;11938:12;11931:19;;11590:366;;;:::o;11962:::-;12104:3;12125:67;12189:2;12184:3;12125:67;:::i;:::-;12118:74;;12201:93;12290:3;12201:93;:::i;:::-;12319:2;12314:3;12310:12;12303:19;;11962:366;;;:::o;12334:::-;12476:3;12497:67;12561:2;12556:3;12497:67;:::i;:::-;12490:74;;12573:93;12662:3;12573:93;:::i;:::-;12691:2;12686:3;12682:12;12675:19;;12334:366;;;:::o;12706:::-;12848:3;12869:67;12933:2;12928:3;12869:67;:::i;:::-;12862:74;;12945:93;13034:3;12945:93;:::i;:::-;13063:2;13058:3;13054:12;13047:19;;12706:366;;;:::o;13078:118::-;13165:24;13183:5;13165:24;:::i;:::-;13160:3;13153:37;13078:118;;:::o;13202:435::-;13382:3;13404:95;13495:3;13486:6;13404:95;:::i;:::-;13397:102;;13516:95;13607:3;13598:6;13516:95;:::i;:::-;13509:102;;13628:3;13621:10;;13202:435;;;;;:::o;13643:222::-;13736:4;13774:2;13763:9;13759:18;13751:26;;13787:71;13855:1;13844:9;13840:17;13831:6;13787:71;:::i;:::-;13643:222;;;;:::o;13871:640::-;14066:4;14104:3;14093:9;14089:19;14081:27;;14118:71;14186:1;14175:9;14171:17;14162:6;14118:71;:::i;:::-;14199:72;14267:2;14256:9;14252:18;14243:6;14199:72;:::i;:::-;14281;14349:2;14338:9;14334:18;14325:6;14281:72;:::i;:::-;14400:9;14394:4;14390:20;14385:2;14374:9;14370:18;14363:48;14428:76;14499:4;14490:6;14428:76;:::i;:::-;14420:84;;13871:640;;;;;;;:::o;14517:210::-;14604:4;14642:2;14631:9;14627:18;14619:26;;14655:65;14717:1;14706:9;14702:17;14693:6;14655:65;:::i;:::-;14517:210;;;;:::o;14733:222::-;14826:4;14864:2;14853:9;14849:18;14841:26;;14877:71;14945:1;14934:9;14930:17;14921:6;14877:71;:::i;:::-;14733:222;;;;:::o;14961:313::-;15074:4;15112:2;15101:9;15097:18;15089:26;;15161:9;15155:4;15151:20;15147:1;15136:9;15132:17;15125:47;15189:78;15262:4;15253:6;15189:78;:::i;:::-;15181:86;;14961:313;;;;:::o;15280:419::-;15446:4;15484:2;15473:9;15469:18;15461:26;;15533:9;15527:4;15523:20;15519:1;15508:9;15504:17;15497:47;15561:131;15687:4;15561:131;:::i;:::-;15553:139;;15280:419;;;:::o;15705:::-;15871:4;15909:2;15898:9;15894:18;15886:26;;15958:9;15952:4;15948:20;15944:1;15933:9;15929:17;15922:47;15986:131;16112:4;15986:131;:::i;:::-;15978:139;;15705:419;;;:::o;16130:::-;16296:4;16334:2;16323:9;16319:18;16311:26;;16383:9;16377:4;16373:20;16369:1;16358:9;16354:17;16347:47;16411:131;16537:4;16411:131;:::i;:::-;16403:139;;16130:419;;;:::o;16555:::-;16721:4;16759:2;16748:9;16744:18;16736:26;;16808:9;16802:4;16798:20;16794:1;16783:9;16779:17;16772:47;16836:131;16962:4;16836:131;:::i;:::-;16828:139;;16555:419;;;:::o;16980:::-;17146:4;17184:2;17173:9;17169:18;17161:26;;17233:9;17227:4;17223:20;17219:1;17208:9;17204:17;17197:47;17261:131;17387:4;17261:131;:::i;:::-;17253:139;;16980:419;;;:::o;17405:::-;17571:4;17609:2;17598:9;17594:18;17586:26;;17658:9;17652:4;17648:20;17644:1;17633:9;17629:17;17622:47;17686:131;17812:4;17686:131;:::i;:::-;17678:139;;17405:419;;;:::o;17830:::-;17996:4;18034:2;18023:9;18019:18;18011:26;;18083:9;18077:4;18073:20;18069:1;18058:9;18054:17;18047:47;18111:131;18237:4;18111:131;:::i;:::-;18103:139;;17830:419;;;:::o;18255:::-;18421:4;18459:2;18448:9;18444:18;18436:26;;18508:9;18502:4;18498:20;18494:1;18483:9;18479:17;18472:47;18536:131;18662:4;18536:131;:::i;:::-;18528:139;;18255:419;;;:::o;18680:::-;18846:4;18884:2;18873:9;18869:18;18861:26;;18933:9;18927:4;18923:20;18919:1;18908:9;18904:17;18897:47;18961:131;19087:4;18961:131;:::i;:::-;18953:139;;18680:419;;;:::o;19105:222::-;19198:4;19236:2;19225:9;19221:18;19213:26;;19249:71;19317:1;19306:9;19302:17;19293:6;19249:71;:::i;:::-;19105:222;;;;:::o;19333:129::-;19367:6;19394:20;;:::i;:::-;19384:30;;19423:33;19451:4;19443:6;19423:33;:::i;:::-;19333:129;;;:::o;19468:75::-;19501:6;19534:2;19528:9;19518:19;;19468:75;:::o;19549:307::-;19610:4;19700:18;19692:6;19689:30;19686:56;;;19722:18;;:::i;:::-;19686:56;19760:29;19782:6;19760:29;:::i;:::-;19752:37;;19844:4;19838;19834:15;19826:23;;19549:307;;;:::o;19862:98::-;19913:6;19947:5;19941:12;19931:22;;19862:98;;;:::o;19966:99::-;20018:6;20052:5;20046:12;20036:22;;19966:99;;;:::o;20071:168::-;20154:11;20188:6;20183:3;20176:19;20228:4;20223:3;20219:14;20204:29;;20071:168;;;;:::o;20245:169::-;20329:11;20363:6;20358:3;20351:19;20403:4;20398:3;20394:14;20379:29;;20245:169;;;;:::o;20420:148::-;20522:11;20559:3;20544:18;;20420:148;;;;:::o;20574:305::-;20614:3;20633:20;20651:1;20633:20;:::i;:::-;20628:25;;20667:20;20685:1;20667:20;:::i;:::-;20662:25;;20821:1;20753:66;20749:74;20746:1;20743:81;20740:107;;;20827:18;;:::i;:::-;20740:107;20871:1;20868;20864:9;20857:16;;20574:305;;;;:::o;20885:185::-;20925:1;20942:20;20960:1;20942:20;:::i;:::-;20937:25;;20976:20;20994:1;20976:20;:::i;:::-;20971:25;;21015:1;21005:35;;21020:18;;:::i;:::-;21005:35;21062:1;21059;21055:9;21050:14;;20885:185;;;;:::o;21076:191::-;21116:4;21136:20;21154:1;21136:20;:::i;:::-;21131:25;;21170:20;21188:1;21170:20;:::i;:::-;21165:25;;21209:1;21206;21203:8;21200:34;;;21214:18;;:::i;:::-;21200:34;21259:1;21256;21252:9;21244:17;;21076:191;;;;:::o;21273:96::-;21310:7;21339:24;21357:5;21339:24;:::i;:::-;21328:35;;21273:96;;;:::o;21375:90::-;21409:7;21452:5;21445:13;21438:21;21427:32;;21375:90;;;:::o;21471:77::-;21508:7;21537:5;21526:16;;21471:77;;;:::o;21554:149::-;21590:7;21630:66;21623:5;21619:78;21608:89;;21554:149;;;:::o;21709:126::-;21746:7;21786:42;21779:5;21775:54;21764:65;;21709:126;;;:::o;21841:77::-;21878:7;21907:5;21896:16;;21841:77;;;:::o;21924:154::-;22008:6;22003:3;21998;21985:30;22070:1;22061:6;22056:3;22052:16;22045:27;21924:154;;;:::o;22084:307::-;22152:1;22162:113;22176:6;22173:1;22170:13;22162:113;;;22261:1;22256:3;22252:11;22246:18;22242:1;22237:3;22233:11;22226:39;22198:2;22195:1;22191:10;22186:15;;22162:113;;;22293:6;22290:1;22287:13;22284:101;;;22373:1;22364:6;22359:3;22355:16;22348:27;22284:101;22133:258;22084:307;;;:::o;22397:320::-;22441:6;22478:1;22472:4;22468:12;22458:22;;22525:1;22519:4;22515:12;22546:18;22536:81;;22602:4;22594:6;22590:17;22580:27;;22536:81;22664:2;22656:6;22653:14;22633:18;22630:38;22627:84;;;22683:18;;:::i;:::-;22627:84;22448:269;22397:320;;;:::o;22723:281::-;22806:27;22828:4;22806:27;:::i;:::-;22798:6;22794:40;22936:6;22924:10;22921:22;22900:18;22888:10;22885:34;22882:62;22879:88;;;22947:18;;:::i;:::-;22879:88;22987:10;22983:2;22976:22;22766:238;22723:281;;:::o;23010:233::-;23049:3;23072:24;23090:5;23072:24;:::i;:::-;23063:33;;23118:66;23111:5;23108:77;23105:103;;;23188:18;;:::i;:::-;23105:103;23235:1;23228:5;23224:13;23217:20;;23010:233;;;:::o;23249:176::-;23281:1;23298:20;23316:1;23298:20;:::i;:::-;23293:25;;23332:20;23350:1;23332:20;:::i;:::-;23327:25;;23371:1;23361:35;;23376:18;;:::i;:::-;23361:35;23417:1;23414;23410:9;23405:14;;23249:176;;;;:::o;23431:180::-;23479:77;23476:1;23469:88;23576:4;23573:1;23566:15;23600:4;23597:1;23590:15;23617:180;23665:77;23662:1;23655:88;23762:4;23759:1;23752:15;23786:4;23783:1;23776:15;23803:180;23851:77;23848:1;23841:88;23948:4;23945:1;23938:15;23972:4;23969:1;23962:15;23989:180;24037:77;24034:1;24027:88;24134:4;24131:1;24124:15;24158:4;24155:1;24148:15;24175:180;24223:77;24220:1;24213:88;24320:4;24317:1;24310:15;24344:4;24341:1;24334:15;24361:180;24409:77;24406:1;24399:88;24506:4;24503:1;24496:15;24530:4;24527:1;24520:15;24547:117;24656:1;24653;24646:12;24670:117;24779:1;24776;24769:12;24793:117;24902:1;24899;24892:12;24916:117;25025:1;25022;25015:12;25039:102;25080:6;25131:2;25127:7;25122:2;25115:5;25111:14;25107:28;25097:38;;25039:102;;;:::o;25147:221::-;25287:34;25283:1;25275:6;25271:14;25264:58;25356:4;25351:2;25343:6;25339:15;25332:29;25147:221;:::o;25374:234::-;25514:34;25510:1;25502:6;25498:14;25491:58;25583:17;25578:2;25570:6;25566:15;25559:42;25374:234;:::o;25614:170::-;25754:22;25750:1;25742:6;25738:14;25731:46;25614:170;:::o;25790:249::-;25930:34;25926:1;25918:6;25914:14;25907:58;25999:32;25994:2;25986:6;25982:15;25975:57;25790:249;:::o;26045:235::-;26185:34;26181:1;26173:6;26169:14;26162:58;26254:18;26249:2;26241:6;26237:15;26230:43;26045:235;:::o;26286:166::-;26426:18;26422:1;26414:6;26410:14;26403:42;26286:166;:::o;26458:248::-;26598:34;26594:1;26586:6;26582:14;26575:58;26667:31;26662:2;26654:6;26650:15;26643:56;26458:248;:::o;26712:251::-;26852:34;26848:1;26840:6;26836:14;26829:58;26921:34;26916:2;26908:6;26904:15;26897:59;26712:251;:::o;26969:234::-;27109:34;27105:1;27097:6;27093:14;27086:58;27178:17;27173:2;27165:6;27161:15;27154:42;26969:234;:::o;27209:122::-;27282:24;27300:5;27282:24;:::i;:::-;27275:5;27272:35;27262:63;;27321:1;27318;27311:12;27262:63;27209:122;:::o;27337:116::-;27407:21;27422:5;27407:21;:::i;:::-;27400:5;27397:32;27387:60;;27443:1;27440;27433:12;27387:60;27337:116;:::o;27459:122::-;27532:24;27550:5;27532:24;:::i;:::-;27525:5;27522:35;27512:63;;27571:1;27568;27561:12;27512:63;27459:122;:::o;27587:120::-;27659:23;27676:5;27659:23;:::i;:::-;27652:5;27649:34;27639:62;;27697:1;27694;27687:12;27639:62;27587:120;:::o;27713:122::-;27786:24;27804:5;27786:24;:::i;:::-;27779:5;27776:35;27766:63;;27825:1;27822;27815:12;27766:63;27713:122;:::o
Swarm Source
ipfs://5b76151551a9739a9f61a71f39932f59ae7c1f7698c74e8a0ffb2aecd7eb96d4
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.