Feature Tip: Add private address tag to any address under My Name Tag !
Source Code
Latest 25 from a total of 502 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Settle Address | 16424721 | 1115 days ago | IN | 0 ETH | 0.00112105 | ||||
| Settle Address | 16424720 | 1115 days ago | IN | 0 ETH | 0.00111286 | ||||
| Settle Address | 16424719 | 1115 days ago | IN | 0 ETH | 0.00110498 | ||||
| Settle Address | 16424718 | 1115 days ago | IN | 0 ETH | 0.00099409 | ||||
| Settle Address | 16424716 | 1115 days ago | IN | 0 ETH | 0.00112444 | ||||
| Settle Address | 16424715 | 1115 days ago | IN | 0 ETH | 0.00184645 | ||||
| Settle Address | 16424714 | 1115 days ago | IN | 0 ETH | 0.00198222 | ||||
| Settle Address | 16424713 | 1115 days ago | IN | 0 ETH | 0.00199231 | ||||
| Settle Address | 16424712 | 1115 days ago | IN | 0 ETH | 0.00199577 | ||||
| Settle Address | 16424711 | 1115 days ago | IN | 0 ETH | 0.00210092 | ||||
| Settle Address | 16424710 | 1115 days ago | IN | 0 ETH | 0.00210453 | ||||
| Settle Address | 16424709 | 1115 days ago | IN | 0 ETH | 0.00203311 | ||||
| Settle Address | 16424708 | 1115 days ago | IN | 0 ETH | 0.00182702 | ||||
| Settle Address | 16424707 | 1115 days ago | IN | 0 ETH | 0.00186472 | ||||
| Settle Address | 16374991 | 1122 days ago | IN | 0 ETH | 0.00194988 | ||||
| Settle Address | 16320365 | 1130 days ago | IN | 0 ETH | 0.0019482 | ||||
| Settle Address | 16306174 | 1132 days ago | IN | 0 ETH | 0.00103757 | ||||
| Settle Address | 16294704 | 1133 days ago | IN | 0 ETH | 0.00100725 | ||||
| Settle Address | 16279814 | 1135 days ago | IN | 0 ETH | 0.00162193 | ||||
| Settle Address | 16263119 | 1138 days ago | IN | 0 ETH | 0.00080098 | ||||
| Redeem NFT Curat... | 16263115 | 1138 days ago | IN | 0 ETH | 0.00148418 | ||||
| Settle Address | 16262766 | 1138 days ago | IN | 0 ETH | 0.00086632 | ||||
| Settle Address | 16259770 | 1138 days ago | IN | 0 ETH | 0.00081081 | ||||
| Settle Address | 16259766 | 1138 days ago | IN | 0 ETH | 0.00076806 | ||||
| Settle Address | 16259602 | 1138 days ago | IN | 0 ETH | 0.00075489 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| Transfer | 16424721 | 1115 days ago | 0.276 ETH | ||||
| Transfer | 16424720 | 1115 days ago | 0.276 ETH | ||||
| Transfer | 16424719 | 1115 days ago | 0.276 ETH | ||||
| Transfer | 16424718 | 1115 days ago | 0.552 ETH | ||||
| Transfer | 16424716 | 1115 days ago | 0.552 ETH | ||||
| Transfer | 16424715 | 1115 days ago | 0.00078666 ETH | ||||
| Transfer | 16424714 | 1115 days ago | 0.00034666 ETH | ||||
| Transfer | 16424713 | 1115 days ago | 0.00047833 ETH | ||||
| Transfer | 16424712 | 1115 days ago | 0.00054499 ETH | ||||
| Transfer | 16424711 | 1115 days ago | 0.00058666 ETH | ||||
| Transfer | 16424710 | 1115 days ago | 0.05165983 ETH | ||||
| Transfer | 16424709 | 1115 days ago | 0.05631166 ETH | ||||
| Transfer | 16424708 | 1115 days ago | 0.09670916 ETH | ||||
| Transfer | 16424707 | 1115 days ago | 0.09891266 ETH | ||||
| Transfer | 16374991 | 1122 days ago | 0.00107999 ETH | ||||
| Transfer | 16320365 | 1130 days ago | 0.11923383 ETH | ||||
| Transfer | 16306174 | 1132 days ago | 3.312 ETH | ||||
| Transfer | 16294704 | 1133 days ago | 0.276 ETH | ||||
| Transfer | 16279814 | 1135 days ago | 0.00062666 ETH | ||||
| Transfer | 16263119 | 1138 days ago | 3.036 ETH | ||||
| Transfer | 16262766 | 1138 days ago | 0.276 ETH | ||||
| Transfer | 16259770 | 1138 days ago | 0.276 ETH | ||||
| Transfer | 16259766 | 1138 days ago | 0.276 ETH | ||||
| Transfer | 16259602 | 1138 days ago | 0.276 ETH | ||||
| Transfer | 16259304 | 1138 days ago | 0.276 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
LPDA
Compiler Version
v0.8.13+commit.abaa5c0e
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2022-12-06
*/
// SPDX-License-Identifier: MIT
pragma solidity 0.8.13;
/// @dev Initialization call information
struct InitInfo {
// Address of target contract
address target;
// Initialization data
bytes data;
// Merkle proof for call
bytes32[] proof;
}
/// @dev Interface for Vault proxy contract
interface IVault {
/// @dev Emitted when execution reverted with no reason
error ExecutionReverted();
/// @dev Emitted when the caller is not the owner
error NotAuthorized(address _caller, address _target, bytes4 _selector);
/// @dev Emitted when the caller is not the owner
error NotOwner(address _owner, address _caller);
/// @dev Emitted when the caller is not the factory
error NotFactory(address _factory, address _caller);
/// @dev Emitted when passing an EOA or an undeployed contract as the target
error TargetInvalid(address _target);
/// @dev Event log for executing transactions
/// @param _target Address of target contract
/// @param _data Transaction data being executed
/// @param _response Return data of delegatecall
event Execute(address indexed _target, bytes _data, bytes _response);
function execute(
address _target,
bytes memory _data,
bytes32[] memory _proof
) external payable returns (bool success, bytes memory response);
function MERKLE_ROOT() external view returns (bytes32);
function OWNER() external view returns (address);
function FACTORY() external view returns (address);
}
/// @dev Vault permissions
struct Permission {
// Address of module contract
address module;
// Address of target contract
address target;
// Function selector from target contract
bytes4 selector;
}
/// @dev Vault information
struct VaultInfo {
// Address of Rae token contract
address token;
// ID of the token type
uint256 id;
}
/// @dev Interface for VaultRegistry contract
interface IVaultRegistry {
/// @dev Emitted when the caller is not the controller
error InvalidController(address _controller, address _sender);
/// @dev Emitted when the caller is not a registered vault
error UnregisteredVault(address _sender);
/// @dev Event log for deploying vault
/// @param _vault Address of the vault
/// @param _token Address of the token
/// @param _id Id of the token
event VaultDeployed(address indexed _vault, address indexed _token, uint256 indexed _id);
function createFor(
bytes32 _merkleRoot,
address _owner,
InitInfo[] calldata _calls
) external returns (address vault);
function createFor(bytes32 _merkleRoot, address _owner) external returns (address vault);
function create(bytes32 _merkleRoot, InitInfo[] calldata _calls)
external
returns (address vault);
function create(bytes32 _merkleRoot) external returns (address vault);
function createCollectionFor(
bytes32 _merkleRoot,
address _controller,
InitInfo[] calldata _calls
) external returns (address vault, address token);
function createCollection(bytes32 _merkleRoot, InitInfo[] calldata _calls)
external
returns (address vault, address token);
function createInCollection(
bytes32 _merkleRoot,
address _token,
InitInfo[] calldata _calls
) external returns (address vault);
function factory() external view returns (address);
function rae() external view returns (address);
function raeImplementation() external view returns (address);
function burn(address _from, uint256 _value) external;
function mint(address _to, uint256 _value) external;
function nextId(address) external view returns (uint256);
function totalSupply(address _vault) external view returns (uint256);
function uri(address _vault) external view returns (string memory);
function vaultToToken(address) external view returns (address token, uint256 id);
}
/// @dev Interface for generic Module contract
interface IModule {
function getLeaves() external view returns (bytes32[] memory leaves);
function getUnhashedLeaves() external view returns (bytes[] memory leaves);
function getPermissions() external view returns (Permission[] memory permissions);
}
/// @title Module
/// @author Tessera
/// @notice Base module contract for converting vault permissions into leaf nodes
contract Module is IModule {
/// @notice Gets the list of hashed leaf nodes used to generate a merkle tree
/// @dev Leaf nodes are hashed permissions of the merkle tree
/// @return leaves Hashed leaf nodes
function getLeaves() external view returns (bytes32[] memory leaves) {
Permission[] memory permissions = getPermissions();
uint256 length = permissions.length;
leaves = new bytes32[](length);
unchecked {
for (uint256 i; i < length; ++i) {
leaves[i] = keccak256(abi.encode(permissions[i]));
}
}
}
/// @notice Gets the list of unhashed leaf nodes used to generate a merkle tree
/// @dev Only used for third party APIs (Lanyard) that require unhashed leaves
/// @return leaves Unhashed leaf nodes
function getUnhashedLeaves() external view returns (bytes[] memory leaves) {
Permission[] memory permissions = getPermissions();
uint256 length = permissions.length;
leaves = new bytes[](length);
unchecked {
for (uint256 i; i < length; ++i) {
leaves[i] = abi.encode(permissions[i]);
}
}
}
/// @notice Gets the list of permissions installed on a vault
/// @dev Intentionally left empty to be overridden by the module inheriting from this contract
/// @return permissions List of vault permissions
function getPermissions() public view virtual returns (Permission[] memory permissions) {}
}
/// @dev Interface for generic Protoform contract
interface IProtoform {
/// @dev Event log for modules that are enabled on a vault
/// @param _vault The vault deployed
/// @param _modules The modules being activated on deployed vault
event ActiveModules(address indexed _vault, address[] _modules);
function generateMerkleTree(address[] memory _modules)
external
view
returns (bytes32[] memory tree);
function generateUnhashedMerkleTree(address[] memory _modules)
external
view
returns (bytes[] memory tree);
}
/// @title Merkle Base
/// @author Modified from Murky (https://github.com/dmfxyz/murky/blob/main/src/common/MurkyBase.sol)
/// @notice Utility contract for generating merkle roots and verifying proofs
abstract contract MerkleBase {
constructor() {}
/// @notice Hashes two leaf pairs
/// @param _left Node on left side of tree level
/// @param _right Node on right side of tree level
/// @return data Result hash of node params
function hashLeafPairs(bytes32 _left, bytes32 _right) public pure returns (bytes32 data) {
// Return opposite node if checked node is of bytes zero value
if (_left == bytes32(0)) return _right;
if (_right == bytes32(0)) return _left;
assembly {
// TODO: This can be aesthetically simplified with a switch. Not sure it will
// save much gas but there are other optimizations to be had in here.
if or(lt(_left, _right), eq(_left, _right)) {
mstore(0x0, _left)
mstore(0x20, _right)
}
if gt(_left, _right) {
mstore(0x0, _right)
mstore(0x20, _left)
}
data := keccak256(0x0, 0x40)
}
}
/// @notice Verifies the merkle proof of a given value
/// @param _root Hash of merkle root
/// @param _proof Merkle proof
/// @param _valueToProve Leaf node being proven
/// @return Status of proof verification
function verifyProof(
bytes32 _root,
bytes32[] memory _proof,
bytes32 _valueToProve
) public pure returns (bool) {
// proof length must be less than max array size
bytes32 rollingHash = _valueToProve;
unchecked {
for (uint256 i = 0; i < _proof.length; ++i) {
rollingHash = hashLeafPairs(rollingHash, _proof[i]);
}
}
return _root == rollingHash;
}
/// @notice Generates the merkle root of a tree
/// @param _data Leaf nodes of the merkle tree
/// @return Hash of merkle root
function getRoot(bytes32[] memory _data) public pure returns (bytes32) {
require(_data.length > 1, "wont generate root for single leaf");
while (_data.length > 1) {
_data = hashLevel(_data);
}
return _data[0];
}
/// @notice Generates the merkle proof for a leaf node in a given tree
/// @param _data Leaf nodes of the merkle tree
/// @param _node Index of the node in the tree
/// @return proof Merkle proof
function getProof(bytes32[] memory _data, uint256 _node)
public
pure
returns (bytes32[] memory proof)
{
require(_data.length > 1, "wont generate proof for single leaf");
// The size of the proof is equal to the ceiling of log2(numLeaves)
uint256 size = log2ceil_naive(_data.length);
bytes32[] memory result = new bytes32[](size);
uint256 pos;
uint256 counter;
// Two overflow risks: node, pos
// node: max array size is 2**256-1. Largest index in the array will be 1 less than that. Also,
// for dynamic arrays, size is limited to 2**64-1
// pos: pos is bounded by log2(data.length), which should be less than type(uint256).max
while (_data.length > 1) {
unchecked {
if (_node % 2 == 1) {
result[pos] = _data[_node - 1];
} else if (_node + 1 == _data.length) {
result[pos] = bytes32(0);
++counter;
} else {
result[pos] = _data[_node + 1];
}
++pos;
_node = _node / 2;
}
_data = hashLevel(_data);
}
// Dynamic array to filter out address(0) since proof size is rounded up
// This is done to return the actual proof size of the indexed node
uint256 offset;
proof = new bytes32[](size - counter);
unchecked {
for (uint256 i; i < size; ++i) {
if (result[i] != bytes32(0)) {
proof[i - offset] = result[i];
} else {
++offset;
}
}
}
}
/// @dev Hashes nodes at the given tree level
/// @param _data Nodes at the current level
/// @return result Hashes of nodes at the next level
function hashLevel(bytes32[] memory _data) private pure returns (bytes32[] memory result) {
// Function is private, and all internal callers check that data.length >=2.
// Underflow is not possible as lowest possible value for data/result index is 1
// overflow should be safe as length is / 2 always.
unchecked {
uint256 length = _data.length;
if (length & 0x1 == 1) {
result = new bytes32[]((length >> 1) + 1);
result[result.length - 1] = hashLeafPairs(_data[length - 1], bytes32(0));
} else {
result = new bytes32[](length >> 1);
}
// pos is upper bounded by data.length / 2, so safe even if array is at max size
uint256 pos;
for (uint256 i; i < length - 1; i += 2) {
result[pos] = hashLeafPairs(_data[i], _data[i + 1]);
++pos;
}
}
}
/// @notice Calculates proof size based on size of tree
/// @dev Note that x is assumed > 0 and proof size is not precise
/// @param x Size of the merkle tree
/// @return ceil Rounded value of proof size
function log2ceil_naive(uint256 x) public pure returns (uint256 ceil) {
uint256 pOf2;
// If x is a power of 2, then this function will return a ceiling
// that is 1 greater than the actual ceiling. So we need to check if
// x is a power of 2, and subtract one from ceil if so.
assembly {
// we check by seeing if x == (~x + 1) & x. This applies a mask
// to find the lowest set bit of x and then checks it for equality
// with x. If they are equal, then x is a power of 2.
/* Example
x has single bit set
x := 0000_1000
(~x + 1) = (1111_0111) + 1 = 1111_1000
(1111_1000 & 0000_1000) = 0000_1000 == x
x has multiple bits set
x := 1001_0010
(~x + 1) = (0110_1101 + 1) = 0110_1110
(0110_1110 & x) = 0000_0010 != x
*/
// we do some assembly magic to treat the bool as an integer later on
pOf2 := eq(and(add(not(x), 1), x), x)
}
// if x == type(uint256).max, than ceil is capped at 256
// if x == 0, then pO2 == 0, so ceil won't underflow
unchecked {
while (x > 0) {
x >>= 1;
ceil++;
}
ceil -= pOf2;
}
}
}
/// @title Protoform
/// @author Tessera
/// @notice Base protoform contract for generating merkle trees
contract Protoform is IProtoform, MerkleBase {
/// @notice Generates a merkle tree from the hashed permissions of the given modules
/// @param _modules List of module contracts
/// @return tree Merkle tree of hashed leaf nodes
function generateMerkleTree(address[] memory _modules)
public
view
returns (bytes32[] memory tree)
{
uint256 counter;
uint256 modulesLength = _modules.length;
uint256 treeSize = _getTreeSize(_modules, modulesLength);
tree = new bytes32[](treeSize);
unchecked {
/* _sortList(_modules, modulesLength); */
for (uint256 i; i < modulesLength; ++i) {
bytes32[] memory leaves = IModule(_modules[i]).getLeaves();
uint256 leavesLength = leaves.length;
for (uint256 j; j < leavesLength; ++j) {
tree[counter++] = leaves[j];
}
}
}
}
/// @notice Generates a merkle tree from the unhashed permissions of the given modules
/// @dev Only used for third party APIs (Lanyard) that require unhashed leaves
/// @param _modules List of module contracts
/// @return tree Merkle tree of unhashed leaf nodes
function generateUnhashedMerkleTree(address[] memory _modules)
public
view
returns (bytes[] memory tree)
{
uint256 counter;
uint256 modulesLength = _modules.length;
uint256 treeSize = _getTreeSize(_modules, modulesLength);
tree = new bytes[](treeSize);
unchecked {
/* _sortList(_modules, modulesLength); */
for (uint256 i; i < modulesLength; ++i) {
bytes[] memory leaves = IModule(_modules[i]).getUnhashedLeaves();
uint256 leavesLength = leaves.length;
for (uint256 j; j < leavesLength; ++j) {
tree[counter++] = leaves[j];
}
}
}
}
/// @dev Gets the size of a merkle tree based on the total permissions across all modules
/// @param _modules List of module contracts
/// @param _length Size of modules array
/// @return size Total size of the merkle tree
function _getTreeSize(address[] memory _modules, uint256 _length)
internal
view
returns (uint256 size)
{
unchecked {
for (uint256 i; i < _length; ++i) {
size += IModule(_modules[i]).getLeaves().length;
}
}
}
/// @dev Sorts the list of modules in ascending order
function _sortList(address[] memory _modules, uint256 _length) internal pure {
for (uint256 i; i < _length; ++i) {
for (uint256 j = i + 1; j < _length; ++j) {
if (_modules[i] > _modules[j]) {
(_modules[i], _modules[j]) = (_modules[j], _modules[i]);
}
}
}
}
}
/// @dev Interface for Supply target contract
interface ISupply {
/// @dev Emitted when an account being called as an assumed contract does not have code and returns no data
error MintError(address _account);
/// @dev Emitted when an account being called as an assumed contract does not have code and returns no data
error BurnError(address _account);
function mint(address _to, uint256 _value) external;
function burn(address _from, uint256 _value) external;
}
struct LPDAInfo {
/// the start time of the auction
uint32 startTime;
/// the end time of the auction
uint32 endTime;
/// the price decrease per second
uint64 dropPerSecond;
/// the price of the item at startTime
uint128 startPrice;
/// the price that startPrice drops down
uint128 endPrice;
/// the lowest price paid in a successful LPDA
uint128 minBid;
/// the total supply of raes being auctioned
uint16 supply;
/// the number of raes currently sold in the auction
uint16 numSold;
/// the amount of eth claimed by the curator
uint128 curatorClaimed;
/// the address of the curator of the auctioned item
address curator;
}
enum LPDAState {
NotLive,
Live,
Successful,
NotSuccessful
}
interface ILPDA {
event CreatedLPDA(
address indexed _vault,
address indexed _token,
uint256 _id,
LPDAInfo _lpdaInfo
);
/// @notice event emitted when a new bid is entered
event BidEntered(
address indexed _vault,
address indexed _user,
uint256 _quantity,
uint256 _price
);
/// @notice event emitted when settling an auction and a user is owed a refund
event Refunded(address indexed _vault, address indexed _user, uint256 _balance);
/// @notice event emitted when settling a successful auction with minted quantity
event MintedRaes(
address indexed _vault,
address indexed _user,
uint256 _quantity,
uint256 _price
);
/// @notice event emitted when settling a successful auction with curator receiving a percentage
event CuratorClaimed(address indexed _vault, address indexed _curator, uint256 _amount);
/// @notice event emitted when settling a successful auction and fees dispersed
event FeeDispersed(address indexed _vault, address indexed _receiver, uint256 _amount);
/// @notice event emitted when settling a successful auction and royalty assessed
event RoyaltyPaid(address indexed _vault, address indexed _royaltyReceiver, uint256 _amount);
/// @notice event emitted after an unsuccessful auction and the curator withdraws their nft
event CuratorRedeemedNFT(
address indexed _vault,
address indexed _curator,
address indexed _token,
uint256 _tokenId
);
function deployVault(
address[] calldata _modules,
address[] calldata _plugins,
bytes4[] calldata _selectors,
LPDAInfo calldata _lpdaInfo,
address _token,
uint256 _id,
bytes32[] calldata _mintProof
) external returns (address vault);
function enterBid(address _vault, uint16 _amount) external payable;
function settleAddress(address _vault, address _minter) external;
function settleCurator(address _vault) external;
function redeemNFTCurator(
address _vault,
address _token,
uint256 _tokenId,
bytes32[] calldata _erc721TransferProof
) external;
function updateFeeReceiver(address _receiver) external;
function currentPrice(address _vault) external returns (uint256 price);
function getAuctionState(address _vault) external returns (LPDAState state);
function refundOwed(address _vault, address _minter) external returns (uint256 owed);
}
library LibLPDAInfo {
function getAuctionState(LPDAInfo memory _info) internal view returns (LPDAState) {
if (isNotLive(_info)) return LPDAState.NotLive;
if (isLive(_info)) return LPDAState.Live;
if (isSuccessful(_info)) return LPDAState.Successful;
return LPDAState.NotSuccessful;
}
function isNotLive(LPDAInfo memory _info) internal view returns (bool) {
return (_info.startTime > block.timestamp);
}
function isLive(LPDAInfo memory _info) internal view returns (bool) {
return (block.timestamp > _info.startTime &&
block.timestamp < _info.endTime &&
_info.numSold < _info.supply);
}
function isSuccessful(LPDAInfo memory _info) internal pure returns (bool) {
return (_info.numSold == _info.supply);
}
function isNotSuccessful(LPDAInfo memory _info) internal view returns (bool) {
return (block.timestamp > _info.endTime && _info.numSold < _info.supply);
}
function isOver(LPDAInfo memory _info) internal view returns (bool) {
return (isNotSuccessful(_info) || isSuccessful(_info));
}
function remainingSupply(LPDAInfo memory _info) internal pure returns (uint256) {
return (_info.supply - _info.numSold);
}
function validateAndRecordBid(
LPDAInfo storage _info,
uint128 price,
uint16 amount
) internal {
_validateBid(_info, price, amount);
_info.numSold += amount;
if (_info.numSold == _info.supply) _info.minBid = price;
}
function validateAuctionInfo(LPDAInfo memory _info) internal view {
require(_info.startTime >= uint32(block.timestamp), "LPDA: Invalid time");
require(_info.startTime < _info.endTime, "LPDA: Invalid time");
require(_info.dropPerSecond > 0, "LPDA: Invalid drop");
require(_info.startPrice > _info.endPrice, "LPDA: Invalid price");
require(_info.minBid == 0, "LPDA: Invalid min bid");
require(_info.supply > 0, "LPDA: Invalid supply");
require(_info.numSold == 0, "LPDA: Invalid sold");
require(_info.curatorClaimed == 0, "LPDA: Invalid curatorClaimed");
}
function _validateBid(
LPDAInfo memory _info,
uint128 price,
uint16 amount
) internal view {
require(msg.value >= (price * amount), "LPDA: Insufficient value");
require(_info.supply != 0, "LPDA: Auction doesnt exist");
require(remainingSupply(_info) >= amount, "LPDA: Not enough remaining");
require(isLive(_info), "LPDA: Not Live");
require(amount > 0, "LPDA: Must bid atleast 1 rae");
}
}
/// @dev Interface for Transfer target contract
interface ITransfer {
/// @dev Emitted when an ERC-20 token transfer returns a falsey value
/// @param _token The token for which the ERC20 transfer was attempted
/// @param _from The source of the attempted ERC20 transfer
/// @param _to The recipient of the attempted ERC20 transfer
/// @param _amount The amount for the attempted ERC20 transfer
error BadReturnValueFromERC20OnTransfer(
address _token,
address _from,
address _to,
uint256 _amount
);
/// @dev Emitted when the transfer of ether is unsuccessful
error ETHTransferUnsuccessful();
/// @dev Emitted when a batch ERC-1155 token transfer reverts
/// @param _token The token for which the transfer was attempted
/// @param _from The source of the attempted transfer
/// @param _to The recipient of the attempted transfer
/// @param _identifiers The identifiers for the attempted transfer
/// @param _amounts The amounts for the attempted transfer
error ERC1155BatchTransferGenericFailure(
address _token,
address _from,
address _to,
uint256[] _identifiers,
uint256[] _amounts
);
/// @dev Emitted when an ERC-721 transfer with amount other than one is attempted
error InvalidERC721TransferAmount();
/// @dev Emitted when attempting to fulfill an order where an item has an amount of zero
error MissingItemAmount();
/// @dev Emitted when an account being called as an assumed contract does not have code and returns no data
/// @param _account The account that should contain code
error NoContract(address _account);
/// @dev Emitted when an ERC-20, ERC-721, or ERC-1155 token transfer fails
/// @param _token The token for which the transfer was attempted
/// @param _from The source of the attempted transfer
/// @param _to The recipient of the attempted transfer
/// @param _identifier The identifier for the attempted transfer
/// @param _amount The amount for the attempted transfer
error TokenTransferGenericFailure(
address _token,
address _from,
address _to,
uint256 _identifier,
uint256 _amount
);
function ETHTransfer(address _to, uint256 _value) external returns (bool);
function ERC20Transfer(
address _token,
address _to,
uint256 _value
) external;
function ERC721TransferFrom(
address _token,
address _from,
address _to,
uint256 _tokenId
) external;
function ERC1155TransferFrom(
address _token,
address _from,
address _to,
uint256 _id,
uint256 _value
) external;
function ERC1155BatchTransferFrom(
address _token,
address _from,
address _to,
uint256[] calldata _ids,
uint256[] calldata _values
) external;
}
/// @notice Modern and gas efficient ERC20 + EIP-2612 implementation.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC20.sol)
/// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol)
/// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it.
abstract contract ERC20 {
/*//////////////////////////////////////////////////////////////
EVENTS
//////////////////////////////////////////////////////////////*/
event Transfer(address indexed from, address indexed to, uint256 amount);
event Approval(address indexed owner, address indexed spender, uint256 amount);
/*//////////////////////////////////////////////////////////////
METADATA STORAGE
//////////////////////////////////////////////////////////////*/
string public name;
string public symbol;
uint8 public immutable decimals;
/*//////////////////////////////////////////////////////////////
ERC20 STORAGE
//////////////////////////////////////////////////////////////*/
uint256 public totalSupply;
mapping(address => uint256) public balanceOf;
mapping(address => mapping(address => uint256)) public allowance;
/*//////////////////////////////////////////////////////////////
EIP-2612 STORAGE
//////////////////////////////////////////////////////////////*/
uint256 internal immutable INITIAL_CHAIN_ID;
bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR;
mapping(address => uint256) public nonces;
/*//////////////////////////////////////////////////////////////
CONSTRUCTOR
//////////////////////////////////////////////////////////////*/
constructor(
string memory _name,
string memory _symbol,
uint8 _decimals
) {
name = _name;
symbol = _symbol;
decimals = _decimals;
INITIAL_CHAIN_ID = block.chainid;
INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator();
}
/*//////////////////////////////////////////////////////////////
ERC20 LOGIC
//////////////////////////////////////////////////////////////*/
function approve(address spender, uint256 amount) public virtual returns (bool) {
allowance[msg.sender][spender] = amount;
emit Approval(msg.sender, spender, amount);
return true;
}
function transfer(address to, uint256 amount) public virtual returns (bool) {
balanceOf[msg.sender] -= amount;
// Cannot overflow because the sum of all user
// balances can't exceed the max uint256 value.
unchecked {
balanceOf[to] += amount;
}
emit Transfer(msg.sender, to, amount);
return true;
}
function transferFrom(
address from,
address to,
uint256 amount
) public virtual returns (bool) {
uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals.
if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amount;
balanceOf[from] -= amount;
// Cannot overflow because the sum of all user
// balances can't exceed the max uint256 value.
unchecked {
balanceOf[to] += amount;
}
emit Transfer(from, to, amount);
return true;
}
/*//////////////////////////////////////////////////////////////
EIP-2612 LOGIC
//////////////////////////////////////////////////////////////*/
function permit(
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) public virtual {
require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED");
// Unchecked because the only math done is incrementing
// the owner's nonce which cannot realistically overflow.
unchecked {
address recoveredAddress = ecrecover(
keccak256(
abi.encodePacked(
"\x19\x01",
DOMAIN_SEPARATOR(),
keccak256(
abi.encode(
keccak256(
"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"
),
owner,
spender,
value,
nonces[owner]++,
deadline
)
)
)
),
v,
r,
s
);
require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER");
allowance[recoveredAddress][spender] = value;
}
emit Approval(owner, spender, value);
}
function DOMAIN_SEPARATOR() public view virtual returns (bytes32) {
return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator();
}
function computeDomainSeparator() internal view virtual returns (bytes32) {
return
keccak256(
abi.encode(
keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
keccak256(bytes(name)),
keccak256("1"),
block.chainid,
address(this)
)
);
}
/*//////////////////////////////////////////////////////////////
INTERNAL MINT/BURN LOGIC
//////////////////////////////////////////////////////////////*/
function _mint(address to, uint256 amount) internal virtual {
totalSupply += amount;
// Cannot overflow because the sum of all user
// balances can't exceed the max uint256 value.
unchecked {
balanceOf[to] += amount;
}
emit Transfer(address(0), to, amount);
}
function _burn(address from, uint256 amount) internal virtual {
balanceOf[from] -= amount;
// Cannot underflow because a user's balance
// will never be larger than the total supply.
unchecked {
totalSupply -= amount;
}
emit Transfer(from, address(0), amount);
}
}
/// @notice Safe ETH and ERC20 transfer library that gracefully handles missing return values.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/SafeTransferLib.sol)
/// @dev Use with caution! Some functions in this library knowingly create dirty bits at the destination of the free memory pointer.
/// @dev Note that none of the functions in this library check that a token has code at all! That responsibility is delegated to the caller.
library SafeTransferLib {
/*//////////////////////////////////////////////////////////////
ETH OPERATIONS
//////////////////////////////////////////////////////////////*/
function safeTransferETH(address to, uint256 amount) internal {
bool success;
/// @solidity memory-safe-assembly
assembly {
// Transfer the ETH and store if it succeeded or not.
success := call(gas(), to, amount, 0, 0, 0, 0)
}
require(success, "ETH_TRANSFER_FAILED");
}
/*//////////////////////////////////////////////////////////////
ERC20 OPERATIONS
//////////////////////////////////////////////////////////////*/
function safeTransferFrom(
ERC20 token,
address from,
address to,
uint256 amount
) internal {
bool success;
/// @solidity memory-safe-assembly
assembly {
// Get a pointer to some free memory.
let freeMemoryPointer := mload(0x40)
// Write the abi-encoded calldata into memory, beginning with the function selector.
mstore(freeMemoryPointer, 0x23b872dd00000000000000000000000000000000000000000000000000000000)
mstore(add(freeMemoryPointer, 4), from) // Append the "from" argument.
mstore(add(freeMemoryPointer, 36), to) // Append the "to" argument.
mstore(add(freeMemoryPointer, 68), amount) // Append the "amount" argument.
success := and(
// Set success to whether the call reverted, if not we check it either
// returned exactly 1 (can't just be non-zero data), or had no return data.
or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())),
// We use 100 because the length of our calldata totals up like so: 4 + 32 * 3.
// We use 0 and 32 to copy up to 32 bytes of return data into the scratch space.
// Counterintuitively, this call must be positioned second to the or() call in the
// surrounding and() call or else returndatasize() will be zero during the computation.
call(gas(), token, 0, freeMemoryPointer, 100, 0, 32)
)
}
require(success, "TRANSFER_FROM_FAILED");
}
function safeTransfer(
ERC20 token,
address to,
uint256 amount
) internal {
bool success;
/// @solidity memory-safe-assembly
assembly {
// Get a pointer to some free memory.
let freeMemoryPointer := mload(0x40)
// Write the abi-encoded calldata into memory, beginning with the function selector.
mstore(freeMemoryPointer, 0xa9059cbb00000000000000000000000000000000000000000000000000000000)
mstore(add(freeMemoryPointer, 4), to) // Append the "to" argument.
mstore(add(freeMemoryPointer, 36), amount) // Append the "amount" argument.
success := and(
// Set success to whether the call reverted, if not we check it either
// returned exactly 1 (can't just be non-zero data), or had no return data.
or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())),
// We use 68 because the length of our calldata totals up like so: 4 + 32 * 2.
// We use 0 and 32 to copy up to 32 bytes of return data into the scratch space.
// Counterintuitively, this call must be positioned second to the or() call in the
// surrounding and() call or else returndatasize() will be zero during the computation.
call(gas(), token, 0, freeMemoryPointer, 68, 0, 32)
)
}
require(success, "TRANSFER_FAILED");
}
function safeApprove(
ERC20 token,
address to,
uint256 amount
) internal {
bool success;
/// @solidity memory-safe-assembly
assembly {
// Get a pointer to some free memory.
let freeMemoryPointer := mload(0x40)
// Write the abi-encoded calldata into memory, beginning with the function selector.
mstore(freeMemoryPointer, 0x095ea7b300000000000000000000000000000000000000000000000000000000)
mstore(add(freeMemoryPointer, 4), to) // Append the "to" argument.
mstore(add(freeMemoryPointer, 36), amount) // Append the "amount" argument.
success := and(
// Set success to whether the call reverted, if not we check it either
// returned exactly 1 (can't just be non-zero data), or had no return data.
or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())),
// We use 68 because the length of our calldata totals up like so: 4 + 32 * 2.
// We use 0 and 32 to copy up to 32 bytes of return data into the scratch space.
// Counterintuitively, this call must be positioned second to the or() call in the
// surrounding and() call or else returndatasize() will be zero during the computation.
call(gas(), token, 0, freeMemoryPointer, 68, 0, 32)
)
}
require(success, "APPROVE_FAILED");
}
}
/// @notice Minimalist and modern Wrapped Ether implementation.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/WETH.sol)
/// @author Inspired by WETH9 (https://github.com/dapphub/ds-weth/blob/master/src/weth9.sol)
contract WETH is ERC20("Wrapped Ether", "WETH", 18) {
using SafeTransferLib for address;
event Deposit(address indexed from, uint256 amount);
event Withdrawal(address indexed to, uint256 amount);
function deposit() public payable virtual {
_mint(msg.sender, msg.value);
emit Deposit(msg.sender, msg.value);
}
function withdraw(uint256 amount) public virtual {
_burn(msg.sender, amount);
emit Withdrawal(msg.sender, amount);
msg.sender.safeTransferETH(amount);
}
receive() external payable virtual {
deposit();
}
}
/// @title SafeSend
/// @author Tessera
/// @notice Utility contract for sending Ether or WETH value to an address
abstract contract SafeSend {
/// @notice Address for WETH contract on network
/// mainnet: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;
address payable public immutable WETH_ADDRESS;
constructor(address payable _weth) {
WETH_ADDRESS = _weth;
}
/// @notice Attempts to send ether to an address
/// @param _to Address attemping to send to
/// @param _value Amount to send
/// @return success Status of transfer
function _attemptETHTransfer(address _to, uint256 _value) internal returns (bool success) {
// Here increase the gas limit a reasonable amount above the default, and try
// to send ETH to the recipient.
// NOTE: This might allow the recipient to attempt a limited reentrancy attack.
(success, ) = _to.call{value: _value, gas: 30000}("");
}
/// @notice Sends eth or weth to an address
/// @param _to Address to send to
/// @param _value Amount to send
function _sendEthOrWeth(address _to, uint256 _value) internal {
if (!_attemptETHTransfer(_to, _value)) {
WETH(WETH_ADDRESS).deposit{value: _value}();
WETH(WETH_ADDRESS).transfer(_to, _value);
}
}
}
/// @notice Modern, minimalist, and gas efficient ERC-721 implementation.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC721.sol)
abstract contract ERC721 {
/*//////////////////////////////////////////////////////////////
EVENTS
//////////////////////////////////////////////////////////////*/
event Transfer(address indexed from, address indexed to, uint256 indexed id);
event Approval(address indexed owner, address indexed spender, uint256 indexed id);
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
/*//////////////////////////////////////////////////////////////
METADATA STORAGE/LOGIC
//////////////////////////////////////////////////////////////*/
string public name;
string public symbol;
function tokenURI(uint256 id) public view virtual returns (string memory);
/*//////////////////////////////////////////////////////////////
ERC721 BALANCE/OWNER STORAGE
//////////////////////////////////////////////////////////////*/
mapping(uint256 => address) internal _ownerOf;
mapping(address => uint256) internal _balanceOf;
function ownerOf(uint256 id) public view virtual returns (address owner) {
require((owner = _ownerOf[id]) != address(0), "NOT_MINTED");
}
function balanceOf(address owner) public view virtual returns (uint256) {
require(owner != address(0), "ZERO_ADDRESS");
return _balanceOf[owner];
}
/*//////////////////////////////////////////////////////////////
ERC721 APPROVAL STORAGE
//////////////////////////////////////////////////////////////*/
mapping(uint256 => address) public getApproved;
mapping(address => mapping(address => bool)) public isApprovedForAll;
/*//////////////////////////////////////////////////////////////
CONSTRUCTOR
//////////////////////////////////////////////////////////////*/
constructor(string memory _name, string memory _symbol) {
name = _name;
symbol = _symbol;
}
/*//////////////////////////////////////////////////////////////
ERC721 LOGIC
//////////////////////////////////////////////////////////////*/
function approve(address spender, uint256 id) public virtual {
address owner = _ownerOf[id];
require(msg.sender == owner || isApprovedForAll[owner][msg.sender], "NOT_AUTHORIZED");
getApproved[id] = spender;
emit Approval(owner, spender, id);
}
function setApprovalForAll(address operator, bool approved) public virtual {
isApprovedForAll[msg.sender][operator] = approved;
emit ApprovalForAll(msg.sender, operator, approved);
}
function transferFrom(
address from,
address to,
uint256 id
) public virtual {
require(from == _ownerOf[id], "WRONG_FROM");
require(to != address(0), "INVALID_RECIPIENT");
require(
msg.sender == from || isApprovedForAll[from][msg.sender] || msg.sender == getApproved[id],
"NOT_AUTHORIZED"
);
// Underflow of the sender's balance is impossible because we check for
// ownership above and the recipient's balance can't realistically overflow.
unchecked {
_balanceOf[from]--;
_balanceOf[to]++;
}
_ownerOf[id] = to;
delete getApproved[id];
emit Transfer(from, to, id);
}
function safeTransferFrom(
address from,
address to,
uint256 id
) public virtual {
transferFrom(from, to, id);
require(
to.code.length == 0 ||
ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, "") ==
ERC721TokenReceiver.onERC721Received.selector,
"UNSAFE_RECIPIENT"
);
}
function safeTransferFrom(
address from,
address to,
uint256 id,
bytes calldata data
) public virtual {
transferFrom(from, to, id);
require(
to.code.length == 0 ||
ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, data) ==
ERC721TokenReceiver.onERC721Received.selector,
"UNSAFE_RECIPIENT"
);
}
/*//////////////////////////////////////////////////////////////
ERC165 LOGIC
//////////////////////////////////////////////////////////////*/
function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
return
interfaceId == 0x01ffc9a7 || // ERC165 Interface ID for ERC165
interfaceId == 0x80ac58cd || // ERC165 Interface ID for ERC721
interfaceId == 0x5b5e139f; // ERC165 Interface ID for ERC721Metadata
}
/*//////////////////////////////////////////////////////////////
INTERNAL MINT/BURN LOGIC
//////////////////////////////////////////////////////////////*/
function _mint(address to, uint256 id) internal virtual {
require(to != address(0), "INVALID_RECIPIENT");
require(_ownerOf[id] == address(0), "ALREADY_MINTED");
// Counter overflow is incredibly unrealistic.
unchecked {
_balanceOf[to]++;
}
_ownerOf[id] = to;
emit Transfer(address(0), to, id);
}
function _burn(uint256 id) internal virtual {
address owner = _ownerOf[id];
require(owner != address(0), "NOT_MINTED");
// Ownership check above ensures no underflow.
unchecked {
_balanceOf[owner]--;
}
delete _ownerOf[id];
delete getApproved[id];
emit Transfer(owner, address(0), id);
}
/*//////////////////////////////////////////////////////////////
INTERNAL SAFE MINT LOGIC
//////////////////////////////////////////////////////////////*/
function _safeMint(address to, uint256 id) internal virtual {
_mint(to, id);
require(
to.code.length == 0 ||
ERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, "") ==
ERC721TokenReceiver.onERC721Received.selector,
"UNSAFE_RECIPIENT"
);
}
function _safeMint(
address to,
uint256 id,
bytes memory data
) internal virtual {
_mint(to, id);
require(
to.code.length == 0 ||
ERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, data) ==
ERC721TokenReceiver.onERC721Received.selector,
"UNSAFE_RECIPIENT"
);
}
}
/// @notice A generic interface for a contract which properly accepts ERC721 tokens.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC721.sol)
abstract contract ERC721TokenReceiver {
function onERC721Received(
address,
address,
uint256,
bytes calldata
) external virtual returns (bytes4) {
return ERC721TokenReceiver.onERC721Received.selector;
}
}
/// @notice Minimalist and gas efficient standard ERC1155 implementation.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC1155.sol)
abstract contract ERC1155 {
/*//////////////////////////////////////////////////////////////
EVENTS
//////////////////////////////////////////////////////////////*/
event TransferSingle(
address indexed operator,
address indexed from,
address indexed to,
uint256 id,
uint256 amount
);
event TransferBatch(
address indexed operator,
address indexed from,
address indexed to,
uint256[] ids,
uint256[] amounts
);
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
event URI(string value, uint256 indexed id);
/*//////////////////////////////////////////////////////////////
ERC1155 STORAGE
//////////////////////////////////////////////////////////////*/
mapping(address => mapping(uint256 => uint256)) public balanceOf;
mapping(address => mapping(address => bool)) public isApprovedForAll;
/*//////////////////////////////////////////////////////////////
METADATA LOGIC
//////////////////////////////////////////////////////////////*/
function uri(uint256 id) public view virtual returns (string memory);
/*//////////////////////////////////////////////////////////////
ERC1155 LOGIC
//////////////////////////////////////////////////////////////*/
function setApprovalForAll(address operator, bool approved) public virtual {
isApprovedForAll[msg.sender][operator] = approved;
emit ApprovalForAll(msg.sender, operator, approved);
}
function safeTransferFrom(
address from,
address to,
uint256 id,
uint256 amount,
bytes calldata data
) public virtual {
require(msg.sender == from || isApprovedForAll[from][msg.sender], "NOT_AUTHORIZED");
balanceOf[from][id] -= amount;
balanceOf[to][id] += amount;
emit TransferSingle(msg.sender, from, to, id, amount);
require(
to.code.length == 0
? to != address(0)
: ERC1155TokenReceiver(to).onERC1155Received(msg.sender, from, id, amount, data) ==
ERC1155TokenReceiver.onERC1155Received.selector,
"UNSAFE_RECIPIENT"
);
}
function safeBatchTransferFrom(
address from,
address to,
uint256[] calldata ids,
uint256[] calldata amounts,
bytes calldata data
) public virtual {
require(ids.length == amounts.length, "LENGTH_MISMATCH");
require(msg.sender == from || isApprovedForAll[from][msg.sender], "NOT_AUTHORIZED");
// Storing these outside the loop saves ~15 gas per iteration.
uint256 id;
uint256 amount;
for (uint256 i = 0; i < ids.length; ) {
id = ids[i];
amount = amounts[i];
balanceOf[from][id] -= amount;
balanceOf[to][id] += amount;
// An array can't have a total length
// larger than the max uint256 value.
unchecked {
++i;
}
}
emit TransferBatch(msg.sender, from, to, ids, amounts);
require(
to.code.length == 0
? to != address(0)
: ERC1155TokenReceiver(to).onERC1155BatchReceived(msg.sender, from, ids, amounts, data) ==
ERC1155TokenReceiver.onERC1155BatchReceived.selector,
"UNSAFE_RECIPIENT"
);
}
function balanceOfBatch(address[] calldata owners, uint256[] calldata ids)
public
view
virtual
returns (uint256[] memory balances)
{
require(owners.length == ids.length, "LENGTH_MISMATCH");
balances = new uint256[](owners.length);
// Unchecked because the only math done is incrementing
// the array index counter which cannot possibly overflow.
unchecked {
for (uint256 i = 0; i < owners.length; ++i) {
balances[i] = balanceOf[owners[i]][ids[i]];
}
}
}
/*//////////////////////////////////////////////////////////////
ERC165 LOGIC
//////////////////////////////////////////////////////////////*/
function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
return
interfaceId == 0x01ffc9a7 || // ERC165 Interface ID for ERC165
interfaceId == 0xd9b67a26 || // ERC165 Interface ID for ERC1155
interfaceId == 0x0e89341c; // ERC165 Interface ID for ERC1155MetadataURI
}
/*//////////////////////////////////////////////////////////////
INTERNAL MINT/BURN LOGIC
//////////////////////////////////////////////////////////////*/
function _mint(
address to,
uint256 id,
uint256 amount,
bytes memory data
) internal virtual {
balanceOf[to][id] += amount;
emit TransferSingle(msg.sender, address(0), to, id, amount);
require(
to.code.length == 0
? to != address(0)
: ERC1155TokenReceiver(to).onERC1155Received(msg.sender, address(0), id, amount, data) ==
ERC1155TokenReceiver.onERC1155Received.selector,
"UNSAFE_RECIPIENT"
);
}
function _batchMint(
address to,
uint256[] memory ids,
uint256[] memory amounts,
bytes memory data
) internal virtual {
uint256 idsLength = ids.length; // Saves MLOADs.
require(idsLength == amounts.length, "LENGTH_MISMATCH");
for (uint256 i = 0; i < idsLength; ) {
balanceOf[to][ids[i]] += amounts[i];
// An array can't have a total length
// larger than the max uint256 value.
unchecked {
++i;
}
}
emit TransferBatch(msg.sender, address(0), to, ids, amounts);
require(
to.code.length == 0
? to != address(0)
: ERC1155TokenReceiver(to).onERC1155BatchReceived(msg.sender, address(0), ids, amounts, data) ==
ERC1155TokenReceiver.onERC1155BatchReceived.selector,
"UNSAFE_RECIPIENT"
);
}
function _batchBurn(
address from,
uint256[] memory ids,
uint256[] memory amounts
) internal virtual {
uint256 idsLength = ids.length; // Saves MLOADs.
require(idsLength == amounts.length, "LENGTH_MISMATCH");
for (uint256 i = 0; i < idsLength; ) {
balanceOf[from][ids[i]] -= amounts[i];
// An array can't have a total length
// larger than the max uint256 value.
unchecked {
++i;
}
}
emit TransferBatch(msg.sender, from, address(0), ids, amounts);
}
function _burn(
address from,
uint256 id,
uint256 amount
) internal virtual {
balanceOf[from][id] -= amount;
emit TransferSingle(msg.sender, from, address(0), id, amount);
}
}
/// @notice A generic interface for a contract which properly accepts ERC1155 tokens.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC1155.sol)
abstract contract ERC1155TokenReceiver {
function onERC1155Received(
address,
address,
uint256,
uint256,
bytes calldata
) external virtual returns (bytes4) {
return ERC1155TokenReceiver.onERC1155Received.selector;
}
function onERC1155BatchReceived(
address,
address,
uint256[] calldata,
uint256[] calldata,
bytes calldata
) external virtual returns (bytes4) {
return ERC1155TokenReceiver.onERC1155BatchReceived.selector;
}
}
/// @title NFT Receiver
/// @author Tessera
/// @notice Plugin contract for handling receipts of non-fungible tokens
contract NFTReceiver is ERC721TokenReceiver, ERC1155TokenReceiver {
/// @notice Handles the receipt of a single ERC721 token
function onERC721Received(
address,
address,
uint256,
bytes calldata
) external virtual override returns (bytes4) {
return ERC721TokenReceiver.onERC721Received.selector;
}
/// @notice Handles the receipt of a single ERC1155 token type
function onERC1155Received(
address,
address,
uint256,
uint256,
bytes calldata
) external virtual override returns (bytes4) {
return ERC1155TokenReceiver.onERC1155Received.selector;
}
/// @notice Handles the receipt of multiple ERC1155 token types
function onERC1155BatchReceived(
address,
address,
uint256[] calldata,
uint256[] calldata,
bytes calldata
) external virtual override returns (bytes4) {
return ERC1155TokenReceiver.onERC1155BatchReceived.selector;
}
}
/// @dev Interface for Minter module contract
interface IMinter {
function getPermissions() external view returns (Permission[] memory permissions);
function supply() external view returns (address);
}
/// @title Minter
/// @author Tessera
/// @notice Module contract for minting a fixed supply of Raes
contract Minter is IMinter, Module {
/// @notice Address of Supply target contract
address public immutable supply;
/// @notice Initializes supply target contract
constructor(address _supply) {
supply = _supply;
}
/// @notice Gets the list of permissions installed on a vault
/// @dev Permissions consist of a module contract, target contract, and function selector
/// @return permissions A list of Permission Structs
function getPermissions()
public
view
virtual
override(IMinter, Module)
returns (Permission[] memory permissions)
{
permissions = new Permission[](1);
permissions[0] = Permission(address(this), supply, ISupply.mint.selector);
}
/// @notice Mints a Rae supply
/// @param _vault Address of the Vault
/// @param _to Address of the receiver of Raes
/// @param _raeSupply Number of NFT Raes minted to control the vault
/// @param _mintProof List of proofs to execute a mint function
function _mintRaes(
address _vault,
address _to,
uint256 _raeSupply,
bytes32[] calldata _mintProof
) internal {
bytes memory data = abi.encodeCall(ISupply.mint, (_to, _raeSupply));
IVault(payable(_vault)).execute(supply, data, _mintProof);
}
}
/// @notice Gas optimized reentrancy protection for smart contracts.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/ReentrancyGuard.sol)
/// @author Modified from OpenZeppelin (https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/security/ReentrancyGuard.sol)
abstract contract ReentrancyGuard {
uint256 private locked = 1;
modifier nonReentrant() virtual {
require(locked == 1, "REENTRANCY");
locked = 2;
_;
locked = 1;
}
}
/// @dev Interface for ERC-721 token contract
interface IERC721 {
event Approval(address indexed _owner, address indexed _spender, uint256 indexed _id);
event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);
event Transfer(address indexed _from, address indexed _to, uint256 indexed _id);
function approve(address _spender, uint256 _id) external;
function balanceOf(address _owner) external view returns (uint256);
function getApproved(uint256) external view returns (address);
function isApprovedForAll(address, address) external view returns (bool);
function name() external view returns (string memory);
function ownerOf(uint256 _id) external view returns (address owner);
function safeTransferFrom(
address _from,
address _to,
uint256 _id
) external;
function safeTransferFrom(
address _from,
address _to,
uint256 _id,
bytes memory _data
) external;
function setApprovalForAll(address _operator, bool _approved) external;
function supportsInterface(bytes4 _interfaceId) external view returns (bool);
function symbol() external view returns (string memory);
function tokenURI(uint256 _id) external view returns (string memory);
function transferFrom(
address _from,
address _to,
uint256 _id
) external;
}
/// @dev Interface for ERC-1155 token contract
interface IERC1155 {
event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);
event TransferBatch(
address indexed _operator,
address indexed _from,
address indexed _to,
uint256[] _ids,
uint256[] _amounts
);
event TransferSingle(
address indexed _operator,
address indexed _from,
address indexed _to,
uint256 _id,
uint256 _amount
);
event URI(string _value, uint256 indexed _id);
function balanceOf(address, uint256) external view returns (uint256);
function balanceOfBatch(address[] memory _owners, uint256[] memory ids)
external
view
returns (uint256[] memory balances);
function isApprovedForAll(address, address) external view returns (bool);
function safeBatchTransferFrom(
address _from,
address _to,
uint256[] memory _ids,
uint256[] memory _amounts,
bytes memory _data
) external;
function safeTransferFrom(
address _from,
address _to,
uint256 _id,
uint256 _amount,
bytes memory _data
) external;
function setApprovalForAll(address _operator, bool _approved) external;
function supportsInterface(bytes4 _interfaceId) external view returns (bool);
function uri(uint256 _id) external view returns (string memory);
}
// OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol)
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
/**
* @dev Interface for the NFT Royalty Standard.
*
* A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal
* support for royalty payments across all NFT marketplaces and ecosystem participants.
*
* _Available since v4.5._
*/
interface IERC2981 is IERC165 {
/**
* @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
* exchange. The royalty amount is denominated and should be paid in that same unit of exchange.
*/
function royaltyInfo(uint256 tokenId, uint256 salePrice)
external
view
returns (address receiver, uint256 royaltyAmount);
}
// OpenZeppelin Contracts v4.4.1 (interfaces/IERC165.sol)
/// @title LPDA
/// @author Tessera
/// @notice Last Price Dutch Auction contract for distributing Raes
contract LPDA is ILPDA, Protoform, Minter, ReentrancyGuard, SafeSend, NFTReceiver {
using LibLPDAInfo for LPDAInfo;
/// @notice Address of VaultRegistry contract
address public immutable registry;
/// @notice Address of Transfer target contract
address public immutable transfer;
/// @notice Address of fee receiver on initial distrubtion
address public feeReceiver;
/// @notice Max fee a curator will pay
uint256 public constant MAX_FEE = 1250;
/// @notice vault => user => total amount paid by user
mapping(address => mapping(address => uint256)) public balanceContributed;
/// @notice vault => user => total amount refunded to user
mapping(address => mapping(address => uint256)) public balanceRefunded;
/// @notice vault => user => total # of raes minted by user
mapping(address => mapping(address => uint256)) public numMinted;
/// @notice vault => royalty token
mapping(address => address) public vaultRoyaltyToken;
/// @notice vault => royalty token Id
mapping(address => uint256) public vaultRoyaltyTokenId;
/// @notice vault => auction info struct for LPDA
mapping(address => LPDAInfo) public vaultLPDAInfo;
/// @notice vault => enumerated list of minters for the LPDA
mapping(address => address[]) public vaultLPDAMinters;
constructor(
address _registry,
address _supply,
address _transfer,
address payable _weth,
address _feeReceiver
) Minter(_supply) SafeSend(_weth) {
registry = _registry;
transfer = _transfer;
feeReceiver = _feeReceiver;
}
/// @notice Deploys a new Vault and mints initial supply of Raes
/// @param _modules The list of modules to be installed on the vault
function deployVault(
address[] calldata _modules,
address[] calldata _plugins,
bytes4[] calldata _selectors,
LPDAInfo calldata _lpdaInfo,
address _token,
uint256 _id,
bytes32[] calldata _mintProof
) external returns (address vault) {
_lpdaInfo.validateAuctionInfo();
bytes32[] memory leafNodes = generateMerkleTree(_modules);
bytes32 merkleRoot = getRoot(leafNodes);
vault = IVaultRegistry(registry).create(merkleRoot);
if (IERC165(_token).supportsInterface(type(IERC2981).interfaceId))
(vaultRoyaltyToken[vault] = _token, vaultRoyaltyTokenId[vault] = _id);
vaultLPDAInfo[vault] = _lpdaInfo;
IERC721(_token).transferFrom(msg.sender, vault, _id);
_mintRaes(vault, address(this), _lpdaInfo.supply, _mintProof);
emit ActiveModules(vault, _modules);
emit CreatedLPDA(vault, _token, _id, _lpdaInfo);
}
/// @notice Enters a bid for a given vault
/// @param _vault The vault to bid on raes for
/// @param _amount The quantity of raes to bid for
function enterBid(address _vault, uint16 _amount) external payable {
LPDAInfo storage lpda = vaultLPDAInfo[_vault];
uint256 price = currentPrice(_vault);
lpda.validateAndRecordBid(uint128(price), _amount);
vaultLPDAMinters[_vault].push(msg.sender);
balanceContributed[_vault][msg.sender] += msg.value;
numMinted[_vault][msg.sender] += _amount;
emit BidEntered(_vault, msg.sender, _amount, price);
}
/// @notice Settles the auction for a given vault's LPDA
/// @param _vault The vault to settle the LPDA for
/// @param _minter The minter to settle their share of the LPDA
function settleAddress(address _vault, address _minter) external nonReentrant {
LPDAInfo memory lpda = vaultLPDAInfo[_vault];
require(lpda.isOver(), "LPDA: Auction NOT over");
uint256 amount = numMinted[_vault][_minter];
delete numMinted[_vault][_minter];
if (lpda.isSuccessful()) {
(address token, uint256 id) = IVaultRegistry(registry).vaultToToken(_vault);
IERC1155(token).safeTransferFrom(address(this), _minter, id, amount, "");
_refundAddress(_vault, _minter, amount, lpda.minBid);
emit MintedRaes(_vault, _minter, amount, lpda.minBid);
} else if (lpda.isNotSuccessful()) {
_refundAddress(_vault, _minter, amount, lpda.minBid);
} else {
revert("LPDA: Auction NOT over");
}
}
/// @notice Settles the curators account for a given vault
/// @notice _vault The vault to settle the curator for
function settleCurator(address _vault) external nonReentrant {
LPDAInfo storage lpda = vaultLPDAInfo[_vault];
require(lpda.isSuccessful(), "LPDA: Not sold out");
require(lpda.curatorClaimed == 0, "LPDA: Curator already claimed");
uint256 total = lpda.minBid * lpda.numSold;
uint256 min = lpda.endPrice * lpda.numSold;
uint256 feePercent = MAX_FEE;
if (min != 0) {
uint256 diff = total - min;
feePercent = ((diff * 1e18) / (min * 5) / 1e14) + 250;
feePercent = feePercent > MAX_FEE ? MAX_FEE : feePercent;
}
uint256 fee = (feePercent * total) / 1e4;
lpda.curatorClaimed += uint128(total);
address token = vaultRoyaltyToken[_vault];
uint256 id = vaultRoyaltyTokenId[_vault];
(address royaltyReceiver, uint256 royaltyAmount) = token == address(0)
? (address(0), 0)
: IERC2981(token).royaltyInfo(id, total);
_sendEthOrWeth(royaltyReceiver, royaltyAmount);
emit RoyaltyPaid(_vault, royaltyReceiver, royaltyAmount);
_sendEthOrWeth(feeReceiver, fee);
emit FeeDispersed(_vault, feeReceiver, fee);
_sendEthOrWeth(lpda.curator, total - fee - royaltyAmount);
emit CuratorClaimed(_vault, lpda.curator, total - fee - royaltyAmount);
}
/// @notice Redeems the curator's NFT for a given vault if the LPDA was unsuccessful
/// @param _vault The vault to redeem the curator's NFT for
/// @param _token The token contract to redeem
/// @param _tokenId The tokenId to redeem
/// @param _erc721TransferProof The proofs required to transfer the NFT
function redeemNFTCurator(
address _vault,
address _token,
uint256 _tokenId,
bytes32[] calldata _erc721TransferProof
) external {
LPDAInfo memory lpda = vaultLPDAInfo[_vault];
require(lpda.isNotSuccessful(), "LPDA: Auction NOT Successful");
require(msg.sender == lpda.curator, "LPDA: Not curator");
bytes memory data = abi.encodeCall(
ITransfer.ERC721TransferFrom,
(_token, _vault, msg.sender, _tokenId)
);
IVault(payable(_vault)).execute(transfer, data, _erc721TransferProof);
emit CuratorRedeemedNFT(_vault, msg.sender, _token, _tokenId);
}
/// @notice Transfer the feeReceiver account
/// @param _receiver The new feeReceiver
function updateFeeReceiver(address _receiver) external {
require(msg.sender == feeReceiver, "LPDA: Not fee receiver");
feeReceiver = _receiver;
}
/// @notice returns the current dutch auction price
/// @param _vault The vault to get the current price of the LPDA for
/// @return price The current price of the LPDA
function currentPrice(address _vault) public view returns (uint256 price) {
LPDAInfo memory lpda = vaultLPDAInfo[_vault];
uint256 deduction = (block.timestamp - lpda.startTime) * lpda.dropPerSecond;
price = (deduction > lpda.startPrice) ? 0 : lpda.startPrice - deduction;
price = (price > lpda.endPrice) ? price : lpda.endPrice;
}
function getMinters(address _vault) public view returns (address[] memory) {
return vaultLPDAMinters[_vault];
}
/// @notice returns the current lpda auction state for a vault
/// @param _vault The vault to get the current auction state for
function getAuctionState(address _vault) public view returns (LPDAState) {
return vaultLPDAInfo[_vault].getAuctionState();
}
/// @notice Check the refund owned to an account
/// @param _vault The vault to check the refund for
/// @param _minter the acount to check the refund for
/// @return The refund still owed to the minter account
function refundOwed(address _vault, address _minter) public view returns (uint256) {
LPDAInfo memory lpda = vaultLPDAInfo[_vault];
uint256 totalCost = lpda.minBid * numMinted[_vault][_minter];
uint256 alreadyRefunded = balanceRefunded[_vault][_minter];
uint256 balance = balanceContributed[_vault][_minter];
return balance - alreadyRefunded - totalCost;
}
/// @notice Gets the list of permissions installed on a vault
/// @dev Permissions consist of a module contract, target contract, and function selector
/// @return permissions A list of Permission Structs
function getPermissions()
public
view
virtual
override(Minter)
returns (Permission[] memory permissions)
{
permissions = new Permission[](2);
permissions[0] = super.getPermissions()[0];
permissions[1] = Permission(address(this), transfer, ITransfer.ERC721TransferFrom.selector);
}
function _refundAddress(
address _vault,
address _minter,
uint256 _mints,
uint128 _minBid
) internal {
uint256 owed = balanceContributed[_vault][_minter];
owed -= (_minBid * _mints + balanceRefunded[_vault][_minter]);
if (owed > 0) {
balanceRefunded[_vault][_minter] += owed;
_sendEthOrWeth(_minter, owed);
emit Refunded(_vault, _minter, owed);
}
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_registry","type":"address"},{"internalType":"address","name":"_supply","type":"address"},{"internalType":"address","name":"_transfer","type":"address"},{"internalType":"address payable","name":"_weth","type":"address"},{"internalType":"address","name":"_feeReceiver","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_vault","type":"address"},{"indexed":false,"internalType":"address[]","name":"_modules","type":"address[]"}],"name":"ActiveModules","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_vault","type":"address"},{"indexed":true,"internalType":"address","name":"_user","type":"address"},{"indexed":false,"internalType":"uint256","name":"_quantity","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_price","type":"uint256"}],"name":"BidEntered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_vault","type":"address"},{"indexed":true,"internalType":"address","name":"_token","type":"address"},{"indexed":false,"internalType":"uint256","name":"_id","type":"uint256"},{"components":[{"internalType":"uint32","name":"startTime","type":"uint32"},{"internalType":"uint32","name":"endTime","type":"uint32"},{"internalType":"uint64","name":"dropPerSecond","type":"uint64"},{"internalType":"uint128","name":"startPrice","type":"uint128"},{"internalType":"uint128","name":"endPrice","type":"uint128"},{"internalType":"uint128","name":"minBid","type":"uint128"},{"internalType":"uint16","name":"supply","type":"uint16"},{"internalType":"uint16","name":"numSold","type":"uint16"},{"internalType":"uint128","name":"curatorClaimed","type":"uint128"},{"internalType":"address","name":"curator","type":"address"}],"indexed":false,"internalType":"struct LPDAInfo","name":"_lpdaInfo","type":"tuple"}],"name":"CreatedLPDA","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_vault","type":"address"},{"indexed":true,"internalType":"address","name":"_curator","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"CuratorClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_vault","type":"address"},{"indexed":true,"internalType":"address","name":"_curator","type":"address"},{"indexed":true,"internalType":"address","name":"_token","type":"address"},{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"CuratorRedeemedNFT","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_vault","type":"address"},{"indexed":true,"internalType":"address","name":"_receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"FeeDispersed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_vault","type":"address"},{"indexed":true,"internalType":"address","name":"_user","type":"address"},{"indexed":false,"internalType":"uint256","name":"_quantity","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_price","type":"uint256"}],"name":"MintedRaes","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_vault","type":"address"},{"indexed":true,"internalType":"address","name":"_user","type":"address"},{"indexed":false,"internalType":"uint256","name":"_balance","type":"uint256"}],"name":"Refunded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_vault","type":"address"},{"indexed":true,"internalType":"address","name":"_royaltyReceiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"RoyaltyPaid","type":"event"},{"inputs":[],"name":"MAX_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WETH_ADDRESS","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"balanceContributed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"balanceRefunded","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"}],"name":"currentPrice","outputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_modules","type":"address[]"},{"internalType":"address[]","name":"_plugins","type":"address[]"},{"internalType":"bytes4[]","name":"_selectors","type":"bytes4[]"},{"components":[{"internalType":"uint32","name":"startTime","type":"uint32"},{"internalType":"uint32","name":"endTime","type":"uint32"},{"internalType":"uint64","name":"dropPerSecond","type":"uint64"},{"internalType":"uint128","name":"startPrice","type":"uint128"},{"internalType":"uint128","name":"endPrice","type":"uint128"},{"internalType":"uint128","name":"minBid","type":"uint128"},{"internalType":"uint16","name":"supply","type":"uint16"},{"internalType":"uint16","name":"numSold","type":"uint16"},{"internalType":"uint128","name":"curatorClaimed","type":"uint128"},{"internalType":"address","name":"curator","type":"address"}],"internalType":"struct LPDAInfo","name":"_lpdaInfo","type":"tuple"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"bytes32[]","name":"_mintProof","type":"bytes32[]"}],"name":"deployVault","outputs":[{"internalType":"address","name":"vault","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"},{"internalType":"uint16","name":"_amount","type":"uint16"}],"name":"enterBid","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"feeReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_modules","type":"address[]"}],"name":"generateMerkleTree","outputs":[{"internalType":"bytes32[]","name":"tree","type":"bytes32[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_modules","type":"address[]"}],"name":"generateUnhashedMerkleTree","outputs":[{"internalType":"bytes[]","name":"tree","type":"bytes[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"}],"name":"getAuctionState","outputs":[{"internalType":"enum LPDAState","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLeaves","outputs":[{"internalType":"bytes32[]","name":"leaves","type":"bytes32[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"}],"name":"getMinters","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPermissions","outputs":[{"components":[{"internalType":"address","name":"module","type":"address"},{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes4","name":"selector","type":"bytes4"}],"internalType":"struct Permission[]","name":"permissions","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_data","type":"bytes32[]"},{"internalType":"uint256","name":"_node","type":"uint256"}],"name":"getProof","outputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_data","type":"bytes32[]"}],"name":"getRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getUnhashedLeaves","outputs":[{"internalType":"bytes[]","name":"leaves","type":"bytes[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_left","type":"bytes32"},{"internalType":"bytes32","name":"_right","type":"bytes32"}],"name":"hashLeafPairs","outputs":[{"internalType":"bytes32","name":"data","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"}],"name":"log2ceil_naive","outputs":[{"internalType":"uint256","name":"ceil","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"numMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes32[]","name":"_erc721TransferProof","type":"bytes32[]"}],"name":"redeemNFTCurator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"},{"internalType":"address","name":"_minter","type":"address"}],"name":"refundOwed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"registry","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"},{"internalType":"address","name":"_minter","type":"address"}],"name":"settleAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"}],"name":"settleCurator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"supply","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"transfer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"}],"name":"updateFeeReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"vaultLPDAInfo","outputs":[{"internalType":"uint32","name":"startTime","type":"uint32"},{"internalType":"uint32","name":"endTime","type":"uint32"},{"internalType":"uint64","name":"dropPerSecond","type":"uint64"},{"internalType":"uint128","name":"startPrice","type":"uint128"},{"internalType":"uint128","name":"endPrice","type":"uint128"},{"internalType":"uint128","name":"minBid","type":"uint128"},{"internalType":"uint16","name":"supply","type":"uint16"},{"internalType":"uint16","name":"numSold","type":"uint16"},{"internalType":"uint128","name":"curatorClaimed","type":"uint128"},{"internalType":"address","name":"curator","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"vaultLPDAMinters","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"vaultRoyaltyToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"vaultRoyaltyTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_root","type":"bytes32"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"},{"internalType":"bytes32","name":"_valueToProve","type":"bytes32"}],"name":"verifyProof","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"}]Contract Creation Code
61010060405260016000553480156200001757600080fd5b50604051620045e6380380620045e68339810160408190526200003a9162000090565b6001600160a01b0393841660805290831660a05292821660c052811660e052600180546001600160a01b0319169290911691909117905562000110565b6001600160a01b03811681146200008d57600080fd5b50565b600080600080600060a08688031215620000a957600080fd5b8551620000b68162000077565b6020870151909550620000c98162000077565b6040870151909450620000dc8162000077565b6060870151909350620000ef8162000077565b6080870151909250620001028162000077565b809150509295509295909350565b60805160a05160c05160e051614464620001826000396000818161059e0152818161136a015261220301526000818161050501528181610aba01526117c90152600081816102260152818161271601526127ab01526000818161027701528181612d980152612f9b01526144646000f3fe60806040526004361061020f5760003560e01c8063884c05fb11610118578063bc197c81116100a0578063cf1675ef1161006f578063cf1675ef14610825578063dd1d259914610852578063e312bcc714610872578063e9833c2f14610887578063f23a6e61146108a757600080fd5b8063bc197c8114610794578063bc38d61f146107c3578063c3a07df6146107e3578063c69bebe41461080557600080fd5b8063ad2b3037116100e7578063ad2b303714610716578063b3f006741461072b578063b739e31b1461074b578063b86161951461075e578063bc063e1a1461077e57600080fd5b8063884c05fb1461055f5780638a4068dd1461058c5780639fd58ae5146105c0578063ac84e879146105f857600080fd5b80632d5d43171161019b5780635b68b04d1161016a5780635b68b04d1461047d57806364e76fe91461049d57806368ecbaa5146104bd5780637b103999146104f357806380e7a8451461052757600080fd5b80632d5d4317146103c85780632e08d602146103f557806343c686ae1461041557806358161a421461044d57600080fd5b8063150b7a02116101e2578063150b7a02146102e95780632189230f1461032e57806326469c7d1461035b5780632b5c58061461037b5780632cfcad831461039b57600080fd5b8063040141e514610214578063047fc9aa1461026557806308d7090a146102995780631284b0d3146102c7575b600080fd5b34801561022057600080fd5b506102487f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561027157600080fd5b506102487f000000000000000000000000000000000000000000000000000000000000000081565b3480156102a557600080fd5b506102b96102b436600461325d565b6108d4565b60405190815260200161025c565b3480156102d357600080fd5b506102e76102e236600461329b565b6108fd565b005b3480156102f557600080fd5b5061031561030436600461331c565b630a85bd0160e11b95945050505050565b6040516001600160e01b0319909116815260200161025c565b34801561033a57600080fd5b506102b961034936600461338e565b60066020526000908152604090205481565b34801561036757600080fd5b506102e761037636600461338e565b610c91565b34801561038757600080fd5b506102e76103963660046133f6565b61117c565b3480156103a757600080fd5b506103bb6103b636600461338e565b611441565b60405161025c9190613457565b3480156103d457600080fd5b506103e86103e3366004613511565b611511565b60405161025c9190613600565b34801561040157600080fd5b506102b96104103660046136c8565b61166c565b34801561042157600080fd5b506102b961043036600461329b565b600360209081526000928352604080842090915290825290205481565b34801561045957600080fd5b5061046d6104683660046136fc565b611706565b604051901515815260200161025c565b34801561048957600080fd5b50610248610498366004613764565b61174c565b3480156104a957600080fd5b506102486104b836600461385c565b611a42565b3480156104c957600080fd5b506102486104d836600461338e565b6005602052600090815260409020546001600160a01b031681565b3480156104ff57600080fd5b506102487f000000000000000000000000000000000000000000000000000000000000000081565b34801561053357600080fd5b506102b961054236600461329b565b600260209081526000928352604080842090915290825290205481565b34801561056b57600080fd5b5061057f61057a366004613511565b611a7a565b60405161025c9190613888565b34801561059857600080fd5b506102487f000000000000000000000000000000000000000000000000000000000000000081565b3480156105cc57600080fd5b506102b96105db36600461329b565b600460209081526000928352604080842090915290825290205481565b34801561060457600080fd5b5061069b61061336600461338e565b600760205260009081526040902080546001820154600283015460039093015463ffffffff80841694600160201b808604909216946001600160401b03600160401b820416946001600160801b03600160801b92839004811695828216959390920481169361ffff80821694620100008304909116939104909116906001600160a01b03168a565b6040805163ffffffff9b8c1681529a90991660208b01526001600160401b03909716978901979097526001600160801b039485166060890152928416608088015290831660a087015261ffff90811660c08701521660e08501529091166101008301526001600160a01b03166101208201526101400161025c565b34801561072257600080fd5b5061057f611bc2565b34801561073757600080fd5b50600154610248906001600160a01b031681565b6102e76107593660046138e7565b611c8d565b34801561076a57600080fd5b5061057f610779366004613915565b611dad565b34801561078a57600080fd5b506102b96104e281565b3480156107a057600080fd5b506103156107af366004613959565b63bc197c8160e01b98975050505050505050565b3480156107cf57600080fd5b506102b96107de36600461329b565b61201c565b3480156107ef57600080fd5b506107f8612162565b60405161025c9190613a48565b34801561081157600080fd5b506102e761082036600461338e565b612266565b34801561083157600080fd5b5061084561084036600461338e565b6122db565b60405161025c9190613a8a565b34801561085e57600080fd5b506102b961086d366004613acb565b612351565b34801561087e57600080fd5b506103e861239d565b34801561089357600080fd5b506102b96108a236600461338e565b612465565b3480156108b357600080fd5b506103156108c2366004613aed565b63f23a6e6160e01b9695505050505050565b60008119600101821682145b82156108f657600192831c9291909101906108e0565b9003919050565b6000546001146109415760405162461bcd60e51b815260206004820152600a6024820152695245454e5452414e435960b01b60448201526064015b60405180910390fd5b600260008181556001600160a01b03808516825260076020908152604092839020835161014081018552815463ffffffff8082168352600160201b808304909116948301949094526001600160401b03600160401b820416958201959095526001600160801b03600160801b95869004811660608301526001830154808216608084015295909504851660a08201529481015461ffff80821660c08801526201000082041660e08701529190910490921661010084015260039091015416610120820152610a0e816125a5565b610a535760405162461bcd60e51b8152602060048201526016602482015275262822209d1020bab1ba34b7b7102727aa1037bb32b960511b6044820152606401610938565b6001600160a01b0383811660009081526004602090815260408083209386168352929052908120805491905560c082015160e083015161ffff918216911603610c22576040516310b467bd60e21b81526001600160a01b03858116600483015260009182917f000000000000000000000000000000000000000000000000000000000000000016906342d19ef4906024016040805180830381865afa158015610b00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b249190613b68565b604051637921219560e11b81523060048201526001600160a01b038881166024830152604482018390526064820187905260a06084830152600060a48301529294509092509083169063f242432a9060c401600060405180830381600087803b158015610b9057600080fd5b505af1158015610ba4573d6000803e3d6000fd5b50505050610bb88686858760a001516125ce565b846001600160a01b0316866001600160a01b03167f26edd63ecb990f043d4fcce6a3e407be52646e19b3bb19afa6e2840b8d803644858760a00151604051610c139291909182526001600160801b0316602082015260400190565b60405180910390a35050610c86565b610c2b826126d7565b15610c4557610c408484838560a001516125ce565b610c86565b60405162461bcd60e51b8152602060048201526016602482015275262822209d1020bab1ba34b7b7102727aa1037bb32b960511b6044820152606401610938565b505060016000555050565b600054600114610cd05760405162461bcd60e51b815260206004820152600a6024820152695245454e5452414e435960b01b6044820152606401610938565b600260008181556001600160a01b03838116825260076020908152604092839020835161014081018552815463ffffffff8082168352600160201b808304909116948301949094526001600160401b03600160401b820416958201959095526001600160801b03600160801b95869004811660608301526001830154808216608084015295909504851660a08201529481015461ffff80821660c0880181905262010000830490911660e08801819052939091049094166101008601526003810154909216610120909401939093529114610de25760405162461bcd60e51b8152602060048201526012602482015271131411104e88139bdd081cdbdb19081bdd5d60721b6044820152606401610938565b6002810154600160201b90046001600160801b031615610e445760405162461bcd60e51b815260206004820152601d60248201527f4c5044413a2043757261746f7220616c726561647920636c61696d65640000006044820152606401610938565b60028101546001820154600091610e76916201000090910461ffff1690600160801b90046001600160801b0316613bac565b600283015460018401546001600160801b039283169350600092610ea59262010000900461ffff169116613bac565b6001600160801b031690506104e28115610f23576000610ec58385613bdb565b9050655af3107a4000610ed9846005613bf2565b610eeb83670de0b6b3a7640000613bf2565b610ef59190613c11565b610eff9190613c11565b610f0a9060fa613c33565b91506104e28211610f1b5781610f1f565b6104e25b9150505b6000612710610f328584613bf2565b610f3c9190613c11565b9050838560020160048282829054906101000a90046001600160801b0316610f649190613c4b565b82546001600160801b039182166101009390930a9283029190920219909116179055506001600160a01b0380871660009081526005602090815260408083205460069092528220549216919080831561102b5760405163152a902d60e11b815260048101849052602481018990526001600160a01b03851690632a55205a906044016040805180830381865afa158015611002573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110269190613b68565b61102f565b6000805b9150915061103d8282612706565b816001600160a01b03168a6001600160a01b03167fbdf0502df1b76d58521b2a929580ca100c2121e0ae38717b260d9cfa44c23b328360405161108291815260200190565b60405180910390a36001546110a0906001600160a01b031686612706565b6001546040518681526001600160a01b03918216918c16907f4b39748ccad2b4ef6bcad79fe10f80215c9c855e0c1db6cf61bb7277a128e5039060200160405180910390a36003890154611111906001600160a01b031682611102888c613bdb565b61110c9190613bdb565b612706565b60038901546001600160a01b03908116908b167f7788f04afc4c336e7e8f6b6da2faf726900122643d0942085e63e643bf03d83e83611150898d613bdb565b61115a9190613bdb565b60405190815260200160405180910390a3505060016000555050505050505050565b6001600160a01b03808616600090815260076020908152604091829020825161014081018452815463ffffffff8082168352600160201b808304909116948301949094526001600160401b03600160401b820416948201949094526001600160801b03600160801b94859004811660608301526001830154808216608084015294909404841660a0820152600282015461ffff80821660c08401526201000082041660e083015292909204909216610100820152600390910154909116610120820152611248816126d7565b6112945760405162461bcd60e51b815260206004820152601c60248201527f4c5044413a2041756374696f6e204e4f54205375636365737366756c000000006044820152606401610938565b8061012001516001600160a01b0316336001600160a01b0316146112ee5760405162461bcd60e51b8152602060048201526011602482015270262822209d102737ba1031bab930ba37b960791b6044820152606401610938565b6040516001600160a01b038087166024830152871660448201523360648201526084810185905260009060a40160408051601f198184030181529181526020820180516001600160e01b03166318c4eeed60e01b1790525163601b8af360e01b81529091506001600160a01b0388169063601b8af390611398907f000000000000000000000000000000000000000000000000000000000000000090859089908990600401613c76565b6000604051808303816000875af11580156113b7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526113df9190810190613d4b565b5050856001600160a01b0316336001600160a01b0316886001600160a01b03167fa46f01ffe5ddc1a516c5bd9e5d58a2ffcc4f36029cd4068c6a1d5019509f628b8860405161143091815260200190565b60405180910390a450505050505050565b6001600160a01b038082166000908152600760209081526040808320815161014081018352815463ffffffff8082168352600160201b808304909116958301959095526001600160401b03600160401b820416938201939093526001600160801b03600160801b93849004811660608301526001830154808216608084015293909304831660a0820152600282015461ffff80821660c08401526201000082041660e083015293909304909116610100830152600301549092166101208301529061150b90612822565b92915050565b8051606090600090816115248583612880565b9050806001600160401b0381111561153e5761153e61347f565b60405190808252806020026020018201604052801561157157816020015b606081526020019060019003908161155c5790505b50935060005b8281101561166357600086828151811061159357611593613d98565b60200260200101516001600160a01b031663e312bcc76040518163ffffffff1660e01b8152600401600060405180830381865afa1580156115d8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526116009190810190613dae565b805190915060005b818110156116555782818151811061162257611622613d98565b602002602001015188888060010199508151811061164257611642613d98565b6020908102919091010152600101611608565b505050806001019050611577565b50505050919050565b600060018251116116ca5760405162461bcd60e51b815260206004820152602260248201527f776f6e742067656e657261746520726f6f7420666f722073696e676c65206c6560448201526130b360f11b6064820152608401610938565b6001825111156116e4576116dd82612920565b91506116ca565b816000815181106116f7576116f7613d98565b60200260200101519050919050565b600081815b8451811015611741576117378286838151811061172a5761172a613d98565b6020026020010151612351565b915060010161170b565b509093149392505050565b600061176561176036889003880188613ebb565b612a86565b60006117a38d8d80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611a7a92505050565b905060006117b08261166c565b6040516339b4546760e11b8152600481018290529091507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690637368a8ce906024016020604051808303816000875af115801561181a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061183e9190613f83565b6040516301ffc9a760e01b815263152a902d60e11b60048201529093506001600160a01b038816906301ffc9a790602401602060405180830381865afa15801561188c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118b09190613fa0565b156118f0576001600160a01b03838116600090815260056020908152604080832080546001600160a01b031916948c169490941790935560069052208690555b6001600160a01b038316600090815260076020526040902088906119148282613ffc565b50506040516323b872dd60e01b81523360048201526001600160a01b038481166024830152604482018890528816906323b872dd90606401600060405180830381600087803b15801561196657600080fd5b505af115801561197a573d6000803e3d6000fd5b505050506119a183308a60c001602081019061199691906141ca565b61ffff168888612d2a565b826001600160a01b03167f52365e9ef2d02ef2b8eb0ee7b91a0809adf17e90a5418ed54c7c137fe66aaa908f8f6040516119dc9291906141e7565b60405180910390a2866001600160a01b0316836001600160a01b03167f4a08e09eb1f4b221a4d4faff944c52d3bb85486dd0f7e647977d35b406e16e43888b604051611a2992919061422a565b60405180910390a350509b9a5050505050505050505050565b60086020528160005260406000208181548110611a5e57600080fd5b6000918252602090912001546001600160a01b03169150829050565b805160609060009081611a8d8583612880565b9050806001600160401b03811115611aa757611aa761347f565b604051908082528060200260200182016040528015611ad0578160200160208202803683370190505b50935060005b82811015611663576000868281518110611af257611af2613d98565b60200260200101516001600160a01b031663ad2b30376040518163ffffffff1660e01b8152600401600060405180830381865afa158015611b37573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611b5f919081019061435b565b805190915060005b81811015611bb457828181518110611b8157611b81613d98565b6020026020010151888880600101995081518110611ba157611ba1613d98565b6020908102919091010152600101611b67565b505050806001019050611ad6565b60606000611bce612162565b8051909150806001600160401b03811115611beb57611beb61347f565b604051908082528060200260200182016040528015611c14578160200160208202803683370190505b50925060005b81811015611c8757828181518110611c3457611c34613d98565b6020026020010151604051602001611c4c91906143e0565b60405160208183030381529060405280519060200120848281518110611c7457611c74613d98565b6020908102919091010152600101611c1a565b50505090565b6001600160a01b038216600090815260076020526040812090611caf84612465565b9050611cbc828285612e17565b6001600160a01b038416600081815260086020908152604080832080546001810182559084528284200180546001600160a01b03191633908117909155938352600282528083209383529290529081208054349290611d1c908490613c33565b90915550506001600160a01b03841660009081526004602090815260408083203384529091528120805461ffff86169290611d58908490613c33565b90915550506040805161ffff851681526020810183905233916001600160a01b038716917fae93fedd66ff9e5925955058cd4f5eaa983abd5d5237e1d04fd0a02022561ef6910160405180910390a350505050565b60606001835111611e0c5760405162461bcd60e51b815260206004820152602360248201527f776f6e742067656e65726174652070726f6f6620666f722073696e676c65206c60448201526232b0b360e91b6064820152608401610938565b6000611e1884516108d4565b90506000816001600160401b03811115611e3457611e3461347f565b604051908082528060200260200182016040528015611e5d578160200160208202803683370190505b5090506000805b600187511115611f455760028606600103611eb957866001870381518110611e8e57611e8e613d98565b6020026020010151838381518110611ea857611ea8613d98565b602002602001018181525050611f29565b86518660010103611eed576000801b838381518110611eda57611eda613d98565b6020908102919091010152600101611f29565b868660010181518110611f0257611f02613d98565b6020026020010151838381518110611f1c57611f1c613d98565b6020026020010181815250505b600190910190600286049550611f3e87612920565b9650611e64565b6000611f518286613bdb565b6001600160401b03811115611f6857611f6861347f565b604051908082528060200260200182016040528015611f91578160200160208202803683370190505b50955060005b85811015612010576000801b858281518110611fb557611fb5613d98565b60200260200101511461200157848181518110611fd457611fd4613d98565b60200260200101518783830381518110611ff057611ff0613d98565b602002602001018181525050612008565b8160010191505b600101611f97565b50505050505092915050565b6001600160a01b038083166000818152600760209081526040808320815161014081018352815463ffffffff8082168352600160201b808304909116838701526001600160401b03600160401b830416838601526001600160801b03600160801b92839004811660608501526001850154808216608086015292909204821660a08401908152600285015461ffff80821660c08701526201000082041660e086015291909104821661010084015260039093015488166101208301529585526004845282852096881685529590925282205490519193928492612100929116613bf2565b6001600160a01b038087166000818152600360209081526040808320948a1680845294825280832054938352600282528083209483529390529190912054919250908261214d8383613bdb565b6121579190613bdb565b979650505050505050565b6040805160028082526060828101909352816020015b60408051606081018252600080825260208083018290529282015282526000199092019101816121785790505090506121af612f41565b6000815181106121c1576121c1613d98565b6020026020010151816000815181106121dc576121dc613d98565b60200260200101819052506040518060600160405280306001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020016318c4eeed60e01b6001600160e01b0319168152508160018151811061225857612258613d98565b602002602001018190525090565b6001546001600160a01b031633146122b95760405162461bcd60e51b8152602060048201526016602482015275262822209d102737ba103332b2903932b1b2b4bb32b960511b6044820152606401610938565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03811660009081526008602090815260409182902080548351818402810184019094528084526060939283018282801561234557602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612327575b50505050509050919050565b60008261235f57508061150b565b8161236b57508161150b565b81831482841017156123805782600052816020525b818311156123915781600052826020525b50604060002092915050565b606060006123a9612162565b8051909150806001600160401b038111156123c6576123c661347f565b6040519080825280602002602001820160405280156123f957816020015b60608152602001906001900390816123e45790505b50925060005b81811015611c875782818151811061241957612419613d98565b602002602001015160405160200161243191906143e0565b60405160208183030381529060405284828151811061245257612452613d98565b60209081029190910101526001016123ff565b6001600160a01b038082166000908152600760209081526040808320815161014081018352815463ffffffff808216808452600160201b808404909216968401969096526001600160401b03600160401b8304169483018590526001600160801b03600160801b92839004811660608501526001850154808216608086015292909204821660a0840152600284015461ffff80821660c08601526201000082041660e0850152041661010082015260039091015490941661012085015291929183916125319042613bdb565b61253b9190613bf2565b905081606001516001600160801b0316811161256f578082606001516001600160801b031661256a9190613bdb565b612572565b60005b925081608001516001600160801b0316831161259b5781608001516001600160801b031661259d565b825b949350505050565b60006125b0826126d7565b8061150b575060c082015160e083015161ffff91821691161461150b565b6001600160a01b0380851660008181526002602090815260408083209488168084529482528083205493835260038252808320948352939052919091205461261f846001600160801b038516613bf2565b6126299190613c33565b6126339082613bdb565b905080156126d0576001600160a01b03808616600090815260036020908152604080832093881683529290529081208054839290612672908490613c33565b9091555061268290508482612706565b836001600160a01b0316856001600160a01b03167fec1e5ed733e00f1a00915d56caef57b4f52312dde4f9b3165f213319a0da156b836040516126c791815260200190565b60405180910390a35b5050505050565b6000816020015163ffffffff164211801561150b57508160c0015161ffff168260e0015161ffff161092915050565b6127108282612fe6565b61281e577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561276f57600080fd5b505af1158015612783573d6000803e3d6000fd5b505060405163a9059cbb60e01b81526001600160a01b038681166004830152602482018690527f000000000000000000000000000000000000000000000000000000000000000016935063a9059cbb925060440190506020604051808303816000875af11580156127f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061281c9190613fa0565b505b5050565b600061283682514263ffffffff9091161190565b1561284357506000919050565b61284c82613047565b1561285957506001919050565b60c082015160e083015161ffff91821691160361287857506002919050565b506003919050565b6000805b828110156129195783818151811061289e5761289e613d98565b60200260200101516001600160a01b031663ad2b30376040518163ffffffff1660e01b8152600401600060405180830381865afa1580156128e3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261290b919081019061435b565b519190910190600101612884565b5092915050565b8051606090600180821690036129c957600181811c016001600160401b0381111561294d5761294d61347f565b604051908082528060200260200182016040528015612976578160200160208202803683370190505b5091506129a283600183038151811061299157612991613d98565b60200260200101516000801b612351565b826001845103815181106129b8576129b8613d98565b602002602001018181525050612a12565b600181901c6001600160401b038111156129e5576129e561347f565b604051908082528060200260200182016040528015612a0e578160200160208202803683370190505b5091505b6000805b60018303811015612a7e57612a53858281518110612a3657612a36613d98565b602002602001015186836001018151811061172a5761172a613d98565b848381518110612a6557612a65613d98565b6020908102919091010152600190910190600201612a16565b505050919050565b805163ffffffff42811691161015612ad55760405162461bcd60e51b81526020600482015260126024820152714c5044413a20496e76616c69642074696d6560701b6044820152606401610938565b806020015163ffffffff16816000015163ffffffff1610612b2d5760405162461bcd60e51b81526020600482015260126024820152714c5044413a20496e76616c69642074696d6560701b6044820152606401610938565b600081604001516001600160401b031611612b7f5760405162461bcd60e51b815260206004820152601260248201527104c5044413a20496e76616c69642064726f760741b6044820152606401610938565b80608001516001600160801b031681606001516001600160801b031611612bde5760405162461bcd60e51b81526020600482015260136024820152724c5044413a20496e76616c696420707269636560681b6044820152606401610938565b60a08101516001600160801b031615612c315760405162461bcd60e51b8152602060048201526015602482015274131411104e88125b9d985b1a59081b5a5b88189a59605a1b6044820152606401610938565b60008160c0015161ffff1611612c805760405162461bcd60e51b81526020600482015260146024820152734c5044413a20496e76616c696420737570706c7960601b6044820152606401610938565b60e081015161ffff1615612ccb5760405162461bcd60e51b8152602060048201526012602482015271131411104e88125b9d985b1a59081cdbdb1960721b6044820152606401610938565b6101008101516001600160801b031615612d275760405162461bcd60e51b815260206004820152601c60248201527f4c5044413a20496e76616c69642063757261746f72436c61696d6564000000006044820152606401610938565b50565b6040516001600160a01b03851660248201526044810184905260009060640160408051601f198184030181529181526020820180516001600160e01b03166340c10f1960e01b1790525163601b8af360e01b81529091506001600160a01b0387169063601b8af390612dc6907f000000000000000000000000000000000000000000000000000000000000000090859088908890600401613c76565b6000604051808303816000875af1158015612de5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612e0d9190810190613d4b565b5050505050505050565b6040805161014081018252845463ffffffff8082168352600160201b80830490911660208401526001600160401b03600160401b830416938301939093526001600160801b03600160801b91829004811660608401526001870154808216608085015291909104811660a0830152600286015461ffff80821660c08501526201000082041660e08401529290920490911661010082015260038401546001600160a01b0316610120820152612ecd908383613089565b60028381018054839290612eec90849062010000900461ffff166143ee565b82546101009290920a61ffff81810219909316918316021790915560028501548082166201000090910490911603905061281c576001830180546001600160801b03808516600160801b029116179055505050565b604080516001808252818301909252606091816020015b6040805160608101825260008082526020808301829052928201528252600019909201910181612f58575050604080516060810182523081526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001660208201526340c10f1960e01b91810191909152815191925090829060009061225857612258613d98565b6000826001600160a01b03168261753090604051600060405180830381858888f193505050503d8060008114613038576040519150601f19603f3d011682016040523d82523d6000602084013e61303d565b606091505b5090949350505050565b805160009063ffffffff16421180156130695750816020015163ffffffff1642105b801561150b57508160c0015161ffff168260e0015161ffff161092915050565b61309761ffff821683613bac565b6001600160801b03163410156130ef5760405162461bcd60e51b815260206004820152601860248201527f4c5044413a20496e73756666696369656e742076616c756500000000000000006044820152606401610938565b8260c0015161ffff166000036131475760405162461bcd60e51b815260206004820152601a60248201527f4c5044413a2041756374696f6e20646f65736e742065786973740000000000006044820152606401610938565b8061ffff166131558461323d565b10156131a35760405162461bcd60e51b815260206004820152601a60248201527f4c5044413a204e6f7420656e6f7567682072656d61696e696e670000000000006044820152606401610938565b6131ac83613047565b6131e95760405162461bcd60e51b815260206004820152600e60248201526d4c5044413a204e6f74204c69766560901b6044820152606401610938565b60008161ffff161161281c5760405162461bcd60e51b815260206004820152601c60248201527f4c5044413a204d757374206269642061746c65617374203120726165000000006044820152606401610938565b60008160e001518260c00151613253919061440b565b61ffff1692915050565b60006020828403121561326f57600080fd5b5035919050565b6001600160a01b0381168114612d2757600080fd5b803561329681613276565b919050565b600080604083850312156132ae57600080fd5b82356132b981613276565b915060208301356132c981613276565b809150509250929050565b60008083601f8401126132e657600080fd5b5081356001600160401b038111156132fd57600080fd5b60208301915083602082850101111561331557600080fd5b9250929050565b60008060008060006080868803121561333457600080fd5b853561333f81613276565b9450602086013561334f81613276565b93506040860135925060608601356001600160401b0381111561337157600080fd5b61337d888289016132d4565b969995985093965092949392505050565b6000602082840312156133a057600080fd5b81356133ab81613276565b9392505050565b60008083601f8401126133c457600080fd5b5081356001600160401b038111156133db57600080fd5b6020830191508360208260051b850101111561331557600080fd5b60008060008060006080868803121561340e57600080fd5b853561341981613276565b9450602086013561342981613276565b93506040860135925060608601356001600160401b0381111561344b57600080fd5b61337d888289016133b2565b602081016004831061347957634e487b7160e01b600052602160045260246000fd5b91905290565b634e487b7160e01b600052604160045260246000fd5b60405161014081016001600160401b03811182821017156134b8576134b861347f565b60405290565b604051601f8201601f191681016001600160401b03811182821017156134e6576134e661347f565b604052919050565b60006001600160401b038211156135075761350761347f565b5060051b60200190565b6000602080838503121561352457600080fd5b82356001600160401b0381111561353a57600080fd5b8301601f8101851361354b57600080fd5b803561355e613559826134ee565b6134be565b81815260059190911b8201830190838101908783111561357d57600080fd5b928401925b8284101561215757833561359581613276565b82529284019290840190613582565b60005b838110156135bf5781810151838201526020016135a7565b838111156135ce576000848401525b50505050565b600081518084526135ec8160208601602086016135a4565b601f01601f19169290920160200192915050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561365557603f198886030184526136438583516135d4565b94509285019290850190600101613627565b5092979650505050505050565b600082601f83011261367357600080fd5b81356020613683613559836134ee565b82815260059290921b840181019181810190868411156136a257600080fd5b8286015b848110156136bd57803583529183019183016136a6565b509695505050505050565b6000602082840312156136da57600080fd5b81356001600160401b038111156136f057600080fd5b61259d84828501613662565b60008060006060848603121561371157600080fd5b8335925060208401356001600160401b0381111561372e57600080fd5b61373a86828701613662565b925050604084013590509250925092565b6000610140828403121561375e57600080fd5b50919050565b60008060008060008060008060008060006102008c8e03121561378657600080fd5b6001600160401b03808d35111561379c57600080fd5b6137a98e8e358f016133b2565b909c509a5060208d01358110156137bf57600080fd5b6137cf8e60208f01358f016133b2565b909a50985060408d01358110156137e557600080fd5b6137f58e60408f01358f016133b2565b90985096506138078e60608f0161374b565b95506138166101a08e0161328b565b94506101c08d01359350806101e08e0135111561383257600080fd5b506138448d6101e08e01358e016133b2565b81935080925050509295989b509295989b9093969950565b6000806040838503121561386f57600080fd5b823561387a81613276565b946020939093013593505050565b6020808252825182820181905260009190848201906040850190845b818110156138c0578351835292840192918401916001016138a4565b50909695505050505050565b61ffff81168114612d2757600080fd5b8035613296816138cc565b600080604083850312156138fa57600080fd5b823561390581613276565b915060208301356132c9816138cc565b6000806040838503121561392857600080fd5b82356001600160401b0381111561393e57600080fd5b61394a85828601613662565b95602094909401359450505050565b60008060008060008060008060a0898b03121561397557600080fd5b883561398081613276565b9750602089013561399081613276565b965060408901356001600160401b03808211156139ac57600080fd5b6139b88c838d016133b2565b909850965060608b01359150808211156139d157600080fd5b6139dd8c838d016133b2565b909650945060808b01359150808211156139f657600080fd5b50613a038b828c016132d4565b999c989b5096995094979396929594505050565b80516001600160a01b039081168352602080830151909116908301526040908101516001600160e01b031916910152565b6020808252825182820181905260009190848201906040850190845b818110156138c057613a77838551613a17565b9284019260609290920191600101613a64565b6020808252825182820181905260009190848201906040850190845b818110156138c05783516001600160a01b031683529284019291840191600101613aa6565b60008060408385031215613ade57600080fd5b50508035926020909101359150565b60008060008060008060a08789031215613b0657600080fd5b8635613b1181613276565b95506020870135613b2181613276565b9450604087013593506060870135925060808701356001600160401b03811115613b4a57600080fd5b613b5689828a016132d4565b979a9699509497509295939492505050565b60008060408385031215613b7b57600080fd5b8251613b8681613276565b6020939093015192949293505050565b634e487b7160e01b600052601160045260246000fd5b60006001600160801b0380831681851681830481118215151615613bd257613bd2613b96565b02949350505050565b600082821015613bed57613bed613b96565b500390565b6000816000190483118215151615613c0c57613c0c613b96565b500290565b600082613c2e57634e487b7160e01b600052601260045260246000fd5b500490565b60008219821115613c4657613c46613b96565b500190565b60006001600160801b03808316818516808303821115613c6d57613c6d613b96565b01949350505050565b6001600160a01b0385168152606060208201819052600090613c9a908301866135d4565b82810360408401528381526001600160fb1b03841115613cb957600080fd5b8360051b80866020840137600091016020019081529695505050505050565b8051801515811461329657600080fd5b600082601f830112613cf957600080fd5b81516001600160401b03811115613d1257613d1261347f565b613d25601f8201601f19166020016134be565b818152846020838601011115613d3a57600080fd5b61259d8260208301602087016135a4565b60008060408385031215613d5e57600080fd5b613d6783613cd8565b915060208301516001600160401b03811115613d8257600080fd5b613d8e85828601613ce8565b9150509250929050565b634e487b7160e01b600052603260045260246000fd5b60006020808385031215613dc157600080fd5b82516001600160401b0380821115613dd857600080fd5b818501915085601f830112613dec57600080fd5b8151613dfa613559826134ee565b81815260059190911b83018401908481019088831115613e1957600080fd5b8585015b83811015613e5157805185811115613e355760008081fd5b613e438b89838a0101613ce8565b845250918601918601613e1d565b5098975050505050505050565b63ffffffff81168114612d2757600080fd5b803561329681613e5e565b6001600160401b0381168114612d2757600080fd5b803561329681613e7b565b6001600160801b0381168114612d2757600080fd5b803561329681613e9b565b60006101408284031215613ece57600080fd5b613ed6613495565b613edf83613e70565b8152613eed60208401613e70565b6020820152613efe60408401613e90565b6040820152613f0f60608401613eb0565b6060820152613f2060808401613eb0565b6080820152613f3160a08401613eb0565b60a0820152613f4260c084016138dc565b60c0820152613f5360e084016138dc565b60e0820152610100613f66818501613eb0565b90820152610120613f7884820161328b565b908201529392505050565b600060208284031215613f9557600080fd5b81516133ab81613276565b600060208284031215613fb257600080fd5b6133ab82613cd8565b6000813561150b81613e5e565b6000813561150b81613e7b565b6000813561150b81613e9b565b6000813561150b816138cc565b6000813561150b81613276565b813561400781613e5e565b63ffffffff811663ffffffff198354161782555061404c61402a60208401613fbb565b825467ffffffff00000000191660209190911b67ffffffff0000000016178255565b61408d61405b60408401613fc8565b82546fffffffffffffffff0000000000000000191660409190911b6fffffffffffffffff000000000000000016178255565b6140bc61409c60608401613fd5565b82546001600160801b031660809190911b6001600160801b031916178255565b600181016140ec6140cf60808501613fd5565b82546001600160801b0319166001600160801b0391909116178255565b6140fb61409c60a08501613fd5565b506002810161412261410f60c08501613fe2565b825461ffff191661ffff91909116178255565b61414b61413160e08501613fe2565b825463ffff0000191660109190911b63ffff000016178255565b61419561415b6101008501613fd5565b825473ffffffffffffffffffffffffffffffff00000000191660209190911b73ffffffffffffffffffffffffffffffff0000000016178255565b5061281e6141a66101208401613fef565b6003830180546001600160a01b0319166001600160a01b0392909216919091179055565b6000602082840312156141dc57600080fd5b81356133ab816138cc565b60208082528181018390526000908460408401835b868110156136bd57823561420f81613276565b6001600160a01b0316825291830191908301906001016141fc565b828152610160810161424c6020830161424285613e70565b63ffffffff169052565b61425860208401613e70565b63ffffffff811660408401525061427160408401613e90565b6001600160401b03811660608401525061428d60608401613eb0565b6001600160801b0381166080840152506142a960808401613eb0565b6001600160801b03811660a0840152506142c560a08401613eb0565b6001600160801b03811660c0840152506142e160c084016138dc565b61ffff811660e0840152506142f860e084016138dc565b61010061430a8185018361ffff169052565b614315818601613eb0565b91505061012061432f818501836001600160801b03169052565b61433a81860161328b565b9150506143536101408401826001600160a01b03169052565b509392505050565b6000602080838503121561436e57600080fd5b82516001600160401b0381111561438457600080fd5b8301601f8101851361439557600080fd5b80516143a3613559826134ee565b81815260059190911b820183019083810190878311156143c257600080fd5b928401925b82841015612157578351825292840192908401906143c7565b6060810161150b8284613a17565b600061ffff808316818516808303821115613c6d57613c6d613b96565b600061ffff8381169083168181101561442657614426613b96565b03939250505056fea2646970667358221220ff987becb65315d04ce1f645c1ee341ae3402f8d676ad9e0c2b0be3fddb22c5064736f6c634300080d003300000000000000000000000014f2a9c262cb47c5475f3cf16f735da0d1e91e330000000000000000000000001604c61812b5851c440217d170ad1e5c5ad7290d000000000000000000000000cea98aec09ad1c41470fd041f10b2d2391aea186000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000e626d419dd60be8038c46381ad171a0b3d22ed25
Deployed Bytecode
0x60806040526004361061020f5760003560e01c8063884c05fb11610118578063bc197c81116100a0578063cf1675ef1161006f578063cf1675ef14610825578063dd1d259914610852578063e312bcc714610872578063e9833c2f14610887578063f23a6e61146108a757600080fd5b8063bc197c8114610794578063bc38d61f146107c3578063c3a07df6146107e3578063c69bebe41461080557600080fd5b8063ad2b3037116100e7578063ad2b303714610716578063b3f006741461072b578063b739e31b1461074b578063b86161951461075e578063bc063e1a1461077e57600080fd5b8063884c05fb1461055f5780638a4068dd1461058c5780639fd58ae5146105c0578063ac84e879146105f857600080fd5b80632d5d43171161019b5780635b68b04d1161016a5780635b68b04d1461047d57806364e76fe91461049d57806368ecbaa5146104bd5780637b103999146104f357806380e7a8451461052757600080fd5b80632d5d4317146103c85780632e08d602146103f557806343c686ae1461041557806358161a421461044d57600080fd5b8063150b7a02116101e2578063150b7a02146102e95780632189230f1461032e57806326469c7d1461035b5780632b5c58061461037b5780632cfcad831461039b57600080fd5b8063040141e514610214578063047fc9aa1461026557806308d7090a146102995780631284b0d3146102c7575b600080fd5b34801561022057600080fd5b506102487f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561027157600080fd5b506102487f0000000000000000000000001604c61812b5851c440217d170ad1e5c5ad7290d81565b3480156102a557600080fd5b506102b96102b436600461325d565b6108d4565b60405190815260200161025c565b3480156102d357600080fd5b506102e76102e236600461329b565b6108fd565b005b3480156102f557600080fd5b5061031561030436600461331c565b630a85bd0160e11b95945050505050565b6040516001600160e01b0319909116815260200161025c565b34801561033a57600080fd5b506102b961034936600461338e565b60066020526000908152604090205481565b34801561036757600080fd5b506102e761037636600461338e565b610c91565b34801561038757600080fd5b506102e76103963660046133f6565b61117c565b3480156103a757600080fd5b506103bb6103b636600461338e565b611441565b60405161025c9190613457565b3480156103d457600080fd5b506103e86103e3366004613511565b611511565b60405161025c9190613600565b34801561040157600080fd5b506102b96104103660046136c8565b61166c565b34801561042157600080fd5b506102b961043036600461329b565b600360209081526000928352604080842090915290825290205481565b34801561045957600080fd5b5061046d6104683660046136fc565b611706565b604051901515815260200161025c565b34801561048957600080fd5b50610248610498366004613764565b61174c565b3480156104a957600080fd5b506102486104b836600461385c565b611a42565b3480156104c957600080fd5b506102486104d836600461338e565b6005602052600090815260409020546001600160a01b031681565b3480156104ff57600080fd5b506102487f00000000000000000000000014f2a9c262cb47c5475f3cf16f735da0d1e91e3381565b34801561053357600080fd5b506102b961054236600461329b565b600260209081526000928352604080842090915290825290205481565b34801561056b57600080fd5b5061057f61057a366004613511565b611a7a565b60405161025c9190613888565b34801561059857600080fd5b506102487f000000000000000000000000cea98aec09ad1c41470fd041f10b2d2391aea18681565b3480156105cc57600080fd5b506102b96105db36600461329b565b600460209081526000928352604080842090915290825290205481565b34801561060457600080fd5b5061069b61061336600461338e565b600760205260009081526040902080546001820154600283015460039093015463ffffffff80841694600160201b808604909216946001600160401b03600160401b820416946001600160801b03600160801b92839004811695828216959390920481169361ffff80821694620100008304909116939104909116906001600160a01b03168a565b6040805163ffffffff9b8c1681529a90991660208b01526001600160401b03909716978901979097526001600160801b039485166060890152928416608088015290831660a087015261ffff90811660c08701521660e08501529091166101008301526001600160a01b03166101208201526101400161025c565b34801561072257600080fd5b5061057f611bc2565b34801561073757600080fd5b50600154610248906001600160a01b031681565b6102e76107593660046138e7565b611c8d565b34801561076a57600080fd5b5061057f610779366004613915565b611dad565b34801561078a57600080fd5b506102b96104e281565b3480156107a057600080fd5b506103156107af366004613959565b63bc197c8160e01b98975050505050505050565b3480156107cf57600080fd5b506102b96107de36600461329b565b61201c565b3480156107ef57600080fd5b506107f8612162565b60405161025c9190613a48565b34801561081157600080fd5b506102e761082036600461338e565b612266565b34801561083157600080fd5b5061084561084036600461338e565b6122db565b60405161025c9190613a8a565b34801561085e57600080fd5b506102b961086d366004613acb565b612351565b34801561087e57600080fd5b506103e861239d565b34801561089357600080fd5b506102b96108a236600461338e565b612465565b3480156108b357600080fd5b506103156108c2366004613aed565b63f23a6e6160e01b9695505050505050565b60008119600101821682145b82156108f657600192831c9291909101906108e0565b9003919050565b6000546001146109415760405162461bcd60e51b815260206004820152600a6024820152695245454e5452414e435960b01b60448201526064015b60405180910390fd5b600260008181556001600160a01b03808516825260076020908152604092839020835161014081018552815463ffffffff8082168352600160201b808304909116948301949094526001600160401b03600160401b820416958201959095526001600160801b03600160801b95869004811660608301526001830154808216608084015295909504851660a08201529481015461ffff80821660c08801526201000082041660e08701529190910490921661010084015260039091015416610120820152610a0e816125a5565b610a535760405162461bcd60e51b8152602060048201526016602482015275262822209d1020bab1ba34b7b7102727aa1037bb32b960511b6044820152606401610938565b6001600160a01b0383811660009081526004602090815260408083209386168352929052908120805491905560c082015160e083015161ffff918216911603610c22576040516310b467bd60e21b81526001600160a01b03858116600483015260009182917f00000000000000000000000014f2a9c262cb47c5475f3cf16f735da0d1e91e3316906342d19ef4906024016040805180830381865afa158015610b00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b249190613b68565b604051637921219560e11b81523060048201526001600160a01b038881166024830152604482018390526064820187905260a06084830152600060a48301529294509092509083169063f242432a9060c401600060405180830381600087803b158015610b9057600080fd5b505af1158015610ba4573d6000803e3d6000fd5b50505050610bb88686858760a001516125ce565b846001600160a01b0316866001600160a01b03167f26edd63ecb990f043d4fcce6a3e407be52646e19b3bb19afa6e2840b8d803644858760a00151604051610c139291909182526001600160801b0316602082015260400190565b60405180910390a35050610c86565b610c2b826126d7565b15610c4557610c408484838560a001516125ce565b610c86565b60405162461bcd60e51b8152602060048201526016602482015275262822209d1020bab1ba34b7b7102727aa1037bb32b960511b6044820152606401610938565b505060016000555050565b600054600114610cd05760405162461bcd60e51b815260206004820152600a6024820152695245454e5452414e435960b01b6044820152606401610938565b600260008181556001600160a01b03838116825260076020908152604092839020835161014081018552815463ffffffff8082168352600160201b808304909116948301949094526001600160401b03600160401b820416958201959095526001600160801b03600160801b95869004811660608301526001830154808216608084015295909504851660a08201529481015461ffff80821660c0880181905262010000830490911660e08801819052939091049094166101008601526003810154909216610120909401939093529114610de25760405162461bcd60e51b8152602060048201526012602482015271131411104e88139bdd081cdbdb19081bdd5d60721b6044820152606401610938565b6002810154600160201b90046001600160801b031615610e445760405162461bcd60e51b815260206004820152601d60248201527f4c5044413a2043757261746f7220616c726561647920636c61696d65640000006044820152606401610938565b60028101546001820154600091610e76916201000090910461ffff1690600160801b90046001600160801b0316613bac565b600283015460018401546001600160801b039283169350600092610ea59262010000900461ffff169116613bac565b6001600160801b031690506104e28115610f23576000610ec58385613bdb565b9050655af3107a4000610ed9846005613bf2565b610eeb83670de0b6b3a7640000613bf2565b610ef59190613c11565b610eff9190613c11565b610f0a9060fa613c33565b91506104e28211610f1b5781610f1f565b6104e25b9150505b6000612710610f328584613bf2565b610f3c9190613c11565b9050838560020160048282829054906101000a90046001600160801b0316610f649190613c4b565b82546001600160801b039182166101009390930a9283029190920219909116179055506001600160a01b0380871660009081526005602090815260408083205460069092528220549216919080831561102b5760405163152a902d60e11b815260048101849052602481018990526001600160a01b03851690632a55205a906044016040805180830381865afa158015611002573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110269190613b68565b61102f565b6000805b9150915061103d8282612706565b816001600160a01b03168a6001600160a01b03167fbdf0502df1b76d58521b2a929580ca100c2121e0ae38717b260d9cfa44c23b328360405161108291815260200190565b60405180910390a36001546110a0906001600160a01b031686612706565b6001546040518681526001600160a01b03918216918c16907f4b39748ccad2b4ef6bcad79fe10f80215c9c855e0c1db6cf61bb7277a128e5039060200160405180910390a36003890154611111906001600160a01b031682611102888c613bdb565b61110c9190613bdb565b612706565b60038901546001600160a01b03908116908b167f7788f04afc4c336e7e8f6b6da2faf726900122643d0942085e63e643bf03d83e83611150898d613bdb565b61115a9190613bdb565b60405190815260200160405180910390a3505060016000555050505050505050565b6001600160a01b03808616600090815260076020908152604091829020825161014081018452815463ffffffff8082168352600160201b808304909116948301949094526001600160401b03600160401b820416948201949094526001600160801b03600160801b94859004811660608301526001830154808216608084015294909404841660a0820152600282015461ffff80821660c08401526201000082041660e083015292909204909216610100820152600390910154909116610120820152611248816126d7565b6112945760405162461bcd60e51b815260206004820152601c60248201527f4c5044413a2041756374696f6e204e4f54205375636365737366756c000000006044820152606401610938565b8061012001516001600160a01b0316336001600160a01b0316146112ee5760405162461bcd60e51b8152602060048201526011602482015270262822209d102737ba1031bab930ba37b960791b6044820152606401610938565b6040516001600160a01b038087166024830152871660448201523360648201526084810185905260009060a40160408051601f198184030181529181526020820180516001600160e01b03166318c4eeed60e01b1790525163601b8af360e01b81529091506001600160a01b0388169063601b8af390611398907f000000000000000000000000cea98aec09ad1c41470fd041f10b2d2391aea18690859089908990600401613c76565b6000604051808303816000875af11580156113b7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526113df9190810190613d4b565b5050856001600160a01b0316336001600160a01b0316886001600160a01b03167fa46f01ffe5ddc1a516c5bd9e5d58a2ffcc4f36029cd4068c6a1d5019509f628b8860405161143091815260200190565b60405180910390a450505050505050565b6001600160a01b038082166000908152600760209081526040808320815161014081018352815463ffffffff8082168352600160201b808304909116958301959095526001600160401b03600160401b820416938201939093526001600160801b03600160801b93849004811660608301526001830154808216608084015293909304831660a0820152600282015461ffff80821660c08401526201000082041660e083015293909304909116610100830152600301549092166101208301529061150b90612822565b92915050565b8051606090600090816115248583612880565b9050806001600160401b0381111561153e5761153e61347f565b60405190808252806020026020018201604052801561157157816020015b606081526020019060019003908161155c5790505b50935060005b8281101561166357600086828151811061159357611593613d98565b60200260200101516001600160a01b031663e312bcc76040518163ffffffff1660e01b8152600401600060405180830381865afa1580156115d8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526116009190810190613dae565b805190915060005b818110156116555782818151811061162257611622613d98565b602002602001015188888060010199508151811061164257611642613d98565b6020908102919091010152600101611608565b505050806001019050611577565b50505050919050565b600060018251116116ca5760405162461bcd60e51b815260206004820152602260248201527f776f6e742067656e657261746520726f6f7420666f722073696e676c65206c6560448201526130b360f11b6064820152608401610938565b6001825111156116e4576116dd82612920565b91506116ca565b816000815181106116f7576116f7613d98565b60200260200101519050919050565b600081815b8451811015611741576117378286838151811061172a5761172a613d98565b6020026020010151612351565b915060010161170b565b509093149392505050565b600061176561176036889003880188613ebb565b612a86565b60006117a38d8d80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611a7a92505050565b905060006117b08261166c565b6040516339b4546760e11b8152600481018290529091507f00000000000000000000000014f2a9c262cb47c5475f3cf16f735da0d1e91e336001600160a01b031690637368a8ce906024016020604051808303816000875af115801561181a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061183e9190613f83565b6040516301ffc9a760e01b815263152a902d60e11b60048201529093506001600160a01b038816906301ffc9a790602401602060405180830381865afa15801561188c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118b09190613fa0565b156118f0576001600160a01b03838116600090815260056020908152604080832080546001600160a01b031916948c169490941790935560069052208690555b6001600160a01b038316600090815260076020526040902088906119148282613ffc565b50506040516323b872dd60e01b81523360048201526001600160a01b038481166024830152604482018890528816906323b872dd90606401600060405180830381600087803b15801561196657600080fd5b505af115801561197a573d6000803e3d6000fd5b505050506119a183308a60c001602081019061199691906141ca565b61ffff168888612d2a565b826001600160a01b03167f52365e9ef2d02ef2b8eb0ee7b91a0809adf17e90a5418ed54c7c137fe66aaa908f8f6040516119dc9291906141e7565b60405180910390a2866001600160a01b0316836001600160a01b03167f4a08e09eb1f4b221a4d4faff944c52d3bb85486dd0f7e647977d35b406e16e43888b604051611a2992919061422a565b60405180910390a350509b9a5050505050505050505050565b60086020528160005260406000208181548110611a5e57600080fd5b6000918252602090912001546001600160a01b03169150829050565b805160609060009081611a8d8583612880565b9050806001600160401b03811115611aa757611aa761347f565b604051908082528060200260200182016040528015611ad0578160200160208202803683370190505b50935060005b82811015611663576000868281518110611af257611af2613d98565b60200260200101516001600160a01b031663ad2b30376040518163ffffffff1660e01b8152600401600060405180830381865afa158015611b37573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611b5f919081019061435b565b805190915060005b81811015611bb457828181518110611b8157611b81613d98565b6020026020010151888880600101995081518110611ba157611ba1613d98565b6020908102919091010152600101611b67565b505050806001019050611ad6565b60606000611bce612162565b8051909150806001600160401b03811115611beb57611beb61347f565b604051908082528060200260200182016040528015611c14578160200160208202803683370190505b50925060005b81811015611c8757828181518110611c3457611c34613d98565b6020026020010151604051602001611c4c91906143e0565b60405160208183030381529060405280519060200120848281518110611c7457611c74613d98565b6020908102919091010152600101611c1a565b50505090565b6001600160a01b038216600090815260076020526040812090611caf84612465565b9050611cbc828285612e17565b6001600160a01b038416600081815260086020908152604080832080546001810182559084528284200180546001600160a01b03191633908117909155938352600282528083209383529290529081208054349290611d1c908490613c33565b90915550506001600160a01b03841660009081526004602090815260408083203384529091528120805461ffff86169290611d58908490613c33565b90915550506040805161ffff851681526020810183905233916001600160a01b038716917fae93fedd66ff9e5925955058cd4f5eaa983abd5d5237e1d04fd0a02022561ef6910160405180910390a350505050565b60606001835111611e0c5760405162461bcd60e51b815260206004820152602360248201527f776f6e742067656e65726174652070726f6f6620666f722073696e676c65206c60448201526232b0b360e91b6064820152608401610938565b6000611e1884516108d4565b90506000816001600160401b03811115611e3457611e3461347f565b604051908082528060200260200182016040528015611e5d578160200160208202803683370190505b5090506000805b600187511115611f455760028606600103611eb957866001870381518110611e8e57611e8e613d98565b6020026020010151838381518110611ea857611ea8613d98565b602002602001018181525050611f29565b86518660010103611eed576000801b838381518110611eda57611eda613d98565b6020908102919091010152600101611f29565b868660010181518110611f0257611f02613d98565b6020026020010151838381518110611f1c57611f1c613d98565b6020026020010181815250505b600190910190600286049550611f3e87612920565b9650611e64565b6000611f518286613bdb565b6001600160401b03811115611f6857611f6861347f565b604051908082528060200260200182016040528015611f91578160200160208202803683370190505b50955060005b85811015612010576000801b858281518110611fb557611fb5613d98565b60200260200101511461200157848181518110611fd457611fd4613d98565b60200260200101518783830381518110611ff057611ff0613d98565b602002602001018181525050612008565b8160010191505b600101611f97565b50505050505092915050565b6001600160a01b038083166000818152600760209081526040808320815161014081018352815463ffffffff8082168352600160201b808304909116838701526001600160401b03600160401b830416838601526001600160801b03600160801b92839004811660608501526001850154808216608086015292909204821660a08401908152600285015461ffff80821660c08701526201000082041660e086015291909104821661010084015260039093015488166101208301529585526004845282852096881685529590925282205490519193928492612100929116613bf2565b6001600160a01b038087166000818152600360209081526040808320948a1680845294825280832054938352600282528083209483529390529190912054919250908261214d8383613bdb565b6121579190613bdb565b979650505050505050565b6040805160028082526060828101909352816020015b60408051606081018252600080825260208083018290529282015282526000199092019101816121785790505090506121af612f41565b6000815181106121c1576121c1613d98565b6020026020010151816000815181106121dc576121dc613d98565b60200260200101819052506040518060600160405280306001600160a01b031681526020017f000000000000000000000000cea98aec09ad1c41470fd041f10b2d2391aea1866001600160a01b031681526020016318c4eeed60e01b6001600160e01b0319168152508160018151811061225857612258613d98565b602002602001018190525090565b6001546001600160a01b031633146122b95760405162461bcd60e51b8152602060048201526016602482015275262822209d102737ba103332b2903932b1b2b4bb32b960511b6044820152606401610938565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03811660009081526008602090815260409182902080548351818402810184019094528084526060939283018282801561234557602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612327575b50505050509050919050565b60008261235f57508061150b565b8161236b57508161150b565b81831482841017156123805782600052816020525b818311156123915781600052826020525b50604060002092915050565b606060006123a9612162565b8051909150806001600160401b038111156123c6576123c661347f565b6040519080825280602002602001820160405280156123f957816020015b60608152602001906001900390816123e45790505b50925060005b81811015611c875782818151811061241957612419613d98565b602002602001015160405160200161243191906143e0565b60405160208183030381529060405284828151811061245257612452613d98565b60209081029190910101526001016123ff565b6001600160a01b038082166000908152600760209081526040808320815161014081018352815463ffffffff808216808452600160201b808404909216968401969096526001600160401b03600160401b8304169483018590526001600160801b03600160801b92839004811660608501526001850154808216608086015292909204821660a0840152600284015461ffff80821660c08601526201000082041660e0850152041661010082015260039091015490941661012085015291929183916125319042613bdb565b61253b9190613bf2565b905081606001516001600160801b0316811161256f578082606001516001600160801b031661256a9190613bdb565b612572565b60005b925081608001516001600160801b0316831161259b5781608001516001600160801b031661259d565b825b949350505050565b60006125b0826126d7565b8061150b575060c082015160e083015161ffff91821691161461150b565b6001600160a01b0380851660008181526002602090815260408083209488168084529482528083205493835260038252808320948352939052919091205461261f846001600160801b038516613bf2565b6126299190613c33565b6126339082613bdb565b905080156126d0576001600160a01b03808616600090815260036020908152604080832093881683529290529081208054839290612672908490613c33565b9091555061268290508482612706565b836001600160a01b0316856001600160a01b03167fec1e5ed733e00f1a00915d56caef57b4f52312dde4f9b3165f213319a0da156b836040516126c791815260200190565b60405180910390a35b5050505050565b6000816020015163ffffffff164211801561150b57508160c0015161ffff168260e0015161ffff161092915050565b6127108282612fe6565b61281e577f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561276f57600080fd5b505af1158015612783573d6000803e3d6000fd5b505060405163a9059cbb60e01b81526001600160a01b038681166004830152602482018690527f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216935063a9059cbb925060440190506020604051808303816000875af11580156127f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061281c9190613fa0565b505b5050565b600061283682514263ffffffff9091161190565b1561284357506000919050565b61284c82613047565b1561285957506001919050565b60c082015160e083015161ffff91821691160361287857506002919050565b506003919050565b6000805b828110156129195783818151811061289e5761289e613d98565b60200260200101516001600160a01b031663ad2b30376040518163ffffffff1660e01b8152600401600060405180830381865afa1580156128e3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261290b919081019061435b565b519190910190600101612884565b5092915050565b8051606090600180821690036129c957600181811c016001600160401b0381111561294d5761294d61347f565b604051908082528060200260200182016040528015612976578160200160208202803683370190505b5091506129a283600183038151811061299157612991613d98565b60200260200101516000801b612351565b826001845103815181106129b8576129b8613d98565b602002602001018181525050612a12565b600181901c6001600160401b038111156129e5576129e561347f565b604051908082528060200260200182016040528015612a0e578160200160208202803683370190505b5091505b6000805b60018303811015612a7e57612a53858281518110612a3657612a36613d98565b602002602001015186836001018151811061172a5761172a613d98565b848381518110612a6557612a65613d98565b6020908102919091010152600190910190600201612a16565b505050919050565b805163ffffffff42811691161015612ad55760405162461bcd60e51b81526020600482015260126024820152714c5044413a20496e76616c69642074696d6560701b6044820152606401610938565b806020015163ffffffff16816000015163ffffffff1610612b2d5760405162461bcd60e51b81526020600482015260126024820152714c5044413a20496e76616c69642074696d6560701b6044820152606401610938565b600081604001516001600160401b031611612b7f5760405162461bcd60e51b815260206004820152601260248201527104c5044413a20496e76616c69642064726f760741b6044820152606401610938565b80608001516001600160801b031681606001516001600160801b031611612bde5760405162461bcd60e51b81526020600482015260136024820152724c5044413a20496e76616c696420707269636560681b6044820152606401610938565b60a08101516001600160801b031615612c315760405162461bcd60e51b8152602060048201526015602482015274131411104e88125b9d985b1a59081b5a5b88189a59605a1b6044820152606401610938565b60008160c0015161ffff1611612c805760405162461bcd60e51b81526020600482015260146024820152734c5044413a20496e76616c696420737570706c7960601b6044820152606401610938565b60e081015161ffff1615612ccb5760405162461bcd60e51b8152602060048201526012602482015271131411104e88125b9d985b1a59081cdbdb1960721b6044820152606401610938565b6101008101516001600160801b031615612d275760405162461bcd60e51b815260206004820152601c60248201527f4c5044413a20496e76616c69642063757261746f72436c61696d6564000000006044820152606401610938565b50565b6040516001600160a01b03851660248201526044810184905260009060640160408051601f198184030181529181526020820180516001600160e01b03166340c10f1960e01b1790525163601b8af360e01b81529091506001600160a01b0387169063601b8af390612dc6907f0000000000000000000000001604c61812b5851c440217d170ad1e5c5ad7290d90859088908890600401613c76565b6000604051808303816000875af1158015612de5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612e0d9190810190613d4b565b5050505050505050565b6040805161014081018252845463ffffffff8082168352600160201b80830490911660208401526001600160401b03600160401b830416938301939093526001600160801b03600160801b91829004811660608401526001870154808216608085015291909104811660a0830152600286015461ffff80821660c08501526201000082041660e08401529290920490911661010082015260038401546001600160a01b0316610120820152612ecd908383613089565b60028381018054839290612eec90849062010000900461ffff166143ee565b82546101009290920a61ffff81810219909316918316021790915560028501548082166201000090910490911603905061281c576001830180546001600160801b03808516600160801b029116179055505050565b604080516001808252818301909252606091816020015b6040805160608101825260008082526020808301829052928201528252600019909201910181612f58575050604080516060810182523081526001600160a01b037f0000000000000000000000001604c61812b5851c440217d170ad1e5c5ad7290d1660208201526340c10f1960e01b91810191909152815191925090829060009061225857612258613d98565b6000826001600160a01b03168261753090604051600060405180830381858888f193505050503d8060008114613038576040519150601f19603f3d011682016040523d82523d6000602084013e61303d565b606091505b5090949350505050565b805160009063ffffffff16421180156130695750816020015163ffffffff1642105b801561150b57508160c0015161ffff168260e0015161ffff161092915050565b61309761ffff821683613bac565b6001600160801b03163410156130ef5760405162461bcd60e51b815260206004820152601860248201527f4c5044413a20496e73756666696369656e742076616c756500000000000000006044820152606401610938565b8260c0015161ffff166000036131475760405162461bcd60e51b815260206004820152601a60248201527f4c5044413a2041756374696f6e20646f65736e742065786973740000000000006044820152606401610938565b8061ffff166131558461323d565b10156131a35760405162461bcd60e51b815260206004820152601a60248201527f4c5044413a204e6f7420656e6f7567682072656d61696e696e670000000000006044820152606401610938565b6131ac83613047565b6131e95760405162461bcd60e51b815260206004820152600e60248201526d4c5044413a204e6f74204c69766560901b6044820152606401610938565b60008161ffff161161281c5760405162461bcd60e51b815260206004820152601c60248201527f4c5044413a204d757374206269642061746c65617374203120726165000000006044820152606401610938565b60008160e001518260c00151613253919061440b565b61ffff1692915050565b60006020828403121561326f57600080fd5b5035919050565b6001600160a01b0381168114612d2757600080fd5b803561329681613276565b919050565b600080604083850312156132ae57600080fd5b82356132b981613276565b915060208301356132c981613276565b809150509250929050565b60008083601f8401126132e657600080fd5b5081356001600160401b038111156132fd57600080fd5b60208301915083602082850101111561331557600080fd5b9250929050565b60008060008060006080868803121561333457600080fd5b853561333f81613276565b9450602086013561334f81613276565b93506040860135925060608601356001600160401b0381111561337157600080fd5b61337d888289016132d4565b969995985093965092949392505050565b6000602082840312156133a057600080fd5b81356133ab81613276565b9392505050565b60008083601f8401126133c457600080fd5b5081356001600160401b038111156133db57600080fd5b6020830191508360208260051b850101111561331557600080fd5b60008060008060006080868803121561340e57600080fd5b853561341981613276565b9450602086013561342981613276565b93506040860135925060608601356001600160401b0381111561344b57600080fd5b61337d888289016133b2565b602081016004831061347957634e487b7160e01b600052602160045260246000fd5b91905290565b634e487b7160e01b600052604160045260246000fd5b60405161014081016001600160401b03811182821017156134b8576134b861347f565b60405290565b604051601f8201601f191681016001600160401b03811182821017156134e6576134e661347f565b604052919050565b60006001600160401b038211156135075761350761347f565b5060051b60200190565b6000602080838503121561352457600080fd5b82356001600160401b0381111561353a57600080fd5b8301601f8101851361354b57600080fd5b803561355e613559826134ee565b6134be565b81815260059190911b8201830190838101908783111561357d57600080fd5b928401925b8284101561215757833561359581613276565b82529284019290840190613582565b60005b838110156135bf5781810151838201526020016135a7565b838111156135ce576000848401525b50505050565b600081518084526135ec8160208601602086016135a4565b601f01601f19169290920160200192915050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561365557603f198886030184526136438583516135d4565b94509285019290850190600101613627565b5092979650505050505050565b600082601f83011261367357600080fd5b81356020613683613559836134ee565b82815260059290921b840181019181810190868411156136a257600080fd5b8286015b848110156136bd57803583529183019183016136a6565b509695505050505050565b6000602082840312156136da57600080fd5b81356001600160401b038111156136f057600080fd5b61259d84828501613662565b60008060006060848603121561371157600080fd5b8335925060208401356001600160401b0381111561372e57600080fd5b61373a86828701613662565b925050604084013590509250925092565b6000610140828403121561375e57600080fd5b50919050565b60008060008060008060008060008060006102008c8e03121561378657600080fd5b6001600160401b03808d35111561379c57600080fd5b6137a98e8e358f016133b2565b909c509a5060208d01358110156137bf57600080fd5b6137cf8e60208f01358f016133b2565b909a50985060408d01358110156137e557600080fd5b6137f58e60408f01358f016133b2565b90985096506138078e60608f0161374b565b95506138166101a08e0161328b565b94506101c08d01359350806101e08e0135111561383257600080fd5b506138448d6101e08e01358e016133b2565b81935080925050509295989b509295989b9093969950565b6000806040838503121561386f57600080fd5b823561387a81613276565b946020939093013593505050565b6020808252825182820181905260009190848201906040850190845b818110156138c0578351835292840192918401916001016138a4565b50909695505050505050565b61ffff81168114612d2757600080fd5b8035613296816138cc565b600080604083850312156138fa57600080fd5b823561390581613276565b915060208301356132c9816138cc565b6000806040838503121561392857600080fd5b82356001600160401b0381111561393e57600080fd5b61394a85828601613662565b95602094909401359450505050565b60008060008060008060008060a0898b03121561397557600080fd5b883561398081613276565b9750602089013561399081613276565b965060408901356001600160401b03808211156139ac57600080fd5b6139b88c838d016133b2565b909850965060608b01359150808211156139d157600080fd5b6139dd8c838d016133b2565b909650945060808b01359150808211156139f657600080fd5b50613a038b828c016132d4565b999c989b5096995094979396929594505050565b80516001600160a01b039081168352602080830151909116908301526040908101516001600160e01b031916910152565b6020808252825182820181905260009190848201906040850190845b818110156138c057613a77838551613a17565b9284019260609290920191600101613a64565b6020808252825182820181905260009190848201906040850190845b818110156138c05783516001600160a01b031683529284019291840191600101613aa6565b60008060408385031215613ade57600080fd5b50508035926020909101359150565b60008060008060008060a08789031215613b0657600080fd5b8635613b1181613276565b95506020870135613b2181613276565b9450604087013593506060870135925060808701356001600160401b03811115613b4a57600080fd5b613b5689828a016132d4565b979a9699509497509295939492505050565b60008060408385031215613b7b57600080fd5b8251613b8681613276565b6020939093015192949293505050565b634e487b7160e01b600052601160045260246000fd5b60006001600160801b0380831681851681830481118215151615613bd257613bd2613b96565b02949350505050565b600082821015613bed57613bed613b96565b500390565b6000816000190483118215151615613c0c57613c0c613b96565b500290565b600082613c2e57634e487b7160e01b600052601260045260246000fd5b500490565b60008219821115613c4657613c46613b96565b500190565b60006001600160801b03808316818516808303821115613c6d57613c6d613b96565b01949350505050565b6001600160a01b0385168152606060208201819052600090613c9a908301866135d4565b82810360408401528381526001600160fb1b03841115613cb957600080fd5b8360051b80866020840137600091016020019081529695505050505050565b8051801515811461329657600080fd5b600082601f830112613cf957600080fd5b81516001600160401b03811115613d1257613d1261347f565b613d25601f8201601f19166020016134be565b818152846020838601011115613d3a57600080fd5b61259d8260208301602087016135a4565b60008060408385031215613d5e57600080fd5b613d6783613cd8565b915060208301516001600160401b03811115613d8257600080fd5b613d8e85828601613ce8565b9150509250929050565b634e487b7160e01b600052603260045260246000fd5b60006020808385031215613dc157600080fd5b82516001600160401b0380821115613dd857600080fd5b818501915085601f830112613dec57600080fd5b8151613dfa613559826134ee565b81815260059190911b83018401908481019088831115613e1957600080fd5b8585015b83811015613e5157805185811115613e355760008081fd5b613e438b89838a0101613ce8565b845250918601918601613e1d565b5098975050505050505050565b63ffffffff81168114612d2757600080fd5b803561329681613e5e565b6001600160401b0381168114612d2757600080fd5b803561329681613e7b565b6001600160801b0381168114612d2757600080fd5b803561329681613e9b565b60006101408284031215613ece57600080fd5b613ed6613495565b613edf83613e70565b8152613eed60208401613e70565b6020820152613efe60408401613e90565b6040820152613f0f60608401613eb0565b6060820152613f2060808401613eb0565b6080820152613f3160a08401613eb0565b60a0820152613f4260c084016138dc565b60c0820152613f5360e084016138dc565b60e0820152610100613f66818501613eb0565b90820152610120613f7884820161328b565b908201529392505050565b600060208284031215613f9557600080fd5b81516133ab81613276565b600060208284031215613fb257600080fd5b6133ab82613cd8565b6000813561150b81613e5e565b6000813561150b81613e7b565b6000813561150b81613e9b565b6000813561150b816138cc565b6000813561150b81613276565b813561400781613e5e565b63ffffffff811663ffffffff198354161782555061404c61402a60208401613fbb565b825467ffffffff00000000191660209190911b67ffffffff0000000016178255565b61408d61405b60408401613fc8565b82546fffffffffffffffff0000000000000000191660409190911b6fffffffffffffffff000000000000000016178255565b6140bc61409c60608401613fd5565b82546001600160801b031660809190911b6001600160801b031916178255565b600181016140ec6140cf60808501613fd5565b82546001600160801b0319166001600160801b0391909116178255565b6140fb61409c60a08501613fd5565b506002810161412261410f60c08501613fe2565b825461ffff191661ffff91909116178255565b61414b61413160e08501613fe2565b825463ffff0000191660109190911b63ffff000016178255565b61419561415b6101008501613fd5565b825473ffffffffffffffffffffffffffffffff00000000191660209190911b73ffffffffffffffffffffffffffffffff0000000016178255565b5061281e6141a66101208401613fef565b6003830180546001600160a01b0319166001600160a01b0392909216919091179055565b6000602082840312156141dc57600080fd5b81356133ab816138cc565b60208082528181018390526000908460408401835b868110156136bd57823561420f81613276565b6001600160a01b0316825291830191908301906001016141fc565b828152610160810161424c6020830161424285613e70565b63ffffffff169052565b61425860208401613e70565b63ffffffff811660408401525061427160408401613e90565b6001600160401b03811660608401525061428d60608401613eb0565b6001600160801b0381166080840152506142a960808401613eb0565b6001600160801b03811660a0840152506142c560a08401613eb0565b6001600160801b03811660c0840152506142e160c084016138dc565b61ffff811660e0840152506142f860e084016138dc565b61010061430a8185018361ffff169052565b614315818601613eb0565b91505061012061432f818501836001600160801b03169052565b61433a81860161328b565b9150506143536101408401826001600160a01b03169052565b509392505050565b6000602080838503121561436e57600080fd5b82516001600160401b0381111561438457600080fd5b8301601f8101851361439557600080fd5b80516143a3613559826134ee565b81815260059190911b820183019083810190878311156143c257600080fd5b928401925b82841015612157578351825292840192908401906143c7565b6060810161150b8284613a17565b600061ffff808316818516808303821115613c6d57613c6d613b96565b600061ffff8381169083168181101561442657614426613b96565b03939250505056fea2646970667358221220ff987becb65315d04ce1f645c1ee341ae3402f8d676ad9e0c2b0be3fddb22c5064736f6c634300080d0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000014f2a9c262cb47c5475f3cf16f735da0d1e91e330000000000000000000000001604c61812b5851c440217d170ad1e5c5ad7290d000000000000000000000000cea98aec09ad1c41470fd041f10b2d2391aea186000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000e626d419dd60be8038c46381ad171a0b3d22ed25
-----Decoded View---------------
Arg [0] : _registry (address): 0x14f2A9c262cb47c5475F3cF16F735dA0D1e91E33
Arg [1] : _supply (address): 0x1604c61812b5851c440217d170aD1e5C5ad7290d
Arg [2] : _transfer (address): 0xCeA98aeC09aD1c41470FD041F10B2d2391aEa186
Arg [3] : _weth (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
Arg [4] : _feeReceiver (address): 0xE626d419Dd60BE8038C46381ad171A0b3d22ed25
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 00000000000000000000000014f2a9c262cb47c5475f3cf16f735da0d1e91e33
Arg [1] : 0000000000000000000000001604c61812b5851c440217d170ad1e5c5ad7290d
Arg [2] : 000000000000000000000000cea98aec09ad1c41470fd041f10b2d2391aea186
Arg [3] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [4] : 000000000000000000000000e626d419dd60be8038c46381ad171a0b3d22ed25
Deployed Bytecode Sourcemap
65936:9933:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40764:45;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;311:32:1;;;293:51;;281:2;266:18;40764:45:0;;;;;;;;59344:31;;;;;;;;;;;;;;;12473:1399;;;;;;;;;;-1:-1:-1;12473:1399:0;;;;;:::i;:::-;;:::i;:::-;;;894:25:1;;;882:2;867:18;12473:1399:0;748:177:1;69554:835:0;;;;;;;;;;-1:-1:-1;69554:835:0;;;;;:::i;:::-;;:::i;:::-;;58016:226;;;;;;;;;;-1:-1:-1;58016:226:0;;;;;:::i;:::-;-1:-1:-1;;;58016:226:0;;;;;;;;;;;-1:-1:-1;;;;;;2871:33:1;;;2853:52;;2841:2;2826:18;58016:226:0;2709:202:1;66991:54:0;;;;;;;;;;-1:-1:-1;66991:54:0;;;;;:::i;:::-;;;;;;;;;;;;;;70521:1362;;;;;;;;;;-1:-1:-1;70521:1362:0;;;;;:::i;:::-;;:::i;72222:681::-;;;;;;;;;;-1:-1:-1;72222:681:0;;;;;:::i;:::-;;:::i;74017:138::-;;;;;;;;;;-1:-1:-1;74017:138:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;15264:749::-;;;;;;;;;;-1:-1:-1;15264:749:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;8836:265::-;;;;;;;;;;-1:-1:-1;8836:265:0;;;;;:::i;:::-;;:::i;66636:70::-;;;;;;;;;;-1:-1:-1;66636:70:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;8215:471;;;;;;;;;;-1:-1:-1;8215:471:0;;;;;:::i;:::-;;:::i;:::-;;;9688:14:1;;9681:22;9663:41;;9651:2;9636:18;8215:471:0;9523:187:1;67746:979:0;;;;;;;;;;-1:-1:-1;67746:979:0;;;;;:::i;:::-;;:::i;67229:53::-;;;;;;;;;;-1:-1:-1;67229:53:0;;;;;:::i;:::-;;:::i;66889:52::-;;;;;;;;;;-1:-1:-1;66889:52:0;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;66889:52:0;;;66113:33;;;;;;;;;;;;;;;66492:73;;;;;;;;;;-1:-1:-1;66492:73:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;14234:739;;;;;;;;;;-1:-1:-1;14234:739:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;66206:33::-;;;;;;;;;;;;;;;66778:64;;;;;;;;;;-1:-1:-1;66778:64:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;67107:49;;;;;;;;;;-1:-1:-1;67107:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;67107:49:0;;;;;;;-1:-1:-1;;;;;;;;67107:49:0;;;;-1:-1:-1;;;;;;;;67107:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;67107:49:0;;;;;;;13305:10:1;13342:15;;;13324:34;;13394:15;;;;13389:2;13374:18;;13367:43;-1:-1:-1;;;;;13446:31:1;;;13426:18;;;13419:59;;;;-1:-1:-1;;;;;13567:15:1;;;13562:2;13547:18;;13540:43;13620:15;;;13614:3;13599:19;;13592:44;13673:15;;;13667:3;13652:19;;13645:44;13708:6;13751:15;;;13745:3;13730:19;;13723:44;13804:15;13798:3;13783:19;;13776:44;13857:15;;;13851:3;13836:19;;13829:44;-1:-1:-1;;;;;13910:32:1;13904:3;13889:19;;13882:61;13282:3;13267:19;67107:49:0;12906:1043:1;4796:388:0;;;;;;;;;;;;;:::i;66310:26::-;;;;;;;;;;-1:-1:-1;66310:26:0;;;;-1:-1:-1;;;;;66310:26:0;;;68889:470;;;;;;:::i;:::-;;:::i;9325:1773::-;;;;;;;;;;-1:-1:-1;9325:1773:0;;;;;:::i;:::-;;:::i;66387:38::-;;;;;;;;;;;;66421:4;66387:38;;58642:279;;;;;;;;;;-1:-1:-1;58642:279:0;;;;;:::i;:::-;-1:-1:-1;;;58642:279:0;;;;;;;;;;;74394:405;;;;;;;;;;-1:-1:-1;74394:405:0;;;;;:::i;:::-;;:::i;75027:362::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;73007:168::-;;;;;;;;;;-1:-1:-1;73007:168:0;;;;;:::i;:::-;;:::i;73746:125::-;;;;;;;;;;-1:-1:-1;73746:125:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;7181:789::-;;;;;;;;;;-1:-1:-1;7181:789:0;;;;;:::i;:::-;;:::i;5405:381::-;;;;;;;;;;;;;:::i;73367:371::-;;;;;;;;;;-1:-1:-1;73367:371:0;;;;;:::i;:::-;;:::i;58318:247::-;;;;;;;;;;-1:-1:-1;58318:247:0;;;;;:::i;:::-;-1:-1:-1;;;58318:247:0;;;;;;;;;12473:1399;12529:12;13552:6;;13560:1;13548:14;13544:22;;13541:29;;13746:81;13753:5;;13746:81;;13785:1;13779:7;;;;13805:6;;;;;13746:81;;;13841:12;;;12473:1399;-1:-1:-1;12473:1399:0:o;69554:835::-;61074:6;;61084:1;61074:11;61066:34;;;;-1:-1:-1;;;61066:34:0;;19322:2:1;61066:34:0;;;19304:21:1;19361:2;19341:18;;;19334:30;-1:-1:-1;;;19380:18:1;;;19373:40;19430:18;;61066:34:0;;;;;;;;;61122:1;61113:6;:10;;;-1:-1:-1;;;;;69666:21:0;;::::1;::::0;;:13:::1;:21;::::0;;;;;;;;69643:44;;::::1;::::0;::::1;::::0;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;69643:44:0;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;-1:-1:-1;;;;;;;;69643:44:0;::::1;;::::0;;;;;;;-1:-1:-1;;;;;;;;69643:44:0;;;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;;;::::1;::::0;;;;;;;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;;;::::1;;::::0;;;;;;;::::1;::::0;;::::1;;::::0;;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;69706:13:::1;69643:44:::0;69706:11:::1;:13::i;:::-;69698:48;;;::::0;-1:-1:-1;;;69698:48:0;;19661:2:1;69698:48:0::1;::::0;::::1;19643:21:1::0;19700:2;19680:18;;;19673:30;-1:-1:-1;;;19719:18:1;;;19712:52;19781:18;;69698:48:0::1;19459:346:1::0;69698:48:0::1;-1:-1:-1::0;;;;;69774:17:0;;::::1;69757:14;69774:17:::0;;;:9:::1;:17;::::0;;;;;;;:26;;::::1;::::0;;;;;;;;;;69811:33;;;21762:12;;;;21745:13;;;;:29;;;;;;;69855:527:::1;;69925:45;::::0;-1:-1:-1;;;69925:45:0;;-1:-1:-1;;;;;311:32:1;;;69925:45:0::1;::::0;::::1;293:51:1::0;69896:13:0::1;::::0;;;69940:8:::1;69925:37;::::0;::::1;::::0;266:18:1;;69925:45:0::1;::::0;::::1;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;69985:72;::::0;-1:-1:-1;;;69985:72:0;;70026:4:::1;69985:72;::::0;::::1;20460:34:1::0;-1:-1:-1;;;;;20530:15:1;;;20510:18;;;20503:43;20562:18;;;20555:34;;;20605:18;;;20598:34;;;20440:3;20648:19;;;20641:32;-1:-1:-1;20689:19:1;;;20682:30;69895:75:0;;-1:-1:-1;69895:75:0;;-1:-1:-1;69985:32:0;;::::1;::::0;::::1;::::0;20729:19:1;;69985:72:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;70072:52;70087:6;70095:7;70104:6;70112:4;:11;;;70072:14;:52::i;:::-;70163:7;-1:-1:-1::0;;;;;70144:48:0::1;70155:6;-1:-1:-1::0;;;;;70144:48:0::1;;70172:6;70180:4;:11;;;70144:48;;;;;;20933:25:1::0;;;-1:-1:-1;;;;;20994:47:1;20989:2;20974:18;;20967:75;20921:2;20906:18;;20759:289;70144:48:0::1;;;;;;;;69880:324;;69855:527;;;70214:22;:4;:20;:22::i;:::-;70210:172;;;70253:52;70268:6;70276:7;70285:6;70293:4;:11;;;70253:14;:52::i;:::-;70210:172;;;70338:32;::::0;-1:-1:-1;;;70338:32:0;;19661:2:1;70338:32:0::1;::::0;::::1;19643:21:1::0;19700:2;19680:18;;;19673:30;-1:-1:-1;;;19719:18:1;;;19712:52;19781:18;;70338:32:0::1;19459:346:1::0;70210:172:0::1;-1:-1:-1::0;;61159:1:0;61150:6;:10;-1:-1:-1;;69554:835:0:o;70521:1362::-;61074:6;;61084:1;61074:11;61066:34;;;;-1:-1:-1;;;61066:34:0;;19322:2:1;61066:34:0;;;19304:21:1;19361:2;19341:18;;;19334:30;-1:-1:-1;;;19380:18:1;;;19373:40;19430:18;;61066:34:0;19120:334:1;61066:34:0;61122:1;61113:6;:10;;;-1:-1:-1;;;;;70617:21:0;;::::1;::::0;;:13:::1;:21;::::0;;;;;;;;70657:17;;::::1;::::0;::::1;::::0;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;70657:17:0;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;-1:-1:-1;;;;;;;;70657:17:0;::::1;;::::0;;;;;;;-1:-1:-1;;;;;;;;70657:17:0;;;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;;;::::1;::::0;;;;;;;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;;;;;::::1;::::0;;::::1;::::0;;;;;;;;;::::1;::::0;;::::1;;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;;;;;;70617:21;21745:29;70649:50:::1;;;::::0;-1:-1:-1;;;70649:50:0;;21255:2:1;70649:50:0::1;::::0;::::1;21237:21:1::0;21294:2;21274:18;;;21267:30;-1:-1:-1;;;21313:18:1;;;21306:48;21371:18;;70649:50:0::1;21053:342:1::0;70649:50:0::1;70718:19;::::0;::::1;::::0;-1:-1:-1;;;70718:19:0;::::1;-1:-1:-1::0;;;;;70718:19:0::1;:24:::0;70710:66:::1;;;::::0;-1:-1:-1;;;70710:66:0;;21602:2:1;70710:66:0::1;::::0;::::1;21584:21:1::0;21641:2;21621:18;;;21614:30;21680:31;21660:18;;;21653:59;21729:18;;70710:66:0::1;21400:353:1::0;70710:66:0::1;70817:12;::::0;::::1;::::0;70803:11:::1;::::0;::::1;::::0;70787:13:::1;::::0;70803:26:::1;::::0;70817:12;;;::::1;;;::::0;-1:-1:-1;;;70803:11:0;::::1;-1:-1:-1::0;;;;;70803:11:0::1;:26;:::i;:::-;70870:12;::::0;::::1;::::0;70854:13:::1;::::0;::::1;::::0;-1:-1:-1;;;;;70787:42:0;;::::1;::::0;-1:-1:-1;70840:11:0::1;::::0;70854:28:::1;::::0;70870:12;;::::1;;;::::0;70854:13:::1;:28;:::i;:::-;-1:-1:-1::0;;;;;70840:42:0::1;::::0;-1:-1:-1;66421:4:0::1;70936:8:::0;;70932:206:::1;;70961:12;70976:11;70984:3:::0;70976:5;:11:::1;:::i;:::-;70961:26:::0;-1:-1:-1;71044:4:0::1;71033:7;:3:::0;71039:1:::1;71033:7;:::i;:::-;71017:11;:4:::0;71024::::1;71017:11;:::i;:::-;71016:25;;;;:::i;:::-;:32;;;;:::i;:::-;71015:40;::::0;71052:3:::1;71015:40;:::i;:::-;71002:53;;66421:4;71083:10;:20;:43;;71116:10;71083:43;;;66421:4;71083:43;71070:56;;70946:192;70932:206;71148:11;71185:3;71163:18;71176:5:::0;71163:10;:18:::1;:::i;:::-;71162:26;;;;:::i;:::-;71148:40;;71230:5;71199:4;:19;;;:37;;;;;;;;;;-1:-1:-1::0;;;;;71199:37:0::1;;;;;:::i;:::-;::::0;;-1:-1:-1;;;;;71199:37:0;;::::1;;::::0;;;::::1;::::0;;::::1;::::0;;;::::1;;::::0;;::::1;;::::0;;-1:-1:-1;;;;;;71263:25:0;;::::1;-1:-1:-1::0;71263:25:0;;;:17:::1;:25;::::0;;;;;;;;71312:19:::1;:27:::0;;;;;;71263:25;::::1;::::0;71312:27;-1:-1:-1;71401:19:0;;:104:::1;;71467:38;::::0;-1:-1:-1;;;71467:38:0;;::::1;::::0;::::1;23404:25:1::0;;;23445:18;;;23438:34;;;-1:-1:-1;;;;;71467:27:0;::::1;::::0;::::1;::::0;23377:18:1;;71467:38:0::1;::::0;::::1;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;71401:104;;;71445:1;71449::::0;71401:104:::1;71350:155;;;;71516:46;71531:15;71548:13;71516:14;:46::i;:::-;71598:15;-1:-1:-1::0;;;;;71578:51:0::1;71590:6;-1:-1:-1::0;;;;;71578:51:0::1;;71615:13;71578:51;;;;894:25:1::0;;882:2;867:18;;748:177;71578:51:0::1;;;;;;;;71655:11;::::0;71640:32:::1;::::0;-1:-1:-1;;;;;71655:11:0::1;71668:3:::0;71640:14:::1;:32::i;:::-;71709:11;::::0;71688:38:::1;::::0;894:25:1;;;-1:-1:-1;;;;;71709:11:0;;::::1;::::0;71688:38;::::1;::::0;::::1;::::0;882:2:1;867:18;71688:38:0::1;;;;;;;71752:12;::::0;::::1;::::0;71737:57:::1;::::0;-1:-1:-1;;;;;71752:12:0::1;71780:13:::0;71766:11:::1;71774:3:::0;71766:5;:11:::1;:::i;:::-;:27;;;;:::i;:::-;71737:14;:57::i;:::-;71833:12;::::0;::::1;::::0;-1:-1:-1;;;;;71833:12:0;;::::1;::::0;71810:65;::::1;;71861:13:::0;71847:11:::1;71855:3:::0;71847:5;:11:::1;:::i;:::-;:27;;;;:::i;:::-;71810:65;::::0;894:25:1;;;882:2;867:18;71810:65:0::1;;;;;;;-1:-1:-1::0;;61159:1:0;61150:6;:10;-1:-1:-1;;;;;;;;70521:1362:0:o;72222:681::-;-1:-1:-1;;;;;72425:21:0;;;72402:20;72425:21;;;:13;:21;;;;;;;;;72402:44;;;;;;;;;;;;;;;-1:-1:-1;;;72402:44:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;72402:44:0;;;;;;;;;;-1:-1:-1;;;;;;;;72402:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72465:22;72402:44;72465:20;:22::i;:::-;72457:63;;;;-1:-1:-1;;;72457:63:0;;23685:2:1;72457:63:0;;;23667:21:1;23724:2;23704:18;;;23697:30;23763;23743:18;;;23736:58;23811:18;;72457:63:0;23483:352:1;72457:63:0;72553:4;:12;;;-1:-1:-1;;;;;72539:26:0;:10;-1:-1:-1;;;;;72539:26:0;;72531:56;;;;-1:-1:-1;;;72531:56:0;;24042:2:1;72531:56:0;;;24024:21:1;24081:2;24061:18;;;24054:30;-1:-1:-1;;;24100:18:1;;;24093:47;24157:18;;72531:56:0;23840:341:1;72531:56:0;72620:121;;-1:-1:-1;;;;;24473:15:1;;;72620:121:0;;;24455:34:1;24525:15;;24505:18;;;24498:43;72709:10:0;24557:18:1;;;24550:43;24609:18;;;24602:34;;;72600:17:0;;24389:19:1;;72620:121:0;;;-1:-1:-1;;72620:121:0;;;;;;;;;;;;;;-1:-1:-1;;;;;72620:121:0;-1:-1:-1;;;72620:121:0;;;72752:69;-1:-1:-1;;;72752:69:0;;72620:121;;-1:-1:-1;;;;;;72752:31:0;;;;;:69;;72784:8;;72620:121;;72800:20;;;;72752:69;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;72752:69:0;;;;;;;;;;;;:::i;:::-;;;72878:6;-1:-1:-1;;;;;72839:56:0;72866:10;-1:-1:-1;;;;;72839:56:0;72858:6;-1:-1:-1;;;;;72839:56:0;;72886:8;72839:56;;;;894:25:1;;882:2;867:18;;748:177;72839:56:0;;;;;;;;72391:512;;72222:681;;;;;:::o;74017:138::-;-1:-1:-1;;;;;74108:21:0;;;74079:9;74108:21;;;:13;:21;;;;;;;;:37;;;;;;;;;;;;;;;-1:-1:-1;;;74108:37:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;74108:37:0;;;;;;;;;;-1:-1:-1;;;;;;;;74108:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74079:9;74108:39;;:37;:39::i;:::-;74101:46;74017:138;-1:-1:-1;;74017:138:0:o;15264:749::-;15462:15;;15375:19;;15412:15;;;15507:37;15462:8;:15;15507:12;:37::i;:::-;15488:56;;15574:8;-1:-1:-1;;;;;15562:21:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15555:28;;15679:9;15674:321;15694:13;15690:1;:17;15674:321;;;15733:21;15765:8;15774:1;15765:11;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;15757:38:0;;:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;15757:40:0;;;;;;;;;;;;:::i;:::-;15839:13;;15733:64;;-1:-1:-1;15816:20:0;15871:109;15891:12;15887:1;:16;15871:109;;;15951:6;15958:1;15951:9;;;;;;;;:::i;:::-;;;;;;;15933:4;15938:9;;;;;;15933:15;;;;;;;;:::i;:::-;;;;;;;;;;:27;15905:3;;15871:109;;;;15714:281;;15709:3;;;;;15674:321;;;;15401:612;;;15264:749;;;:::o;8836:265::-;8898:7;8941:1;8926:5;:12;:16;8918:63;;;;-1:-1:-1;;;8918:63:0;;27949:2:1;8918:63:0;;;27931:21:1;27988:2;27968:18;;;27961:30;28027:34;28007:18;;;28000:62;-1:-1:-1;;;28078:18:1;;;28071:32;28120:19;;8918:63:0;27747:398:1;8918:63:0;9014:1;8999:5;:12;:16;8992:76;;;9040:16;9050:5;9040:9;:16::i;:::-;9032:24;;8992:76;;;9085:5;9091:1;9085:8;;;;;;;;:::i;:::-;;;;;;;9078:15;;8836:265;;;:::o;8215:471::-;8354:4;8451:13;8354:4;8500:130;8524:6;:13;8520:1;:17;8500:130;;;8577:37;8591:11;8604:6;8611:1;8604:9;;;;;;;;:::i;:::-;;;;;;;8577:13;:37::i;:::-;8563:51;-1:-1:-1;8539:3:0;;8500:130;;;-1:-1:-1;8658:20:0;;;;8215:471;-1:-1:-1;;;8215:471:0:o;67746:979::-;68032:13;68058:31;:29;;;;;;;:9;:29;:::i;:::-;;:31::i;:::-;68100:26;68129:28;68148:8;;68129:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;68129:18:0;;-1:-1:-1;;;68129:28:0:i;:::-;68100:57;;68168:18;68189;68197:9;68189:7;:18::i;:::-;68226:43;;-1:-1:-1;;;68226:43:0;;;;;894:25:1;;;68168:39:0;;-1:-1:-1;68241:8:0;-1:-1:-1;;;;;68226:31:0;;;;867:18:1;;68226:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;68284:61;;-1:-1:-1;;;68284:61:0;;-1:-1:-1;;;68284:61:0;;;2853:52:1;68218:51:0;;-1:-1:-1;;;;;;68284:33:0;;;;;2826:18:1;;68284:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;68280:149;;;-1:-1:-1;;;;;68361:24:0;;;;;;;:17;:24;;;;;;;;:33;;-1:-1:-1;;;;;;68361:33:0;;;;;;;;;;;68396:19;:26;;;:32;;;68280:149;-1:-1:-1;;;;;68442:20:0;;;;;;:13;:20;;;;;68465:9;;68442:32;68465:9;68442:20;:32;:::i;:::-;-1:-1:-1;;68487:52:0;;-1:-1:-1;;;68487:52:0;;68516:10;68487:52;;;34710:34:1;-1:-1:-1;;;;;34780:15:1;;;34760:18;;;34753:43;34812:18;;;34805:34;;;68487:28:0;;;;;34645:18:1;;68487:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68550:61;68560:5;68575:4;68582:9;:16;;;;;;;;;;:::i;:::-;68550:61;;68600:10;;68550:9;:61::i;:::-;68643:5;-1:-1:-1;;;;;68629:30:0;;68650:8;;68629:30;;;;;;;:::i;:::-;;;;;;;;68694:6;-1:-1:-1;;;;;68675:42:0;68687:5;-1:-1:-1;;;;;68675:42:0;;68702:3;68707:9;68675:42;;;;;;;:::i;:::-;;;;;;;;68047:678;;67746:979;;;;;;;;;;;;;:::o;67229:53::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;67229:53:0;;-1:-1:-1;67229:53:0;;-1:-1:-1;67229:53:0:o;14234:739::-;14426:15;;14337:21;;14376:15;;;14471:37;14426:8;:15;14471:12;:37::i;:::-;14452:56;;14540:8;-1:-1:-1;;;;;14526:23:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14526:23:0;;14519:30;;14645:9;14640:315;14660:13;14656:1;:17;14640:315;;;14699:23;14733:8;14742:1;14733:11;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;14725:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;14725:32:0;;;;;;;;;;;;:::i;:::-;14799:13;;14699:58;;-1:-1:-1;14776:20:0;14831:109;14851:12;14847:1;:16;14831:109;;;14911:6;14918:1;14911:9;;;;;;;;:::i;:::-;;;;;;;14893:4;14898:9;;;;;;14893:15;;;;;;;;:::i;:::-;;;;;;;;;;:27;14865:3;;14831:109;;;;14680:275;;14675:3;;;;;14640:315;;4796:388;4840:23;4876:31;4910:16;:14;:16::i;:::-;4954:18;;4876:50;;-1:-1:-1;4954:18:0;-1:-1:-1;;;;;4992:21:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4992:21:0;;4983:30;;5054:9;5049:117;5069:6;5065:1;:10;5049:117;;;5134:11;5146:1;5134:14;;;;;;;;:::i;:::-;;;;;;;5123:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;5113:37;;;;;;5101:6;5108:1;5101:9;;;;;;;;:::i;:::-;;;;;;;;;;:49;5077:3;;5049:117;;;;4865:319;;4796:388;:::o;68889:470::-;-1:-1:-1;;;;;68991:21:0;;68967;68991;;;:13;:21;;;;;;69039:20;69005:6;69039:12;:20::i;:::-;69023:36;-1:-1:-1;69070:50:0;:4;69023:36;69112:7;69070:25;:50::i;:::-;-1:-1:-1;;;;;69133:24:0;;;;;;:16;:24;;;;;;;;:41;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;69133:41:0;69163:10;69133:41;;;;;;69185:26;;;:18;:26;;;;;:38;;;;;;;;;:51;;69227:9;;69133:24;69185:51;;69227:9;;69185:51;:::i;:::-;;;;-1:-1:-1;;;;;;;69247:17:0;;;;;;:9;:17;;;;;;;;69265:10;69247:29;;;;;;;:40;;;;;;:17;:40;;;;;:::i;:::-;;;;-1:-1:-1;;69305:46:0;;;38703:6:1;38691:19;;38673:38;;38742:2;38727:18;;38720:34;;;69324:10:0;;-1:-1:-1;;;;;69305:46:0;;;;;38646:18:1;69305:46:0;;;;;;;68956:403;;68889:470;;:::o;9325:1773::-;9430:22;9493:1;9478:5;:12;:16;9470:64;;;;-1:-1:-1;;;9470:64:0;;38967:2:1;9470:64:0;;;38949:21:1;39006:2;38986:18;;;38979:30;39045:34;39025:18;;;39018:62;-1:-1:-1;;;39096:18:1;;;39089:33;39139:19;;9470:64:0;38765:399:1;9470:64:0;9622:12;9637:28;9652:5;:12;9637:14;:28::i;:::-;9622:43;;9676:23;9716:4;-1:-1:-1;;;;;9702:19:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9702:19:0;;9676:45;;9732:11;9754:15;10086:502;10108:1;10093:5;:12;:16;10086:502;;;10167:1;10159:5;:9;10172:1;10159:14;10155:308;;10212:5;10226:1;10218:5;:9;10212:16;;;;;;;;:::i;:::-;;;;;;;10198:6;10205:3;10198:11;;;;;;;;:::i;:::-;;;;;;:30;;;;;10155:308;;;10271:5;:12;10258:5;10266:1;10258:9;:25;10254:209;;10330:1;10322:10;;10308:6;10315:3;10308:11;;;;;;;;:::i;:::-;;;;;;;;;;:24;10355:9;;10254:209;;;10427:5;10433;10441:1;10433:9;10427:16;;;;;;;;:::i;:::-;;;;;;;10413:6;10420:3;10413:11;;;;;;;;:::i;:::-;;;;;;:30;;;;;10254:209;10481:5;;;;;10521:1;10513:5;:9;10505:17;;10560:16;10570:5;10560:9;:16::i;:::-;10552:24;;10086:502;;;10759:14;10806;10813:7;10806:4;:14;:::i;:::-;-1:-1:-1;;;;;10792:29:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10792:29:0;;10784:37;;10862:9;10857:223;10877:4;10873:1;:8;10857:223;;;10932:1;10924:10;;10911:6;10918:1;10911:9;;;;;;;;:::i;:::-;;;;;;;:23;10907:158;;10979:6;10986:1;10979:9;;;;;;;;:::i;:::-;;;;;;;10959:5;10969:6;10965:1;:10;10959:17;;;;;;;;:::i;:::-;;;;;;:29;;;;;10907:158;;;11037:8;;;;;10907:158;10883:3;;10857:223;;;;9459:1639;;;;;9325:1773;;;;:::o;74394:405::-;-1:-1:-1;;;;;74511:21:0;;;74468:7;74511:21;;;:13;:21;;;;;;;;74488:44;;;;;;;;;;;;;;;-1:-1:-1;;;74488:44:0;;;;;;;;;;-1:-1:-1;;;;;;;;74488:44:0;;;;;;;-1:-1:-1;;;;;;;;74488:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74577:17;;;74488:44;74577:17;;;;;:26;;;;;;;;;;;;74563:11;;74468:7;;74488:44;74468:7;;74563:40;;74577:26;74563:40;;:::i;:::-;-1:-1:-1;;;;;74640:23:0;;;74614;74640;;;:15;:23;;;;;;;;:32;;;;;;;;;;;;;74701:26;;;:18;:26;;;;;:35;;;;;;;;;;;74543:60;;-1:-1:-1;74640:32:0;74543:60;74754:25;74640:32;74701:35;74754:25;:::i;:::-;:37;;;;:::i;:::-;74747:44;74394:405;-1:-1:-1;;;;;;;74394:405:0:o;75027:362::-;75207:19;;;75224:1;75207:19;;;75144:31;75207:19;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;75207:19:0;;-1:-1:-1;;75207:19:0;;;;;;;;;;;75193:33;;75254:22;:20;:22::i;:::-;75277:1;75254:25;;;;;;;;:::i;:::-;;;;;;;75237:11;75249:1;75237:14;;;;;;;;:::i;:::-;;;;;;:42;;;;75307:74;;;;;;;;75326:4;-1:-1:-1;;;;;75307:74:0;;;;;75333:8;-1:-1:-1;;;;;75307:74:0;;;;;75343:37;;;-1:-1:-1;;;;;75307:74:0;;;;;75290:11;75302:1;75290:14;;;;;;;;:::i;:::-;;;;;;:91;;;;75027:362;:::o;73007:168::-;73095:11;;-1:-1:-1;;;;;73095:11:0;73081:10;:25;73073:60;;;;-1:-1:-1;;;73073:60:0;;39371:2:1;73073:60:0;;;39353:21:1;39410:2;39390:18;;;39383:30;-1:-1:-1;;;39429:18:1;;;39422:52;39491:18;;73073:60:0;39169:346:1;73073:60:0;73144:11;:23;;-1:-1:-1;;;;;;73144:23:0;-1:-1:-1;;;;;73144:23:0;;;;;;;;;;73007:168::o;73746:125::-;-1:-1:-1;;;;;73839:24:0;;;;;;:16;:24;;;;;;;;;73832:31;;;;;;;;;;;;;;;;;73803:16;;73832:31;;;73839:24;73832:31;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;73832:31:0;;;;;;;;;;;;;;;;;;;;;;;73746:125;;;:::o;7181:789::-;7256:12;7357:5;7353:38;;-1:-1:-1;7385:6:0;7378:13;;7353:38;7406:6;7402:38;;-1:-1:-1;7435:5:0;7428:12;;7402:38;7686:6;7679:5;7676:17;7667:6;7660:5;7657:17;7654:40;7651:134;;;7726:5;7721:3;7714:18;7763:6;7757:4;7750:20;7651:134;7812:6;7805:5;7802:17;7799:111;;;7851:6;7846:3;7839:19;7889:5;7883:4;7876:19;7799:111;-1:-1:-1;7947:4:0;7942:3;7932:20;7181:789;;;;:::o;5405:381::-;5457:21;5491:31;5525:16;:14;:16::i;:::-;5569:18;;5491:50;;-1:-1:-1;5569:18:0;-1:-1:-1;;;;;5607:19:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5598:28;;5667:9;5662:106;5682:6;5678:1;:10;5662:106;;;5737:11;5749:1;5737:14;;;;;;;;:::i;:::-;;;;;;;5726:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;5714:6;5721:1;5714:9;;;;;;;;:::i;:::-;;;;;;;;;;:38;5690:3;;5662:106;;73367:371;-1:-1:-1;;;;;73475:21:0;;;73426:13;73475:21;;;:13;:21;;;;;;;;73452:44;;;;;;;;;;;;;;;;-1:-1:-1;;;73452:44:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;73452:44:0;;;;;;;;;-1:-1:-1;;;;;;;;73452:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73426:13;;73452:44;73426:13;;73528:32;;:15;:32;:::i;:::-;73527:55;;;;:::i;:::-;73507:75;;73614:4;:15;;;-1:-1:-1;;;;;73602:27:0;:9;:27;73601:63;;73655:9;73637:4;:15;;;-1:-1:-1;;;;;73637:27:0;;;;;:::i;:::-;73601:63;;;73633:1;73601:63;73593:71;;73692:4;:13;;;-1:-1:-1;;;;;73684:21:0;:5;:21;73683:47;;73717:4;:13;;;-1:-1:-1;;;;;73683:47:0;;;;73709:5;73683:47;73675:55;73367:371;-1:-1:-1;;;;73367:371:0:o;21967:141::-;22029:4;22054:22;22070:5;22054:15;:22::i;:::-;:45;;;-1:-1:-1;21762:12:0;;;;21745:13;;;;:29;;;;;;;22080:19;21652:131;75397:469;-1:-1:-1;;;;;75565:26:0;;;75550:12;75565:26;;;:18;:26;;;;;;;;:35;;;;;;;;;;;;;75639:23;;;:15;:23;;;;;:32;;;;;;;;;;;75620:16;75630:6;-1:-1:-1;;;;;75620:16:0;;;:::i;:::-;:51;;;;:::i;:::-;75611:61;;;;:::i;:::-;;-1:-1:-1;75687:8:0;;75683:176;;-1:-1:-1;;;;;75712:23:0;;;;;;;:15;:23;;;;;;;;:32;;;;;;;;;;;:40;;75748:4;;75712:23;:40;;75748:4;;75712:40;:::i;:::-;;;;-1:-1:-1;75767:29:0;;-1:-1:-1;75782:7:0;75791:4;75767:14;:29::i;:::-;75833:7;-1:-1:-1;;;;;75816:31:0;75825:6;-1:-1:-1;;;;;75816:31:0;;75842:4;75816:31;;;;894:25:1;;882:2;867:18;;748:177;75816:31:0;;;;;;;;75683:176;75539:327;75397:469;;;;:::o;21791:168::-;21862:4;21905:5;:13;;;21887:31;;:15;:31;:63;;;;;21938:5;:12;;;21922:28;;:5;:13;;;:28;;;21879:72;21791:168;-1:-1:-1;;21791:168:0:o;41599:244::-;41677:32;41697:3;41702:6;41677:19;:32::i;:::-;41672:164;;41731:12;-1:-1:-1;;;;;41726:26:0;;41760:6;41726:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;41784:40:0;;-1:-1:-1;;;41784:40:0;;-1:-1:-1;;;;;39712:32:1;;;41784:40:0;;;39694:51:1;39761:18;;;39754:34;;;41789:12:0;41784:27;;-1:-1:-1;41784:27:0;;-1:-1:-1;39667:18:1;;;-1:-1:-1;41784:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;41672:164;41599:244;;:::o;20972:302::-;21043:9;21069:16;21079:5;21372:15;21390;21372:33;;;;;;21282:132;21069:16;21065:46;;;-1:-1:-1;21094:17:0;;20972:302;-1:-1:-1;20972:302:0:o;21065:46::-;21126:13;21133:5;21126:6;:13::i;:::-;21122:40;;;-1:-1:-1;21148:14:0;;20972:302;-1:-1:-1;20972:302:0:o;21122:40::-;21762:12;;;;21745:13;;;;:29;;;;;;;21173:52;;-1:-1:-1;21205:20:0;;20972:302;-1:-1:-1;20972:302:0:o;21173:52::-;-1:-1:-1;21243:23:0;;20972:302;-1:-1:-1;20972:302:0:o;16264:305::-;16380:12;16440:9;16435:116;16455:7;16451:1;:11;16435:116;;;16504:8;16513:1;16504:11;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;16496:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;16496:32:0;;;;;;;;;;;;:::i;:::-;:39;16488:47;;;;;16464:3;;16435:116;;;;16264:305;;;;:::o;11264:977::-;11644:12;;11329:23;;11684:3;11675:12;;;:17;;11671:266;;11747:1;11737:11;;;11736:17;-1:-1:-1;;;;;11722:32:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11722:32:0;;11713:41;;11801:44;11815:5;11830:1;11821:6;:10;11815:17;;;;;;;;:::i;:::-;;;;;;;11842:1;11834:10;;11801:13;:44::i;:::-;11773:6;11796:1;11780:6;:13;:17;11773:25;;;;;;;;:::i;:::-;;;;;;:72;;;;;11671:266;;;11919:1;11909:6;:11;;-1:-1:-1;;;;;11895:26:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11895:26:0;;11886:35;;11671:266;12047:11;12078:9;12073:150;12102:1;12093:6;:10;12089:1;:14;12073:150;;;12146:37;12160:5;12166:1;12160:8;;;;;;;;:::i;:::-;;;;;;;12170:5;12176:1;12180;12176:5;12170:12;;;;;;;;:::i;12146:37::-;12132:6;12139:3;12132:11;;;;;;;;:::i;:::-;;;;;;;;;;:51;12202:5;;;;;12110:1;12105:6;12073:150;;;;11602:632;;11264:977;;;:::o;22548:631::-;22633:15;;:42;22659:15;22633:42;;;;;;22625:73;;;;-1:-1:-1;;;22625:73:0;;40001:2:1;22625:73:0;;;39983:21:1;40040:2;40020:18;;;40013:30;-1:-1:-1;;;40059:18:1;;;40052:48;40117:18;;22625:73:0;39799:342:1;22625:73:0;22735:5;:13;;;22717:31;;:5;:15;;;:31;;;22709:62;;;;-1:-1:-1;;;22709:62:0;;40001:2:1;22709:62:0;;;39983:21:1;40040:2;40020:18;;;40013:30;-1:-1:-1;;;40059:18:1;;;40052:48;40117:18;;22709:62:0;39799:342:1;22709:62:0;22812:1;22790:5;:19;;;-1:-1:-1;;;;;22790:23:0;;22782:54;;;;-1:-1:-1;;;22782:54:0;;40348:2:1;22782:54:0;;;40330:21:1;40387:2;40367:18;;;40360:30;-1:-1:-1;;;40406:18:1;;;40399:48;40464:18;;22782:54:0;40146:342:1;22782:54:0;22874:5;:14;;;-1:-1:-1;;;;;22855:33:0;:5;:16;;;-1:-1:-1;;;;;22855:33:0;;22847:65;;;;-1:-1:-1;;;22847:65:0;;40695:2:1;22847:65:0;;;40677:21:1;40734:2;40714:18;;;40707:30;-1:-1:-1;;;40753:18:1;;;40746:49;40812:18;;22847:65:0;40493:343:1;22847:65:0;22931:12;;;;-1:-1:-1;;;;;22931:17:0;;22923:51;;;;-1:-1:-1;;;22923:51:0;;41043:2:1;22923:51:0;;;41025:21:1;41082:2;41062:18;;;41055:30;-1:-1:-1;;;41101:18:1;;;41094:51;41162:18;;22923:51:0;40841:345:1;22923:51:0;23008:1;22993:5;:12;;;:16;;;22985:49;;;;-1:-1:-1;;;22985:49:0;;41393:2:1;22985:49:0;;;41375:21:1;41432:2;41412:18;;;41405:30;-1:-1:-1;;;41451:18:1;;;41444:50;41511:18;;22985:49:0;41191:344:1;22985:49:0;23053:13;;;;:18;;;23045:49;;;;-1:-1:-1;;;23045:49:0;;41742:2:1;23045:49:0;;;41724:21:1;41781:2;41761:18;;;41754:30;-1:-1:-1;;;41800:18:1;;;41793:48;41858:18;;23045:49:0;41540:342:1;23045:49:0;23113:20;;;;-1:-1:-1;;;;;23113:25:0;;23105:66;;;;-1:-1:-1;;;23105:66:0;;42089:2:1;23105:66:0;;;42071:21:1;42128:2;42108:18;;;42101:30;42167;42147:18;;;42140:58;42215:18;;23105:66:0;41887:352:1;23105:66:0;22548:631;:::o;60311:305::-;60493:47;;-1:-1:-1;;;;;39712:32:1;;60493:47:0;;;39694:51:1;39761:18;;;39754:34;;;60473:17:0;;39667:18:1;;60493:47:0;;;-1:-1:-1;;60493:47:0;;;;;;;;;;;;;;-1:-1:-1;;;;;60493:47:0;-1:-1:-1;;;60493:47:0;;;60551:57;-1:-1:-1;;;60551:57:0;;60493:47;;-1:-1:-1;;;;;;60551:31:0;;;;;:57;;60583:6;;60493:47;;60597:10;;;;60551:57;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;60551:57:0;;;;;;;;;;;;:::i;:::-;;;60462:154;60311:305;;;;;:::o;22260:280::-;22398:34;;;;;;;;;;;;;;;;-1:-1:-1;;;22398:34:0;;;;;;;;;;-1:-1:-1;;;;;;;;22398:34:0;;;;;;;;;;-1:-1:-1;;;;;;;;22398:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22398:34:0;;;;;;;22418:5;22425:6;22398:12;:34::i;:::-;22443:13;;;;:23;;22460:6;;22443:13;:23;;22460:6;;22443:23;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;22498:12;;;;;;;22481:13;;;;;;;:29;;-1:-1:-1;22477:55:0;;22512:12;;;:20;;-1:-1:-1;;;;;22512:20:0;;;-1:-1:-1;;;22512:20:0;;;;;;22260:280;;;:::o;59728:300::-;59917:19;;;59934:1;59917:19;;;;;;;;;59854:31;;59917:19;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;59917:19:0;;-1:-1:-1;;59917:19:0;;;;;;;;-1:-1:-1;;59964:56:0;;;;;;;;59983:4;59964:56;;-1:-1:-1;;;;;59990:6:0;59964:56;;;;;-1:-1:-1;;;59964:56:0;;;;;;;59947:14;;;;-1:-1:-1;59964:56:0;59947:14;;-1:-1:-1;;59947:14:0;;;;:::i;41085:380::-;41161:12;41418:3;-1:-1:-1;;;;;41418:8:0;41434:6;41447:5;41418:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41404:53:0;;41085:380;-1:-1:-1;;;;41085:380:0:o;21422:222::-;21527:15;;21484:4;;21509:33;;:15;:33;:81;;;;;21577:5;:13;;;21559:31;;:15;:31;21509:81;:126;;;;;21623:5;:12;;;21607:28;;:5;:13;;;:28;;;21501:135;21422:222;-1:-1:-1;;21422:222:0:o;23187:470::-;23343:14;;;;:5;:14;:::i;:::-;-1:-1:-1;;;;;23329:29:0;:9;:29;;23321:66;;;;-1:-1:-1;;;23321:66:0;;42885:2:1;23321:66:0;;;42867:21:1;42924:2;42904:18;;;42897:30;42963:26;42943:18;;;42936:54;43007:18;;23321:66:0;42683:348:1;23321:66:0;23406:5;:12;;;:17;;23422:1;23406:17;23398:56;;;;-1:-1:-1;;;23398:56:0;;43238:2:1;23398:56:0;;;43220:21:1;43277:2;43257:18;;;43250:30;43316:28;43296:18;;;43289:56;43362:18;;23398:56:0;43036:350:1;23398:56:0;23499:6;23473:32;;:22;23489:5;23473:15;:22::i;:::-;:32;;23465:71;;;;-1:-1:-1;;;23465:71:0;;43593:2:1;23465:71:0;;;43575:21:1;43632:2;43612:18;;;43605:30;43671:28;43651:18;;;43644:56;43717:18;;23465:71:0;43391:350:1;23465:71:0;23555:13;23562:5;23555:6;:13::i;:::-;23547:40;;;;-1:-1:-1;;;23547:40:0;;43948:2:1;23547:40:0;;;43930:21:1;43987:2;43967:18;;;43960:30;-1:-1:-1;;;44006:18:1;;;43999:44;44060:18;;23547:40:0;43746:338:1;23547:40:0;23615:1;23606:6;:10;;;23598:51;;;;-1:-1:-1;;;23598:51:0;;44291:2:1;23598:51:0;;;44273:21:1;44330:2;44310:18;;;44303:30;44369;44349:18;;;44342:58;44417:18;;23598:51:0;44089:352:1;22116:136:0;22187:7;22230:5;:13;;;22215:5;:12;;;:28;;;;:::i;:::-;22207:37;;;22116:136;-1:-1:-1;;22116:136:0:o;563:180:1:-;622:6;675:2;663:9;654:7;650:23;646:32;643:52;;;691:1;688;681:12;643:52;-1:-1:-1;714:23:1;;563:180;-1:-1:-1;563:180:1:o;930:131::-;-1:-1:-1;;;;;1005:31:1;;995:42;;985:70;;1051:1;1048;1041:12;1066:134;1134:20;;1163:31;1134:20;1163:31;:::i;:::-;1066:134;;;:::o;1205:388::-;1273:6;1281;1334:2;1322:9;1313:7;1309:23;1305:32;1302:52;;;1350:1;1347;1340:12;1302:52;1389:9;1376:23;1408:31;1433:5;1408:31;:::i;:::-;1458:5;-1:-1:-1;1515:2:1;1500:18;;1487:32;1528:33;1487:32;1528:33;:::i;:::-;1580:7;1570:17;;;1205:388;;;;;:::o;1598:347::-;1649:8;1659:6;1713:3;1706:4;1698:6;1694:17;1690:27;1680:55;;1731:1;1728;1721:12;1680:55;-1:-1:-1;1754:20:1;;-1:-1:-1;;;;;1786:30:1;;1783:50;;;1829:1;1826;1819:12;1783:50;1866:4;1858:6;1854:17;1842:29;;1918:3;1911:4;1902:6;1894;1890:19;1886:30;1883:39;1880:59;;;1935:1;1932;1925:12;1880:59;1598:347;;;;;:::o;1950:754::-;2047:6;2055;2063;2071;2079;2132:3;2120:9;2111:7;2107:23;2103:33;2100:53;;;2149:1;2146;2139:12;2100:53;2188:9;2175:23;2207:31;2232:5;2207:31;:::i;:::-;2257:5;-1:-1:-1;2314:2:1;2299:18;;2286:32;2327:33;2286:32;2327:33;:::i;:::-;2379:7;-1:-1:-1;2433:2:1;2418:18;;2405:32;;-1:-1:-1;2488:2:1;2473:18;;2460:32;-1:-1:-1;;;;;2504:30:1;;2501:50;;;2547:1;2544;2537:12;2501:50;2586:58;2636:7;2627:6;2616:9;2612:22;2586:58;:::i;:::-;1950:754;;;;-1:-1:-1;1950:754:1;;-1:-1:-1;2663:8:1;;2560:84;1950:754;-1:-1:-1;;;1950:754:1:o;2916:247::-;2975:6;3028:2;3016:9;3007:7;3003:23;2999:32;2996:52;;;3044:1;3041;3034:12;2996:52;3083:9;3070:23;3102:31;3127:5;3102:31;:::i;:::-;3152:5;2916:247;-1:-1:-1;;;2916:247:1:o;3168:367::-;3231:8;3241:6;3295:3;3288:4;3280:6;3276:17;3272:27;3262:55;;3313:1;3310;3303:12;3262:55;-1:-1:-1;3336:20:1;;-1:-1:-1;;;;;3368:30:1;;3365:50;;;3411:1;3408;3401:12;3365:50;3448:4;3440:6;3436:17;3424:29;;3508:3;3501:4;3491:6;3488:1;3484:14;3476:6;3472:27;3468:38;3465:47;3462:67;;;3525:1;3522;3515:12;3540:782;3653:6;3661;3669;3677;3685;3738:3;3726:9;3717:7;3713:23;3709:33;3706:53;;;3755:1;3752;3745:12;3706:53;3794:9;3781:23;3813:31;3838:5;3813:31;:::i;:::-;3863:5;-1:-1:-1;3920:2:1;3905:18;;3892:32;3933:33;3892:32;3933:33;:::i;:::-;3985:7;-1:-1:-1;4039:2:1;4024:18;;4011:32;;-1:-1:-1;4094:2:1;4079:18;;4066:32;-1:-1:-1;;;;;4110:30:1;;4107:50;;;4153:1;4150;4143:12;4107:50;4192:70;4254:7;4245:6;4234:9;4230:22;4192:70;:::i;4327:342::-;4473:2;4458:18;;4506:1;4495:13;;4485:144;;4551:10;4546:3;4542:20;4539:1;4532:31;4586:4;4583:1;4576:15;4614:4;4611:1;4604:15;4485:144;4638:25;;;4327:342;:::o;4674:127::-;4735:10;4730:3;4726:20;4723:1;4716:31;4766:4;4763:1;4756:15;4790:4;4787:1;4780:15;4806:252;4878:2;4872:9;4920:3;4908:16;;-1:-1:-1;;;;;4939:34:1;;4975:22;;;4936:62;4933:88;;;5001:18;;:::i;:::-;5037:2;5030:22;4806:252;:::o;5063:275::-;5134:2;5128:9;5199:2;5180:13;;-1:-1:-1;;5176:27:1;5164:40;;-1:-1:-1;;;;;5219:34:1;;5255:22;;;5216:62;5213:88;;;5281:18;;:::i;:::-;5317:2;5310:22;5063:275;;-1:-1:-1;5063:275:1:o;5343:183::-;5403:4;-1:-1:-1;;;;;5428:6:1;5425:30;5422:56;;;5458:18;;:::i;:::-;-1:-1:-1;5503:1:1;5499:14;5515:4;5495:25;;5343:183::o;5531:966::-;5615:6;5646:2;5689;5677:9;5668:7;5664:23;5660:32;5657:52;;;5705:1;5702;5695:12;5657:52;5745:9;5732:23;-1:-1:-1;;;;;5770:6:1;5767:30;5764:50;;;5810:1;5807;5800:12;5764:50;5833:22;;5886:4;5878:13;;5874:27;-1:-1:-1;5864:55:1;;5915:1;5912;5905:12;5864:55;5951:2;5938:16;5974:60;5990:43;6030:2;5990:43;:::i;:::-;5974:60;:::i;:::-;6068:15;;;6150:1;6146:10;;;;6138:19;;6134:28;;;6099:12;;;;6174:19;;;6171:39;;;6206:1;6203;6196:12;6171:39;6230:11;;;;6250:217;6266:6;6261:3;6258:15;6250:217;;;6346:3;6333:17;6363:31;6388:5;6363:31;:::i;:::-;6407:18;;6283:12;;;;6445;;;;6250:217;;6502:258;6574:1;6584:113;6598:6;6595:1;6592:13;6584:113;;;6674:11;;;6668:18;6655:11;;;6648:39;6620:2;6613:10;6584:113;;;6715:6;6712:1;6709:13;6706:48;;;6750:1;6741:6;6736:3;6732:16;6725:27;6706:48;;6502:258;;;:::o;6765:257::-;6806:3;6844:5;6838:12;6871:6;6866:3;6859:19;6887:63;6943:6;6936:4;6931:3;6927:14;6920:4;6913:5;6909:16;6887:63;:::i;:::-;7004:2;6983:15;-1:-1:-1;;6979:29:1;6970:39;;;;7011:4;6966:50;;6765:257;-1:-1:-1;;6765:257:1:o;7027:800::-;7187:4;7216:2;7256;7245:9;7241:18;7286:2;7275:9;7268:21;7309:6;7344;7338:13;7375:6;7367;7360:22;7413:2;7402:9;7398:18;7391:25;;7475:2;7465:6;7462:1;7458:14;7447:9;7443:30;7439:39;7425:53;;7513:2;7505:6;7501:15;7534:1;7544:254;7558:6;7555:1;7552:13;7544:254;;;7651:2;7647:7;7635:9;7627:6;7623:22;7619:36;7614:3;7607:49;7679:39;7711:6;7702;7696:13;7679:39;:::i;:::-;7669:49;-1:-1:-1;7776:12:1;;;;7741:15;;;;7580:1;7573:9;7544:254;;;-1:-1:-1;7815:6:1;;7027:800;-1:-1:-1;;;;;;;7027:800:1:o;7832:662::-;7886:5;7939:3;7932:4;7924:6;7920:17;7916:27;7906:55;;7957:1;7954;7947:12;7906:55;7993:6;7980:20;8019:4;8043:60;8059:43;8099:2;8059:43;:::i;8043:60::-;8137:15;;;8223:1;8219:10;;;;8207:23;;8203:32;;;8168:12;;;;8247:15;;;8244:35;;;8275:1;8272;8265:12;8244:35;8311:2;8303:6;8299:15;8323:142;8339:6;8334:3;8331:15;8323:142;;;8405:17;;8393:30;;8443:12;;;;8356;;8323:142;;;-1:-1:-1;8483:5:1;7832:662;-1:-1:-1;;;;;;7832:662:1:o;8499:348::-;8583:6;8636:2;8624:9;8615:7;8611:23;8607:32;8604:52;;;8652:1;8649;8642:12;8604:52;8692:9;8679:23;-1:-1:-1;;;;;8717:6:1;8714:30;8711:50;;;8757:1;8754;8747:12;8711:50;8780:61;8833:7;8824:6;8813:9;8809:22;8780:61;:::i;9034:484::-;9136:6;9144;9152;9205:2;9193:9;9184:7;9180:23;9176:32;9173:52;;;9221:1;9218;9211:12;9173:52;9257:9;9244:23;9234:33;;9318:2;9307:9;9303:18;9290:32;-1:-1:-1;;;;;9337:6:1;9334:30;9331:50;;;9377:1;9374;9367:12;9331:50;9400:61;9453:7;9444:6;9433:9;9429:22;9400:61;:::i;:::-;9390:71;;;9508:2;9497:9;9493:18;9480:32;9470:42;;9034:484;;;;;:::o;9715:157::-;9776:5;9821:3;9812:6;9807:3;9803:16;9799:26;9796:46;;;9838:1;9835;9828:12;9796:46;-1:-1:-1;9860:6:1;9715:157;-1:-1:-1;9715:157:1:o;9877:1642::-;10125:6;10133;10141;10149;10157;10165;10173;10181;10189;10197;10205:7;10259:3;10247:9;10238:7;10234:23;10230:33;10227:53;;;10276:1;10273;10266:12;10227:53;-1:-1:-1;;;;;10357:2:1;10345:9;10332:23;10329:31;10326:51;;;10373:1;10370;10363:12;10326:51;10412:87;10491:7;10478:9;10465:23;10454:9;10450:39;10412:87;:::i;:::-;10518:8;;-1:-1:-1;10545:8:1;-1:-1:-1;10596:2:1;10581:18;;10568:32;10565:40;-1:-1:-1;10562:60:1;;;10618:1;10615;10608:12;10562:60;10657:96;10745:7;10738:2;10727:9;10723:18;10710:32;10699:9;10695:48;10657:96;:::i;:::-;10772:8;;-1:-1:-1;10799:8:1;-1:-1:-1;10850:2:1;10835:18;;10822:32;10819:40;-1:-1:-1;10816:60:1;;;10872:1;10869;10862:12;10816:60;10911:96;10999:7;10992:2;10981:9;10977:18;10964:32;10953:9;10949:48;10911:96;:::i;:::-;11026:8;;-1:-1:-1;11053:8:1;-1:-1:-1;11080:64:1;11136:7;11131:2;11116:18;;11080:64;:::i;:::-;11070:74;;11163:39;11197:3;11186:9;11182:19;11163:39;:::i;:::-;11153:49;;11249:3;11238:9;11234:19;11221:33;11211:43;;11304:2;11297:3;11286:9;11282:19;11269:33;11266:41;11263:61;;;11320:1;11317;11310:12;11263:61;;11360:97;11449:7;11441:3;11430:9;11426:19;11413:33;11402:9;11398:49;11360:97;:::i;:::-;11476:8;11466:18;;11504:9;11493:20;;;;9877:1642;;;;;;;;;;;;;;:::o;11524:315::-;11592:6;11600;11653:2;11641:9;11632:7;11628:23;11624:32;11621:52;;;11669:1;11666;11659:12;11621:52;11708:9;11695:23;11727:31;11752:5;11727:31;:::i;:::-;11777:5;11829:2;11814:18;;;;11801:32;;-1:-1:-1;;;11524:315:1:o;11844:632::-;12015:2;12067:21;;;12137:13;;12040:18;;;12159:22;;;11986:4;;12015:2;12238:15;;;;12212:2;12197:18;;;11986:4;12281:169;12295:6;12292:1;12289:13;12281:169;;;12356:13;;12344:26;;12425:15;;;;12390:12;;;;12317:1;12310:9;12281:169;;;-1:-1:-1;12467:3:1;;11844:632;-1:-1:-1;;;;;;11844:632:1:o;13954:117::-;14039:6;14032:5;14028:18;14021:5;14018:29;14008:57;;14061:1;14058;14051:12;14076:132;14143:20;;14172:30;14143:20;14172:30;:::i;14213:386::-;14280:6;14288;14341:2;14329:9;14320:7;14316:23;14312:32;14309:52;;;14357:1;14354;14347:12;14309:52;14396:9;14383:23;14415:31;14440:5;14415:31;:::i;:::-;14465:5;-1:-1:-1;14522:2:1;14507:18;;14494:32;14535;14494;14535;:::i;14604:416::-;14697:6;14705;14758:2;14746:9;14737:7;14733:23;14729:32;14726:52;;;14774:1;14771;14764:12;14726:52;14814:9;14801:23;-1:-1:-1;;;;;14839:6:1;14836:30;14833:50;;;14879:1;14876;14869:12;14833:50;14902:61;14955:7;14946:6;14935:9;14931:22;14902:61;:::i;:::-;14892:71;15010:2;14995:18;;;;14982:32;;-1:-1:-1;;;;14604:416:1:o;15025:1338::-;15185:6;15193;15201;15209;15217;15225;15233;15241;15294:3;15282:9;15273:7;15269:23;15265:33;15262:53;;;15311:1;15308;15301:12;15262:53;15350:9;15337:23;15369:31;15394:5;15369:31;:::i;:::-;15419:5;-1:-1:-1;15476:2:1;15461:18;;15448:32;15489:33;15448:32;15489:33;:::i;:::-;15541:7;-1:-1:-1;15599:2:1;15584:18;;15571:32;-1:-1:-1;;;;;15652:14:1;;;15649:34;;;15679:1;15676;15669:12;15649:34;15718:70;15780:7;15771:6;15760:9;15756:22;15718:70;:::i;:::-;15807:8;;-1:-1:-1;15692:96:1;-1:-1:-1;15895:2:1;15880:18;;15867:32;;-1:-1:-1;15911:16:1;;;15908:36;;;15940:1;15937;15930:12;15908:36;15979:72;16043:7;16032:8;16021:9;16017:24;15979:72;:::i;:::-;16070:8;;-1:-1:-1;15953:98:1;-1:-1:-1;16158:3:1;16143:19;;16130:33;;-1:-1:-1;16175:16:1;;;16172:36;;;16204:1;16201;16194:12;16172:36;;16243:60;16295:7;16284:8;16273:9;16269:24;16243:60;:::i;:::-;15025:1338;;;;-1:-1:-1;15025:1338:1;;-1:-1:-1;15025:1338:1;;;;;;16322:8;-1:-1:-1;;;15025:1338:1:o;16368:290::-;16486:12;;-1:-1:-1;;;;;16482:21:1;;;16470:34;;16557:4;16546:16;;;16540:23;16536:32;;;16520:14;;;16513:56;16622:4;16611:16;;;16605:23;-1:-1:-1;;;;;;16601:50:1;16585:14;;16578:74;16368:290::o;16663:708::-;16886:2;16938:21;;;17008:13;;16911:18;;;17030:22;;;16857:4;;16886:2;17109:15;;;;17083:2;17068:18;;;16857:4;17152:193;17166:6;17163:1;17160:13;17152:193;;;17215:48;17259:3;17250:6;17244:13;17215:48;:::i;:::-;17320:15;;;;17292:4;17283:14;;;;;17188:1;17181:9;17152:193;;17376:658;17547:2;17599:21;;;17669:13;;17572:18;;;17691:22;;;17518:4;;17547:2;17770:15;;;;17744:2;17729:18;;;17518:4;17813:195;17827:6;17824:1;17821:13;17813:195;;;17892:13;;-1:-1:-1;;;;;17888:39:1;17876:52;;17983:15;;;;17948:12;;;;17924:1;17842:9;17813:195;;18039:248;18107:6;18115;18168:2;18156:9;18147:7;18143:23;18139:32;18136:52;;;18184:1;18181;18174:12;18136:52;-1:-1:-1;;18207:23:1;;;18277:2;18262:18;;;18249:32;;-1:-1:-1;18039:248:1:o;18292:823::-;18398:6;18406;18414;18422;18430;18438;18491:3;18479:9;18470:7;18466:23;18462:33;18459:53;;;18508:1;18505;18498:12;18459:53;18547:9;18534:23;18566:31;18591:5;18566:31;:::i;:::-;18616:5;-1:-1:-1;18673:2:1;18658:18;;18645:32;18686:33;18645:32;18686:33;:::i;:::-;18738:7;-1:-1:-1;18792:2:1;18777:18;;18764:32;;-1:-1:-1;18843:2:1;18828:18;;18815:32;;-1:-1:-1;18898:3:1;18883:19;;18870:33;-1:-1:-1;;;;;18915:30:1;;18912:50;;;18958:1;18955;18948:12;18912:50;18997:58;19047:7;19038:6;19027:9;19023:22;18997:58;:::i;:::-;18292:823;;;;-1:-1:-1;18292:823:1;;-1:-1:-1;18292:823:1;;19074:8;;18292:823;-1:-1:-1;;;18292:823:1:o;19810:312::-;19889:6;19897;19950:2;19938:9;19929:7;19925:23;19921:32;19918:52;;;19966:1;19963;19956:12;19918:52;19998:9;19992:16;20017:31;20042:5;20017:31;:::i;:::-;20112:2;20097:18;;;;20091:25;20067:5;;20091:25;;-1:-1:-1;;;19810:312:1:o;21758:127::-;21819:10;21814:3;21810:20;21807:1;21800:31;21850:4;21847:1;21840:15;21874:4;21871:1;21864:15;21890:287;21930:7;-1:-1:-1;;;;;22023:2:1;22020:1;22016:10;22053:2;22050:1;22046:10;22109:3;22105:2;22101:12;22096:3;22093:21;22086:3;22079:11;22072:19;22068:47;22065:73;;;22118:18;;:::i;:::-;22158:13;;21890:287;-1:-1:-1;;;;21890:287:1:o;22182:125::-;22222:4;22250:1;22247;22244:8;22241:34;;;22255:18;;:::i;:::-;-1:-1:-1;22292:9:1;;22182:125::o;22312:168::-;22352:7;22418:1;22414;22410:6;22406:14;22403:1;22400:21;22395:1;22388:9;22381:17;22377:45;22374:71;;;22425:18;;:::i;:::-;-1:-1:-1;22465:9:1;;22312:168::o;22617:217::-;22657:1;22683;22673:132;;22727:10;22722:3;22718:20;22715:1;22708:31;22762:4;22759:1;22752:15;22790:4;22787:1;22780:15;22673:132;-1:-1:-1;22819:9:1;;22617:217::o;22839:128::-;22879:3;22910:1;22906:6;22903:1;22900:13;22897:39;;;22916:18;;:::i;:::-;-1:-1:-1;22952:9:1;;22839:128::o;22972:253::-;23012:3;-1:-1:-1;;;;;23101:2:1;23098:1;23094:10;23131:2;23128:1;23124:10;23162:3;23158:2;23154:12;23149:3;23146:21;23143:47;;;23170:18;;:::i;:::-;23206:13;;22972:253;-1:-1:-1;;;;22972:253:1:o;24647:737::-;-1:-1:-1;;;;;24910:32:1;;24892:51;;24979:2;24974;24959:18;;24952:30;;;-1:-1:-1;;25005:44:1;;25030:18;;25022:6;25005:44;:::i;:::-;25085:22;;;25080:2;25065:18;;25058:50;25117:22;;;-1:-1:-1;;;;;25151:31:1;;25148:51;;;25195:1;25192;25185:12;25148:51;25229:6;25226:1;25222:14;25283:6;25275;25270:2;25262:6;25258:15;25245:45;25357:1;25313:19;;25334:2;25309:28;25346:13;;;25309:28;24647:737;-1:-1:-1;;;;;;24647:737:1:o;25389:164::-;25465:13;;25514;;25507:21;25497:32;;25487:60;;25543:1;25540;25533:12;25558:496;25611:5;25664:3;25657:4;25649:6;25645:17;25641:27;25631:55;;25682:1;25679;25672:12;25631:55;25711:6;25705:13;-1:-1:-1;;;;;25733:2:1;25730:26;25727:52;;;25759:18;;:::i;:::-;25803:55;25846:2;25827:13;;-1:-1:-1;;25823:27:1;25852:4;25819:38;25803:55;:::i;:::-;25883:2;25874:7;25867:19;25929:3;25922:4;25917:2;25909:6;25905:15;25901:26;25898:35;25895:55;;;25946:1;25943;25936:12;25895:55;25959:64;26020:2;26013:4;26004:7;26000:18;25993:4;25985:6;25981:17;25959:64;:::i;26059:414::-;26144:6;26152;26205:2;26193:9;26184:7;26180:23;26176:32;26173:52;;;26221:1;26218;26211:12;26173:52;26244:37;26271:9;26244:37;:::i;:::-;26234:47;;26325:2;26314:9;26310:18;26304:25;-1:-1:-1;;;;;26344:6:1;26341:30;26338:50;;;26384:1;26381;26374:12;26338:50;26407:60;26459:7;26450:6;26439:9;26435:22;26407:60;:::i;:::-;26397:70;;;26059:414;;;;;:::o;26478:127::-;26539:10;26534:3;26530:20;26527:1;26520:31;26570:4;26567:1;26560:15;26594:4;26591:1;26584:15;26610:1132;26714:6;26745:2;26788;26776:9;26767:7;26763:23;26759:32;26756:52;;;26804:1;26801;26794:12;26756:52;26837:9;26831:16;-1:-1:-1;;;;;26907:2:1;26899:6;26896:14;26893:34;;;26923:1;26920;26913:12;26893:34;26961:6;26950:9;26946:22;26936:32;;27006:7;26999:4;26995:2;26991:13;26987:27;26977:55;;27028:1;27025;27018:12;26977:55;27057:2;27051:9;27080:60;27096:43;27136:2;27096:43;:::i;27080:60::-;27174:15;;;27256:1;27252:10;;;;27244:19;;27240:28;;;27205:12;;;;27280:19;;;27277:39;;;27312:1;27309;27302:12;27277:39;27344:2;27340;27336:11;27356:356;27372:6;27367:3;27364:15;27356:356;;;27451:3;27445:10;27487:2;27474:11;27471:19;27468:109;;;27531:1;27560:2;27556;27549:14;27468:109;27602:67;27661:7;27656:2;27642:11;27638:2;27634:20;27630:29;27602:67;:::i;:::-;27590:80;;-1:-1:-1;27690:12:1;;;;27389;;27356:356;;;-1:-1:-1;27731:5:1;26610:1132;-1:-1:-1;;;;;;;;26610:1132:1:o;28150:121::-;28235:10;28228:5;28224:22;28217:5;28214:33;28204:61;;28261:1;28258;28251:12;28276:132;28343:20;;28372:30;28343:20;28372:30;:::i;28413:129::-;-1:-1:-1;;;;;28491:5:1;28487:30;28480:5;28477:41;28467:69;;28532:1;28529;28522:12;28547:132;28614:20;;28643:30;28614:20;28643:30;:::i;28684:146::-;-1:-1:-1;;;;;28763:5:1;28759:46;28752:5;28749:57;28739:85;;28820:1;28817;28810:12;28835:134;28903:20;;28932:31;28903:20;28932:31;:::i;28974:972::-;29059:6;29112:3;29100:9;29091:7;29087:23;29083:33;29080:53;;;29129:1;29126;29119:12;29080:53;29155:22;;:::i;:::-;29200:28;29218:9;29200:28;:::i;:::-;29193:5;29186:43;29261:37;29294:2;29283:9;29279:18;29261:37;:::i;:::-;29256:2;29249:5;29245:14;29238:61;29331:37;29364:2;29353:9;29349:18;29331:37;:::i;:::-;29326:2;29319:5;29315:14;29308:61;29401:38;29435:2;29424:9;29420:18;29401:38;:::i;:::-;29396:2;29389:5;29385:14;29378:62;29473:39;29507:3;29496:9;29492:19;29473:39;:::i;:::-;29467:3;29460:5;29456:15;29449:64;29546:39;29580:3;29569:9;29565:19;29546:39;:::i;:::-;29540:3;29533:5;29529:15;29522:64;29619:38;29652:3;29641:9;29637:19;29619:38;:::i;:::-;29613:3;29606:5;29602:15;29595:63;29691:38;29724:3;29713:9;29709:19;29691:38;:::i;:::-;29685:3;29678:5;29674:15;29667:63;29749:3;29784:38;29818:2;29807:9;29803:18;29784:38;:::i;:::-;29768:14;;;29761:62;29842:3;29877:38;29896:18;;;29877:38;:::i;:::-;29861:14;;;29854:62;29865:5;28974:972;-1:-1:-1;;;28974:972:1:o;29951:251::-;30021:6;30074:2;30062:9;30053:7;30049:23;30045:32;30042:52;;;30090:1;30087;30080:12;30042:52;30122:9;30116:16;30141:31;30166:5;30141:31;:::i;30207:202::-;30274:6;30327:2;30315:9;30306:7;30302:23;30298:32;30295:52;;;30343:1;30340;30333:12;30295:52;30366:37;30393:9;30366:37;:::i;30414:174::-;30458:11;30510:3;30497:17;30523:30;30547:5;30523:30;:::i;30807:174::-;30851:11;30903:3;30890:17;30916:30;30940:5;30916:30;:::i;31232:176::-;31277:11;31329:3;31316:17;31342:31;31367:5;31342:31;:::i;31885:174::-;31929:11;31981:3;31968:17;31994:30;32018:5;31994:30;:::i;32687:176::-;32732:11;32784:3;32771:17;32797:31;32822:5;32797:31;:::i;33068:1397::-;33235:5;33222:19;33250:32;33274:7;33250:32;:::i;:::-;33355:10;33346:7;33342:24;33328:10;33324:15;33317:4;33311:11;33307:33;33304:63;33298:4;33291:77;;33377:95;33429:42;33467:2;33460:5;33456:14;33429:42;:::i;:::-;30685:11;;-1:-1:-1;;30721:32:1;30763:2;30759:14;;;;30775:18;30755:39;30718:77;30705:91;;30593:209;33377:95;33481;33533:42;33571:2;33564:5;33560:14;33533:42;:::i;:::-;31078:11;;-1:-1:-1;;31114:48:1;31172:2;31168:14;;;;31184:34;31164:55;31111:109;31098:123;;30986:241;33481:95;33585:101;33642:43;33681:2;33674:5;33670:14;33642:43;:::i;:::-;31510:11;;-1:-1:-1;;;;;31546:43:1;31599:3;31595:15;;;;-1:-1:-1;;;;;;31591:61:1;31543:110;31530:124;;31413:247;33585:101;33723:1;33717:4;33713:12;33734:107;33796:44;33835:3;33828:5;33824:15;33796:44;:::i;:::-;31771:11;;-1:-1:-1;;;;;;31767:57:1;-1:-1:-1;;;;;31826:46:1;;;;31764:109;31751:123;;31665:215;33734:107;33850:108;33913:44;33952:3;33945:5;33941:15;33913:44;:::i;33850:108::-;;33997:1;33991:4;33987:12;34008:106;34070:43;34108:3;34101:5;34097:15;34070:43;:::i;:::-;32168:11;;-1:-1:-1;;32164:28:1;32205:6;32194:18;;;;32161:52;32148:66;;32064:156;34008:106;34123:104;34183:43;34221:3;34214:5;34210:15;34183:43;:::i;:::-;32317:11;;-1:-1:-1;;32353:24:1;32387:2;32383:14;;;;32399:10;32379:31;32350:61;32337:75;;32225:193;34123:104;34236:107;34298:44;34337:3;34330:5;34326:15;34298:44;:::i;:::-;32517:11;;-1:-1:-1;;32553:56:1;32619:2;32615:14;;;;32631:42;32611:63;32550:125;32537:139;;32423:259;34236:107;;34352;34414:44;34453:3;34446:5;34442:15;34414:44;:::i;:::-;34410:1;34404:4;34400:12;32972:11;;-1:-1:-1;;;;;;32968:54:1;-1:-1:-1;;;;;33024:31:1;;;;32965:91;;;;32952:105;;32868:195;34850:245;34908:6;34961:2;34949:9;34940:7;34936:23;34932:32;34929:52;;;34977:1;34974;34967:12;34929:52;35016:9;35003:23;35035:30;35059:5;35035:30;:::i;35100:705::-;35281:2;35333:21;;;35306:18;;;35389:22;;;35252:4;;35468:6;35442:2;35427:18;;35252:4;35502:277;35516:6;35513:1;35510:13;35502:277;;;35591:6;35578:20;35611:31;35636:5;35611:31;:::i;:::-;-1:-1:-1;;;;;35667:31:1;35655:44;;35754:15;;;;35719:12;;;;35695:1;35531:9;35502:277;;35810:1543;36039:25;;;36026:3;36011:19;;36073:64;36133:2;36118:18;;36091:25;36109:6;36091:25;:::i;:::-;12557:10;12546:22;12534:35;;12481:94;36073:64;36166:34;36196:2;36188:6;36184:15;36166:34;:::i;:::-;12557:10;12546:22;;36256:2;36241:18;;12534:35;36209:51;36291:34;36321:2;36313:6;36309:15;36291:34;:::i;:::-;-1:-1:-1;;;;;12645:30:1;;36383:2;36368:18;;12633:43;36334:53;36418:35;36449:2;36441:6;36437:15;36418:35;:::i;:::-;-1:-1:-1;;;;;12753:46:1;;36512:3;36497:19;;12741:59;36462:55;36548:36;36579:3;36571:6;36567:16;36548:36;:::i;:::-;-1:-1:-1;;;;;12753:46:1;;36643:3;36628:19;;12741:59;36593:55;36679:36;36710:3;36702:6;36698:16;36679:36;:::i;:::-;-1:-1:-1;;;;;12753:46:1;;36774:3;36759:19;;12741:59;36724:55;36810:35;36840:3;36832:6;36828:16;36810:35;:::i;:::-;12887:6;12876:18;;36903:3;36888:19;;12864:31;36854:54;36939:35;36969:3;36961:6;36957:16;36939:35;:::i;:::-;36993:3;37005:53;37054:2;37043:9;37039:18;37023:14;12887:6;12876:18;12864:31;;12811:90;37005:53;37089:35;37120:2;37112:6;37108:15;37089:35;:::i;:::-;37067:57;;;37143:3;37155:54;37205:2;37194:9;37190:18;37174:14;-1:-1:-1;;;;;12753:46:1;12741:59;;12687:119;37155:54;37240:35;37271:2;37263:6;37259:15;37240:35;:::i;:::-;37218:57;;;37284:63;37342:3;37331:9;37327:19;37311:14;-1:-1:-1;;;;;88:31:1;76:44;;14:112;37284:63;;35810:1543;;;;;:::o;37358:881::-;37453:6;37484:2;37527;37515:9;37506:7;37502:23;37498:32;37495:52;;;37543:1;37540;37533:12;37495:52;37576:9;37570:16;-1:-1:-1;;;;;37601:6:1;37598:30;37595:50;;;37641:1;37638;37631:12;37595:50;37664:22;;37717:4;37709:13;;37705:27;-1:-1:-1;37695:55:1;;37746:1;37743;37736:12;37695:55;37775:2;37769:9;37798:60;37814:43;37854:2;37814:43;:::i;37798:60::-;37892:15;;;37974:1;37970:10;;;;37962:19;;37958:28;;;37923:12;;;;37998:19;;;37995:39;;;38030:1;38027;38020:12;37995:39;38054:11;;;;38074:135;38090:6;38085:3;38082:15;38074:135;;;38156:10;;38144:23;;38107:12;;;;38187;;;;38074:135;;38244:251;38430:2;38415:18;;38442:47;38419:9;38471:6;38442:47;:::i;42244:224::-;42283:3;42311:6;42344:2;42341:1;42337:10;42374:2;42371:1;42367:10;42405:3;42401:2;42397:12;42392:3;42389:21;42386:47;;;42413:18;;:::i;44446:217::-;44485:4;44514:6;44570:10;;;;44540;;44592:12;;;44589:38;;;44607:18;;:::i;:::-;44644:13;;44446:217;-1:-1:-1;;;44446:217:1:o
Swarm Source
ipfs://ff987becb65315d04ce1f645c1ee341ae3402f8d676ad9e0c2b0be3fddb22c50
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ 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.