ERC-721
Overview
Max Total Supply
120 HBORN
Holders
80
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
2 HBORNLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
WhelpsBreed7
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./ERC721Enumerable.sol"; import "./Context.sol"; import "./SafeMath.sol"; import "./EnumerableSet.sol"; import "./EnumerableMap.sol"; import "./Ownable.sol"; contract WhelpsBreed7 is ERC721Enumerable, Ownable { using SafeMath for uint256; using Address for address; using EnumerableSet for EnumerableSet.UintSet; using EnumerableMap for EnumerableMap.UintToAddressMap; using Strings for uint256; address public _approvedContract = address(0); address public _stakingContract = address(0); bool public stakingContractLocked = false; /** * @dev Returns the address of the current owner. */ function approvedContract() public view virtual returns (address) { return _approvedContract; } function setApprovedContract(address _contract) external onlyOwner { _approvedContract = _contract; } modifier onlyOwnerOrApprovedContract() { require(owner() == _msgSender() || approvedContract() == _msgSender(), "Caller is not the owner or the approved contract"); _; } function setStakingContract(address _contract) external onlyOwner { require(!stakingContractLocked, "Locked"); _stakingContract = _contract; } function lockStakingContract() external onlyOwner { stakingContractLocked = true; } // name handlers bool public namesActivated; bool public namesActivatedLock; mapping (uint256 => string) public tokenIdToName; uint256 public constant MAX_NAME_LEN = 100; function toggleActivateNameFeature() public onlyOwner { require(namesActivatedLock == false, "Locked"); namesActivated = !namesActivated; } function lockNameFeatureForever() public onlyOwner { namesActivatedLock = true; } function checkNameValid(string calldata name) public pure returns(bool) { bytes memory nameBytes = bytes(name); require(nameBytes.length <= MAX_NAME_LEN); for (uint256 i = 0; i < nameBytes.length; i++) { require((nameBytes[i]>="a"&&nameBytes[i]<="z")||(nameBytes[i]>="A"&&nameBytes[i]<="Z")||(nameBytes[i]>="0"&&nameBytes[i]<="9")||nameBytes[i]=="-"||nameBytes[i]=="."||nameBytes[i]=="_"||nameBytes[i]=="~", "invalid char"); } return true; } function setNameForTokenId(uint256 tokenId, string calldata name) public { require(_exists(tokenId), "Unknown token"); require(msg.sender == ownerOf(tokenId), "Unauthorized"); require(namesActivated, "Setting names is disabled"); require(checkNameValid(name)); tokenIdToName[tokenId] = name; } // metadata & ipfs string public baseURI = "https://whelpsio.herokuapp.com/api7/"; string public ipfsBaseURI = "https://whelps.mypinata.cloud/ipfs/"; mapping (uint256 => string) public tokenIdToIpfsHash; // 1 - force use computed name for all // 2 - use ipfs hash if available, fallback to computed name // 3 - force use ipfs hash for all uint256 public metadataSwitch = 1; bool public ipfsLocked = false; mapping (uint256 => bool) public ipfsLockPerToken; bool public switchLocked = false; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory __name, string memory __symbol) ERC721(__name, __symbol) {} // Metadata handlers function _baseURI() internal view override returns (string memory) { return baseURI; } function _ipfsBaseURI() internal view returns (string memory) { return ipfsBaseURI; } function setBaseUri(string memory _uri) external onlyOwner { baseURI = _uri; } function setIpfsBaseUri(string memory _uri) external onlyOwner { require(ipfsLocked == false); ipfsBaseURI = _uri; } function lockIpfsMetadata() external onlyOwner { require(ipfsLocked == false); ipfsLocked = true; } function setMetadataSwitch(uint256 _switch) external onlyOwner { if (switchLocked == true) { require (_switch > metadataSwitch); } require(_switch >= 1 && _switch <= 3); metadataSwitch = _switch; } function lockMetadataSwitch() external onlyOwner { require(switchLocked == false); switchLocked = true; } function setIpfsHash(uint256 traitSummary, string memory hash) external onlyOwnerOrApprovedContract { if (ipfsLocked == true) { require(bytes(tokenIdToIpfsHash[traitSummary]).length == 0); } require(ipfsLockPerToken[traitSummary] == false); tokenIdToIpfsHash[traitSummary] = hash; } function lockIpfsPerToken(uint256 traitSummary) external onlyOwnerOrApprovedContract { require(ipfsLockPerToken[traitSummary] == false); ipfsLockPerToken[traitSummary] = true; } /** * @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 base = _baseURI(); string memory ipfsBase = _ipfsBaseURI(); string memory ipfsHash = tokenIdToIpfsHash[tokenId]; if (metadataSwitch == 1) { // force computed name return string(abi.encodePacked(base, tokenId.toString(), "/", tokenIdToName[tokenId])); } else if (metadataSwitch == 2) { // ipfs hash if available, fallback to computed name if (bytes(ipfsHash).length == 0) { return string(abi.encodePacked(base, tokenId.toString(), "/", tokenIdToName[tokenId])); } else { return string(abi.encodePacked(ipfsBase, ipfsHash)); } } else if (metadataSwitch == 3) { // force ipfs hash return string(abi.encodePacked(ipfsBase, ipfsHash)); } return ""; } // Minting function mint(address minter, uint256 mintIndex) public returns (uint256) { require(msg.sender == _stakingContract, "Unauthorized"); require(!_exists(mintIndex), "Token already minted"); _mint(minter, mintIndex); return mintIndex; } /** * @dev Withdraw ether from this contract (Callable by owner) */ function withdraw() external onlyOwner { uint256 balance = address(this).balance; payable(msg.sender).transfer(balance); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT 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) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./EnumerableSet.sol"; /** * @dev Library for managing an enumerable variant of Solidity's * https://solidity.readthedocs.io/en/latest/types.html#mapping-types[`mapping`] * type. * * Maps have the following properties: * * - Entries are added, removed, and checked for existence in constant time * (O(1)). * - Entries are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableMap for EnumerableMap.UintToAddressMap; * * // Declare a set state variable * EnumerableMap.UintToAddressMap private myMap; * } * ``` * * As of v3.0.0, only maps of type `uint256 -> address` (`UintToAddressMap`) are * supported. */ library EnumerableMap { using EnumerableSet for EnumerableSet.Bytes32Set; // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Map type with // bytes32 keys and values. // The Map implementation uses private functions, and user-facing // implementations (such as Uint256ToAddressMap) are just wrappers around // the underlying Map. // This means that we can only create new EnumerableMaps for types that fit // in bytes32. struct Map { // Storage of keys EnumerableSet.Bytes32Set _keys; mapping (bytes32 => bytes32) _values; } /** * @dev Adds a key-value pair to a map, or updates the value for an existing * key. O(1). * * Returns true if the key was added to the map, that is if it was not * already present. */ function _set(Map storage map, bytes32 key, bytes32 value) private returns (bool) { map._values[key] = value; return map._keys.add(key); } /** * @dev Removes a key-value pair from a map. O(1). * * Returns true if the key was removed from the map, that is if it was present. */ function _remove(Map storage map, bytes32 key) private returns (bool) { delete map._values[key]; return map._keys.remove(key); } /** * @dev Returns true if the key is in the map. O(1). */ function _contains(Map storage map, bytes32 key) private view returns (bool) { return map._keys.contains(key); } /** * @dev Returns the number of key-value pairs in the map. O(1). */ function _length(Map storage map) private view returns (uint256) { return map._keys.length(); } /** * @dev Returns the key-value pair stored at position `index` in the map. O(1). * * Note that there are no guarantees on the ordering of entries inside the * array, and it may change when more entries are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Map storage map, uint256 index) private view returns (bytes32, bytes32) { bytes32 key = map._keys.at(index); return (key, map._values[key]); } /** * @dev Tries to returns the value associated with `key`. O(1). * Does not revert if `key` is not in the map. */ function _tryGet(Map storage map, bytes32 key) private view returns (bool, bytes32) { bytes32 value = map._values[key]; if (value == bytes32(0)) { return (_contains(map, key), bytes32(0)); } else { return (true, value); } } /** * @dev Returns the value associated with `key`. O(1). * * Requirements: * * - `key` must be in the map. */ function _get(Map storage map, bytes32 key) private view returns (bytes32) { bytes32 value = map._values[key]; require(value != 0 || _contains(map, key), "EnumerableMap: nonexistent key"); return value; } /** * @dev Same as {_get}, with a custom error message when `key` is not in the map. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {_tryGet}. */ function _get(Map storage map, bytes32 key, string memory errorMessage) private view returns (bytes32) { bytes32 value = map._values[key]; require(value != 0 || _contains(map, key), errorMessage); return value; } // UintToAddressMap struct UintToAddressMap { Map _inner; } /** * @dev Adds a key-value pair to a map, or updates the value for an existing * key. O(1). * * Returns true if the key was added to the map, that is if it was not * already present. */ function set(UintToAddressMap storage map, uint256 key, address value) internal returns (bool) { return _set(map._inner, bytes32(key), bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the key was removed from the map, that is if it was present. */ function remove(UintToAddressMap storage map, uint256 key) internal returns (bool) { return _remove(map._inner, bytes32(key)); } /** * @dev Returns true if the key is in the map. O(1). */ function contains(UintToAddressMap storage map, uint256 key) internal view returns (bool) { return _contains(map._inner, bytes32(key)); } /** * @dev Returns the number of elements in the map. O(1). */ function length(UintToAddressMap storage map) internal view returns (uint256) { return _length(map._inner); } /** * @dev Returns the element 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(UintToAddressMap storage map, uint256 index) internal view returns (uint256, address) { (bytes32 key, bytes32 value) = _at(map._inner, index); return (uint256(key), address(uint160(uint256(value)))); } /** * @dev Tries to returns the value associated with `key`. O(1). * Does not revert if `key` is not in the map. * * _Available since v3.4._ */ function tryGet(UintToAddressMap storage map, uint256 key) internal view returns (bool, address) { (bool success, bytes32 value) = _tryGet(map._inner, bytes32(key)); return (success, address(uint160(uint256(value)))); } /** * @dev Returns the value associated with `key`. O(1). * * Requirements: * * - `key` must be in the map. */ function get(UintToAddressMap storage map, uint256 key) internal view returns (address) { return address(uint160(uint256(_get(map._inner, bytes32(key))))); } /** * @dev Same as {get}, with a custom error message when `key` is not in the map. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryGet}. */ function get(UintToAddressMap storage map, uint256 key, string memory errorMessage) internal view returns (address) { return address(uint160(uint256(_get(map._inner, bytes32(key), errorMessage)))); } }
// SPDX-License-Identifier: MIT 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; // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement. bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = 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) { require(set._values.length > index, "EnumerableSet: index out of bounds"); return set._values[index]; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @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; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC721.sol"; import "./IERC721Receiver.sol"; import "./IERC721Metadata.sol"; import "./Address.sol"; import "./Context.sol"; import "./Strings.sol"; import "./ERC165.sol"; /** * @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}. 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 { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom(address from, address to, uint256 tokenId) public virtual override { //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); } /** * @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); } /** * @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 of token that is not own"); 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); } /** * @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 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(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { // solhint-disable-next-line no-inline-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual { } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./ERC721.sol"; import "./IERC721Enumerable.sol"; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } }
// SPDX-License-Identifier: MIT 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); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @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; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC721.sol"; /** * @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); }
// SPDX-License-Identifier: MIT 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); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./Context.sol"; /** * @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() { _setOwner(_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 { _setOwner(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"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant alphabet = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = alphabet[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"__name","type":"string"},{"internalType":"string","name":"__symbol","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":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":[],"name":"MAX_NAME_LEN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_approvedContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_stakingContract","outputs":[{"internalType":"address","name":"","type":"address"}],"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":[],"name":"approvedContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"}],"name":"checkNameValid","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ipfsBaseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"ipfsLockPerToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ipfsLocked","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":[],"name":"lockIpfsMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"traitSummary","type":"uint256"}],"name":"lockIpfsPerToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lockMetadataSwitch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lockNameFeatureForever","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lockStakingContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"metadataSwitch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"},{"internalType":"uint256","name":"mintIndex","type":"uint256"}],"name":"mint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"namesActivated","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"namesActivatedLock","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"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":"_contract","type":"address"}],"name":"setApprovedContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setBaseUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setIpfsBaseUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"traitSummary","type":"uint256"},{"internalType":"string","name":"hash","type":"string"}],"name":"setIpfsHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_switch","type":"uint256"}],"name":"setMetadataSwitch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"name","type":"string"}],"name":"setNameForTokenId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"}],"name":"setStakingContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakingContractLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"switchLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleActivateNameFeature","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenIdToIpfsHash","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenIdToName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526000600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600c60146101000a81548160ff02191690831515021790555060405180606001604052806024815260200162005e1460249139600e9080519060200190620000d4929190620002a1565b5060405180606001604052806023815260200162005df160239139600f908051906020019062000106929190620002a1565b5060016011556000601260006101000a81548160ff0219169083151502179055506000601460006101000a81548160ff0219169083151502179055503480156200014f57600080fd5b5060405162005e3838038062005e388339818101604052810190620001759190620003c3565b818181600090805190602001906200018f929190620002a1565b508060019080519060200190620001a8929190620002a1565b505050620001cb620001bf620001d360201b60201c565b620001db60201b60201c565b5050620005a6565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002af90620004cb565b90600052602060002090601f016020900481019282620002d357600085556200031f565b82601f10620002ee57805160ff19168380011785556200031f565b828001600101855582156200031f579182015b828111156200031e57825182559160200191906001019062000301565b5b5090506200032e919062000332565b5090565b5b808211156200034d57600081600090555060010162000333565b5090565b60006200036862000362846200045f565b62000436565b9050828152602081018484840111156200038157600080fd5b6200038e84828562000495565b509392505050565b600082601f830112620003a857600080fd5b8151620003ba84826020860162000351565b91505092915050565b60008060408385031215620003d757600080fd5b600083015167ffffffffffffffff811115620003f257600080fd5b620004008582860162000396565b925050602083015167ffffffffffffffff8111156200041e57600080fd5b6200042c8582860162000396565b9150509250929050565b60006200044262000455565b905062000450828262000501565b919050565b6000604051905090565b600067ffffffffffffffff8211156200047d576200047c62000566565b5b620004888262000595565b9050602081019050919050565b60005b83811015620004b557808201518184015260208101905062000498565b83811115620004c5576000848401525b50505050565b60006002820490506001821680620004e457607f821691505b60208210811415620004fb57620004fa62000537565b5b50919050565b6200050c8262000595565b810181811067ffffffffffffffff821117156200052e576200052d62000566565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b61583b80620005b66000396000f3fe608060405234801561001057600080fd5b50600436106102d65760003560e01c8063715018a611610182578063b88d4fde116100e9578063e0b5b951116100a2578063f0fb21b01161007c578063f0fb21b014610885578063f2fde38b146108a3578063fd8b6f9a146108bf578063fe288c72146108db576102d6565b8063e0b5b95114610807578063e985e9c514610825578063f0c5bbaa14610855576102d6565b8063b88d4fde14610745578063b90aed2e14610761578063bfb216671461077f578063c87b56dd1461079d578063cda8c90f146107cd578063da2bfdb1146107d7576102d6565b80639c0dbc481161013b5780639c0dbc48146106855780639dd373b9146106a3578063a0bcfc7f146106bf578063a22cb465146106db578063b0de5e29146106f7578063b35fbf7414610715576102d6565b8063715018a6146105d55780637a5661e5146105df578063831a460f1461060f5780638da5cb5b1461062b578063949de4461461064957806395d89b4114610667576102d6565b806338cdbddd116102415780636352211e116101fa57806369242dc6116101d457806369242dc61461054d57806369362fb1146105695780636c0360eb1461058757806370a08231146105a5576102d6565b80636352211e146105095780636583b70c1461053957806366319eb614610543576102d6565b806338cdbddd1461045d5780633ccfd60b1461047957806340c10f1914610483578063415d1ed0146104b357806342842e0e146104bd5780634f6ccce7146104d9576102d6565b80630af90ea6116102935780630af90ea6146103af578063123ac9a9146103cd57806318160ddd146103d75780631fb3060f146103f557806323b872dd146104115780632f745c591461042d576102d6565b806301ffc9a7146102db5780630385c0de1461030b57806306fdde0314610327578063081812fc14610345578063095ea7b3146103755780630a63d8bb14610391575b600080fd5b6102f560048036038101906102f09190614282565b6108f9565b60405161030291906149d3565b60405180910390f35b610325600480360381019061032091906143db565b610973565b005b61032f610ad9565b60405161033c91906149ee565b60405180910390f35b61035f600480360381019061035a919061435a565b610b6b565b60405161036c919061496c565b60405180910390f35b61038f600480360381019061038a9190614246565b610bf0565b005b610399610d08565b6040516103a69190614d30565b60405180910390f35b6103b7610d0d565b6040516103c491906149d3565b60405180910390f35b6103d5610d20565b005b6103df610dd9565b6040516103ec9190614d30565b60405180910390f35b61040f600480360381019061040a9190614319565b610de6565b005b61042b60048036038101906104269190614140565b610e9c565b005b61044760048036038101906104429190614246565b610efc565b6040516104549190614d30565b60405180910390f35b6104776004803603810190610472919061435a565b610fa1565b005b61048161106d565b005b61049d60048036038101906104989190614246565b611138565b6040516104aa9190614d30565b60405180910390f35b6104bb611226565b005b6104d760048036038101906104d29190614140565b6112bf565b005b6104f360048036038101906104ee919061435a565b6112df565b6040516105009190614d30565b60405180910390f35b610523600480360381019061051e919061435a565b611376565b604051610530919061496c565b60405180910390f35b610541611428565b005b61054b6114c1565b005b610567600480360381019061056291906140db565b6115bf565b005b61057161167f565b60405161057e91906149d3565b60405180910390f35b61058f611692565b60405161059c91906149ee565b60405180910390f35b6105bf60048036038101906105ba91906140db565b611720565b6040516105cc9190614d30565b60405180910390f35b6105dd6117d8565b005b6105f960048036038101906105f491906142d4565b611860565b60405161060691906149d3565b60405180910390f35b6106296004803603810190610624919061435a565b611ebb565b005b610633611fdb565b604051610640919061496c565b60405180910390f35b610651612005565b60405161065e9190614d30565b60405180910390f35b61066f61200b565b60405161067c91906149ee565b60405180910390f35b61068d61209d565b60405161069a919061496c565b60405180910390f35b6106bd60048036038101906106b891906140db565b6120c3565b005b6106d960048036038101906106d49190614319565b6121d3565b005b6106f560048036038101906106f0919061420a565b612269565b005b6106ff6123ea565b60405161070c919061496c565b60405180910390f35b61072f600480360381019061072a919061435a565b612410565b60405161073c91906149d3565b60405180910390f35b61075f600480360381019061075a919061418f565b612430565b005b610769612492565b60405161077691906149d3565b60405180910390f35b6107876124a5565b60405161079491906149d3565b60405180910390f35b6107b760048036038101906107b2919061435a565b6124b8565b6040516107c491906149ee565b60405180910390f35b6107d56126e8565b005b6107f160048036038101906107ec919061435a565b6127a1565b6040516107fe91906149ee565b60405180910390f35b61080f612841565b60405161081c91906149d3565b60405180910390f35b61083f600480360381019061083a9190614104565b612854565b60405161084c91906149d3565b60405180910390f35b61086f600480360381019061086a919061435a565b6128e8565b60405161087c91906149ee565b60405180910390f35b61088d612988565b60405161089a91906149ee565b60405180910390f35b6108bd60048036038101906108b891906140db565b612a16565b005b6108d960048036038101906108d49190614383565b612b0e565b005b6108e3612c56565b6040516108f0919061496c565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061096c575061096b82612c80565b5b9050919050565b61097b612d62565b73ffffffffffffffffffffffffffffffffffffffff16610999611fdb565b73ffffffffffffffffffffffffffffffffffffffff1614806109f457506109be612d62565b73ffffffffffffffffffffffffffffffffffffffff166109dc612c56565b73ffffffffffffffffffffffffffffffffffffffff16145b610a33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2a90614b70565b60405180910390fd5b60011515601260009054906101000a900460ff1615151415610a7c576000601060008481526020019081526020016000208054610a6f90614f9b565b905014610a7b57600080fd5b5b600015156013600084815260200190815260200160002060009054906101000a900460ff16151514610aad57600080fd5b80601060008481526020019081526020016000209080519060200190610ad4929190613e2f565b505050565b606060008054610ae890614f9b565b80601f0160208091040260200160405190810160405280929190818152602001828054610b1490614f9b565b8015610b615780601f10610b3657610100808354040283529160200191610b61565b820191906000526020600020905b815481529060010190602001808311610b4457829003601f168201915b5050505050905090565b6000610b7682612d6a565b610bb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bac90614c50565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610bfb82611376565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6390614cd0565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c8b612d62565b73ffffffffffffffffffffffffffffffffffffffff161480610cba5750610cb981610cb4612d62565b612854565b5b610cf9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf090614bb0565b60405180910390fd5b610d038383612dd6565b505050565b606481565b601260009054906101000a900460ff1681565b610d28612d62565b73ffffffffffffffffffffffffffffffffffffffff16610d46611fdb565b73ffffffffffffffffffffffffffffffffffffffff1614610d9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9390614c90565b60405180910390fd5b60001515601260009054906101000a900460ff16151514610dbc57600080fd5b6001601260006101000a81548160ff021916908315150217905550565b6000600880549050905090565b610dee612d62565b73ffffffffffffffffffffffffffffffffffffffff16610e0c611fdb565b73ffffffffffffffffffffffffffffffffffffffff1614610e62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5990614c90565b60405180910390fd5b60001515601260009054906101000a900460ff16151514610e8257600080fd5b80600f9080519060200190610e98929190613e2f565b5050565b610ead610ea7612d62565b82612e8f565b610eec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee390614cf0565b60405180910390fd5b610ef7838383612f6d565b505050565b6000610f0783611720565b8210610f48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3f90614a90565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610fa9612d62565b73ffffffffffffffffffffffffffffffffffffffff16610fc7611fdb565b73ffffffffffffffffffffffffffffffffffffffff161461101d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101490614c90565b60405180910390fd5b60011515601460009054906101000a900460ff161515141561104857601154811161104757600080fd5b5b6001811015801561105a575060038111155b61106357600080fd5b8060118190555050565b611075612d62565b73ffffffffffffffffffffffffffffffffffffffff16611093611fdb565b73ffffffffffffffffffffffffffffffffffffffff16146110e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e090614c90565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611134573d6000803e3d6000fd5b5050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146111ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c190614a50565b60405180910390fd5b6111d382612d6a565b15611213576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120a90614a70565b60405180910390fd5b61121d83836131c9565b81905092915050565b61122e612d62565b73ffffffffffffffffffffffffffffffffffffffff1661124c611fdb565b73ffffffffffffffffffffffffffffffffffffffff16146112a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129990614c90565b60405180910390fd5b6001600c60166101000a81548160ff021916908315150217905550565b6112da83838360405180602001604052806000815250612430565b505050565b60006112e9610dd9565b821061132a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132190614d10565b60405180910390fd5b60088281548110611364577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561141f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141690614bf0565b60405180910390fd5b80915050919050565b611430612d62565b73ffffffffffffffffffffffffffffffffffffffff1661144e611fdb565b73ffffffffffffffffffffffffffffffffffffffff16146114a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149b90614c90565b60405180910390fd5b6001600c60146101000a81548160ff021916908315150217905550565b6114c9612d62565b73ffffffffffffffffffffffffffffffffffffffff166114e7611fdb565b73ffffffffffffffffffffffffffffffffffffffff161461153d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153490614c90565b60405180910390fd5b60001515600c60169054906101000a900460ff16151514611593576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158a90614a30565b60405180910390fd5b600c60159054906101000a900460ff1615600c60156101000a81548160ff021916908315150217905550565b6115c7612d62565b73ffffffffffffffffffffffffffffffffffffffff166115e5611fdb565b73ffffffffffffffffffffffffffffffffffffffff161461163b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163290614c90565b60405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b601460009054906101000a900460ff1681565b600e805461169f90614f9b565b80601f01602080910402602001604051908101604052809291908181526020018280546116cb90614f9b565b80156117185780601f106116ed57610100808354040283529160200191611718565b820191906000526020600020905b8154815290600101906020018083116116fb57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611791576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178890614bd0565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6117e0612d62565b73ffffffffffffffffffffffffffffffffffffffff166117fe611fdb565b73ffffffffffffffffffffffffffffffffffffffff1614611854576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184b90614c90565b60405180910390fd5b61185e6000613397565b565b60008083838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505090506064815111156118b957600080fd5b60005b8151811015611eaf577f610000000000000000000000000000000000000000000000000000000000000082828151811061191f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916101580156119df57507f7a000000000000000000000000000000000000000000000000000000000000008282815181106119af577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191611155b80611b0057507f4100000000000000000000000000000000000000000000000000000000000000828281518110611a3f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191610158015611aff57507f5a00000000000000000000000000000000000000000000000000000000000000828281518110611acf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191611155b5b80611c2157507f3000000000000000000000000000000000000000000000000000000000000000828281518110611b60577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191610158015611c2057507f3900000000000000000000000000000000000000000000000000000000000000828281518110611bf0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191611155b5b80611cb057507f2d00000000000000000000000000000000000000000000000000000000000000828281518110611c81577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611d3f57507f2e00000000000000000000000000000000000000000000000000000000000000828281518110611d10577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611dce57507f5f00000000000000000000000000000000000000000000000000000000000000828281518110611d9f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611e5d57507f7e00000000000000000000000000000000000000000000000000000000000000828281518110611e2e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b611e9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9390614a10565b60405180910390fd5b8080611ea790614ffe565b9150506118bc565b50600191505092915050565b611ec3612d62565b73ffffffffffffffffffffffffffffffffffffffff16611ee1611fdb565b73ffffffffffffffffffffffffffffffffffffffff161480611f3c5750611f06612d62565b73ffffffffffffffffffffffffffffffffffffffff16611f24612c56565b73ffffffffffffffffffffffffffffffffffffffff16145b611f7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7290614b70565b60405180910390fd5b600015156013600083815260200190815260200160002060009054906101000a900460ff16151514611fac57600080fd5b60016013600083815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60115481565b60606001805461201a90614f9b565b80601f016020809104026020016040519081016040528092919081815260200182805461204690614f9b565b80156120935780601f1061206857610100808354040283529160200191612093565b820191906000526020600020905b81548152906001019060200180831161207657829003601f168201915b5050505050905090565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6120cb612d62565b73ffffffffffffffffffffffffffffffffffffffff166120e9611fdb565b73ffffffffffffffffffffffffffffffffffffffff161461213f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213690614c90565b60405180910390fd5b600c60149054906101000a900460ff161561218f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218690614a30565b60405180910390fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6121db612d62565b73ffffffffffffffffffffffffffffffffffffffff166121f9611fdb565b73ffffffffffffffffffffffffffffffffffffffff161461224f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224690614c90565b60405180910390fd5b80600e9080519060200190612265929190613e2f565b5050565b612271612d62565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156122df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122d690614b30565b60405180910390fd5b80600560006122ec612d62565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612399612d62565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516123de91906149d3565b60405180910390a35050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60136020528060005260406000206000915054906101000a900460ff1681565b61244161243b612d62565b83612e8f565b612480576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247790614cf0565b60405180910390fd5b61248c8484848461345d565b50505050565b600c60149054906101000a900460ff1681565b600c60159054906101000a900460ff1681565b60606124c382612d6a565b612502576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f990614c30565b60405180910390fd5b600061250c6134b9565b9050600061251861354b565b9050600060106000868152602001908152602001600020805461253a90614f9b565b80601f016020809104026020016040519081016040528092919081815260200182805461256690614f9b565b80156125b35780601f10612588576101008083540402835291602001916125b3565b820191906000526020600020905b81548152906001019060200180831161259657829003601f168201915b505050505090506001601154141561260d57826125cf866135dd565b600d60008881526020019081526020016000206040516020016125f493929190614930565b60405160208183030381529060405293505050506126e3565b600260115414156126965760008151141561266a578261262c866135dd565b600d600088815260200190815260200160002060405160200161265193929190614930565b60405160208183030381529060405293505050506126e3565b818160405160200161267d92919061490c565b60405160208183030381529060405293505050506126e3565b600360115414156126cd5781816040516020016126b492919061490c565b60405160208183030381529060405293505050506126e3565b6040518060200160405280600081525093505050505b919050565b6126f0612d62565b73ffffffffffffffffffffffffffffffffffffffff1661270e611fdb565b73ffffffffffffffffffffffffffffffffffffffff1614612764576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275b90614c90565b60405180910390fd5b60001515601460009054906101000a900460ff1615151461278457600080fd5b6001601460006101000a81548160ff021916908315150217905550565b600d60205280600052604060002060009150905080546127c090614f9b565b80601f01602080910402602001604051908101604052809291908181526020018280546127ec90614f9b565b80156128395780601f1061280e57610100808354040283529160200191612839565b820191906000526020600020905b81548152906001019060200180831161281c57829003601f168201915b505050505081565b600c60169054906101000a900460ff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6010602052806000526040600020600091509050805461290790614f9b565b80601f016020809104026020016040519081016040528092919081815260200182805461293390614f9b565b80156129805780601f1061295557610100808354040283529160200191612980565b820191906000526020600020905b81548152906001019060200180831161296357829003601f168201915b505050505081565b600f805461299590614f9b565b80601f01602080910402602001604051908101604052809291908181526020018280546129c190614f9b565b8015612a0e5780601f106129e357610100808354040283529160200191612a0e565b820191906000526020600020905b8154815290600101906020018083116129f157829003601f168201915b505050505081565b612a1e612d62565b73ffffffffffffffffffffffffffffffffffffffff16612a3c611fdb565b73ffffffffffffffffffffffffffffffffffffffff1614612a92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a8990614c90565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612b02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612af990614ad0565b60405180910390fd5b612b0b81613397565b50565b612b1783612d6a565b612b56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b4d90614b50565b60405180910390fd5b612b5f83611376565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612bcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bc390614a50565b60405180910390fd5b600c60159054906101000a900460ff16612c1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c1290614c70565b60405180910390fd5b612c258282611860565b612c2e57600080fd5b8181600d60008681526020019081526020016000209190612c50929190613eb5565b50505050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612d4b57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612d5b5750612d5a8261378a565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612e4983611376565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612e9a82612d6a565b612ed9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ed090614b90565b60405180910390fd5b6000612ee483611376565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612f5357508373ffffffffffffffffffffffffffffffffffffffff16612f3b84610b6b565b73ffffffffffffffffffffffffffffffffffffffff16145b80612f645750612f638185612854565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612f8d82611376565b73ffffffffffffffffffffffffffffffffffffffff1614612fe3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fda90614cb0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613053576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161304a90614b10565b60405180910390fd5b61305e8383836137f4565b613069600082612dd6565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546130b99190614eb1565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546131109190614e2a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613239576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161323090614c10565b60405180910390fd5b61324281612d6a565b15613282576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161327990614af0565b60405180910390fd5b61328e600083836137f4565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546132de9190614e2a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b613468848484612f6d565b61347484848484613908565b6134b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134aa90614ab0565b60405180910390fd5b50505050565b6060600e80546134c890614f9b565b80601f01602080910402602001604051908101604052809291908181526020018280546134f490614f9b565b80156135415780601f1061351657610100808354040283529160200191613541565b820191906000526020600020905b81548152906001019060200180831161352457829003601f168201915b5050505050905090565b6060600f805461355a90614f9b565b80601f016020809104026020016040519081016040528092919081815260200182805461358690614f9b565b80156135d35780601f106135a8576101008083540402835291602001916135d3565b820191906000526020600020905b8154815290600101906020018083116135b657829003601f168201915b5050505050905090565b60606000821415613625576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613785565b600082905060005b6000821461365757808061364090614ffe565b915050600a826136509190614e80565b915061362d565b60008167ffffffffffffffff811115613699577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156136cb5781602001600182028036833780820191505090505b5090505b6000851461377e576001826136e49190614eb1565b9150600a856136f39190615047565b60306136ff9190614e2a565b60f81b81838151811061373b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856137779190614e80565b94506136cf565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6137ff838383613a9f565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156138425761383d81613aa4565b613881565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146138805761387f8382613aed565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156138c4576138bf81613c5a565b613903565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613902576139018282613d9d565b5b5b505050565b60006139298473ffffffffffffffffffffffffffffffffffffffff16613e1c565b15613a92578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613952612d62565b8786866040518563ffffffff1660e01b81526004016139749493929190614987565b602060405180830381600087803b15801561398e57600080fd5b505af19250505080156139bf57506040513d601f19601f820116820180604052508101906139bc91906142ab565b60015b613a42573d80600081146139ef576040519150601f19603f3d011682016040523d82523d6000602084013e6139f4565b606091505b50600081511415613a3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a3190614ab0565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613a97565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613afa84611720565b613b049190614eb1565b9050600060076000848152602001908152602001600020549050818114613be9576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613c6e9190614eb1565b9050600060096000848152602001908152602001600020549050600060088381548110613cc4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110613d0c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613d81577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000613da883611720565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b828054613e3b90614f9b565b90600052602060002090601f016020900481019282613e5d5760008555613ea4565b82601f10613e7657805160ff1916838001178555613ea4565b82800160010185558215613ea4579182015b82811115613ea3578251825591602001919060010190613e88565b5b509050613eb19190613f3b565b5090565b828054613ec190614f9b565b90600052602060002090601f016020900481019282613ee35760008555613f2a565b82601f10613efc57803560ff1916838001178555613f2a565b82800160010185558215613f2a579182015b82811115613f29578235825591602001919060010190613f0e565b5b509050613f379190613f3b565b5090565b5b80821115613f54576000816000905550600101613f3c565b5090565b6000613f6b613f6684614d70565b614d4b565b905082815260208101848484011115613f8357600080fd5b613f8e848285614f59565b509392505050565b6000613fa9613fa484614da1565b614d4b565b905082815260208101848484011115613fc157600080fd5b613fcc848285614f59565b509392505050565b600081359050613fe3816157a9565b92915050565b600081359050613ff8816157c0565b92915050565b60008135905061400d816157d7565b92915050565b600081519050614022816157d7565b92915050565b600082601f83011261403957600080fd5b8135614049848260208601613f58565b91505092915050565b60008083601f84011261406457600080fd5b8235905067ffffffffffffffff81111561407d57600080fd5b60208301915083600182028301111561409557600080fd5b9250929050565b600082601f8301126140ad57600080fd5b81356140bd848260208601613f96565b91505092915050565b6000813590506140d5816157ee565b92915050565b6000602082840312156140ed57600080fd5b60006140fb84828501613fd4565b91505092915050565b6000806040838503121561411757600080fd5b600061412585828601613fd4565b925050602061413685828601613fd4565b9150509250929050565b60008060006060848603121561415557600080fd5b600061416386828701613fd4565b935050602061417486828701613fd4565b9250506040614185868287016140c6565b9150509250925092565b600080600080608085870312156141a557600080fd5b60006141b387828801613fd4565b94505060206141c487828801613fd4565b93505060406141d5878288016140c6565b925050606085013567ffffffffffffffff8111156141f257600080fd5b6141fe87828801614028565b91505092959194509250565b6000806040838503121561421d57600080fd5b600061422b85828601613fd4565b925050602061423c85828601613fe9565b9150509250929050565b6000806040838503121561425957600080fd5b600061426785828601613fd4565b9250506020614278858286016140c6565b9150509250929050565b60006020828403121561429457600080fd5b60006142a284828501613ffe565b91505092915050565b6000602082840312156142bd57600080fd5b60006142cb84828501614013565b91505092915050565b600080602083850312156142e757600080fd5b600083013567ffffffffffffffff81111561430157600080fd5b61430d85828601614052565b92509250509250929050565b60006020828403121561432b57600080fd5b600082013567ffffffffffffffff81111561434557600080fd5b6143518482850161409c565b91505092915050565b60006020828403121561436c57600080fd5b600061437a848285016140c6565b91505092915050565b60008060006040848603121561439857600080fd5b60006143a6868287016140c6565b935050602084013567ffffffffffffffff8111156143c357600080fd5b6143cf86828701614052565b92509250509250925092565b600080604083850312156143ee57600080fd5b60006143fc858286016140c6565b925050602083013567ffffffffffffffff81111561441957600080fd5b6144258582860161409c565b9150509250929050565b61443881614ee5565b82525050565b61444781614ef7565b82525050565b600061445882614de7565b6144628185614dfd565b9350614472818560208601614f68565b61447b81615134565b840191505092915050565b600061449182614df2565b61449b8185614e0e565b93506144ab818560208601614f68565b6144b481615134565b840191505092915050565b60006144ca82614df2565b6144d48185614e1f565b93506144e4818560208601614f68565b80840191505092915050565b600081546144fd81614f9b565b6145078186614e1f565b94506001821660008114614522576001811461453357614566565b60ff19831686528186019350614566565b61453c85614dd2565b60005b8381101561455e5781548189015260018201915060208101905061453f565b838801955050505b50505092915050565b600061457c600c83614e0e565b915061458782615145565b602082019050919050565b600061459f600683614e0e565b91506145aa8261516e565b602082019050919050565b60006145c2600c83614e0e565b91506145cd82615197565b602082019050919050565b60006145e5601483614e0e565b91506145f0826151c0565b602082019050919050565b6000614608602b83614e0e565b9150614613826151e9565b604082019050919050565b600061462b603283614e0e565b915061463682615238565b604082019050919050565b600061464e602683614e0e565b915061465982615287565b604082019050919050565b6000614671601c83614e0e565b915061467c826152d6565b602082019050919050565b6000614694602483614e0e565b915061469f826152ff565b604082019050919050565b60006146b7601983614e0e565b91506146c28261534e565b602082019050919050565b60006146da600d83614e0e565b91506146e582615377565b602082019050919050565b60006146fd603083614e0e565b9150614708826153a0565b604082019050919050565b6000614720602c83614e0e565b915061472b826153ef565b604082019050919050565b6000614743603883614e0e565b915061474e8261543e565b604082019050919050565b6000614766602a83614e0e565b91506147718261548d565b604082019050919050565b6000614789602983614e0e565b9150614794826154dc565b604082019050919050565b60006147ac602083614e0e565b91506147b78261552b565b602082019050919050565b60006147cf603183614e0e565b91506147da82615554565b604082019050919050565b60006147f2602c83614e0e565b91506147fd826155a3565b604082019050919050565b6000614815601983614e0e565b9150614820826155f2565b602082019050919050565b6000614838602083614e0e565b91506148438261561b565b602082019050919050565b600061485b602983614e0e565b915061486682615644565b604082019050919050565b600061487e602183614e0e565b915061488982615693565b604082019050919050565b60006148a1603183614e0e565b91506148ac826156e2565b604082019050919050565b60006148c4602c83614e0e565b91506148cf82615731565b604082019050919050565b60006148e7600183614e1f565b91506148f282615780565b600182019050919050565b61490681614f4f565b82525050565b600061491882856144bf565b915061492482846144bf565b91508190509392505050565b600061493c82866144bf565b915061494882856144bf565b9150614953826148da565b915061495f82846144f0565b9150819050949350505050565b6000602082019050614981600083018461442f565b92915050565b600060808201905061499c600083018761442f565b6149a9602083018661442f565b6149b660408301856148fd565b81810360608301526149c8818461444d565b905095945050505050565b60006020820190506149e8600083018461443e565b92915050565b60006020820190508181036000830152614a088184614486565b905092915050565b60006020820190508181036000830152614a298161456f565b9050919050565b60006020820190508181036000830152614a4981614592565b9050919050565b60006020820190508181036000830152614a69816145b5565b9050919050565b60006020820190508181036000830152614a89816145d8565b9050919050565b60006020820190508181036000830152614aa9816145fb565b9050919050565b60006020820190508181036000830152614ac98161461e565b9050919050565b60006020820190508181036000830152614ae981614641565b9050919050565b60006020820190508181036000830152614b0981614664565b9050919050565b60006020820190508181036000830152614b2981614687565b9050919050565b60006020820190508181036000830152614b49816146aa565b9050919050565b60006020820190508181036000830152614b69816146cd565b9050919050565b60006020820190508181036000830152614b89816146f0565b9050919050565b60006020820190508181036000830152614ba981614713565b9050919050565b60006020820190508181036000830152614bc981614736565b9050919050565b60006020820190508181036000830152614be981614759565b9050919050565b60006020820190508181036000830152614c098161477c565b9050919050565b60006020820190508181036000830152614c298161479f565b9050919050565b60006020820190508181036000830152614c49816147c2565b9050919050565b60006020820190508181036000830152614c69816147e5565b9050919050565b60006020820190508181036000830152614c8981614808565b9050919050565b60006020820190508181036000830152614ca98161482b565b9050919050565b60006020820190508181036000830152614cc98161484e565b9050919050565b60006020820190508181036000830152614ce981614871565b9050919050565b60006020820190508181036000830152614d0981614894565b9050919050565b60006020820190508181036000830152614d29816148b7565b9050919050565b6000602082019050614d4560008301846148fd565b92915050565b6000614d55614d66565b9050614d618282614fcd565b919050565b6000604051905090565b600067ffffffffffffffff821115614d8b57614d8a615105565b5b614d9482615134565b9050602081019050919050565b600067ffffffffffffffff821115614dbc57614dbb615105565b5b614dc582615134565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614e3582614f4f565b9150614e4083614f4f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614e7557614e74615078565b5b828201905092915050565b6000614e8b82614f4f565b9150614e9683614f4f565b925082614ea657614ea56150a7565b5b828204905092915050565b6000614ebc82614f4f565b9150614ec783614f4f565b925082821015614eda57614ed9615078565b5b828203905092915050565b6000614ef082614f2f565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614f86578082015181840152602081019050614f6b565b83811115614f95576000848401525b50505050565b60006002820490506001821680614fb357607f821691505b60208210811415614fc757614fc66150d6565b5b50919050565b614fd682615134565b810181811067ffffffffffffffff82111715614ff557614ff4615105565b5b80604052505050565b600061500982614f4f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561503c5761503b615078565b5b600182019050919050565b600061505282614f4f565b915061505d83614f4f565b92508261506d5761506c6150a7565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f696e76616c696420636861720000000000000000000000000000000000000000600082015250565b7f4c6f636b65640000000000000000000000000000000000000000000000000000600082015250565b7f556e617574686f72697a65640000000000000000000000000000000000000000600082015250565b7f546f6b656e20616c7265616479206d696e746564000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f556e6b6e6f776e20746f6b656e00000000000000000000000000000000000000600082015250565b7f43616c6c6572206973206e6f7420746865206f776e6572206f7220746865206160008201527f7070726f76656420636f6e747261637400000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f53657474696e67206e616d65732069732064697361626c656400000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b6157b281614ee5565b81146157bd57600080fd5b50565b6157c981614ef7565b81146157d457600080fd5b50565b6157e081614f03565b81146157eb57600080fd5b50565b6157f781614f4f565b811461580257600080fd5b5056fea26469706673582212201785b017aecd84d0333462c5e63df00480e7145b1e333950ec9e90d91de73bb364736f6c6343000804003368747470733a2f2f7768656c70732e6d7970696e6174612e636c6f75642f697066732f68747470733a2f2f7768656c7073696f2e6865726f6b756170702e636f6d2f617069372f00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000848494748424f524e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000548424f524e000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102d65760003560e01c8063715018a611610182578063b88d4fde116100e9578063e0b5b951116100a2578063f0fb21b01161007c578063f0fb21b014610885578063f2fde38b146108a3578063fd8b6f9a146108bf578063fe288c72146108db576102d6565b8063e0b5b95114610807578063e985e9c514610825578063f0c5bbaa14610855576102d6565b8063b88d4fde14610745578063b90aed2e14610761578063bfb216671461077f578063c87b56dd1461079d578063cda8c90f146107cd578063da2bfdb1146107d7576102d6565b80639c0dbc481161013b5780639c0dbc48146106855780639dd373b9146106a3578063a0bcfc7f146106bf578063a22cb465146106db578063b0de5e29146106f7578063b35fbf7414610715576102d6565b8063715018a6146105d55780637a5661e5146105df578063831a460f1461060f5780638da5cb5b1461062b578063949de4461461064957806395d89b4114610667576102d6565b806338cdbddd116102415780636352211e116101fa57806369242dc6116101d457806369242dc61461054d57806369362fb1146105695780636c0360eb1461058757806370a08231146105a5576102d6565b80636352211e146105095780636583b70c1461053957806366319eb614610543576102d6565b806338cdbddd1461045d5780633ccfd60b1461047957806340c10f1914610483578063415d1ed0146104b357806342842e0e146104bd5780634f6ccce7146104d9576102d6565b80630af90ea6116102935780630af90ea6146103af578063123ac9a9146103cd57806318160ddd146103d75780631fb3060f146103f557806323b872dd146104115780632f745c591461042d576102d6565b806301ffc9a7146102db5780630385c0de1461030b57806306fdde0314610327578063081812fc14610345578063095ea7b3146103755780630a63d8bb14610391575b600080fd5b6102f560048036038101906102f09190614282565b6108f9565b60405161030291906149d3565b60405180910390f35b610325600480360381019061032091906143db565b610973565b005b61032f610ad9565b60405161033c91906149ee565b60405180910390f35b61035f600480360381019061035a919061435a565b610b6b565b60405161036c919061496c565b60405180910390f35b61038f600480360381019061038a9190614246565b610bf0565b005b610399610d08565b6040516103a69190614d30565b60405180910390f35b6103b7610d0d565b6040516103c491906149d3565b60405180910390f35b6103d5610d20565b005b6103df610dd9565b6040516103ec9190614d30565b60405180910390f35b61040f600480360381019061040a9190614319565b610de6565b005b61042b60048036038101906104269190614140565b610e9c565b005b61044760048036038101906104429190614246565b610efc565b6040516104549190614d30565b60405180910390f35b6104776004803603810190610472919061435a565b610fa1565b005b61048161106d565b005b61049d60048036038101906104989190614246565b611138565b6040516104aa9190614d30565b60405180910390f35b6104bb611226565b005b6104d760048036038101906104d29190614140565b6112bf565b005b6104f360048036038101906104ee919061435a565b6112df565b6040516105009190614d30565b60405180910390f35b610523600480360381019061051e919061435a565b611376565b604051610530919061496c565b60405180910390f35b610541611428565b005b61054b6114c1565b005b610567600480360381019061056291906140db565b6115bf565b005b61057161167f565b60405161057e91906149d3565b60405180910390f35b61058f611692565b60405161059c91906149ee565b60405180910390f35b6105bf60048036038101906105ba91906140db565b611720565b6040516105cc9190614d30565b60405180910390f35b6105dd6117d8565b005b6105f960048036038101906105f491906142d4565b611860565b60405161060691906149d3565b60405180910390f35b6106296004803603810190610624919061435a565b611ebb565b005b610633611fdb565b604051610640919061496c565b60405180910390f35b610651612005565b60405161065e9190614d30565b60405180910390f35b61066f61200b565b60405161067c91906149ee565b60405180910390f35b61068d61209d565b60405161069a919061496c565b60405180910390f35b6106bd60048036038101906106b891906140db565b6120c3565b005b6106d960048036038101906106d49190614319565b6121d3565b005b6106f560048036038101906106f0919061420a565b612269565b005b6106ff6123ea565b60405161070c919061496c565b60405180910390f35b61072f600480360381019061072a919061435a565b612410565b60405161073c91906149d3565b60405180910390f35b61075f600480360381019061075a919061418f565b612430565b005b610769612492565b60405161077691906149d3565b60405180910390f35b6107876124a5565b60405161079491906149d3565b60405180910390f35b6107b760048036038101906107b2919061435a565b6124b8565b6040516107c491906149ee565b60405180910390f35b6107d56126e8565b005b6107f160048036038101906107ec919061435a565b6127a1565b6040516107fe91906149ee565b60405180910390f35b61080f612841565b60405161081c91906149d3565b60405180910390f35b61083f600480360381019061083a9190614104565b612854565b60405161084c91906149d3565b60405180910390f35b61086f600480360381019061086a919061435a565b6128e8565b60405161087c91906149ee565b60405180910390f35b61088d612988565b60405161089a91906149ee565b60405180910390f35b6108bd60048036038101906108b891906140db565b612a16565b005b6108d960048036038101906108d49190614383565b612b0e565b005b6108e3612c56565b6040516108f0919061496c565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061096c575061096b82612c80565b5b9050919050565b61097b612d62565b73ffffffffffffffffffffffffffffffffffffffff16610999611fdb565b73ffffffffffffffffffffffffffffffffffffffff1614806109f457506109be612d62565b73ffffffffffffffffffffffffffffffffffffffff166109dc612c56565b73ffffffffffffffffffffffffffffffffffffffff16145b610a33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2a90614b70565b60405180910390fd5b60011515601260009054906101000a900460ff1615151415610a7c576000601060008481526020019081526020016000208054610a6f90614f9b565b905014610a7b57600080fd5b5b600015156013600084815260200190815260200160002060009054906101000a900460ff16151514610aad57600080fd5b80601060008481526020019081526020016000209080519060200190610ad4929190613e2f565b505050565b606060008054610ae890614f9b565b80601f0160208091040260200160405190810160405280929190818152602001828054610b1490614f9b565b8015610b615780601f10610b3657610100808354040283529160200191610b61565b820191906000526020600020905b815481529060010190602001808311610b4457829003601f168201915b5050505050905090565b6000610b7682612d6a565b610bb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bac90614c50565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610bfb82611376565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6390614cd0565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c8b612d62565b73ffffffffffffffffffffffffffffffffffffffff161480610cba5750610cb981610cb4612d62565b612854565b5b610cf9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf090614bb0565b60405180910390fd5b610d038383612dd6565b505050565b606481565b601260009054906101000a900460ff1681565b610d28612d62565b73ffffffffffffffffffffffffffffffffffffffff16610d46611fdb565b73ffffffffffffffffffffffffffffffffffffffff1614610d9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9390614c90565b60405180910390fd5b60001515601260009054906101000a900460ff16151514610dbc57600080fd5b6001601260006101000a81548160ff021916908315150217905550565b6000600880549050905090565b610dee612d62565b73ffffffffffffffffffffffffffffffffffffffff16610e0c611fdb565b73ffffffffffffffffffffffffffffffffffffffff1614610e62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5990614c90565b60405180910390fd5b60001515601260009054906101000a900460ff16151514610e8257600080fd5b80600f9080519060200190610e98929190613e2f565b5050565b610ead610ea7612d62565b82612e8f565b610eec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee390614cf0565b60405180910390fd5b610ef7838383612f6d565b505050565b6000610f0783611720565b8210610f48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3f90614a90565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610fa9612d62565b73ffffffffffffffffffffffffffffffffffffffff16610fc7611fdb565b73ffffffffffffffffffffffffffffffffffffffff161461101d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101490614c90565b60405180910390fd5b60011515601460009054906101000a900460ff161515141561104857601154811161104757600080fd5b5b6001811015801561105a575060038111155b61106357600080fd5b8060118190555050565b611075612d62565b73ffffffffffffffffffffffffffffffffffffffff16611093611fdb565b73ffffffffffffffffffffffffffffffffffffffff16146110e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e090614c90565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611134573d6000803e3d6000fd5b5050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146111ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c190614a50565b60405180910390fd5b6111d382612d6a565b15611213576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120a90614a70565b60405180910390fd5b61121d83836131c9565b81905092915050565b61122e612d62565b73ffffffffffffffffffffffffffffffffffffffff1661124c611fdb565b73ffffffffffffffffffffffffffffffffffffffff16146112a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129990614c90565b60405180910390fd5b6001600c60166101000a81548160ff021916908315150217905550565b6112da83838360405180602001604052806000815250612430565b505050565b60006112e9610dd9565b821061132a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132190614d10565b60405180910390fd5b60088281548110611364577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561141f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141690614bf0565b60405180910390fd5b80915050919050565b611430612d62565b73ffffffffffffffffffffffffffffffffffffffff1661144e611fdb565b73ffffffffffffffffffffffffffffffffffffffff16146114a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149b90614c90565b60405180910390fd5b6001600c60146101000a81548160ff021916908315150217905550565b6114c9612d62565b73ffffffffffffffffffffffffffffffffffffffff166114e7611fdb565b73ffffffffffffffffffffffffffffffffffffffff161461153d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153490614c90565b60405180910390fd5b60001515600c60169054906101000a900460ff16151514611593576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158a90614a30565b60405180910390fd5b600c60159054906101000a900460ff1615600c60156101000a81548160ff021916908315150217905550565b6115c7612d62565b73ffffffffffffffffffffffffffffffffffffffff166115e5611fdb565b73ffffffffffffffffffffffffffffffffffffffff161461163b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163290614c90565b60405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b601460009054906101000a900460ff1681565b600e805461169f90614f9b565b80601f01602080910402602001604051908101604052809291908181526020018280546116cb90614f9b565b80156117185780601f106116ed57610100808354040283529160200191611718565b820191906000526020600020905b8154815290600101906020018083116116fb57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611791576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178890614bd0565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6117e0612d62565b73ffffffffffffffffffffffffffffffffffffffff166117fe611fdb565b73ffffffffffffffffffffffffffffffffffffffff1614611854576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184b90614c90565b60405180910390fd5b61185e6000613397565b565b60008083838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505090506064815111156118b957600080fd5b60005b8151811015611eaf577f610000000000000000000000000000000000000000000000000000000000000082828151811061191f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916101580156119df57507f7a000000000000000000000000000000000000000000000000000000000000008282815181106119af577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191611155b80611b0057507f4100000000000000000000000000000000000000000000000000000000000000828281518110611a3f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191610158015611aff57507f5a00000000000000000000000000000000000000000000000000000000000000828281518110611acf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191611155b5b80611c2157507f3000000000000000000000000000000000000000000000000000000000000000828281518110611b60577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191610158015611c2057507f3900000000000000000000000000000000000000000000000000000000000000828281518110611bf0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191611155b5b80611cb057507f2d00000000000000000000000000000000000000000000000000000000000000828281518110611c81577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611d3f57507f2e00000000000000000000000000000000000000000000000000000000000000828281518110611d10577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611dce57507f5f00000000000000000000000000000000000000000000000000000000000000828281518110611d9f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611e5d57507f7e00000000000000000000000000000000000000000000000000000000000000828281518110611e2e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b611e9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9390614a10565b60405180910390fd5b8080611ea790614ffe565b9150506118bc565b50600191505092915050565b611ec3612d62565b73ffffffffffffffffffffffffffffffffffffffff16611ee1611fdb565b73ffffffffffffffffffffffffffffffffffffffff161480611f3c5750611f06612d62565b73ffffffffffffffffffffffffffffffffffffffff16611f24612c56565b73ffffffffffffffffffffffffffffffffffffffff16145b611f7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7290614b70565b60405180910390fd5b600015156013600083815260200190815260200160002060009054906101000a900460ff16151514611fac57600080fd5b60016013600083815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60115481565b60606001805461201a90614f9b565b80601f016020809104026020016040519081016040528092919081815260200182805461204690614f9b565b80156120935780601f1061206857610100808354040283529160200191612093565b820191906000526020600020905b81548152906001019060200180831161207657829003601f168201915b5050505050905090565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6120cb612d62565b73ffffffffffffffffffffffffffffffffffffffff166120e9611fdb565b73ffffffffffffffffffffffffffffffffffffffff161461213f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213690614c90565b60405180910390fd5b600c60149054906101000a900460ff161561218f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218690614a30565b60405180910390fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6121db612d62565b73ffffffffffffffffffffffffffffffffffffffff166121f9611fdb565b73ffffffffffffffffffffffffffffffffffffffff161461224f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224690614c90565b60405180910390fd5b80600e9080519060200190612265929190613e2f565b5050565b612271612d62565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156122df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122d690614b30565b60405180910390fd5b80600560006122ec612d62565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612399612d62565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516123de91906149d3565b60405180910390a35050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60136020528060005260406000206000915054906101000a900460ff1681565b61244161243b612d62565b83612e8f565b612480576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247790614cf0565b60405180910390fd5b61248c8484848461345d565b50505050565b600c60149054906101000a900460ff1681565b600c60159054906101000a900460ff1681565b60606124c382612d6a565b612502576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f990614c30565b60405180910390fd5b600061250c6134b9565b9050600061251861354b565b9050600060106000868152602001908152602001600020805461253a90614f9b565b80601f016020809104026020016040519081016040528092919081815260200182805461256690614f9b565b80156125b35780601f10612588576101008083540402835291602001916125b3565b820191906000526020600020905b81548152906001019060200180831161259657829003601f168201915b505050505090506001601154141561260d57826125cf866135dd565b600d60008881526020019081526020016000206040516020016125f493929190614930565b60405160208183030381529060405293505050506126e3565b600260115414156126965760008151141561266a578261262c866135dd565b600d600088815260200190815260200160002060405160200161265193929190614930565b60405160208183030381529060405293505050506126e3565b818160405160200161267d92919061490c565b60405160208183030381529060405293505050506126e3565b600360115414156126cd5781816040516020016126b492919061490c565b60405160208183030381529060405293505050506126e3565b6040518060200160405280600081525093505050505b919050565b6126f0612d62565b73ffffffffffffffffffffffffffffffffffffffff1661270e611fdb565b73ffffffffffffffffffffffffffffffffffffffff1614612764576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275b90614c90565b60405180910390fd5b60001515601460009054906101000a900460ff1615151461278457600080fd5b6001601460006101000a81548160ff021916908315150217905550565b600d60205280600052604060002060009150905080546127c090614f9b565b80601f01602080910402602001604051908101604052809291908181526020018280546127ec90614f9b565b80156128395780601f1061280e57610100808354040283529160200191612839565b820191906000526020600020905b81548152906001019060200180831161281c57829003601f168201915b505050505081565b600c60169054906101000a900460ff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6010602052806000526040600020600091509050805461290790614f9b565b80601f016020809104026020016040519081016040528092919081815260200182805461293390614f9b565b80156129805780601f1061295557610100808354040283529160200191612980565b820191906000526020600020905b81548152906001019060200180831161296357829003601f168201915b505050505081565b600f805461299590614f9b565b80601f01602080910402602001604051908101604052809291908181526020018280546129c190614f9b565b8015612a0e5780601f106129e357610100808354040283529160200191612a0e565b820191906000526020600020905b8154815290600101906020018083116129f157829003601f168201915b505050505081565b612a1e612d62565b73ffffffffffffffffffffffffffffffffffffffff16612a3c611fdb565b73ffffffffffffffffffffffffffffffffffffffff1614612a92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a8990614c90565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612b02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612af990614ad0565b60405180910390fd5b612b0b81613397565b50565b612b1783612d6a565b612b56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b4d90614b50565b60405180910390fd5b612b5f83611376565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612bcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bc390614a50565b60405180910390fd5b600c60159054906101000a900460ff16612c1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c1290614c70565b60405180910390fd5b612c258282611860565b612c2e57600080fd5b8181600d60008681526020019081526020016000209190612c50929190613eb5565b50505050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612d4b57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612d5b5750612d5a8261378a565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612e4983611376565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612e9a82612d6a565b612ed9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ed090614b90565b60405180910390fd5b6000612ee483611376565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612f5357508373ffffffffffffffffffffffffffffffffffffffff16612f3b84610b6b565b73ffffffffffffffffffffffffffffffffffffffff16145b80612f645750612f638185612854565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612f8d82611376565b73ffffffffffffffffffffffffffffffffffffffff1614612fe3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fda90614cb0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613053576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161304a90614b10565b60405180910390fd5b61305e8383836137f4565b613069600082612dd6565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546130b99190614eb1565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546131109190614e2a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613239576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161323090614c10565b60405180910390fd5b61324281612d6a565b15613282576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161327990614af0565b60405180910390fd5b61328e600083836137f4565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546132de9190614e2a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b613468848484612f6d565b61347484848484613908565b6134b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134aa90614ab0565b60405180910390fd5b50505050565b6060600e80546134c890614f9b565b80601f01602080910402602001604051908101604052809291908181526020018280546134f490614f9b565b80156135415780601f1061351657610100808354040283529160200191613541565b820191906000526020600020905b81548152906001019060200180831161352457829003601f168201915b5050505050905090565b6060600f805461355a90614f9b565b80601f016020809104026020016040519081016040528092919081815260200182805461358690614f9b565b80156135d35780601f106135a8576101008083540402835291602001916135d3565b820191906000526020600020905b8154815290600101906020018083116135b657829003601f168201915b5050505050905090565b60606000821415613625576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613785565b600082905060005b6000821461365757808061364090614ffe565b915050600a826136509190614e80565b915061362d565b60008167ffffffffffffffff811115613699577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156136cb5781602001600182028036833780820191505090505b5090505b6000851461377e576001826136e49190614eb1565b9150600a856136f39190615047565b60306136ff9190614e2a565b60f81b81838151811061373b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856137779190614e80565b94506136cf565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6137ff838383613a9f565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156138425761383d81613aa4565b613881565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146138805761387f8382613aed565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156138c4576138bf81613c5a565b613903565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613902576139018282613d9d565b5b5b505050565b60006139298473ffffffffffffffffffffffffffffffffffffffff16613e1c565b15613a92578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613952612d62565b8786866040518563ffffffff1660e01b81526004016139749493929190614987565b602060405180830381600087803b15801561398e57600080fd5b505af19250505080156139bf57506040513d601f19601f820116820180604052508101906139bc91906142ab565b60015b613a42573d80600081146139ef576040519150601f19603f3d011682016040523d82523d6000602084013e6139f4565b606091505b50600081511415613a3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a3190614ab0565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613a97565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613afa84611720565b613b049190614eb1565b9050600060076000848152602001908152602001600020549050818114613be9576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613c6e9190614eb1565b9050600060096000848152602001908152602001600020549050600060088381548110613cc4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110613d0c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613d81577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000613da883611720565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b828054613e3b90614f9b565b90600052602060002090601f016020900481019282613e5d5760008555613ea4565b82601f10613e7657805160ff1916838001178555613ea4565b82800160010185558215613ea4579182015b82811115613ea3578251825591602001919060010190613e88565b5b509050613eb19190613f3b565b5090565b828054613ec190614f9b565b90600052602060002090601f016020900481019282613ee35760008555613f2a565b82601f10613efc57803560ff1916838001178555613f2a565b82800160010185558215613f2a579182015b82811115613f29578235825591602001919060010190613f0e565b5b509050613f379190613f3b565b5090565b5b80821115613f54576000816000905550600101613f3c565b5090565b6000613f6b613f6684614d70565b614d4b565b905082815260208101848484011115613f8357600080fd5b613f8e848285614f59565b509392505050565b6000613fa9613fa484614da1565b614d4b565b905082815260208101848484011115613fc157600080fd5b613fcc848285614f59565b509392505050565b600081359050613fe3816157a9565b92915050565b600081359050613ff8816157c0565b92915050565b60008135905061400d816157d7565b92915050565b600081519050614022816157d7565b92915050565b600082601f83011261403957600080fd5b8135614049848260208601613f58565b91505092915050565b60008083601f84011261406457600080fd5b8235905067ffffffffffffffff81111561407d57600080fd5b60208301915083600182028301111561409557600080fd5b9250929050565b600082601f8301126140ad57600080fd5b81356140bd848260208601613f96565b91505092915050565b6000813590506140d5816157ee565b92915050565b6000602082840312156140ed57600080fd5b60006140fb84828501613fd4565b91505092915050565b6000806040838503121561411757600080fd5b600061412585828601613fd4565b925050602061413685828601613fd4565b9150509250929050565b60008060006060848603121561415557600080fd5b600061416386828701613fd4565b935050602061417486828701613fd4565b9250506040614185868287016140c6565b9150509250925092565b600080600080608085870312156141a557600080fd5b60006141b387828801613fd4565b94505060206141c487828801613fd4565b93505060406141d5878288016140c6565b925050606085013567ffffffffffffffff8111156141f257600080fd5b6141fe87828801614028565b91505092959194509250565b6000806040838503121561421d57600080fd5b600061422b85828601613fd4565b925050602061423c85828601613fe9565b9150509250929050565b6000806040838503121561425957600080fd5b600061426785828601613fd4565b9250506020614278858286016140c6565b9150509250929050565b60006020828403121561429457600080fd5b60006142a284828501613ffe565b91505092915050565b6000602082840312156142bd57600080fd5b60006142cb84828501614013565b91505092915050565b600080602083850312156142e757600080fd5b600083013567ffffffffffffffff81111561430157600080fd5b61430d85828601614052565b92509250509250929050565b60006020828403121561432b57600080fd5b600082013567ffffffffffffffff81111561434557600080fd5b6143518482850161409c565b91505092915050565b60006020828403121561436c57600080fd5b600061437a848285016140c6565b91505092915050565b60008060006040848603121561439857600080fd5b60006143a6868287016140c6565b935050602084013567ffffffffffffffff8111156143c357600080fd5b6143cf86828701614052565b92509250509250925092565b600080604083850312156143ee57600080fd5b60006143fc858286016140c6565b925050602083013567ffffffffffffffff81111561441957600080fd5b6144258582860161409c565b9150509250929050565b61443881614ee5565b82525050565b61444781614ef7565b82525050565b600061445882614de7565b6144628185614dfd565b9350614472818560208601614f68565b61447b81615134565b840191505092915050565b600061449182614df2565b61449b8185614e0e565b93506144ab818560208601614f68565b6144b481615134565b840191505092915050565b60006144ca82614df2565b6144d48185614e1f565b93506144e4818560208601614f68565b80840191505092915050565b600081546144fd81614f9b565b6145078186614e1f565b94506001821660008114614522576001811461453357614566565b60ff19831686528186019350614566565b61453c85614dd2565b60005b8381101561455e5781548189015260018201915060208101905061453f565b838801955050505b50505092915050565b600061457c600c83614e0e565b915061458782615145565b602082019050919050565b600061459f600683614e0e565b91506145aa8261516e565b602082019050919050565b60006145c2600c83614e0e565b91506145cd82615197565b602082019050919050565b60006145e5601483614e0e565b91506145f0826151c0565b602082019050919050565b6000614608602b83614e0e565b9150614613826151e9565b604082019050919050565b600061462b603283614e0e565b915061463682615238565b604082019050919050565b600061464e602683614e0e565b915061465982615287565b604082019050919050565b6000614671601c83614e0e565b915061467c826152d6565b602082019050919050565b6000614694602483614e0e565b915061469f826152ff565b604082019050919050565b60006146b7601983614e0e565b91506146c28261534e565b602082019050919050565b60006146da600d83614e0e565b91506146e582615377565b602082019050919050565b60006146fd603083614e0e565b9150614708826153a0565b604082019050919050565b6000614720602c83614e0e565b915061472b826153ef565b604082019050919050565b6000614743603883614e0e565b915061474e8261543e565b604082019050919050565b6000614766602a83614e0e565b91506147718261548d565b604082019050919050565b6000614789602983614e0e565b9150614794826154dc565b604082019050919050565b60006147ac602083614e0e565b91506147b78261552b565b602082019050919050565b60006147cf603183614e0e565b91506147da82615554565b604082019050919050565b60006147f2602c83614e0e565b91506147fd826155a3565b604082019050919050565b6000614815601983614e0e565b9150614820826155f2565b602082019050919050565b6000614838602083614e0e565b91506148438261561b565b602082019050919050565b600061485b602983614e0e565b915061486682615644565b604082019050919050565b600061487e602183614e0e565b915061488982615693565b604082019050919050565b60006148a1603183614e0e565b91506148ac826156e2565b604082019050919050565b60006148c4602c83614e0e565b91506148cf82615731565b604082019050919050565b60006148e7600183614e1f565b91506148f282615780565b600182019050919050565b61490681614f4f565b82525050565b600061491882856144bf565b915061492482846144bf565b91508190509392505050565b600061493c82866144bf565b915061494882856144bf565b9150614953826148da565b915061495f82846144f0565b9150819050949350505050565b6000602082019050614981600083018461442f565b92915050565b600060808201905061499c600083018761442f565b6149a9602083018661442f565b6149b660408301856148fd565b81810360608301526149c8818461444d565b905095945050505050565b60006020820190506149e8600083018461443e565b92915050565b60006020820190508181036000830152614a088184614486565b905092915050565b60006020820190508181036000830152614a298161456f565b9050919050565b60006020820190508181036000830152614a4981614592565b9050919050565b60006020820190508181036000830152614a69816145b5565b9050919050565b60006020820190508181036000830152614a89816145d8565b9050919050565b60006020820190508181036000830152614aa9816145fb565b9050919050565b60006020820190508181036000830152614ac98161461e565b9050919050565b60006020820190508181036000830152614ae981614641565b9050919050565b60006020820190508181036000830152614b0981614664565b9050919050565b60006020820190508181036000830152614b2981614687565b9050919050565b60006020820190508181036000830152614b49816146aa565b9050919050565b60006020820190508181036000830152614b69816146cd565b9050919050565b60006020820190508181036000830152614b89816146f0565b9050919050565b60006020820190508181036000830152614ba981614713565b9050919050565b60006020820190508181036000830152614bc981614736565b9050919050565b60006020820190508181036000830152614be981614759565b9050919050565b60006020820190508181036000830152614c098161477c565b9050919050565b60006020820190508181036000830152614c298161479f565b9050919050565b60006020820190508181036000830152614c49816147c2565b9050919050565b60006020820190508181036000830152614c69816147e5565b9050919050565b60006020820190508181036000830152614c8981614808565b9050919050565b60006020820190508181036000830152614ca98161482b565b9050919050565b60006020820190508181036000830152614cc98161484e565b9050919050565b60006020820190508181036000830152614ce981614871565b9050919050565b60006020820190508181036000830152614d0981614894565b9050919050565b60006020820190508181036000830152614d29816148b7565b9050919050565b6000602082019050614d4560008301846148fd565b92915050565b6000614d55614d66565b9050614d618282614fcd565b919050565b6000604051905090565b600067ffffffffffffffff821115614d8b57614d8a615105565b5b614d9482615134565b9050602081019050919050565b600067ffffffffffffffff821115614dbc57614dbb615105565b5b614dc582615134565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614e3582614f4f565b9150614e4083614f4f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614e7557614e74615078565b5b828201905092915050565b6000614e8b82614f4f565b9150614e9683614f4f565b925082614ea657614ea56150a7565b5b828204905092915050565b6000614ebc82614f4f565b9150614ec783614f4f565b925082821015614eda57614ed9615078565b5b828203905092915050565b6000614ef082614f2f565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614f86578082015181840152602081019050614f6b565b83811115614f95576000848401525b50505050565b60006002820490506001821680614fb357607f821691505b60208210811415614fc757614fc66150d6565b5b50919050565b614fd682615134565b810181811067ffffffffffffffff82111715614ff557614ff4615105565b5b80604052505050565b600061500982614f4f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561503c5761503b615078565b5b600182019050919050565b600061505282614f4f565b915061505d83614f4f565b92508261506d5761506c6150a7565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f696e76616c696420636861720000000000000000000000000000000000000000600082015250565b7f4c6f636b65640000000000000000000000000000000000000000000000000000600082015250565b7f556e617574686f72697a65640000000000000000000000000000000000000000600082015250565b7f546f6b656e20616c7265616479206d696e746564000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f556e6b6e6f776e20746f6b656e00000000000000000000000000000000000000600082015250565b7f43616c6c6572206973206e6f7420746865206f776e6572206f7220746865206160008201527f7070726f76656420636f6e747261637400000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f53657474696e67206e616d65732069732064697361626c656400000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b6157b281614ee5565b81146157bd57600080fd5b50565b6157c981614ef7565b81146157d457600080fd5b50565b6157e081614f03565b81146157eb57600080fd5b50565b6157f781614f4f565b811461580257600080fd5b5056fea26469706673582212201785b017aecd84d0333462c5e63df00480e7145b1e333950ec9e90d91de73bb364736f6c63430008040033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000848494748424f524e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000548424f524e000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : __name (string): HIGHBORN
Arg [1] : __symbol (string): HBORN
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [3] : 48494748424f524e000000000000000000000000000000000000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [5] : 48424f524e000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
236:6720:15:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;937:237:4;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4670:344:15;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2419:100:3;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3879:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3416:397;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1625:42:15;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3244:30;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4115:122;;;:::i;:::-;;1590:113:4;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3964:139:15;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4769:305:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1258:256:4;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4249:269:15;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6808:145;;;:::i;:::-;;6436:275;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1850:93;;;:::i;:::-;;5145:151:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1780:233:4;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2113:239:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1363:97:15;;;:::i;:::-;;1680:158;;;:::i;:::-;;861:113;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3337:32;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2848:62;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1843:208:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1650:94:12;;;:::i;:::-;;1955:490:15;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5026:200;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;999:87:12;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3204:33:15;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2588:104:3;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;510:45:15;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1186:165;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3860:92;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4172:295:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;562:44:15;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3281:49;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5367:285:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;613:41:15;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1500:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5301:1093;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4530:128;;;:::i;:::-;;1570:48;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1533:30;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4538:164:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2989:52:15;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2917:65;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1899:192:12;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2457:349:15;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;740:109;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;937:237:4;1039:4;1078:35;1063:50;;;:11;:50;;;;:103;;;;1130:36;1154:11;1130:23;:36::i;:::-;1063:103;1056:110;;937:237;;;:::o;4670:344:15:-;1055:12;:10;:12::i;:::-;1044:23;;:7;:5;:7::i;:::-;:23;;;:61;;;;1093:12;:10;:12::i;:::-;1071:34;;:18;:16;:18::i;:::-;:34;;;1044:61;1036:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;4799:4:::1;4785:18;;:10;;;;;;;;;;;:18;;;4781:108;;;4875:1;4832:17;:31;4850:12;4832:31;;;;;;;;;;;4826:45;;;;;:::i;:::-;;;:50;4818:59;;;::::0;::::1;;4781:108;4941:5;4907:39;;:16;:30;4924:12;4907:30;;;;;;;;;;;;;;;;;;;;;:39;;;4899:48;;;::::0;::::1;;5002:4;4968:17;:31;4986:12;4968:31;;;;;;;;;;;:38;;;;;;;;;;;;:::i;:::-;;4670:344:::0;;:::o;2419:100:3:-;2473:13;2506:5;2499:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2419:100;:::o;3879:221::-;3955:7;3983:16;3991:7;3983;:16::i;:::-;3975:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4068:15;:24;4084:7;4068:24;;;;;;;;;;;;;;;;;;;;;4061:31;;3879:221;;;:::o;3416:397::-;3497:13;3513:23;3528:7;3513:14;:23::i;:::-;3497:39;;3561:5;3555:11;;:2;:11;;;;3547:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;3641:5;3625:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;3650:37;3667:5;3674:12;:10;:12::i;:::-;3650:16;:37::i;:::-;3625:62;3617:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;3784:21;3793:2;3797:7;3784:8;:21::i;:::-;3416:397;;;:::o;1625:42:15:-;1664:3;1625:42;:::o;3244:30::-;;;;;;;;;;;;;:::o;4115:122::-;1230:12:12;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4195:5:15::1;4181:19;;:10;;;;;;;;;;;:19;;;4173:28;;;::::0;::::1;;4225:4;4212:10;;:17;;;;;;;;;;;;;;;;;;4115:122::o:0;1590:113:4:-;1651:7;1678:10;:17;;;;1671:24;;1590:113;:::o;3964:139:15:-;1230:12:12;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4060:5:15::1;4046:19;;:10;;;;;;;;;;;:19;;;4038:28;;;::::0;::::1;;4091:4;4077:11;:18;;;;;;;;;;;;:::i;:::-;;3964:139:::0;:::o;4769:305:3:-;4930:41;4949:12;:10;:12::i;:::-;4963:7;4930:18;:41::i;:::-;4922:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5038:28;5048:4;5054:2;5058:7;5038:9;:28::i;:::-;4769:305;;;:::o;1258:256:4:-;1355:7;1391:23;1408:5;1391:16;:23::i;:::-;1383:5;:31;1375:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;1480:12;:19;1493:5;1480:19;;;;;;;;;;;;;;;:26;1500:5;1480:26;;;;;;;;;;;;1473:33;;1258:256;;;;:::o;4249:269:15:-;1230:12:12;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4343:4:15::1;4327:20;;:12;;;;;;;;;;;:20;;;4323:85;;;4381:14;;4371:7;:24;4362:34;;;::::0;::::1;;4323:85;4447:1;4436:7;:12;;:28;;;;;4463:1;4452:7;:12;;4436:28;4428:37;;;::::0;::::1;;4503:7;4486:14;:24;;;;4249:269:::0;:::o;6808:145::-;1230:12:12;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6858:15:15::1;6876:21;6858:39;;6916:10;6908:28;;:37;6937:7;6908:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;1290:1:12;6808:145:15:o:0;6436:275::-;6501:7;6541:16;;;;;;;;;;;6527:30;;:10;:30;;;6519:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;6592:18;6600:9;6592:7;:18::i;:::-;6591:19;6583:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;6646:24;6652:6;6660:9;6646:5;:24::i;:::-;6694:9;6687:16;;6436:275;;;;:::o;1850:93::-;1230:12:12;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1931:4:15::1;1910:18;;:25;;;;;;;;;;;;;;;;;;1850:93::o:0;5145:151:3:-;5249:39;5266:4;5272:2;5276:7;5249:39;;;;;;;;;;;;:16;:39::i;:::-;5145:151;;;:::o;1780:233:4:-;1855:7;1891:30;:28;:30::i;:::-;1883:5;:38;1875:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;1988:10;1999:5;1988:17;;;;;;;;;;;;;;;;;;;;;;;;1981:24;;1780:233;;;:::o;2113:239:3:-;2185:7;2205:13;2221:7;:16;2229:7;2221:16;;;;;;;;;;;;;;;;;;;;;2205:32;;2273:1;2256:19;;:5;:19;;;;2248:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2339:5;2332:12;;;2113:239;;;:::o;1363:97:15:-;1230:12:12;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1448:4:15::1;1424:21;;:28;;;;;;;;;;;;;;;;;;1363:97::o:0;1680:158::-;1230:12:12;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1773:5:15::1;1751:27;;:18;;;;;;;;;;;:27;;;1743:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;1816:14;;;;;;;;;;;1815:15;1798:14;;:32;;;;;;;;;;;;;;;;;;1680:158::o:0;861:113::-;1230:12:12;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;957:9:15::1;937:17;;:29;;;;;;;;;;;;;;;;;;861:113:::0;:::o;3337:32::-;;;;;;;;;;;;;:::o;2848:62::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1843:208:3:-;1915:7;1960:1;1943:19;;:5;:19;;;;1935:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;2027:9;:16;2037:5;2027:16;;;;;;;;;;;;;;;;2020:23;;1843:208;;;:::o;1650:94:12:-;1230:12;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1715:21:::1;1733:1;1715:9;:21::i;:::-;1650:94::o:0;1955:490:15:-;2021:4;2036:22;2067:4;;2036:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1664:3;2089:9;:16;:32;;2081:41;;;;;;2136:9;2131:287;2155:9;:16;2151:1;:20;2131:287;;;2198:17;:9;2208:1;2198:12;;;;;;;;;;;;;;;;;;;;;;;;:17;;;;;:36;;;;;2217:17;:9;2227:1;2217:12;;;;;;;;;;;;;;;;;;;;;;;;:17;;;;;2198:36;2197:78;;;;2238:17;:9;2248:1;2238:12;;;;;;;;;;;;;;;;;;;;;;;;:17;;;;;:36;;;;;2257:17;:9;2267:1;2257:12;;;;;;;;;;;;;;;;;;;;;;;;:17;;;;;2238:36;2197:78;:118;;;;2278:17;:9;2288:1;2278:12;;;;;;;;;;;;;;;;;;;;;;;;:17;;;;;:36;;;;;2297:17;:9;2307:1;2297:12;;;;;;;;;;;;;;;;;;;;;;;;:17;;;;;2278:36;2197:118;:137;;;;2317:17;:9;2327:1;2317:12;;;;;;;;;;;;;;;;;;;;;;;;:17;;;;2197:137;:156;;;;2336:17;:9;2346:1;2336:12;;;;;;;;;;;;;;;;;;;;;;;;:17;;;;2197:156;:175;;;;2355:17;:9;2365:1;2355:12;;;;;;;;;;;;;;;;;;;;;;;;:17;;;;2197:175;:194;;;;2374:17;:9;2384:1;2374:12;;;;;;;;;;;;;;;;;;;;;;;;:17;;;;2197:194;2189:219;;;;;;;;;;;;:::i;:::-;;;;;;;;;2173:3;;;;;:::i;:::-;;;;2131:287;;;;2433:4;2426:11;;;1955:490;;;;:::o;5026:200::-;1055:12;:10;:12::i;:::-;1044:23;;:7;:5;:7::i;:::-;:23;;;:61;;;;1093:12;:10;:12::i;:::-;1071:34;;:18;:16;:18::i;:::-;:34;;;1044:61;1036:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;5164:5:::1;5130:39;;:16;:30;5147:12;5130:30;;;;;;;;;;;;;;;;;;;;;:39;;;5122:48;;;::::0;::::1;;5214:4;5181:16;:30;5198:12;5181:30;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;5026:200:::0;:::o;999:87:12:-;1045:7;1072:6;;;;;;;;;;;1065:13;;999:87;:::o;3204:33:15:-;;;;:::o;2588:104:3:-;2644:13;2677:7;2670:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2588:104;:::o;510:45:15:-;;;;;;;;;;;;;:::o;1186:165::-;1230:12:12;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1272:21:15::1;;;;;;;;;;;1271:22;1263:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;1334:9;1315:16;;:28;;;;;;;;;;;;;;;;;;1186:165:::0;:::o;3860:92::-;1230:12:12;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3940:4:15::1;3930:7;:14;;;;;;;;;;;;:::i;:::-;;3860:92:::0;:::o;4172:295:3:-;4287:12;:10;:12::i;:::-;4275:24;;:8;:24;;;;4267:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;4387:8;4342:18;:32;4361:12;:10;:12::i;:::-;4342:32;;;;;;;;;;;;;;;:42;4375:8;4342:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;4440:8;4411:48;;4426:12;:10;:12::i;:::-;4411:48;;;4450:8;4411:48;;;;;;:::i;:::-;;;;;;;;4172:295;;:::o;562:44:15:-;;;;;;;;;;;;;:::o;3281:49::-;;;;;;;;;;;;;;;;;;;;;;:::o;5367:285:3:-;5499:41;5518:12;:10;:12::i;:::-;5532:7;5499:18;:41::i;:::-;5491:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5605:39;5619:4;5625:2;5629:7;5638:5;5605:13;:39::i;:::-;5367:285;;;;:::o;613:41:15:-;;;;;;;;;;;;;:::o;1500:26::-;;;;;;;;;;;;;:::o;5301:1093::-;5374:13;5408:16;5416:7;5408;:16::i;:::-;5400:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;5499:18;5520:10;:8;:10::i;:::-;5499:31;;5541:22;5566:14;:12;:14::i;:::-;5541:39;;5601:22;5626:17;:26;5644:7;5626:26;;;;;;;;;;;5601:51;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5695:1;5677:14;;:19;5673:684;;;5780:4;5786:18;:7;:16;:18::i;:::-;5811:13;:22;5825:7;5811:22;;;;;;;;;;;5763:71;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;5749:86;;;;;;;5673:684;5875:1;5857:14;;:19;5853:504;;;5989:1;5969:8;5963:22;:27;5959:246;;;6042:4;6048:18;:7;:16;:18::i;:::-;6073:13;:22;6087:7;6073:22;;;;;;;;;;;6025:71;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;6011:86;;;;;;;5959:246;6169:8;6179;6152:36;;;;;;;;;:::i;:::-;;;;;;;;;;;;;6138:51;;;;;;;5853:504;6244:1;6226:14;;:19;6222:135;;;6325:8;6335;6308:36;;;;;;;;;:::i;:::-;;;;;;;;;;;;;6294:51;;;;;;;6222:135;6377:9;;;;;;;;;;;;;;;;;5301:1093;;;;:::o;4530:128::-;1230:12:12;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4614:5:15::1;4598:21;;:12;;;;;;;;;;;:21;;;4590:30;;;::::0;::::1;;4646:4;4631:12;;:19;;;;;;;;;;;;;;;;;;4530:128::o:0;1570:48::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1533:30::-;;;;;;;;;;;;;:::o;4538:164:3:-;4635:4;4659:18;:25;4678:5;4659:25;;;;;;;;;;;;;;;:35;4685:8;4659:35;;;;;;;;;;;;;;;;;;;;;;;;;4652:42;;4538:164;;;;:::o;2989:52:15:-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2917:65::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1899:192:12:-;1230:12;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2008:1:::1;1988:22;;:8;:22;;;;1980:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2064:19;2074:8;2064:9;:19::i;:::-;1899:192:::0;:::o;2457:349:15:-;2547:16;2555:7;2547;:16::i;:::-;2539:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;2612:16;2620:7;2612;:16::i;:::-;2598:30;;:10;:30;;;2590:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;2662:14;;;;;;;;;;;2654:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;2731:20;2746:4;;2731:14;:20::i;:::-;2723:29;;;;;;2794:4;;2769:13;:22;2783:7;2769:22;;;;;;;;;;;:29;;;;;;;:::i;:::-;;2457:349;;;:::o;740:109::-;797:7;824:17;;;;;;;;;;;817:24;;740:109;:::o;1487:292:3:-;1589:4;1628:25;1613:40;;;:11;:40;;;;:105;;;;1685:33;1670:48;;;:11;:48;;;;1613:105;:158;;;;1735:36;1759:11;1735:23;:36::i;:::-;1613:158;1606:165;;1487:292;;;:::o;601:98:1:-;654:7;681:10;674:17;;601:98;:::o;7119:127:3:-;7184:4;7236:1;7208:30;;:7;:16;7216:7;7208:16;;;;;;;;;;;;;;;;;;;;;:30;;;;7201:37;;7119:127;;;:::o;10996:174::-;11098:2;11071:15;:24;11087:7;11071:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;11154:7;11150:2;11116:46;;11125:23;11140:7;11125:14;:23::i;:::-;11116:46;;;;;;;;;;;;10996:174;;:::o;7413:348::-;7506:4;7531:16;7539:7;7531;:16::i;:::-;7523:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7607:13;7623:23;7638:7;7623:14;:23::i;:::-;7607:39;;7676:5;7665:16;;:7;:16;;;:51;;;;7709:7;7685:31;;:20;7697:7;7685:11;:20::i;:::-;:31;;;7665:51;:87;;;;7720:32;7737:5;7744:7;7720:16;:32::i;:::-;7665:87;7657:96;;;7413:348;;;;:::o;10334:544::-;10459:4;10432:31;;:23;10447:7;10432:14;:23::i;:::-;:31;;;10424:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;10542:1;10528:16;;:2;:16;;;;10520:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;10598:39;10619:4;10625:2;10629:7;10598:20;:39::i;:::-;10702:29;10719:1;10723:7;10702:8;:29::i;:::-;10763:1;10744:9;:15;10754:4;10744:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;10792:1;10775:9;:13;10785:2;10775:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;10823:2;10804:7;:16;10812:7;10804:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;10862:7;10858:2;10843:27;;10852:4;10843:27;;;;;;;;;;;;10334:544;;;:::o;9026:382::-;9120:1;9106:16;;:2;:16;;;;9098:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;9179:16;9187:7;9179;:16::i;:::-;9178:17;9170:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;9241:45;9270:1;9274:2;9278:7;9241:20;:45::i;:::-;9316:1;9299:9;:13;9309:2;9299:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;9347:2;9328:7;:16;9336:7;9328:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;9392:7;9388:2;9367:33;;9384:1;9367:33;;;;;;;;;;;;9026:382;;:::o;2099:173:12:-;2155:16;2174:6;;;;;;;;;;;2155:25;;2200:8;2191:6;;:17;;;;;;;;;;;;;;;;;;2255:8;2224:40;;2245:8;2224:40;;;;;;;;;;;;2099:173;;:::o;6534:272:3:-;6648:28;6658:4;6664:2;6668:7;6648:9;:28::i;:::-;6695:48;6718:4;6724:2;6728:7;6737:5;6695:22;:48::i;:::-;6687:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;6534:272;;;;:::o;3637:100:15:-;3689:13;3722:7;3715:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3637:100;:::o;3749:99::-;3796:13;3829:11;3822:18;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3749:99;:::o;284:723:14:-;340:13;570:1;561:5;:10;557:53;;;588:10;;;;;;;;;;;;;;;;;;;;;557:53;620:12;635:5;620:20;;651:14;676:78;691:1;683:4;:9;676:78;;709:8;;;;;:::i;:::-;;;;740:2;732:10;;;;;:::i;:::-;;;676:78;;;764:19;796:6;786:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;764:39;;814:154;830:1;821:5;:10;814:154;;858:1;848:11;;;;;:::i;:::-;;;925:2;917:5;:10;;;;:::i;:::-;904:2;:24;;;;:::i;:::-;891:39;;874:6;881;874:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;954:2;945:11;;;;;:::i;:::-;;;814:154;;;992:6;978:21;;;;;284:723;;;;:::o;787:157:2:-;872:4;911:25;896:40;;;:11;:40;;;;889:47;;787:157;;;:::o;2626:555:4:-;2736:45;2763:4;2769:2;2773:7;2736:26;:45::i;:::-;2814:1;2798:18;;:4;:18;;;2794:187;;;2833:40;2865:7;2833:31;:40::i;:::-;2794:187;;;2903:2;2895:10;;:4;:10;;;2891:90;;2922:47;2955:4;2961:7;2922:32;:47::i;:::-;2891:90;2794:187;3009:1;2995:16;;:2;:16;;;2991:183;;;3028:45;3065:7;3028:36;:45::i;:::-;2991:183;;;3101:4;3095:10;;:2;:10;;;3091:83;;3122:40;3150:2;3154:7;3122:27;:40::i;:::-;3091:83;2991:183;2626:555;;;:::o;11735:843:3:-;11856:4;11882:15;:2;:13;;;:15::i;:::-;11878:693;;;11934:2;11918:36;;;11955:12;:10;:12::i;:::-;11969:4;11975:7;11984:5;11918:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;11914:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12181:1;12164:6;:13;:18;12160:341;;;12207:60;;;;;;;;;;:::i;:::-;;;;;;;;12160:341;12451:6;12445:13;12436:6;12432:2;12428:15;12421:38;11914:602;12051:45;;;12041:55;;;:6;:55;;;;12034:62;;;;;11878:693;12555:4;12548:11;;11735:843;;;;;;;:::o;13191:93::-;;;;:::o;3904:164:4:-;4008:10;:17;;;;3981:15;:24;3997:7;3981:24;;;;;;;;;;;:44;;;;4036:10;4052:7;4036:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3904:164;:::o;4695:988::-;4961:22;5011:1;4986:22;5003:4;4986:16;:22::i;:::-;:26;;;;:::i;:::-;4961:51;;5023:18;5044:17;:26;5062:7;5044:26;;;;;;;;;;;;5023:47;;5191:14;5177:10;:28;5173:328;;5222:19;5244:12;:18;5257:4;5244:18;;;;;;;;;;;;;;;:34;5263:14;5244:34;;;;;;;;;;;;5222:56;;5328:11;5295:12;:18;5308:4;5295:18;;;;;;;;;;;;;;;:30;5314:10;5295:30;;;;;;;;;;;:44;;;;5445:10;5412:17;:30;5430:11;5412:30;;;;;;;;;;;:43;;;;5173:328;;5597:17;:26;5615:7;5597:26;;;;;;;;;;;5590:33;;;5641:12;:18;5654:4;5641:18;;;;;;;;;;;;;;;:34;5660:14;5641:34;;;;;;;;;;;5634:41;;;4695:988;;;;:::o;5978:1079::-;6231:22;6276:1;6256:10;:17;;;;:21;;;;:::i;:::-;6231:46;;6288:18;6309:15;:24;6325:7;6309:24;;;;;;;;;;;;6288:45;;6660:19;6682:10;6693:14;6682:26;;;;;;;;;;;;;;;;;;;;;;;;6660:48;;6746:11;6721:10;6732;6721:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;6857:10;6826:15;:28;6842:11;6826:28;;;;;;;;;;;:41;;;;6998:15;:24;7014:7;6998:24;;;;;;;;;;;6991:31;;;7033:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5978:1079;;;;:::o;3482:221::-;3567:14;3584:20;3601:2;3584:16;:20::i;:::-;3567:37;;3642:7;3615:12;:16;3628:2;3615:16;;;;;;;;;;;;;;;:24;3632:6;3615:24;;;;;;;;;;;:34;;;;3689:6;3660:17;:26;3678:7;3660:26;;;;;;;;;;;:35;;;;3482:221;;;:::o;743:422:0:-;803:4;1011:12;1122:7;1110:20;1102:28;;1156:1;1149:4;:8;1142:15;;;743:422;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:16:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:345::-;434:5;459:66;475:49;517:6;475:49;:::i;:::-;459:66;:::i;:::-;450:75;;548:6;541:5;534:21;586:4;579:5;575:16;624:3;615:6;610:3;606:16;603:25;600:2;;;641:1;638;631:12;600:2;654:41;688:6;683:3;678;654:41;:::i;:::-;440:261;;;;;;:::o;707:139::-;753:5;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;852:133::-;895:5;933:6;920:20;911:29;;949:30;973:5;949:30;:::i;:::-;901:84;;;;:::o;991:137::-;1036:5;1074:6;1061:20;1052:29;;1090:32;1116:5;1090:32;:::i;:::-;1042:86;;;;:::o;1134:141::-;1190:5;1221:6;1215:13;1206:22;;1237:32;1263:5;1237:32;:::i;:::-;1196:79;;;;:::o;1294:271::-;1349:5;1398:3;1391:4;1383:6;1379:17;1375:27;1365:2;;1416:1;1413;1406:12;1365:2;1456:6;1443:20;1481:78;1555:3;1547:6;1540:4;1532:6;1528:17;1481:78;:::i;:::-;1472:87;;1355:210;;;;;:::o;1585:352::-;1643:8;1653:6;1703:3;1696:4;1688:6;1684:17;1680:27;1670:2;;1721:1;1718;1711:12;1670:2;1757:6;1744:20;1734:30;;1787:18;1779:6;1776:30;1773:2;;;1819:1;1816;1809:12;1773:2;1856:4;1848:6;1844:17;1832:29;;1910:3;1902:4;1894:6;1890:17;1880:8;1876:32;1873:41;1870:2;;;1927:1;1924;1917:12;1870:2;1660:277;;;;;:::o;1957:273::-;2013:5;2062:3;2055:4;2047:6;2043:17;2039:27;2029:2;;2080:1;2077;2070:12;2029:2;2120:6;2107:20;2145:79;2220:3;2212:6;2205:4;2197:6;2193:17;2145:79;:::i;:::-;2136:88;;2019:211;;;;;:::o;2236:139::-;2282:5;2320:6;2307:20;2298:29;;2336:33;2363:5;2336:33;:::i;:::-;2288:87;;;;:::o;2381:262::-;2440:6;2489:2;2477:9;2468:7;2464:23;2460:32;2457:2;;;2505:1;2502;2495:12;2457:2;2548:1;2573:53;2618:7;2609:6;2598:9;2594:22;2573:53;:::i;:::-;2563:63;;2519:117;2447:196;;;;:::o;2649:407::-;2717:6;2725;2774:2;2762:9;2753:7;2749:23;2745:32;2742:2;;;2790:1;2787;2780:12;2742:2;2833:1;2858:53;2903:7;2894:6;2883:9;2879:22;2858:53;:::i;:::-;2848:63;;2804:117;2960:2;2986:53;3031:7;3022:6;3011:9;3007:22;2986:53;:::i;:::-;2976:63;;2931:118;2732:324;;;;;:::o;3062:552::-;3139:6;3147;3155;3204:2;3192:9;3183:7;3179:23;3175:32;3172:2;;;3220:1;3217;3210:12;3172:2;3263:1;3288:53;3333:7;3324:6;3313:9;3309:22;3288:53;:::i;:::-;3278:63;;3234:117;3390:2;3416:53;3461:7;3452:6;3441:9;3437:22;3416:53;:::i;:::-;3406:63;;3361:118;3518:2;3544:53;3589:7;3580:6;3569:9;3565:22;3544:53;:::i;:::-;3534:63;;3489:118;3162:452;;;;;:::o;3620:809::-;3715:6;3723;3731;3739;3788:3;3776:9;3767:7;3763:23;3759:33;3756:2;;;3805:1;3802;3795:12;3756:2;3848:1;3873:53;3918:7;3909:6;3898:9;3894:22;3873:53;:::i;:::-;3863:63;;3819:117;3975:2;4001:53;4046:7;4037:6;4026:9;4022:22;4001:53;:::i;:::-;3991:63;;3946:118;4103:2;4129:53;4174:7;4165:6;4154:9;4150:22;4129:53;:::i;:::-;4119:63;;4074:118;4259:2;4248:9;4244:18;4231:32;4290:18;4282:6;4279:30;4276:2;;;4322:1;4319;4312:12;4276:2;4350:62;4404:7;4395:6;4384:9;4380:22;4350:62;:::i;:::-;4340:72;;4202:220;3746:683;;;;;;;:::o;4435:401::-;4500:6;4508;4557:2;4545:9;4536:7;4532:23;4528:32;4525:2;;;4573:1;4570;4563:12;4525:2;4616:1;4641:53;4686:7;4677:6;4666:9;4662:22;4641:53;:::i;:::-;4631:63;;4587:117;4743:2;4769:50;4811:7;4802:6;4791:9;4787:22;4769:50;:::i;:::-;4759:60;;4714:115;4515:321;;;;;:::o;4842:407::-;4910:6;4918;4967:2;4955:9;4946:7;4942:23;4938:32;4935:2;;;4983:1;4980;4973:12;4935:2;5026:1;5051:53;5096:7;5087:6;5076:9;5072:22;5051:53;:::i;:::-;5041:63;;4997:117;5153:2;5179:53;5224:7;5215:6;5204:9;5200:22;5179:53;:::i;:::-;5169:63;;5124:118;4925:324;;;;;:::o;5255:260::-;5313:6;5362:2;5350:9;5341:7;5337:23;5333:32;5330:2;;;5378:1;5375;5368:12;5330:2;5421:1;5446:52;5490:7;5481:6;5470:9;5466:22;5446:52;:::i;:::-;5436:62;;5392:116;5320:195;;;;:::o;5521:282::-;5590:6;5639:2;5627:9;5618:7;5614:23;5610:32;5607:2;;;5655:1;5652;5645:12;5607:2;5698:1;5723:63;5778:7;5769:6;5758:9;5754:22;5723:63;:::i;:::-;5713:73;;5669:127;5597:206;;;;:::o;5809:395::-;5880:6;5888;5937:2;5925:9;5916:7;5912:23;5908:32;5905:2;;;5953:1;5950;5943:12;5905:2;6024:1;6013:9;6009:17;5996:31;6054:18;6046:6;6043:30;6040:2;;;6086:1;6083;6076:12;6040:2;6122:65;6179:7;6170:6;6159:9;6155:22;6122:65;:::i;:::-;6104:83;;;;5967:230;5895:309;;;;;:::o;6210:375::-;6279:6;6328:2;6316:9;6307:7;6303:23;6299:32;6296:2;;;6344:1;6341;6334:12;6296:2;6415:1;6404:9;6400:17;6387:31;6445:18;6437:6;6434:30;6431:2;;;6477:1;6474;6467:12;6431:2;6505:63;6560:7;6551:6;6540:9;6536:22;6505:63;:::i;:::-;6495:73;;6358:220;6286:299;;;;:::o;6591:262::-;6650:6;6699:2;6687:9;6678:7;6674:23;6670:32;6667:2;;;6715:1;6712;6705:12;6667:2;6758:1;6783:53;6828:7;6819:6;6808:9;6804:22;6783:53;:::i;:::-;6773:63;;6729:117;6657:196;;;;:::o;6859:540::-;6939:6;6947;6955;7004:2;6992:9;6983:7;6979:23;6975:32;6972:2;;;7020:1;7017;7010:12;6972:2;7063:1;7088:53;7133:7;7124:6;7113:9;7109:22;7088:53;:::i;:::-;7078:63;;7034:117;7218:2;7207:9;7203:18;7190:32;7249:18;7241:6;7238:30;7235:2;;;7281:1;7278;7271:12;7235:2;7317:65;7374:7;7365:6;7354:9;7350:22;7317:65;:::i;:::-;7299:83;;;;7161:231;6962:437;;;;;:::o;7405:520::-;7483:6;7491;7540:2;7528:9;7519:7;7515:23;7511:32;7508:2;;;7556:1;7553;7546:12;7508:2;7599:1;7624:53;7669:7;7660:6;7649:9;7645:22;7624:53;:::i;:::-;7614:63;;7570:117;7754:2;7743:9;7739:18;7726:32;7785:18;7777:6;7774:30;7771:2;;;7817:1;7814;7807:12;7771:2;7845:63;7900:7;7891:6;7880:9;7876:22;7845:63;:::i;:::-;7835:73;;7697:221;7498:427;;;;;:::o;7931:118::-;8018:24;8036:5;8018:24;:::i;:::-;8013:3;8006:37;7996:53;;:::o;8055:109::-;8136:21;8151:5;8136:21;:::i;:::-;8131:3;8124:34;8114:50;;:::o;8170:360::-;8256:3;8284:38;8316:5;8284:38;:::i;:::-;8338:70;8401:6;8396:3;8338:70;:::i;:::-;8331:77;;8417:52;8462:6;8457:3;8450:4;8443:5;8439:16;8417:52;:::i;:::-;8494:29;8516:6;8494:29;:::i;:::-;8489:3;8485:39;8478:46;;8260:270;;;;;:::o;8536:364::-;8624:3;8652:39;8685:5;8652:39;:::i;:::-;8707:71;8771:6;8766:3;8707:71;:::i;:::-;8700:78;;8787:52;8832:6;8827:3;8820:4;8813:5;8809:16;8787:52;:::i;:::-;8864:29;8886:6;8864:29;:::i;:::-;8859:3;8855:39;8848:46;;8628:272;;;;;:::o;8906:377::-;9012:3;9040:39;9073:5;9040:39;:::i;:::-;9095:89;9177:6;9172:3;9095:89;:::i;:::-;9088:96;;9193:52;9238:6;9233:3;9226:4;9219:5;9215:16;9193:52;:::i;:::-;9270:6;9265:3;9261:16;9254:23;;9016:267;;;;;:::o;9313:845::-;9416:3;9453:5;9447:12;9482:36;9508:9;9482:36;:::i;:::-;9534:89;9616:6;9611:3;9534:89;:::i;:::-;9527:96;;9654:1;9643:9;9639:17;9670:1;9665:137;;;;9816:1;9811:341;;;;9632:520;;9665:137;9749:4;9745:9;9734;9730:25;9725:3;9718:38;9785:6;9780:3;9776:16;9769:23;;9665:137;;9811:341;9878:38;9910:5;9878:38;:::i;:::-;9938:1;9952:154;9966:6;9963:1;9960:13;9952:154;;;10040:7;10034:14;10030:1;10025:3;10021:11;10014:35;10090:1;10081:7;10077:15;10066:26;;9988:4;9985:1;9981:12;9976:17;;9952:154;;;10135:6;10130:3;10126:16;10119:23;;9818:334;;9632:520;;9420:738;;;;;;:::o;10164:366::-;10306:3;10327:67;10391:2;10386:3;10327:67;:::i;:::-;10320:74;;10403:93;10492:3;10403:93;:::i;:::-;10521:2;10516:3;10512:12;10505:19;;10310:220;;;:::o;10536:365::-;10678:3;10699:66;10763:1;10758:3;10699:66;:::i;:::-;10692:73;;10774:93;10863:3;10774:93;:::i;:::-;10892:2;10887:3;10883:12;10876:19;;10682:219;;;:::o;10907:366::-;11049:3;11070:67;11134:2;11129:3;11070:67;:::i;:::-;11063:74;;11146:93;11235:3;11146:93;:::i;:::-;11264:2;11259:3;11255:12;11248:19;;11053:220;;;:::o;11279:366::-;11421:3;11442:67;11506:2;11501:3;11442:67;:::i;:::-;11435:74;;11518:93;11607:3;11518:93;:::i;:::-;11636:2;11631:3;11627:12;11620:19;;11425:220;;;:::o;11651:366::-;11793:3;11814:67;11878:2;11873:3;11814:67;:::i;:::-;11807:74;;11890:93;11979:3;11890:93;:::i;:::-;12008:2;12003:3;11999:12;11992:19;;11797:220;;;:::o;12023:366::-;12165:3;12186:67;12250:2;12245:3;12186:67;:::i;:::-;12179:74;;12262:93;12351:3;12262:93;:::i;:::-;12380:2;12375:3;12371:12;12364:19;;12169:220;;;:::o;12395:366::-;12537:3;12558:67;12622:2;12617:3;12558:67;:::i;:::-;12551:74;;12634:93;12723:3;12634:93;:::i;:::-;12752:2;12747:3;12743:12;12736:19;;12541:220;;;:::o;12767:366::-;12909:3;12930:67;12994:2;12989:3;12930:67;:::i;:::-;12923:74;;13006:93;13095:3;13006:93;:::i;:::-;13124:2;13119:3;13115:12;13108:19;;12913:220;;;:::o;13139:366::-;13281:3;13302:67;13366:2;13361:3;13302:67;:::i;:::-;13295:74;;13378:93;13467:3;13378:93;:::i;:::-;13496:2;13491:3;13487:12;13480:19;;13285:220;;;:::o;13511:366::-;13653:3;13674:67;13738:2;13733:3;13674:67;:::i;:::-;13667:74;;13750:93;13839:3;13750:93;:::i;:::-;13868:2;13863:3;13859:12;13852:19;;13657:220;;;:::o;13883:366::-;14025:3;14046:67;14110:2;14105:3;14046:67;:::i;:::-;14039:74;;14122:93;14211:3;14122:93;:::i;:::-;14240:2;14235:3;14231:12;14224:19;;14029:220;;;:::o;14255:366::-;14397:3;14418:67;14482:2;14477:3;14418:67;:::i;:::-;14411:74;;14494:93;14583:3;14494:93;:::i;:::-;14612:2;14607:3;14603:12;14596:19;;14401:220;;;:::o;14627:366::-;14769:3;14790:67;14854:2;14849:3;14790:67;:::i;:::-;14783:74;;14866:93;14955:3;14866:93;:::i;:::-;14984:2;14979:3;14975:12;14968:19;;14773:220;;;:::o;14999:366::-;15141:3;15162:67;15226:2;15221:3;15162:67;:::i;:::-;15155:74;;15238:93;15327:3;15238:93;:::i;:::-;15356:2;15351:3;15347:12;15340:19;;15145:220;;;:::o;15371:366::-;15513:3;15534:67;15598:2;15593:3;15534:67;:::i;:::-;15527:74;;15610:93;15699:3;15610:93;:::i;:::-;15728:2;15723:3;15719:12;15712:19;;15517:220;;;:::o;15743:366::-;15885:3;15906:67;15970:2;15965:3;15906:67;:::i;:::-;15899:74;;15982:93;16071:3;15982:93;:::i;:::-;16100:2;16095:3;16091:12;16084:19;;15889:220;;;:::o;16115:366::-;16257:3;16278:67;16342:2;16337:3;16278:67;:::i;:::-;16271:74;;16354:93;16443:3;16354:93;:::i;:::-;16472:2;16467:3;16463:12;16456:19;;16261:220;;;:::o;16487:366::-;16629:3;16650:67;16714:2;16709:3;16650:67;:::i;:::-;16643:74;;16726:93;16815:3;16726:93;:::i;:::-;16844:2;16839:3;16835:12;16828:19;;16633:220;;;:::o;16859:366::-;17001:3;17022:67;17086:2;17081:3;17022:67;:::i;:::-;17015:74;;17098:93;17187:3;17098:93;:::i;:::-;17216:2;17211:3;17207:12;17200:19;;17005:220;;;:::o;17231:366::-;17373:3;17394:67;17458:2;17453:3;17394:67;:::i;:::-;17387:74;;17470:93;17559:3;17470:93;:::i;:::-;17588:2;17583:3;17579:12;17572:19;;17377:220;;;:::o;17603:366::-;17745:3;17766:67;17830:2;17825:3;17766:67;:::i;:::-;17759:74;;17842:93;17931:3;17842:93;:::i;:::-;17960:2;17955:3;17951:12;17944:19;;17749:220;;;:::o;17975:366::-;18117:3;18138:67;18202:2;18197:3;18138:67;:::i;:::-;18131:74;;18214:93;18303:3;18214:93;:::i;:::-;18332:2;18327:3;18323:12;18316:19;;18121:220;;;:::o;18347:366::-;18489:3;18510:67;18574:2;18569:3;18510:67;:::i;:::-;18503:74;;18586:93;18675:3;18586:93;:::i;:::-;18704:2;18699:3;18695:12;18688:19;;18493:220;;;:::o;18719:366::-;18861:3;18882:67;18946:2;18941:3;18882:67;:::i;:::-;18875:74;;18958:93;19047:3;18958:93;:::i;:::-;19076:2;19071:3;19067:12;19060:19;;18865:220;;;:::o;19091:366::-;19233:3;19254:67;19318:2;19313:3;19254:67;:::i;:::-;19247:74;;19330:93;19419:3;19330:93;:::i;:::-;19448:2;19443:3;19439:12;19432:19;;19237:220;;;:::o;19463:400::-;19623:3;19644:84;19726:1;19721:3;19644:84;:::i;:::-;19637:91;;19737:93;19826:3;19737:93;:::i;:::-;19855:1;19850:3;19846:11;19839:18;;19627:236;;;:::o;19869:118::-;19956:24;19974:5;19956:24;:::i;:::-;19951:3;19944:37;19934:53;;:::o;19993:435::-;20173:3;20195:95;20286:3;20277:6;20195:95;:::i;:::-;20188:102;;20307:95;20398:3;20389:6;20307:95;:::i;:::-;20300:102;;20419:3;20412:10;;20177:251;;;;;:::o;20434:855::-;20760:3;20782:95;20873:3;20864:6;20782:95;:::i;:::-;20775:102;;20894:95;20985:3;20976:6;20894:95;:::i;:::-;20887:102;;21006:148;21150:3;21006:148;:::i;:::-;20999:155;;21171:92;21259:3;21250:6;21171:92;:::i;:::-;21164:99;;21280:3;21273:10;;20764:525;;;;;;:::o;21295:222::-;21388:4;21426:2;21415:9;21411:18;21403:26;;21439:71;21507:1;21496:9;21492:17;21483:6;21439:71;:::i;:::-;21393:124;;;;:::o;21523:640::-;21718:4;21756:3;21745:9;21741:19;21733:27;;21770:71;21838:1;21827:9;21823:17;21814:6;21770:71;:::i;:::-;21851:72;21919:2;21908:9;21904:18;21895:6;21851:72;:::i;:::-;21933;22001:2;21990:9;21986:18;21977:6;21933:72;:::i;:::-;22052:9;22046:4;22042:20;22037:2;22026:9;22022:18;22015:48;22080:76;22151:4;22142:6;22080:76;:::i;:::-;22072:84;;21723:440;;;;;;;:::o;22169:210::-;22256:4;22294:2;22283:9;22279:18;22271:26;;22307:65;22369:1;22358:9;22354:17;22345:6;22307:65;:::i;:::-;22261:118;;;;:::o;22385:313::-;22498:4;22536:2;22525:9;22521:18;22513:26;;22585:9;22579:4;22575:20;22571:1;22560:9;22556:17;22549:47;22613:78;22686:4;22677:6;22613:78;:::i;:::-;22605:86;;22503:195;;;;:::o;22704:419::-;22870:4;22908:2;22897:9;22893:18;22885:26;;22957:9;22951:4;22947:20;22943:1;22932:9;22928:17;22921:47;22985:131;23111:4;22985:131;:::i;:::-;22977:139;;22875:248;;;:::o;23129:419::-;23295:4;23333:2;23322:9;23318:18;23310:26;;23382:9;23376:4;23372:20;23368:1;23357:9;23353:17;23346:47;23410:131;23536:4;23410:131;:::i;:::-;23402:139;;23300:248;;;:::o;23554:419::-;23720:4;23758:2;23747:9;23743:18;23735:26;;23807:9;23801:4;23797:20;23793:1;23782:9;23778:17;23771:47;23835:131;23961:4;23835:131;:::i;:::-;23827:139;;23725:248;;;:::o;23979:419::-;24145:4;24183:2;24172:9;24168:18;24160:26;;24232:9;24226:4;24222:20;24218:1;24207:9;24203:17;24196:47;24260:131;24386:4;24260:131;:::i;:::-;24252:139;;24150:248;;;:::o;24404:419::-;24570:4;24608:2;24597:9;24593:18;24585:26;;24657:9;24651:4;24647:20;24643:1;24632:9;24628:17;24621:47;24685:131;24811:4;24685:131;:::i;:::-;24677:139;;24575:248;;;:::o;24829:419::-;24995:4;25033:2;25022:9;25018:18;25010:26;;25082:9;25076:4;25072:20;25068:1;25057:9;25053:17;25046:47;25110:131;25236:4;25110:131;:::i;:::-;25102:139;;25000:248;;;:::o;25254:419::-;25420:4;25458:2;25447:9;25443:18;25435:26;;25507:9;25501:4;25497:20;25493:1;25482:9;25478:17;25471:47;25535:131;25661:4;25535:131;:::i;:::-;25527:139;;25425:248;;;:::o;25679:419::-;25845:4;25883:2;25872:9;25868:18;25860:26;;25932:9;25926:4;25922:20;25918:1;25907:9;25903:17;25896:47;25960:131;26086:4;25960:131;:::i;:::-;25952:139;;25850:248;;;:::o;26104:419::-;26270:4;26308:2;26297:9;26293:18;26285:26;;26357:9;26351:4;26347:20;26343:1;26332:9;26328:17;26321:47;26385:131;26511:4;26385:131;:::i;:::-;26377:139;;26275:248;;;:::o;26529:419::-;26695:4;26733:2;26722:9;26718:18;26710:26;;26782:9;26776:4;26772:20;26768:1;26757:9;26753:17;26746:47;26810:131;26936:4;26810:131;:::i;:::-;26802:139;;26700:248;;;:::o;26954:419::-;27120:4;27158:2;27147:9;27143:18;27135:26;;27207:9;27201:4;27197:20;27193:1;27182:9;27178:17;27171:47;27235:131;27361:4;27235:131;:::i;:::-;27227:139;;27125:248;;;:::o;27379:419::-;27545:4;27583:2;27572:9;27568:18;27560:26;;27632:9;27626:4;27622:20;27618:1;27607:9;27603:17;27596:47;27660:131;27786:4;27660:131;:::i;:::-;27652:139;;27550:248;;;:::o;27804:419::-;27970:4;28008:2;27997:9;27993:18;27985:26;;28057:9;28051:4;28047:20;28043:1;28032:9;28028:17;28021:47;28085:131;28211:4;28085:131;:::i;:::-;28077:139;;27975:248;;;:::o;28229:419::-;28395:4;28433:2;28422:9;28418:18;28410:26;;28482:9;28476:4;28472:20;28468:1;28457:9;28453:17;28446:47;28510:131;28636:4;28510:131;:::i;:::-;28502:139;;28400:248;;;:::o;28654:419::-;28820:4;28858:2;28847:9;28843:18;28835:26;;28907:9;28901:4;28897:20;28893:1;28882:9;28878:17;28871:47;28935:131;29061:4;28935:131;:::i;:::-;28927:139;;28825:248;;;:::o;29079:419::-;29245:4;29283:2;29272:9;29268:18;29260:26;;29332:9;29326:4;29322:20;29318:1;29307:9;29303:17;29296:47;29360:131;29486:4;29360:131;:::i;:::-;29352:139;;29250:248;;;:::o;29504:419::-;29670:4;29708:2;29697:9;29693:18;29685:26;;29757:9;29751:4;29747:20;29743:1;29732:9;29728:17;29721:47;29785:131;29911:4;29785:131;:::i;:::-;29777:139;;29675:248;;;:::o;29929:419::-;30095:4;30133:2;30122:9;30118:18;30110:26;;30182:9;30176:4;30172:20;30168:1;30157:9;30153:17;30146:47;30210:131;30336:4;30210:131;:::i;:::-;30202:139;;30100:248;;;:::o;30354:419::-;30520:4;30558:2;30547:9;30543:18;30535:26;;30607:9;30601:4;30597:20;30593:1;30582:9;30578:17;30571:47;30635:131;30761:4;30635:131;:::i;:::-;30627:139;;30525:248;;;:::o;30779:419::-;30945:4;30983:2;30972:9;30968:18;30960:26;;31032:9;31026:4;31022:20;31018:1;31007:9;31003:17;30996:47;31060:131;31186:4;31060:131;:::i;:::-;31052:139;;30950:248;;;:::o;31204:419::-;31370:4;31408:2;31397:9;31393:18;31385:26;;31457:9;31451:4;31447:20;31443:1;31432:9;31428:17;31421:47;31485:131;31611:4;31485:131;:::i;:::-;31477:139;;31375:248;;;:::o;31629:419::-;31795:4;31833:2;31822:9;31818:18;31810:26;;31882:9;31876:4;31872:20;31868:1;31857:9;31853:17;31846:47;31910:131;32036:4;31910:131;:::i;:::-;31902:139;;31800:248;;;:::o;32054:419::-;32220:4;32258:2;32247:9;32243:18;32235:26;;32307:9;32301:4;32297:20;32293:1;32282:9;32278:17;32271:47;32335:131;32461:4;32335:131;:::i;:::-;32327:139;;32225:248;;;:::o;32479:419::-;32645:4;32683:2;32672:9;32668:18;32660:26;;32732:9;32726:4;32722:20;32718:1;32707:9;32703:17;32696:47;32760:131;32886:4;32760:131;:::i;:::-;32752:139;;32650:248;;;:::o;32904:419::-;33070:4;33108:2;33097:9;33093:18;33085:26;;33157:9;33151:4;33147:20;33143:1;33132:9;33128:17;33121:47;33185:131;33311:4;33185:131;:::i;:::-;33177:139;;33075:248;;;:::o;33329:222::-;33422:4;33460:2;33449:9;33445:18;33437:26;;33473:71;33541:1;33530:9;33526:17;33517:6;33473:71;:::i;:::-;33427:124;;;;:::o;33557:129::-;33591:6;33618:20;;:::i;:::-;33608:30;;33647:33;33675:4;33667:6;33647:33;:::i;:::-;33598:88;;;:::o;33692:75::-;33725:6;33758:2;33752:9;33742:19;;33732:35;:::o;33773:307::-;33834:4;33924:18;33916:6;33913:30;33910:2;;;33946:18;;:::i;:::-;33910:2;33984:29;34006:6;33984:29;:::i;:::-;33976:37;;34068:4;34062;34058:15;34050:23;;33839:241;;;:::o;34086:308::-;34148:4;34238:18;34230:6;34227:30;34224:2;;;34260:18;;:::i;:::-;34224:2;34298:29;34320:6;34298:29;:::i;:::-;34290:37;;34382:4;34376;34372:15;34364:23;;34153:241;;;:::o;34400:141::-;34449:4;34472:3;34464:11;;34495:3;34492:1;34485:14;34529:4;34526:1;34516:18;34508:26;;34454:87;;;:::o;34547:98::-;34598:6;34632:5;34626:12;34616:22;;34605:40;;;:::o;34651:99::-;34703:6;34737:5;34731:12;34721:22;;34710:40;;;:::o;34756:168::-;34839:11;34873:6;34868:3;34861:19;34913:4;34908:3;34904:14;34889:29;;34851:73;;;;:::o;34930:169::-;35014:11;35048:6;35043:3;35036:19;35088:4;35083:3;35079:14;35064:29;;35026:73;;;;:::o;35105:148::-;35207:11;35244:3;35229:18;;35219:34;;;;:::o;35259:305::-;35299:3;35318:20;35336:1;35318:20;:::i;:::-;35313:25;;35352:20;35370:1;35352:20;:::i;:::-;35347:25;;35506:1;35438:66;35434:74;35431:1;35428:81;35425:2;;;35512:18;;:::i;:::-;35425:2;35556:1;35553;35549:9;35542:16;;35303:261;;;;:::o;35570:185::-;35610:1;35627:20;35645:1;35627:20;:::i;:::-;35622:25;;35661:20;35679:1;35661:20;:::i;:::-;35656:25;;35700:1;35690:2;;35705:18;;:::i;:::-;35690:2;35747:1;35744;35740:9;35735:14;;35612:143;;;;:::o;35761:191::-;35801:4;35821:20;35839:1;35821:20;:::i;:::-;35816:25;;35855:20;35873:1;35855:20;:::i;:::-;35850:25;;35894:1;35891;35888:8;35885:2;;;35899:18;;:::i;:::-;35885:2;35944:1;35941;35937:9;35929:17;;35806:146;;;;:::o;35958:96::-;35995:7;36024:24;36042:5;36024:24;:::i;:::-;36013:35;;36003:51;;;:::o;36060:90::-;36094:7;36137:5;36130:13;36123:21;36112:32;;36102:48;;;:::o;36156:149::-;36192:7;36232:66;36225:5;36221:78;36210:89;;36200:105;;;:::o;36311:126::-;36348:7;36388:42;36381:5;36377:54;36366:65;;36356:81;;;:::o;36443:77::-;36480:7;36509:5;36498:16;;36488:32;;;:::o;36526:154::-;36610:6;36605:3;36600;36587:30;36672:1;36663:6;36658:3;36654:16;36647:27;36577:103;;;:::o;36686:307::-;36754:1;36764:113;36778:6;36775:1;36772:13;36764:113;;;36863:1;36858:3;36854:11;36848:18;36844:1;36839:3;36835:11;36828:39;36800:2;36797:1;36793:10;36788:15;;36764:113;;;36895:6;36892:1;36889:13;36886:2;;;36975:1;36966:6;36961:3;36957:16;36950:27;36886:2;36735:258;;;;:::o;36999:320::-;37043:6;37080:1;37074:4;37070:12;37060:22;;37127:1;37121:4;37117:12;37148:18;37138:2;;37204:4;37196:6;37192:17;37182:27;;37138:2;37266;37258:6;37255:14;37235:18;37232:38;37229:2;;;37285:18;;:::i;:::-;37229:2;37050:269;;;;:::o;37325:281::-;37408:27;37430:4;37408:27;:::i;:::-;37400:6;37396:40;37538:6;37526:10;37523:22;37502:18;37490:10;37487:34;37484:62;37481:2;;;37549:18;;:::i;:::-;37481:2;37589:10;37585:2;37578:22;37368:238;;;:::o;37612:233::-;37651:3;37674:24;37692:5;37674:24;:::i;:::-;37665:33;;37720:66;37713:5;37710:77;37707:2;;;37790:18;;:::i;:::-;37707:2;37837:1;37830:5;37826:13;37819:20;;37655:190;;;:::o;37851:176::-;37883:1;37900:20;37918:1;37900:20;:::i;:::-;37895:25;;37934:20;37952:1;37934:20;:::i;:::-;37929:25;;37973:1;37963:2;;37978:18;;:::i;:::-;37963:2;38019:1;38016;38012:9;38007:14;;37885:142;;;;:::o;38033:180::-;38081:77;38078:1;38071:88;38178:4;38175:1;38168:15;38202:4;38199:1;38192:15;38219:180;38267:77;38264:1;38257:88;38364:4;38361:1;38354:15;38388:4;38385:1;38378:15;38405:180;38453:77;38450:1;38443:88;38550:4;38547:1;38540:15;38574:4;38571:1;38564:15;38591:180;38639:77;38636:1;38629:88;38736:4;38733:1;38726:15;38760:4;38757:1;38750:15;38777:102;38818:6;38869:2;38865:7;38860:2;38853:5;38849:14;38845:28;38835:38;;38825:54;;;:::o;38885:162::-;39025:14;39021:1;39013:6;39009:14;39002:38;38991:56;:::o;39053:156::-;39193:8;39189:1;39181:6;39177:14;39170:32;39159:50;:::o;39215:162::-;39355:14;39351:1;39343:6;39339:14;39332:38;39321:56;:::o;39383:170::-;39523:22;39519:1;39511:6;39507:14;39500:46;39489:64;:::o;39559:230::-;39699:34;39695:1;39687:6;39683:14;39676:58;39768:13;39763:2;39755:6;39751:15;39744:38;39665:124;:::o;39795:237::-;39935:34;39931:1;39923:6;39919:14;39912:58;40004:20;39999:2;39991:6;39987:15;39980:45;39901:131;:::o;40038:225::-;40178:34;40174:1;40166:6;40162:14;40155:58;40247:8;40242:2;40234:6;40230:15;40223:33;40144:119;:::o;40269:178::-;40409:30;40405:1;40397:6;40393:14;40386:54;40375:72;:::o;40453:223::-;40593:34;40589:1;40581:6;40577:14;40570:58;40662:6;40657:2;40649:6;40645:15;40638:31;40559:117;:::o;40682:175::-;40822:27;40818:1;40810:6;40806:14;40799:51;40788:69;:::o;40863:163::-;41003:15;40999:1;40991:6;40987:14;40980:39;40969:57;:::o;41032:235::-;41172:34;41168:1;41160:6;41156:14;41149:58;41241:18;41236:2;41228:6;41224:15;41217:43;41138:129;:::o;41273:231::-;41413:34;41409:1;41401:6;41397:14;41390:58;41482:14;41477:2;41469:6;41465:15;41458:39;41379:125;:::o;41510:243::-;41650:34;41646:1;41638:6;41634:14;41627:58;41719:26;41714:2;41706:6;41702:15;41695:51;41616:137;:::o;41759:229::-;41899:34;41895:1;41887:6;41883:14;41876:58;41968:12;41963:2;41955:6;41951:15;41944:37;41865:123;:::o;41994:228::-;42134:34;42130:1;42122:6;42118:14;42111:58;42203:11;42198:2;42190:6;42186:15;42179:36;42100:122;:::o;42228:182::-;42368:34;42364:1;42356:6;42352:14;42345:58;42334:76;:::o;42416:236::-;42556:34;42552:1;42544:6;42540:14;42533:58;42625:19;42620:2;42612:6;42608:15;42601:44;42522:130;:::o;42658:231::-;42798:34;42794:1;42786:6;42782:14;42775:58;42867:14;42862:2;42854:6;42850:15;42843:39;42764:125;:::o;42895:175::-;43035:27;43031:1;43023:6;43019:14;43012:51;43001:69;:::o;43076:182::-;43216:34;43212:1;43204:6;43200:14;43193:58;43182:76;:::o;43264:228::-;43404:34;43400:1;43392:6;43388:14;43381:58;43473:11;43468:2;43460:6;43456:15;43449:36;43370:122;:::o;43498:220::-;43638:34;43634:1;43626:6;43622:14;43615:58;43707:3;43702:2;43694:6;43690:15;43683:28;43604:114;:::o;43724:236::-;43864:34;43860:1;43852:6;43848:14;43841:58;43933:19;43928:2;43920:6;43916:15;43909:44;43830:130;:::o;43966:231::-;44106:34;44102:1;44094:6;44090:14;44083:58;44175:14;44170:2;44162:6;44158:15;44151:39;44072:125;:::o;44203:151::-;44343:3;44339:1;44331:6;44327:14;44320:27;44309:45;:::o;44360:122::-;44433:24;44451:5;44433:24;:::i;:::-;44426:5;44423:35;44413:2;;44472:1;44469;44462:12;44413:2;44403:79;:::o;44488:116::-;44558:21;44573:5;44558:21;:::i;:::-;44551:5;44548:32;44538:2;;44594:1;44591;44584:12;44538:2;44528:76;:::o;44610:120::-;44682:23;44699:5;44682:23;:::i;:::-;44675:5;44672:34;44662:2;;44720:1;44717;44710:12;44662:2;44652:78;:::o;44736:122::-;44809:24;44827:5;44809:24;:::i;:::-;44802:5;44799:35;44789:2;;44848:1;44845;44838:12;44789:2;44779:79;:::o
Swarm Source
ipfs://1785b017aecd84d0333462c5e63df00480e7145b1e333950ec9e90d91de73bb3
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.