Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 241 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Approval For... | 18484497 | 451 days ago | IN | 0 ETH | 0.00115245 | ||||
Set Approval For... | 18371605 | 467 days ago | IN | 0 ETH | 0.00059021 | ||||
Set Approval For... | 16975512 | 663 days ago | IN | 0 ETH | 0.00112984 | ||||
Set Approval For... | 16663437 | 707 days ago | IN | 0 ETH | 0.00149613 | ||||
Set Approval For... | 16642782 | 710 days ago | IN | 0 ETH | 0.00098558 | ||||
Set Approval For... | 15769824 | 832 days ago | IN | 0 ETH | 0.00120962 | ||||
Set Approval For... | 15566219 | 860 days ago | IN | 0 ETH | 0.00018092 | ||||
Set Approval For... | 15566219 | 860 days ago | IN | 0 ETH | 0.00018154 | ||||
Set Approval For... | 15395066 | 887 days ago | IN | 0 ETH | 0.00039161 | ||||
Set Approval For... | 15272514 | 906 days ago | IN | 0 ETH | 0.00062887 | ||||
Set Approval For... | 15232915 | 913 days ago | IN | 0 ETH | 0.00140021 | ||||
Set Approval For... | 15160396 | 924 days ago | IN | 0 ETH | 0.00031071 | ||||
Set Approval For... | 15134065 | 928 days ago | IN | 0 ETH | 0.00098431 | ||||
Set Approval For... | 15115590 | 931 days ago | IN | 0 ETH | 0.00169036 | ||||
Set Approval For... | 15012284 | 948 days ago | IN | 0 ETH | 0.00152686 | ||||
Set Approval For... | 14990826 | 952 days ago | IN | 0 ETH | 0.00069918 | ||||
Transfer From | 14943533 | 960 days ago | IN | 0 ETH | 0.00157313 | ||||
Transfer From | 14901472 | 967 days ago | IN | 0 ETH | 0.00211183 | ||||
Transfer From | 14779579 | 987 days ago | IN | 0 ETH | 0.00088621 | ||||
Set Approval For... | 14761463 | 990 days ago | IN | 0 ETH | 0.00377106 | ||||
Approve | 14742855 | 993 days ago | IN | 0 ETH | 0.00375628 | ||||
Update UR Is | 14725914 | 996 days ago | IN | 0 ETH | 0.00349003 | ||||
Set Approval For... | 14725190 | 996 days ago | IN | 0 ETH | 0.00148395 | ||||
Transfer From | 14724402 | 996 days ago | IN | 0 ETH | 0.00379214 | ||||
Transfer From | 14724400 | 996 days ago | IN | 0 ETH | 0.00359872 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
adreamwithinadream
Compiler Version
v0.8.11+commit.d7f03943
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-02-28 */ // SPDX-License-Identifier: MIT // File: @openzeppelin/contracts/utils/structs/EnumerableSet.sol // OpenZeppelin Contracts v4.4.1 (utils/structs/EnumerableSet.sol) pragma solidity ^0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; if (lastIndex != toDeleteIndex) { bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = valueIndex; // Replace lastvalue's index to valueIndex } // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { return _values(set._inner); } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; assembly { result := store } return result; } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; assembly { result := store } return result; } } // File: @manifoldxyz/royalty-registry-solidity/contracts/specs/IEIP2981.sol pragma solidity ^0.8.0; /** * EIP-2981 */ interface IEIP2981 { /** * bytes4(keccak256("royaltyInfo(uint256,uint256)")) == 0x2a55205a * * => 0x2a55205a = 0x2a55205a */ function royaltyInfo(uint256 tokenId, uint256 value) external view returns (address, uint256); } // File: @openzeppelin/contracts/token//ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: @openzeppelin/contracts/utils/Counters.sol // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. 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;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @manifoldxyz/libraries-solidity/contracts/access/IAdminControl.sol pragma solidity ^0.8.0; /// @author: manifold.xyz /** * @dev Interface for admin control */ interface IAdminControl is IERC165 { event AdminApproved(address indexed account, address indexed sender); event AdminRevoked(address indexed account, address indexed sender); /** * @dev gets address of all admins */ function getAdmins() external view returns (address[] memory); /** * @dev add an admin. Can only be called by contract owner. */ function approveAdmin(address admin) external; /** * @dev remove an admin. Can only be called by contract owner. */ function revokeAdmin(address admin) external; /** * @dev checks whether or not given address is an admin * Returns True if they are */ function isAdmin(address admin) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @manifoldxyz/libraries-solidity/contracts/access/AdminControl.sol pragma solidity ^0.8.0; abstract contract AdminControl is Ownable, IAdminControl, ERC165 { using EnumerableSet for EnumerableSet.AddressSet; // Track registered admins EnumerableSet.AddressSet private _admins; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IAdminControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Only allows approved admins to call the specified function */ modifier adminRequired() { require(owner() == msg.sender || _admins.contains(msg.sender), "AdminControl: Must be owner or admin"); _; } /** * @dev See {IAdminControl-getAdmins}. */ function getAdmins() external view override returns (address[] memory admins) { admins = new address[](_admins.length()); for (uint i = 0; i < _admins.length(); i++) { admins[i] = _admins.at(i); } return admins; } /** * @dev See {IAdminControl-approveAdmin}. */ function approveAdmin(address admin) external override onlyOwner { if (!_admins.contains(admin)) { emit AdminApproved(admin, msg.sender); _admins.add(admin); } } /** * @dev See {IAdminControl-revokeAdmin}. */ function revokeAdmin(address admin) external override onlyOwner { if (_admins.contains(admin)) { emit AdminRevoked(admin, msg.sender); _admins.remove(admin); } } /** * @dev See {IAdminControl-isAdmin}. */ function isAdmin(address admin) public override view returns (bool) { return (owner() == admin || _admins.contains(admin)); } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721URIStorage.sol) pragma solidity ^0.8.0; /** * @dev ERC721 token with storage based token URI management. */ abstract contract ERC721URIStorage is ERC721 { using Strings for uint256; // Optional mapping for token URIs mapping(uint256 => string) private _tokenURIs; /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721URIStorage: URI query for nonexistent token"); string memory _tokenURI = _tokenURIs[tokenId]; string memory base = _baseURI(); // If there is no base URI, return the token URI. if (bytes(base).length == 0) { return _tokenURI; } // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked). if (bytes(_tokenURI).length > 0) { return string(abi.encodePacked(base, _tokenURI)); } return super.tokenURI(tokenId); } /** * @dev Sets `_tokenURI` as the tokenURI of `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual { require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token"); _tokenURIs[tokenId] = _tokenURI; } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual override { super._burn(tokenId); if (bytes(_tokenURIs[tokenId]).length != 0) { delete _tokenURIs[tokenId]; } } } // File: contracts/Adreamwithinadream.sol pragma solidity >= 0.8.11; ///////////////////////////////////// // // // // // 'a dream within a dream' // // // // by @the_grecu // // // // // ///////////////////////////////////// contract adreamwithinadream is Ownable, IEIP2981, ERC721URIStorage, AdminControl { using Counters for Counters.Counter; mapping (uint256 => uint256) _urisByToken; mapping (address => uint256) public _tokensWhitelisted; mapping (address => uint256) public _tokensClaimed; string [] _uris; uint256 public ashPrice = 15000000000000000000; // 15 ASH uint256 _royalties_amount; address public ashContract = 0x64D91f12Ece7362F91A6f8E7940Cd55F05060b92; address _royalties_recipient; Counters.Counter private _nextTokenId; constructor () ERC721("adreamwithinadream", "dream") { } function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721, AdminControl) returns (bool) { return AdminControl.supportsInterface(interfaceId) || ERC721.supportsInterface(interfaceId) || interfaceId == type(IEIP2981).interfaceId || super.supportsInterface(interfaceId); } function mint( address account, uint256 tokenQuantity ) external{ require(_uris.length > 0 && tokenQuantity > 0, "Add a URI before minting and mint a positive number of tokens"); require( _tokensClaimed[account] + tokenQuantity <= _tokensWhitelisted[account] || isAdmin(msg.sender), "You are not whitelisted for that many tokens!"); if(!isAdmin(msg.sender)){ IERC20(ashContract).transferFrom(msg.sender, _royalties_recipient, ashPrice * tokenQuantity); } for(uint256 i = 1; i <= tokenQuantity; i++){ _nextTokenId.increment(); uint256 tokenId = _nextTokenId.current(); _safeMint(account, tokenId); _urisByToken[tokenId] = 0; _setTokenURI(tokenId, _uris[0]); _tokensClaimed[account] += 1; } } function mintSpecial(address account, string calldata uri) external adminRequired{ _nextTokenId.increment(); uint256 tokenId = _nextTokenId.current(); _safeMint(account, tokenId); _setTokenURI(tokenId, uri); } function loadWL( address[] calldata _whitelistedAddresses, uint256[] calldata _amount )external adminRequired{ for(uint256 i; i<_whitelistedAddresses.length; i++){ _tokensWhitelisted[_whitelistedAddresses[i]] = _amount[i]; } } function updateURIs(string [] calldata uris) public adminRequired{ delete _uris; for(uint256 i=0; i < uris.length; i++){ _uris.push(uris[i]); } } function getURIs()public view adminRequired returns ( string [] memory){ return _uris; } function _incrementURI( uint256 tokenId ) private { _urisByToken[tokenId] = _urisByToken[tokenId] + 1; _setTokenURI(tokenId, _uris[_urisByToken[tokenId]]); } function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal override { if(to != address(0) && from != address(0)){ if(_urisByToken[tokenId] < _uris.length - 1){ _incrementURI(tokenId); } } } function burn(uint256 tokenId) public { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved"); _burn(tokenId); } function setRoyalties(address _recipient, uint256 _amount) external adminRequired { _royalties_recipient = _recipient; _royalties_amount = _amount; } function royaltyInfo(uint256 tokenId, uint256 salePrice) public override view returns (address, uint256) { if(tokenId <= _nextTokenId.current() && _royalties_recipient != address(0)){ return (_royalties_recipient, (salePrice * _royalties_amount) / 100 ); } return (address(0), 0); } function withdraw(address recipient) external adminRequired { payable(recipient).transfer(address(this).balance); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"AdminApproved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"AdminRevoked","type":"event"},{"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":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_tokensClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_tokensWhitelisted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"name":"approveAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"ashContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ashPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getAdmins","outputs":[{"internalType":"address[]","name":"admins","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getURIs","outputs":[{"internalType":"string[]","name":"","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"name":"isAdmin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_whitelistedAddresses","type":"address[]"},{"internalType":"uint256[]","name":"_amount","type":"uint256[]"}],"name":"loadWL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"tokenQuantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"string","name":"uri","type":"string"}],"name":"mintSpecial","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"name":"revokeAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setRoyalties","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string[]","name":"uris","type":"string[]"}],"name":"updateURIs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405267d02ab486cedc0000600e557364d91f12ece7362f91a6f8e7940cd55f05060b92601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200007257600080fd5b506040518060400160405280601281526020017f61647265616d77697468696e61647265616d00000000000000000000000000008152506040518060400160405280600581526020017f647265616d000000000000000000000000000000000000000000000000000000815250620000ff620000f36200013960201b60201c565b6200014160201b60201c565b81600190805190602001906200011792919062000205565b5080600290805190602001906200013092919062000205565b5050506200031a565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200021390620002e4565b90600052602060002090601f01602090048101928262000237576000855562000283565b82601f106200025257805160ff191683800117855562000283565b8280016001018555821562000283579182015b828111156200028257825182559160200191906001019062000265565b5b50905062000292919062000296565b5090565b5b80821115620002b157600081600090555060010162000297565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620002fd57607f821691505b60208210811415620003145762000313620002b5565b5b50919050565b61512a806200032a6000396000f3fe608060405234801561001057600080fd5b50600436106101fb5760003560e01c8063582453621161011a57806395d89b41116100ad578063b88d4fde1161007c578063b88d4fde14610599578063bc8485a5146105b5578063c87b56dd146105e5578063e985e9c514610615578063f2fde38b14610645576101fb565b806395d89b4114610525578063a22cb46514610543578063a420ed3e1461055f578063b7951cf71461057d576101fb565b8063715018a6116100e9578063715018a6146104c35780638c7ea24b146104cd5780638cf77604146104e95780638da5cb5b14610507576101fb565b8063582453621461042b5780636352211e146104475780636d73e6691461047757806370a0823114610493576101fb565b80632a55205a1161019257806340c10f191161016157806340c10f19146103bb57806342842e0e146103d757806342966c68146103f357806351cff8d91461040f576101fb565b80632a55205a146103205780632d345670146103515780632f25662a1461036d57806331ae450b1461039d576101fb565b80631a04c4ec116101ce5780631a04c4ec1461029a57806323b872dd146102b657806324d7806c146102d257806328c5440f14610302576101fb565b806301ffc9a71461020057806306fdde0314610230578063081812fc1461024e578063095ea7b31461027e575b600080fd5b61021a600480360381019061021591906135c8565b610661565b6040516102279190613610565b60405180910390f35b6102386106fb565b60405161024591906136c4565b60405180910390f35b6102686004803603810190610263919061371c565b61078d565b604051610275919061378a565b60405180910390f35b610298600480360381019061029391906137d1565b610812565b005b6102b460048036038101906102af9190613876565b61092a565b005b6102d060048036038101906102cb91906138d6565b610a30565b005b6102ec60048036038101906102e79190613929565b610a90565b6040516102f99190613610565b60405180910390f35b61030a610aea565b6040516103179190613a62565b60405180910390f35b61033a60048036038101906103359190613a84565b610c53565b604051610348929190613ad3565b60405180910390f35b61036b60048036038101906103669190613929565b610d18565b005b61038760048036038101906103829190613929565b610e20565b6040516103949190613afc565b60405180910390f35b6103a5610e38565b6040516103b29190613bd5565b60405180910390f35b6103d560048036038101906103d091906137d1565b610f1a565b005b6103f160048036038101906103ec91906138d6565b611294565b005b61040d6004803603810190610408919061371c565b6112b4565b005b61042960048036038101906104249190613929565b611310565b005b61044560048036038101906104409190613ca3565b6113ea565b005b610461600480360381019061045c919061371c565b611526565b60405161046e919061378a565b60405180910390f35b610491600480360381019061048c9190613929565b6115d8565b005b6104ad60048036038101906104a89190613929565b6116df565b6040516104ba9190613afc565b60405180910390f35b6104cb611797565b005b6104e760048036038101906104e291906137d1565b61181f565b005b6104f16118fb565b6040516104fe9190613afc565b60405180910390f35b61050f611901565b60405161051c919061378a565b60405180910390f35b61052d61192a565b60405161053a91906136c4565b60405180910390f35b61055d60048036038101906105589190613d50565b6119bc565b005b6105676119d2565b604051610574919061378a565b60405180910390f35b61059760048036038101906105929190613de6565b6119f8565b005b6105b360048036038101906105ae9190613f63565b611b1d565b005b6105cf60048036038101906105ca9190613929565b611b7f565b6040516105dc9190613afc565b60405180910390f35b6105ff60048036038101906105fa919061371c565b611b97565b60405161060c91906136c4565b60405180910390f35b61062f600480360381019061062a9190613fe6565b611ce9565b60405161063c9190613610565b60405180910390f35b61065f600480360381019061065a9190613929565b611d7d565b005b600061066c82611e75565b8061067c575061067b82611eef565b5b806106e457507f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106f457506106f382611e75565b5b9050919050565b60606001805461070a90614055565b80601f016020809104026020016040519081016040528092919081815260200182805461073690614055565b80156107835780601f1061075857610100808354040283529160200191610783565b820191906000526020600020905b81548152906001019060200180831161076657829003601f168201915b5050505050905090565b600061079882611fd1565b6107d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107ce906140f9565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061081d82611526565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561088e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108859061418b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108ad61203d565b73ffffffffffffffffffffffffffffffffffffffff1614806108dc57506108db816108d661203d565b611ce9565b5b61091b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109129061421d565b60405180910390fd5b6109258383612045565b505050565b3373ffffffffffffffffffffffffffffffffffffffff16610949611901565b73ffffffffffffffffffffffffffffffffffffffff16148061097b575061097a3360086120fe90919063ffffffff16565b5b6109ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b1906142af565b60405180910390fd5b6109c4601261212e565b60006109d06012612144565b90506109dc8482612152565b610a2a8184848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612170565b50505050565b610a41610a3b61203d565b826121e4565b610a80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7790614341565b60405180910390fd5b610a8b8383836122c2565b505050565b60008173ffffffffffffffffffffffffffffffffffffffff16610ab1611901565b73ffffffffffffffffffffffffffffffffffffffff161480610ae35750610ae28260086120fe90919063ffffffff16565b5b9050919050565b60603373ffffffffffffffffffffffffffffffffffffffff16610b0b611901565b73ffffffffffffffffffffffffffffffffffffffff161480610b3d5750610b3c3360086120fe90919063ffffffff16565b5b610b7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b73906142af565b60405180910390fd5b600d805480602002602001604051908101604052809291908181526020016000905b82821015610c4a578382906000526020600020018054610bbd90614055565b80601f0160208091040260200160405190810160405280929190818152602001828054610be990614055565b8015610c365780601f10610c0b57610100808354040283529160200191610c36565b820191906000526020600020905b815481529060010190602001808311610c1957829003601f168201915b505050505081526020019060010190610b9e565b50505050905090565b600080610c606012612144565b8411158015610cbe5750600073ffffffffffffffffffffffffffffffffffffffff16601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b15610d0957601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166064600f5485610cf69190614390565b610d009190614419565b91509150610d11565b600080915091505b9250929050565b610d2061203d565b73ffffffffffffffffffffffffffffffffffffffff16610d3e611901565b73ffffffffffffffffffffffffffffffffffffffff1614610d94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8b90614496565b60405180910390fd5b610da88160086120fe90919063ffffffff16565b15610e1d573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f7c0c3c84c67c85fcac635147348bfe374c24a1a93d0366d1cfe9d8853cbf89d560405160405180910390a3610e1b81600861252990919063ffffffff16565b505b50565b600b6020528060005260406000206000915090505481565b6060610e446008612559565b67ffffffffffffffff811115610e5d57610e5c613e38565b5b604051908082528060200260200182016040528015610e8b5781602001602082028036833780820191505090505b50905060005b610e9b6008612559565b811015610f1657610eb681600861256e90919063ffffffff16565b828281518110610ec957610ec86144b6565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508080610f0e906144e5565b915050610e91565b5090565b6000600d80549050118015610f2f5750600081115b610f6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f65906145a0565b60405180910390fd5b600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610ff991906145c0565b11158061100b575061100a33610a90565b5b61104a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104190614688565b60405180910390fd5b61105333610a90565b61112a57601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd33601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684600e546110c79190614390565b6040518463ffffffff1660e01b81526004016110e5939291906146a8565b6020604051808303816000875af1158015611104573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061112891906146f4565b505b6000600190505b81811161128f57611142601261212e565b600061114e6012612144565b905061115a8482612152565b6000600a60008381526020019081526020016000208190555061122481600d60008154811061118c5761118b6144b6565b5b9060005260206000200180546111a190614055565b80601f01602080910402602001604051908101604052809291908181526020018280546111cd90614055565b801561121a5780601f106111ef5761010080835404028352916020019161121a565b820191906000526020600020905b8154815290600101906020018083116111fd57829003601f168201915b5050505050612170565b6001600c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461127491906145c0565b92505081905550508080611287906144e5565b915050611131565b505050565b6112af83838360405180602001604052806000815250611b1d565b505050565b6112c56112bf61203d565b826121e4565b611304576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112fb90614793565b60405180910390fd5b61130d81612588565b50565b3373ffffffffffffffffffffffffffffffffffffffff1661132f611901565b73ffffffffffffffffffffffffffffffffffffffff16148061136157506113603360086120fe90919063ffffffff16565b5b6113a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611397906142af565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156113e6573d6000803e3d6000fd5b5050565b3373ffffffffffffffffffffffffffffffffffffffff16611409611901565b73ffffffffffffffffffffffffffffffffffffffff16148061143b575061143a3360086120fe90919063ffffffff16565b5b61147a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611471906142af565b60405180910390fd5b60005b8484905081101561151f5782828281811061149b5761149a6144b6565b5b90506020020135600b60008787858181106114b9576114b86144b6565b5b90506020020160208101906114ce9190613929565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508080611517906144e5565b91505061147d565b5050505050565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156115cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c690614825565b60405180910390fd5b80915050919050565b6115e061203d565b73ffffffffffffffffffffffffffffffffffffffff166115fe611901565b73ffffffffffffffffffffffffffffffffffffffff1614611654576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164b90614496565b60405180910390fd5b6116688160086120fe90919063ffffffff16565b6116dc573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f7e1a1a08d52e4ba0e21554733d66165fd5151f99460116223d9e3a608eec5cb160405160405180910390a36116da8160086125db90919063ffffffff16565b505b50565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611750576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611747906148b7565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61179f61203d565b73ffffffffffffffffffffffffffffffffffffffff166117bd611901565b73ffffffffffffffffffffffffffffffffffffffff1614611813576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180a90614496565b60405180910390fd5b61181d600061260b565b565b3373ffffffffffffffffffffffffffffffffffffffff1661183e611901565b73ffffffffffffffffffffffffffffffffffffffff161480611870575061186f3360086120fe90919063ffffffff16565b5b6118af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a6906142af565b60405180910390fd5b81601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600f819055505050565b600e5481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606002805461193990614055565b80601f016020809104026020016040519081016040528092919081815260200182805461196590614055565b80156119b25780601f10611987576101008083540402835291602001916119b2565b820191906000526020600020905b81548152906001019060200180831161199557829003601f168201915b5050505050905090565b6119ce6119c761203d565b83836126cf565b5050565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b3373ffffffffffffffffffffffffffffffffffffffff16611a17611901565b73ffffffffffffffffffffffffffffffffffffffff161480611a495750611a483360086120fe90919063ffffffff16565b5b611a88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7f906142af565b60405180910390fd5b600d6000611a9691906133ae565b60005b82829050811015611b1857600d838383818110611ab957611ab86144b6565b5b9050602002810190611acb91906148e6565b90918060018154018082558091505060019003906000526020600020016000909192909192909192909192509190611b049291906133cf565b508080611b10906144e5565b915050611a99565b505050565b611b2e611b2861203d565b836121e4565b611b6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6490614341565b60405180910390fd5b611b798484848461283c565b50505050565b600c6020528060005260406000206000915090505481565b6060611ba282611fd1565b611be1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd8906149bb565b60405180910390fd5b6000600760008481526020019081526020016000208054611c0190614055565b80601f0160208091040260200160405190810160405280929190818152602001828054611c2d90614055565b8015611c7a5780601f10611c4f57610100808354040283529160200191611c7a565b820191906000526020600020905b815481529060010190602001808311611c5d57829003601f168201915b505050505090506000611c8b612898565b9050600081511415611ca1578192505050611ce4565b600082511115611cd6578082604051602001611cbe929190614a17565b60405160208183030381529060405292505050611ce4565b611cdf846128af565b925050505b919050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611d8561203d565b73ffffffffffffffffffffffffffffffffffffffff16611da3611901565b73ffffffffffffffffffffffffffffffffffffffff1614611df9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df090614496565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611e69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6090614aad565b60405180910390fd5b611e728161260b565b50565b60007f553e757e000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611ee85750611ee782611eef565b5b9050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611fba57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611fca5750611fc982612956565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166120b883611526565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612126836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6129c0565b905092915050565b6001816000016000828254019250508190555050565b600081600001549050919050565b61216c8282604051806020016040528060008152506129e3565b5050565b61217982611fd1565b6121b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121af90614b3f565b60405180910390fd5b806007600084815260200190815260200160002090805190602001906121df929190613455565b505050565b60006121ef82611fd1565b61222e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222590614bd1565b60405180910390fd5b600061223983611526565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806122a857508373ffffffffffffffffffffffffffffffffffffffff166122908461078d565b73ffffffffffffffffffffffffffffffffffffffff16145b806122b957506122b88185611ce9565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166122e282611526565b73ffffffffffffffffffffffffffffffffffffffff1614612338576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232f90614c63565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156123a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239f90614cf5565b60405180910390fd5b6123b3838383612a3e565b6123be600082612045565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461240e9190614d15565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461246591906145c0565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612524838383612ae9565b505050565b6000612551836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612aee565b905092915050565b600061256782600001612c02565b9050919050565b600061257d8360000183612c13565b60001c905092915050565b61259181612c3e565b60006007600083815260200190815260200160002080546125b190614055565b9050146125d8576007600082815260200190815260200160002060006125d791906134db565b5b50565b6000612603836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612d5b565b905092915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561273e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161273590614d95565b60405180910390fd5b80600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161282f9190613610565b60405180910390a3505050565b6128478484846122c2565b61285384848484612dcb565b612892576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161288990614e27565b60405180910390fd5b50505050565b606060405180602001604052806000815250905090565b60606128ba82611fd1565b6128f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128f090614eb9565b60405180910390fd5b6000612903612898565b90506000815111612923576040518060200160405280600081525061294e565b8061292d84612f53565b60405160200161293e929190614a17565b6040516020818303038152906040525b915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600080836001016000848152602001908152602001600020541415905092915050565b6129ed83836130b4565b6129fa6000848484612dcb565b612a39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a3090614e27565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614158015612aa85750600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b15612ae4576001600d80549050612abf9190614d15565b600a6000838152602001908152602001600020541015612ae357612ae28161328e565b5b5b505050565b505050565b60008083600101600084815260200190815260200160002054905060008114612bf6576000600182612b209190614d15565b9050600060018660000180549050612b389190614d15565b9050818114612ba7576000866000018281548110612b5957612b586144b6565b5b9060005260206000200154905080876000018481548110612b7d57612b7c6144b6565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b85600001805480612bbb57612bba614ed9565b5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050612bfc565b60009150505b92915050565b600081600001805490509050919050565b6000826000018281548110612c2b57612c2a6144b6565b5b9060005260206000200154905092915050565b6000612c4982611526565b9050612c5781600084612a3e565b612c62600083612045565b6001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612cb29190614d15565b925050819055506003600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612d5781600084612ae9565b5050565b6000612d6783836129c0565b612dc0578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050612dc5565b600090505b92915050565b6000612dec8473ffffffffffffffffffffffffffffffffffffffff1661338b565b15612f46578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612e1561203d565b8786866040518563ffffffff1660e01b8152600401612e379493929190614f5d565b6020604051808303816000875af1925050508015612e7357506040513d601f19601f82011682018060405250810190612e709190614fbe565b60015b612ef6573d8060008114612ea3576040519150601f19603f3d011682016040523d82523d6000602084013e612ea8565b606091505b50600081511415612eee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ee590614e27565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612f4b565b600190505b949350505050565b60606000821415612f9b576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506130af565b600082905060005b60008214612fcd578080612fb6906144e5565b915050600a82612fc69190614419565b9150612fa3565b60008167ffffffffffffffff811115612fe957612fe8613e38565b5b6040519080825280601f01601f19166020018201604052801561301b5781602001600182028036833780820191505090505b5090505b600085146130a8576001826130349190614d15565b9150600a856130439190614feb565b603061304f91906145c0565b60f81b818381518110613065576130646144b6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856130a19190614419565b945061301f565b8093505050505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613124576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161311b90615068565b60405180910390fd5b61312d81611fd1565b1561316d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613164906150d4565b60405180910390fd5b61317960008383612a3e565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546131c991906145c0565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461328a60008383612ae9565b5050565b6001600a6000838152602001908152602001600020546132ae91906145c0565b600a60008381526020019081526020016000208190555061338881600d600a600085815260200190815260200160002054815481106132f0576132ef6144b6565b5b90600052602060002001805461330590614055565b80601f016020809104026020016040519081016040528092919081815260200182805461333190614055565b801561337e5780601f106133535761010080835404028352916020019161337e565b820191906000526020600020905b81548152906001019060200180831161336157829003601f168201915b5050505050612170565b50565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b50805460008255906000526020600020908101906133cc919061351b565b50565b8280546133db90614055565b90600052602060002090601f0160209004810192826133fd5760008555613444565b82601f1061341657803560ff1916838001178555613444565b82800160010185558215613444579182015b82811115613443578235825591602001919060010190613428565b5b509050613451919061353f565b5090565b82805461346190614055565b90600052602060002090601f01602090048101928261348357600085556134ca565b82601f1061349c57805160ff19168380011785556134ca565b828001600101855582156134ca579182015b828111156134c95782518255916020019190600101906134ae565b5b5090506134d7919061353f565b5090565b5080546134e790614055565b6000825580601f106134f95750613518565b601f016020900490600052602060002090810190613517919061353f565b5b50565b5b8082111561353b576000818161353291906134db565b5060010161351c565b5090565b5b80821115613558576000816000905550600101613540565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6135a581613570565b81146135b057600080fd5b50565b6000813590506135c28161359c565b92915050565b6000602082840312156135de576135dd613566565b5b60006135ec848285016135b3565b91505092915050565b60008115159050919050565b61360a816135f5565b82525050565b60006020820190506136256000830184613601565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561366557808201518184015260208101905061364a565b83811115613674576000848401525b50505050565b6000601f19601f8301169050919050565b60006136968261362b565b6136a08185613636565b93506136b0818560208601613647565b6136b98161367a565b840191505092915050565b600060208201905081810360008301526136de818461368b565b905092915050565b6000819050919050565b6136f9816136e6565b811461370457600080fd5b50565b600081359050613716816136f0565b92915050565b60006020828403121561373257613731613566565b5b600061374084828501613707565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061377482613749565b9050919050565b61378481613769565b82525050565b600060208201905061379f600083018461377b565b92915050565b6137ae81613769565b81146137b957600080fd5b50565b6000813590506137cb816137a5565b92915050565b600080604083850312156137e8576137e7613566565b5b60006137f6858286016137bc565b925050602061380785828601613707565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f84011261383657613835613811565b5b8235905067ffffffffffffffff81111561385357613852613816565b5b60208301915083600182028301111561386f5761386e61381b565b5b9250929050565b60008060006040848603121561388f5761388e613566565b5b600061389d868287016137bc565b935050602084013567ffffffffffffffff8111156138be576138bd61356b565b5b6138ca86828701613820565b92509250509250925092565b6000806000606084860312156138ef576138ee613566565b5b60006138fd868287016137bc565b935050602061390e868287016137bc565b925050604061391f86828701613707565b9150509250925092565b60006020828403121561393f5761393e613566565b5b600061394d848285016137bc565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600082825260208201905092915050565b600061399e8261362b565b6139a88185613982565b93506139b8818560208601613647565b6139c18161367a565b840191505092915050565b60006139d88383613993565b905092915050565b6000602082019050919050565b60006139f882613956565b613a028185613961565b935083602082028501613a1485613972565b8060005b85811015613a505784840389528151613a3185826139cc565b9450613a3c836139e0565b925060208a01995050600181019050613a18565b50829750879550505050505092915050565b60006020820190508181036000830152613a7c81846139ed565b905092915050565b60008060408385031215613a9b57613a9a613566565b5b6000613aa985828601613707565b9250506020613aba85828601613707565b9150509250929050565b613acd816136e6565b82525050565b6000604082019050613ae8600083018561377b565b613af56020830184613ac4565b9392505050565b6000602082019050613b116000830184613ac4565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613b4c81613769565b82525050565b6000613b5e8383613b43565b60208301905092915050565b6000602082019050919050565b6000613b8282613b17565b613b8c8185613b22565b9350613b9783613b33565b8060005b83811015613bc8578151613baf8882613b52565b9750613bba83613b6a565b925050600181019050613b9b565b5085935050505092915050565b60006020820190508181036000830152613bef8184613b77565b905092915050565b60008083601f840112613c0d57613c0c613811565b5b8235905067ffffffffffffffff811115613c2a57613c29613816565b5b602083019150836020820283011115613c4657613c4561381b565b5b9250929050565b60008083601f840112613c6357613c62613811565b5b8235905067ffffffffffffffff811115613c8057613c7f613816565b5b602083019150836020820283011115613c9c57613c9b61381b565b5b9250929050565b60008060008060408587031215613cbd57613cbc613566565b5b600085013567ffffffffffffffff811115613cdb57613cda61356b565b5b613ce787828801613bf7565b9450945050602085013567ffffffffffffffff811115613d0a57613d0961356b565b5b613d1687828801613c4d565b925092505092959194509250565b613d2d816135f5565b8114613d3857600080fd5b50565b600081359050613d4a81613d24565b92915050565b60008060408385031215613d6757613d66613566565b5b6000613d75858286016137bc565b9250506020613d8685828601613d3b565b9150509250929050565b60008083601f840112613da657613da5613811565b5b8235905067ffffffffffffffff811115613dc357613dc2613816565b5b602083019150836020820283011115613ddf57613dde61381b565b5b9250929050565b60008060208385031215613dfd57613dfc613566565b5b600083013567ffffffffffffffff811115613e1b57613e1a61356b565b5b613e2785828601613d90565b92509250509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613e708261367a565b810181811067ffffffffffffffff82111715613e8f57613e8e613e38565b5b80604052505050565b6000613ea261355c565b9050613eae8282613e67565b919050565b600067ffffffffffffffff821115613ece57613ecd613e38565b5b613ed78261367a565b9050602081019050919050565b82818337600083830152505050565b6000613f06613f0184613eb3565b613e98565b905082815260208101848484011115613f2257613f21613e33565b5b613f2d848285613ee4565b509392505050565b600082601f830112613f4a57613f49613811565b5b8135613f5a848260208601613ef3565b91505092915050565b60008060008060808587031215613f7d57613f7c613566565b5b6000613f8b878288016137bc565b9450506020613f9c878288016137bc565b9350506040613fad87828801613707565b925050606085013567ffffffffffffffff811115613fce57613fcd61356b565b5b613fda87828801613f35565b91505092959194509250565b60008060408385031215613ffd57613ffc613566565b5b600061400b858286016137bc565b925050602061401c858286016137bc565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061406d57607f821691505b6020821081141561408157614080614026565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006140e3602c83613636565b91506140ee82614087565b604082019050919050565b60006020820190508181036000830152614112816140d6565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000614175602183613636565b915061418082614119565b604082019050919050565b600060208201905081810360008301526141a481614168565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000614207603883613636565b9150614212826141ab565b604082019050919050565b60006020820190508181036000830152614236816141fa565b9050919050565b7f41646d696e436f6e74726f6c3a204d757374206265206f776e6572206f72206160008201527f646d696e00000000000000000000000000000000000000000000000000000000602082015250565b6000614299602483613636565b91506142a48261423d565b604082019050919050565b600060208201905081810360008301526142c88161428c565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b600061432b603183613636565b9150614336826142cf565b604082019050919050565b6000602082019050818103600083015261435a8161431e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061439b826136e6565b91506143a6836136e6565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156143df576143de614361565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614424826136e6565b915061442f836136e6565b92508261443f5761443e6143ea565b5b828204905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614480602083613636565b915061448b8261444a565b602082019050919050565b600060208201905081810360008301526144af81614473565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006144f0826136e6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561452357614522614361565b5b600182019050919050565b7f416464206120555249206265666f7265206d696e74696e6720616e64206d696e60008201527f74206120706f736974697665206e756d626572206f6620746f6b656e73000000602082015250565b600061458a603d83613636565b91506145958261452e565b604082019050919050565b600060208201905081810360008301526145b98161457d565b9050919050565b60006145cb826136e6565b91506145d6836136e6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561460b5761460a614361565b5b828201905092915050565b7f596f7520617265206e6f742077686974656c697374656420666f72207468617460008201527f206d616e7920746f6b656e732100000000000000000000000000000000000000602082015250565b6000614672602d83613636565b915061467d82614616565b604082019050919050565b600060208201905081810360008301526146a181614665565b9050919050565b60006060820190506146bd600083018661377b565b6146ca602083018561377b565b6146d76040830184613ac4565b949350505050565b6000815190506146ee81613d24565b92915050565b60006020828403121561470a57614709613566565b5b6000614718848285016146df565b91505092915050565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b600061477d603083613636565b915061478882614721565b604082019050919050565b600060208201905081810360008301526147ac81614770565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b600061480f602983613636565b915061481a826147b3565b604082019050919050565b6000602082019050818103600083015261483e81614802565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b60006148a1602a83613636565b91506148ac82614845565b604082019050919050565b600060208201905081810360008301526148d081614894565b9050919050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112614903576149026148d7565b5b80840192508235915067ffffffffffffffff821115614925576149246148dc565b5b602083019250600182023603831315614941576149406148e1565b5b509250929050565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b60006149a5603183613636565b91506149b082614949565b604082019050919050565b600060208201905081810360008301526149d481614998565b9050919050565b600081905092915050565b60006149f18261362b565b6149fb81856149db565b9350614a0b818560208601613647565b80840191505092915050565b6000614a2382856149e6565b9150614a2f82846149e6565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614a97602683613636565b9150614aa282614a3b565b604082019050919050565b60006020820190508181036000830152614ac681614a8a565b9050919050565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b6000614b29602e83613636565b9150614b3482614acd565b604082019050919050565b60006020820190508181036000830152614b5881614b1c565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614bbb602c83613636565b9150614bc682614b5f565b604082019050919050565b60006020820190508181036000830152614bea81614bae565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000614c4d602583613636565b9150614c5882614bf1565b604082019050919050565b60006020820190508181036000830152614c7c81614c40565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614cdf602483613636565b9150614cea82614c83565b604082019050919050565b60006020820190508181036000830152614d0e81614cd2565b9050919050565b6000614d20826136e6565b9150614d2b836136e6565b925082821015614d3e57614d3d614361565b5b828203905092915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614d7f601983613636565b9150614d8a82614d49565b602082019050919050565b60006020820190508181036000830152614dae81614d72565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614e11603283613636565b9150614e1c82614db5565b604082019050919050565b60006020820190508181036000830152614e4081614e04565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614ea3602f83613636565b9150614eae82614e47565b604082019050919050565b60006020820190508181036000830152614ed281614e96565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600081519050919050565b600082825260208201905092915050565b6000614f2f82614f08565b614f398185614f13565b9350614f49818560208601613647565b614f528161367a565b840191505092915050565b6000608082019050614f72600083018761377b565b614f7f602083018661377b565b614f8c6040830185613ac4565b8181036060830152614f9e8184614f24565b905095945050505050565b600081519050614fb88161359c565b92915050565b600060208284031215614fd457614fd3613566565b5b6000614fe284828501614fa9565b91505092915050565b6000614ff6826136e6565b9150615001836136e6565b925082615011576150106143ea565b5b828206905092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000615052602083613636565b915061505d8261501c565b602082019050919050565b6000602082019050818103600083015261508181615045565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006150be601c83613636565b91506150c982615088565b602082019050919050565b600060208201905081810360008301526150ed816150b1565b905091905056fea2646970667358221220393936436caffc81ffe2120e494b6bb93496e2db427d57f53d8349da0033b91064736f6c634300080b0033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101fb5760003560e01c8063582453621161011a57806395d89b41116100ad578063b88d4fde1161007c578063b88d4fde14610599578063bc8485a5146105b5578063c87b56dd146105e5578063e985e9c514610615578063f2fde38b14610645576101fb565b806395d89b4114610525578063a22cb46514610543578063a420ed3e1461055f578063b7951cf71461057d576101fb565b8063715018a6116100e9578063715018a6146104c35780638c7ea24b146104cd5780638cf77604146104e95780638da5cb5b14610507576101fb565b8063582453621461042b5780636352211e146104475780636d73e6691461047757806370a0823114610493576101fb565b80632a55205a1161019257806340c10f191161016157806340c10f19146103bb57806342842e0e146103d757806342966c68146103f357806351cff8d91461040f576101fb565b80632a55205a146103205780632d345670146103515780632f25662a1461036d57806331ae450b1461039d576101fb565b80631a04c4ec116101ce5780631a04c4ec1461029a57806323b872dd146102b657806324d7806c146102d257806328c5440f14610302576101fb565b806301ffc9a71461020057806306fdde0314610230578063081812fc1461024e578063095ea7b31461027e575b600080fd5b61021a600480360381019061021591906135c8565b610661565b6040516102279190613610565b60405180910390f35b6102386106fb565b60405161024591906136c4565b60405180910390f35b6102686004803603810190610263919061371c565b61078d565b604051610275919061378a565b60405180910390f35b610298600480360381019061029391906137d1565b610812565b005b6102b460048036038101906102af9190613876565b61092a565b005b6102d060048036038101906102cb91906138d6565b610a30565b005b6102ec60048036038101906102e79190613929565b610a90565b6040516102f99190613610565b60405180910390f35b61030a610aea565b6040516103179190613a62565b60405180910390f35b61033a60048036038101906103359190613a84565b610c53565b604051610348929190613ad3565b60405180910390f35b61036b60048036038101906103669190613929565b610d18565b005b61038760048036038101906103829190613929565b610e20565b6040516103949190613afc565b60405180910390f35b6103a5610e38565b6040516103b29190613bd5565b60405180910390f35b6103d560048036038101906103d091906137d1565b610f1a565b005b6103f160048036038101906103ec91906138d6565b611294565b005b61040d6004803603810190610408919061371c565b6112b4565b005b61042960048036038101906104249190613929565b611310565b005b61044560048036038101906104409190613ca3565b6113ea565b005b610461600480360381019061045c919061371c565b611526565b60405161046e919061378a565b60405180910390f35b610491600480360381019061048c9190613929565b6115d8565b005b6104ad60048036038101906104a89190613929565b6116df565b6040516104ba9190613afc565b60405180910390f35b6104cb611797565b005b6104e760048036038101906104e291906137d1565b61181f565b005b6104f16118fb565b6040516104fe9190613afc565b60405180910390f35b61050f611901565b60405161051c919061378a565b60405180910390f35b61052d61192a565b60405161053a91906136c4565b60405180910390f35b61055d60048036038101906105589190613d50565b6119bc565b005b6105676119d2565b604051610574919061378a565b60405180910390f35b61059760048036038101906105929190613de6565b6119f8565b005b6105b360048036038101906105ae9190613f63565b611b1d565b005b6105cf60048036038101906105ca9190613929565b611b7f565b6040516105dc9190613afc565b60405180910390f35b6105ff60048036038101906105fa919061371c565b611b97565b60405161060c91906136c4565b60405180910390f35b61062f600480360381019061062a9190613fe6565b611ce9565b60405161063c9190613610565b60405180910390f35b61065f600480360381019061065a9190613929565b611d7d565b005b600061066c82611e75565b8061067c575061067b82611eef565b5b806106e457507f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106f457506106f382611e75565b5b9050919050565b60606001805461070a90614055565b80601f016020809104026020016040519081016040528092919081815260200182805461073690614055565b80156107835780601f1061075857610100808354040283529160200191610783565b820191906000526020600020905b81548152906001019060200180831161076657829003601f168201915b5050505050905090565b600061079882611fd1565b6107d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107ce906140f9565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061081d82611526565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561088e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108859061418b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108ad61203d565b73ffffffffffffffffffffffffffffffffffffffff1614806108dc57506108db816108d661203d565b611ce9565b5b61091b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109129061421d565b60405180910390fd5b6109258383612045565b505050565b3373ffffffffffffffffffffffffffffffffffffffff16610949611901565b73ffffffffffffffffffffffffffffffffffffffff16148061097b575061097a3360086120fe90919063ffffffff16565b5b6109ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b1906142af565b60405180910390fd5b6109c4601261212e565b60006109d06012612144565b90506109dc8482612152565b610a2a8184848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612170565b50505050565b610a41610a3b61203d565b826121e4565b610a80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7790614341565b60405180910390fd5b610a8b8383836122c2565b505050565b60008173ffffffffffffffffffffffffffffffffffffffff16610ab1611901565b73ffffffffffffffffffffffffffffffffffffffff161480610ae35750610ae28260086120fe90919063ffffffff16565b5b9050919050565b60603373ffffffffffffffffffffffffffffffffffffffff16610b0b611901565b73ffffffffffffffffffffffffffffffffffffffff161480610b3d5750610b3c3360086120fe90919063ffffffff16565b5b610b7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b73906142af565b60405180910390fd5b600d805480602002602001604051908101604052809291908181526020016000905b82821015610c4a578382906000526020600020018054610bbd90614055565b80601f0160208091040260200160405190810160405280929190818152602001828054610be990614055565b8015610c365780601f10610c0b57610100808354040283529160200191610c36565b820191906000526020600020905b815481529060010190602001808311610c1957829003601f168201915b505050505081526020019060010190610b9e565b50505050905090565b600080610c606012612144565b8411158015610cbe5750600073ffffffffffffffffffffffffffffffffffffffff16601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b15610d0957601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166064600f5485610cf69190614390565b610d009190614419565b91509150610d11565b600080915091505b9250929050565b610d2061203d565b73ffffffffffffffffffffffffffffffffffffffff16610d3e611901565b73ffffffffffffffffffffffffffffffffffffffff1614610d94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8b90614496565b60405180910390fd5b610da88160086120fe90919063ffffffff16565b15610e1d573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f7c0c3c84c67c85fcac635147348bfe374c24a1a93d0366d1cfe9d8853cbf89d560405160405180910390a3610e1b81600861252990919063ffffffff16565b505b50565b600b6020528060005260406000206000915090505481565b6060610e446008612559565b67ffffffffffffffff811115610e5d57610e5c613e38565b5b604051908082528060200260200182016040528015610e8b5781602001602082028036833780820191505090505b50905060005b610e9b6008612559565b811015610f1657610eb681600861256e90919063ffffffff16565b828281518110610ec957610ec86144b6565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508080610f0e906144e5565b915050610e91565b5090565b6000600d80549050118015610f2f5750600081115b610f6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f65906145a0565b60405180910390fd5b600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610ff991906145c0565b11158061100b575061100a33610a90565b5b61104a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104190614688565b60405180910390fd5b61105333610a90565b61112a57601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd33601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684600e546110c79190614390565b6040518463ffffffff1660e01b81526004016110e5939291906146a8565b6020604051808303816000875af1158015611104573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061112891906146f4565b505b6000600190505b81811161128f57611142601261212e565b600061114e6012612144565b905061115a8482612152565b6000600a60008381526020019081526020016000208190555061122481600d60008154811061118c5761118b6144b6565b5b9060005260206000200180546111a190614055565b80601f01602080910402602001604051908101604052809291908181526020018280546111cd90614055565b801561121a5780601f106111ef5761010080835404028352916020019161121a565b820191906000526020600020905b8154815290600101906020018083116111fd57829003601f168201915b5050505050612170565b6001600c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461127491906145c0565b92505081905550508080611287906144e5565b915050611131565b505050565b6112af83838360405180602001604052806000815250611b1d565b505050565b6112c56112bf61203d565b826121e4565b611304576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112fb90614793565b60405180910390fd5b61130d81612588565b50565b3373ffffffffffffffffffffffffffffffffffffffff1661132f611901565b73ffffffffffffffffffffffffffffffffffffffff16148061136157506113603360086120fe90919063ffffffff16565b5b6113a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611397906142af565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156113e6573d6000803e3d6000fd5b5050565b3373ffffffffffffffffffffffffffffffffffffffff16611409611901565b73ffffffffffffffffffffffffffffffffffffffff16148061143b575061143a3360086120fe90919063ffffffff16565b5b61147a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611471906142af565b60405180910390fd5b60005b8484905081101561151f5782828281811061149b5761149a6144b6565b5b90506020020135600b60008787858181106114b9576114b86144b6565b5b90506020020160208101906114ce9190613929565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508080611517906144e5565b91505061147d565b5050505050565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156115cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c690614825565b60405180910390fd5b80915050919050565b6115e061203d565b73ffffffffffffffffffffffffffffffffffffffff166115fe611901565b73ffffffffffffffffffffffffffffffffffffffff1614611654576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164b90614496565b60405180910390fd5b6116688160086120fe90919063ffffffff16565b6116dc573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f7e1a1a08d52e4ba0e21554733d66165fd5151f99460116223d9e3a608eec5cb160405160405180910390a36116da8160086125db90919063ffffffff16565b505b50565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611750576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611747906148b7565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61179f61203d565b73ffffffffffffffffffffffffffffffffffffffff166117bd611901565b73ffffffffffffffffffffffffffffffffffffffff1614611813576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180a90614496565b60405180910390fd5b61181d600061260b565b565b3373ffffffffffffffffffffffffffffffffffffffff1661183e611901565b73ffffffffffffffffffffffffffffffffffffffff161480611870575061186f3360086120fe90919063ffffffff16565b5b6118af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a6906142af565b60405180910390fd5b81601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600f819055505050565b600e5481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606002805461193990614055565b80601f016020809104026020016040519081016040528092919081815260200182805461196590614055565b80156119b25780601f10611987576101008083540402835291602001916119b2565b820191906000526020600020905b81548152906001019060200180831161199557829003601f168201915b5050505050905090565b6119ce6119c761203d565b83836126cf565b5050565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b3373ffffffffffffffffffffffffffffffffffffffff16611a17611901565b73ffffffffffffffffffffffffffffffffffffffff161480611a495750611a483360086120fe90919063ffffffff16565b5b611a88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7f906142af565b60405180910390fd5b600d6000611a9691906133ae565b60005b82829050811015611b1857600d838383818110611ab957611ab86144b6565b5b9050602002810190611acb91906148e6565b90918060018154018082558091505060019003906000526020600020016000909192909192909192909192509190611b049291906133cf565b508080611b10906144e5565b915050611a99565b505050565b611b2e611b2861203d565b836121e4565b611b6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6490614341565b60405180910390fd5b611b798484848461283c565b50505050565b600c6020528060005260406000206000915090505481565b6060611ba282611fd1565b611be1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd8906149bb565b60405180910390fd5b6000600760008481526020019081526020016000208054611c0190614055565b80601f0160208091040260200160405190810160405280929190818152602001828054611c2d90614055565b8015611c7a5780601f10611c4f57610100808354040283529160200191611c7a565b820191906000526020600020905b815481529060010190602001808311611c5d57829003601f168201915b505050505090506000611c8b612898565b9050600081511415611ca1578192505050611ce4565b600082511115611cd6578082604051602001611cbe929190614a17565b60405160208183030381529060405292505050611ce4565b611cdf846128af565b925050505b919050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611d8561203d565b73ffffffffffffffffffffffffffffffffffffffff16611da3611901565b73ffffffffffffffffffffffffffffffffffffffff1614611df9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df090614496565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611e69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6090614aad565b60405180910390fd5b611e728161260b565b50565b60007f553e757e000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611ee85750611ee782611eef565b5b9050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611fba57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611fca5750611fc982612956565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166120b883611526565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612126836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6129c0565b905092915050565b6001816000016000828254019250508190555050565b600081600001549050919050565b61216c8282604051806020016040528060008152506129e3565b5050565b61217982611fd1565b6121b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121af90614b3f565b60405180910390fd5b806007600084815260200190815260200160002090805190602001906121df929190613455565b505050565b60006121ef82611fd1565b61222e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222590614bd1565b60405180910390fd5b600061223983611526565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806122a857508373ffffffffffffffffffffffffffffffffffffffff166122908461078d565b73ffffffffffffffffffffffffffffffffffffffff16145b806122b957506122b88185611ce9565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166122e282611526565b73ffffffffffffffffffffffffffffffffffffffff1614612338576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232f90614c63565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156123a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239f90614cf5565b60405180910390fd5b6123b3838383612a3e565b6123be600082612045565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461240e9190614d15565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461246591906145c0565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612524838383612ae9565b505050565b6000612551836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612aee565b905092915050565b600061256782600001612c02565b9050919050565b600061257d8360000183612c13565b60001c905092915050565b61259181612c3e565b60006007600083815260200190815260200160002080546125b190614055565b9050146125d8576007600082815260200190815260200160002060006125d791906134db565b5b50565b6000612603836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612d5b565b905092915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561273e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161273590614d95565b60405180910390fd5b80600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161282f9190613610565b60405180910390a3505050565b6128478484846122c2565b61285384848484612dcb565b612892576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161288990614e27565b60405180910390fd5b50505050565b606060405180602001604052806000815250905090565b60606128ba82611fd1565b6128f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128f090614eb9565b60405180910390fd5b6000612903612898565b90506000815111612923576040518060200160405280600081525061294e565b8061292d84612f53565b60405160200161293e929190614a17565b6040516020818303038152906040525b915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600080836001016000848152602001908152602001600020541415905092915050565b6129ed83836130b4565b6129fa6000848484612dcb565b612a39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a3090614e27565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614158015612aa85750600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b15612ae4576001600d80549050612abf9190614d15565b600a6000838152602001908152602001600020541015612ae357612ae28161328e565b5b5b505050565b505050565b60008083600101600084815260200190815260200160002054905060008114612bf6576000600182612b209190614d15565b9050600060018660000180549050612b389190614d15565b9050818114612ba7576000866000018281548110612b5957612b586144b6565b5b9060005260206000200154905080876000018481548110612b7d57612b7c6144b6565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b85600001805480612bbb57612bba614ed9565b5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050612bfc565b60009150505b92915050565b600081600001805490509050919050565b6000826000018281548110612c2b57612c2a6144b6565b5b9060005260206000200154905092915050565b6000612c4982611526565b9050612c5781600084612a3e565b612c62600083612045565b6001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612cb29190614d15565b925050819055506003600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612d5781600084612ae9565b5050565b6000612d6783836129c0565b612dc0578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050612dc5565b600090505b92915050565b6000612dec8473ffffffffffffffffffffffffffffffffffffffff1661338b565b15612f46578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612e1561203d565b8786866040518563ffffffff1660e01b8152600401612e379493929190614f5d565b6020604051808303816000875af1925050508015612e7357506040513d601f19601f82011682018060405250810190612e709190614fbe565b60015b612ef6573d8060008114612ea3576040519150601f19603f3d011682016040523d82523d6000602084013e612ea8565b606091505b50600081511415612eee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ee590614e27565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612f4b565b600190505b949350505050565b60606000821415612f9b576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506130af565b600082905060005b60008214612fcd578080612fb6906144e5565b915050600a82612fc69190614419565b9150612fa3565b60008167ffffffffffffffff811115612fe957612fe8613e38565b5b6040519080825280601f01601f19166020018201604052801561301b5781602001600182028036833780820191505090505b5090505b600085146130a8576001826130349190614d15565b9150600a856130439190614feb565b603061304f91906145c0565b60f81b818381518110613065576130646144b6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856130a19190614419565b945061301f565b8093505050505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613124576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161311b90615068565b60405180910390fd5b61312d81611fd1565b1561316d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613164906150d4565b60405180910390fd5b61317960008383612a3e565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546131c991906145c0565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461328a60008383612ae9565b5050565b6001600a6000838152602001908152602001600020546132ae91906145c0565b600a60008381526020019081526020016000208190555061338881600d600a600085815260200190815260200160002054815481106132f0576132ef6144b6565b5b90600052602060002001805461330590614055565b80601f016020809104026020016040519081016040528092919081815260200182805461333190614055565b801561337e5780601f106133535761010080835404028352916020019161337e565b820191906000526020600020905b81548152906001019060200180831161336157829003601f168201915b5050505050612170565b50565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b50805460008255906000526020600020908101906133cc919061351b565b50565b8280546133db90614055565b90600052602060002090601f0160209004810192826133fd5760008555613444565b82601f1061341657803560ff1916838001178555613444565b82800160010185558215613444579182015b82811115613443578235825591602001919060010190613428565b5b509050613451919061353f565b5090565b82805461346190614055565b90600052602060002090601f01602090048101928261348357600085556134ca565b82601f1061349c57805160ff19168380011785556134ca565b828001600101855582156134ca579182015b828111156134c95782518255916020019190600101906134ae565b5b5090506134d7919061353f565b5090565b5080546134e790614055565b6000825580601f106134f95750613518565b601f016020900490600052602060002090810190613517919061353f565b5b50565b5b8082111561353b576000818161353291906134db565b5060010161351c565b5090565b5b80821115613558576000816000905550600101613540565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6135a581613570565b81146135b057600080fd5b50565b6000813590506135c28161359c565b92915050565b6000602082840312156135de576135dd613566565b5b60006135ec848285016135b3565b91505092915050565b60008115159050919050565b61360a816135f5565b82525050565b60006020820190506136256000830184613601565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561366557808201518184015260208101905061364a565b83811115613674576000848401525b50505050565b6000601f19601f8301169050919050565b60006136968261362b565b6136a08185613636565b93506136b0818560208601613647565b6136b98161367a565b840191505092915050565b600060208201905081810360008301526136de818461368b565b905092915050565b6000819050919050565b6136f9816136e6565b811461370457600080fd5b50565b600081359050613716816136f0565b92915050565b60006020828403121561373257613731613566565b5b600061374084828501613707565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061377482613749565b9050919050565b61378481613769565b82525050565b600060208201905061379f600083018461377b565b92915050565b6137ae81613769565b81146137b957600080fd5b50565b6000813590506137cb816137a5565b92915050565b600080604083850312156137e8576137e7613566565b5b60006137f6858286016137bc565b925050602061380785828601613707565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f84011261383657613835613811565b5b8235905067ffffffffffffffff81111561385357613852613816565b5b60208301915083600182028301111561386f5761386e61381b565b5b9250929050565b60008060006040848603121561388f5761388e613566565b5b600061389d868287016137bc565b935050602084013567ffffffffffffffff8111156138be576138bd61356b565b5b6138ca86828701613820565b92509250509250925092565b6000806000606084860312156138ef576138ee613566565b5b60006138fd868287016137bc565b935050602061390e868287016137bc565b925050604061391f86828701613707565b9150509250925092565b60006020828403121561393f5761393e613566565b5b600061394d848285016137bc565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600082825260208201905092915050565b600061399e8261362b565b6139a88185613982565b93506139b8818560208601613647565b6139c18161367a565b840191505092915050565b60006139d88383613993565b905092915050565b6000602082019050919050565b60006139f882613956565b613a028185613961565b935083602082028501613a1485613972565b8060005b85811015613a505784840389528151613a3185826139cc565b9450613a3c836139e0565b925060208a01995050600181019050613a18565b50829750879550505050505092915050565b60006020820190508181036000830152613a7c81846139ed565b905092915050565b60008060408385031215613a9b57613a9a613566565b5b6000613aa985828601613707565b9250506020613aba85828601613707565b9150509250929050565b613acd816136e6565b82525050565b6000604082019050613ae8600083018561377b565b613af56020830184613ac4565b9392505050565b6000602082019050613b116000830184613ac4565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613b4c81613769565b82525050565b6000613b5e8383613b43565b60208301905092915050565b6000602082019050919050565b6000613b8282613b17565b613b8c8185613b22565b9350613b9783613b33565b8060005b83811015613bc8578151613baf8882613b52565b9750613bba83613b6a565b925050600181019050613b9b565b5085935050505092915050565b60006020820190508181036000830152613bef8184613b77565b905092915050565b60008083601f840112613c0d57613c0c613811565b5b8235905067ffffffffffffffff811115613c2a57613c29613816565b5b602083019150836020820283011115613c4657613c4561381b565b5b9250929050565b60008083601f840112613c6357613c62613811565b5b8235905067ffffffffffffffff811115613c8057613c7f613816565b5b602083019150836020820283011115613c9c57613c9b61381b565b5b9250929050565b60008060008060408587031215613cbd57613cbc613566565b5b600085013567ffffffffffffffff811115613cdb57613cda61356b565b5b613ce787828801613bf7565b9450945050602085013567ffffffffffffffff811115613d0a57613d0961356b565b5b613d1687828801613c4d565b925092505092959194509250565b613d2d816135f5565b8114613d3857600080fd5b50565b600081359050613d4a81613d24565b92915050565b60008060408385031215613d6757613d66613566565b5b6000613d75858286016137bc565b9250506020613d8685828601613d3b565b9150509250929050565b60008083601f840112613da657613da5613811565b5b8235905067ffffffffffffffff811115613dc357613dc2613816565b5b602083019150836020820283011115613ddf57613dde61381b565b5b9250929050565b60008060208385031215613dfd57613dfc613566565b5b600083013567ffffffffffffffff811115613e1b57613e1a61356b565b5b613e2785828601613d90565b92509250509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613e708261367a565b810181811067ffffffffffffffff82111715613e8f57613e8e613e38565b5b80604052505050565b6000613ea261355c565b9050613eae8282613e67565b919050565b600067ffffffffffffffff821115613ece57613ecd613e38565b5b613ed78261367a565b9050602081019050919050565b82818337600083830152505050565b6000613f06613f0184613eb3565b613e98565b905082815260208101848484011115613f2257613f21613e33565b5b613f2d848285613ee4565b509392505050565b600082601f830112613f4a57613f49613811565b5b8135613f5a848260208601613ef3565b91505092915050565b60008060008060808587031215613f7d57613f7c613566565b5b6000613f8b878288016137bc565b9450506020613f9c878288016137bc565b9350506040613fad87828801613707565b925050606085013567ffffffffffffffff811115613fce57613fcd61356b565b5b613fda87828801613f35565b91505092959194509250565b60008060408385031215613ffd57613ffc613566565b5b600061400b858286016137bc565b925050602061401c858286016137bc565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061406d57607f821691505b6020821081141561408157614080614026565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006140e3602c83613636565b91506140ee82614087565b604082019050919050565b60006020820190508181036000830152614112816140d6565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000614175602183613636565b915061418082614119565b604082019050919050565b600060208201905081810360008301526141a481614168565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000614207603883613636565b9150614212826141ab565b604082019050919050565b60006020820190508181036000830152614236816141fa565b9050919050565b7f41646d696e436f6e74726f6c3a204d757374206265206f776e6572206f72206160008201527f646d696e00000000000000000000000000000000000000000000000000000000602082015250565b6000614299602483613636565b91506142a48261423d565b604082019050919050565b600060208201905081810360008301526142c88161428c565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b600061432b603183613636565b9150614336826142cf565b604082019050919050565b6000602082019050818103600083015261435a8161431e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061439b826136e6565b91506143a6836136e6565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156143df576143de614361565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614424826136e6565b915061442f836136e6565b92508261443f5761443e6143ea565b5b828204905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614480602083613636565b915061448b8261444a565b602082019050919050565b600060208201905081810360008301526144af81614473565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006144f0826136e6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561452357614522614361565b5b600182019050919050565b7f416464206120555249206265666f7265206d696e74696e6720616e64206d696e60008201527f74206120706f736974697665206e756d626572206f6620746f6b656e73000000602082015250565b600061458a603d83613636565b91506145958261452e565b604082019050919050565b600060208201905081810360008301526145b98161457d565b9050919050565b60006145cb826136e6565b91506145d6836136e6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561460b5761460a614361565b5b828201905092915050565b7f596f7520617265206e6f742077686974656c697374656420666f72207468617460008201527f206d616e7920746f6b656e732100000000000000000000000000000000000000602082015250565b6000614672602d83613636565b915061467d82614616565b604082019050919050565b600060208201905081810360008301526146a181614665565b9050919050565b60006060820190506146bd600083018661377b565b6146ca602083018561377b565b6146d76040830184613ac4565b949350505050565b6000815190506146ee81613d24565b92915050565b60006020828403121561470a57614709613566565b5b6000614718848285016146df565b91505092915050565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b600061477d603083613636565b915061478882614721565b604082019050919050565b600060208201905081810360008301526147ac81614770565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b600061480f602983613636565b915061481a826147b3565b604082019050919050565b6000602082019050818103600083015261483e81614802565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b60006148a1602a83613636565b91506148ac82614845565b604082019050919050565b600060208201905081810360008301526148d081614894565b9050919050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112614903576149026148d7565b5b80840192508235915067ffffffffffffffff821115614925576149246148dc565b5b602083019250600182023603831315614941576149406148e1565b5b509250929050565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b60006149a5603183613636565b91506149b082614949565b604082019050919050565b600060208201905081810360008301526149d481614998565b9050919050565b600081905092915050565b60006149f18261362b565b6149fb81856149db565b9350614a0b818560208601613647565b80840191505092915050565b6000614a2382856149e6565b9150614a2f82846149e6565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614a97602683613636565b9150614aa282614a3b565b604082019050919050565b60006020820190508181036000830152614ac681614a8a565b9050919050565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b6000614b29602e83613636565b9150614b3482614acd565b604082019050919050565b60006020820190508181036000830152614b5881614b1c565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614bbb602c83613636565b9150614bc682614b5f565b604082019050919050565b60006020820190508181036000830152614bea81614bae565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000614c4d602583613636565b9150614c5882614bf1565b604082019050919050565b60006020820190508181036000830152614c7c81614c40565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614cdf602483613636565b9150614cea82614c83565b604082019050919050565b60006020820190508181036000830152614d0e81614cd2565b9050919050565b6000614d20826136e6565b9150614d2b836136e6565b925082821015614d3e57614d3d614361565b5b828203905092915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614d7f601983613636565b9150614d8a82614d49565b602082019050919050565b60006020820190508181036000830152614dae81614d72565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614e11603283613636565b9150614e1c82614db5565b604082019050919050565b60006020820190508181036000830152614e4081614e04565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614ea3602f83613636565b9150614eae82614e47565b604082019050919050565b60006020820190508181036000830152614ed281614e96565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600081519050919050565b600082825260208201905092915050565b6000614f2f82614f08565b614f398185614f13565b9350614f49818560208601613647565b614f528161367a565b840191505092915050565b6000608082019050614f72600083018761377b565b614f7f602083018661377b565b614f8c6040830185613ac4565b8181036060830152614f9e8184614f24565b905095945050505050565b600081519050614fb88161359c565b92915050565b600060208284031215614fd457614fd3613566565b5b6000614fe284828501614fa9565b91505092915050565b6000614ff6826136e6565b9150615001836136e6565b925082615011576150106143ea565b5b828206905092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000615052602083613636565b915061505d8261501c565b602082019050919050565b6000602082019050818103600083015261508181615045565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006150be601c83613636565b91506150c982615088565b602082019050919050565b600060208201905081810360008301526150ed816150b1565b905091905056fea2646970667358221220393936436caffc81ffe2120e494b6bb93496e2db427d57f53d8349da0033b91064736f6c634300080b0033
Deployed Bytecode Sourcemap
59989:4154:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60641:394;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45369:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46928:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46451:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61915:250;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47678:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37196:139;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62665:102;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63674:327;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;36918:210;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60173:54;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36296:267;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61043:864;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48088:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63302:184;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64009:129;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62173:286;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45063:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36636:210;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44793:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22077:103;;;:::i;:::-;;63494:172;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60315:46;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21426:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45538:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47221:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60411:71;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62467:190;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48344:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60234:50;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58049:679;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47447:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22335:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60641:394;60793:4;60831:43;60862:11;60831:30;:43::i;:::-;:93;;;;60887:37;60912:11;60887:24;:37::i;:::-;60831:93;:147;;;;60952:26;60937:41;;;:11;:41;;;;60831:147;:196;;;;60991:36;61015:11;60991:23;:36::i;:::-;60831:196;60815:212;;60641:394;;;:::o;45369:100::-;45423:13;45456:5;45449:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45369:100;:::o;46928:221::-;47004:7;47032:16;47040:7;47032;:16::i;:::-;47024:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;47117:15;:24;47133:7;47117:24;;;;;;;;;;;;;;;;;;;;;47110:31;;46928:221;;;:::o;46451:411::-;46532:13;46548:23;46563:7;46548:14;:23::i;:::-;46532:39;;46596:5;46590:11;;:2;:11;;;;46582:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;46690:5;46674:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;46699:37;46716:5;46723:12;:10;:12::i;:::-;46699:16;:37::i;:::-;46674:62;46652:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;46833:21;46842:2;46846:7;46833:8;:21::i;:::-;46521:341;46451:411;;:::o;61915:250::-;36120:10;36109:21;;:7;:5;:7::i;:::-;:21;;;:53;;;;36134:28;36151:10;36134:7;:16;;:28;;;;:::i;:::-;36109:53;36101:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;62007:24:::1;:12;:22;:24::i;:::-;62042:15;62060:22;:12;:20;:22::i;:::-;62042:40;;62093:27;62103:7;62112;62093:9;:27::i;:::-;62131:26;62144:7;62153:3;;62131:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:12;:26::i;:::-;61996:169;61915:250:::0;;;:::o;47678:339::-;47873:41;47892:12;:10;:12::i;:::-;47906:7;47873:18;:41::i;:::-;47865:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;47981:28;47991:4;47997:2;48001:7;47981:9;:28::i;:::-;47678:339;;;:::o;37196:139::-;37258:4;37294:5;37283:16;;:7;:5;:7::i;:::-;:16;;;:43;;;;37303:23;37320:5;37303:7;:16;;:23;;;;:::i;:::-;37283:43;37275:52;;37196:139;;;:::o;62665:102::-;62719:16;36120:10;36109:21;;:7;:5;:7::i;:::-;:21;;;:53;;;;36134:28;36151:10;36134:7;:16;;:28;;;;:::i;:::-;36109:53;36101:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;62754:5:::1;62747:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62665:102:::0;:::o;63674:327::-;63761:7;63770;63804:22;:12;:20;:22::i;:::-;63793:7;:33;;:71;;;;;63862:1;63830:34;;:20;;;;;;;;;;;:34;;;;63793:71;63790:171;;;63888:20;;;;;;;;;;;63944:3;63923:17;;63911:9;:29;;;;:::i;:::-;63910:37;;;;:::i;:::-;63880:69;;;;;;63790:171;63987:1;63991;63971:22;;;;63674:327;;;;;;:::o;36918:210::-;21657:12;:10;:12::i;:::-;21646:23;;:7;:5;:7::i;:::-;:23;;;21638:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36997:23:::1;37014:5;36997:7;:16;;:23;;;;:::i;:::-;36993:128;;;37062:10;37042:31;;37055:5;37042:31;;;;;;;;;;;;37088:21;37103:5;37088:7;:14;;:21;;;;:::i;:::-;;36993:128;36918:210:::0;:::o;60173:54::-;;;;;;;;;;;;;;;;;:::o;36296:267::-;36349:23;36408:16;:7;:14;:16::i;:::-;36394:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36385:40;;36441:6;36436:96;36457:16;:7;:14;:16::i;:::-;36453:1;:20;36436:96;;;36507:13;36518:1;36507:7;:10;;:13;;;;:::i;:::-;36495:6;36502:1;36495:9;;;;;;;;:::i;:::-;;;;;;;:25;;;;;;;;;;;36475:3;;;;;:::i;:::-;;;;36436:96;;;;36296:267;:::o;61043:864::-;61164:1;61149:5;:12;;;;:16;:37;;;;;61185:1;61169:13;:17;61149:37;61141:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;61315:18;:27;61334:7;61315:27;;;;;;;;;;;;;;;;61298:13;61272:14;:23;61287:7;61272:23;;;;;;;;;;;;;;;;:39;;;;:::i;:::-;:70;;:93;;;;61346:19;61354:10;61346:7;:19::i;:::-;61272:93;61263:152;;;;;;;;;;;;:::i;:::-;;;;;;;;;61430:19;61438:10;61430:7;:19::i;:::-;61426:143;;61472:11;;;;;;;;;;;61465:32;;;61498:10;61510:20;;;;;;;;;;;61543:13;61532:8;;:24;;;;:::i;:::-;61465:92;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;61426:143;61583:9;61595:1;61583:13;;61579:321;61603:13;61598:1;:18;61579:321;;61637:24;:12;:22;:24::i;:::-;61676:15;61694:22;:12;:20;:22::i;:::-;61676:40;;61731:27;61741:7;61750;61731:9;:27::i;:::-;61797:1;61773:12;:21;61786:7;61773:21;;;;;;;;;;;:25;;;;61813:31;61826:7;61835:5;61841:1;61835:8;;;;;;;;:::i;:::-;;;;;;;;;61813:31;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:12;:31::i;:::-;61886:1;61859:14;:23;61874:7;61859:23;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;61622:278;61618:3;;;;;:::i;:::-;;;;61579:321;;;;61043:864;;:::o;48088:185::-;48226:39;48243:4;48249:2;48253:7;48226:39;;;;;;;;;;;;:16;:39::i;:::-;48088:185;;;:::o;63302:184::-;63359:41;63378:12;:10;:12::i;:::-;63392:7;63359:18;:41::i;:::-;63351:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;63464:14;63470:7;63464:5;:14::i;:::-;63302:184;:::o;64009:129::-;36120:10;36109:21;;:7;:5;:7::i;:::-;:21;;;:53;;;;36134:28;36151:10;36134:7;:16;;:28;;;;:::i;:::-;36109:53;36101:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;64088:9:::1;64080:27;;:50;64108:21;64080:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;64009:129:::0;:::o;62173:286::-;36120:10;36109:21;;:7;:5;:7::i;:::-;:21;;;:53;;;;36134:28;36151:10;36134:7;:16;;:28;;;;:::i;:::-;36109:53;36101:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;62321:9:::1;62317:135;62334:21;;:28;;62332:1;:30;62317:135;;;62430:7;;62438:1;62430:10;;;;;;;:::i;:::-;;;;;;;;62383:18;:44;62402:21;;62424:1;62402:24;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;62383:44;;;;;;;;;;;;;;;:57;;;;62364:3;;;;;:::i;:::-;;;;62317:135;;;;62173:286:::0;;;;:::o;45063:239::-;45135:7;45155:13;45171:7;:16;45179:7;45171:16;;;;;;;;;;;;;;;;;;;;;45155:32;;45223:1;45206:19;;:5;:19;;;;45198:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;45289:5;45282:12;;;45063:239;;;:::o;36636:210::-;21657:12;:10;:12::i;:::-;21646:23;;:7;:5;:7::i;:::-;:23;;;21638:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36717:23:::1;36734:5;36717:7;:16;;:23;;;;:::i;:::-;36712:127;;36783:10;36762:32;;36776:5;36762:32;;;;;;;;;;;;36809:18;36821:5;36809:7;:11;;:18;;;;:::i;:::-;;36712:127;36636:210:::0;:::o;44793:208::-;44865:7;44910:1;44893:19;;:5;:19;;;;44885:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;44977:9;:16;44987:5;44977:16;;;;;;;;;;;;;;;;44970:23;;44793:208;;;:::o;22077:103::-;21657:12;:10;:12::i;:::-;21646:23;;:7;:5;:7::i;:::-;:23;;;21638:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;22142:30:::1;22169:1;22142:18;:30::i;:::-;22077:103::o:0;63494:172::-;36120:10;36109:21;;:7;:5;:7::i;:::-;:21;;;:53;;;;36134:28;36151:10;36134:7;:16;;:28;;;;:::i;:::-;36109:53;36101:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;63610:10:::1;63587:20;;:33;;;;;;;;;;;;;;;;;;63651:7;63631:17;:27;;;;63494:172:::0;;:::o;60315:46::-;;;;:::o;21426:87::-;21472:7;21499:6;;;;;;;;;;;21492:13;;21426:87;:::o;45538:104::-;45594:13;45627:7;45620:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45538:104;:::o;47221:155::-;47316:52;47335:12;:10;:12::i;:::-;47349:8;47359;47316:18;:52::i;:::-;47221:155;;:::o;60411:71::-;;;;;;;;;;;;;:::o;62467:190::-;36120:10;36109:21;;:7;:5;:7::i;:::-;:21;;;:53;;;;36134:28;36151:10;36134:7;:16;;:28;;;;:::i;:::-;36109:53;36101:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;62550:5:::1;;62543:12;;;;:::i;:::-;62570:9;62566:84;62587:4;;:11;;62583:1;:15;62566:84;;;62619:5;62630:4;;62635:1;62630:7;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;62619:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;62600:3;;;;;:::i;:::-;;;;62566:84;;;;62467:190:::0;;:::o;48344:328::-;48519:41;48538:12;:10;:12::i;:::-;48552:7;48519:18;:41::i;:::-;48511:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;48625:39;48639:4;48645:2;48649:7;48658:5;48625:13;:39::i;:::-;48344:328;;;;:::o;60234:50::-;;;;;;;;;;;;;;;;;:::o;58049:679::-;58122:13;58156:16;58164:7;58156;:16::i;:::-;58148:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;58239:23;58265:10;:19;58276:7;58265:19;;;;;;;;;;;58239:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58295:18;58316:10;:8;:10::i;:::-;58295:31;;58424:1;58408:4;58402:18;:23;58398:72;;;58449:9;58442:16;;;;;;58398:72;58600:1;58580:9;58574:23;:27;58570:108;;;58649:4;58655:9;58632:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58618:48;;;;;;58570:108;58697:23;58712:7;58697:14;:23::i;:::-;58690:30;;;;58049:679;;;;:::o;47447:164::-;47544:4;47568:18;:25;47587:5;47568:25;;;;;;;;;;;;;;;:35;47594:8;47568:35;;;;;;;;;;;;;;;;;;;;;;;;;47561:42;;47447:164;;;;:::o;22335:201::-;21657:12;:10;:12::i;:::-;21646:23;;:7;:5;:7::i;:::-;:23;;;21638:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;22444:1:::1;22424:22;;:8;:22;;;;22416:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22500:28;22519:8;22500:18;:28::i;:::-;22335:201:::0;:::o;35734:233::-;35836:4;35875:31;35860:46;;;:11;:46;;;;:99;;;;35923:36;35947:11;35923:23;:36::i;:::-;35860:99;35853:106;;35734:233;;;:::o;44424:305::-;44526:4;44578:25;44563:40;;;:11;:40;;;;:105;;;;44635:33;44620:48;;;:11;:48;;;;44563:105;:158;;;;44685:36;44709:11;44685:23;:36::i;:::-;44563:158;44543:178;;44424:305;;;:::o;50182:127::-;50247:4;50299:1;50271:30;;:7;:16;50279:7;50271:16;;;;;;;;;;;;;;;;;;;;;:30;;;;50264:37;;50182:127;;;:::o;20150:98::-;20203:7;20230:10;20223:17;;20150:98;:::o;54328:174::-;54430:2;54403:15;:24;54419:7;54403:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;54486:7;54482:2;54448:46;;54457:23;54472:7;54457:14;:23::i;:::-;54448:46;;;;;;;;;;;;54328:174;;:::o;8477:167::-;8557:4;8581:55;8591:3;:10;;8627:5;8611:23;;8603:32;;8581:9;:55::i;:::-;8574:62;;8477:167;;;;:::o;16876:127::-;16983:1;16965:7;:14;;;:19;;;;;;;;;;;16876:127;:::o;16754:114::-;16819:7;16846;:14;;;16839:21;;16754:114;;;:::o;51166:110::-;51242:26;51252:2;51256:7;51242:26;;;;;;;;;;;;:9;:26::i;:::-;51166:110;;:::o;58884:217::-;58984:16;58992:7;58984;:16::i;:::-;58976:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;59084:9;59062:10;:19;59073:7;59062:19;;;;;;;;;;;:31;;;;;;;;;;;;:::i;:::-;;58884:217;;:::o;50476:348::-;50569:4;50594:16;50602:7;50594;:16::i;:::-;50586:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;50670:13;50686:23;50701:7;50686:14;:23::i;:::-;50670:39;;50739:5;50728:16;;:7;:16;;;:51;;;;50772:7;50748:31;;:20;50760:7;50748:11;:20::i;:::-;:31;;;50728:51;:87;;;;50783:32;50800:5;50807:7;50783:16;:32::i;:::-;50728:87;50720:96;;;50476:348;;;;:::o;53585:625::-;53744:4;53717:31;;:23;53732:7;53717:14;:23::i;:::-;:31;;;53709:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;53823:1;53809:16;;:2;:16;;;;53801:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;53879:39;53900:4;53906:2;53910:7;53879:20;:39::i;:::-;53983:29;54000:1;54004:7;53983:8;:29::i;:::-;54044:1;54025:9;:15;54035:4;54025:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;54073:1;54056:9;:13;54066:2;54056:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;54104:2;54085:7;:16;54093:7;54085:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;54143:7;54139:2;54124:27;;54133:4;54124:27;;;;;;;;;;;;54164:38;54184:4;54190:2;54194:7;54164:19;:38::i;:::-;53585:625;;;:::o;8233:158::-;8306:4;8330:53;8338:3;:10;;8374:5;8358:23;;8350:32;;8330:7;:53::i;:::-;8323:60;;8233:158;;;;:::o;8730:117::-;8793:7;8820:19;8828:3;:10;;8820:7;:19::i;:::-;8813:26;;8730:117;;;:::o;9201:158::-;9275:7;9326:22;9330:3;:10;;9342:5;9326:3;:22::i;:::-;9318:31;;9295:56;;9201:158;;;;:::o;59330:206::-;59399:20;59411:7;59399:11;:20::i;:::-;59473:1;59442:10;:19;59453:7;59442:19;;;;;;;;;;;59436:33;;;;;:::i;:::-;;;:38;59432:97;;59498:10;:19;59509:7;59498:19;;;;;;;;;;;;59491:26;;;;:::i;:::-;59432:97;59330:206;:::o;7905:152::-;7975:4;7999:50;8004:3;:10;;8040:5;8024:23;;8016:32;;7999:4;:50::i;:::-;7992:57;;7905:152;;;;:::o;22696:191::-;22770:16;22789:6;;;;;;;;;;;22770:25;;22815:8;22806:6;;:17;;;;;;;;;;;;;;;;;;22870:8;22839:40;;22860:8;22839:40;;;;;;;;;;;;22759:128;22696:191;:::o;54644:315::-;54799:8;54790:17;;:5;:17;;;;54782:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;54886:8;54848:18;:25;54867:5;54848:25;;;;;;;;;;;;;;;:35;54874:8;54848:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;54932:8;54910:41;;54925:5;54910:41;;;54942:8;54910:41;;;;;;:::i;:::-;;;;;;;;54644:315;;;:::o;49554:::-;49711:28;49721:4;49727:2;49731:7;49711:9;:28::i;:::-;49758:48;49781:4;49787:2;49791:7;49800:5;49758:22;:48::i;:::-;49750:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;49554:315;;;;:::o;46295:94::-;46346:13;46372:9;;;;;;;;;;;;;;46295:94;:::o;45713:334::-;45786:13;45820:16;45828:7;45820;:16::i;:::-;45812:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;45901:21;45925:10;:8;:10::i;:::-;45901:34;;45977:1;45959:7;45953:21;:25;:86;;;;;;;;;;;;;;;;;46005:7;46014:18;:7;:16;:18::i;:::-;45988:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;45953:86;45946:93;;;45713:334;;;:::o;35179:157::-;35264:4;35303:25;35288:40;;;:11;:40;;;;35281:47;;35179:157;;;:::o;3916:129::-;3989:4;4036:1;4013:3;:12;;:19;4026:5;4013:19;;;;;;;;;;;;:24;;4006:31;;3916:129;;;;:::o;51503:321::-;51633:18;51639:2;51643:7;51633:5;:18::i;:::-;51684:54;51715:1;51719:2;51723:7;51732:5;51684:22;:54::i;:::-;51662:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;51503:321;;;:::o;62982:312::-;63135:1;63121:16;;:2;:16;;;;:38;;;;;63157:1;63141:18;;:4;:18;;;;63121:38;63118:169;;;63217:1;63202:5;:12;;;;:16;;;;:::i;:::-;63178:12;:21;63191:7;63178:21;;;;;;;;;;;;:40;63175:101;;;63238:22;63252:7;63238:13;:22::i;:::-;63175:101;63118:169;62982:312;;;:::o;57406:125::-;;;;:::o;2410:1420::-;2476:4;2594:18;2615:3;:12;;:19;2628:5;2615:19;;;;;;;;;;;;2594:40;;2665:1;2651:10;:15;2647:1176;;3026:21;3063:1;3050:10;:14;;;;:::i;:::-;3026:38;;3079:17;3120:1;3099:3;:11;;:18;;;;:22;;;;:::i;:::-;3079:42;;3155:13;3142:9;:26;3138:405;;3189:17;3209:3;:11;;3221:9;3209:22;;;;;;;;:::i;:::-;;;;;;;;;;3189:42;;3363:9;3334:3;:11;;3346:13;3334:26;;;;;;;;:::i;:::-;;;;;;;;;:38;;;;3474:10;3448:3;:12;;:23;3461:9;3448:23;;;;;;;;;;;:36;;;;3170:373;3138:405;3624:3;:11;;:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;3719:3;:12;;:19;3732:5;3719:19;;;;;;;;;;;3712:26;;;3762:4;3755:11;;;;;;;2647:1176;3806:5;3799:12;;;2410:1420;;;;;:::o;4131:109::-;4187:7;4214:3;:11;;:18;;;;4207:25;;4131:109;;;:::o;4594:120::-;4661:7;4688:3;:11;;4700:5;4688:18;;;;;;;;:::i;:::-;;;;;;;;;;4681:25;;4594:120;;;;:::o;52828:420::-;52888:13;52904:23;52919:7;52904:14;:23::i;:::-;52888:39;;52940:48;52961:5;52976:1;52980:7;52940:20;:48::i;:::-;53029:29;53046:1;53050:7;53029:8;:29::i;:::-;53091:1;53071:9;:16;53081:5;53071:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;53110:7;:16;53118:7;53110:16;;;;;;;;;;;;53103:23;;;;;;;;;;;53172:7;53168:1;53144:36;;53153:5;53144:36;;;;;;;;;;;;53193:47;53213:5;53228:1;53232:7;53193:19;:47::i;:::-;52877:371;52828:420;:::o;1820:414::-;1883:4;1905:21;1915:3;1920:5;1905:9;:21::i;:::-;1900:327;;1943:3;:11;;1960:5;1943:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2126:3;:11;;:18;;;;2104:3;:12;;:19;2117:5;2104:19;;;;;;;;;;;:40;;;;2166:4;2159:11;;;;1900:327;2210:5;2203:12;;1820:414;;;;;:::o;55524:799::-;55679:4;55700:15;:2;:13;;;:15::i;:::-;55696:620;;;55752:2;55736:36;;;55773:12;:10;:12::i;:::-;55787:4;55793:7;55802:5;55736:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;55732:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55995:1;55978:6;:13;:18;55974:272;;;56021:60;;;;;;;;;;:::i;:::-;;;;;;;;55974:272;56196:6;56190:13;56181:6;56177:2;56173:15;56166:38;55732:529;55869:41;;;55859:51;;;:6;:51;;;;55852:58;;;;;55696:620;56300:4;56293:11;;55524:799;;;;;;;:::o;17712:723::-;17768:13;17998:1;17989:5;:10;17985:53;;;18016:10;;;;;;;;;;;;;;;;;;;;;17985:53;18048:12;18063:5;18048:20;;18079:14;18104:78;18119:1;18111:4;:9;18104:78;;18137:8;;;;;:::i;:::-;;;;18168:2;18160:10;;;;;:::i;:::-;;;18104:78;;;18192:19;18224:6;18214:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18192:39;;18242:154;18258:1;18249:5;:10;18242:154;;18286:1;18276:11;;;;;:::i;:::-;;;18353:2;18345:5;:10;;;;:::i;:::-;18332:2;:24;;;;:::i;:::-;18319:39;;18302:6;18309;18302:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;18382:2;18373:11;;;;;:::i;:::-;;;18242:154;;;18420:6;18406:21;;;;;17712:723;;;;:::o;52160:439::-;52254:1;52240:16;;:2;:16;;;;52232:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;52313:16;52321:7;52313;:16::i;:::-;52312:17;52304:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;52375:45;52404:1;52408:2;52412:7;52375:20;:45::i;:::-;52450:1;52433:9;:13;52443:2;52433:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;52481:2;52462:7;:16;52470:7;52462:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;52526:7;52522:2;52501:33;;52518:1;52501:33;;;;;;;;;;;;52547:44;52575:1;52579:2;52583:7;52547:19;:44::i;:::-;52160:439;;:::o;62781:194::-;62904:1;62880:12;:21;62893:7;62880:21;;;;;;;;;;;;:25;;;;:::i;:::-;62856:12;:21;62869:7;62856:21;;;;;;;;;;;:49;;;;62916:51;62929:7;62938:5;62944:12;:21;62957:7;62944:21;;;;;;;;;;;;62938:28;;;;;;;;:::i;:::-;;;;;;;;;62916:51;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:12;:51::i;:::-;62781:194;:::o;24127:326::-;24187:4;24444:1;24422:7;:19;;;:23;24415:30;;24127:326;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:117::-;5047:1;5044;5037:12;5061:117;5170:1;5167;5160:12;5184:117;5293:1;5290;5283:12;5321:553;5379:8;5389:6;5439:3;5432:4;5424:6;5420:17;5416:27;5406:122;;5447:79;;:::i;:::-;5406:122;5560:6;5547:20;5537:30;;5590:18;5582:6;5579:30;5576:117;;;5612:79;;:::i;:::-;5576:117;5726:4;5718:6;5714:17;5702:29;;5780:3;5772:4;5764:6;5760:17;5750:8;5746:32;5743:41;5740:128;;;5787:79;;:::i;:::-;5740:128;5321:553;;;;;:::o;5880:674::-;5960:6;5968;5976;6025:2;6013:9;6004:7;6000:23;5996:32;5993:119;;;6031:79;;:::i;:::-;5993:119;6151:1;6176:53;6221:7;6212:6;6201:9;6197:22;6176:53;:::i;:::-;6166:63;;6122:117;6306:2;6295:9;6291:18;6278:32;6337:18;6329:6;6326:30;6323:117;;;6359:79;;:::i;:::-;6323:117;6472:65;6529:7;6520:6;6509:9;6505:22;6472:65;:::i;:::-;6454:83;;;;6249:298;5880:674;;;;;:::o;6560:619::-;6637:6;6645;6653;6702:2;6690:9;6681:7;6677:23;6673:32;6670:119;;;6708:79;;:::i;:::-;6670:119;6828:1;6853:53;6898:7;6889:6;6878:9;6874:22;6853:53;:::i;:::-;6843:63;;6799:117;6955:2;6981:53;7026:7;7017:6;7006:9;7002:22;6981:53;:::i;:::-;6971:63;;6926:118;7083:2;7109:53;7154:7;7145:6;7134:9;7130:22;7109:53;:::i;:::-;7099:63;;7054:118;6560:619;;;;;:::o;7185:329::-;7244:6;7293:2;7281:9;7272:7;7268:23;7264:32;7261:119;;;7299:79;;:::i;:::-;7261:119;7419:1;7444:53;7489:7;7480:6;7469:9;7465:22;7444:53;:::i;:::-;7434:63;;7390:117;7185:329;;;;:::o;7520:124::-;7597:6;7631:5;7625:12;7615:22;;7520:124;;;:::o;7650:194::-;7759:11;7793:6;7788:3;7781:19;7833:4;7828:3;7824:14;7809:29;;7650:194;;;;:::o;7850:142::-;7927:4;7950:3;7942:11;;7980:4;7975:3;7971:14;7963:22;;7850:142;;;:::o;7998:159::-;8072:11;8106:6;8101:3;8094:19;8146:4;8141:3;8137:14;8122:29;;7998:159;;;;:::o;8163:344::-;8241:3;8269:39;8302:5;8269:39;:::i;:::-;8324:61;8378:6;8373:3;8324:61;:::i;:::-;8317:68;;8394:52;8439:6;8434:3;8427:4;8420:5;8416:16;8394:52;:::i;:::-;8471:29;8493:6;8471:29;:::i;:::-;8466:3;8462:39;8455:46;;8245:262;8163:344;;;;:::o;8513:196::-;8602:10;8637:66;8699:3;8691:6;8637:66;:::i;:::-;8623:80;;8513:196;;;;:::o;8715:123::-;8795:4;8827;8822:3;8818:14;8810:22;;8715:123;;;:::o;8872:991::-;9011:3;9040:64;9098:5;9040:64;:::i;:::-;9120:96;9209:6;9204:3;9120:96;:::i;:::-;9113:103;;9242:3;9287:4;9279:6;9275:17;9270:3;9266:27;9317:66;9377:5;9317:66;:::i;:::-;9406:7;9437:1;9422:396;9447:6;9444:1;9441:13;9422:396;;;9518:9;9512:4;9508:20;9503:3;9496:33;9569:6;9563:13;9597:84;9676:4;9661:13;9597:84;:::i;:::-;9589:92;;9704:70;9767:6;9704:70;:::i;:::-;9694:80;;9803:4;9798:3;9794:14;9787:21;;9482:336;9469:1;9466;9462:9;9457:14;;9422:396;;;9426:14;9834:4;9827:11;;9854:3;9847:10;;9016:847;;;;;8872:991;;;;:::o;9869:413::-;10032:4;10070:2;10059:9;10055:18;10047:26;;10119:9;10113:4;10109:20;10105:1;10094:9;10090:17;10083:47;10147:128;10270:4;10261:6;10147:128;:::i;:::-;10139:136;;9869:413;;;;:::o;10288:474::-;10356:6;10364;10413:2;10401:9;10392:7;10388:23;10384:32;10381:119;;;10419:79;;:::i;:::-;10381:119;10539:1;10564:53;10609:7;10600:6;10589:9;10585:22;10564:53;:::i;:::-;10554:63;;10510:117;10666:2;10692:53;10737:7;10728:6;10717:9;10713:22;10692:53;:::i;:::-;10682:63;;10637:118;10288:474;;;;;:::o;10768:118::-;10855:24;10873:5;10855:24;:::i;:::-;10850:3;10843:37;10768:118;;:::o;10892:332::-;11013:4;11051:2;11040:9;11036:18;11028:26;;11064:71;11132:1;11121:9;11117:17;11108:6;11064:71;:::i;:::-;11145:72;11213:2;11202:9;11198:18;11189:6;11145:72;:::i;:::-;10892:332;;;;;:::o;11230:222::-;11323:4;11361:2;11350:9;11346:18;11338:26;;11374:71;11442:1;11431:9;11427:17;11418:6;11374:71;:::i;:::-;11230:222;;;;:::o;11458:114::-;11525:6;11559:5;11553:12;11543:22;;11458:114;;;:::o;11578:184::-;11677:11;11711:6;11706:3;11699:19;11751:4;11746:3;11742:14;11727:29;;11578:184;;;;:::o;11768:132::-;11835:4;11858:3;11850:11;;11888:4;11883:3;11879:14;11871:22;;11768:132;;;:::o;11906:108::-;11983:24;12001:5;11983:24;:::i;:::-;11978:3;11971:37;11906:108;;:::o;12020:179::-;12089:10;12110:46;12152:3;12144:6;12110:46;:::i;:::-;12188:4;12183:3;12179:14;12165:28;;12020:179;;;;:::o;12205:113::-;12275:4;12307;12302:3;12298:14;12290:22;;12205:113;;;:::o;12354:732::-;12473:3;12502:54;12550:5;12502:54;:::i;:::-;12572:86;12651:6;12646:3;12572:86;:::i;:::-;12565:93;;12682:56;12732:5;12682:56;:::i;:::-;12761:7;12792:1;12777:284;12802:6;12799:1;12796:13;12777:284;;;12878:6;12872:13;12905:63;12964:3;12949:13;12905:63;:::i;:::-;12898:70;;12991:60;13044:6;12991:60;:::i;:::-;12981:70;;12837:224;12824:1;12821;12817:9;12812:14;;12777:284;;;12781:14;13077:3;13070:10;;12478:608;;;12354:732;;;;:::o;13092:373::-;13235:4;13273:2;13262:9;13258:18;13250:26;;13322:9;13316:4;13312:20;13308:1;13297:9;13293:17;13286:47;13350:108;13453:4;13444:6;13350:108;:::i;:::-;13342:116;;13092:373;;;;:::o;13488:568::-;13561:8;13571:6;13621:3;13614:4;13606:6;13602:17;13598:27;13588:122;;13629:79;;:::i;:::-;13588:122;13742:6;13729:20;13719:30;;13772:18;13764:6;13761:30;13758:117;;;13794:79;;:::i;:::-;13758:117;13908:4;13900:6;13896:17;13884:29;;13962:3;13954:4;13946:6;13942:17;13932:8;13928:32;13925:41;13922:128;;;13969:79;;:::i;:::-;13922:128;13488:568;;;;;:::o;14079:::-;14152:8;14162:6;14212:3;14205:4;14197:6;14193:17;14189:27;14179:122;;14220:79;;:::i;:::-;14179:122;14333:6;14320:20;14310:30;;14363:18;14355:6;14352:30;14349:117;;;14385:79;;:::i;:::-;14349:117;14499:4;14491:6;14487:17;14475:29;;14553:3;14545:4;14537:6;14533:17;14523:8;14519:32;14516:41;14513:128;;;14560:79;;:::i;:::-;14513:128;14079:568;;;;;:::o;14653:934::-;14775:6;14783;14791;14799;14848:2;14836:9;14827:7;14823:23;14819:32;14816:119;;;14854:79;;:::i;:::-;14816:119;15002:1;14991:9;14987:17;14974:31;15032:18;15024:6;15021:30;15018:117;;;15054:79;;:::i;:::-;15018:117;15167:80;15239:7;15230:6;15219:9;15215:22;15167:80;:::i;:::-;15149:98;;;;14945:312;15324:2;15313:9;15309:18;15296:32;15355:18;15347:6;15344:30;15341:117;;;15377:79;;:::i;:::-;15341:117;15490:80;15562:7;15553:6;15542:9;15538:22;15490:80;:::i;:::-;15472:98;;;;15267:313;14653:934;;;;;;;:::o;15593:116::-;15663:21;15678:5;15663:21;:::i;:::-;15656:5;15653:32;15643:60;;15699:1;15696;15689:12;15643:60;15593:116;:::o;15715:133::-;15758:5;15796:6;15783:20;15774:29;;15812:30;15836:5;15812:30;:::i;:::-;15715:133;;;;:::o;15854:468::-;15919:6;15927;15976:2;15964:9;15955:7;15951:23;15947:32;15944:119;;;15982:79;;:::i;:::-;15944:119;16102:1;16127:53;16172:7;16163:6;16152:9;16148:22;16127:53;:::i;:::-;16117:63;;16073:117;16229:2;16255:50;16297:7;16288:6;16277:9;16273:22;16255:50;:::i;:::-;16245:60;;16200:115;15854:468;;;;;:::o;16344:580::-;16429:8;16439:6;16489:3;16482:4;16474:6;16470:17;16466:27;16456:122;;16497:79;;:::i;:::-;16456:122;16610:6;16597:20;16587:30;;16640:18;16632:6;16629:30;16626:117;;;16662:79;;:::i;:::-;16626:117;16776:4;16768:6;16764:17;16752:29;;16830:3;16822:4;16814:6;16810:17;16800:8;16796:32;16793:41;16790:128;;;16837:79;;:::i;:::-;16790:128;16344:580;;;;;:::o;16930:583::-;17028:6;17036;17085:2;17073:9;17064:7;17060:23;17056:32;17053:119;;;17091:79;;:::i;:::-;17053:119;17239:1;17228:9;17224:17;17211:31;17269:18;17261:6;17258:30;17255:117;;;17291:79;;:::i;:::-;17255:117;17404:92;17488:7;17479:6;17468:9;17464:22;17404:92;:::i;:::-;17386:110;;;;17182:324;16930:583;;;;;:::o;17519:117::-;17628:1;17625;17618:12;17642:180;17690:77;17687:1;17680:88;17787:4;17784:1;17777:15;17811:4;17808:1;17801:15;17828:281;17911:27;17933:4;17911:27;:::i;:::-;17903:6;17899:40;18041:6;18029:10;18026:22;18005:18;17993:10;17990:34;17987:62;17984:88;;;18052:18;;:::i;:::-;17984:88;18092:10;18088:2;18081:22;17871:238;17828:281;;:::o;18115:129::-;18149:6;18176:20;;:::i;:::-;18166:30;;18205:33;18233:4;18225:6;18205:33;:::i;:::-;18115:129;;;:::o;18250:307::-;18311:4;18401:18;18393:6;18390:30;18387:56;;;18423:18;;:::i;:::-;18387:56;18461:29;18483:6;18461:29;:::i;:::-;18453:37;;18545:4;18539;18535:15;18527:23;;18250:307;;;:::o;18563:154::-;18647:6;18642:3;18637;18624:30;18709:1;18700:6;18695:3;18691:16;18684:27;18563:154;;;:::o;18723:410::-;18800:5;18825:65;18841:48;18882:6;18841:48;:::i;:::-;18825:65;:::i;:::-;18816:74;;18913:6;18906:5;18899:21;18951:4;18944:5;18940:16;18989:3;18980:6;18975:3;18971:16;18968:25;18965:112;;;18996:79;;:::i;:::-;18965:112;19086:41;19120:6;19115:3;19110;19086:41;:::i;:::-;18806:327;18723:410;;;;;:::o;19152:338::-;19207:5;19256:3;19249:4;19241:6;19237:17;19233:27;19223:122;;19264:79;;:::i;:::-;19223:122;19381:6;19368:20;19406:78;19480:3;19472:6;19465:4;19457:6;19453:17;19406:78;:::i;:::-;19397:87;;19213:277;19152:338;;;;:::o;19496:943::-;19591:6;19599;19607;19615;19664:3;19652:9;19643:7;19639:23;19635:33;19632:120;;;19671:79;;:::i;:::-;19632:120;19791:1;19816:53;19861:7;19852:6;19841:9;19837:22;19816:53;:::i;:::-;19806:63;;19762:117;19918:2;19944:53;19989:7;19980:6;19969:9;19965:22;19944:53;:::i;:::-;19934:63;;19889:118;20046:2;20072:53;20117:7;20108:6;20097:9;20093:22;20072:53;:::i;:::-;20062:63;;20017:118;20202:2;20191:9;20187:18;20174:32;20233:18;20225:6;20222:30;20219:117;;;20255:79;;:::i;:::-;20219:117;20360:62;20414:7;20405:6;20394:9;20390:22;20360:62;:::i;:::-;20350:72;;20145:287;19496:943;;;;;;;:::o;20445:474::-;20513:6;20521;20570:2;20558:9;20549:7;20545:23;20541:32;20538:119;;;20576:79;;:::i;:::-;20538:119;20696:1;20721:53;20766:7;20757:6;20746:9;20742:22;20721:53;:::i;:::-;20711:63;;20667:117;20823:2;20849:53;20894:7;20885:6;20874:9;20870:22;20849:53;:::i;:::-;20839:63;;20794:118;20445:474;;;;;:::o;20925:180::-;20973:77;20970:1;20963:88;21070:4;21067:1;21060:15;21094:4;21091:1;21084:15;21111:320;21155:6;21192:1;21186:4;21182:12;21172:22;;21239:1;21233:4;21229:12;21260:18;21250:81;;21316:4;21308:6;21304:17;21294:27;;21250:81;21378:2;21370:6;21367:14;21347:18;21344:38;21341:84;;;21397:18;;:::i;:::-;21341:84;21162:269;21111:320;;;:::o;21437:231::-;21577:34;21573:1;21565:6;21561:14;21554:58;21646:14;21641:2;21633:6;21629:15;21622:39;21437:231;:::o;21674:366::-;21816:3;21837:67;21901:2;21896:3;21837:67;:::i;:::-;21830:74;;21913:93;22002:3;21913:93;:::i;:::-;22031:2;22026:3;22022:12;22015:19;;21674:366;;;:::o;22046:419::-;22212:4;22250:2;22239:9;22235:18;22227:26;;22299:9;22293:4;22289:20;22285:1;22274:9;22270:17;22263:47;22327:131;22453:4;22327:131;:::i;:::-;22319:139;;22046:419;;;:::o;22471:220::-;22611:34;22607:1;22599:6;22595:14;22588:58;22680:3;22675:2;22667:6;22663:15;22656:28;22471:220;:::o;22697:366::-;22839:3;22860:67;22924:2;22919:3;22860:67;:::i;:::-;22853:74;;22936:93;23025:3;22936:93;:::i;:::-;23054:2;23049:3;23045:12;23038:19;;22697:366;;;:::o;23069:419::-;23235:4;23273:2;23262:9;23258:18;23250:26;;23322:9;23316:4;23312:20;23308:1;23297:9;23293:17;23286:47;23350:131;23476:4;23350:131;:::i;:::-;23342:139;;23069:419;;;:::o;23494:243::-;23634:34;23630:1;23622:6;23618:14;23611:58;23703:26;23698:2;23690:6;23686:15;23679:51;23494:243;:::o;23743:366::-;23885:3;23906:67;23970:2;23965:3;23906:67;:::i;:::-;23899:74;;23982:93;24071:3;23982:93;:::i;:::-;24100:2;24095:3;24091:12;24084:19;;23743:366;;;:::o;24115:419::-;24281:4;24319:2;24308:9;24304:18;24296:26;;24368:9;24362:4;24358:20;24354:1;24343:9;24339:17;24332:47;24396:131;24522:4;24396:131;:::i;:::-;24388:139;;24115:419;;;:::o;24540:223::-;24680:34;24676:1;24668:6;24664:14;24657:58;24749:6;24744:2;24736:6;24732:15;24725:31;24540:223;:::o;24769:366::-;24911:3;24932:67;24996:2;24991:3;24932:67;:::i;:::-;24925:74;;25008:93;25097:3;25008:93;:::i;:::-;25126:2;25121:3;25117:12;25110:19;;24769:366;;;:::o;25141:419::-;25307:4;25345:2;25334:9;25330:18;25322:26;;25394:9;25388:4;25384:20;25380:1;25369:9;25365:17;25358:47;25422:131;25548:4;25422:131;:::i;:::-;25414:139;;25141:419;;;:::o;25566:236::-;25706:34;25702:1;25694:6;25690:14;25683:58;25775:19;25770:2;25762:6;25758:15;25751:44;25566:236;:::o;25808:366::-;25950:3;25971:67;26035:2;26030:3;25971:67;:::i;:::-;25964:74;;26047:93;26136:3;26047:93;:::i;:::-;26165:2;26160:3;26156:12;26149:19;;25808:366;;;:::o;26180:419::-;26346:4;26384:2;26373:9;26369:18;26361:26;;26433:9;26427:4;26423:20;26419:1;26408:9;26404:17;26397:47;26461:131;26587:4;26461:131;:::i;:::-;26453:139;;26180:419;;;:::o;26605:180::-;26653:77;26650:1;26643:88;26750:4;26747:1;26740:15;26774:4;26771:1;26764:15;26791:348;26831:7;26854:20;26872:1;26854:20;:::i;:::-;26849:25;;26888:20;26906:1;26888:20;:::i;:::-;26883:25;;27076:1;27008:66;27004:74;27001:1;26998:81;26993:1;26986:9;26979:17;26975:105;26972:131;;;27083:18;;:::i;:::-;26972:131;27131:1;27128;27124:9;27113:20;;26791:348;;;;:::o;27145:180::-;27193:77;27190:1;27183:88;27290:4;27287:1;27280:15;27314:4;27311:1;27304:15;27331:185;27371:1;27388:20;27406:1;27388:20;:::i;:::-;27383:25;;27422:20;27440:1;27422:20;:::i;:::-;27417:25;;27461:1;27451:35;;27466:18;;:::i;:::-;27451:35;27508:1;27505;27501:9;27496:14;;27331:185;;;;:::o;27522:182::-;27662:34;27658:1;27650:6;27646:14;27639:58;27522:182;:::o;27710:366::-;27852:3;27873:67;27937:2;27932:3;27873:67;:::i;:::-;27866:74;;27949:93;28038:3;27949:93;:::i;:::-;28067:2;28062:3;28058:12;28051:19;;27710:366;;;:::o;28082:419::-;28248:4;28286:2;28275:9;28271:18;28263:26;;28335:9;28329:4;28325:20;28321:1;28310:9;28306:17;28299:47;28363:131;28489:4;28363:131;:::i;:::-;28355:139;;28082:419;;;:::o;28507:180::-;28555:77;28552:1;28545:88;28652:4;28649:1;28642:15;28676:4;28673:1;28666:15;28693:233;28732:3;28755:24;28773:5;28755:24;:::i;:::-;28746:33;;28801:66;28794:5;28791:77;28788:103;;;28871:18;;:::i;:::-;28788:103;28918:1;28911:5;28907:13;28900:20;;28693:233;;;:::o;28932:248::-;29072:34;29068:1;29060:6;29056:14;29049:58;29141:31;29136:2;29128:6;29124:15;29117:56;28932:248;:::o;29186:366::-;29328:3;29349:67;29413:2;29408:3;29349:67;:::i;:::-;29342:74;;29425:93;29514:3;29425:93;:::i;:::-;29543:2;29538:3;29534:12;29527:19;;29186:366;;;:::o;29558:419::-;29724:4;29762:2;29751:9;29747:18;29739:26;;29811:9;29805:4;29801:20;29797:1;29786:9;29782:17;29775:47;29839:131;29965:4;29839:131;:::i;:::-;29831:139;;29558:419;;;:::o;29983:305::-;30023:3;30042:20;30060:1;30042:20;:::i;:::-;30037:25;;30076:20;30094:1;30076:20;:::i;:::-;30071:25;;30230:1;30162:66;30158:74;30155:1;30152:81;30149:107;;;30236:18;;:::i;:::-;30149:107;30280:1;30277;30273:9;30266:16;;29983:305;;;;:::o;30294:232::-;30434:34;30430:1;30422:6;30418:14;30411:58;30503:15;30498:2;30490:6;30486:15;30479:40;30294:232;:::o;30532:366::-;30674:3;30695:67;30759:2;30754:3;30695:67;:::i;:::-;30688:74;;30771:93;30860:3;30771:93;:::i;:::-;30889:2;30884:3;30880:12;30873:19;;30532:366;;;:::o;30904:419::-;31070:4;31108:2;31097:9;31093:18;31085:26;;31157:9;31151:4;31147:20;31143:1;31132:9;31128:17;31121:47;31185:131;31311:4;31185:131;:::i;:::-;31177:139;;30904:419;;;:::o;31329:442::-;31478:4;31516:2;31505:9;31501:18;31493:26;;31529:71;31597:1;31586:9;31582:17;31573:6;31529:71;:::i;:::-;31610:72;31678:2;31667:9;31663:18;31654:6;31610:72;:::i;:::-;31692;31760:2;31749:9;31745:18;31736:6;31692:72;:::i;:::-;31329:442;;;;;;:::o;31777:137::-;31831:5;31862:6;31856:13;31847:22;;31878:30;31902:5;31878:30;:::i;:::-;31777:137;;;;:::o;31920:345::-;31987:6;32036:2;32024:9;32015:7;32011:23;32007:32;32004:119;;;32042:79;;:::i;:::-;32004:119;32162:1;32187:61;32240:7;32231:6;32220:9;32216:22;32187:61;:::i;:::-;32177:71;;32133:125;31920:345;;;;:::o;32271:235::-;32411:34;32407:1;32399:6;32395:14;32388:58;32480:18;32475:2;32467:6;32463:15;32456:43;32271:235;:::o;32512:366::-;32654:3;32675:67;32739:2;32734:3;32675:67;:::i;:::-;32668:74;;32751:93;32840:3;32751:93;:::i;:::-;32869:2;32864:3;32860:12;32853:19;;32512:366;;;:::o;32884:419::-;33050:4;33088:2;33077:9;33073:18;33065:26;;33137:9;33131:4;33127:20;33123:1;33112:9;33108:17;33101:47;33165:131;33291:4;33165:131;:::i;:::-;33157:139;;32884:419;;;:::o;33309:228::-;33449:34;33445:1;33437:6;33433:14;33426:58;33518:11;33513:2;33505:6;33501:15;33494:36;33309:228;:::o;33543:366::-;33685:3;33706:67;33770:2;33765:3;33706:67;:::i;:::-;33699:74;;33782:93;33871:3;33782:93;:::i;:::-;33900:2;33895:3;33891:12;33884:19;;33543:366;;;:::o;33915:419::-;34081:4;34119:2;34108:9;34104:18;34096:26;;34168:9;34162:4;34158:20;34154:1;34143:9;34139:17;34132:47;34196:131;34322:4;34196:131;:::i;:::-;34188:139;;33915:419;;;:::o;34340:229::-;34480:34;34476:1;34468:6;34464:14;34457:58;34549:12;34544:2;34536:6;34532:15;34525:37;34340:229;:::o;34575:366::-;34717:3;34738:67;34802:2;34797:3;34738:67;:::i;:::-;34731:74;;34814:93;34903:3;34814:93;:::i;:::-;34932:2;34927:3;34923:12;34916:19;;34575:366;;;:::o;34947:419::-;35113:4;35151:2;35140:9;35136:18;35128:26;;35200:9;35194:4;35190:20;35186:1;35175:9;35171:17;35164:47;35228:131;35354:4;35228:131;:::i;:::-;35220:139;;34947:419;;;:::o;35372:117::-;35481:1;35478;35471:12;35495:117;35604:1;35601;35594:12;35618:117;35727:1;35724;35717:12;35741:725;35819:4;35825:6;35881:11;35868:25;35981:1;35975:4;35971:12;35960:8;35944:14;35940:29;35936:48;35916:18;35912:73;35902:168;;35989:79;;:::i;:::-;35902:168;36101:18;36091:8;36087:33;36079:41;;36153:4;36140:18;36130:28;;36181:18;36173:6;36170:30;36167:117;;;36203:79;;:::i;:::-;36167:117;36311:2;36305:4;36301:13;36293:21;;36368:4;36360:6;36356:17;36340:14;36336:38;36330:4;36326:49;36323:136;;;36378:79;;:::i;:::-;36323:136;35832:634;35741:725;;;;;:::o;36472:236::-;36612:34;36608:1;36600:6;36596:14;36589:58;36681:19;36676:2;36668:6;36664:15;36657:44;36472:236;:::o;36714:366::-;36856:3;36877:67;36941:2;36936:3;36877:67;:::i;:::-;36870:74;;36953:93;37042:3;36953:93;:::i;:::-;37071:2;37066:3;37062:12;37055:19;;36714:366;;;:::o;37086:419::-;37252:4;37290:2;37279:9;37275:18;37267:26;;37339:9;37333:4;37329:20;37325:1;37314:9;37310:17;37303:47;37367:131;37493:4;37367:131;:::i;:::-;37359:139;;37086:419;;;:::o;37511:148::-;37613:11;37650:3;37635:18;;37511:148;;;;:::o;37665:377::-;37771:3;37799:39;37832:5;37799:39;:::i;:::-;37854:89;37936:6;37931:3;37854:89;:::i;:::-;37847:96;;37952:52;37997:6;37992:3;37985:4;37978:5;37974:16;37952:52;:::i;:::-;38029:6;38024:3;38020:16;38013:23;;37775:267;37665:377;;;;:::o;38048:435::-;38228:3;38250:95;38341:3;38332:6;38250:95;:::i;:::-;38243:102;;38362:95;38453:3;38444:6;38362:95;:::i;:::-;38355:102;;38474:3;38467:10;;38048:435;;;;;:::o;38489:225::-;38629:34;38625:1;38617:6;38613:14;38606:58;38698:8;38693:2;38685:6;38681:15;38674:33;38489:225;:::o;38720:366::-;38862:3;38883:67;38947:2;38942:3;38883:67;:::i;:::-;38876:74;;38959:93;39048:3;38959:93;:::i;:::-;39077:2;39072:3;39068:12;39061:19;;38720:366;;;:::o;39092:419::-;39258:4;39296:2;39285:9;39281:18;39273:26;;39345:9;39339:4;39335:20;39331:1;39320:9;39316:17;39309:47;39373:131;39499:4;39373:131;:::i;:::-;39365:139;;39092:419;;;:::o;39517:233::-;39657:34;39653:1;39645:6;39641:14;39634:58;39726:16;39721:2;39713:6;39709:15;39702:41;39517:233;:::o;39756:366::-;39898:3;39919:67;39983:2;39978:3;39919:67;:::i;:::-;39912:74;;39995:93;40084:3;39995:93;:::i;:::-;40113:2;40108:3;40104:12;40097:19;;39756:366;;;:::o;40128:419::-;40294:4;40332:2;40321:9;40317:18;40309:26;;40381:9;40375:4;40371:20;40367:1;40356:9;40352:17;40345:47;40409:131;40535:4;40409:131;:::i;:::-;40401:139;;40128:419;;;:::o;40553:231::-;40693:34;40689:1;40681:6;40677:14;40670:58;40762:14;40757:2;40749:6;40745:15;40738:39;40553:231;:::o;40790:366::-;40932:3;40953:67;41017:2;41012:3;40953:67;:::i;:::-;40946:74;;41029:93;41118:3;41029:93;:::i;:::-;41147:2;41142:3;41138:12;41131:19;;40790:366;;;:::o;41162:419::-;41328:4;41366:2;41355:9;41351:18;41343:26;;41415:9;41409:4;41405:20;41401:1;41390:9;41386:17;41379:47;41443:131;41569:4;41443:131;:::i;:::-;41435:139;;41162:419;;;:::o;41587:224::-;41727:34;41723:1;41715:6;41711:14;41704:58;41796:7;41791:2;41783:6;41779:15;41772:32;41587:224;:::o;41817:366::-;41959:3;41980:67;42044:2;42039:3;41980:67;:::i;:::-;41973:74;;42056:93;42145:3;42056:93;:::i;:::-;42174:2;42169:3;42165:12;42158:19;;41817:366;;;:::o;42189:419::-;42355:4;42393:2;42382:9;42378:18;42370:26;;42442:9;42436:4;42432:20;42428:1;42417:9;42413:17;42406:47;42470:131;42596:4;42470:131;:::i;:::-;42462:139;;42189:419;;;:::o;42614:223::-;42754:34;42750:1;42742:6;42738:14;42731:58;42823:6;42818:2;42810:6;42806:15;42799:31;42614:223;:::o;42843:366::-;42985:3;43006:67;43070:2;43065:3;43006:67;:::i;:::-;42999:74;;43082:93;43171:3;43082:93;:::i;:::-;43200:2;43195:3;43191:12;43184:19;;42843:366;;;:::o;43215:419::-;43381:4;43419:2;43408:9;43404:18;43396:26;;43468:9;43462:4;43458:20;43454:1;43443:9;43439:17;43432:47;43496:131;43622:4;43496:131;:::i;:::-;43488:139;;43215:419;;;:::o;43640:191::-;43680:4;43700:20;43718:1;43700:20;:::i;:::-;43695:25;;43734:20;43752:1;43734:20;:::i;:::-;43729:25;;43773:1;43770;43767:8;43764:34;;;43778:18;;:::i;:::-;43764:34;43823:1;43820;43816:9;43808:17;;43640:191;;;;:::o;43837:175::-;43977:27;43973:1;43965:6;43961:14;43954:51;43837:175;:::o;44018:366::-;44160:3;44181:67;44245:2;44240:3;44181:67;:::i;:::-;44174:74;;44257:93;44346:3;44257:93;:::i;:::-;44375:2;44370:3;44366:12;44359:19;;44018:366;;;:::o;44390:419::-;44556:4;44594:2;44583:9;44579:18;44571:26;;44643:9;44637:4;44633:20;44629:1;44618:9;44614:17;44607:47;44671:131;44797:4;44671:131;:::i;:::-;44663:139;;44390:419;;;:::o;44815:237::-;44955:34;44951:1;44943:6;44939:14;44932:58;45024:20;45019:2;45011:6;45007:15;45000:45;44815:237;:::o;45058:366::-;45200:3;45221:67;45285:2;45280:3;45221:67;:::i;:::-;45214:74;;45297:93;45386:3;45297:93;:::i;:::-;45415:2;45410:3;45406:12;45399:19;;45058:366;;;:::o;45430:419::-;45596:4;45634:2;45623:9;45619:18;45611:26;;45683:9;45677:4;45673:20;45669:1;45658:9;45654:17;45647:47;45711:131;45837:4;45711:131;:::i;:::-;45703:139;;45430:419;;;:::o;45855:234::-;45995:34;45991:1;45983:6;45979:14;45972:58;46064:17;46059:2;46051:6;46047:15;46040:42;45855:234;:::o;46095:366::-;46237:3;46258:67;46322:2;46317:3;46258:67;:::i;:::-;46251:74;;46334:93;46423:3;46334:93;:::i;:::-;46452:2;46447:3;46443:12;46436:19;;46095:366;;;:::o;46467:419::-;46633:4;46671:2;46660:9;46656:18;46648:26;;46720:9;46714:4;46710:20;46706:1;46695:9;46691:17;46684:47;46748:131;46874:4;46748:131;:::i;:::-;46740:139;;46467:419;;;:::o;46892:180::-;46940:77;46937:1;46930:88;47037:4;47034:1;47027:15;47061:4;47058:1;47051:15;47078:98;47129:6;47163:5;47157:12;47147:22;;47078:98;;;:::o;47182:168::-;47265:11;47299:6;47294:3;47287:19;47339:4;47334:3;47330:14;47315:29;;47182:168;;;;:::o;47356:360::-;47442:3;47470:38;47502:5;47470:38;:::i;:::-;47524:70;47587:6;47582:3;47524:70;:::i;:::-;47517:77;;47603:52;47648:6;47643:3;47636:4;47629:5;47625:16;47603:52;:::i;:::-;47680:29;47702:6;47680:29;:::i;:::-;47675:3;47671:39;47664:46;;47446:270;47356:360;;;;:::o;47722:640::-;47917:4;47955:3;47944:9;47940:19;47932:27;;47969:71;48037:1;48026:9;48022:17;48013:6;47969:71;:::i;:::-;48050:72;48118:2;48107:9;48103:18;48094:6;48050:72;:::i;:::-;48132;48200:2;48189:9;48185:18;48176:6;48132:72;:::i;:::-;48251:9;48245:4;48241:20;48236:2;48225:9;48221:18;48214:48;48279:76;48350:4;48341:6;48279:76;:::i;:::-;48271:84;;47722:640;;;;;;;:::o;48368:141::-;48424:5;48455:6;48449:13;48440:22;;48471:32;48497:5;48471:32;:::i;:::-;48368:141;;;;:::o;48515:349::-;48584:6;48633:2;48621:9;48612:7;48608:23;48604:32;48601:119;;;48639:79;;:::i;:::-;48601:119;48759:1;48784:63;48839:7;48830:6;48819:9;48815:22;48784:63;:::i;:::-;48774:73;;48730:127;48515:349;;;;:::o;48870:176::-;48902:1;48919:20;48937:1;48919:20;:::i;:::-;48914:25;;48953:20;48971:1;48953:20;:::i;:::-;48948:25;;48992:1;48982:35;;48997:18;;:::i;:::-;48982:35;49038:1;49035;49031:9;49026:14;;48870:176;;;;:::o;49052:182::-;49192:34;49188:1;49180:6;49176:14;49169:58;49052:182;:::o;49240:366::-;49382:3;49403:67;49467:2;49462:3;49403:67;:::i;:::-;49396:74;;49479:93;49568:3;49479:93;:::i;:::-;49597:2;49592:3;49588:12;49581:19;;49240:366;;;:::o;49612:419::-;49778:4;49816:2;49805:9;49801:18;49793:26;;49865:9;49859:4;49855:20;49851:1;49840:9;49836:17;49829:47;49893:131;50019:4;49893:131;:::i;:::-;49885:139;;49612:419;;;:::o;50037:178::-;50177:30;50173:1;50165:6;50161:14;50154:54;50037:178;:::o;50221:366::-;50363:3;50384:67;50448:2;50443:3;50384:67;:::i;:::-;50377:74;;50460:93;50549:3;50460:93;:::i;:::-;50578:2;50573:3;50569:12;50562:19;;50221:366;;;:::o;50593:419::-;50759:4;50797:2;50786:9;50782:18;50774:26;;50846:9;50840:4;50836:20;50832:1;50821:9;50817:17;50810:47;50874:131;51000:4;50874:131;:::i;:::-;50866:139;;50593:419;;;:::o
Swarm Source
ipfs://393936436caffc81ffe2120e494b6bb93496e2db427d57f53d8349da0033b910
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.