Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60806040 | 12641293 | 1256 days ago | IN | 0 ETH | 0.38564577 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
AsyncArtwork_v2
Compiler Version
v0.5.17+commit.d19bba13
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-06-15 */ // File: @openzeppelin/upgrades/contracts/Initializable.sol pragma solidity >=0.4.24 <0.7.0; /** * @title Initializable * * @dev Helper contract to support initializer functions. To use it, replace * the constructor with a function that has the `initializer` modifier. * WARNING: Unlike constructors, initializer functions must be manually * invoked. This applies both to deploying an Initializable contract, as well * as extending an Initializable contract via inheritance. * WARNING: When used with inheritance, manual care must be taken to not invoke * a parent initializer twice, or ensure that all initializers are idempotent, * because this is not dealt with automatically as with constructors. */ contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private initializing; /** * @dev Modifier to use in the initializer function of a contract. */ modifier initializer() { require(initializing || isConstructor() || !initialized, "Contract instance has already been initialized"); bool isTopLevelCall = !initializing; if (isTopLevelCall) { initializing = true; initialized = true; } _; if (isTopLevelCall) { initializing = false; } } /// @dev Returns true if and only if the function is running in the constructor function isConstructor() private view returns (bool) { // extcodesize checks the size of the code stored in an address, and // address returns the current address. Since the code is still not // deployed when running a constructor, any checks on its code size will // yield zero, making it an effective way to detect if a contract is // under construction or not. address self = address(this); uint256 cs; assembly { cs := extcodesize(self) } return cs == 0; } // Reserved storage space to allow for layout changes in the future. uint256[50] private ______gap; } // File: @openzeppelin/contracts-ethereum-package/contracts/GSN/Context.sol pragma solidity ^0.5.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ contract Context is Initializable { // Empty internal constructor, to prevent people from mistakenly deploying // an instance of this contract, which should be used via inheritance. constructor () internal { } // solhint-disable-previous-line no-empty-blocks function _msgSender() internal view returns (address payable) { return msg.sender; } function _msgData() internal view returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File: @openzeppelin/contracts-ethereum-package/contracts/introspection/IERC165.sol pragma solidity ^0.5.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts-ethereum-package/contracts/token/ERC721/IERC721.sol pragma solidity ^0.5.0; /** * @dev Required interface of an ERC721 compliant contract. */ contract IERC721 is Initializable, IERC165 { event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of NFTs in `owner`'s account. */ function balanceOf(address owner) public view returns (uint256 balance); /** * @dev Returns the owner of the NFT specified by `tokenId`. */ function ownerOf(uint256 tokenId) public view returns (address owner); /** * @dev Transfers a specific NFT (`tokenId`) from one account (`from`) to * another (`to`). * * * * Requirements: * - `from`, `to` cannot be zero. * - `tokenId` must be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this * NFT by either {approve} or {setApprovalForAll}. */ function safeTransferFrom(address from, address to, uint256 tokenId) public; /** * @dev Transfers a specific NFT (`tokenId`) from one account (`from`) to * another (`to`). * * Requirements: * - If the caller is not `from`, it must be approved to move this NFT by * either {approve} or {setApprovalForAll}. */ function transferFrom(address from, address to, uint256 tokenId) public; function approve(address to, uint256 tokenId) public; function getApproved(uint256 tokenId) public view returns (address operator); function setApprovalForAll(address operator, bool _approved) public; function isApprovedForAll(address owner, address operator) public view returns (bool); function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public; } // File: @openzeppelin/contracts-ethereum-package/contracts/token/ERC721/IERC721Receiver.sol pragma solidity ^0.5.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ contract IERC721Receiver { /** * @notice Handle the receipt of an NFT * @dev The ERC721 smart contract calls this function on the recipient * after a {IERC721-safeTransferFrom}. This function MUST return the function selector, * otherwise the caller will revert the transaction. The selector to be * returned can be obtained as `this.onERC721Received.selector`. This * function MAY throw to revert and reject the transfer. * Note: the ERC721 contract address is always the message sender. * @param operator The address which called `safeTransferFrom` function * @param from The address which previously owned the token * @param tokenId The NFT identifier which is being transferred * @param data Additional data with no specified format * @return bytes4 `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` */ function onERC721Received(address operator, address from, uint256 tokenId, bytes memory data) public returns (bytes4); } // File: @openzeppelin/contracts-ethereum-package/contracts/math/SafeMath.sol pragma solidity ^0.5.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. * * _Available since v2.4.0._ */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File: @openzeppelin/contracts-ethereum-package/contracts/utils/Address.sol pragma solidity ^0.5.5; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } /** * @dev Converts an `address` into `address payable`. Note that this is * simply a type cast: the actual underlying value is not changed. * * _Available since v2.4.0._ */ function toPayable(address account) internal pure returns (address payable) { return address(uint160(account)); } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. * * _Available since v2.4.0._ */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-call-value (bool success, ) = recipient.call.value(amount)(""); require(success, "Address: unable to send value, recipient may have reverted"); } } // File: @openzeppelin/contracts-ethereum-package/contracts/drafts/Counters.sol pragma solidity ^0.5.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` * Since it is not possible to overflow a 256 bit integer with increments of one, `increment` can skip the {SafeMath} * overflow check, thereby saving gas. This does assume however correct usage, in that the underlying `_value` is never * directly accessed. */ library Counters { using SafeMath for uint256; struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { // The {SafeMath} overflow check can be skipped here, see the comment at the top counter._value += 1; } function decrement(Counter storage counter) internal { counter._value = counter._value.sub(1); } } // File: @openzeppelin/contracts-ethereum-package/contracts/introspection/ERC165.sol pragma solidity ^0.5.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts may inherit from this and call {_registerInterface} to declare * their support of an interface. */ contract ERC165 is Initializable, IERC165 { /* * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7 */ bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7; /** * @dev Mapping of interface ids to whether or not it's supported. */ mapping(bytes4 => bool) private _supportedInterfaces; function initialize() public initializer { // Derived contracts need only register support for their own interfaces, // we register support for ERC165 itself here _registerInterface(_INTERFACE_ID_ERC165); } /** * @dev See {IERC165-supportsInterface}. * * Time complexity O(1), guaranteed to always use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) public view returns (bool) { return _supportedInterfaces[interfaceId]; } /** * @dev Registers the contract as an implementer of the interface defined by * `interfaceId`. Support of the actual ERC165 interface is automatic and * registering its interface id is not required. * * See {IERC165-supportsInterface}. * * Requirements: * * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`). */ function _registerInterface(bytes4 interfaceId) internal { require(interfaceId != 0xffffffff, "ERC165: invalid interface id"); _supportedInterfaces[interfaceId] = true; } uint256[50] private ______gap; } // File: contracts/ERC721.sol pragma solidity ^0.5.0; /** * @title ERC721 Non-Fungible Token Standard basic implementation * @dev see https://eips.ethereum.org/EIPS/eip-721 */ contract ERC721 is Initializable, Context, ERC165, IERC721 { using SafeMath for uint256; using Address for address; using Counters for Counters.Counter; // Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` // which can be also obtained as `IERC721Receiver(0).onERC721Received.selector` bytes4 private constant _ERC721_RECEIVED = 0x150b7a02; // Mapping from token ID to owner mapping (uint256 => address) private _tokenOwner; // Mapping from token ID to approved address mapping (uint256 => address) private _tokenApprovals; // Mapping from owner to number of owned token mapping (address => Counters.Counter) private _ownedTokensCount; // Mapping from owner to operator approvals mapping (address => mapping (address => bool)) private _operatorApprovals; /* * bytes4(keccak256('balanceOf(address)')) == 0x70a08231 * bytes4(keccak256('ownerOf(uint256)')) == 0x6352211e * bytes4(keccak256('approve(address,uint256)')) == 0x095ea7b3 * bytes4(keccak256('getApproved(uint256)')) == 0x081812fc * bytes4(keccak256('setApprovalForAll(address,bool)')) == 0xa22cb465 * bytes4(keccak256('isApprovedForAll(address,address)')) == 0xe985e9c5 * bytes4(keccak256('transferFrom(address,address,uint256)')) == 0x23b872dd * bytes4(keccak256('safeTransferFrom(address,address,uint256)')) == 0x42842e0e * bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)')) == 0xb88d4fde * * => 0x70a08231 ^ 0x6352211e ^ 0x095ea7b3 ^ 0x081812fc ^ * 0xa22cb465 ^ 0xe985e9c ^ 0x23b872dd ^ 0x42842e0e ^ 0xb88d4fde == 0x80ac58cd */ bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd; function initialize() public initializer { ERC165.initialize(); // register the supported interfaces to conform to ERC721 via ERC165 _registerInterface(_INTERFACE_ID_ERC721); } function _hasBeenInitialized() internal view returns (bool) { return supportsInterface(_INTERFACE_ID_ERC721); } /** * @dev Gets the balance of the specified address. * @param owner address to query the balance of * @return uint256 representing the amount owned by the passed address */ function balanceOf(address owner) public view returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _ownedTokensCount[owner].current(); } /** * @dev Gets the owner of the specified token ID. * @param tokenId uint256 ID of the token to query the owner of * @return address currently marked as the owner of the given token ID */ function ownerOf(uint256 tokenId) public view returns (address) { address owner = _tokenOwner[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev Approves another address to transfer the given token ID * The zero address indicates there is no approved address. * There can only be one approved address per token at a given time. * Can only be called by the token owner or an approved operator. * @param to address to be approved for the given token ID * @param tokenId uint256 ID of the token to be approved */ function approve(address to, uint256 tokenId) public { address owner = ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require(_msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev Gets the approved address for a token ID, or zero if no address set * Reverts if the token ID does not exist. * @param tokenId uint256 ID of the token to query the approval of * @return address currently approved for the given token ID */ function getApproved(uint256 tokenId) public view returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev Sets or unsets the approval of a given operator * An operator is allowed to transfer all tokens of the sender on their behalf. * @param to operator address to set the approval * @param approved representing the status of the approval to be set */ function setApprovalForAll(address to, bool approved) public { require(to != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][to] = approved; emit ApprovalForAll(_msgSender(), to, approved); } /** * @dev Tells whether an operator is approved by a given owner. * @param owner owner address which you want to query the approval of * @param operator operator address which you want to query the approval of * @return bool whether the given operator is approved by the given owner */ function isApprovedForAll(address owner, address operator) public view returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev Transfers the ownership of a given token ID to another address. * Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * Requires the msg.sender to be the owner, approved, or operator. * @param from current owner of the token * @param to address to receive the ownership of the given token ID * @param tokenId uint256 ID of the token to be transferred */ function transferFrom(address from, address to, uint256 tokenId) public { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transferFrom(from, to, tokenId); } /** * @dev Safely transfers the ownership of a given token ID to another address * If the target address is a contract, it must implement {IERC721Receiver-onERC721Received}, * which is called upon a safe transfer, and return the magic value * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise, * the transfer is reverted. * Requires the msg.sender to be the owner, approved, or operator * @param from current owner of the token * @param to address to receive the ownership of the given token ID * @param tokenId uint256 ID of the token to be transferred */ function safeTransferFrom(address from, address to, uint256 tokenId) public { safeTransferFrom(from, to, tokenId, ""); } /** * @dev Safely transfers the ownership of a given token ID to another address * If the target address is a contract, it must implement {IERC721Receiver-onERC721Received}, * which is called upon a safe transfer, and return the magic value * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise, * the transfer is reverted. * Requires the _msgSender() to be the owner, approved, or operator * @param from current owner of the token * @param to address to receive the ownership of the given token ID * @param tokenId uint256 ID of the token to be transferred * @param _data bytes data to send along with a safe transfer check */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransferFrom(from, to, tokenId, _data); } /** * @dev Safely transfers the ownership of a given token ID to another address * If the target address is a contract, it must implement `onERC721Received`, * which is called upon a safe transfer, and return the magic value * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise, * the transfer is reverted. * Requires the _msgSender() to be the owner, approved, or operator * @param from current owner of the token * @param to address to receive the ownership of the given token ID * @param tokenId uint256 ID of the token to be transferred * @param _data bytes data to send along with a safe transfer check */ function _safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) internal { _transferFrom(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether the specified token exists. * @param tokenId uint256 ID of the token to query the existence of * @return bool whether the token exists */ function _exists(uint256 tokenId) internal view returns (bool) { address owner = _tokenOwner[tokenId]; return owner != address(0); } /** * @dev Returns whether the given spender can transfer a given token ID. * @param spender address of the spender to query * @param tokenId uint256 ID of the token to be transferred * @return bool whether the msg.sender is approved for the given token ID, * is an operator of the owner, or is the owner of the token */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Internal function to safely mint a new token. * Reverts if the given token ID already exists. * If the target address is a contract, it must implement `onERC721Received`, * which is called upon a safe transfer, and return the magic value * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise, * the transfer is reverted. * @param to The address that will own the minted token * @param tokenId uint256 ID of the token to be minted */ function _safeMint(address to, uint256 tokenId) internal { _safeMint(to, tokenId, ""); } /** * @dev Internal function to safely mint a new token. * Reverts if the given token ID already exists. * If the target address is a contract, it must implement `onERC721Received`, * which is called upon a safe transfer, and return the magic value * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise, * the transfer is reverted. * @param to The address that will own the minted token * @param tokenId uint256 ID of the token to be minted * @param _data bytes data to send along with a safe transfer check */ function _safeMint(address to, uint256 tokenId, bytes memory _data) internal { _mint(to, tokenId); require(_checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Internal function to mint a new token. * Reverts if the given token ID already exists. * @param to The address that will own the minted token * @param tokenId uint256 ID of the token to be minted */ function _mint(address to, uint256 tokenId) internal { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _tokenOwner[tokenId] = to; _ownedTokensCount[to].increment(); emit Transfer(address(0), to, tokenId); } /** * @dev Internal function to transfer ownership of a given token ID to another address. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * @param from current owner of the token * @param to address to receive the ownership of the given token ID * @param tokenId uint256 ID of the token to be transferred */ function _transferFrom(address from, address to, uint256 tokenId) internal { require(ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _clearApproval(tokenId); _ownedTokensCount[from].decrement(); _ownedTokensCount[to].increment(); _tokenOwner[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * This is an internal detail of the `ERC721` contract and its use is deprecated. * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data) internal returns (bool) { if (!to.isContract()) { return true; } // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = to.call(abi.encodeWithSelector( IERC721Receiver(to).onERC721Received.selector, _msgSender(), from, tokenId, _data )); if (!success) { if (returndata.length > 0) { // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert("ERC721: transfer to non ERC721Receiver implementer"); } } else { bytes4 retval = abi.decode(returndata, (bytes4)); return (retval == _ERC721_RECEIVED); } } /** * @dev Private function to clear current approval of a given token ID. * @param tokenId uint256 ID of the token to be transferred */ function _clearApproval(uint256 tokenId) private { if (_tokenApprovals[tokenId] != address(0)) { _tokenApprovals[tokenId] = address(0); } } uint256[50] private ______gap; } // File: @openzeppelin/contracts-ethereum-package/contracts/token/ERC721/IERC721Enumerable.sol pragma solidity ^0.5.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ contract IERC721Enumerable is Initializable, IERC721 { function totalSupply() public view returns (uint256); function tokenOfOwnerByIndex(address owner, uint256 index) public view returns (uint256 tokenId); function tokenByIndex(uint256 index) public view returns (uint256); } // File: contracts/ERC721Enumerable.sol pragma solidity ^0.5.0; /** * @title ERC-721 Non-Fungible Token with optional enumeration extension logic * @dev See https://eips.ethereum.org/EIPS/eip-721 */ contract ERC721Enumerable is Initializable, Context, ERC165, ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => uint256[]) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /* * bytes4(keccak256('totalSupply()')) == 0x18160ddd * bytes4(keccak256('tokenOfOwnerByIndex(address,uint256)')) == 0x2f745c59 * bytes4(keccak256('tokenByIndex(uint256)')) == 0x4f6ccce7 * * => 0x18160ddd ^ 0x2f745c59 ^ 0x4f6ccce7 == 0x780e9d63 */ bytes4 private constant _INTERFACE_ID_ERC721_ENUMERABLE = 0x780e9d63; /** * @dev Constructor function. */ function initialize() public initializer { require(ERC721._hasBeenInitialized()); // register the supported interface to conform to ERC721Enumerable via ERC165 _registerInterface(_INTERFACE_ID_ERC721_ENUMERABLE); } function _hasBeenInitialized() internal view returns (bool) { return supportsInterface(_INTERFACE_ID_ERC721_ENUMERABLE); } /** * @dev Gets the token ID at a given index of the tokens list of the requested owner. * @param owner address owning the tokens list to be accessed * @param index uint256 representing the index to be accessed of the requested tokens list * @return uint256 token ID at the given index of the tokens list owned by the requested address */ function tokenOfOwnerByIndex(address owner, uint256 index) public view returns (uint256) { require(index < balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev Gets the total amount of tokens stored by the contract. * @return uint256 representing the total amount of tokens */ function totalSupply() public view returns (uint256) { return _allTokens.length; } /** * @dev Gets the token ID at a given index of all the tokens in this contract * Reverts if the index is greater or equal to the total number of tokens. * @param index uint256 representing the index to be accessed of the tokens list * @return uint256 token ID at the given index of the tokens list */ function tokenByIndex(uint256 index) public view returns (uint256) { require(index < totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Internal function to transfer ownership of a given token ID to another address. * As opposed to transferFrom, this imposes no restrictions on msg.sender. * @param from current owner of the token * @param to address to receive the ownership of the given token ID * @param tokenId uint256 ID of the token to be transferred */ function _transferFrom(address from, address to, uint256 tokenId) internal { super._transferFrom(from, to, tokenId); _removeTokenFromOwnerEnumeration(from, tokenId); _addTokenToOwnerEnumeration(to, tokenId); } /** * @dev Internal function to mint a new token. * Reverts if the given token ID already exists. * @param to address the beneficiary that will own the minted token * @param tokenId uint256 ID of the token to be minted */ function _mint(address to, uint256 tokenId) internal { super._mint(to, tokenId); _addTokenToOwnerEnumeration(to, tokenId); _addTokenToAllTokensEnumeration(tokenId); } // /** // * @dev Internal function to burn a specific token. // * Reverts if the token does not exist. // * Deprecated, use {ERC721-_burn} instead. // * @param owner owner of the token to burn // * @param tokenId uint256 ID of the token being burned // */ // function _burn(address owner, uint256 tokenId) internal { // super._burn(owner, tokenId); // _removeTokenFromOwnerEnumeration(owner, tokenId); // // Since tokenId will be deleted, we can clear its slot in _ownedTokensIndex to trigger a gas refund // _ownedTokensIndex[tokenId] = 0; // // _removeTokenFromAllTokensEnumeration(tokenId); // } /** * @dev Gets the list of token IDs of the requested owner. * @param owner address owning the tokens * @return uint256[] List of token IDs owned by the requested address */ function _tokensOfOwner(address owner) internal view returns (uint256[] storage) { return _ownedTokens[owner]; } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { _ownedTokensIndex[tokenId] = _ownedTokens[to].length; _ownedTokens[to].push(tokenId); } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _ownedTokens[from].length.sub(1); uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array _ownedTokens[from].length--; // Note that _ownedTokensIndex[tokenId] hasn't been cleared: it still points to the old slot (now occupied by // lastTokenId, or just over the end of the array if the token was the last one). } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ // function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // // then delete the last slot (swap and pop). // uint256 lastTokenIndex = _allTokens.length.sub(1); // uint256 tokenIndex = _allTokensIndex[tokenId]; // // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // // an 'if' statement (like in _removeTokenFromOwnerEnumeration) // uint256 lastTokenId = _allTokens[lastTokenIndex]; // _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token // _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // // This also deletes the contents at the last position of the array // _allTokens.length--; // _allTokensIndex[tokenId] = 0; // } uint256[50] private ______gap; } // File: @openzeppelin/contracts-ethereum-package/contracts/token/ERC721/IERC721Metadata.sol pragma solidity ^0.5.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ contract IERC721Metadata is Initializable, IERC721 { function name() external view returns (string memory); function symbol() external view returns (string memory); function tokenURI(uint256 tokenId) external view returns (string memory); } // File: contracts/ERC721Metadata.sol pragma solidity ^0.5.0; contract ERC721Metadata is Initializable, Context, ERC165, ERC721, IERC721Metadata { // Token name string private _name; // Token symbol string private _symbol; // Optional mapping for token URIs mapping(uint256 => string) private _tokenURIs; /* * bytes4(keccak256('name()')) == 0x06fdde03 * bytes4(keccak256('symbol()')) == 0x95d89b41 * bytes4(keccak256('tokenURI(uint256)')) == 0xc87b56dd * * => 0x06fdde03 ^ 0x95d89b41 ^ 0xc87b56dd == 0x5b5e139f */ bytes4 private constant _INTERFACE_ID_ERC721_METADATA = 0x5b5e139f; /** * @dev Constructor function */ function initialize(string memory name, string memory symbol) public initializer { require(ERC721._hasBeenInitialized()); _name = name; _symbol = symbol; // register the supported interfaces to conform to ERC721 via ERC165 _registerInterface(_INTERFACE_ID_ERC721_METADATA); } function _hasBeenInitialized() internal view returns (bool) { return supportsInterface(_INTERFACE_ID_ERC721_METADATA); } /** * @dev Gets the token name. * @return string representing the token name */ function name() external view returns (string memory) { return _name; } /** * @dev Gets the token symbol. * @return string representing the token symbol */ function symbol() external view returns (string memory) { return _symbol; } /** * @dev Returns an URI for a given token ID. * Throws if the token ID does not exist. May return an empty string. * @param tokenId uint256 ID of the token to query */ function tokenURI(uint256 tokenId) external view returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); return _tokenURIs[tokenId]; } /** * @dev Internal function to set the token URI for a given token. * Reverts if the token ID does not exist. * @param tokenId uint256 ID of the token to set its URI * @param uri string URI to assign */ function _setTokenURI(uint256 tokenId, string memory uri) internal { require(_exists(tokenId), "ERC721Metadata: URI set of nonexistent token"); _tokenURIs[tokenId] = uri; } // * // * @dev Internal function to burn a specific token. // * Reverts if the token does not exist. // * Deprecated, use _burn(uint256) instead. // * @param owner owner of the token to burn // * @param tokenId uint256 ID of the token being burned by the msg.sender // function _burn(address owner, uint256 tokenId) internal { // super._burn(owner, tokenId); // // Clear metadata (if any) // if (bytes(_tokenURIs[tokenId]).length != 0) { // delete _tokenURIs[tokenId]; // } // } uint256[50] private ______gap; } // File: contracts/AsyncArtwork_v2.sol pragma solidity ^0.5.12; // interface for the v1 contract interface AsyncArtwork_v1 { function getControlToken(uint256 controlTokenId) external view returns (int256[] memory); function tokenURI(uint256 tokenId) external view returns (string memory); } // Copyright (C) 2020 Asynchronous Art, Inc. // GNU General Public License v3.0 // Full notice https://github.com/asyncart/async-contracts/blob/master/LICENSE contract AsyncArtwork_v2 is Initializable, ERC721, ERC721Enumerable, ERC721Metadata { // An event whenever the platform address is updated event PlatformAddressUpdated(address platformAddress); event PermissionUpdated( uint256 tokenId, address tokenOwner, address permissioned ); // An event whenever a creator is whitelisted with the token id and the layer count event CreatorWhitelisted( uint256 tokenId, uint256 layerCount, address creator ); // An event whenever royalty amount for a token is updated event PlatformSalePercentageUpdated( uint256 tokenId, uint256 platformFirstPercentage, uint256 platformSecondPercentage ); event DefaultPlatformSalePercentageUpdated( uint256 defaultPlatformFirstSalePercentage, uint256 defaultPlatformSecondSalePercentage ); // An event whenever artist secondary sale percentage is updated event ArtistSecondSalePercentUpdated(uint256 artistSecondPercentage); // An event whenever a bid is proposed event BidProposed(uint256 tokenId, uint256 bidAmount, address bidder); // An event whenever an bid is withdrawn event BidWithdrawn(uint256 tokenId); // An event whenever a buy now price has been set event BuyPriceSet(uint256 tokenId, uint256 price); // An event when a token has been sold event TokenSale( // the id of the token uint256 tokenId, // the price that the token was sold for uint256 salePrice, // the address of the buyer address buyer ); // An event when a token(s) first sale requirement has been waived event FirstSaleWaived( // the ids of the token uint256[] tokenIds ); // An event whenever a control token has been updated event ControlLeverUpdated( // the id of the token uint256 tokenId, // an optional amount that the updater sent to boost priority of the rendering uint256 priorityTip, // the number of times this control lever can now be updated int256 numRemainingUpdates, // the ids of the levers that were updated uint256[] leverIds, // the previous values that the levers had before this update (for clients who want to animate the change) int256[] previousValues, // the new updated value int256[] updatedValues ); // struct for a token that controls part of the artwork struct ControlToken { // number that tracks how many levers there are uint256 numControlLevers; // The number of update calls this token has (-1 for infinite) int256 numRemainingUpdates; // false by default, true once instantiated bool exists; // false by default, true once setup by the artist bool isSetup; // the levers that this control token can use mapping(uint256 => ControlLever) levers; } // struct for a lever on a control token that can be changed struct ControlLever { // // The minimum value this token can have (inclusive) int256 minValue; // The maximum value this token can have (inclusive) int256 maxValue; // The current value for this token int256 currentValue; // false by default, true once instantiated bool exists; } // struct for a pending bid struct PendingBid { // the address of the bidder address payable bidder; // the amount that they bid uint256 amount; // false by default, true once instantiated bool exists; } struct WhitelistReservation { // the address of the creator address creator; // the amount of layers they're expected to mint uint256 layerCount; } // track whether this token was sold the first time or not (used for determining whether to use first or secondary sale percentage) mapping(uint256 => bool) public tokenDidHaveFirstSale; // if a token's URI has been locked or not mapping(uint256 => bool) public tokenURILocked; // map control token ID to its buy price mapping(uint256 => uint256) public buyPrices; // mapping of addresses to credits for failed transfers mapping(address => uint256) public failedTransferCredits; // mapping of tokenId to percentage of sale that the platform gets on first sales mapping(uint256 => uint256) public platformFirstSalePercentages; // mapping of tokenId to percentage of sale that the platform gets on secondary sales mapping(uint256 => uint256) public platformSecondSalePercentages; // what tokenId creators are allowed to mint (and how many layers) mapping(uint256 => WhitelistReservation) public creatorWhitelist; // for each token, holds an array of the creator collaborators. For layer tokens it will likely just be [artist], for master tokens it may hold multiples mapping(uint256 => address payable[]) public uniqueTokenCreators; // map a control token ID to its highest bid mapping(uint256 => PendingBid) public pendingBids; // map a control token id to a control token struct mapping(uint256 => ControlToken) public controlTokenMapping; // mapping of addresses that are allowed to control tokens on your behalf mapping(address => mapping(uint256 => address)) public permissionedControllers; // the percentage of sale that an artist gets on secondary sales uint256 public artistSecondSalePercentage; // gets incremented to placehold for tokens not minted yet uint256 public expectedTokenSupply; // the minimum % increase for new bids coming uint256 public minBidIncreasePercent; // the address of the platform (for receving commissions and royalties) address payable public platformAddress; // the address of the contract that can upgrade from v1 to v2 tokens address public upgraderAddress; // the address of the contract that can whitelist artists to mint address public minterAddress; // v3 vairables uint256 public defaultPlatformFirstSalePercentage; uint256 public defaultPlatformSecondSalePercentage; function setup( string memory name, string memory symbol, uint256 initialExpectedTokenSupply, address _upgraderAddress ) public initializer { ERC721.initialize(); ERC721Enumerable.initialize(); ERC721Metadata.initialize(name, symbol); // starting royalty amounts artistSecondSalePercentage = 10; // intitialize the minimum bid increase percent minBidIncreasePercent = 1; // by default, the platformAddress is the address that mints this contract platformAddress = msg.sender; // set the upgrader address upgraderAddress = _upgraderAddress; // set the initial expected token supply expectedTokenSupply = initialExpectedTokenSupply; require(expectedTokenSupply > 0); } // modifier for only allowing the platform to make a call modifier onlyPlatform() { require(msg.sender == platformAddress); _; } // modifier for only allowing the minter to make a call modifier onlyMinter() { require(msg.sender == minterAddress); _; } modifier onlyWhitelistedCreator(uint256 masterTokenId, uint256 layerCount) { require(creatorWhitelist[masterTokenId].creator == msg.sender); require(creatorWhitelist[masterTokenId].layerCount == layerCount); _; } function setExpectedTokenSupply(uint256 newExpectedTokenSupply) external onlyPlatform { expectedTokenSupply = newExpectedTokenSupply; } // reserve a tokenID and layer count for a creator. Define a platform royalty percentage per art piece (some pieces have higher or lower amount) function whitelistTokenForCreator( address creator, uint256 masterTokenId, uint256 layerCount, uint256 platformFirstSalePercentage, uint256 platformSecondSalePercentage ) external onlyMinter { // the tokenID we're reserving must be the current expected token supply require(masterTokenId == expectedTokenSupply); // reserve the tokenID for this creator creatorWhitelist[masterTokenId] = WhitelistReservation( creator, layerCount ); // increase the expected token supply expectedTokenSupply = masterTokenId.add(layerCount).add(1); // define the platform percentages for this token here platformFirstSalePercentages[ masterTokenId ] = platformFirstSalePercentage; platformSecondSalePercentages[ masterTokenId ] = platformSecondSalePercentage; emit CreatorWhitelisted(masterTokenId, layerCount, creator); } // Allows the platform to change the minter address function updateMinterAddress(address newMinterAddress) external onlyPlatform { minterAddress = newMinterAddress; } // Allows the current platform address to update to something different function updatePlatformAddress(address payable newPlatformAddress) external onlyPlatform { platformAddress = newPlatformAddress; emit PlatformAddressUpdated(newPlatformAddress); } // Allows platform to waive the first sale requirement for a token (for charity events, special cases, etc) function waiveFirstSaleRequirement(uint256[] calldata tokenIds) external onlyPlatform { // This allows the token sale proceeds to go to the current owner (rather than be distributed amongst the token's creators) for (uint256 k = 0; k < tokenIds.length; k++) { tokenDidHaveFirstSale[tokenIds[k]] = true; } emit FirstSaleWaived(tokenIds); } // Allows platform to change the royalty percentage for a specific token function updatePlatformSalePercentage( uint256 tokenId, uint256 platformFirstSalePercentage, uint256 platformSecondSalePercentage ) external onlyPlatform { // set the percentages for this token platformFirstSalePercentages[tokenId] = platformFirstSalePercentage; platformSecondSalePercentages[tokenId] = platformSecondSalePercentage; // emit an event to notify that the platform percent for this token has changed emit PlatformSalePercentageUpdated( tokenId, platformFirstSalePercentage, platformSecondSalePercentage ); } // Allows platform to change the default sales percentages function updateDefaultPlatformSalePercentage( uint256 _defaultPlatformFirstSalePercentage, uint256 _defaultPlatformSecondSalePercentage ) external onlyPlatform { defaultPlatformFirstSalePercentage = _defaultPlatformFirstSalePercentage; defaultPlatformSecondSalePercentage = _defaultPlatformSecondSalePercentage; // emit an event to notify that the platform percent has changed emit DefaultPlatformSalePercentageUpdated( defaultPlatformFirstSalePercentage, defaultPlatformSecondSalePercentage ); } // Allows the platform to change the minimum percent increase for incoming bids function updateMinimumBidIncreasePercent(uint256 _minBidIncreasePercent) external onlyPlatform { require( (_minBidIncreasePercent > 0) && (_minBidIncreasePercent <= 50), "Bid increases must be within 0-50%" ); // set the new bid increase percent minBidIncreasePercent = _minBidIncreasePercent; } // Allow the platform to update a token's URI if it's not locked yet (for fixing tokens post mint process) function updateTokenURI(uint256 tokenId, string calldata tokenURI) external onlyPlatform { // ensure that this token exists require(_exists(tokenId)); // ensure that the URI for this token is not locked yet require(tokenURILocked[tokenId] == false); // update the token URI super._setTokenURI(tokenId, tokenURI); } // Locks a token's URI from being updated function lockTokenURI(uint256 tokenId) external onlyPlatform { // ensure that this token exists require(_exists(tokenId)); // lock this token's URI from being changed tokenURILocked[tokenId] = true; } // Allows platform to change the percentage that artists receive on secondary sales function updateArtistSecondSalePercentage( uint256 _artistSecondSalePercentage ) external onlyPlatform { // update the percentage that artists get on secondary sales artistSecondSalePercentage = _artistSecondSalePercentage; // emit an event to notify that the artist second sale percent has updated emit ArtistSecondSalePercentUpdated(artistSecondSalePercentage); } function setupControlToken( uint256 controlTokenId, string calldata controlTokenURI, int256[] calldata leverMinValues, int256[] calldata leverMaxValues, int256[] calldata leverStartValues, int256 numAllowedUpdates, address payable[] calldata additionalCollaborators ) external { // Hard cap the number of levers a single control token can have require(leverMinValues.length <= 500, "Too many control levers."); // Hard cap the number of collaborators a single control token can have require( additionalCollaborators.length <= 50, "Too many collaborators." ); // ensure that this token is not setup yet require( controlTokenMapping[controlTokenId].isSetup == false, "Already setup" ); // ensure that only the control token artist is attempting this mint require( uniqueTokenCreators[controlTokenId][0] == msg.sender, "Must be control token artist" ); // enforce that the length of all the array lengths are equal require( (leverMinValues.length == leverMaxValues.length) && (leverMaxValues.length == leverStartValues.length), "Values array mismatch" ); // require the number of allowed updates to be infinite (-1) or some finite number require( (numAllowedUpdates == -1) || (numAllowedUpdates > 0), "Invalid allowed updates" ); // mint the control token here super._safeMint(msg.sender, controlTokenId); // set token URI super._setTokenURI(controlTokenId, controlTokenURI); // create the control token controlTokenMapping[controlTokenId] = ControlToken( leverStartValues.length, numAllowedUpdates, true, true ); // create the control token levers now for (uint256 k = 0; k < leverStartValues.length; k++) { // enforce that maxValue is greater than or equal to minValue require( leverMaxValues[k] >= leverMinValues[k], "Max val must >= min" ); // enforce that currentValue is valid require( (leverStartValues[k] >= leverMinValues[k]) && (leverStartValues[k] <= leverMaxValues[k]), "Invalid start val" ); // add the lever to this token controlTokenMapping[controlTokenId].levers[k] = ControlLever( leverMinValues[k], leverMaxValues[k], leverStartValues[k], true ); } // the control token artist can optionally specify additional collaborators on this layer for (uint256 i = 0; i < additionalCollaborators.length; i++) { // can't provide burn address as collaborator require(additionalCollaborators[i] != address(0)); uniqueTokenCreators[controlTokenId].push( additionalCollaborators[i] ); } } // upgrade a token from the v1 contract to this v2 version function upgradeV1Token( uint256 tokenId, address v1Address, bool isControlToken, address to, uint256 platformFirstPercentageForToken, uint256 platformSecondPercentageForToken, bool hasTokenHadFirstSale, address payable[] calldata uniqueTokenCreatorsForToken ) external { // get reference to v1 token contract AsyncArtwork_v1 v1Token = AsyncArtwork_v1(v1Address); // require that only the upgrader address is calling this method require(msg.sender == upgraderAddress, "Only upgrader can call."); // preserve the unique token creators uniqueTokenCreators[tokenId] = uniqueTokenCreatorsForToken; if (isControlToken) { // preserve the control token details if it's a control token int256[] memory controlToken = v1Token.getControlToken(tokenId); // Require control token to be a valid size (multiple of 3) require(controlToken.length % 3 == 0, "Invalid control token."); // Require control token to have at least 1 lever require(controlToken.length > 0, "Control token must have levers"); // Setup the control token // Use -1 for numRemainingUpdates since v1 tokens were infinite use controlTokenMapping[tokenId] = ControlToken( controlToken.length / 3, -1, true, true ); // set each lever for the control token. getControlToken returns levers like: // [minValue, maxValue, curValue, minValue, maxValue, curValue, ...] so they always come in groups of 3 for (uint256 k = 0; k < controlToken.length; k += 3) { controlTokenMapping[tokenId].levers[k / 3] = ControlLever( controlToken[k], controlToken[k + 1], controlToken[k + 2], true ); } } // Set the royalty percentage for this token platformFirstSalePercentages[tokenId] = platformFirstPercentageForToken; platformSecondSalePercentages[ tokenId ] = platformSecondPercentageForToken; // whether this token has already had its first sale tokenDidHaveFirstSale[tokenId] = hasTokenHadFirstSale; // Mint and transfer the token to the original v1 token owner super._safeMint(to, tokenId); // set the same token URI super._setTokenURI(tokenId, v1Token.tokenURI(tokenId)); } function mintArtwork( uint256 masterTokenId, string calldata artworkTokenURI, address payable[] calldata controlTokenArtists, address payable[] calldata uniqueArtists ) external onlyWhitelistedCreator(masterTokenId, controlTokenArtists.length) { // Can't mint a token with ID 0 anymore require(masterTokenId > 0); // Mint the token that represents ownership of the entire artwork super._safeMint(msg.sender, masterTokenId); // set the token URI for this art super._setTokenURI(masterTokenId, artworkTokenURI); // set the unique artists array for future royalties uniqueTokenCreators[masterTokenId] = uniqueArtists; // iterate through all control token URIs (1 for each control token) for (uint256 i = 0; i < controlTokenArtists.length; i++) { // can't provide burn address as artist require(controlTokenArtists[i] != address(0)); // determine the tokenID for this control token uint256 controlTokenId = masterTokenId + i + 1; // add this control token artist to the unique creator list for that control token uniqueTokenCreators[controlTokenId].push(controlTokenArtists[i]); } } // Bidder functions function bid(uint256 tokenId) external payable { // don't allow bids of 0 require(msg.value > 0); // don't let owners/approved bid on their own tokens require(_isApprovedOrOwner(msg.sender, tokenId) == false); // check if there's a high bid if (pendingBids[tokenId].exists) { // enforce that this bid is higher by at least the minimum required percent increase require( msg.value >= ( pendingBids[tokenId] .amount .mul(minBidIncreasePercent.add(100)) .div(100) ), "Bid must increase by min %" ); // Return bid amount back to bidder safeFundsTransfer( pendingBids[tokenId].bidder, pendingBids[tokenId].amount ); } // set the new highest bid pendingBids[tokenId] = PendingBid(msg.sender, msg.value, true); // Emit event for the bid proposal emit BidProposed(tokenId, msg.value, msg.sender); } // allows an address with a pending bid to withdraw it function withdrawBid(uint256 tokenId) external { // check that there is a bid from the sender to withdraw (also allows platform address to withdraw a bid on someone's behalf) require( (pendingBids[tokenId].bidder == msg.sender) || (msg.sender == platformAddress) ); // attempt to withdraw the bid _withdrawBid(tokenId); } function _withdrawBid(uint256 tokenId) internal { require(pendingBids[tokenId].exists); // Return bid amount back to bidder safeFundsTransfer( pendingBids[tokenId].bidder, pendingBids[tokenId].amount ); // clear highest bid pendingBids[tokenId] = PendingBid(address(0), 0, false); // emit an event when the highest bid is withdrawn emit BidWithdrawn(tokenId); } // Buy the artwork for the currently set price // Allows the buyer to specify an expected remaining uses they'll accept function takeBuyPrice(uint256 tokenId, int256 expectedRemainingUpdates) external payable { // don't let owners/approved buy their own tokens require(_isApprovedOrOwner(msg.sender, tokenId) == false); // get the sale amount uint256 saleAmount = buyPrices[tokenId]; // check that there is a buy price require(saleAmount > 0); // check that the buyer sent exact amount to purchase require(msg.value == saleAmount); // if this is a control token if (controlTokenMapping[tokenId].exists) { // ensure that the remaining uses on the token is equal to what buyer expects require( controlTokenMapping[tokenId].numRemainingUpdates == expectedRemainingUpdates ); } // Return all highest bidder's money if (pendingBids[tokenId].exists) { // Return bid amount back to bidder safeFundsTransfer( pendingBids[tokenId].bidder, pendingBids[tokenId].amount ); // clear highest bid pendingBids[tokenId] = PendingBid(address(0), 0, false); } onTokenSold(tokenId, saleAmount, msg.sender); } // Take an amount and distribute it evenly amongst a list of creator addresses function distributeFundsToCreators( uint256 amount, address payable[] memory creators ) private { if (creators.length > 0) { uint256 creatorShare = amount.div(creators.length); for (uint256 i = 0; i < creators.length; i++) { safeFundsTransfer(creators[i], creatorShare); } } } // When a token is sold via list price or bid. Distributes the sale amount to the unique token creators and transfer // the token to the new owner function onTokenSold( uint256 tokenId, uint256 saleAmount, address to ) private { // if the first sale already happened, then give the artist + platform the secondary royalty percentage if (tokenDidHaveFirstSale[tokenId]) { // give platform its secondary sale percentage uint256 platformAmount; if (platformSecondSalePercentages[tokenId] == 0) { // default amount platformAmount = saleAmount .mul(defaultPlatformSecondSalePercentage) .div(100); } else { platformAmount = saleAmount .mul(platformSecondSalePercentages[tokenId]) .div(100); } safeFundsTransfer(platformAddress, platformAmount); // distribute the creator royalty amongst the creators (all artists involved for a base token, sole artist creator for layer ) uint256 creatorAmount = saleAmount.mul(artistSecondSalePercentage).div(100); distributeFundsToCreators( creatorAmount, uniqueTokenCreators[tokenId] ); // cast the owner to a payable address address payable payableOwner = address(uint160(ownerOf(tokenId))); // transfer the remaining amount to the owner of the token safeFundsTransfer( payableOwner, saleAmount.sub(platformAmount).sub(creatorAmount) ); } else { tokenDidHaveFirstSale[tokenId] = true; // give platform its first sale percentage uint256 platformAmount; if (platformFirstSalePercentages[tokenId] == 0) { // default value platformAmount = saleAmount .mul(defaultPlatformFirstSalePercentage) .div(100); } else { platformAmount = saleAmount .mul(platformFirstSalePercentages[tokenId]) .div(100); } safeFundsTransfer(platformAddress, platformAmount); // this is a token first sale, so distribute the remaining funds to the unique token creators of this token // (if it's a base token it will be all the unique creators, if it's a control token it will be that single artist) distributeFundsToCreators( saleAmount.sub(platformAmount), uniqueTokenCreators[tokenId] ); } // clear highest bid pendingBids[tokenId] = PendingBid(address(0), 0, false); // Transfer token to msg.sender _transferFrom(ownerOf(tokenId), to, tokenId); // Emit event emit TokenSale(tokenId, saleAmount, to); } // Owner functions // Allow owner to accept the highest bid for a token function acceptBid(uint256 tokenId, uint256 minAcceptedAmount) external { // check if sender is owner/approved of token require(_isApprovedOrOwner(msg.sender, tokenId)); // check if there's a bid to accept require(pendingBids[tokenId].exists); // check that the current pending bid amount is at least what the accepting owner expects require(pendingBids[tokenId].amount >= minAcceptedAmount); // process the sale onTokenSold( tokenId, pendingBids[tokenId].amount, pendingBids[tokenId].bidder ); } // Allows owner of a control token to set an immediate buy price. Set to 0 to reset. function makeBuyPrice(uint256 tokenId, uint256 amount) external { // check if sender is owner/approved of token require(_isApprovedOrOwner(msg.sender, tokenId)); // set the buy price buyPrices[tokenId] = amount; // emit event emit BuyPriceSet(tokenId, amount); } // return the number of times that a control token can be used function getNumRemainingControlUpdates(uint256 controlTokenId) external view returns (int256) { require( controlTokenMapping[controlTokenId].isSetup, "Token does not exist." ); return controlTokenMapping[controlTokenId].numRemainingUpdates; } // return the min, max, and current value of a control lever function getControlToken(uint256 controlTokenId) external view returns (int256[] memory) { require( controlTokenMapping[controlTokenId].isSetup, "Token does not exist." ); ControlToken storage controlToken = controlTokenMapping[controlTokenId]; int256[] memory returnValues = new int256[](controlToken.numControlLevers.mul(3)); uint256 returnValIndex = 0; // iterate through all the control levers for this control token for (uint256 i = 0; i < controlToken.numControlLevers; i++) { returnValues[returnValIndex] = controlToken.levers[i].minValue; returnValIndex = returnValIndex.add(1); returnValues[returnValIndex] = controlToken.levers[i].maxValue; returnValIndex = returnValIndex.add(1); returnValues[returnValIndex] = controlToken.levers[i].currentValue; returnValIndex = returnValIndex.add(1); } return returnValues; } // anyone can grant permission to another address to control a specific token on their behalf. Set to Address(0) to reset. function grantControlPermission(uint256 tokenId, address permissioned) external { permissionedControllers[msg.sender][tokenId] = permissioned; emit PermissionUpdated(tokenId, msg.sender, permissioned); } // Allows owner (or permissioned user) of a control token to update its lever values // Optionally accept a payment to increase speed of rendering priority function useControlToken( uint256 controlTokenId, uint256[] calldata leverIds, int256[] calldata newValues ) external payable { // check if sender is owner/approved of token OR if they're a permissioned controller for the token owner require( _isApprovedOrOwner(msg.sender, controlTokenId) || (permissionedControllers[ownerOf(controlTokenId)][ controlTokenId ] == msg.sender), "Owner or permissioned only" ); // check if control exists require( controlTokenMapping[controlTokenId].isSetup, "Token does not exist." ); // get the control token reference ControlToken storage controlToken = controlTokenMapping[controlTokenId]; // check that number of uses for control token is either infinite or is positive require( (controlToken.numRemainingUpdates == -1) || (controlToken.numRemainingUpdates > 0), "No more updates allowed" ); // collect the previous lever values for the event emit below int256[] memory previousValues = new int256[](newValues.length); for (uint256 i = 0; i < leverIds.length; i++) { // get the control lever ControlLever storage lever = controlTokenMapping[controlTokenId].levers[leverIds[i]]; // Enforce that the new value is valid require( (newValues[i] >= lever.minValue) && (newValues[i] <= lever.maxValue), "Invalid val" ); // Enforce that the new value is different require( newValues[i] != lever.currentValue, "Must provide different val" ); // grab previous value for the event emit previousValues[i] = lever.currentValue; // Update token current value lever.currentValue = newValues[i]; } // if there's a payment then send it to the platform (for higher priority updates) if (msg.value > 0) { safeFundsTransfer(platformAddress, msg.value); } // if this control token is finite in its uses if (controlToken.numRemainingUpdates > 0) { // decrease it down by 1 controlToken.numRemainingUpdates = controlToken.numRemainingUpdates - 1; // since we used one of those updates, withdraw any existing bid for this token if exists if (pendingBids[controlTokenId].exists) { _withdrawBid(controlTokenId); } } // emit event emit ControlLeverUpdated( controlTokenId, msg.value, controlToken.numRemainingUpdates, leverIds, previousValues, newValues ); } // Allows a user to withdraw all failed transaction credits function withdrawAllFailedCredits() external { uint256 amount = failedTransferCredits[msg.sender]; require(amount != 0); require(address(this).balance >= amount); failedTransferCredits[msg.sender] = 0; (bool successfulWithdraw, ) = msg.sender.call.value(amount)(""); require(successfulWithdraw); } // Safely transfer funds and if fail then store that amount as credits for a later pull function safeFundsTransfer(address payable recipient, uint256 amount) internal { // attempt to send the funds to the recipient (bool success, ) = recipient.call.value(amount).gas(2300)(""); // if it failed, update their credit balance so they can pull it later if (success == false) { failedTransferCredits[recipient] = failedTransferCredits[recipient] .add(amount); } } // override the default transfer function _transferFrom( address from, address to, uint256 tokenId ) internal { // clear a buy now price buyPrices[tokenId] = 0; // transfer the token super._transferFrom(from, to, tokenId); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"artistSecondPercentage","type":"uint256"}],"name":"ArtistSecondSalePercentUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"bidAmount","type":"uint256"},{"indexed":false,"internalType":"address","name":"bidder","type":"address"}],"name":"BidProposed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"BidWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"}],"name":"BuyPriceSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"priorityTip","type":"uint256"},{"indexed":false,"internalType":"int256","name":"numRemainingUpdates","type":"int256"},{"indexed":false,"internalType":"uint256[]","name":"leverIds","type":"uint256[]"},{"indexed":false,"internalType":"int256[]","name":"previousValues","type":"int256[]"},{"indexed":false,"internalType":"int256[]","name":"updatedValues","type":"int256[]"}],"name":"ControlLeverUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"layerCount","type":"uint256"},{"indexed":false,"internalType":"address","name":"creator","type":"address"}],"name":"CreatorWhitelisted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"defaultPlatformFirstSalePercentage","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"defaultPlatformSecondSalePercentage","type":"uint256"}],"name":"DefaultPlatformSalePercentageUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"FirstSaleWaived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"address","name":"tokenOwner","type":"address"},{"indexed":false,"internalType":"address","name":"permissioned","type":"address"}],"name":"PermissionUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"platformAddress","type":"address"}],"name":"PlatformAddressUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"platformFirstPercentage","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"platformSecondPercentage","type":"uint256"}],"name":"PlatformSalePercentageUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"salePrice","type":"uint256"},{"indexed":false,"internalType":"address","name":"buyer","type":"address"}],"name":"TokenSale","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"constant":false,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"minAcceptedAmount","type":"uint256"}],"name":"acceptBid","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"artistSecondSalePercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"bid","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"buyPrices","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"controlTokenMapping","outputs":[{"internalType":"uint256","name":"numControlLevers","type":"uint256"},{"internalType":"int256","name":"numRemainingUpdates","type":"int256"},{"internalType":"bool","name":"exists","type":"bool"},{"internalType":"bool","name":"isSetup","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"creatorWhitelist","outputs":[{"internalType":"address","name":"creator","type":"address"},{"internalType":"uint256","name":"layerCount","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"defaultPlatformFirstSalePercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"defaultPlatformSecondSalePercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"expectedTokenSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"failedTransferCredits","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"controlTokenId","type":"uint256"}],"name":"getControlToken","outputs":[{"internalType":"int256[]","name":"","type":"int256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"controlTokenId","type":"uint256"}],"name":"getNumRemainingControlUpdates","outputs":[{"internalType":"int256","name":"","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"permissioned","type":"address"}],"name":"grantControlPermission","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"}],"name":"initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"lockTokenURI","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"makeBuyPrice","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"minBidIncreasePercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"masterTokenId","type":"uint256"},{"internalType":"string","name":"artworkTokenURI","type":"string"},{"internalType":"address payable[]","name":"controlTokenArtists","type":"address[]"},{"internalType":"address payable[]","name":"uniqueArtists","type":"address[]"}],"name":"mintArtwork","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"minterAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"pendingBids","outputs":[{"internalType":"address payable","name":"bidder","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"exists","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"permissionedControllers","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"platformAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"platformFirstSalePercentages","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"platformSecondSalePercentages","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"newExpectedTokenSupply","type":"uint256"}],"name":"setExpectedTokenSupply","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint256","name":"initialExpectedTokenSupply","type":"uint256"},{"internalType":"address","name":"_upgraderAddress","type":"address"}],"name":"setup","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"controlTokenId","type":"uint256"},{"internalType":"string","name":"controlTokenURI","type":"string"},{"internalType":"int256[]","name":"leverMinValues","type":"int256[]"},{"internalType":"int256[]","name":"leverMaxValues","type":"int256[]"},{"internalType":"int256[]","name":"leverStartValues","type":"int256[]"},{"internalType":"int256","name":"numAllowedUpdates","type":"int256"},{"internalType":"address payable[]","name":"additionalCollaborators","type":"address[]"}],"name":"setupControlToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"int256","name":"expectedRemainingUpdates","type":"int256"}],"name":"takeBuyPrice","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenDidHaveFirstSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenURILocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"uniqueTokenCreators","outputs":[{"internalType":"address payable","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_artistSecondSalePercentage","type":"uint256"}],"name":"updateArtistSecondSalePercentage","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_defaultPlatformFirstSalePercentage","type":"uint256"},{"internalType":"uint256","name":"_defaultPlatformSecondSalePercentage","type":"uint256"}],"name":"updateDefaultPlatformSalePercentage","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_minBidIncreasePercent","type":"uint256"}],"name":"updateMinimumBidIncreasePercent","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newMinterAddress","type":"address"}],"name":"updateMinterAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address payable","name":"newPlatformAddress","type":"address"}],"name":"updatePlatformAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"platformFirstSalePercentage","type":"uint256"},{"internalType":"uint256","name":"platformSecondSalePercentage","type":"uint256"}],"name":"updatePlatformSalePercentage","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"tokenURI","type":"string"}],"name":"updateTokenURI","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"v1Address","type":"address"},{"internalType":"bool","name":"isControlToken","type":"bool"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"platformFirstPercentageForToken","type":"uint256"},{"internalType":"uint256","name":"platformSecondPercentageForToken","type":"uint256"},{"internalType":"bool","name":"hasTokenHadFirstSale","type":"bool"},{"internalType":"address payable[]","name":"uniqueTokenCreatorsForToken","type":"address[]"}],"name":"upgradeV1Token","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"upgraderAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"controlTokenId","type":"uint256"},{"internalType":"uint256[]","name":"leverIds","type":"uint256[]"},{"internalType":"int256[]","name":"newValues","type":"int256[]"}],"name":"useControlToken","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"waiveFirstSaleRequirement","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"creator","type":"address"},{"internalType":"uint256","name":"masterTokenId","type":"uint256"},{"internalType":"uint256","name":"layerCount","type":"uint256"},{"internalType":"uint256","name":"platformFirstSalePercentage","type":"uint256"},{"internalType":"uint256","name":"platformSecondSalePercentage","type":"uint256"}],"name":"whitelistTokenForCreator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"withdrawAllFailedCredits","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"withdrawBid","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405261552f806100136000396000f3fe6080604052600436106103ad5760003560e01c8063755db7b3116101e7578063b9bf52fa1161010d578063cf8589b9116100a0578063e6e5113b1161006f578063e6e5113b14611406578063e985e9c51461143c578063ef8a85c814611477578063f83036f0146114a7576103ad565b8063cf8589b914611322578063d91c070c14611376578063dbe55e56146113a6578063e50d48f1146113bb576103ad565b8063c87b56dd116100dc578063c87b56dd14611166578063c9340db914611190578063ca4137c3146111c9578063cd2a16ba1461130d576103ad565b8063b9bf52fa146110c5578063ba56f39314611112578063bab2d1111461113c578063c254e2d414611151576103ad565b80638f9f193f11610185578063a90d6de311610154578063a90d6de314610f85578063a94141a114610faf578063b6ad691414610fdf578063b88d4fde14610ff4576103ad565b80638f9f193f14610e8857806395d89b4114610ebb57806396bc50b014610ed0578063a22cb46514610f4a576103ad565b80638129fc1c116101c15780638129fc1c14610e0a5780638311cd3514610e1f578063892918d414610e345780638e2a9bb014610e5e576103ad565b8063755db7b314610c7857806376012bea14610d3d5780637a718d7114610d8f576103ad565b80632fcfb95a116102d75780634f6ccce71161026a5780635f959c58116102395780635f959c5814610bdc5780636352211e14610bf157806370a0823114610c1b578063734f851e14610c4e576103ad565b80634f6ccce714610a48578063556d862814610a725780635a58226014610a875780635d0a5d9a14610aba576103ad565b806345c0c502116102a657806345c0c50214610894578063462399cd146108be5780634cd88b76146108e85780634dfa810314610a1e576103ad565b80632fcfb95a146107ec57806334d722c91461081f57806342842e0e14610834578063454a2ab314610877576103ad565b8063117cbf1e1161034f5780631b59e3451161031e5780631b59e3451461069557806323b872dd1461074d5780632d4fbf83146107905780632f745c59146107b3576103ad565b8063117cbf1e14610598578063148abbae146105c257806318160ddd146105fe57806318e97fd114610613576103ad565b8063081812fc1161038b578063081812fc146104b6578063095ea7b3146104fc5780630a29bb37146105355780630eaaf4c81461056e576103ad565b806301ffc9a7146103b257806302e9d5e4146103fa57806306fdde031461042c575b600080fd5b3480156103be57600080fd5b506103e6600480360360208110156103d557600080fd5b50356001600160e01b03191661166d565b604080519115158252519081900360200190f35b34801561040657600080fd5b5061042a6004803603604081101561041d57600080fd5b508035906020013561168c565b005b34801561043857600080fd5b5061044161170b565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561047b578181015183820152602001610463565b50505050905090810190601f1680156104a85780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156104c257600080fd5b506104e0600480360360208110156104d957600080fd5b50356117a2565b604080516001600160a01b039092168252519081900360200190f35b34801561050857600080fd5b5061042a6004803603604081101561051f57600080fd5b506001600160a01b038135169060200135611804565b34801561054157600080fd5b5061042a6004803603604081101561055857600080fd5b50803590602001356001600160a01b031661192c565b34801561057a57600080fd5b5061042a6004803603602081101561059157600080fd5b50356119a7565b3480156105a457600080fd5b5061042a600480360360208110156105bb57600080fd5b50356119ed565b3480156105ce57600080fd5b506105ec600480360360208110156105e557600080fd5b5035611a57565b60408051918252519081900360200190f35b34801561060a57600080fd5b506105ec611a6a565b34801561061f57600080fd5b5061042a6004803603604081101561063657600080fd5b81359190810190604081016020820135600160201b81111561065757600080fd5b82018360208201111561066957600080fd5b803590602001918460018302840111600160201b8311171561068a57600080fd5b509092509050611a70565b3480156106a157600080fd5b5061042a60048036036101008110156106b957600080fd5b8135916001600160a01b036020820135811692604083013515159260608101359092169160808101359160a08201359160c0810135151591810190610100810160e0820135600160201b81111561070f57600080fd5b82018360208201111561072157600080fd5b803590602001918460208302840111600160201b8311171561074257600080fd5b509092509050611afc565b34801561075957600080fd5b5061042a6004803603606081101561077057600080fd5b506001600160a01b0381358116916020810135909116906040013561203d565b61042a600480360360408110156107a657600080fd5b5080359060200135612094565b3480156107bf57600080fd5b506105ec600480360360408110156107d657600080fd5b506001600160a01b0381351690602001356121bb565b3480156107f857600080fd5b5061042a6004803603602081101561080f57600080fd5b50356001600160a01b031661223b565b34801561082b57600080fd5b506104e0612276565b34801561084057600080fd5b5061042a6004803603606081101561085757600080fd5b506001600160a01b03813581169160208101359091169060400135612286565b61042a6004803603602081101561088d57600080fd5b50356122a1565b3480156108a057600080fd5b5061042a600480360360208110156108b757600080fd5b5035612447565b3480156108ca57600080fd5b506103e6600480360360208110156108e157600080fd5b503561248d565b3480156108f457600080fd5b5061042a6004803603604081101561090b57600080fd5b810190602081018135600160201b81111561092557600080fd5b82018360208201111561093757600080fd5b803590602001918460018302840111600160201b8311171561095857600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b8111156109aa57600080fd5b8201836020820111156109bc57600080fd5b803590602001918460018302840111600160201b831117156109dd57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506124a3945050505050565b348015610a2a57600080fd5b506105ec60048036036020811015610a4157600080fd5b503561258f565b348015610a5457600080fd5b506105ec60048036036020811015610a6b57600080fd5b50356125a2565b348015610a7e57600080fd5b506105ec612608565b348015610a9357600080fd5b506105ec60048036036020811015610aaa57600080fd5b50356001600160a01b031661260f565b348015610ac657600080fd5b5061042a60048036036080811015610add57600080fd5b81359190810190604081016020820135600160201b811115610afe57600080fd5b820183602082011115610b1057600080fd5b803590602001918460018302840111600160201b83111715610b3157600080fd5b919390929091602081019035600160201b811115610b4e57600080fd5b820183602082011115610b6057600080fd5b803590602001918460208302840111600160201b83111715610b8157600080fd5b919390929091602081019035600160201b811115610b9e57600080fd5b820183602082011115610bb057600080fd5b803590602001918460208302840111600160201b83111715610bd157600080fd5b509092509050612622565b348015610be857600080fd5b506105ec612780565b348015610bfd57600080fd5b506104e060048036036020811015610c1457600080fd5b5035612787565b348015610c2757600080fd5b506105ec60048036036020811015610c3e57600080fd5b50356001600160a01b03166127db565b348015610c5a57600080fd5b506103e660048036036020811015610c7157600080fd5b5035612843565b61042a60048036036060811015610c8e57600080fd5b81359190810190604081016020820135600160201b811115610caf57600080fd5b820183602082011115610cc157600080fd5b803590602001918460208302840111600160201b83111715610ce257600080fd5b919390929091602081019035600160201b811115610cff57600080fd5b820183602082011115610d1157600080fd5b803590602001918460208302840111600160201b83111715610d3257600080fd5b509092509050612859565b348015610d4957600080fd5b50610d6760048036036020811015610d6057600080fd5b5035612cc7565b6040805194855260208501939093529015158383015215156060830152519081900360800190f35b348015610d9b57600080fd5b5061042a60048036036020811015610db257600080fd5b810190602081018135600160201b811115610dcc57600080fd5b820183602082011115610dde57600080fd5b803590602001918460208302840111600160201b83111715610dff57600080fd5b509092509050612cf5565b348015610e1657600080fd5b5061042a612dc3565b348015610e2b57600080fd5b506105ec612e85565b348015610e4057600080fd5b5061042a60048036036020811015610e5757600080fd5b5035612e8c565b348015610e6a57600080fd5b506105ec60048036036020811015610e8157600080fd5b5035612eaa565b348015610e9457600080fd5b5061042a60048036036020811015610eab57600080fd5b50356001600160a01b0316612f25565b348015610ec757600080fd5b50610441612f92565b348015610edc57600080fd5b50610efa60048036036020811015610ef357600080fd5b5035612ff3565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610f36578181015183820152602001610f1e565b505050509050019250505060405180910390f35b348015610f5657600080fd5b5061042a60048036036040811015610f6d57600080fd5b506001600160a01b038135169060200135151561318d565b348015610f9157600080fd5b506105ec60048036036020811015610fa857600080fd5b5035613292565b348015610fbb57600080fd5b506104e060048036036040811015610fd257600080fd5b50803590602001356132a5565b348015610feb57600080fd5b5061042a6132db565b34801561100057600080fd5b5061042a6004803603608081101561101757600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b81111561105157600080fd5b82018360208201111561106357600080fd5b803590602001918460018302840111600160201b8311171561108457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550613369945050505050565b3480156110d157600080fd5b506110ef600480360360208110156110e857600080fd5b50356133c7565b604080516001600160a01b03909316835260208301919091528051918290030190f35b34801561111e57600080fd5b5061042a6004803603602081101561113557600080fd5b50356133ed565b34801561114857600080fd5b506105ec613441565b34801561115d57600080fd5b506104e0613448565b34801561117257600080fd5b506104416004803603602081101561118957600080fd5b5035613458565b34801561119c57600080fd5b506104e0600480360360408110156111b357600080fd5b506001600160a01b03813516906020013561353d565b3480156111d557600080fd5b5061042a600480360360808110156111ec57600080fd5b810190602081018135600160201b81111561120657600080fd5b82018360208201111561121857600080fd5b803590602001918460018302840111600160201b8311171561123957600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b81111561128b57600080fd5b82018360208201111561129d57600080fd5b803590602001918460018302840111600160201b831117156112be57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955050823593505050602001356001600160a01b0316613564565b34801561131957600080fd5b506105ec61366b565b34801561132e57600080fd5b5061134c6004803603602081101561134557600080fd5b5035613672565b604080516001600160a01b0390941684526020840192909252151582820152519081900360600190f35b34801561138257600080fd5b5061042a6004803603604081101561139957600080fd5b50803590602001356136a1565b3480156113b257600080fd5b506104e0613706565b3480156113c757600080fd5b5061042a600480360360a08110156113de57600080fd5b506001600160a01b038135169060208101359060408101359060608101359060800135613716565b34801561141257600080fd5b5061042a6004803603606081101561142957600080fd5b508035906020810135906040013561380f565b34801561144857600080fd5b506103e66004803603604081101561145f57600080fd5b506001600160a01b038135811691602001351661388a565b34801561148357600080fd5b5061042a6004803603604081101561149a57600080fd5b50803590602001356138b8565b3480156114b357600080fd5b5061042a600480360360e08110156114ca57600080fd5b81359190810190604081016020820135600160201b8111156114eb57600080fd5b8201836020820111156114fd57600080fd5b803590602001918460018302840111600160201b8311171561151e57600080fd5b919390929091602081019035600160201b81111561153b57600080fd5b82018360208201111561154d57600080fd5b803590602001918460208302840111600160201b8311171561156e57600080fd5b919390929091602081019035600160201b81111561158b57600080fd5b82018360208201111561159d57600080fd5b803590602001918460208302840111600160201b831117156115be57600080fd5b919390929091602081019035600160201b8111156115db57600080fd5b8201836020820111156115ed57600080fd5b803590602001918460208302840111600160201b8311171561160e57600080fd5b91939092823592604081019060200135600160201b81111561162f57600080fd5b82018360208201111561164157600080fd5b803590602001918460208302840111600160201b8311171561166257600080fd5b50909250905061391b565b6001600160e01b03191660009081526033602052604090205460ff1690565b6116963383613ed2565b61169f57600080fd5b600082815261010f602052604090206002015460ff166116be57600080fd5b600082815261010f60205260409020600101548111156116dd57600080fd5b600082815261010f60205260409020600181015490546117079184916001600160a01b0316613f76565b5050565b60d28054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156117975780601f1061176c57610100808354040283529160200191611797565b820191906000526020600020905b81548152906001019060200180831161177a57829003601f168201915b505050505090505b90565b60006117ad8261429f565b6117e85760405162461bcd60e51b815260040180806020018281038252602c81526020018061539f602c913960400191505060405180910390fd5b506000908152606760205260409020546001600160a01b031690565b600061180f82612787565b9050806001600160a01b0316836001600160a01b031614156118625760405162461bcd60e51b815260040180806020018281038252602181526020018061547d6021913960400191505060405180910390fd5b806001600160a01b03166118746142bc565b6001600160a01b031614806118955750611895816118906142bc565b61388a565b6118d05760405162461bcd60e51b81526004018080602001828103825260388152602001806152f36038913960400191505060405180910390fd5b60008281526067602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b3360008181526101116020908152604080832086845282529182902080546001600160a01b0386166001600160a01b0319909116811790915582518681529182019390935280820192909252517fae354774f370b4f427b85313cddf00365498115aed2003da8f942b64c2c0595d9181900360600190a15050565b600081815261010f60205260409020546001600160a01b03163314806119d85750610115546001600160a01b031633145b6119e157600080fd5b6119ea816142c0565b50565b610115546001600160a01b03163314611a0557600080fd5b600081118015611a16575060328111155b611a515760405162461bcd60e51b81526004018080602001828103825260228152602001806152d16022913960400191505060405180910390fd5b61011455565b61010b6020526000908152604090205481565b609e5490565b610115546001600160a01b03163314611a8857600080fd5b611a918361429f565b611a9a57600080fd5b6000838152610108602052604090205460ff1615611ab757600080fd5b611af78383838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061439f92505050565b505050565b6101165488906001600160a01b03163314611b5e576040805162461bcd60e51b815260206004820152601760248201527f4f6e6c792075706772616465722063616e2063616c6c2e000000000000000000604482015290519081900360640190fd5b60008a815261010e60205260409020611b789084846150e4565b508715611ebb576060816001600160a01b03166396bc50b08c6040518263ffffffff1660e01b81526004018082815260200191505060006040518083038186803b158015611bc557600080fd5b505afa158015611bd9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015611c0257600080fd5b8101908080516040519392919084600160201b821115611c2157600080fd5b908301906020820185811115611c3657600080fd5b82518660208202830111600160201b82111715611c5257600080fd5b82525081516020918201928201910280838360005b83811015611c7f578181015183820152602001611c67565b5050505090500160405250505090506003815181611c9957fe5b0615611ce5576040805162461bcd60e51b815260206004820152601660248201527524b73b30b634b21031b7b73a3937b6103a37b5b2b71760511b604482015290519081900360640190fd5b6000815111611d3b576040805162461bcd60e51b815260206004820152601e60248201527f436f6e74726f6c20746f6b656e206d7573742068617665206c65766572730000604482015290519081900360640190fd5b60405180608001604052806003835181611d5157fe5b04815260200160001981526020016001151581526020016001151581525061011060008d8152602001908152602001600020600082015181600001556020820151816001015560408201518160020160006101000a81548160ff02191690831515021790555060608201518160020160016101000a81548160ff02191690831515021790555090505060008090505b8151811015611eb8576040518060800160405280838381518110611e0057fe5b60200260200101518152602001838360010181518110611e1c57fe5b60200260200101518152602001838360020181518110611e3857fe5b602002602001015181526020016001151581525061011060008e8152602001908152602001600020600301600060038481611e6f57fe5b04815260208082019290925260409081016000208351815591830151600183015582015160028201556060909101516003918201805460ff191691151591909117905501611de0565b50505b60008a815261010b6020908152604080832089905561010c82528083208890556101079091529020805460ff1916851515179055611ef9878b614402565b6120318a826001600160a01b031663c87b56dd8d6040518263ffffffff1660e01b81526004018082815260200191505060006040518083038186803b158015611f4157600080fd5b505afa158015611f55573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015611f7e57600080fd5b8101908080516040519392919084600160201b821115611f9d57600080fd5b908301906020820185811115611fb257600080fd5b8251600160201b811182820188101715611fcb57600080fd5b82525081516020918201929091019080838360005b83811015611ff8578181015183820152602001611fe0565b50505050905090810190601f1680156120255780820380516001836020036101000a031916815260200191505b5060405250505061439f565b50505050505050505050565b61204e6120486142bc565b82613ed2565b6120895760405162461bcd60e51b815260040180806020018281038252603181526020018061549e6031913960400191505060405180910390fd5b611af783838361441c565b61209e3383613ed2565b156120a857600080fd5b60008281526101096020526040902054806120c257600080fd5b8034146120ce57600080fd5b6000838152610110602052604090206002015460ff16156121075760008381526101106020526040902060010154821461210757600080fd5b600083815261010f602052604090206002015460ff16156121b057600083815261010f60205260409020805460019091015461214c916001600160a01b031690614437565b604080516060810182526000808252602080830182815283850183815288845261010f90925293909120915182546001600160a01b0319166001600160a01b039091161782559151600182015590516002909101805460ff19169115159190911790555b611af7838233613f76565b60006121c6836127db565b82106122035760405162461bcd60e51b815260040180806020018281038252602b815260200180615224602b913960400191505060405180910390fd5b6001600160a01b0383166000908152609c6020526040902080548390811061222757fe5b906000526020600020015490505b92915050565b610115546001600160a01b0316331461225357600080fd5b61011780546001600160a01b0319166001600160a01b0392909216919091179055565b610117546001600160a01b031681565b611af783838360405180602001604052806000815250613369565b600034116122ae57600080fd5b6122b83382613ed2565b156122c257600080fd5b600081815261010f602052604090206002015460ff16156123a557612327606461231b6122fc6064610114546144df90919063ffffffff16565b600085815261010f60205260409020600101549063ffffffff61454016565b9063ffffffff61459916565b34101561237b576040805162461bcd60e51b815260206004820152601a60248201527f426964206d75737420696e637265617365206279206d696e2025000000000000604482015290519081900360640190fd5b600081815261010f6020526040902080546001909101546123a5916001600160a01b031690614437565b604080516060808201835233808352346020808501828152600186880181815260008a815261010f8552899020975188546001600160a01b0319166001600160a01b03909116178855915190870155516002909501805460ff1916951515959095179094558451868152938401528284015291517fcbf61548a249040d379a7f7a4486a18d78824bce978077f4943fb55e111af1c1929181900390910190a150565b610115546001600160a01b0316331461245f57600080fd5b6124688161429f565b61247157600080fd5b600090815261010860205260409020805460ff19166001179055565b6101076020526000908152604090205460ff1681565b600054610100900460ff16806124bc57506124bc6145db565b806124ca575060005460ff16155b6125055760405162461bcd60e51b815260040180806020018281038252602e8152602001806153f7602e913960400191505060405180910390fd5b600054610100900460ff16158015612530576000805460ff1961ff0019909116610100171660011790555b6125386145e1565b61254157600080fd5b82516125549060d2906020860190615147565b5081516125689060d3906020850190615147565b50612579635b5e139f60e01b6145f8565b8015611af7576000805461ff0019169055505050565b61010c6020526000908152604090205481565b60006125ac611a6a565b82106125e95760405162461bcd60e51b815260040180806020018281038252602c8152602001806154cf602c913960400191505060405180910390fd5b609e82815481106125f657fe5b90600052602060002001549050919050565b6101135481565b61010a6020526000908152604090205481565b600087815261010d6020526040902054879084906001600160a01b0316331461264a57600080fd5b600082815261010d6020526040902060010154811461266857600080fd5b6000891161267557600080fd5b61267f338a614402565b6126bf8989898080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061439f92505050565b600089815261010e602052604090206126d99085856150e4565b5060005b858110156120315760008787838181106126f357fe5b905060200201356001600160a01b03166001600160a01b0316141561271757600080fd5b60018a820101600081815261010e6020526040902088888481811061273857fe5b835460018181018655600095865260209586902090910180546001600160a01b0319166001600160a01b039690930294909401359490941617909155509190910190506126dd565b6101185481565b6000818152606660205260408120546001600160a01b0316806122355760405162461bcd60e51b81526004018080602001828103825260298152602001806153556029913960400191505060405180910390fd5b60006001600160a01b0382166128225760405162461bcd60e51b815260040180806020018281038252602a81526020018061532b602a913960400191505060405180910390fd5b6001600160a01b03821660009081526068602052604090206122359061467c565b6101086020526000908152604090205460ff1681565b6128633386613ed2565b806128a4575033610111600061287888612787565b6001600160a01b039081168252602080830193909352604091820160009081208a825290935291205416145b6128f5576040805162461bcd60e51b815260206004820152601a60248201527f4f776e6572206f72207065726d697373696f6e6564206f6e6c79000000000000604482015290519081900360640190fd5b60008581526101106020526040902060020154610100900460ff16612959576040805162461bcd60e51b81526020600482015260156024820152742a37b5b2b7103237b2b9903737ba1032bc34b9ba1760591b604482015290519081900360640190fd5b60008581526101106020526040902060018101546000191480612980575060008160010154135b6129d1576040805162461bcd60e51b815260206004820152601760248201527f4e6f206d6f7265207570646174657320616c6c6f776564000000000000000000604482015290519081900360640190fd5b6040805183815260208085028201019091526060908380156129fd578160200160208202803883390190505b50905060005b85811015612b6a5760008881526101106020526040812060030181898985818110612a2a57fe5b90506020020135815260200190815260200160002090508060000154868684818110612a5257fe5b9050602002013512158015612a7d57508060010154868684818110612a7357fe5b9050602002013513155b612abc576040805162461bcd60e51b815260206004820152600b60248201526a125b9d985b1a59081d985b60aa1b604482015290519081900360640190fd5b8060020154868684818110612acd57fe5b905060200201351415612b27576040805162461bcd60e51b815260206004820152601a60248201527f4d7573742070726f7669646520646966666572656e742076616c000000000000604482015290519081900360640190fd5b8060020154838381518110612b3857fe5b602002602001018181525050858583818110612b5057fe5b602002919091013560029092019190915550600101612a03565b503415612b885761011554612b88906001600160a01b031634614437565b600082600101541315612bc557600182018054600019019055600087815261010f602052604090206002015460ff1615612bc557612bc5876142c0565b7ffc1e08f776282b1abf0734388c9042ad8206984bf5d69a721d120c9af38412fc873484600101548989868a8a6040518089815260200188815260200187815260200180602001806020018060200184810384528989828181526020019250602002808284376000838201819052601f909101601f19169092018681038552895181528951602091820193828c0193509102908190849084905b83811015612c77578181015183820152602001612c5f565b505050509050018481038252868682818152602001925060200280828437600083820152604051601f909101601f19169092018290039d50909b505050505050505050505050a150505050505050565b6101106020526000908152604090208054600182015460029092015490919060ff8082169161010090041684565b610115546001600160a01b03163314612d0d57600080fd5b60005b81811015612d5b5760016101076000858585818110612d2b57fe5b60209081029290920135835250810191909152604001600020805460ff1916911515919091179055600101612d10565b507fd1987e98d3ff0b4813b1fd1dd1cf7c12f2edfbc595c5d8b7cc9e9a97e76ef09b828260405180806020018281038252848482818152602001925060200280828437600083820152604051601f909101601f19169092018290039550909350505050a15050565b600054610100900460ff1680612ddc5750612ddc6145db565b80612dea575060005460ff16155b612e255760405162461bcd60e51b815260040180806020018281038252602e8152602001806153f7602e913960400191505060405180910390fd5b600054610100900460ff16158015612e50576000805460ff1961ff0019909116610100171660011790555b612e586145e1565b612e6157600080fd5b612e7163780e9d6360e01b6145f8565b80156119ea576000805461ff001916905550565b6101195481565b610115546001600160a01b03163314612ea457600080fd5b61011355565b60008181526101106020526040812060020154610100900460ff16612f0e576040805162461bcd60e51b81526020600482015260156024820152742a37b5b2b7103237b2b9903737ba1032bc34b9ba1760591b604482015290519081900360640190fd5b506000908152610110602052604090206001015490565b610115546001600160a01b03163314612f3d57600080fd5b61011580546001600160a01b0383166001600160a01b0319909116811790915560408051918252517fb29030287f33baad1941013143d2e1bd5e66c87318f0bd99bc0fae51fe4b191f9181900360200190a150565b60d38054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156117975780601f1061176c57610100808354040283529160200191611797565b60008181526101106020526040902060020154606090610100900460ff1661305a576040805162461bcd60e51b81526020600482015260156024820152742a37b5b2b7103237b2b9903737ba1032bc34b9ba1760591b604482015290519081900360640190fd5b600082815261011060205260409020805460609061307f90600363ffffffff61454016565b6040519080825280602002602001820160405280156130a8578160200160208202803883390190505b5090506000805b835481101561318357600081815260038501602052604090205483518490849081106130d757fe5b60209081029190910101526130f382600163ffffffff6144df16565b91508360030160008281526020019081526020016000206001015483838151811061311a57fe5b602090810291909101015261313682600163ffffffff6144df16565b91508360030160008281526020019081526020016000206002015483838151811061315d57fe5b602090810291909101015261317982600163ffffffff6144df16565b91506001016130af565b5090949350505050565b6131956142bc565b6001600160a01b0316826001600160a01b031614156131fb576040805162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015290519081900360640190fd5b80606960006132086142bc565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff19169215159290921790915561324c6142bc565b60408051841515815290516001600160a01b0392909216917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319181900360200190a35050565b6101096020526000908152604090205481565b61010e60205281600052604060002081815481106132bf57fe5b6000918252602090912001546001600160a01b03169150829050565b33600090815261010a6020526040902054806132f657600080fd5b303181111561330457600080fd5b33600081815261010a60205260408082208290555190919083908381818185875af1925050503d8060008114613356576040519150601f19603f3d011682016040523d82523d6000602084013e61335b565b606091505b505090508061170757600080fd5b61337a6133746142bc565b83613ed2565b6133b55760405162461bcd60e51b815260040180806020018281038252603181526020018061549e6031913960400191505060405180910390fd5b6133c184848484614680565b50505050565b61010d60205260009081526040902080546001909101546001600160a01b039091169082565b610115546001600160a01b0316331461340557600080fd5b6101128190556040805182815290517fef33c3f1a71083323b686236e793a53bef4c884ab48f63838d7e6fe9f431e6859181900360200190a150565b6101125481565b610116546001600160a01b031681565b60606134638261429f565b61349e5760405162461bcd60e51b815260040180806020018281038252602f81526020018061544e602f913960400191505060405180910390fd5b600082815260d4602090815260409182902080548351601f6002600019610100600186161502019093169290920491820184900484028101840190945280845290918301828280156135315780601f1061350657610100808354040283529160200191613531565b820191906000526020600020905b81548152906001019060200180831161351457829003601f168201915b50505050509050919050565b6101116020908152600092835260408084209091529082529020546001600160a01b031681565b600054610100900460ff168061357d575061357d6145db565b8061358b575060005460ff16155b6135c65760405162461bcd60e51b815260040180806020018281038252602e8152602001806153f7602e913960400191505060405180910390fd5b600054610100900460ff161580156135f1576000805460ff1961ff0019909116610100171660011790555b6135f96146d2565b613601612dc3565b61360b85856124a3565b600a610112556001610114556101158054336001600160a01b03199182161790915561011680549091166001600160a01b0384161790556101138390558261365257600080fd5b8015613664576000805461ff00191690555b5050505050565b6101145481565b61010f602052600090815260409020805460018201546002909201546001600160a01b03909116919060ff1683565b6136ab3383613ed2565b6136b457600080fd5b60008281526101096020908152604091829020839055815184815290810183905281517fd765eb1cf8aab1a01381fef8dcc9f755ef2d2233849716da96a90e32da84821a929181900390910190a15050565b610115546001600160a01b031681565b610117546001600160a01b0316331461372e57600080fd5b61011354841461373d57600080fd5b6040805180820182526001600160a01b0387811682526020808301878152600089815261010d909252939020915182546001600160a01b0319169116178155905160019182015561379e9061379286866144df565b9063ffffffff6144df16565b61011355600084815261010b6020908152604080832085905561010c82529182902083905581518681529081018590526001600160a01b0387168183015290517f810b7d5e84bcfa3571edbe371ec7fe87f728a2a0d5269e03f3a7ca7ff7f9c3839181900360600190a15050505050565b610115546001600160a01b0316331461382757600080fd5b600083815261010b6020908152604080832085905561010c825291829020839055815185815290810184905280820183905290517fb38317f49b7617179fc92dd57fc71e8c50aad2ab7616736f00e83944a45ca3049181900360600190a1505050565b6001600160a01b03918216600090815260696020908152604080832093909416825291909152205460ff1690565b610115546001600160a01b031633146138d057600080fd5b610118829055610119819055604080518381526020810183905281517fba416d815f76bda1a8c69d8accb121d716340736c5b764c504add4d006b5d276929181900390910190a15050565b6101f4881115613972576040805162461bcd60e51b815260206004820152601860248201527f546f6f206d616e7920636f6e74726f6c206c65766572732e0000000000000000604482015290519081900360640190fd5b60328111156139c8576040805162461bcd60e51b815260206004820152601760248201527f546f6f206d616e7920636f6c6c61626f7261746f72732e000000000000000000604482015290519081900360640190fd5b60008c81526101106020526040902060020154610100900460ff1615613a25576040805162461bcd60e51b815260206004820152600d60248201526c0416c726561647920736574757609c1b604482015290519081900360640190fd5b60008c815261010e602052604081208054339290613a3f57fe5b6000918252602090912001546001600160a01b031614613aa6576040805162461bcd60e51b815260206004820152601c60248201527f4d75737420626520636f6e74726f6c20746f6b656e2061727469737400000000604482015290519081900360640190fd5b8786148015613ab457508584145b613afd576040805162461bcd60e51b81526020600482015260156024820152740acc2d8eacae640c2e4e4c2f240dad2e6dac2e8c6d605b1b604482015290519081900360640190fd5b826000191480613b0d5750600083135b613b5e576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420616c6c6f7765642075706461746573000000000000000000604482015290519081900360640190fd5b613b68338d614402565b613ba88c8c8c8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061439f92505050565b60405180608001604052808686905081526020018481526020016001151581526020016001151581525061011060008e8152602001908152602001600020600082015181600001556020820151816001015560408201518160020160006101000a81548160ff02191690831515021790555060608201518160020160016101000a81548160ff02191690831515021790555090505060008090505b84811015613e2757898982818110613c5757fe5b90506020020135888883818110613c6a57fe5b905060200201351215613cba576040805162461bcd60e51b815260206004820152601360248201527226b0bc103b30b61036bab9ba101f1e9036b4b760691b604482015290519081900360640190fd5b898982818110613cc657fe5b90506020020135868683818110613cd957fe5b9050602002013512158015613d125750878782818110613cf557fe5b90506020020135868683818110613d0857fe5b9050602002013513155b613d57576040805162461bcd60e51b8152602060048201526011602482015270125b9d985b1a59081cdd185c9d081d985b607a1b604482015290519081900360640190fd5b60405180608001604052808b8b84818110613d6e57fe5b905060200201358152602001898984818110613d8657fe5b905060200201358152602001878784818110613d9e57fe5b9050602002013581526020016001151581525061011060008f8152602001908152602001600020600301600083815260200190815260200160002060008201518160000155602082015181600101556040820151816002015560608201518160030160006101000a81548160ff0219169083151502179055509050508080600101915050613c43565b5060005b81811015613ec3576000838383818110613e4157fe5b905060200201356001600160a01b03166001600160a01b03161415613e6557600080fd5b60008d815261010e60205260409020838383818110613e8057fe5b835460018181018655600095865260209586902090910180546001600160a01b0319166001600160a01b0396909302949094013594909416179091555001613e2b565b50505050505050505050505050565b6000613edd8261429f565b613f185760405162461bcd60e51b815260040180806020018281038252602c8152602001806152a5602c913960400191505060405180910390fd5b6000613f2383612787565b9050806001600160a01b0316846001600160a01b03161480613f5e5750836001600160a01b0316613f53846117a2565b6001600160a01b0316145b80613f6e5750613f6e818561388a565b949350505050565b6000838152610107602052604090205460ff16156140d257600083815261010c6020526040812054613fc457613fbd606461231b610119548661454090919063ffffffff16565b9050613fef565b600084815261010c6020526040902054613fec9060649061231b90869063ffffffff61454016565b90505b61011554614006906001600160a01b031682614437565b6000614023606461231b610112548761454090919063ffffffff16565b600086815261010e602090815260409182902080548351818402810184019094528084529394506140949385939283018282801561408a57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161406c575b5050505050614777565b600061409f86612787565b90506140ca816140c5846140b9898863ffffffff6147c716565b9063ffffffff6147c716565b614437565b5050506141dc565b600083815261010760209081526040808320805460ff1916600117905561010b90915281205461411e57614117606461231b610118548661454090919063ffffffff16565b9050614149565b600084815261010b60205260409020546141469060649061231b90869063ffffffff61454016565b90505b61011554614160906001600160a01b031682614437565b6141da614173848363ffffffff6147c716565b600086815261010e60209081526040918290208054835181840281018401909452808452909183018282801561408a576020028201919060005260206000209081546001600160a01b0316815260019091019060200180831161406c575050505050614777565b505b604080516060810182526000808252602080830182815283850183815288845261010f90925293909120915182546001600160a01b0319166001600160a01b039091161782559151600182015590516002909101805460ff191691151591909117905561425261424b84612787565b828561441c565b60408051848152602081018490526001600160a01b0383168183015290517fe8038e253f57f3f9c7277af1d801786319db71cc5491fe5db55a0e04f1b3466f9181900360600190a1505050565b6000908152606660205260409020546001600160a01b0316151590565b3390565b600081815261010f602052604090206002015460ff166142df57600080fd5b600081815261010f602052604090208054600190910154614309916001600160a01b031690614437565b604080516060810182526000808252602080830182815283850183815286845261010f835292859020935184546001600160a01b0319166001600160a01b0390911617845551600184015590516002909201805460ff191692151592909217909155815183815291517f99319fa1a5fca42d549d4d49989116496775f906f62e0e2ff2ea3c3aacdefa279281900390910190a150565b6143a88261429f565b6143e35760405162461bcd60e51b815260040180806020018281038252602c8152602001806153cb602c913960400191505060405180910390fd5b600082815260d4602090815260409091208251611af792840190615147565b611707828260405180602001604052806000815250614809565b60008181526101096020526040812055611af783838361485b565b6040516000906001600160a01b038416906108fc90849084818181858888f193505050503d8060008114614487576040519150601f19603f3d011682016040523d82523d6000602084013e61448c565b606091505b509091505080611af7576001600160a01b038316600090815261010a60205260409020546144c0908363ffffffff6144df16565b6001600160a01b038416600090815261010a6020526040902055505050565b600082820183811015614539576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b60008261454f57506000612235565b8282028284828161455c57fe5b04146145395760405162461bcd60e51b815260040180806020018281038252602181526020018061537e6021913960400191505060405180910390fd5b600061453983836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061487a565b303b1590565b60006145f36380ac58cd60e01b61166d565b905090565b6001600160e01b03198082161415614657576040805162461bcd60e51b815260206004820152601c60248201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604482015290519081900360640190fd5b6001600160e01b0319166000908152603360205260409020805460ff19166001179055565b5490565b61468b84848461441c565b6146978484848461491c565b6133c15760405162461bcd60e51b815260040180806020018281038252603281526020018061524f6032913960400191505060405180910390fd5b600054610100900460ff16806146eb57506146eb6145db565b806146f9575060005460ff16155b6147345760405162461bcd60e51b815260040180806020018281038252602e8152602001806153f7602e913960400191505060405180910390fd5b600054610100900460ff1615801561475f576000805460ff1961ff0019909116610100171660011790555b614767614b57565b612e716380ac58cd60e01b6145f8565b80511561170757600061479482518461459990919063ffffffff16565b905060005b82518110156133c1576147bf8382815181106147b157fe5b602002602001015183614437565b600101614799565b600061453983836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614bf4565b6148138383614c4e565b614820600084848461491c565b611af75760405162461bcd60e51b815260040180806020018281038252603281526020018061524f6032913960400191505060405180910390fd5b614866838383614c6b565b6148708382614daf565b611af78282614e9d565b600081836149065760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156148cb5781810151838201526020016148b3565b50505050905090810190601f1680156148f85780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161491257fe5b0495945050505050565b6000614930846001600160a01b0316614edb565b61493c57506001613f6e565b600060606001600160a01b038616630a85bd0160e11b61495a6142bc565b89888860405160240180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156149d35781810151838201526020016149bb565b50505050905090810190601f168015614a005780820380516001836020036101000a031916815260200191505b5060408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909a16999099178952518151919890975087965094509250829150849050835b60208310614a685780518252601f199092019160209182019101614a49565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114614aca576040519150601f19603f3d011682016040523d82523d6000602084013e614acf565b606091505b509150915081614b2057805115614ae95780518082602001fd5b60405162461bcd60e51b815260040180806020018281038252603281526020018061524f6032913960400191505060405180910390fd5b6000818060200190516020811015614b3757600080fd5b50516001600160e01b031916630a85bd0160e11b149350613f6e92505050565b600054610100900460ff1680614b705750614b706145db565b80614b7e575060005460ff16155b614bb95760405162461bcd60e51b815260040180806020018281038252602e8152602001806153f7602e913960400191505060405180910390fd5b600054610100900460ff16158015614be4576000805460ff1961ff0019909116610100171660011790555b612e716301ffc9a760e01b6145f8565b60008184841115614c465760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156148cb5781810151838201526020016148b3565b505050900390565b614c588282614f14565b614c628282614e9d565b61170781615045565b826001600160a01b0316614c7e82612787565b6001600160a01b031614614cc35760405162461bcd60e51b81526004018080602001828103825260298152602001806154256029913960400191505060405180910390fd5b6001600160a01b038216614d085760405162461bcd60e51b81526004018080602001828103825260248152602001806152816024913960400191505060405180910390fd5b614d1181615089565b6001600160a01b0383166000908152606860205260409020614d32906150c4565b6001600160a01b0382166000908152606860205260409020614d53906150db565b60008181526066602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6001600160a01b0382166000908152609c6020526040812054614dd990600163ffffffff6147c716565b6000838152609d6020526040902054909150808214614e74576001600160a01b0384166000908152609c60205260408120805484908110614e1657fe5b9060005260206000200154905080609c6000876001600160a01b03166001600160a01b031681526020019081526020016000208381548110614e5457fe5b6000918252602080832090910192909255918252609d9052604090208190555b6001600160a01b0384166000908152609c602052604090208054906136649060001983016151c1565b6001600160a01b039091166000908152609c602081815260408084208054868652609d84529185208290559282526001810183559183529091200155565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590613f6e575050151592915050565b6001600160a01b038216614f6f576040805162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015290519081900360640190fd5b614f788161429f565b15614fca576040805162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015290519081900360640190fd5b600081815260666020908152604080832080546001600160a01b0319166001600160a01b038716908117909155835260689091529020615009906150db565b60405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b609e80546000838152609f60205260408120829055600182018355919091527fcfe2a20ff701a1f3e14f63bd70d6c6bc6fba8172ec6d5a505cdab3927c0a9de60155565b6000818152606760205260409020546001600160a01b0316156119ea57600090815260676020526040902080546001600160a01b0319169055565b80546150d790600163ffffffff6147c716565b9055565b80546001019055565b828054828255906000526020600020908101928215615137579160200282015b828111156151375781546001600160a01b0319166001600160a01b03843516178255602090920191600190910190615104565b506151439291506151e5565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061518857805160ff19168380011785556151b5565b828001600101855582156151b5579182015b828111156151b557825182559160200191906001019061519a565b50615143929150615209565b815481835581811115611af757600083815260209020611af7918101908301615209565b61179f91905b808211156151435780546001600160a01b03191681556001016151eb565b61179f91905b80821115615143576000815560010161520f56fe455243373231456e756d657261626c653a206f776e657220696e646578206f7574206f6620626f756e64734552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a207472616e7366657220746f20746865207a65726f20616464726573734552433732313a206f70657261746f7220717565727920666f72206e6f6e6578697374656e7420746f6b656e42696420696e63726561736573206d7573742062652077697468696e20302d3530254552433732313a20617070726f76652063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f76656420666f7220616c6c4552433732313a2062616c616e636520717565727920666f7220746865207a65726f20616464726573734552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774552433732313a20617070726f76656420717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732314d657461646174613a2055524920736574206f66206e6f6e6578697374656e7420746f6b656e436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a65644552433732313a207472616e73666572206f6620746f6b656e2074686174206973206e6f74206f776e4552433732314d657461646174613a2055524920717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a20617070726f76616c20746f2063757272656e74206f776e65724552433732313a207472616e736665722063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f766564455243373231456e756d657261626c653a20676c6f62616c20696e646578206f7574206f6620626f756e6473a265627a7a723158202bff7765b0ad7a7ca5ccd768115cf47b5a65cdb2e102f8b1d4311de51fd245c264736f6c63430005110032
Deployed Bytecode
0x6080604052600436106103ad5760003560e01c8063755db7b3116101e7578063b9bf52fa1161010d578063cf8589b9116100a0578063e6e5113b1161006f578063e6e5113b14611406578063e985e9c51461143c578063ef8a85c814611477578063f83036f0146114a7576103ad565b8063cf8589b914611322578063d91c070c14611376578063dbe55e56146113a6578063e50d48f1146113bb576103ad565b8063c87b56dd116100dc578063c87b56dd14611166578063c9340db914611190578063ca4137c3146111c9578063cd2a16ba1461130d576103ad565b8063b9bf52fa146110c5578063ba56f39314611112578063bab2d1111461113c578063c254e2d414611151576103ad565b80638f9f193f11610185578063a90d6de311610154578063a90d6de314610f85578063a94141a114610faf578063b6ad691414610fdf578063b88d4fde14610ff4576103ad565b80638f9f193f14610e8857806395d89b4114610ebb57806396bc50b014610ed0578063a22cb46514610f4a576103ad565b80638129fc1c116101c15780638129fc1c14610e0a5780638311cd3514610e1f578063892918d414610e345780638e2a9bb014610e5e576103ad565b8063755db7b314610c7857806376012bea14610d3d5780637a718d7114610d8f576103ad565b80632fcfb95a116102d75780634f6ccce71161026a5780635f959c58116102395780635f959c5814610bdc5780636352211e14610bf157806370a0823114610c1b578063734f851e14610c4e576103ad565b80634f6ccce714610a48578063556d862814610a725780635a58226014610a875780635d0a5d9a14610aba576103ad565b806345c0c502116102a657806345c0c50214610894578063462399cd146108be5780634cd88b76146108e85780634dfa810314610a1e576103ad565b80632fcfb95a146107ec57806334d722c91461081f57806342842e0e14610834578063454a2ab314610877576103ad565b8063117cbf1e1161034f5780631b59e3451161031e5780631b59e3451461069557806323b872dd1461074d5780632d4fbf83146107905780632f745c59146107b3576103ad565b8063117cbf1e14610598578063148abbae146105c257806318160ddd146105fe57806318e97fd114610613576103ad565b8063081812fc1161038b578063081812fc146104b6578063095ea7b3146104fc5780630a29bb37146105355780630eaaf4c81461056e576103ad565b806301ffc9a7146103b257806302e9d5e4146103fa57806306fdde031461042c575b600080fd5b3480156103be57600080fd5b506103e6600480360360208110156103d557600080fd5b50356001600160e01b03191661166d565b604080519115158252519081900360200190f35b34801561040657600080fd5b5061042a6004803603604081101561041d57600080fd5b508035906020013561168c565b005b34801561043857600080fd5b5061044161170b565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561047b578181015183820152602001610463565b50505050905090810190601f1680156104a85780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156104c257600080fd5b506104e0600480360360208110156104d957600080fd5b50356117a2565b604080516001600160a01b039092168252519081900360200190f35b34801561050857600080fd5b5061042a6004803603604081101561051f57600080fd5b506001600160a01b038135169060200135611804565b34801561054157600080fd5b5061042a6004803603604081101561055857600080fd5b50803590602001356001600160a01b031661192c565b34801561057a57600080fd5b5061042a6004803603602081101561059157600080fd5b50356119a7565b3480156105a457600080fd5b5061042a600480360360208110156105bb57600080fd5b50356119ed565b3480156105ce57600080fd5b506105ec600480360360208110156105e557600080fd5b5035611a57565b60408051918252519081900360200190f35b34801561060a57600080fd5b506105ec611a6a565b34801561061f57600080fd5b5061042a6004803603604081101561063657600080fd5b81359190810190604081016020820135600160201b81111561065757600080fd5b82018360208201111561066957600080fd5b803590602001918460018302840111600160201b8311171561068a57600080fd5b509092509050611a70565b3480156106a157600080fd5b5061042a60048036036101008110156106b957600080fd5b8135916001600160a01b036020820135811692604083013515159260608101359092169160808101359160a08201359160c0810135151591810190610100810160e0820135600160201b81111561070f57600080fd5b82018360208201111561072157600080fd5b803590602001918460208302840111600160201b8311171561074257600080fd5b509092509050611afc565b34801561075957600080fd5b5061042a6004803603606081101561077057600080fd5b506001600160a01b0381358116916020810135909116906040013561203d565b61042a600480360360408110156107a657600080fd5b5080359060200135612094565b3480156107bf57600080fd5b506105ec600480360360408110156107d657600080fd5b506001600160a01b0381351690602001356121bb565b3480156107f857600080fd5b5061042a6004803603602081101561080f57600080fd5b50356001600160a01b031661223b565b34801561082b57600080fd5b506104e0612276565b34801561084057600080fd5b5061042a6004803603606081101561085757600080fd5b506001600160a01b03813581169160208101359091169060400135612286565b61042a6004803603602081101561088d57600080fd5b50356122a1565b3480156108a057600080fd5b5061042a600480360360208110156108b757600080fd5b5035612447565b3480156108ca57600080fd5b506103e6600480360360208110156108e157600080fd5b503561248d565b3480156108f457600080fd5b5061042a6004803603604081101561090b57600080fd5b810190602081018135600160201b81111561092557600080fd5b82018360208201111561093757600080fd5b803590602001918460018302840111600160201b8311171561095857600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b8111156109aa57600080fd5b8201836020820111156109bc57600080fd5b803590602001918460018302840111600160201b831117156109dd57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506124a3945050505050565b348015610a2a57600080fd5b506105ec60048036036020811015610a4157600080fd5b503561258f565b348015610a5457600080fd5b506105ec60048036036020811015610a6b57600080fd5b50356125a2565b348015610a7e57600080fd5b506105ec612608565b348015610a9357600080fd5b506105ec60048036036020811015610aaa57600080fd5b50356001600160a01b031661260f565b348015610ac657600080fd5b5061042a60048036036080811015610add57600080fd5b81359190810190604081016020820135600160201b811115610afe57600080fd5b820183602082011115610b1057600080fd5b803590602001918460018302840111600160201b83111715610b3157600080fd5b919390929091602081019035600160201b811115610b4e57600080fd5b820183602082011115610b6057600080fd5b803590602001918460208302840111600160201b83111715610b8157600080fd5b919390929091602081019035600160201b811115610b9e57600080fd5b820183602082011115610bb057600080fd5b803590602001918460208302840111600160201b83111715610bd157600080fd5b509092509050612622565b348015610be857600080fd5b506105ec612780565b348015610bfd57600080fd5b506104e060048036036020811015610c1457600080fd5b5035612787565b348015610c2757600080fd5b506105ec60048036036020811015610c3e57600080fd5b50356001600160a01b03166127db565b348015610c5a57600080fd5b506103e660048036036020811015610c7157600080fd5b5035612843565b61042a60048036036060811015610c8e57600080fd5b81359190810190604081016020820135600160201b811115610caf57600080fd5b820183602082011115610cc157600080fd5b803590602001918460208302840111600160201b83111715610ce257600080fd5b919390929091602081019035600160201b811115610cff57600080fd5b820183602082011115610d1157600080fd5b803590602001918460208302840111600160201b83111715610d3257600080fd5b509092509050612859565b348015610d4957600080fd5b50610d6760048036036020811015610d6057600080fd5b5035612cc7565b6040805194855260208501939093529015158383015215156060830152519081900360800190f35b348015610d9b57600080fd5b5061042a60048036036020811015610db257600080fd5b810190602081018135600160201b811115610dcc57600080fd5b820183602082011115610dde57600080fd5b803590602001918460208302840111600160201b83111715610dff57600080fd5b509092509050612cf5565b348015610e1657600080fd5b5061042a612dc3565b348015610e2b57600080fd5b506105ec612e85565b348015610e4057600080fd5b5061042a60048036036020811015610e5757600080fd5b5035612e8c565b348015610e6a57600080fd5b506105ec60048036036020811015610e8157600080fd5b5035612eaa565b348015610e9457600080fd5b5061042a60048036036020811015610eab57600080fd5b50356001600160a01b0316612f25565b348015610ec757600080fd5b50610441612f92565b348015610edc57600080fd5b50610efa60048036036020811015610ef357600080fd5b5035612ff3565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610f36578181015183820152602001610f1e565b505050509050019250505060405180910390f35b348015610f5657600080fd5b5061042a60048036036040811015610f6d57600080fd5b506001600160a01b038135169060200135151561318d565b348015610f9157600080fd5b506105ec60048036036020811015610fa857600080fd5b5035613292565b348015610fbb57600080fd5b506104e060048036036040811015610fd257600080fd5b50803590602001356132a5565b348015610feb57600080fd5b5061042a6132db565b34801561100057600080fd5b5061042a6004803603608081101561101757600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b81111561105157600080fd5b82018360208201111561106357600080fd5b803590602001918460018302840111600160201b8311171561108457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550613369945050505050565b3480156110d157600080fd5b506110ef600480360360208110156110e857600080fd5b50356133c7565b604080516001600160a01b03909316835260208301919091528051918290030190f35b34801561111e57600080fd5b5061042a6004803603602081101561113557600080fd5b50356133ed565b34801561114857600080fd5b506105ec613441565b34801561115d57600080fd5b506104e0613448565b34801561117257600080fd5b506104416004803603602081101561118957600080fd5b5035613458565b34801561119c57600080fd5b506104e0600480360360408110156111b357600080fd5b506001600160a01b03813516906020013561353d565b3480156111d557600080fd5b5061042a600480360360808110156111ec57600080fd5b810190602081018135600160201b81111561120657600080fd5b82018360208201111561121857600080fd5b803590602001918460018302840111600160201b8311171561123957600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b81111561128b57600080fd5b82018360208201111561129d57600080fd5b803590602001918460018302840111600160201b831117156112be57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955050823593505050602001356001600160a01b0316613564565b34801561131957600080fd5b506105ec61366b565b34801561132e57600080fd5b5061134c6004803603602081101561134557600080fd5b5035613672565b604080516001600160a01b0390941684526020840192909252151582820152519081900360600190f35b34801561138257600080fd5b5061042a6004803603604081101561139957600080fd5b50803590602001356136a1565b3480156113b257600080fd5b506104e0613706565b3480156113c757600080fd5b5061042a600480360360a08110156113de57600080fd5b506001600160a01b038135169060208101359060408101359060608101359060800135613716565b34801561141257600080fd5b5061042a6004803603606081101561142957600080fd5b508035906020810135906040013561380f565b34801561144857600080fd5b506103e66004803603604081101561145f57600080fd5b506001600160a01b038135811691602001351661388a565b34801561148357600080fd5b5061042a6004803603604081101561149a57600080fd5b50803590602001356138b8565b3480156114b357600080fd5b5061042a600480360360e08110156114ca57600080fd5b81359190810190604081016020820135600160201b8111156114eb57600080fd5b8201836020820111156114fd57600080fd5b803590602001918460018302840111600160201b8311171561151e57600080fd5b919390929091602081019035600160201b81111561153b57600080fd5b82018360208201111561154d57600080fd5b803590602001918460208302840111600160201b8311171561156e57600080fd5b919390929091602081019035600160201b81111561158b57600080fd5b82018360208201111561159d57600080fd5b803590602001918460208302840111600160201b831117156115be57600080fd5b919390929091602081019035600160201b8111156115db57600080fd5b8201836020820111156115ed57600080fd5b803590602001918460208302840111600160201b8311171561160e57600080fd5b91939092823592604081019060200135600160201b81111561162f57600080fd5b82018360208201111561164157600080fd5b803590602001918460208302840111600160201b8311171561166257600080fd5b50909250905061391b565b6001600160e01b03191660009081526033602052604090205460ff1690565b6116963383613ed2565b61169f57600080fd5b600082815261010f602052604090206002015460ff166116be57600080fd5b600082815261010f60205260409020600101548111156116dd57600080fd5b600082815261010f60205260409020600181015490546117079184916001600160a01b0316613f76565b5050565b60d28054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156117975780601f1061176c57610100808354040283529160200191611797565b820191906000526020600020905b81548152906001019060200180831161177a57829003601f168201915b505050505090505b90565b60006117ad8261429f565b6117e85760405162461bcd60e51b815260040180806020018281038252602c81526020018061539f602c913960400191505060405180910390fd5b506000908152606760205260409020546001600160a01b031690565b600061180f82612787565b9050806001600160a01b0316836001600160a01b031614156118625760405162461bcd60e51b815260040180806020018281038252602181526020018061547d6021913960400191505060405180910390fd5b806001600160a01b03166118746142bc565b6001600160a01b031614806118955750611895816118906142bc565b61388a565b6118d05760405162461bcd60e51b81526004018080602001828103825260388152602001806152f36038913960400191505060405180910390fd5b60008281526067602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b3360008181526101116020908152604080832086845282529182902080546001600160a01b0386166001600160a01b0319909116811790915582518681529182019390935280820192909252517fae354774f370b4f427b85313cddf00365498115aed2003da8f942b64c2c0595d9181900360600190a15050565b600081815261010f60205260409020546001600160a01b03163314806119d85750610115546001600160a01b031633145b6119e157600080fd5b6119ea816142c0565b50565b610115546001600160a01b03163314611a0557600080fd5b600081118015611a16575060328111155b611a515760405162461bcd60e51b81526004018080602001828103825260228152602001806152d16022913960400191505060405180910390fd5b61011455565b61010b6020526000908152604090205481565b609e5490565b610115546001600160a01b03163314611a8857600080fd5b611a918361429f565b611a9a57600080fd5b6000838152610108602052604090205460ff1615611ab757600080fd5b611af78383838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061439f92505050565b505050565b6101165488906001600160a01b03163314611b5e576040805162461bcd60e51b815260206004820152601760248201527f4f6e6c792075706772616465722063616e2063616c6c2e000000000000000000604482015290519081900360640190fd5b60008a815261010e60205260409020611b789084846150e4565b508715611ebb576060816001600160a01b03166396bc50b08c6040518263ffffffff1660e01b81526004018082815260200191505060006040518083038186803b158015611bc557600080fd5b505afa158015611bd9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015611c0257600080fd5b8101908080516040519392919084600160201b821115611c2157600080fd5b908301906020820185811115611c3657600080fd5b82518660208202830111600160201b82111715611c5257600080fd5b82525081516020918201928201910280838360005b83811015611c7f578181015183820152602001611c67565b5050505090500160405250505090506003815181611c9957fe5b0615611ce5576040805162461bcd60e51b815260206004820152601660248201527524b73b30b634b21031b7b73a3937b6103a37b5b2b71760511b604482015290519081900360640190fd5b6000815111611d3b576040805162461bcd60e51b815260206004820152601e60248201527f436f6e74726f6c20746f6b656e206d7573742068617665206c65766572730000604482015290519081900360640190fd5b60405180608001604052806003835181611d5157fe5b04815260200160001981526020016001151581526020016001151581525061011060008d8152602001908152602001600020600082015181600001556020820151816001015560408201518160020160006101000a81548160ff02191690831515021790555060608201518160020160016101000a81548160ff02191690831515021790555090505060008090505b8151811015611eb8576040518060800160405280838381518110611e0057fe5b60200260200101518152602001838360010181518110611e1c57fe5b60200260200101518152602001838360020181518110611e3857fe5b602002602001015181526020016001151581525061011060008e8152602001908152602001600020600301600060038481611e6f57fe5b04815260208082019290925260409081016000208351815591830151600183015582015160028201556060909101516003918201805460ff191691151591909117905501611de0565b50505b60008a815261010b6020908152604080832089905561010c82528083208890556101079091529020805460ff1916851515179055611ef9878b614402565b6120318a826001600160a01b031663c87b56dd8d6040518263ffffffff1660e01b81526004018082815260200191505060006040518083038186803b158015611f4157600080fd5b505afa158015611f55573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015611f7e57600080fd5b8101908080516040519392919084600160201b821115611f9d57600080fd5b908301906020820185811115611fb257600080fd5b8251600160201b811182820188101715611fcb57600080fd5b82525081516020918201929091019080838360005b83811015611ff8578181015183820152602001611fe0565b50505050905090810190601f1680156120255780820380516001836020036101000a031916815260200191505b5060405250505061439f565b50505050505050505050565b61204e6120486142bc565b82613ed2565b6120895760405162461bcd60e51b815260040180806020018281038252603181526020018061549e6031913960400191505060405180910390fd5b611af783838361441c565b61209e3383613ed2565b156120a857600080fd5b60008281526101096020526040902054806120c257600080fd5b8034146120ce57600080fd5b6000838152610110602052604090206002015460ff16156121075760008381526101106020526040902060010154821461210757600080fd5b600083815261010f602052604090206002015460ff16156121b057600083815261010f60205260409020805460019091015461214c916001600160a01b031690614437565b604080516060810182526000808252602080830182815283850183815288845261010f90925293909120915182546001600160a01b0319166001600160a01b039091161782559151600182015590516002909101805460ff19169115159190911790555b611af7838233613f76565b60006121c6836127db565b82106122035760405162461bcd60e51b815260040180806020018281038252602b815260200180615224602b913960400191505060405180910390fd5b6001600160a01b0383166000908152609c6020526040902080548390811061222757fe5b906000526020600020015490505b92915050565b610115546001600160a01b0316331461225357600080fd5b61011780546001600160a01b0319166001600160a01b0392909216919091179055565b610117546001600160a01b031681565b611af783838360405180602001604052806000815250613369565b600034116122ae57600080fd5b6122b83382613ed2565b156122c257600080fd5b600081815261010f602052604090206002015460ff16156123a557612327606461231b6122fc6064610114546144df90919063ffffffff16565b600085815261010f60205260409020600101549063ffffffff61454016565b9063ffffffff61459916565b34101561237b576040805162461bcd60e51b815260206004820152601a60248201527f426964206d75737420696e637265617365206279206d696e2025000000000000604482015290519081900360640190fd5b600081815261010f6020526040902080546001909101546123a5916001600160a01b031690614437565b604080516060808201835233808352346020808501828152600186880181815260008a815261010f8552899020975188546001600160a01b0319166001600160a01b03909116178855915190870155516002909501805460ff1916951515959095179094558451868152938401528284015291517fcbf61548a249040d379a7f7a4486a18d78824bce978077f4943fb55e111af1c1929181900390910190a150565b610115546001600160a01b0316331461245f57600080fd5b6124688161429f565b61247157600080fd5b600090815261010860205260409020805460ff19166001179055565b6101076020526000908152604090205460ff1681565b600054610100900460ff16806124bc57506124bc6145db565b806124ca575060005460ff16155b6125055760405162461bcd60e51b815260040180806020018281038252602e8152602001806153f7602e913960400191505060405180910390fd5b600054610100900460ff16158015612530576000805460ff1961ff0019909116610100171660011790555b6125386145e1565b61254157600080fd5b82516125549060d2906020860190615147565b5081516125689060d3906020850190615147565b50612579635b5e139f60e01b6145f8565b8015611af7576000805461ff0019169055505050565b61010c6020526000908152604090205481565b60006125ac611a6a565b82106125e95760405162461bcd60e51b815260040180806020018281038252602c8152602001806154cf602c913960400191505060405180910390fd5b609e82815481106125f657fe5b90600052602060002001549050919050565b6101135481565b61010a6020526000908152604090205481565b600087815261010d6020526040902054879084906001600160a01b0316331461264a57600080fd5b600082815261010d6020526040902060010154811461266857600080fd5b6000891161267557600080fd5b61267f338a614402565b6126bf8989898080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061439f92505050565b600089815261010e602052604090206126d99085856150e4565b5060005b858110156120315760008787838181106126f357fe5b905060200201356001600160a01b03166001600160a01b0316141561271757600080fd5b60018a820101600081815261010e6020526040902088888481811061273857fe5b835460018181018655600095865260209586902090910180546001600160a01b0319166001600160a01b039690930294909401359490941617909155509190910190506126dd565b6101185481565b6000818152606660205260408120546001600160a01b0316806122355760405162461bcd60e51b81526004018080602001828103825260298152602001806153556029913960400191505060405180910390fd5b60006001600160a01b0382166128225760405162461bcd60e51b815260040180806020018281038252602a81526020018061532b602a913960400191505060405180910390fd5b6001600160a01b03821660009081526068602052604090206122359061467c565b6101086020526000908152604090205460ff1681565b6128633386613ed2565b806128a4575033610111600061287888612787565b6001600160a01b039081168252602080830193909352604091820160009081208a825290935291205416145b6128f5576040805162461bcd60e51b815260206004820152601a60248201527f4f776e6572206f72207065726d697373696f6e6564206f6e6c79000000000000604482015290519081900360640190fd5b60008581526101106020526040902060020154610100900460ff16612959576040805162461bcd60e51b81526020600482015260156024820152742a37b5b2b7103237b2b9903737ba1032bc34b9ba1760591b604482015290519081900360640190fd5b60008581526101106020526040902060018101546000191480612980575060008160010154135b6129d1576040805162461bcd60e51b815260206004820152601760248201527f4e6f206d6f7265207570646174657320616c6c6f776564000000000000000000604482015290519081900360640190fd5b6040805183815260208085028201019091526060908380156129fd578160200160208202803883390190505b50905060005b85811015612b6a5760008881526101106020526040812060030181898985818110612a2a57fe5b90506020020135815260200190815260200160002090508060000154868684818110612a5257fe5b9050602002013512158015612a7d57508060010154868684818110612a7357fe5b9050602002013513155b612abc576040805162461bcd60e51b815260206004820152600b60248201526a125b9d985b1a59081d985b60aa1b604482015290519081900360640190fd5b8060020154868684818110612acd57fe5b905060200201351415612b27576040805162461bcd60e51b815260206004820152601a60248201527f4d7573742070726f7669646520646966666572656e742076616c000000000000604482015290519081900360640190fd5b8060020154838381518110612b3857fe5b602002602001018181525050858583818110612b5057fe5b602002919091013560029092019190915550600101612a03565b503415612b885761011554612b88906001600160a01b031634614437565b600082600101541315612bc557600182018054600019019055600087815261010f602052604090206002015460ff1615612bc557612bc5876142c0565b7ffc1e08f776282b1abf0734388c9042ad8206984bf5d69a721d120c9af38412fc873484600101548989868a8a6040518089815260200188815260200187815260200180602001806020018060200184810384528989828181526020019250602002808284376000838201819052601f909101601f19169092018681038552895181528951602091820193828c0193509102908190849084905b83811015612c77578181015183820152602001612c5f565b505050509050018481038252868682818152602001925060200280828437600083820152604051601f909101601f19169092018290039d50909b505050505050505050505050a150505050505050565b6101106020526000908152604090208054600182015460029092015490919060ff8082169161010090041684565b610115546001600160a01b03163314612d0d57600080fd5b60005b81811015612d5b5760016101076000858585818110612d2b57fe5b60209081029290920135835250810191909152604001600020805460ff1916911515919091179055600101612d10565b507fd1987e98d3ff0b4813b1fd1dd1cf7c12f2edfbc595c5d8b7cc9e9a97e76ef09b828260405180806020018281038252848482818152602001925060200280828437600083820152604051601f909101601f19169092018290039550909350505050a15050565b600054610100900460ff1680612ddc5750612ddc6145db565b80612dea575060005460ff16155b612e255760405162461bcd60e51b815260040180806020018281038252602e8152602001806153f7602e913960400191505060405180910390fd5b600054610100900460ff16158015612e50576000805460ff1961ff0019909116610100171660011790555b612e586145e1565b612e6157600080fd5b612e7163780e9d6360e01b6145f8565b80156119ea576000805461ff001916905550565b6101195481565b610115546001600160a01b03163314612ea457600080fd5b61011355565b60008181526101106020526040812060020154610100900460ff16612f0e576040805162461bcd60e51b81526020600482015260156024820152742a37b5b2b7103237b2b9903737ba1032bc34b9ba1760591b604482015290519081900360640190fd5b506000908152610110602052604090206001015490565b610115546001600160a01b03163314612f3d57600080fd5b61011580546001600160a01b0383166001600160a01b0319909116811790915560408051918252517fb29030287f33baad1941013143d2e1bd5e66c87318f0bd99bc0fae51fe4b191f9181900360200190a150565b60d38054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156117975780601f1061176c57610100808354040283529160200191611797565b60008181526101106020526040902060020154606090610100900460ff1661305a576040805162461bcd60e51b81526020600482015260156024820152742a37b5b2b7103237b2b9903737ba1032bc34b9ba1760591b604482015290519081900360640190fd5b600082815261011060205260409020805460609061307f90600363ffffffff61454016565b6040519080825280602002602001820160405280156130a8578160200160208202803883390190505b5090506000805b835481101561318357600081815260038501602052604090205483518490849081106130d757fe5b60209081029190910101526130f382600163ffffffff6144df16565b91508360030160008281526020019081526020016000206001015483838151811061311a57fe5b602090810291909101015261313682600163ffffffff6144df16565b91508360030160008281526020019081526020016000206002015483838151811061315d57fe5b602090810291909101015261317982600163ffffffff6144df16565b91506001016130af565b5090949350505050565b6131956142bc565b6001600160a01b0316826001600160a01b031614156131fb576040805162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015290519081900360640190fd5b80606960006132086142bc565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff19169215159290921790915561324c6142bc565b60408051841515815290516001600160a01b0392909216917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319181900360200190a35050565b6101096020526000908152604090205481565b61010e60205281600052604060002081815481106132bf57fe5b6000918252602090912001546001600160a01b03169150829050565b33600090815261010a6020526040902054806132f657600080fd5b303181111561330457600080fd5b33600081815261010a60205260408082208290555190919083908381818185875af1925050503d8060008114613356576040519150601f19603f3d011682016040523d82523d6000602084013e61335b565b606091505b505090508061170757600080fd5b61337a6133746142bc565b83613ed2565b6133b55760405162461bcd60e51b815260040180806020018281038252603181526020018061549e6031913960400191505060405180910390fd5b6133c184848484614680565b50505050565b61010d60205260009081526040902080546001909101546001600160a01b039091169082565b610115546001600160a01b0316331461340557600080fd5b6101128190556040805182815290517fef33c3f1a71083323b686236e793a53bef4c884ab48f63838d7e6fe9f431e6859181900360200190a150565b6101125481565b610116546001600160a01b031681565b60606134638261429f565b61349e5760405162461bcd60e51b815260040180806020018281038252602f81526020018061544e602f913960400191505060405180910390fd5b600082815260d4602090815260409182902080548351601f6002600019610100600186161502019093169290920491820184900484028101840190945280845290918301828280156135315780601f1061350657610100808354040283529160200191613531565b820191906000526020600020905b81548152906001019060200180831161351457829003601f168201915b50505050509050919050565b6101116020908152600092835260408084209091529082529020546001600160a01b031681565b600054610100900460ff168061357d575061357d6145db565b8061358b575060005460ff16155b6135c65760405162461bcd60e51b815260040180806020018281038252602e8152602001806153f7602e913960400191505060405180910390fd5b600054610100900460ff161580156135f1576000805460ff1961ff0019909116610100171660011790555b6135f96146d2565b613601612dc3565b61360b85856124a3565b600a610112556001610114556101158054336001600160a01b03199182161790915561011680549091166001600160a01b0384161790556101138390558261365257600080fd5b8015613664576000805461ff00191690555b5050505050565b6101145481565b61010f602052600090815260409020805460018201546002909201546001600160a01b03909116919060ff1683565b6136ab3383613ed2565b6136b457600080fd5b60008281526101096020908152604091829020839055815184815290810183905281517fd765eb1cf8aab1a01381fef8dcc9f755ef2d2233849716da96a90e32da84821a929181900390910190a15050565b610115546001600160a01b031681565b610117546001600160a01b0316331461372e57600080fd5b61011354841461373d57600080fd5b6040805180820182526001600160a01b0387811682526020808301878152600089815261010d909252939020915182546001600160a01b0319169116178155905160019182015561379e9061379286866144df565b9063ffffffff6144df16565b61011355600084815261010b6020908152604080832085905561010c82529182902083905581518681529081018590526001600160a01b0387168183015290517f810b7d5e84bcfa3571edbe371ec7fe87f728a2a0d5269e03f3a7ca7ff7f9c3839181900360600190a15050505050565b610115546001600160a01b0316331461382757600080fd5b600083815261010b6020908152604080832085905561010c825291829020839055815185815290810184905280820183905290517fb38317f49b7617179fc92dd57fc71e8c50aad2ab7616736f00e83944a45ca3049181900360600190a1505050565b6001600160a01b03918216600090815260696020908152604080832093909416825291909152205460ff1690565b610115546001600160a01b031633146138d057600080fd5b610118829055610119819055604080518381526020810183905281517fba416d815f76bda1a8c69d8accb121d716340736c5b764c504add4d006b5d276929181900390910190a15050565b6101f4881115613972576040805162461bcd60e51b815260206004820152601860248201527f546f6f206d616e7920636f6e74726f6c206c65766572732e0000000000000000604482015290519081900360640190fd5b60328111156139c8576040805162461bcd60e51b815260206004820152601760248201527f546f6f206d616e7920636f6c6c61626f7261746f72732e000000000000000000604482015290519081900360640190fd5b60008c81526101106020526040902060020154610100900460ff1615613a25576040805162461bcd60e51b815260206004820152600d60248201526c0416c726561647920736574757609c1b604482015290519081900360640190fd5b60008c815261010e602052604081208054339290613a3f57fe5b6000918252602090912001546001600160a01b031614613aa6576040805162461bcd60e51b815260206004820152601c60248201527f4d75737420626520636f6e74726f6c20746f6b656e2061727469737400000000604482015290519081900360640190fd5b8786148015613ab457508584145b613afd576040805162461bcd60e51b81526020600482015260156024820152740acc2d8eacae640c2e4e4c2f240dad2e6dac2e8c6d605b1b604482015290519081900360640190fd5b826000191480613b0d5750600083135b613b5e576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420616c6c6f7765642075706461746573000000000000000000604482015290519081900360640190fd5b613b68338d614402565b613ba88c8c8c8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061439f92505050565b60405180608001604052808686905081526020018481526020016001151581526020016001151581525061011060008e8152602001908152602001600020600082015181600001556020820151816001015560408201518160020160006101000a81548160ff02191690831515021790555060608201518160020160016101000a81548160ff02191690831515021790555090505060008090505b84811015613e2757898982818110613c5757fe5b90506020020135888883818110613c6a57fe5b905060200201351215613cba576040805162461bcd60e51b815260206004820152601360248201527226b0bc103b30b61036bab9ba101f1e9036b4b760691b604482015290519081900360640190fd5b898982818110613cc657fe5b90506020020135868683818110613cd957fe5b9050602002013512158015613d125750878782818110613cf557fe5b90506020020135868683818110613d0857fe5b9050602002013513155b613d57576040805162461bcd60e51b8152602060048201526011602482015270125b9d985b1a59081cdd185c9d081d985b607a1b604482015290519081900360640190fd5b60405180608001604052808b8b84818110613d6e57fe5b905060200201358152602001898984818110613d8657fe5b905060200201358152602001878784818110613d9e57fe5b9050602002013581526020016001151581525061011060008f8152602001908152602001600020600301600083815260200190815260200160002060008201518160000155602082015181600101556040820151816002015560608201518160030160006101000a81548160ff0219169083151502179055509050508080600101915050613c43565b5060005b81811015613ec3576000838383818110613e4157fe5b905060200201356001600160a01b03166001600160a01b03161415613e6557600080fd5b60008d815261010e60205260409020838383818110613e8057fe5b835460018181018655600095865260209586902090910180546001600160a01b0319166001600160a01b0396909302949094013594909416179091555001613e2b565b50505050505050505050505050565b6000613edd8261429f565b613f185760405162461bcd60e51b815260040180806020018281038252602c8152602001806152a5602c913960400191505060405180910390fd5b6000613f2383612787565b9050806001600160a01b0316846001600160a01b03161480613f5e5750836001600160a01b0316613f53846117a2565b6001600160a01b0316145b80613f6e5750613f6e818561388a565b949350505050565b6000838152610107602052604090205460ff16156140d257600083815261010c6020526040812054613fc457613fbd606461231b610119548661454090919063ffffffff16565b9050613fef565b600084815261010c6020526040902054613fec9060649061231b90869063ffffffff61454016565b90505b61011554614006906001600160a01b031682614437565b6000614023606461231b610112548761454090919063ffffffff16565b600086815261010e602090815260409182902080548351818402810184019094528084529394506140949385939283018282801561408a57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161406c575b5050505050614777565b600061409f86612787565b90506140ca816140c5846140b9898863ffffffff6147c716565b9063ffffffff6147c716565b614437565b5050506141dc565b600083815261010760209081526040808320805460ff1916600117905561010b90915281205461411e57614117606461231b610118548661454090919063ffffffff16565b9050614149565b600084815261010b60205260409020546141469060649061231b90869063ffffffff61454016565b90505b61011554614160906001600160a01b031682614437565b6141da614173848363ffffffff6147c716565b600086815261010e60209081526040918290208054835181840281018401909452808452909183018282801561408a576020028201919060005260206000209081546001600160a01b0316815260019091019060200180831161406c575050505050614777565b505b604080516060810182526000808252602080830182815283850183815288845261010f90925293909120915182546001600160a01b0319166001600160a01b039091161782559151600182015590516002909101805460ff191691151591909117905561425261424b84612787565b828561441c565b60408051848152602081018490526001600160a01b0383168183015290517fe8038e253f57f3f9c7277af1d801786319db71cc5491fe5db55a0e04f1b3466f9181900360600190a1505050565b6000908152606660205260409020546001600160a01b0316151590565b3390565b600081815261010f602052604090206002015460ff166142df57600080fd5b600081815261010f602052604090208054600190910154614309916001600160a01b031690614437565b604080516060810182526000808252602080830182815283850183815286845261010f835292859020935184546001600160a01b0319166001600160a01b0390911617845551600184015590516002909201805460ff191692151592909217909155815183815291517f99319fa1a5fca42d549d4d49989116496775f906f62e0e2ff2ea3c3aacdefa279281900390910190a150565b6143a88261429f565b6143e35760405162461bcd60e51b815260040180806020018281038252602c8152602001806153cb602c913960400191505060405180910390fd5b600082815260d4602090815260409091208251611af792840190615147565b611707828260405180602001604052806000815250614809565b60008181526101096020526040812055611af783838361485b565b6040516000906001600160a01b038416906108fc90849084818181858888f193505050503d8060008114614487576040519150601f19603f3d011682016040523d82523d6000602084013e61448c565b606091505b509091505080611af7576001600160a01b038316600090815261010a60205260409020546144c0908363ffffffff6144df16565b6001600160a01b038416600090815261010a6020526040902055505050565b600082820183811015614539576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b60008261454f57506000612235565b8282028284828161455c57fe5b04146145395760405162461bcd60e51b815260040180806020018281038252602181526020018061537e6021913960400191505060405180910390fd5b600061453983836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061487a565b303b1590565b60006145f36380ac58cd60e01b61166d565b905090565b6001600160e01b03198082161415614657576040805162461bcd60e51b815260206004820152601c60248201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604482015290519081900360640190fd5b6001600160e01b0319166000908152603360205260409020805460ff19166001179055565b5490565b61468b84848461441c565b6146978484848461491c565b6133c15760405162461bcd60e51b815260040180806020018281038252603281526020018061524f6032913960400191505060405180910390fd5b600054610100900460ff16806146eb57506146eb6145db565b806146f9575060005460ff16155b6147345760405162461bcd60e51b815260040180806020018281038252602e8152602001806153f7602e913960400191505060405180910390fd5b600054610100900460ff1615801561475f576000805460ff1961ff0019909116610100171660011790555b614767614b57565b612e716380ac58cd60e01b6145f8565b80511561170757600061479482518461459990919063ffffffff16565b905060005b82518110156133c1576147bf8382815181106147b157fe5b602002602001015183614437565b600101614799565b600061453983836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614bf4565b6148138383614c4e565b614820600084848461491c565b611af75760405162461bcd60e51b815260040180806020018281038252603281526020018061524f6032913960400191505060405180910390fd5b614866838383614c6b565b6148708382614daf565b611af78282614e9d565b600081836149065760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156148cb5781810151838201526020016148b3565b50505050905090810190601f1680156148f85780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161491257fe5b0495945050505050565b6000614930846001600160a01b0316614edb565b61493c57506001613f6e565b600060606001600160a01b038616630a85bd0160e11b61495a6142bc565b89888860405160240180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156149d35781810151838201526020016149bb565b50505050905090810190601f168015614a005780820380516001836020036101000a031916815260200191505b5060408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909a16999099178952518151919890975087965094509250829150849050835b60208310614a685780518252601f199092019160209182019101614a49565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114614aca576040519150601f19603f3d011682016040523d82523d6000602084013e614acf565b606091505b509150915081614b2057805115614ae95780518082602001fd5b60405162461bcd60e51b815260040180806020018281038252603281526020018061524f6032913960400191505060405180910390fd5b6000818060200190516020811015614b3757600080fd5b50516001600160e01b031916630a85bd0160e11b149350613f6e92505050565b600054610100900460ff1680614b705750614b706145db565b80614b7e575060005460ff16155b614bb95760405162461bcd60e51b815260040180806020018281038252602e8152602001806153f7602e913960400191505060405180910390fd5b600054610100900460ff16158015614be4576000805460ff1961ff0019909116610100171660011790555b612e716301ffc9a760e01b6145f8565b60008184841115614c465760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156148cb5781810151838201526020016148b3565b505050900390565b614c588282614f14565b614c628282614e9d565b61170781615045565b826001600160a01b0316614c7e82612787565b6001600160a01b031614614cc35760405162461bcd60e51b81526004018080602001828103825260298152602001806154256029913960400191505060405180910390fd5b6001600160a01b038216614d085760405162461bcd60e51b81526004018080602001828103825260248152602001806152816024913960400191505060405180910390fd5b614d1181615089565b6001600160a01b0383166000908152606860205260409020614d32906150c4565b6001600160a01b0382166000908152606860205260409020614d53906150db565b60008181526066602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6001600160a01b0382166000908152609c6020526040812054614dd990600163ffffffff6147c716565b6000838152609d6020526040902054909150808214614e74576001600160a01b0384166000908152609c60205260408120805484908110614e1657fe5b9060005260206000200154905080609c6000876001600160a01b03166001600160a01b031681526020019081526020016000208381548110614e5457fe5b6000918252602080832090910192909255918252609d9052604090208190555b6001600160a01b0384166000908152609c602052604090208054906136649060001983016151c1565b6001600160a01b039091166000908152609c602081815260408084208054868652609d84529185208290559282526001810183559183529091200155565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590613f6e575050151592915050565b6001600160a01b038216614f6f576040805162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015290519081900360640190fd5b614f788161429f565b15614fca576040805162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015290519081900360640190fd5b600081815260666020908152604080832080546001600160a01b0319166001600160a01b038716908117909155835260689091529020615009906150db565b60405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b609e80546000838152609f60205260408120829055600182018355919091527fcfe2a20ff701a1f3e14f63bd70d6c6bc6fba8172ec6d5a505cdab3927c0a9de60155565b6000818152606760205260409020546001600160a01b0316156119ea57600090815260676020526040902080546001600160a01b0319169055565b80546150d790600163ffffffff6147c716565b9055565b80546001019055565b828054828255906000526020600020908101928215615137579160200282015b828111156151375781546001600160a01b0319166001600160a01b03843516178255602090920191600190910190615104565b506151439291506151e5565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061518857805160ff19168380011785556151b5565b828001600101855582156151b5579182015b828111156151b557825182559160200191906001019061519a565b50615143929150615209565b815481835581811115611af757600083815260209020611af7918101908301615209565b61179f91905b808211156151435780546001600160a01b03191681556001016151eb565b61179f91905b80821115615143576000815560010161520f56fe455243373231456e756d657261626c653a206f776e657220696e646578206f7574206f6620626f756e64734552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a207472616e7366657220746f20746865207a65726f20616464726573734552433732313a206f70657261746f7220717565727920666f72206e6f6e6578697374656e7420746f6b656e42696420696e63726561736573206d7573742062652077697468696e20302d3530254552433732313a20617070726f76652063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f76656420666f7220616c6c4552433732313a2062616c616e636520717565727920666f7220746865207a65726f20616464726573734552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774552433732313a20617070726f76656420717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732314d657461646174613a2055524920736574206f66206e6f6e6578697374656e7420746f6b656e436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a65644552433732313a207472616e73666572206f6620746f6b656e2074686174206973206e6f74206f776e4552433732314d657461646174613a2055524920717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a20617070726f76616c20746f2063757272656e74206f776e65724552433732313a207472616e736665722063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f766564455243373231456e756d657261626c653a20676c6f62616c20696e646578206f7574206f6620626f756e6473a265627a7a723158202bff7765b0ad7a7ca5ccd768115cf47b5a65cdb2e102f8b1d4311de51fd245c264736f6c63430005110032
Deployed Bytecode Sourcemap
48925:35621:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18916:133;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18916:133:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;18916:133:0;-1:-1:-1;;;;;;18916:133:0;;:::i;:::-;;;;;;;;;;;;;;;;;;77030:621;;8:9:-1;5:2;;;30:1;27;20:12;5:2;77030:621:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;77030:621:0;;;;;;;:::i;:::-;;46642:85;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46642:85:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;46642:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24088:204;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24088:204:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24088:204:0;;:::i;:::-;;;;-1:-1:-1;;;;;24088:204:0;;;;;;;;;;;;;;23370:425;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23370:425:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;23370:425:0;;;;;;;;:::i;79760:242::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;79760:242:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;79760:242:0;;;;;;-1:-1:-1;;;;;79760:242:0;;:::i;71067:401::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;71067:401:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;71067:401:0;;:::i;60705:385::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;60705:385:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;60705:385:0;;:::i;53548:63::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;53548:63:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;53548:63:0;;:::i;:::-;;;;;;;;;;;;;;;;37910:96;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37910:96:0;;;:::i;61210:396::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;61210:396:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;61210:396:0;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;61210:396:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;61210:396:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;61210:396:0;;-1:-1:-1;61210:396:0;-1:-1:-1;61210:396:0;:::i;65775:2665::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;65775:2665:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;65775:2665:0;;;-1:-1:-1;;;;;65775:2665:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;65775:2665:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;65775:2665:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;65775:2665:0;;-1:-1:-1;65775:2665:0;-1:-1:-1;65775:2665:0;:::i;25771:292::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25771:292:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;25771:292:0;;;;;;;;;;;;;;;;;:::i;72078:1307::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;72078:1307:0;;;;;;;:::i;37519:232::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37519:232:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;37519:232:0;;;;;;;;:::i;58205:151::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;58205:151:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;58205:151:0;-1:-1:-1;;;;;58205:151:0;;:::i;55176:28::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;55176:28:0;;;:::i;26725:134::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26725:134:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;26725:134:0;;;;;;;;;;;;;;;;;:::i;69805:1194::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;69805:1194:0;;:::i;61661:241::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;61661:241:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;61661:241:0;;:::i;53079:53::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;53079:53:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;53079:53:0;;:::i;46060:329::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46060:329:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;46060:329:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;46060:329:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;46060:329:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;46060:329:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;46060:329:0;;;;;;;;-1:-1:-1;46060:329:0;;-1:-1:-1;;;;;5:28;;2:2;;;46:1;43;36:12;2:2;46060:329:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;46060:329:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;46060:329:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;46060:329:0;;-1:-1:-1;46060:329:0;;-1:-1:-1;;;;;46060:329:0:i;53709:64::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;53709:64:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;53709:64:0;;:::i;38352:199::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38352:199:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38352:199:0;;:::i;54737:34::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;54737:34:0;;;:::i;53398:56::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;53398:56:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;53398:56:0;-1:-1:-1;;;;;53398:56:0;;:::i;68448:1324::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;68448:1324:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;68448:1324:0;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;68448:1324:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;68448:1324:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;68448:1324:0;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;68448:1324:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;68448:1324:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;68448:1324:0;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;68448:1324:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;68448:1324:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;68448:1324:0;;-1:-1:-1;68448:1324:0;-1:-1:-1;68448:1324:0;:::i;55234:49::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;55234:49:0;;;:::i;22711:228::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22711:228:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22711:228:0;;:::i;22274:211::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22274:211:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22274:211:0;-1:-1:-1;;;;;22274:211:0;;:::i;53187:46::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;53187:46:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;53187:46:0;;:::i;80176:3057::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;80176:3057:0;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;80176:3057:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;80176:3057:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;80176:3057:0;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;80176:3057:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;80176:3057:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;80176:3057:0;;-1:-1:-1;80176:3057:0;-1:-1:-1;80176:3057:0;:::i;54316:59::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;54316:59:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;54316:59:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58789:417;;8:9:-1;5:2;;;30:1;27;20:12;5:2;58789:417:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;58789:417:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;58789:417:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;58789:417:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;58789:417:0;;-1:-1:-1;58789:417:0;-1:-1:-1;58789:417:0;:::i;36747:246::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36747:246:0;;;:::i;55290:50::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;55290:50:0;;;:::i;56781:172::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;56781:172:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56781:172:0;;:::i;78146:334::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;78146:334:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;78146:334:0;;:::i;58441:227::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;58441:227:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;58441:227:0;-1:-1:-1;;;;;58441:227:0;;:::i;46842:89::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46842:89:0;;;:::i;78554:1070::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;78554:1070:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;78554:1070:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;78554:1070:0;;;;;;;;;;;;;;;;;24593:254;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24593:254:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;24593:254:0;;;;;;;;;;:::i;53286:44::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;53286:44:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;53286:44:0;;:::i;54082:64::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;54082:64:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;54082:64:0;;;;;;;:::i;83306:362::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;83306:362:0;;;:::i;27596:272::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27596:272:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;27596:272:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;27596:272:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;27596:272:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;27596:272:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;27596:272:0;;-1:-1:-1;27596:272:0;;-1:-1:-1;;;;;27596:272:0:i;53852:64::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;53852:64:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;53852:64:0;;:::i;:::-;;;;-1:-1:-1;;;;;53852:64:0;;;;;;;;;;;;;;;;;;;;;61999:420;;8:9:-1;5:2;;;30:1;27;20:12;5:2;61999:420:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;61999:420:0;;:::i;54625:41::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;54625:41:0;;;:::i;55068:30::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;55068:30:0;;;:::i;47138:205::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47138:205:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;47138:205:0;;:::i;54461:87::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;54461:87:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;54461:87:0;;;;;;;;:::i;55349:850::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;55349:850:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;55349:850:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;55349:850:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;55349:850:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;55349:850:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;55349:850:0;;;;;;;;-1:-1:-1;55349:850:0;;-1:-1:-1;;;;;5:28;;2:2;;;46:1;43;36:12;2:2;55349:850:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;55349:850:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;55349:850:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;55349:850:0;;-1:-1:-1;;55349:850:0;;;-1:-1:-1;;;55349:850:0;;;-1:-1:-1;;;;;55349:850:0;;:::i;54829:36::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;54829:36:0;;;:::i;54203:49::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;54203:49:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;54203:49:0;;:::i;:::-;;;;-1:-1:-1;;;;;54203:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;77749:321;;8:9:-1;5:2;;;30:1;27;20:12;5:2;77749:321:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;77749:321:0;;;;;;;:::i;54949:38::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;54949:38:0;;;:::i;57111:1029::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;57111:1029:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;57111:1029:0;;;;;;;;;;;;;;;;;;;;;;;:::i;59292:651::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;59292:651:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;59292:651:0;;;;;;;;;;;;:::i;25177:147::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25177:147:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;25177:147:0;;;;;;;;;;:::i;60015:597::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;60015:597:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;60015:597:0;;;;;;;:::i;62427:3276::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;62427:3276:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;62427:3276:0;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;62427:3276:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;62427:3276:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;62427:3276:0;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;62427:3276:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;62427:3276:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;62427:3276:0;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;62427:3276:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;62427:3276:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;62427:3276:0;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;62427:3276:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;62427:3276:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;62427:3276:0;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;62427:3276:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;62427:3276:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;62427:3276:0;;-1:-1:-1;62427:3276:0;-1:-1:-1;62427:3276:0;:::i;18916:133::-;-1:-1:-1;;;;;;19008:33:0;18984:4;19008:33;;;:20;:33;;;;;;;;;18916:133::o;77030:621::-;77176:39;77195:10;77207:7;77176:18;:39::i;:::-;77168:48;;;;;;77280:20;;;;:11;:20;;;;;:27;;;;;77272:36;;;;;;77426:20;;;;:11;:20;;;;;:27;;;:48;-1:-1:-1;77426:48:0;77418:57;;;;;;77563:20;;;;:11;:20;;;;;:27;;;;77605;;77515:128;;77541:7;;-1:-1:-1;;;;;77605:27:0;77515:11;:128::i;:::-;77030:621;;:::o;46642:85::-;46714:5;46707:12;;;;;;;;-1:-1:-1;;46707:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46681:13;;46707:12;;46714:5;;46707:12;;46714:5;46707:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46642:85;;:::o;24088:204::-;24147:7;24175:16;24183:7;24175;:16::i;:::-;24167:73;;;;-1:-1:-1;;;24167:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24260:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;24260:24:0;;24088:204::o;23370:425::-;23434:13;23450:16;23458:7;23450;:16::i;:::-;23434:32;;23491:5;-1:-1:-1;;;;;23485:11:0;:2;-1:-1:-1;;;;;23485:11:0;;;23477:57;;;;-1:-1:-1;;;23477:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23571:5;-1:-1:-1;;;;;23555:21:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;23555:21:0;;:62;;;;23580:37;23597:5;23604:12;:10;:12::i;:::-;23580:16;:37::i;:::-;23547:154;;;;-1:-1:-1;;;23547:154:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23714:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;23714:29:0;-1:-1:-1;;;;;23714:29:0;;;;;;;;;23759:28;;23714:24;;23759:28;;;;;;;23370:425;;;:::o;79760:242::-;79889:10;79865:35;;;;:23;:35;;;;;;;;:44;;;;;;;;;:59;;-1:-1:-1;;;;;79865:59:0;;-1:-1:-1;;;;;;79865:59:0;;;;;;;;79942:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79760:242;;:::o;71067:401::-;71283:20;;;;:11;:20;;;;;:27;-1:-1:-1;;;;;71283:27:0;71314:10;71283:41;;71282:95;;-1:-1:-1;71361:15:0;;-1:-1:-1;;;;;71361:15:0;71347:10;:29;71282:95;71260:128;;;;;;71439:21;71452:7;71439:12;:21::i;:::-;71067:401;:::o;60705:385::-;56327:15;;-1:-1:-1;;;;;56327:15:0;56313:10;:29;56305:38;;;;;;60882:1;60857:22;:26;60856:62;;;;;60915:2;60889:22;:28;;60856:62;60834:146;;;;-1:-1:-1;;;60834:146:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61036:21;:46;60705:385::o;53548:63::-;;;;;;;;;;;;;:::o;37910:96::-;37981:10;:17;37910:96;:::o;61210:396::-;56327:15;;-1:-1:-1;;;;;56327:15:0;56313:10;:29;56305:38;;;;;;61383:16;61391:7;61383;:16::i;:::-;61375:25;;;;;;61484:23;;;;:14;:23;;;;;;;;:32;61476:41;;;;;;61561:37;61580:7;61589:8;;61561:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;61561:18:0;;-1:-1:-1;;;61561:37:0:i;:::-;61210:396;;;:::o;65775:2665::-;66341:15;;66222:9;;-1:-1:-1;;;;;66341:15:0;66327:10;:29;66319:65;;;;;-1:-1:-1;;;66319:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;66452:28;;;;:19;:28;;;;;:58;;66483:27;;66452:58;:::i;:::-;;66527:14;66523:1320;;;66633:28;66664:7;-1:-1:-1;;;;;66664:23:0;;66688:7;66664:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;66664:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;66664:32:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;66664:32:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;13:2;5:11;;2:2;;;29:1;26;19:12;2:2;66664:32:0;;;;;;;;;;;;;-1:-1:-1;;;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;219:3;213:10;331:9;325:2;311:12;307:21;289:16;285:44;282:59;-1:-1;;;247:12;244:29;233:116;230:2;;;362:1;359;352:12;230:2;373:25;;-1:-1;66664:32:0;;421:4:-1;412:14;;;;66664:32:0;;;;;412:14:-1;66664:32:0;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;66664:32:0;;;;;;;;;;;66633:63;;66814:1;66792:12;:19;:23;;;;;;:28;66784:63;;;;;-1:-1:-1;;;66784:63:0;;;;;;;;;;;;-1:-1:-1;;;66784:63:0;;;;;;;;;;;;;;;66955:1;66933:12;:19;:23;66925:66;;;;;-1:-1:-1;;;66925:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;67158:136;;;;;;;;67211:1;67189:12;:19;:23;;;;;;67158:136;;;;-1:-1:-1;;67158:136:0;;;;67252:4;67158:136;;;;;;67275:4;67158:136;;;;;67127:19;:28;67147:7;67127:28;;;;;;;;;;;:167;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67524:9;67536:1;67524:13;;67519:313;67543:12;:19;67539:1;:23;67519:313;;;67636:180;;;;;;;;67671:12;67684:1;67671:15;;;;;;;;;;;;;;67636:180;;;;67709:12;67722:1;67726;67722:5;67709:19;;;;;;;;;;;;;;67636:180;;;;67751:12;67764:1;67768;67764:5;67751:19;;;;;;;;;;;;;;67636:180;;;;67793:4;67636:180;;;;;67591:19;:28;67611:7;67591:28;;;;;;;;;;;:35;;:42;67631:1;67627;:5;;;;;;67591:42;;;;;;;;;;;;;;-1:-1:-1;67591:42:0;:225;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;67591:225:0;;;;;;;;;;67564:6;67519:313;;;;66523:1320;;67909:37;;;;:28;:37;;;;;;;;:71;;;67993:29;:62;;;;;:97;;;68165:21;:30;;;;;:53;;-1:-1:-1;;68165:53:0;;;;;;;68302:28;68318:2;67909:37;68302:15;:28::i;:::-;68378:54;68397:7;68406;-1:-1:-1;;;;;68406:16:0;;68423:7;68406:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;68406:25:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;68406:25:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;68406:25:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;13:2;5:11;;2:2;;;29:1;26;19:12;2:2;68406:25:0;;;;;;;;;;;;;-1:-1:-1;;;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;213:10;;-1:-1;;;244:29;;285:43;;;282:58;-1:-1;233:115;230:2;;;361:1;358;351:12;230:2;372:25;;-1:-1;68406:25:0;;420:4:-1;411:14;;;;68406:25:0;;;;;411:14:-1;68406:25:0;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;68406:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68378:18;:54::i;:::-;65775:2665;;;;;;;;;;:::o;25771:292::-;25915:41;25934:12;:10;:12::i;:::-;25948:7;25915:18;:41::i;:::-;25907:103;;;;-1:-1:-1;;;25907:103:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26023:32;26037:4;26043:2;26047:7;26023:13;:32::i;72078:1307::-;72268:39;72287:10;72299:7;72268:18;:39::i;:::-;:48;72260:57;;;;;;72360:18;72381;;;:9;:18;;;;;;72462:14;72454:23;;;;;;72572:10;72559:9;:23;72551:32;;;;;;72637:28;;;;:19;:28;;;;;:35;;;;;72633:297;;;72806:28;;;;:19;:28;;;;;:48;;;:97;;72780:138;;;;;;72990:20;;;;:11;:20;;;;;:27;;;;;72986:337;;;73119:20;;;;:11;:20;;;;;:27;;;73165;;;;73083:124;;-1:-1:-1;;;;;73119:27:0;;73083:17;:124::i;:::-;73279:32;;;;;;;;-1:-1:-1;73279:32:0;;;;;;;;;;;;;;;;73256:20;;;:11;:20;;;;;;;:55;;;;-1:-1:-1;;;;;;73256:55:0;-1:-1:-1;;;;;73256:55:0;;;;;;;;-1:-1:-1;73256:55:0;;;;;;;;;;;-1:-1:-1;;73256:55:0;;;;;;;;;;72986:337;73333:44;73345:7;73354:10;73366;73333:11;:44::i;37519:232::-;37599:7;37635:16;37645:5;37635:9;:16::i;:::-;37627:5;:24;37619:80;;;;-1:-1:-1;;;37619:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;37717:19:0;;;;;;:12;:19;;;;;:26;;37737:5;;37717:26;;;;;;;;;;;;;;37710:33;;37519:232;;;;;:::o;58205:151::-;56327:15;;-1:-1:-1;;;;;56327:15:0;56313:10;:29;56305:38;;;;;;58316:13;:32;;-1:-1:-1;;;;;;58316:32:0;-1:-1:-1;;;;;58316:32:0;;;;;;;;;;58205:151::o;55176:28::-;;;-1:-1:-1;;;;;55176:28:0;;:::o;26725:134::-;26812:39;26829:4;26835:2;26839:7;26812:39;;;;;;;;;;;;:16;:39::i;69805:1194::-;69917:1;69905:9;:13;69897:22;;;;;;70000:39;70019:10;70031:7;70000:18;:39::i;:::-;:48;69992:57;;;;;;70104:20;;;;:11;:20;;;;;:27;;;;;70100:680;;;70333:162;70491:3;70333:123;70425:30;70451:3;70425:21;;:25;;:30;;;;:::i;:::-;70333:20;;;;:11;:20;;;;;:57;;;;:123;:91;:123;:::i;:::-;:157;:162;:157;:162;:::i;:::-;70272:9;:246;;70246:334;;;;;-1:-1:-1;;;70246:334:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;70680:20;;;;:11;:20;;;;;:27;;;70726;;;;70644:124;;-1:-1:-1;;;;;70680:27:0;;70644:17;:124::i;:::-;70849:39;;;;;;;;;70860:10;70849:39;;;70872:9;70849:39;;;;;;;70883:4;70849:39;;;;;;-1:-1:-1;70826:20:0;;;:11;:20;;;;;:62;;;;-1:-1:-1;;;;;;70826:62:0;-1:-1:-1;;;;;70826:62:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;70826:62:0;;;;;;;;;;;70948:43;;;;;;;;;;;;;;;;;;;;;;;;;;69805:1194;:::o;61661:241::-;56327:15;;-1:-1:-1;;;;;56327:15:0;56313:10;:29;56305:38;;;;;;61783:16;61791:7;61783;:16::i;:::-;61775:25;;;;;;61864:23;;;;:14;:23;;;;;:30;;-1:-1:-1;;61864:30:0;61890:4;61864:30;;;61661:241::o;53079:53::-;;;;;;;;;;;;;;;:::o;46060:329::-;1118:12;;;;;;;;:31;;;1134:15;:13;:15::i;:::-;1118:47;;;-1:-1:-1;1154:11:0;;;;1153:12;1118:47;1110:106;;;;-1:-1:-1;;;1110:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1225:19;1248:12;;;;;;1247:13;1267:83;;;;1296:12;:19;;-1:-1:-1;;;;1296:19:0;;;;;1324:18;1311:4;1324:18;;;1267:83;46160:28;:26;:28::i;:::-;46152:37;;;;;;46202:12;;;;:5;;:12;;;;;:::i;:::-;-1:-1:-1;46225:16:0;;;;:7;;:16;;;;;:::i;:::-;-1:-1:-1;46332:49:0;-1:-1:-1;;;46332:18:0;:49::i;:::-;1372:14;1368:57;;;1412:5;1397:20;;-1:-1:-1;;1397:20:0;;;46060:329;;;:::o;53709:64::-;;;;;;;;;;;;;:::o;38352:199::-;38410:7;38446:13;:11;:13::i;:::-;38438:5;:21;38430:78;;;;-1:-1:-1;;;38430:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38526:10;38537:5;38526:17;;;;;;;;;;;;;;;;38519:24;;38352:199;;;:::o;54737:34::-;;;;:::o;53398:56::-;;;;;;;;;;;;;:::o;68448:1324::-;56623:31;;;;:16;:31;;;;;:39;68708:13;;68723:19;;-1:-1:-1;;;;;56623:39:0;56666:10;56623:53;56615:62;;;;;;56696:31;;;;:16;:31;;;;;:42;;;:56;;56688:65;;;;;;68840:1;68824:13;:17;68816:26;;;;;;68928:42;68944:10;68956:13;68928:15;:42::i;:::-;69024:50;69043:13;69058:15;;69024:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;69024:18:0;;-1:-1:-1;;;69024:50:0:i;:::-;69147:34;;;;:19;:34;;;;;:50;;69184:13;;69147:50;:::i;:::-;-1:-1:-1;69291:9:0;69286:479;69306:30;;;69286:479;;;69453:1;69419:19;;69439:1;69419:22;;;;;;;;;;;;;-1:-1:-1;;;;;69419:22:0;-1:-1:-1;;;;;69419:36:0;;;69411:45;;;;;;69577:1;69557:17;;;:21;69532:22;69689:35;;;:19;:35;;;;;69730:19;;69573:1;69730:22;;;;;;;27:10:-1;;39:1;23:18;;;45:23;;-1:-1;69689:64:0;;;69730:22;69689:64;;;;;;;;;-1:-1:-1;;;;;;69689:64:0;-1:-1:-1;;;;;69730:22:0;;;;;;;;;;;;;69689:64;;;;-1:-1:-1;69338:3:0;;;;;-1:-1:-1;69286:479:0;;55234:49;;;;:::o;22711:228::-;22766:7;22802:20;;;:11;:20;;;;;;-1:-1:-1;;;;;22802:20:0;22841:19;22833:73;;;;-1:-1:-1;;;22833:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22274:211;22329:7;-1:-1:-1;;;;;22357:19:0;;22349:74;;;;-1:-1:-1;;;22349:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22443:24:0;;;;;;:17;:24;;;;;:34;;:32;:34::i;53187:46::-;;;;;;;;;;;;;;;:::o;80176:3057::-;80482:46;80501:10;80513:14;80482:18;:46::i;:::-;:187;;;-1:-1:-1;80658:10:0;80550:23;:48;80574:23;80582:14;80574:7;:23::i;:::-;-1:-1:-1;;;;;80550:48:0;;;;;;;;;;;;;;;;;-1:-1:-1;80550:48:0;;;:104;;;;;;;;;;:118;80482:187;80460:263;;;;;-1:-1:-1;;;80460:263:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;80792:35;;;;:19;:35;;;;;:43;;;;;;;;80770:114;;;;;-1:-1:-1;;;80770:114:0;;;;;;;;;;;;-1:-1:-1;;;80770:114:0;;;;;;;;;;;;;;;80939:33;80975:35;;;:19;:35;;;;;81134:32;;;;-1:-1:-1;;81134:38:0;;81133:99;;;81230:1;81195:12;:32;;;:36;81133:99;81111:172;;;;;-1:-1:-1;;;81111:172:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;81398:30;;;;;;;;;;;;;;;;81365;;81411:9;81398:30;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;81398:30:0;-1:-1:-1;81365:63:0;-1:-1:-1;81446:9:0;81441:841;81461:19;;;81441:841;;;81540:26;81586:35;;;:19;:35;;;;;:42;;81540:26;81629:8;;81638:1;81629:11;;;;;;;;;;;;;81586:55;;;;;;;;;;;81540:101;;81753:5;:14;;;81737:9;;81747:1;81737:12;;;;;;;;;;;;;:30;;81736:89;;;;;81810:5;:14;;;81794:9;;81804:1;81794:12;;;;;;;;;;;;;:30;;81736:89;81710:162;;;;;-1:-1:-1;;;81710:162:0;;;;;;;;;;;;-1:-1:-1;;;81710:162:0;;;;;;;;;;;;;;;81987:5;:18;;;81971:9;;81981:1;81971:12;;;;;;;;;;;;;:34;;81945:122;;;;;-1:-1:-1;;;81945:122:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;82159:5;:18;;;82139:14;82154:1;82139:17;;;;;;;;;;;;;:38;;;;;82258:9;;82268:1;82258:12;;;;;;;;;;;;;;82237:18;;;;:33;;;;-1:-1:-1;81482:3:0;;81441:841;;;-1:-1:-1;82390:9:0;:13;82386:91;;82438:15;;82420:45;;-1:-1:-1;;;;;82438:15:0;82455:9;82420:17;:45::i;:::-;82584:1;82549:12;:32;;;:36;82545:434;;;82744:1;82692:32;;;;-1:-1:-1;;82692:53:0;82640:105;;-1:-1:-1;82869:27:0;;;:11;:27;;;;;:34;;;;;82865:103;;;82924:28;82937:14;82924:12;:28::i;:::-;83019:206;83053:14;83082:9;83106:12;:32;;;83153:8;;83176:14;83205:9;;83019:206;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;;;137:4;117:14;;;-1:-1;;113:30;157:16;;;83019:206:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;83019:206:0;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;83019:206:0;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;83019:206:0;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;83019:206:0;;;;-1:-1:-1;83019:206:0;;-1:-1:-1;;;;;;;;;;;;83019:206:0;80176:3057;;;;;;;:::o;54316:59::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;58789:417::-;56327:15;;-1:-1:-1;;;;;56327:15:0;56313:10;:29;56305:38;;;;;;59047:9;59042:114;59062:19;;;59042:114;;;59140:4;59103:21;:34;59125:8;;59134:1;59125:11;;;;;;;;;;;;;;;;59103:34;;-1:-1:-1;59103:34:0;;;;;;;;-1:-1:-1;59103:34:0;:41;;-1:-1:-1;;59103:41:0;;;;;;;;;;-1:-1:-1;59083:3:0;59042:114;;;;59173:25;59189:8;;59173:25;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;59173:25:0;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;59173:25:0;;;;-1:-1:-1;59173:25:0;;-1:-1:-1;;;;59173:25:0;58789:417;;:::o;36747:246::-;1118:12;;;;;;;;:31;;;1134:15;:13;:15::i;:::-;1118:47;;;-1:-1:-1;1154:11:0;;;;1153:12;1118:47;1110:106;;;;-1:-1:-1;;;1110:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1225:19;1248:12;;;;;;1247:13;1267:83;;;;1296:12;:19;;-1:-1:-1;;;;1296:19:0;;;;;1324:18;1311:4;1324:18;;;1267:83;36807:28;:26;:28::i;:::-;36799:37;;;;;;36934:51;-1:-1:-1;;;36934:18:0;:51::i;:::-;1372:14;1368:57;;;1412:5;1397:20;;-1:-1:-1;;1397:20:0;;;36747:246;:::o;55290:50::-;;;;:::o;56781:172::-;56327:15;;-1:-1:-1;;;;;56327:15:0;56313:10;:29;56305:38;;;;;;56901:19;:44;56781:172::o;78146:334::-;78259:6;78305:35;;;:19;:35;;;;;:43;;;;;;;;78283:114;;;;;-1:-1:-1;;;78283:114:0;;;;;;;;;;;;-1:-1:-1;;;78283:114:0;;;;;;;;;;;;;;;-1:-1:-1;78417:35:0;;;;:19;:35;;;;;:55;;;;78146:334::o;58441:227::-;56327:15;;-1:-1:-1;;;;;56327:15:0;56313:10;:29;56305:38;;;;;;58564:15;:36;;-1:-1:-1;;;;;58564:36:0;;-1:-1:-1;;;;;;58564:36:0;;;;;;;;58618:42;;;;;;;;;;;;;;;;58441:227;:::o;46842:89::-;46916:7;46909:14;;;;;;;;-1:-1:-1;;46909:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46883:13;;46909:14;;46916:7;;46909:14;;46916:7;46909:14;;;;;;;;;;;;;;;;;;;;;;;;78554:1070;78708:35;;;;:19;:35;;;;;:43;;;78653:15;;78708:43;;;;;78686:114;;;;;-1:-1:-1;;;78686:114:0;;;;;;;;;;;;-1:-1:-1;;;78686:114:0;;;;;;;;;;;;;;;78813:33;78849:35;;;:19;:35;;;;;78954:29;;78897:28;;78954:36;;78988:1;78954:36;:33;:36;:::i;:::-;78941:50;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;78941:50:0;-1:-1:-1;78897:94:0;-1:-1:-1;79002:22:0;;79115:470;79139:29;;79135:33;;79115:470;;;79221:22;;;;:19;;;:22;;;;;:31;79190:28;;:12;;79203:14;;79190:28;;;;;;;;;;;;;;;:62;79284:21;:14;79303:1;79284:21;:18;:21;:::i;:::-;79267:38;;79353:12;:19;;:22;79373:1;79353:22;;;;;;;;;;;:31;;;79322:12;79335:14;79322:28;;;;;;;;;;;;;;;;;:62;79416:21;:14;79435:1;79416:21;:18;:21;:::i;:::-;79399:38;;79485:12;:19;;:22;79505:1;79485:22;;;;;;;;;;;:35;;;79454:12;79467:14;79454:28;;;;;;;;;;;;;;;;;:66;79552:21;:14;79571:1;79552:21;:18;:21;:::i;:::-;79535:38;-1:-1:-1;79170:3:0;;79115:470;;;-1:-1:-1;79604:12:0;;78554:1070;-1:-1:-1;;;;78554:1070:0:o;24593:254::-;24679:12;:10;:12::i;:::-;-1:-1:-1;;;;;24673:18:0;:2;-1:-1:-1;;;;;24673:18:0;;;24665:56;;;;;-1:-1:-1;;;24665:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;24773:8;24734:18;:32;24753:12;:10;:12::i;:::-;-1:-1:-1;;;;;24734:32:0;;;;;;;;;;;;;;;;;-1:-1:-1;24734:32:0;;;:36;;;;;;;;;;;;:47;;-1:-1:-1;;24734:47:0;;;;;;;;;;;24812:12;:10;:12::i;:::-;24797:42;;;;;;;;;;-1:-1:-1;;;;;24797:42:0;;;;;;;;;;;;;;24593:254;;:::o;53286:44::-;;;;;;;;;;;;;:::o;54082:64::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;54082:64:0;;-1:-1:-1;54082:64:0;;-1:-1:-1;54082:64:0:o;83306:362::-;83401:10;83362:14;83379:33;;;:21;:33;;;;;;83433:11;83425:20;;;;;;83472:4;83464:21;:31;-1:-1:-1;83464:31:0;83456:40;;;;;;83531:10;83545:1;83509:33;;;:21;:33;;;;;;:37;;;83589:33;83545:1;;83531:10;83611:6;;83545:1;83589:33;83545:1;83589:33;83611:6;83531:10;83589:33;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;83559:63:0;;;83641:18;83633:27;;;;;27596:272;27711:41;27730:12;:10;:12::i;:::-;27744:7;27711:18;:41::i;:::-;27703:103;;;;-1:-1:-1;;;27703:103:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27817:43;27835:4;27841:2;27845:7;27854:5;27817:17;:43::i;:::-;27596:272;;;;:::o;53852:64::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;53852:64:0;;;;;:::o;61999:420::-;56327:15;;-1:-1:-1;;;;;56327:15:0;56313:10;:29;56305:38;;;;;;62197:26;:56;;;62353:58;;;;;;;;;;;;;;;;;61999:420;:::o;54625:41::-;;;;:::o;55068:30::-;;;-1:-1:-1;;;;;55068:30:0;;:::o;47138:205::-;47196:13;47230:16;47238:7;47230;:16::i;:::-;47222:76;;;;-1:-1:-1;;;47222:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47316:19;;;;:10;:19;;;;;;;;;47309:26;;;;;;-1:-1:-1;;47309:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47316:19;;47309:26;;47316:19;47309:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47138:205;;;:::o;54461:87::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;54461:87:0;;:::o;55349:850::-;1118:12;;;;;;;;:31;;;1134:15;:13;:15::i;:::-;1118:47;;;-1:-1:-1;1154:11:0;;;;1153:12;1118:47;1110:106;;;;-1:-1:-1;;;1110:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1225:19;1248:12;;;;;;1247:13;1267:83;;;;1296:12;:19;;-1:-1:-1;;;;1296:19:0;;;;;1324:18;1311:4;1324:18;;;1267:83;55541:19;:17;:19::i;:::-;55571:29;:27;:29::i;:::-;55611:39;55637:4;55643:6;55611:25;:39::i;:::-;55729:2;55700:26;:31;55825:1;55801:21;:25;55923:15;:28;;55941:10;-1:-1:-1;;;;;;55923:28:0;;;;;;;56001:15;:34;;;;;-1:-1:-1;;;;;56001:34:0;;;;;56098:19;:48;;;;56159:32;;;;;;1372:14;1368:57;;;1412:5;1397:20;;-1:-1:-1;;1397:20:0;;;1368:57;55349:850;;;;;:::o;54829:36::-;;;;:::o;54203:49::-;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;54203:49:0;;;;;;;;:::o;77749:321::-;77887:39;77906:10;77918:7;77887:18;:39::i;:::-;77879:48;;;;;;77968:18;;;;:9;:18;;;;;;;;;:27;;;78034:28;;;;;;;;;;;;;;;;;;;;;;;;77749:321;;:::o;54949:38::-;;;-1:-1:-1;;;;;54949:38:0;;:::o;57111:1029::-;56487:13;;-1:-1:-1;;;;;56487:13:0;56473:10;:27;56465:36;;;;;;57470:19;;57453:13;:36;57445:45;;;;;;57584:78;;;;;;;;-1:-1:-1;;;;;57584:78:0;;;;;;;;;;;;-1:-1:-1;57550:31:0;;;:16;:31;;;;;;:112;;;;-1:-1:-1;;;;;;57550:112:0;;;;;;;;-1:-1:-1;57550:112:0;;;;57742:36;;:29;57550:31;57584:78;57742:17;:29::i;:::-;:33;:36;:33;:36;:::i;:::-;57720:19;:58;57853:67;;;;:28;:67;;;;;;;;:97;;;57961:29;:68;;;;;;:99;;;58078:54;;;;;;;;;;;-1:-1:-1;;;;;58078:54:0;;;;;;;;;;;;;;;;;57111:1029;;;;;:::o;59292:651::-;56327:15;;-1:-1:-1;;;;;56327:15:0;56313:10;:29;56305:38;;;;;;59536:37;;;;:28;:37;;;;;;;;:67;;;59614:29;:38;;;;;;:69;;;59788:147;;;;;;;;;;;;;;;;;;;;;;;;;;;;59292:651;;;:::o;25177:147::-;-1:-1:-1;;;;;25281:25:0;;;25257:4;25281:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;25177:147::o;60015:597::-;56327:15;;-1:-1:-1;;;;;56327:15:0;56313:10;:29;56305:38;;;;;;60209:34;:72;;;60292:35;:74;;;60458:146;;;;;;;;;;;;;;;;;;;;;;;;;60015:597;;:::o;62427:3276::-;62890:3;62865:28;;;62857:65;;;;;-1:-1:-1;;;62857:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;63070:2;63036:36;;;63014:109;;;;;-1:-1:-1;;;63014:109:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;63208:35;;;;:19;:35;;;;;:43;;;;;;;;:52;63186:115;;;;;-1:-1:-1;;;63186:115:0;;;;;;;;;;;;-1:-1:-1;;;63186:115:0;;;;;;;;;;;;;;;63412:35;;;;:19;:35;;;;;:38;;63454:10;;63412:35;:38;;;;;;;;;;;;;;-1:-1:-1;;;;;63412:38:0;:52;63390:130;;;;;-1:-1:-1;;;63390:130:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;63625:46;;;63624:119;;;;-1:-1:-1;63694:48:0;;;63624:119;63602:190;;;;;-1:-1:-1;;;63602:190:0;;;;;;;;;;;;-1:-1:-1;;;63602:190:0;;;;;;;;;;;;;;;63918:17;-1:-1:-1;;63918:23:0;63917:52;;;;63967:1;63947:17;:21;63917:52;63895:125;;;;;-1:-1:-1;;;63895:125:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;64071:43;64087:10;64099:14;64071:15;:43::i;:::-;64151:51;64170:14;64186:15;;64151:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;64151:18:0;;-1:-1:-1;;;64151:51:0:i;:::-;64288:131;;;;;;;;64315:16;;:23;;64288:131;;;;64353:17;64288:131;;;;64385:4;64288:131;;;;;;64404:4;64288:131;;;;;64250:19;:35;64270:14;64250:35;;;;;;;;;;;:169;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64483:9;64495:1;64483:13;;64478:796;64498:27;;;64478:796;;;64669:14;;64684:1;64669:17;;;;;;;;;;;;;64648:14;;64663:1;64648:17;;;;;;;;;;;;;:38;;64622:119;;;;;-1:-1:-1;;;64622:119:0;;;;;;;;;;;;-1:-1:-1;;;64622:119:0;;;;;;;;;;;;;;;64857:14;;64872:1;64857:17;;;;;;;;;;;;;64834:16;;64851:1;64834:19;;;;;;;;;;;;;:40;;64833:109;;;;;64924:14;;64939:1;64924:17;;;;;;;;;;;;;64901:16;;64918:1;64901:19;;;;;;;;;;;;;:40;;64833:109;64807:188;;;;;-1:-1:-1;;;64807:188:0;;;;;;;;;;;;-1:-1:-1;;;64807:188:0;;;;;;;;;;;;;;;65102:160;;;;;;;;65133:14;;65148:1;65133:17;;;;;;;;;;;;;65102:160;;;;65169:14;;65184:1;65169:17;;;;;;;;;;;;;65102:160;;;;65205:16;;65222:1;65205:19;;;;;;;;;;;;;65102:160;;;;65243:4;65102:160;;;;;65054:19;:35;65074:14;65054:35;;;;;;;;;;;:42;;:45;65097:1;65054:45;;;;;;;;;;;:208;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64527:3;;;;;;;64478:796;;;-1:-1:-1;65388:9:0;65383:313;65403:34;;;65383:313;;;65564:1;65526:23;;65550:1;65526:26;;;;;;;;;;;;;-1:-1:-1;;;;;65526:26:0;-1:-1:-1;;;;;65526:40:0;;;65518:49;;;;;;65584:35;;;;:19;:35;;;;;65643:23;;65667:1;65643:26;;;;;;;27:10:-1;;39:1;23:18;;;45:23;;-1:-1;65584:100:0;;;65643:26;65584:100;;;;;;;;;-1:-1:-1;;;;;;65584:100:0;-1:-1:-1;;;;;65643:26:0;;;;;;;;;;;;;65584:100;;;;-1:-1:-1;65439:3:0;65383:313;;;;62427:3276;;;;;;;;;;;;:::o;29588:333::-;29673:4;29698:16;29706:7;29698;:16::i;:::-;29690:73;;;;-1:-1:-1;;;29690:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29774:13;29790:16;29798:7;29790;:16::i;:::-;29774:32;;29836:5;-1:-1:-1;;;;;29825:16:0;:7;-1:-1:-1;;;;;29825:16:0;;:51;;;;29869:7;-1:-1:-1;;;;;29845:31:0;:20;29857:7;29845:11;:20::i;:::-;-1:-1:-1;;;;;29845:31:0;;29825:51;:87;;;;29880:32;29897:5;29904:7;29880:16;:32::i;:::-;29817:96;29588:333;-1:-1:-1;;;;29588:333:0:o;74022:2918::-;74262:30;;;;:21;:30;;;;;;;;74258:2410;;;74369:22;74410:38;;;:29;:38;;;;;;74406:405;;74526:104;74626:3;74526:73;74563:35;;74526:10;:36;;:73;;;;:::i;:104::-;74509:121;;74406:405;;;74725:38;;;;:29;:38;;;;;;74688:107;;74791:3;;74688:76;;:10;;:76;:36;:76;:::i;:107::-;74671:124;;74406:405;74845:15;;74827:50;;-1:-1:-1;;;;;74845:15:0;74862:14;74827:17;:50::i;:::-;75032:21;75073:51;75120:3;75073:42;75088:26;;75073:10;:14;;:42;;;;:::i;:51::-;75215:28;;;;:19;:28;;;;;;;;;75139:119;;;;;;;;;;;;;;;;;75032:92;;-1:-1:-1;75139:119:0;;75032:92;;75139:119;;;75215:28;75139:119;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;75139:119:0;;;;;;;;;;;;;;;;;;;;;:25;:119::i;:::-;75325:28;75372:16;75380:7;75372;:16::i;:::-;75325:65;-1:-1:-1;75477:131:0;75325:65;75544:49;75579:13;75544:30;:10;75559:14;75544:30;:14;:30;:::i;:::-;:34;:49;:34;:49;:::i;:::-;75477:17;:131::i;:::-;74258:2410;;;;;;75641:30;;;;:21;:30;;;;;;;;:37;;-1:-1:-1;;75641:37:0;75674:4;75641:37;;;75792:28;:37;;;;;;75788:401;;75906:103;76005:3;75906:72;75943:34;;75906:10;:36;;:72;;;;:::i;:103::-;75889:120;;75788:401;;;76104:37;;;;:28;:37;;;;;;76067:106;;76169:3;;76067:75;;:10;;:75;:36;:75;:::i;:106::-;76050:123;;75788:401;76223:15;;76205:50;;-1:-1:-1;;;;;76223:15:0;76240:14;76205:17;:50::i;:::-;76520:136;76564:30;:10;76579:14;76564:30;:14;:30;:::i;:::-;76613:28;;;;:19;:28;;;;;;;;;76520:136;;;;;;;;;;;;;;;;;76613:28;;76520:136;;76613:28;76520:136;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;76520:136:0;;;;;;;;;;;;;;;;;;;;:25;:136::i;:::-;74258:2410;;76731:32;;;;;;;;-1:-1:-1;76731:32:0;;;;;;;;;;;;;;;;76708:20;;;:11;:20;;;;;;;:55;;;;-1:-1:-1;;;;;;76708:55:0;-1:-1:-1;;;;;76708:55:0;;;;;;;;-1:-1:-1;76708:55:0;;;;;;;;;;;-1:-1:-1;;76708:55:0;;;;;;;;;;76815:44;76829:16;76708:20;76829:7;:16::i;:::-;76847:2;76851:7;76815:13;:44::i;:::-;76898:34;;;;;;;;;;;;-1:-1:-1;;;;;76898:34:0;;;;;;;;;;;;;;;;;74022:2918;;;:::o;29063:155::-;29120:4;29153:20;;;:11;:20;;;;;;-1:-1:-1;;;;;29153:20:0;29191:19;;;29063:155::o;3046:98::-;3126:10;3046:98;:::o;71476:464::-;71543:20;;;;:11;:20;;;;;:27;;;;;71535:36;;;;;;71659:20;;;;:11;:20;;;;;:27;;;71701;;;;71627:112;;-1:-1:-1;;;;;71659:27:0;;71627:17;:112::i;:::-;71803:32;;;;;;;;-1:-1:-1;71803:32:0;;;;;;;;;;;;;;;;71780:20;;;:11;:20;;;;;;:55;;;;-1:-1:-1;;;;;;71780:55:0;-1:-1:-1;;;;;71780:55:0;;;;;;;-1:-1:-1;71780:55:0;;;;;;;;;;;-1:-1:-1;;71780:55:0;;;;;;;;;;;71911:21;;;;;;;;;;;;;;;;;71476:464;:::o;47590:195::-;47676:16;47684:7;47676;:16::i;:::-;47668:73;;;;-1:-1:-1;;;47668:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47752:19;;;;:10;:19;;;;;;;;:25;;;;;;;;:::i;30462:102::-;30530:26;30540:2;30544:7;30530:26;;;;;;;;;;;;:9;:26::i;84279:264::-;84454:1;84433:18;;;:9;:18;;;;;:22;84497:38;84517:4;84523:2;84443:7;84497:19;:38::i;83769:464::-;83947:42;;83929:12;;-1:-1:-1;;;;;83947:14:0;;;83980:4;;83968:6;;83929:12;83947:42;83929:12;83947:42;83968:6;83947:14;83980:4;83947:42;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;-1:-1;83928:61:0;;-1:-1:-1;;84084:16:0;84080:146;;-1:-1:-1;;;;;84152:32:0;;;;;;:21;:32;;;;;;:62;;84207:6;84152:62;:54;:62;:::i;:::-;-1:-1:-1;;;;;84117:32:0;;;;;;:21;:32;;;;;:97;83769:464;;;:::o;8598:181::-;8656:7;8688:5;;;8712:6;;;;8704:46;;;;;-1:-1:-1;;;8704:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;8770:1;8598:181;-1:-1:-1;;;8598:181:0:o;9970:471::-;10028:7;10273:6;10269:47;;-1:-1:-1;10303:1:0;10296:8;;10269:47;10340:5;;;10344:1;10340;:5;:1;10364:5;;;;;:10;10356:56;;;;-1:-1:-1;;;10356:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10909:132;10967:7;10994:39;10998:1;11001;10994:39;;;;;;;;;;;;;;;;;:3;:39::i;1519:508::-;1936:4;1982:17;2014:7;1519:508;:::o;21938:125::-;21992:4;22016:39;-1:-1:-1;;;22016:17:0;:39::i;:::-;22009:46;;21938:125;:::o;19456:193::-;-1:-1:-1;;;;;;19532:25:0;;;;;19524:66;;;;;-1:-1:-1;;;19524:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;19601:33:0;;;;;:20;:33;;;;;:40;;-1:-1:-1;;19601:40:0;19637:4;19601:40;;;19456:193::o;17444:114::-;17536:14;;17444:114::o;28589:272::-;28699:32;28713:4;28719:2;28723:7;28699:13;:32::i;:::-;28750:48;28773:4;28779:2;28783:7;28792:5;28750:22;:48::i;:::-;28742:111;;;;-1:-1:-1;;;28742:111:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21720:210;1118:12;;;;;;;;:31;;;1134:15;:13;:15::i;:::-;1118:47;;;-1:-1:-1;1154:11:0;;;;1153:12;1118:47;1110:106;;;;-1:-1:-1;;;1110:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1225:19;1248:12;;;;;;1247:13;1267:83;;;;1296:12;:19;;-1:-1:-1;;;;1296:19:0;;;;;1324:18;1311:4;1324:18;;;1267:83;21772:19;:17;:19::i;:::-;21882:40;-1:-1:-1;;;21882:18:0;:40::i;73477:380::-;73611:15;;:19;73607:243;;73647:20;73670:27;73681:8;:15;73670:6;:10;;:27;;;;:::i;:::-;73647:50;-1:-1:-1;73719:9:0;73714:125;73738:8;:15;73734:1;:19;73714:125;;;73779:44;73797:8;73806:1;73797:11;;;;;;;;;;;;;;73810:12;73779:17;:44::i;:::-;73755:3;;73714:125;;9054:136;9112:7;9139:43;9143:1;9146;9139:43;;;;;;;;;;;;;;;;;:3;:43::i;31178:242::-;31266:18;31272:2;31276:7;31266:5;:18::i;:::-;31303:54;31334:1;31338:2;31342:7;31351:5;31303:22;:54::i;:::-;31295:117;;;;-1:-1:-1;;;31295:117:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38935:245;39021:38;39041:4;39047:2;39051:7;39021:19;:38::i;:::-;39072:47;39105:4;39111:7;39072:32;:47::i;:::-;39132:40;39160:2;39164:7;39132:27;:40::i;11571:345::-;11657:7;11759:12;11752:5;11744:28;;;;-1:-1:-1;;;11744:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;11744:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11783:9;11799:1;11795;:5;;;;;;;11571:345;-1:-1:-1;;;;;11571:345:0:o;33505:1079::-;33627:4;33654:15;:2;-1:-1:-1;;;;;33654:13:0;;:15::i;:::-;33649:60;;-1:-1:-1;33693:4:0;33686:11;;33649:60;33780:12;33794:23;-1:-1:-1;;;;;33821:7:0;;-1:-1:-1;;;33926:12:0;:10;:12::i;:::-;33953:4;33972:7;33994:5;33829:181;;;;;;-1:-1:-1;;;;;33829:181:0;-1:-1:-1;;;;;33829:181:0;;;;;;-1:-1:-1;;;;;33829:181:0;-1:-1:-1;;;;;33829:181:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;33829:181:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33829:181:0;;;-1:-1:-1;;26:21;;;22:32;6:49;;33829:181:0;;;49:4:-1;25:18;;61:17;;-1:-1;;;;;182:15;-1:-1;;;;;;33829:181:0;;;179:29:-1;;;;160:49;;33821:190:0;;;33829:181;;33821:190;;-1:-1:-1;33821:190:0;;-1:-1:-1;25:18;-1:-1;33821:190:0;-1:-1:-1;33821:190:0;;-1:-1:-1;33821:190:0;;-1:-1:-1;25:18;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;33821:190:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;33779:232:0;;;;34027:7;34022:555;;34055:17;;:21;34051:384;;34223:10;34217:17;34284:15;34271:10;34267:2;34263:19;34256:44;34171:148;34359:60;;-1:-1:-1;;;34359:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34022:555;34467:13;34494:10;34483:32;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34483:32:0;-1:-1:-1;;;;;;34538:26:0;-1:-1:-1;;;34538:26:0;;-1:-1:-1;34530:35:0;;-1:-1:-1;;;34530:35:0;18521:238;1118:12;;;;;;;;:31;;;1134:15;:13;:15::i;:::-;1118:47;;;-1:-1:-1;1154:11:0;;;;1153:12;1118:47;1110:106;;;;-1:-1:-1;;;1110:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1225:19;1248:12;;;;;;1247:13;1267:83;;;;1296:12;:19;;-1:-1:-1;;;;1296:19:0;;;;;1324:18;1311:4;1324:18;;;1267:83;18711:40;-1:-1:-1;;;18711:18:0;:40::i;9527:192::-;9613:7;9649:12;9641:6;;;;9633:29;;;;-1:-1:-1;;;9633:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;9633:29:0;-1:-1:-1;;;9685:5:0;;;9527:192::o;39445:202::-;39509:24;39521:2;39525:7;39509:11;:24::i;:::-;39546:40;39574:2;39578:7;39546:27;:40::i;:::-;39599;39631:7;39599:31;:40::i;32394:459::-;32508:4;-1:-1:-1;;;;;32488:24:0;:16;32496:7;32488;:16::i;:::-;-1:-1:-1;;;;;32488:24:0;;32480:78;;;;-1:-1:-1;;;32480:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32577:16:0;;32569:65;;;;-1:-1:-1;;;32569:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32647:23;32662:7;32647:14;:23::i;:::-;-1:-1:-1;;;;;32683:23:0;;;;;;:17;:23;;;;;:35;;:33;:35::i;:::-;-1:-1:-1;;;;;32729:21:0;;;;;;:17;:21;;;;;:33;;:31;:33::i;:::-;32775:20;;;;:11;:20;;;;;;:25;;-1:-1:-1;;;;;;32775:25:0;-1:-1:-1;;;;;32775:25:0;;;;;;;;;32818:27;;32775:20;;32818:27;;;;;;;32394:459;;;:::o;42165:1148::-;-1:-1:-1;;;;;42456:18:0;;42431:22;42456:18;;;:12;:18;;;;;:25;:32;;42486:1;42456:32;:29;:32;:::i;:::-;42499:18;42520:26;;;:17;:26;;;;;;42431:57;;-1:-1:-1;42653:28:0;;;42649:328;;-1:-1:-1;;;;;42720:18:0;;42698:19;42720:18;;;:12;:18;;;;;:34;;42739:14;;42720:34;;;;;;;;;;;;;;42698:56;;42804:11;42771:12;:18;42784:4;-1:-1:-1;;;;;42771:18:0;-1:-1:-1;;;;;42771:18:0;;;;;;;;;;;;42790:10;42771:30;;;;;;;;;;;;;;;;;;;:44;;;;42888:30;;;:17;:30;;;;;:43;;;42649:328;-1:-1:-1;;;;;43066:18:0;;;;;;:12;:18;;;;;:27;;;;;-1:-1:-1;;43066:27:0;;;:::i;40987:186::-;-1:-1:-1;;;;;41101:16:0;;;;;;;:12;:16;;;;;;;;:23;;41072:26;;;:17;:26;;;;;:52;;;41135:16;;;39:1:-1;23:18;;45:23;;41135:30:0;;;;;;;;40987:186::o;13985:619::-;14045:4;14513:20;;14356:66;14553:23;;;;;;:42;;-1:-1:-1;;14580:15:0;;;14545:51;-1:-1:-1;;13985:619:0:o;31673:335::-;-1:-1:-1;;;;;31745:16:0;;31737:61;;;;;-1:-1:-1;;;31737:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31818:16;31826:7;31818;:16::i;:::-;31817:17;31809:58;;;;;-1:-1:-1;;;31809:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;31880:20;;;;:11;:20;;;;;;;;:25;;-1:-1:-1;;;;;;31880:25:0;-1:-1:-1;;;;;31880:25:0;;;;;;;;31916:21;;:17;:21;;;;;:33;;:31;:33::i;:::-;31967;;31992:7;;-1:-1:-1;;;;;31967:33:0;;;31984:1;;31967:33;;31984:1;;31967:33;31673:335;;:::o;41374:164::-;41478:10;:17;;41451:24;;;;:15;:24;;;;;:44;;;39:1:-1;23:18;;45:23;;41506:24:0;;;;;;;41374:164::o;34752:175::-;34852:1;34816:24;;;:15;:24;;;;;;-1:-1:-1;;;;;34816:24:0;:38;34812:108;;34906:1;34871:24;;;:15;:24;;;;;:37;;-1:-1:-1;;;;;;34871:37:0;;;34752:175::o;17755:110::-;17836:14;;:21;;17855:1;17836:21;:18;:21;:::i;:::-;17819:38;;17755:110::o;17566:181::-;17720:19;;17738:1;17720:19;;;17566:181::o;48925:35621::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;48925:35621:0;-1:-1:-1;;;;;48925:35621:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;48925:35621:0;;;-1:-1:-1;48925:35621:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48925:35621:0;;;-1:-1:-1;48925:35621:0;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;;48925:35621:0;;;;;;;;;;;;;;;;;;;;;;;;
Swarm Source
bzzr://2bff7765b0ad7a7ca5ccd768115cf47b5a65cdb2e102f8b1d4311de51fd245c2
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.