Contract Overview
Balance:
0 MATIC
MATIC Value:
$0.00
[ Download CSV Export ]
Contract Name:
TipiChain
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; import "./ERC721.sol"; import "./ERC721URIStorage.sol"; import "./Pausable.sol"; import "./AccessControl.sol"; import "./ERC721Burnable.sol"; import "./draft-EIP712.sol"; import "./draft-ERC721Votes.sol"; /// @custom:security-contact [email protected] contract TipiChain is ERC721, ERC721URIStorage, Pausable, AccessControl, ERC721Burnable, EIP712, ERC721Votes { bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE"); bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); constructor() ERC721("TipiChain", "TIPI") EIP712("TipiChain", "1") { _grantRole(DEFAULT_ADMIN_ROLE, msg.sender); _grantRole(PAUSER_ROLE, msg.sender); _grantRole(MINTER_ROLE, msg.sender); } function _baseURI() internal pure override returns (string memory) { return "https://tipichain.com/nft/?id="; } function pause() public onlyRole(PAUSER_ROLE) { _pause(); } function unpause() public onlyRole(PAUSER_ROLE) { _unpause(); } function safeMint(address to, uint256 tokenId, string memory uri) public onlyRole(MINTER_ROLE) { _safeMint(to, tokenId); _setTokenURI(tokenId, uri); } function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal whenNotPaused override { super._beforeTokenTransfer(from, to, tokenId); } // The following functions are overrides required by Solidity. function _afterTokenTransfer(address from, address to, uint256 tokenId) internal override(ERC721, ERC721Votes) { super._afterTokenTransfer(from, to, tokenId); } function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) { super._burn(tokenId); } function tokenURI(uint256 tokenId) public view override(ERC721, ERC721URIStorage) returns (string memory) { return super.tokenURI(tokenId); } function supportsInterface(bytes4 interfaceId) public view override(ERC721, AccessControl) returns (bool) { return super.supportsInterface(interfaceId); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (access/AccessControl.sol) pragma solidity ^0.8.0; import "./IAccessControl.sol"; import "./Context.sol"; import "./Strings.sol"; import "./ERC165.sol"; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view virtual override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `_msgSender()` is missing `role`. * Overriding this function changes the behavior of the {onlyRole} modifier. * * Format of the revert message is described in {_checkRole}. * * _Available since v4.6._ */ function _checkRole(bytes32 role) internal view virtual { _checkRole(role, _msgSender()); } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view virtual { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(uint160(account), 20), " is missing role ", Strings.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleGranted} event. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleRevoked} event. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. * * May emit a {RoleRevoked} event. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * May emit a {RoleGranted} event. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== * * NOTE: This function is deprecated in favor of {_grantRole}. */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Grants `role` to `account`. * * Internal function without access restriction. * * May emit a {RoleGranted} event. */ function _grantRole(bytes32 role, address account) internal virtual { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } /** * @dev Revokes `role` from `account`. * * Internal function without access restriction. * * May emit a {RoleRevoked} event. */ function _revokeRole(bytes32 role, address account) internal virtual { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (utils/Checkpoints.sol) pragma solidity ^0.8.0; import "./Math.sol"; import "./SafeCast.sol"; /** * @dev This library defines the `History` struct, for checkpointing values as they change at different points in * time, and later looking up past values by block number. See {Votes} as an example. * * To create a history of checkpoints define a variable type `Checkpoints.History` in your contract, and store a new * checkpoint for the current transaction block using the {push} function. * * _Available since v4.5._ */ library Checkpoints { struct Checkpoint { uint32 _blockNumber; uint224 _value; } struct History { Checkpoint[] _checkpoints; } /** * @dev Returns the value in the latest checkpoint, or zero if there are no checkpoints. */ function latest(History storage self) internal view returns (uint256) { uint256 pos = self._checkpoints.length; return pos == 0 ? 0 : self._checkpoints[pos - 1]._value; } /** * @dev Returns the value at a given block number. If a checkpoint is not available at that block, the closest one * before it is returned, or zero otherwise. */ function getAtBlock(History storage self, uint256 blockNumber) internal view returns (uint256) { require(blockNumber < block.number, "Checkpoints: block not yet mined"); uint256 high = self._checkpoints.length; uint256 low = 0; while (low < high) { uint256 mid = Math.average(low, high); if (self._checkpoints[mid]._blockNumber > blockNumber) { high = mid; } else { low = mid + 1; } } return high == 0 ? 0 : self._checkpoints[high - 1]._value; } /** * @dev Pushes a value onto a History so that it is stored as the checkpoint for the current block. * * Returns previous value and new value. */ function push(History storage self, uint256 value) internal returns (uint256, uint256) { uint256 pos = self._checkpoints.length; uint256 old = latest(self); if (pos > 0 && self._checkpoints[pos - 1]._blockNumber == block.number) { self._checkpoints[pos - 1]._value = SafeCast.toUint224(value); } else { self._checkpoints.push( Checkpoint({_blockNumber: SafeCast.toUint32(block.number), _value: SafeCast.toUint224(value)}) ); } return (old, value); } /** * @dev Pushes a value onto a History, by updating the latest value using binary operation `op`. The new value will * be set to `op(latest, delta)`. * * Returns previous value and new value. */ function push( History storage self, function(uint256, uint256) view returns (uint256) op, uint256 delta ) internal returns (uint256, uint256) { return push(self, op(latest(self), delta)); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/cryptography/draft-EIP712.sol) pragma solidity ^0.8.0; import "./ECDSA.sol"; /** * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data. * * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible, * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding * they need in their contracts using a combination of `abi.encode` and `keccak256`. * * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA * ({_hashTypedDataV4}). * * The implementation of the domain separator was designed to be as efficient as possible while still properly updating * the chain id to protect against replay attacks on an eventual fork of the chain. * * NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask]. * * _Available since v3.4._ */ abstract contract EIP712 { /* solhint-disable var-name-mixedcase */ // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to // invalidate the cached domain separator if the chain id changes. bytes32 private immutable _CACHED_DOMAIN_SEPARATOR; uint256 private immutable _CACHED_CHAIN_ID; address private immutable _CACHED_THIS; bytes32 private immutable _HASHED_NAME; bytes32 private immutable _HASHED_VERSION; bytes32 private immutable _TYPE_HASH; /* solhint-enable var-name-mixedcase */ /** * @dev Initializes the domain separator and parameter caches. * * The meaning of `name` and `version` is specified in * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]: * * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol. * - `version`: the current major version of the signing domain. * * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart * contract upgrade]. */ constructor(string memory name, string memory version) { bytes32 hashedName = keccak256(bytes(name)); bytes32 hashedVersion = keccak256(bytes(version)); bytes32 typeHash = keccak256( "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)" ); _HASHED_NAME = hashedName; _HASHED_VERSION = hashedVersion; _CACHED_CHAIN_ID = block.chainid; _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion); _CACHED_THIS = address(this); _TYPE_HASH = typeHash; } /** * @dev Returns the domain separator for the current chain. */ function _domainSeparatorV4() internal view returns (bytes32) { if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) { return _CACHED_DOMAIN_SEPARATOR; } else { return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION); } } function _buildDomainSeparator( bytes32 typeHash, bytes32 nameHash, bytes32 versionHash ) private view returns (bytes32) { return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this))); } /** * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this * function returns the hash of the fully encoded EIP712 message for this domain. * * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example: * * ```solidity * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode( * keccak256("Mail(address to,string contents)"), * mailTo, * keccak256(bytes(mailContents)) * ))); * address signer = ECDSA.recover(digest, signature); * ``` */ function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) { return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/extensions/draft-ERC721Votes.sol) pragma solidity ^0.8.0; import "./ERC721.sol"; import "./Votes.sol"; /** * @dev Extension of ERC721 to support voting and delegation as implemented by {Votes}, where each individual NFT counts * as 1 vote unit. * * Tokens do not count as votes until they are delegated, because votes must be tracked which incurs an additional cost * on every transfer. Token holders can either delegate to a trusted representative who will decide how to make use of * the votes in governance decisions, or they can delegate to themselves to be their own representative. * * _Available since v4.5._ */ abstract contract ERC721Votes is ERC721, Votes { /** * @dev Adjusts votes when tokens are transferred. * * Emits a {Votes-DelegateVotesChanged} event. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { _transferVotingUnits(from, to, 1); super._afterTokenTransfer(from, to, tokenId); } /** * @dev Returns the balance of `account`. */ function _getVotingUnits(address account) internal view virtual override returns (uint256) { return balanceOf(account); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.3) (utils/cryptography/ECDSA.sol) pragma solidity ^0.8.0; import "./Strings.sol"; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } else if (error == RecoverError.InvalidSignatureV) { revert("ECDSA: invalid signature 'v' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. /// @solidity memory-safe-assembly assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address, RecoverError) { bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); uint8 v = uint8((uint256(vs) >> 255) + 27); return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } if (v != 27 && v != 28) { return (address(0), RecoverError.InvalidSignatureV); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Message, created from `s`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) 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 // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/ERC721.sol) 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: address zero is not a valid owner"); 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: invalid token ID"); 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) { _requireMinted(tokenId); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overridden 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 token owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token 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: caller is not token 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) { address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { /// @solidity memory-safe-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` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/extensions/ERC721Burnable.sol) pragma solidity ^0.8.0; import "./ERC721.sol"; import "./Context.sol"; /** * @title ERC721 Burnable Token * @dev ERC721 Token that can be burned (destroyed). */ abstract contract ERC721Burnable is Context, ERC721 { /** * @dev Burns `tokenId`. See {ERC721-_burn}. * * Requirements: * * - The caller must own `tokenId` or be an approved operator. */ function burn(uint256 tokenId) public virtual { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved"); _burn(tokenId); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/extensions/ERC721URIStorage.sol) pragma solidity ^0.8.0; import "./ERC721.sol"; /** * @dev ERC721 token with storage based token URI management. */ abstract contract ERC721URIStorage is ERC721 { using Strings for uint256; // Optional mapping for token URIs mapping(uint256 => string) private _tokenURIs; /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); string memory _tokenURI = _tokenURIs[tokenId]; string memory base = _baseURI(); // If there is no base URI, return the token URI. if (bytes(base).length == 0) { return _tokenURI; } // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked). if (bytes(_tokenURI).length > 0) { return string(abi.encodePacked(base, _tokenURI)); } return super.tokenURI(tokenId); } /** * @dev Sets `_tokenURI` as the tokenURI of `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual { require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token"); _tokenURIs[tokenId] = _tokenURI; } /** * @dev See {ERC721-_burn}. This override additionally checks to see if a * token-specific URI was set for the token, and if so, it deletes the token URI from * the storage mapping. */ function _burn(uint256 tokenId) internal virtual override { super._burn(tokenId); if (bytes(_tokenURIs[tokenId]).length != 0) { delete _tokenURIs[tokenId]; } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol) pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol) 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`. * * 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; /** * @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 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 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 the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) 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 // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (governance/utils/IVotes.sol) pragma solidity ^0.8.0; /** * @dev Common interface for {ERC20Votes}, {ERC721Votes}, and other {Votes}-enabled contracts. * * _Available since v4.5._ */ interface IVotes { /** * @dev Emitted when an account changes their delegate. */ event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate); /** * @dev Emitted when a token transfer or delegate change results in changes to a delegate's number of votes. */ event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance); /** * @dev Returns the current amount of votes that `account` has. */ function getVotes(address account) external view returns (uint256); /** * @dev Returns the amount of votes that `account` had at the end of a past block (`blockNumber`). */ function getPastVotes(address account, uint256 blockNumber) external view returns (uint256); /** * @dev Returns the total supply of votes available at the end of a past block (`blockNumber`). * * NOTE: This value is the sum of all available votes, which is not necessarily the sum of all delegated votes. * Votes that have not been delegated are still part of total supply, even though they would not participate in a * vote. */ function getPastTotalSupply(uint256 blockNumber) external view returns (uint256); /** * @dev Returns the delegate that `account` has chosen. */ function delegates(address account) external view returns (address); /** * @dev Delegates votes from the sender to `delegatee`. */ function delegate(address delegatee) external; /** * @dev Delegates votes from signer to `delegatee`. */ function delegateBySig( address delegatee, uint256 nonce, uint256 expiry, uint8 v, bytes32 r, bytes32 s ) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a >= b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv( uint256 x, uint256 y, uint256 denominator ) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv( uint256 x, uint256 y, uint256 denominator, Rounding rounding ) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. It the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. // We also know that `k`, the position of the most significant bit, is such that `msb(a) = 2**k`. // This gives `2**k < a <= 2**(k+1)` → `2**(k/2) <= sqrt(a) < 2 ** (k/2+1)`. // Using an algorithm similar to the msb conmputation, we are able to compute `result = 2**(k/2)` which is a // good first aproximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1; uint256 x = a; if (x >> 128 > 0) { x >>= 128; result <<= 64; } if (x >> 64 > 0) { x >>= 64; result <<= 32; } if (x >> 32 > 0) { x >>= 32; result <<= 16; } if (x >> 16 > 0) { x >>= 16; result <<= 8; } if (x >> 8 > 0) { x >>= 8; result <<= 4; } if (x >> 4 > 0) { x >>= 4; result <<= 2; } if (x >> 2 > 0) { result <<= 1; } // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { uint256 result = sqrt(a); if (rounding == Rounding.Up && result * result < a) { result += 1; } return result; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) pragma solidity ^0.8.0; import "./Context.sol"; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { require(paused(), "Pausable: not paused"); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/math/SafeCast.sol) pragma solidity ^0.8.0; /** * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow * checks. * * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can * easily result in undesired exploitation or bugs, since developers usually * assume that overflows raise errors. `SafeCast` restores this intuition by * reverting the transaction when such an operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. * * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing * all math on `uint256` and `int256` and then downcasting. */ library SafeCast { /** * @dev Returns the downcasted uint248 from uint256, reverting on * overflow (when the input is greater than largest uint248). * * Counterpart to Solidity's `uint248` operator. * * Requirements: * * - input must fit into 248 bits * * _Available since v4.7._ */ function toUint248(uint256 value) internal pure returns (uint248) { require(value <= type(uint248).max, "SafeCast: value doesn't fit in 248 bits"); return uint248(value); } /** * @dev Returns the downcasted uint240 from uint256, reverting on * overflow (when the input is greater than largest uint240). * * Counterpart to Solidity's `uint240` operator. * * Requirements: * * - input must fit into 240 bits * * _Available since v4.7._ */ function toUint240(uint256 value) internal pure returns (uint240) { require(value <= type(uint240).max, "SafeCast: value doesn't fit in 240 bits"); return uint240(value); } /** * @dev Returns the downcasted uint232 from uint256, reverting on * overflow (when the input is greater than largest uint232). * * Counterpart to Solidity's `uint232` operator. * * Requirements: * * - input must fit into 232 bits * * _Available since v4.7._ */ function toUint232(uint256 value) internal pure returns (uint232) { require(value <= type(uint232).max, "SafeCast: value doesn't fit in 232 bits"); return uint232(value); } /** * @dev Returns the downcasted uint224 from uint256, reverting on * overflow (when the input is greater than largest uint224). * * Counterpart to Solidity's `uint224` operator. * * Requirements: * * - input must fit into 224 bits * * _Available since v4.2._ */ function toUint224(uint256 value) internal pure returns (uint224) { require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); return uint224(value); } /** * @dev Returns the downcasted uint216 from uint256, reverting on * overflow (when the input is greater than largest uint216). * * Counterpart to Solidity's `uint216` operator. * * Requirements: * * - input must fit into 216 bits * * _Available since v4.7._ */ function toUint216(uint256 value) internal pure returns (uint216) { require(value <= type(uint216).max, "SafeCast: value doesn't fit in 216 bits"); return uint216(value); } /** * @dev Returns the downcasted uint208 from uint256, reverting on * overflow (when the input is greater than largest uint208). * * Counterpart to Solidity's `uint208` operator. * * Requirements: * * - input must fit into 208 bits * * _Available since v4.7._ */ function toUint208(uint256 value) internal pure returns (uint208) { require(value <= type(uint208).max, "SafeCast: value doesn't fit in 208 bits"); return uint208(value); } /** * @dev Returns the downcasted uint200 from uint256, reverting on * overflow (when the input is greater than largest uint200). * * Counterpart to Solidity's `uint200` operator. * * Requirements: * * - input must fit into 200 bits * * _Available since v4.7._ */ function toUint200(uint256 value) internal pure returns (uint200) { require(value <= type(uint200).max, "SafeCast: value doesn't fit in 200 bits"); return uint200(value); } /** * @dev Returns the downcasted uint192 from uint256, reverting on * overflow (when the input is greater than largest uint192). * * Counterpart to Solidity's `uint192` operator. * * Requirements: * * - input must fit into 192 bits * * _Available since v4.7._ */ function toUint192(uint256 value) internal pure returns (uint192) { require(value <= type(uint192).max, "SafeCast: value doesn't fit in 192 bits"); return uint192(value); } /** * @dev Returns the downcasted uint184 from uint256, reverting on * overflow (when the input is greater than largest uint184). * * Counterpart to Solidity's `uint184` operator. * * Requirements: * * - input must fit into 184 bits * * _Available since v4.7._ */ function toUint184(uint256 value) internal pure returns (uint184) { require(value <= type(uint184).max, "SafeCast: value doesn't fit in 184 bits"); return uint184(value); } /** * @dev Returns the downcasted uint176 from uint256, reverting on * overflow (when the input is greater than largest uint176). * * Counterpart to Solidity's `uint176` operator. * * Requirements: * * - input must fit into 176 bits * * _Available since v4.7._ */ function toUint176(uint256 value) internal pure returns (uint176) { require(value <= type(uint176).max, "SafeCast: value doesn't fit in 176 bits"); return uint176(value); } /** * @dev Returns the downcasted uint168 from uint256, reverting on * overflow (when the input is greater than largest uint168). * * Counterpart to Solidity's `uint168` operator. * * Requirements: * * - input must fit into 168 bits * * _Available since v4.7._ */ function toUint168(uint256 value) internal pure returns (uint168) { require(value <= type(uint168).max, "SafeCast: value doesn't fit in 168 bits"); return uint168(value); } /** * @dev Returns the downcasted uint160 from uint256, reverting on * overflow (when the input is greater than largest uint160). * * Counterpart to Solidity's `uint160` operator. * * Requirements: * * - input must fit into 160 bits * * _Available since v4.7._ */ function toUint160(uint256 value) internal pure returns (uint160) { require(value <= type(uint160).max, "SafeCast: value doesn't fit in 160 bits"); return uint160(value); } /** * @dev Returns the downcasted uint152 from uint256, reverting on * overflow (when the input is greater than largest uint152). * * Counterpart to Solidity's `uint152` operator. * * Requirements: * * - input must fit into 152 bits * * _Available since v4.7._ */ function toUint152(uint256 value) internal pure returns (uint152) { require(value <= type(uint152).max, "SafeCast: value doesn't fit in 152 bits"); return uint152(value); } /** * @dev Returns the downcasted uint144 from uint256, reverting on * overflow (when the input is greater than largest uint144). * * Counterpart to Solidity's `uint144` operator. * * Requirements: * * - input must fit into 144 bits * * _Available since v4.7._ */ function toUint144(uint256 value) internal pure returns (uint144) { require(value <= type(uint144).max, "SafeCast: value doesn't fit in 144 bits"); return uint144(value); } /** * @dev Returns the downcasted uint136 from uint256, reverting on * overflow (when the input is greater than largest uint136). * * Counterpart to Solidity's `uint136` operator. * * Requirements: * * - input must fit into 136 bits * * _Available since v4.7._ */ function toUint136(uint256 value) internal pure returns (uint136) { require(value <= type(uint136).max, "SafeCast: value doesn't fit in 136 bits"); return uint136(value); } /** * @dev Returns the downcasted uint128 from uint256, reverting on * overflow (when the input is greater than largest uint128). * * Counterpart to Solidity's `uint128` operator. * * Requirements: * * - input must fit into 128 bits * * _Available since v2.5._ */ function toUint128(uint256 value) internal pure returns (uint128) { require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); return uint128(value); } /** * @dev Returns the downcasted uint120 from uint256, reverting on * overflow (when the input is greater than largest uint120). * * Counterpart to Solidity's `uint120` operator. * * Requirements: * * - input must fit into 120 bits * * _Available since v4.7._ */ function toUint120(uint256 value) internal pure returns (uint120) { require(value <= type(uint120).max, "SafeCast: value doesn't fit in 120 bits"); return uint120(value); } /** * @dev Returns the downcasted uint112 from uint256, reverting on * overflow (when the input is greater than largest uint112). * * Counterpart to Solidity's `uint112` operator. * * Requirements: * * - input must fit into 112 bits * * _Available since v4.7._ */ function toUint112(uint256 value) internal pure returns (uint112) { require(value <= type(uint112).max, "SafeCast: value doesn't fit in 112 bits"); return uint112(value); } /** * @dev Returns the downcasted uint104 from uint256, reverting on * overflow (when the input is greater than largest uint104). * * Counterpart to Solidity's `uint104` operator. * * Requirements: * * - input must fit into 104 bits * * _Available since v4.7._ */ function toUint104(uint256 value) internal pure returns (uint104) { require(value <= type(uint104).max, "SafeCast: value doesn't fit in 104 bits"); return uint104(value); } /** * @dev Returns the downcasted uint96 from uint256, reverting on * overflow (when the input is greater than largest uint96). * * Counterpart to Solidity's `uint96` operator. * * Requirements: * * - input must fit into 96 bits * * _Available since v4.2._ */ function toUint96(uint256 value) internal pure returns (uint96) { require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); return uint96(value); } /** * @dev Returns the downcasted uint88 from uint256, reverting on * overflow (when the input is greater than largest uint88). * * Counterpart to Solidity's `uint88` operator. * * Requirements: * * - input must fit into 88 bits * * _Available since v4.7._ */ function toUint88(uint256 value) internal pure returns (uint88) { require(value <= type(uint88).max, "SafeCast: value doesn't fit in 88 bits"); return uint88(value); } /** * @dev Returns the downcasted uint80 from uint256, reverting on * overflow (when the input is greater than largest uint80). * * Counterpart to Solidity's `uint80` operator. * * Requirements: * * - input must fit into 80 bits * * _Available since v4.7._ */ function toUint80(uint256 value) internal pure returns (uint80) { require(value <= type(uint80).max, "SafeCast: value doesn't fit in 80 bits"); return uint80(value); } /** * @dev Returns the downcasted uint72 from uint256, reverting on * overflow (when the input is greater than largest uint72). * * Counterpart to Solidity's `uint72` operator. * * Requirements: * * - input must fit into 72 bits * * _Available since v4.7._ */ function toUint72(uint256 value) internal pure returns (uint72) { require(value <= type(uint72).max, "SafeCast: value doesn't fit in 72 bits"); return uint72(value); } /** * @dev Returns the downcasted uint64 from uint256, reverting on * overflow (when the input is greater than largest uint64). * * Counterpart to Solidity's `uint64` operator. * * Requirements: * * - input must fit into 64 bits * * _Available since v2.5._ */ function toUint64(uint256 value) internal pure returns (uint64) { require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); return uint64(value); } /** * @dev Returns the downcasted uint56 from uint256, reverting on * overflow (when the input is greater than largest uint56). * * Counterpart to Solidity's `uint56` operator. * * Requirements: * * - input must fit into 56 bits * * _Available since v4.7._ */ function toUint56(uint256 value) internal pure returns (uint56) { require(value <= type(uint56).max, "SafeCast: value doesn't fit in 56 bits"); return uint56(value); } /** * @dev Returns the downcasted uint48 from uint256, reverting on * overflow (when the input is greater than largest uint48). * * Counterpart to Solidity's `uint48` operator. * * Requirements: * * - input must fit into 48 bits * * _Available since v4.7._ */ function toUint48(uint256 value) internal pure returns (uint48) { require(value <= type(uint48).max, "SafeCast: value doesn't fit in 48 bits"); return uint48(value); } /** * @dev Returns the downcasted uint40 from uint256, reverting on * overflow (when the input is greater than largest uint40). * * Counterpart to Solidity's `uint40` operator. * * Requirements: * * - input must fit into 40 bits * * _Available since v4.7._ */ function toUint40(uint256 value) internal pure returns (uint40) { require(value <= type(uint40).max, "SafeCast: value doesn't fit in 40 bits"); return uint40(value); } /** * @dev Returns the downcasted uint32 from uint256, reverting on * overflow (when the input is greater than largest uint32). * * Counterpart to Solidity's `uint32` operator. * * Requirements: * * - input must fit into 32 bits * * _Available since v2.5._ */ function toUint32(uint256 value) internal pure returns (uint32) { require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); return uint32(value); } /** * @dev Returns the downcasted uint24 from uint256, reverting on * overflow (when the input is greater than largest uint24). * * Counterpart to Solidity's `uint24` operator. * * Requirements: * * - input must fit into 24 bits * * _Available since v4.7._ */ function toUint24(uint256 value) internal pure returns (uint24) { require(value <= type(uint24).max, "SafeCast: value doesn't fit in 24 bits"); return uint24(value); } /** * @dev Returns the downcasted uint16 from uint256, reverting on * overflow (when the input is greater than largest uint16). * * Counterpart to Solidity's `uint16` operator. * * Requirements: * * - input must fit into 16 bits * * _Available since v2.5._ */ function toUint16(uint256 value) internal pure returns (uint16) { require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); return uint16(value); } /** * @dev Returns the downcasted uint8 from uint256, reverting on * overflow (when the input is greater than largest uint8). * * Counterpart to Solidity's `uint8` operator. * * Requirements: * * - input must fit into 8 bits * * _Available since v2.5._ */ function toUint8(uint256 value) internal pure returns (uint8) { require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); return uint8(value); } /** * @dev Converts a signed int256 into an unsigned uint256. * * Requirements: * * - input must be greater than or equal to 0. * * _Available since v3.0._ */ function toUint256(int256 value) internal pure returns (uint256) { require(value >= 0, "SafeCast: value must be positive"); return uint256(value); } /** * @dev Returns the downcasted int248 from int256, reverting on * overflow (when the input is less than smallest int248 or * greater than largest int248). * * Counterpart to Solidity's `int248` operator. * * Requirements: * * - input must fit into 248 bits * * _Available since v4.7._ */ function toInt248(int256 value) internal pure returns (int248) { require(value >= type(int248).min && value <= type(int248).max, "SafeCast: value doesn't fit in 248 bits"); return int248(value); } /** * @dev Returns the downcasted int240 from int256, reverting on * overflow (when the input is less than smallest int240 or * greater than largest int240). * * Counterpart to Solidity's `int240` operator. * * Requirements: * * - input must fit into 240 bits * * _Available since v4.7._ */ function toInt240(int256 value) internal pure returns (int240) { require(value >= type(int240).min && value <= type(int240).max, "SafeCast: value doesn't fit in 240 bits"); return int240(value); } /** * @dev Returns the downcasted int232 from int256, reverting on * overflow (when the input is less than smallest int232 or * greater than largest int232). * * Counterpart to Solidity's `int232` operator. * * Requirements: * * - input must fit into 232 bits * * _Available since v4.7._ */ function toInt232(int256 value) internal pure returns (int232) { require(value >= type(int232).min && value <= type(int232).max, "SafeCast: value doesn't fit in 232 bits"); return int232(value); } /** * @dev Returns the downcasted int224 from int256, reverting on * overflow (when the input is less than smallest int224 or * greater than largest int224). * * Counterpart to Solidity's `int224` operator. * * Requirements: * * - input must fit into 224 bits * * _Available since v4.7._ */ function toInt224(int256 value) internal pure returns (int224) { require(value >= type(int224).min && value <= type(int224).max, "SafeCast: value doesn't fit in 224 bits"); return int224(value); } /** * @dev Returns the downcasted int216 from int256, reverting on * overflow (when the input is less than smallest int216 or * greater than largest int216). * * Counterpart to Solidity's `int216` operator. * * Requirements: * * - input must fit into 216 bits * * _Available since v4.7._ */ function toInt216(int256 value) internal pure returns (int216) { require(value >= type(int216).min && value <= type(int216).max, "SafeCast: value doesn't fit in 216 bits"); return int216(value); } /** * @dev Returns the downcasted int208 from int256, reverting on * overflow (when the input is less than smallest int208 or * greater than largest int208). * * Counterpart to Solidity's `int208` operator. * * Requirements: * * - input must fit into 208 bits * * _Available since v4.7._ */ function toInt208(int256 value) internal pure returns (int208) { require(value >= type(int208).min && value <= type(int208).max, "SafeCast: value doesn't fit in 208 bits"); return int208(value); } /** * @dev Returns the downcasted int200 from int256, reverting on * overflow (when the input is less than smallest int200 or * greater than largest int200). * * Counterpart to Solidity's `int200` operator. * * Requirements: * * - input must fit into 200 bits * * _Available since v4.7._ */ function toInt200(int256 value) internal pure returns (int200) { require(value >= type(int200).min && value <= type(int200).max, "SafeCast: value doesn't fit in 200 bits"); return int200(value); } /** * @dev Returns the downcasted int192 from int256, reverting on * overflow (when the input is less than smallest int192 or * greater than largest int192). * * Counterpart to Solidity's `int192` operator. * * Requirements: * * - input must fit into 192 bits * * _Available since v4.7._ */ function toInt192(int256 value) internal pure returns (int192) { require(value >= type(int192).min && value <= type(int192).max, "SafeCast: value doesn't fit in 192 bits"); return int192(value); } /** * @dev Returns the downcasted int184 from int256, reverting on * overflow (when the input is less than smallest int184 or * greater than largest int184). * * Counterpart to Solidity's `int184` operator. * * Requirements: * * - input must fit into 184 bits * * _Available since v4.7._ */ function toInt184(int256 value) internal pure returns (int184) { require(value >= type(int184).min && value <= type(int184).max, "SafeCast: value doesn't fit in 184 bits"); return int184(value); } /** * @dev Returns the downcasted int176 from int256, reverting on * overflow (when the input is less than smallest int176 or * greater than largest int176). * * Counterpart to Solidity's `int176` operator. * * Requirements: * * - input must fit into 176 bits * * _Available since v4.7._ */ function toInt176(int256 value) internal pure returns (int176) { require(value >= type(int176).min && value <= type(int176).max, "SafeCast: value doesn't fit in 176 bits"); return int176(value); } /** * @dev Returns the downcasted int168 from int256, reverting on * overflow (when the input is less than smallest int168 or * greater than largest int168). * * Counterpart to Solidity's `int168` operator. * * Requirements: * * - input must fit into 168 bits * * _Available since v4.7._ */ function toInt168(int256 value) internal pure returns (int168) { require(value >= type(int168).min && value <= type(int168).max, "SafeCast: value doesn't fit in 168 bits"); return int168(value); } /** * @dev Returns the downcasted int160 from int256, reverting on * overflow (when the input is less than smallest int160 or * greater than largest int160). * * Counterpart to Solidity's `int160` operator. * * Requirements: * * - input must fit into 160 bits * * _Available since v4.7._ */ function toInt160(int256 value) internal pure returns (int160) { require(value >= type(int160).min && value <= type(int160).max, "SafeCast: value doesn't fit in 160 bits"); return int160(value); } /** * @dev Returns the downcasted int152 from int256, reverting on * overflow (when the input is less than smallest int152 or * greater than largest int152). * * Counterpart to Solidity's `int152` operator. * * Requirements: * * - input must fit into 152 bits * * _Available since v4.7._ */ function toInt152(int256 value) internal pure returns (int152) { require(value >= type(int152).min && value <= type(int152).max, "SafeCast: value doesn't fit in 152 bits"); return int152(value); } /** * @dev Returns the downcasted int144 from int256, reverting on * overflow (when the input is less than smallest int144 or * greater than largest int144). * * Counterpart to Solidity's `int144` operator. * * Requirements: * * - input must fit into 144 bits * * _Available since v4.7._ */ function toInt144(int256 value) internal pure returns (int144) { require(value >= type(int144).min && value <= type(int144).max, "SafeCast: value doesn't fit in 144 bits"); return int144(value); } /** * @dev Returns the downcasted int136 from int256, reverting on * overflow (when the input is less than smallest int136 or * greater than largest int136). * * Counterpart to Solidity's `int136` operator. * * Requirements: * * - input must fit into 136 bits * * _Available since v4.7._ */ function toInt136(int256 value) internal pure returns (int136) { require(value >= type(int136).min && value <= type(int136).max, "SafeCast: value doesn't fit in 136 bits"); return int136(value); } /** * @dev Returns the downcasted int128 from int256, reverting on * overflow (when the input is less than smallest int128 or * greater than largest int128). * * Counterpart to Solidity's `int128` operator. * * Requirements: * * - input must fit into 128 bits * * _Available since v3.1._ */ function toInt128(int256 value) internal pure returns (int128) { require(value >= type(int128).min && value <= type(int128).max, "SafeCast: value doesn't fit in 128 bits"); return int128(value); } /** * @dev Returns the downcasted int120 from int256, reverting on * overflow (when the input is less than smallest int120 or * greater than largest int120). * * Counterpart to Solidity's `int120` operator. * * Requirements: * * - input must fit into 120 bits * * _Available since v4.7._ */ function toInt120(int256 value) internal pure returns (int120) { require(value >= type(int120).min && value <= type(int120).max, "SafeCast: value doesn't fit in 120 bits"); return int120(value); } /** * @dev Returns the downcasted int112 from int256, reverting on * overflow (when the input is less than smallest int112 or * greater than largest int112). * * Counterpart to Solidity's `int112` operator. * * Requirements: * * - input must fit into 112 bits * * _Available since v4.7._ */ function toInt112(int256 value) internal pure returns (int112) { require(value >= type(int112).min && value <= type(int112).max, "SafeCast: value doesn't fit in 112 bits"); return int112(value); } /** * @dev Returns the downcasted int104 from int256, reverting on * overflow (when the input is less than smallest int104 or * greater than largest int104). * * Counterpart to Solidity's `int104` operator. * * Requirements: * * - input must fit into 104 bits * * _Available since v4.7._ */ function toInt104(int256 value) internal pure returns (int104) { require(value >= type(int104).min && value <= type(int104).max, "SafeCast: value doesn't fit in 104 bits"); return int104(value); } /** * @dev Returns the downcasted int96 from int256, reverting on * overflow (when the input is less than smallest int96 or * greater than largest int96). * * Counterpart to Solidity's `int96` operator. * * Requirements: * * - input must fit into 96 bits * * _Available since v4.7._ */ function toInt96(int256 value) internal pure returns (int96) { require(value >= type(int96).min && value <= type(int96).max, "SafeCast: value doesn't fit in 96 bits"); return int96(value); } /** * @dev Returns the downcasted int88 from int256, reverting on * overflow (when the input is less than smallest int88 or * greater than largest int88). * * Counterpart to Solidity's `int88` operator. * * Requirements: * * - input must fit into 88 bits * * _Available since v4.7._ */ function toInt88(int256 value) internal pure returns (int88) { require(value >= type(int88).min && value <= type(int88).max, "SafeCast: value doesn't fit in 88 bits"); return int88(value); } /** * @dev Returns the downcasted int80 from int256, reverting on * overflow (when the input is less than smallest int80 or * greater than largest int80). * * Counterpart to Solidity's `int80` operator. * * Requirements: * * - input must fit into 80 bits * * _Available since v4.7._ */ function toInt80(int256 value) internal pure returns (int80) { require(value >= type(int80).min && value <= type(int80).max, "SafeCast: value doesn't fit in 80 bits"); return int80(value); } /** * @dev Returns the downcasted int72 from int256, reverting on * overflow (when the input is less than smallest int72 or * greater than largest int72). * * Counterpart to Solidity's `int72` operator. * * Requirements: * * - input must fit into 72 bits * * _Available since v4.7._ */ function toInt72(int256 value) internal pure returns (int72) { require(value >= type(int72).min && value <= type(int72).max, "SafeCast: value doesn't fit in 72 bits"); return int72(value); } /** * @dev Returns the downcasted int64 from int256, reverting on * overflow (when the input is less than smallest int64 or * greater than largest int64). * * Counterpart to Solidity's `int64` operator. * * Requirements: * * - input must fit into 64 bits * * _Available since v3.1._ */ function toInt64(int256 value) internal pure returns (int64) { require(value >= type(int64).min && value <= type(int64).max, "SafeCast: value doesn't fit in 64 bits"); return int64(value); } /** * @dev Returns the downcasted int56 from int256, reverting on * overflow (when the input is less than smallest int56 or * greater than largest int56). * * Counterpart to Solidity's `int56` operator. * * Requirements: * * - input must fit into 56 bits * * _Available since v4.7._ */ function toInt56(int256 value) internal pure returns (int56) { require(value >= type(int56).min && value <= type(int56).max, "SafeCast: value doesn't fit in 56 bits"); return int56(value); } /** * @dev Returns the downcasted int48 from int256, reverting on * overflow (when the input is less than smallest int48 or * greater than largest int48). * * Counterpart to Solidity's `int48` operator. * * Requirements: * * - input must fit into 48 bits * * _Available since v4.7._ */ function toInt48(int256 value) internal pure returns (int48) { require(value >= type(int48).min && value <= type(int48).max, "SafeCast: value doesn't fit in 48 bits"); return int48(value); } /** * @dev Returns the downcasted int40 from int256, reverting on * overflow (when the input is less than smallest int40 or * greater than largest int40). * * Counterpart to Solidity's `int40` operator. * * Requirements: * * - input must fit into 40 bits * * _Available since v4.7._ */ function toInt40(int256 value) internal pure returns (int40) { require(value >= type(int40).min && value <= type(int40).max, "SafeCast: value doesn't fit in 40 bits"); return int40(value); } /** * @dev Returns the downcasted int32 from int256, reverting on * overflow (when the input is less than smallest int32 or * greater than largest int32). * * Counterpart to Solidity's `int32` operator. * * Requirements: * * - input must fit into 32 bits * * _Available since v3.1._ */ function toInt32(int256 value) internal pure returns (int32) { require(value >= type(int32).min && value <= type(int32).max, "SafeCast: value doesn't fit in 32 bits"); return int32(value); } /** * @dev Returns the downcasted int24 from int256, reverting on * overflow (when the input is less than smallest int24 or * greater than largest int24). * * Counterpart to Solidity's `int24` operator. * * Requirements: * * - input must fit into 24 bits * * _Available since v4.7._ */ function toInt24(int256 value) internal pure returns (int24) { require(value >= type(int24).min && value <= type(int24).max, "SafeCast: value doesn't fit in 24 bits"); return int24(value); } /** * @dev Returns the downcasted int16 from int256, reverting on * overflow (when the input is less than smallest int16 or * greater than largest int16). * * Counterpart to Solidity's `int16` operator. * * Requirements: * * - input must fit into 16 bits * * _Available since v3.1._ */ function toInt16(int256 value) internal pure returns (int16) { require(value >= type(int16).min && value <= type(int16).max, "SafeCast: value doesn't fit in 16 bits"); return int16(value); } /** * @dev Returns the downcasted int8 from int256, reverting on * overflow (when the input is less than smallest int8 or * greater than largest int8). * * Counterpart to Solidity's `int8` operator. * * Requirements: * * - input must fit into 8 bits * * _Available since v3.1._ */ function toInt8(int256 value) internal pure returns (int8) { require(value >= type(int8).min && value <= type(int8).max, "SafeCast: value doesn't fit in 8 bits"); return int8(value); } /** * @dev Converts an unsigned uint256 into a signed int256. * * Requirements: * * - input must be less than or equal to maxInt256. * * _Available since v3.0._ */ function toInt256(uint256 value) internal pure returns (int256) { // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); return int256(value); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (governance/utils/Votes.sol) pragma solidity ^0.8.0; import "./Context.sol"; import "./Counters.sol"; import "./Checkpoints.sol"; import "./draft-EIP712.sol"; import "./IVotes.sol"; /** * @dev This is a base abstract contract that tracks voting units, which are a measure of voting power that can be * transferred, and provides a system of vote delegation, where an account can delegate its voting units to a sort of * "representative" that will pool delegated voting units from different accounts and can then use it to vote in * decisions. In fact, voting units _must_ be delegated in order to count as actual votes, and an account has to * delegate those votes to itself if it wishes to participate in decisions and does not have a trusted representative. * * This contract is often combined with a token contract such that voting units correspond to token units. For an * example, see {ERC721Votes}. * * The full history of delegate votes is tracked on-chain so that governance protocols can consider votes as distributed * at a particular block number to protect against flash loans and double voting. The opt-in delegate system makes the * cost of this history tracking optional. * * When using this module the derived contract must implement {_getVotingUnits} (for example, make it return * {ERC721-balanceOf}), and can use {_transferVotingUnits} to track a change in the distribution of those units (in the * previous example, it would be included in {ERC721-_beforeTokenTransfer}). * * _Available since v4.5._ */ abstract contract Votes is IVotes, Context, EIP712 { using Checkpoints for Checkpoints.History; using Counters for Counters.Counter; bytes32 private constant _DELEGATION_TYPEHASH = keccak256("Delegation(address delegatee,uint256 nonce,uint256 expiry)"); mapping(address => address) private _delegation; mapping(address => Checkpoints.History) private _delegateCheckpoints; Checkpoints.History private _totalCheckpoints; mapping(address => Counters.Counter) private _nonces; /** * @dev Returns the current amount of votes that `account` has. */ function getVotes(address account) public view virtual override returns (uint256) { return _delegateCheckpoints[account].latest(); } /** * @dev Returns the amount of votes that `account` had at the end of a past block (`blockNumber`). * * Requirements: * * - `blockNumber` must have been already mined */ function getPastVotes(address account, uint256 blockNumber) public view virtual override returns (uint256) { return _delegateCheckpoints[account].getAtBlock(blockNumber); } /** * @dev Returns the total supply of votes available at the end of a past block (`blockNumber`). * * NOTE: This value is the sum of all available votes, which is not necessarily the sum of all delegated votes. * Votes that have not been delegated are still part of total supply, even though they would not participate in a * vote. * * Requirements: * * - `blockNumber` must have been already mined */ function getPastTotalSupply(uint256 blockNumber) public view virtual override returns (uint256) { require(blockNumber < block.number, "Votes: block not yet mined"); return _totalCheckpoints.getAtBlock(blockNumber); } /** * @dev Returns the current total supply of votes. */ function _getTotalSupply() internal view virtual returns (uint256) { return _totalCheckpoints.latest(); } /** * @dev Returns the delegate that `account` has chosen. */ function delegates(address account) public view virtual override returns (address) { return _delegation[account]; } /** * @dev Delegates votes from the sender to `delegatee`. */ function delegate(address delegatee) public virtual override { address account = _msgSender(); _delegate(account, delegatee); } /** * @dev Delegates votes from signer to `delegatee`. */ function delegateBySig( address delegatee, uint256 nonce, uint256 expiry, uint8 v, bytes32 r, bytes32 s ) public virtual override { require(block.timestamp <= expiry, "Votes: signature expired"); address signer = ECDSA.recover( _hashTypedDataV4(keccak256(abi.encode(_DELEGATION_TYPEHASH, delegatee, nonce, expiry))), v, r, s ); require(nonce == _useNonce(signer), "Votes: invalid nonce"); _delegate(signer, delegatee); } /** * @dev Delegate all of `account`'s voting units to `delegatee`. * * Emits events {DelegateChanged} and {DelegateVotesChanged}. */ function _delegate(address account, address delegatee) internal virtual { address oldDelegate = delegates(account); _delegation[account] = delegatee; emit DelegateChanged(account, oldDelegate, delegatee); _moveDelegateVotes(oldDelegate, delegatee, _getVotingUnits(account)); } /** * @dev Transfers, mints, or burns voting units. To register a mint, `from` should be zero. To register a burn, `to` * should be zero. Total supply of voting units will be adjusted with mints and burns. */ function _transferVotingUnits( address from, address to, uint256 amount ) internal virtual { if (from == address(0)) { _totalCheckpoints.push(_add, amount); } if (to == address(0)) { _totalCheckpoints.push(_subtract, amount); } _moveDelegateVotes(delegates(from), delegates(to), amount); } /** * @dev Moves delegated votes from one delegate to another. */ function _moveDelegateVotes( address from, address to, uint256 amount ) private { if (from != to && amount > 0) { if (from != address(0)) { (uint256 oldValue, uint256 newValue) = _delegateCheckpoints[from].push(_subtract, amount); emit DelegateVotesChanged(from, oldValue, newValue); } if (to != address(0)) { (uint256 oldValue, uint256 newValue) = _delegateCheckpoints[to].push(_add, amount); emit DelegateVotesChanged(to, oldValue, newValue); } } } function _add(uint256 a, uint256 b) private pure returns (uint256) { return a + b; } function _subtract(uint256 a, uint256 b) private pure returns (uint256) { return a - b; } /** * @dev Consumes a nonce. * * Returns the current value and increments nonce. */ function _useNonce(address owner) internal virtual returns (uint256 current) { Counters.Counter storage nonce = _nonces[owner]; current = nonce.current(); nonce.increment(); } /** * @dev Returns an address nonce. */ function nonces(address owner) public view virtual returns (uint256) { return _nonces[owner].current(); } /** * @dev Returns the contract's {EIP712} domain separator. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32) { return _domainSeparatorV4(); } /** * @dev Must return the voting units held by an account. */ function _getVotingUnits(address) internal view virtual returns (uint256); }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"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":"delegator","type":"address"},{"indexed":true,"internalType":"address","name":"fromDelegate","type":"address"},{"indexed":true,"internalType":"address","name":"toDelegate","type":"address"}],"name":"DelegateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegate","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBalance","type":"uint256"}],"name":"DelegateVotesChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAUSER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"}],"name":"delegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"delegateBySig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"delegates","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getPastTotalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getPastVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"uri","type":"string"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6101406040523480156200001257600080fd5b506040518060400160405280600981526020017f54697069436861696e00000000000000000000000000000000000000000000008152506040518060400160405280600181526020017f31000000000000000000000000000000000000000000000000000000000000008152506040518060400160405280600981526020017f54697069436861696e00000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f54495049000000000000000000000000000000000000000000000000000000008152508160009080519060200190620001039291906200040f565b5080600190805190602001906200011c9291906200040f565b5050506000600760006101000a81548160ff02191690831515021790555060008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260e081815250508161010081815250504660a08181525050620001a38184846200026e60201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff1660601b815250508061012081815250505050505050620002046000801b33620002aa60201b60201c565b620002367f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a33620002aa60201b60201c565b620002687f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a633620002aa60201b60201c565b620005fc565b600083838346306040516020016200028b959493929190620004f2565b6040516020818303038152906040528051906020012090509392505050565b620002bc82826200039c60201b60201c565b620003985760016008600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506200033d6200040760201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b60006008600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600033905090565b8280546200041d9062000597565b90600052602060002090601f0160209004810192826200044157600085556200048d565b82601f106200045c57805160ff19168380011785556200048d565b828001600101855582156200048d579182015b828111156200048c5782518255916020019190600101906200046f565b5b5090506200049c9190620004a0565b5090565b5b80821115620004bb576000816000905550600101620004a1565b5090565b620004ca816200054f565b82525050565b620004db8162000563565b82525050565b620004ec816200058d565b82525050565b600060a082019050620005096000830188620004d0565b620005186020830187620004d0565b620005276040830186620004d0565b620005366060830185620004e1565b620005456080830184620004bf565b9695505050505050565b60006200055c826200056d565b9050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006002820490506001821680620005b057607f821691505b60208210811415620005c757620005c6620005cd565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60805160a05160c05160601c60e05161010051610120516154cc6200064f6000396000611822015260006118640152600061184301526000611778015260006117ce015260006117f701526154cc6000f3fe608060405234801561001057600080fd5b50600436106102065760003560e01c806370a082311161011a578063a22cb465116100ad578063cd279c7c1161007c578063cd279c7c1461060d578063d539139314610629578063d547741f14610647578063e63ab1e914610663578063e985e9c51461068157610206565b8063a22cb46514610589578063b88d4fde146105a5578063c3cda520146105c1578063c87b56dd146105dd57610206565b806391d14854116100e957806391d14854146104ed57806395d89b411461051d5780639ab24eb01461053b578063a217fddf1461056b57610206565b806370a08231146104535780637ecebe00146104835780638456cb59146104b35780638e539e8c146104bd57610206565b806336568abe1161019d57806342966c681161016c57806342966c681461039d578063587cde1e146103b95780635c19a95c146103e95780635c975abb146104055780636352211e1461042357610206565b806336568abe1461032b5780633a46b1a8146103475780633f4ba83a1461037757806342842e0e1461038157610206565b806323b872dd116101d957806323b872dd146102a5578063248a9ca3146102c15780632f2ff15d146102f15780633644e5151461030d57610206565b806301ffc9a71461020b57806306fdde031461023b578063081812fc14610259578063095ea7b314610289575b600080fd5b61022560048036038101906102209190613d45565b6106b1565b60405161023291906143c4565b60405180910390f35b6102436106c3565b60405161025091906144d7565b60405180910390f35b610273600480360381019061026e9190613d9f565b610755565b604051610280919061435d565b60405180910390f35b6102a3600480360381019061029e9190613b9c565b61079b565b005b6102bf60048036038101906102ba9190613a86565b6108b3565b005b6102db60048036038101906102d69190613cd8565b610913565b6040516102e891906143df565b60405180910390f35b61030b60048036038101906103069190613d05565b610933565b005b610315610954565b60405161032291906143df565b60405180910390f35b61034560048036038101906103409190613d05565b610963565b005b610361600480360381019061035c9190613b9c565b6109e6565b60405161036e9190614839565b60405180910390f35b61037f610a41565b005b61039b60048036038101906103969190613a86565b610a76565b005b6103b760048036038101906103b29190613d9f565b610a96565b005b6103d360048036038101906103ce9190613a19565b610af2565b6040516103e0919061435d565b60405180910390f35b61040360048036038101906103fe9190613a19565b610b5b565b005b61040d610b75565b60405161041a91906143c4565b60405180910390f35b61043d60048036038101906104389190613d9f565b610b8c565b60405161044a919061435d565b60405180910390f35b61046d60048036038101906104689190613a19565b610c3e565b60405161047a9190614839565b60405180910390f35b61049d60048036038101906104989190613a19565b610cf6565b6040516104aa9190614839565b60405180910390f35b6104bb610d46565b005b6104d760048036038101906104d29190613d9f565b610d7b565b6040516104e49190614839565b60405180910390f35b61050760048036038101906105029190613d05565b610dda565b60405161051491906143c4565b60405180910390f35b610525610e45565b60405161053291906144d7565b60405180910390f35b61055560048036038101906105509190613a19565b610ed7565b6040516105629190614839565b60405180910390f35b610573610f27565b60405161058091906143df565b60405180910390f35b6105a3600480360381019061059e9190613b5c565b610f2e565b005b6105bf60048036038101906105ba9190613ad9565b610f44565b005b6105db60048036038101906105d69190613c4b565b610fa6565b005b6105f760048036038101906105f29190613d9f565b6110aa565b60405161060491906144d7565b60405180910390f35b61062760048036038101906106229190613bdc565b6110bc565b005b610631611100565b60405161063e91906143df565b60405180910390f35b610661600480360381019061065c9190613d05565b611124565b005b61066b611145565b60405161067891906143df565b60405180910390f35b61069b60048036038101906106969190613a46565b611169565b6040516106a891906143c4565b60405180910390f35b60006106bc826111fd565b9050919050565b6060600080546106d290614b53565b80601f01602080910402602001604051908101604052809291908181526020018280546106fe90614b53565b801561074b5780601f106107205761010080835404028352916020019161074b565b820191906000526020600020905b81548152906001019060200180831161072e57829003601f168201915b5050505050905090565b600061076082611277565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107a682610b8c565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610817576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161080e906147b9565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108366112c2565b73ffffffffffffffffffffffffffffffffffffffff16148061086557506108648161085f6112c2565b611169565b5b6108a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089b90614739565b60405180910390fd5b6108ae83836112ca565b505050565b6108c46108be6112c2565b82611383565b610903576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108fa906147f9565b60405180910390fd5b61090e838383611418565b505050565b600060086000838152602001908152602001600020600101549050919050565b61093c82610913565b6109458161167f565b61094f8383611693565b505050565b600061095e611774565b905090565b61096b6112c2565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146109d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109cf90614819565b60405180910390fd5b6109e2828261188e565b5050565b6000610a3982600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061197090919063ffffffff16565b905092915050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610a6b8161167f565b610a73611ac8565b50565b610a9183838360405180602001604052806000815250610f44565b505050565b610aa7610aa16112c2565b82611383565b610ae6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610add906147f9565b60405180910390fd5b610aef81611b2b565b50565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b656112c2565b9050610b718183611b37565b5050565b6000600760009054906101000a900460ff16905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610c35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2c90614799565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610caf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca690614699565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000610d3f600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611c4b565b9050919050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610d708161167f565b610d78611c59565b50565b6000438210610dbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db6906146f9565b60405180910390fd5b610dd382600b61197090919063ffffffff16565b9050919050565b60006008600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060018054610e5490614b53565b80601f0160208091040260200160405190810160405280929190818152602001828054610e8090614b53565b8015610ecd5780601f10610ea257610100808354040283529160200191610ecd565b820191906000526020600020905b815481529060010190602001808311610eb057829003601f168201915b5050505050905090565b6000610f20600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611cbc565b9050919050565b6000801b81565b610f40610f396112c2565b8383611d57565b5050565b610f55610f4f6112c2565b83611383565b610f94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8b906147f9565b60405180910390fd5b610fa084848484611ec4565b50505050565b83421115610fe9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe0906146b9565b60405180910390fd5b600061104b6110437fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf89898960405160200161102894939291906143fa565b60405160208183030381529060405280519060200120611f20565b858585611f3a565b905061105681611f65565b8614611097576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108e90614559565b60405180910390fd5b6110a18188611b37565b50505050505050565b60606110b582611fc3565b9050919050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a66110e68161167f565b6110f084846120d6565b6110fa83836120f4565b50505050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b61112d82610913565b6111368161167f565b611140838361188e565b505050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611270575061126f82612168565b5b9050919050565b6112808161224a565b6112bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b690614799565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661133d83610b8c565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008061138f83610b8c565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806113d157506113d08185611169565b5b8061140f57508373ffffffffffffffffffffffffffffffffffffffff166113f784610755565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661143882610b8c565b73ffffffffffffffffffffffffffffffffffffffff161461148e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611485906145b9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f5906145f9565b60405180910390fd5b6115098383836122b6565b6115146000826112ca565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546115649190614a28565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546115bb9190614947565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461167a8383836122ce565b505050565b6116908161168b6112c2565b6122de565b50565b61169d8282610dda565b6117705760016008600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506117156112c2565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff161480156117f057507f000000000000000000000000000000000000000000000000000000000000000046145b1561181d577f0000000000000000000000000000000000000000000000000000000000000000905061188b565b6118887f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000061237b565b90505b90565b6118988282610dda565b1561196c5760006008600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506119116112c2565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b60004382106119b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ab90614659565b60405180910390fd5b60008360000180549050905060005b81811015611a385760006119d782846123b5565b9050848660000182815481106119f0576119ef614cf6565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff161115611a2257809250611a32565b600181611a2f9190614947565b91505b506119c3565b60008214611a9d5784600001600183611a519190614a28565b81548110611a6257611a61614cf6565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16611aa0565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169250505092915050565b611ad06123db565b6000600760006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611b146112c2565b604051611b21919061435d565b60405180910390a1565b611b3481612424565b50565b6000611b4283610af2565b905081600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f60405160405180910390a4611c468183611c4186612477565b612489565b505050565b600081600001549050919050565b611c61612696565b6001600760006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611ca56112c2565b604051611cb2919061435d565b60405180910390a1565b6000808260000180549050905060008114611d2e5782600001600182611ce29190614a28565b81548110611cf357611cf2614cf6565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16611d31565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16915050919050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611dc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dbd90614619565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611eb791906143c4565b60405180910390a3505050565b611ecf848484611418565b611edb848484846126e0565b611f1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1190614599565b60405180910390fd5b50505050565b6000611f33611f2d611774565b83612877565b9050919050565b6000806000611f4b878787876128aa565b91509150611f58816129b7565b8192505050949350505050565b600080600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050611fb281611c4b565b9150611fbd81612b8c565b50919050565b6060611fce82611277565b6000600660008481526020019081526020016000208054611fee90614b53565b80601f016020809104026020016040519081016040528092919081815260200182805461201a90614b53565b80156120675780601f1061203c57610100808354040283529160200191612067565b820191906000526020600020905b81548152906001019060200180831161204a57829003601f168201915b505050505090506000612078612ba2565b905060008151141561208e5781925050506120d1565b6000825111156120c35780826040516020016120ab9291906142c8565b604051602081830303815290604052925050506120d1565b6120cc84612bdf565b925050505b919050565b6120f0828260405180602001604052806000815250612c47565b5050565b6120fd8261224a565b61213c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612133906146d9565b60405180910390fd5b806006600084815260200190815260200160002090805190602001906121639291906137c3565b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061223357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612243575061224282612ca2565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6122be612696565b6122c9838383612d0c565b505050565b6122d9838383612d11565b505050565b6122e88282610dda565b6123775761230d8173ffffffffffffffffffffffffffffffffffffffff166014612d2d565b61231b8360001c6020612d2d565b60405160200161232c929190614323565b6040516020818303038152906040526040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236e91906144d7565b60405180910390fd5b5050565b6000838383463060405160200161239695949392919061443f565b6040516020818303038152906040528051906020012090509392505050565b600060028284186123c6919061499d565b8284166123d39190614947565b905092915050565b6123e3610b75565b612422576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241990614539565b60405180910390fd5b565b61242d81612f69565b600060066000838152602001908152602001600020805461244d90614b53565b905014612474576006600082815260200190815260200160002060006124739190613849565b5b50565b600061248282610c3e565b9050919050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156124c55750600081115b1561269157600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146125ad5760008061255661308684600a60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061309c9092919063ffffffff16565b915091508473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516125a2929190614854565b60405180910390a250505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612690576000806126396130ca84600a60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061309c9092919063ffffffff16565b915091508373ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051612685929190614854565b60405180910390a250505b5b505050565b61269e610b75565b156126de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126d590614679565b60405180910390fd5b565b60006127018473ffffffffffffffffffffffffffffffffffffffff166130e0565b1561286a578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261272a6112c2565b8786866040518563ffffffff1660e01b815260040161274c9493929190614378565b602060405180830381600087803b15801561276657600080fd5b505af192505050801561279757506040513d601f19601f820116820180604052508101906127949190613d72565b60015b61281a573d80600081146127c7576040519150601f19603f3d011682016040523d82523d6000602084013e6127cc565b606091505b50600081511415612812576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161280990614599565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061286f565b600190505b949350505050565b6000828260405160200161288c9291906142ec565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156128e55760006003915091506129ae565b601b8560ff16141580156128fd5750601c8560ff1614155b1561290f5760006004915091506129ae565b6000600187878787604051600081526020016040526040516129349493929190614492565b6020604051602081039080840390855afa158015612956573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156129a5576000600192509250506129ae565b80600092509250505b94509492505050565b600060048111156129cb576129ca614c98565b5b8160048111156129de576129dd614c98565b5b14156129e957612b89565b600160048111156129fd576129fc614c98565b5b816004811115612a1057612a0f614c98565b5b1415612a51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a48906144f9565b60405180910390fd5b60026004811115612a6557612a64614c98565b5b816004811115612a7857612a77614c98565b5b1415612ab9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ab090614579565b60405180910390fd5b60036004811115612acd57612acc614c98565b5b816004811115612ae057612adf614c98565b5b1415612b21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1890614639565b60405180910390fd5b600480811115612b3457612b33614c98565b5b816004811115612b4757612b46614c98565b5b1415612b88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b7f90614719565b60405180910390fd5b5b50565b6001816000016000828254019250508190555050565b60606040518060400160405280601e81526020017f68747470733a2f2f74697069636861696e2e636f6d2f6e66742f3f69643d0000815250905090565b6060612bea82611277565b6000612bf4612ba2565b90506000815111612c145760405180602001604052806000815250612c3f565b80612c1e84613103565b604051602001612c2f9291906142c8565b6040516020818303038152906040525b915050919050565b612c518383613264565b612c5e60008484846126e0565b612c9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c9490614599565b60405180910390fd5b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050565b612d1d8383600161343e565b612d288383836134fe565b505050565b606060006002836002612d4091906149ce565b612d4a9190614947565b67ffffffffffffffff811115612d6357612d62614d25565b5b6040519080825280601f01601f191660200182016040528015612d955781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612dcd57612dcc614cf6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612e3157612e30614cf6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002612e7191906149ce565b612e7b9190614947565b90505b6001811115612f1b577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110612ebd57612ebc614cf6565b5b1a60f81b828281518110612ed457612ed3614cf6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080612f1490614b29565b9050612e7e565b5060008414612f5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f5690614519565b60405180910390fd5b8091505092915050565b6000612f7482610b8c565b9050612f82816000846122b6565b612f8d6000836112ca565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612fdd9190614a28565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613082816000846122ce565b5050565b600081836130949190614a28565b905092915050565b6000806130be856130b96130af88611cbc565b868863ffffffff16565b613503565b91509150935093915050565b600081836130d89190614947565b905092915050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6060600082141561314b576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061325f565b600082905060005b6000821461317d57808061316690614bb6565b915050600a82613176919061499d565b9150613153565b60008167ffffffffffffffff81111561319957613198614d25565b5b6040519080825280601f01601f1916602001820160405280156131cb5781602001600182028036833780820191505090505b5090505b60008514613258576001826131e49190614a28565b9150600a856131f39190614c09565b60306131ff9190614947565b60f81b81838151811061321557613214614cf6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85613251919061499d565b94506131cf565b8093505050505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156132d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132cb90614759565b60405180910390fd5b6132dd8161224a565b1561331d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613314906145d9565b60405180910390fd5b613329600083836122b6565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546133799190614947565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461343a600083836122ce565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561348e5761348b6130ca82600b61309c9092919063ffffffff16565b50505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156134de576134db61308682600b61309c9092919063ffffffff16565b50505b6134f96134ea84610af2565b6134f384610af2565b83612489565b505050565b505050565b600080600084600001805490509050600061351d86611cbc565b90506000821180156135735750438660000160018461353c9190614a28565b8154811061354d5761354c614cf6565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff16145b156136035761358185613705565b866000016001846135929190614a28565b815481106135a3576135a2614cf6565b5b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1602179055506136f6565b85600001604051806040016040528061361b43613770565b63ffffffff16815260200161362f88613705565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b80859350935050509250929050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8016821115613768576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161375f90614779565b60405180910390fd5b819050919050565b600063ffffffff80168211156137bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137b2906147d9565b60405180910390fd5b819050919050565b8280546137cf90614b53565b90600052602060002090601f0160209004810192826137f15760008555613838565b82601f1061380a57805160ff1916838001178555613838565b82800160010185558215613838579182015b8281111561383757825182559160200191906001019061381c565b5b5090506138459190613889565b5090565b50805461385590614b53565b6000825580601f106138675750613886565b601f0160209004906000526020600020908101906138859190613889565b5b50565b5b808211156138a257600081600090555060010161388a565b5090565b60006138b96138b4846148a2565b61487d565b9050828152602081018484840111156138d5576138d4614d59565b5b6138e0848285614ae7565b509392505050565b60006138fb6138f6846148d3565b61487d565b90508281526020810184848401111561391757613916614d59565b5b613922848285614ae7565b509392505050565b6000813590506139398161540c565b92915050565b60008135905061394e81615423565b92915050565b6000813590506139638161543a565b92915050565b60008135905061397881615451565b92915050565b60008151905061398d81615451565b92915050565b600082601f8301126139a8576139a7614d54565b5b81356139b88482602086016138a6565b91505092915050565b600082601f8301126139d6576139d5614d54565b5b81356139e68482602086016138e8565b91505092915050565b6000813590506139fe81615468565b92915050565b600081359050613a138161547f565b92915050565b600060208284031215613a2f57613a2e614d63565b5b6000613a3d8482850161392a565b91505092915050565b60008060408385031215613a5d57613a5c614d63565b5b6000613a6b8582860161392a565b9250506020613a7c8582860161392a565b9150509250929050565b600080600060608486031215613a9f57613a9e614d63565b5b6000613aad8682870161392a565b9350506020613abe8682870161392a565b9250506040613acf868287016139ef565b9150509250925092565b60008060008060808587031215613af357613af2614d63565b5b6000613b018782880161392a565b9450506020613b128782880161392a565b9350506040613b23878288016139ef565b925050606085013567ffffffffffffffff811115613b4457613b43614d5e565b5b613b5087828801613993565b91505092959194509250565b60008060408385031215613b7357613b72614d63565b5b6000613b818582860161392a565b9250506020613b928582860161393f565b9150509250929050565b60008060408385031215613bb357613bb2614d63565b5b6000613bc18582860161392a565b9250506020613bd2858286016139ef565b9150509250929050565b600080600060608486031215613bf557613bf4614d63565b5b6000613c038682870161392a565b9350506020613c14868287016139ef565b925050604084013567ffffffffffffffff811115613c3557613c34614d5e565b5b613c41868287016139c1565b9150509250925092565b60008060008060008060c08789031215613c6857613c67614d63565b5b6000613c7689828a0161392a565b9650506020613c8789828a016139ef565b9550506040613c9889828a016139ef565b9450506060613ca989828a01613a04565b9350506080613cba89828a01613954565b92505060a0613ccb89828a01613954565b9150509295509295509295565b600060208284031215613cee57613ced614d63565b5b6000613cfc84828501613954565b91505092915050565b60008060408385031215613d1c57613d1b614d63565b5b6000613d2a85828601613954565b9250506020613d3b8582860161392a565b9150509250929050565b600060208284031215613d5b57613d5a614d63565b5b6000613d6984828501613969565b91505092915050565b600060208284031215613d8857613d87614d63565b5b6000613d968482850161397e565b91505092915050565b600060208284031215613db557613db4614d63565b5b6000613dc3848285016139ef565b91505092915050565b613dd581614a5c565b82525050565b613de481614a6e565b82525050565b613df381614a7a565b82525050565b613e0a613e0582614a7a565b614bff565b82525050565b6000613e1b82614904565b613e25818561491a565b9350613e35818560208601614af6565b613e3e81614d68565b840191505092915050565b6000613e548261490f565b613e5e818561492b565b9350613e6e818560208601614af6565b613e7781614d68565b840191505092915050565b6000613e8d8261490f565b613e97818561493c565b9350613ea7818560208601614af6565b80840191505092915050565b6000613ec060188361492b565b9150613ecb82614d79565b602082019050919050565b6000613ee360208361492b565b9150613eee82614da2565b602082019050919050565b6000613f0660148361492b565b9150613f1182614dcb565b602082019050919050565b6000613f2960148361492b565b9150613f3482614df4565b602082019050919050565b6000613f4c601f8361492b565b9150613f5782614e1d565b602082019050919050565b6000613f6f60328361492b565b9150613f7a82614e46565b604082019050919050565b6000613f9260258361492b565b9150613f9d82614e95565b604082019050919050565b6000613fb5601c8361492b565b9150613fc082614ee4565b602082019050919050565b6000613fd860028361493c565b9150613fe382614f0d565b600282019050919050565b6000613ffb60248361492b565b915061400682614f36565b604082019050919050565b600061401e60198361492b565b915061402982614f85565b602082019050919050565b600061404160228361492b565b915061404c82614fae565b604082019050919050565b600061406460208361492b565b915061406f82614ffd565b602082019050919050565b600061408760108361492b565b915061409282615026565b602082019050919050565b60006140aa60298361492b565b91506140b58261504f565b604082019050919050565b60006140cd60188361492b565b91506140d88261509e565b602082019050919050565b60006140f0602e8361492b565b91506140fb826150c7565b604082019050919050565b6000614113601a8361492b565b915061411e82615116565b602082019050919050565b600061413660228361492b565b91506141418261513f565b604082019050919050565b6000614159603e8361492b565b91506141648261518e565b604082019050919050565b600061417c60208361492b565b9150614187826151dd565b602082019050919050565b600061419f60278361492b565b91506141aa82615206565b604082019050919050565b60006141c260188361492b565b91506141cd82615255565b602082019050919050565b60006141e560218361492b565b91506141f08261527e565b604082019050919050565b600061420860268361492b565b9150614213826152cd565b604082019050919050565b600061422b60178361493c565b91506142368261531c565b601782019050919050565b600061424e602e8361492b565b915061425982615345565b604082019050919050565b600061427160118361493c565b915061427c82615394565b601182019050919050565b6000614294602f8361492b565b915061429f826153bd565b604082019050919050565b6142b381614ad0565b82525050565b6142c281614ada565b82525050565b60006142d48285613e82565b91506142e08284613e82565b91508190509392505050565b60006142f782613fcb565b91506143038285613df9565b6020820191506143138284613df9565b6020820191508190509392505050565b600061432e8261421e565b915061433a8285613e82565b915061434582614264565b91506143518284613e82565b91508190509392505050565b60006020820190506143726000830184613dcc565b92915050565b600060808201905061438d6000830187613dcc565b61439a6020830186613dcc565b6143a760408301856142aa565b81810360608301526143b98184613e10565b905095945050505050565b60006020820190506143d96000830184613ddb565b92915050565b60006020820190506143f46000830184613dea565b92915050565b600060808201905061440f6000830187613dea565b61441c6020830186613dcc565b61442960408301856142aa565b61443660608301846142aa565b95945050505050565b600060a0820190506144546000830188613dea565b6144616020830187613dea565b61446e6040830186613dea565b61447b60608301856142aa565b6144886080830184613dcc565b9695505050505050565b60006080820190506144a76000830187613dea565b6144b460208301866142b9565b6144c16040830185613dea565b6144ce6060830184613dea565b95945050505050565b600060208201905081810360008301526144f18184613e49565b905092915050565b6000602082019050818103600083015261451281613eb3565b9050919050565b6000602082019050818103600083015261453281613ed6565b9050919050565b6000602082019050818103600083015261455281613ef9565b9050919050565b6000602082019050818103600083015261457281613f1c565b9050919050565b6000602082019050818103600083015261459281613f3f565b9050919050565b600060208201905081810360008301526145b281613f62565b9050919050565b600060208201905081810360008301526145d281613f85565b9050919050565b600060208201905081810360008301526145f281613fa8565b9050919050565b6000602082019050818103600083015261461281613fee565b9050919050565b6000602082019050818103600083015261463281614011565b9050919050565b6000602082019050818103600083015261465281614034565b9050919050565b6000602082019050818103600083015261467281614057565b9050919050565b600060208201905081810360008301526146928161407a565b9050919050565b600060208201905081810360008301526146b28161409d565b9050919050565b600060208201905081810360008301526146d2816140c0565b9050919050565b600060208201905081810360008301526146f2816140e3565b9050919050565b6000602082019050818103600083015261471281614106565b9050919050565b6000602082019050818103600083015261473281614129565b9050919050565b600060208201905081810360008301526147528161414c565b9050919050565b600060208201905081810360008301526147728161416f565b9050919050565b6000602082019050818103600083015261479281614192565b9050919050565b600060208201905081810360008301526147b2816141b5565b9050919050565b600060208201905081810360008301526147d2816141d8565b9050919050565b600060208201905081810360008301526147f2816141fb565b9050919050565b6000602082019050818103600083015261481281614241565b9050919050565b6000602082019050818103600083015261483281614287565b9050919050565b600060208201905061484e60008301846142aa565b92915050565b600060408201905061486960008301856142aa565b61487660208301846142aa565b9392505050565b6000614887614898565b90506148938282614b85565b919050565b6000604051905090565b600067ffffffffffffffff8211156148bd576148bc614d25565b5b6148c682614d68565b9050602081019050919050565b600067ffffffffffffffff8211156148ee576148ed614d25565b5b6148f782614d68565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061495282614ad0565b915061495d83614ad0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561499257614991614c3a565b5b828201905092915050565b60006149a882614ad0565b91506149b383614ad0565b9250826149c3576149c2614c69565b5b828204905092915050565b60006149d982614ad0565b91506149e483614ad0565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614a1d57614a1c614c3a565b5b828202905092915050565b6000614a3382614ad0565b9150614a3e83614ad0565b925082821015614a5157614a50614c3a565b5b828203905092915050565b6000614a6782614ab0565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015614b14578082015181840152602081019050614af9565b83811115614b23576000848401525b50505050565b6000614b3482614ad0565b91506000821415614b4857614b47614c3a565b5b600182039050919050565b60006002820490506001821680614b6b57607f821691505b60208210811415614b7f57614b7e614cc7565b5b50919050565b614b8e82614d68565b810181811067ffffffffffffffff82111715614bad57614bac614d25565b5b80604052505050565b6000614bc182614ad0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614bf457614bf3614c3a565b5b600182019050919050565b6000819050919050565b6000614c1482614ad0565b9150614c1f83614ad0565b925082614c2f57614c2e614c69565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f566f7465733a20696e76616c6964206e6f6e6365000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f436865636b706f696e74733a20626c6f636b206e6f7420796574206d696e6564600082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f566f7465733a207369676e617475726520657870697265640000000000000000600082015250565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b7f566f7465733a20626c6f636b206e6f7420796574206d696e6564000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203260008201527f3234206269747300000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203360008201527f3220626974730000000000000000000000000000000000000000000000000000602082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b61541581614a5c565b811461542057600080fd5b50565b61542c81614a6e565b811461543757600080fd5b50565b61544381614a7a565b811461544e57600080fd5b50565b61545a81614a84565b811461546557600080fd5b50565b61547181614ad0565b811461547c57600080fd5b50565b61548881614ada565b811461549357600080fd5b5056fea2646970667358221220d79d4d5220e13c992159dd55bc8f0b234a7dd1c9f399f28b08adfb6d19e7046a64736f6c63430008070033
Deployed ByteCode Sourcemap
312:1942:20:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2050:202;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2405:98:7;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3870:167;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3402:407;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4547:327;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4356:129:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4781:145;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7370:104:21;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5890:214:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2581:184:21;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;992:75:20;;;:::i;:::-;;4940:179:7;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;517:239:8;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3740:127:21;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3949:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1608:84:17;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2125:218:7;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1864:204;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7116:117:21;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;915:71:20;;;:::i;:::-;;3228:236:21;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2860:145:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2567:102:7;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2225:144:21;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1992:49:0;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4104:153:7;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5185:315;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4174:564:21;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1855:189:20;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1073:190;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;495:62;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5206:147:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;427:62:20;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4323:162:7;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2050:202:20;2182:4;2209:36;2233:11;2209:23;:36::i;:::-;2202:43;;2050:202;;;:::o;2405:98:7:-;2459:13;2491:5;2484:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2405:98;:::o;3870:167::-;3946:7;3965:23;3980:7;3965:14;:23::i;:::-;4006:15;:24;4022:7;4006:24;;;;;;;;;;;;;;;;;;;;;3999:31;;3870:167;;;:::o;3402:407::-;3482:13;3498:23;3513:7;3498:14;:23::i;:::-;3482:39;;3545:5;3539:11;;:2;:11;;;;3531:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;3636:5;3620:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;3645:37;3662:5;3669:12;:10;:12::i;:::-;3645:16;:37::i;:::-;3620:62;3599:171;;;;;;;;;;;;:::i;:::-;;;;;;;;;3781:21;3790:2;3794:7;3781:8;:21::i;:::-;3472:337;3402:407;;:::o;4547:327::-;4736:41;4755:12;:10;:12::i;:::-;4769:7;4736:18;:41::i;:::-;4728:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;4839:28;4849:4;4855:2;4859:7;4839:9;:28::i;:::-;4547:327;;;:::o;4356:129:0:-;4430:7;4456:6;:12;4463:4;4456:12;;;;;;;;;;;:22;;;4449:29;;4356:129;;;:::o;4781:145::-;4864:18;4877:4;4864:12;:18::i;:::-;2470:16;2481:4;2470:10;:16::i;:::-;4894:25:::1;4905:4;4911:7;4894:10;:25::i;:::-;4781:145:::0;;;:::o;7370:104:21:-;7421:7;7447:20;:18;:20::i;:::-;7440:27;;7370:104;:::o;5890:214:0:-;5996:12;:10;:12::i;:::-;5985:23;;:7;:23;;;5977:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;6071:26;6083:4;6089:7;6071:11;:26::i;:::-;5890:214;;:::o;2581:184:21:-;2679:7;2705:53;2746:11;2705:20;:29;2726:7;2705:29;;;;;;;;;;;;;;;:40;;:53;;;;:::i;:::-;2698:60;;2581:184;;;;:::o;992:75:20:-;465:24;2470:16:0;2481:4;2470:10;:16::i;:::-;1050:10:20::1;:8;:10::i;:::-;992:75:::0;:::o;4940:179:7:-;5073:39;5090:4;5096:2;5100:7;5073:39;;;;;;;;;;;;:16;:39::i;:::-;4940:179;;;:::o;517:239:8:-;633:41;652:12;:10;:12::i;:::-;666:7;633:18;:41::i;:::-;625:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;735:14;741:7;735:5;:14::i;:::-;517:239;:::o;3740:127:21:-;3814:7;3840:11;:20;3852:7;3840:20;;;;;;;;;;;;;;;;;;;;;;;;;3833:27;;3740:127;;;:::o;3949:147::-;4020:15;4038:12;:10;:12::i;:::-;4020:30;;4060:29;4070:7;4079:9;4060;:29::i;:::-;4010:86;3949:147;:::o;1608:84:17:-;1655:4;1678:7;;;;;;;;;;;1671:14;;1608:84;:::o;2125:218:7:-;2197:7;2216:13;2232:7;:16;2240:7;2232:16;;;;;;;;;;;;;;;;;;;;;2216:32;;2283:1;2266:19;;:5;:19;;;;2258:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;2331:5;2324:12;;;2125:218;;;:::o;1864:204::-;1936:7;1980:1;1963:19;;:5;:19;;;;1955:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2045:9;:16;2055:5;2045:16;;;;;;;;;;;;;;;;2038:23;;1864:204;;;:::o;7116:117:21:-;7176:7;7202:24;:7;:14;7210:5;7202:14;;;;;;;;;;;;;;;:22;:24::i;:::-;7195:31;;7116:117;;;:::o;915:71:20:-;465:24;2470:16:0;2481:4;2470:10;:16::i;:::-;971:8:20::1;:6;:8::i;:::-;915:71:::0;:::o;3228:236:21:-;3315:7;3356:12;3342:11;:26;3334:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;3416:41;3445:11;3416:17;:28;;:41;;;;:::i;:::-;3409:48;;3228:236;;;:::o;2860:145:0:-;2946:4;2969:6;:12;2976:4;2969:12;;;;;;;;;;;:20;;:29;2990:7;2969:29;;;;;;;;;;;;;;;;;;;;;;;;;2962:36;;2860:145;;;;:::o;2567:102:7:-;2623:13;2655:7;2648:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2567:102;:::o;2225:144:21:-;2298:7;2324:38;:20;:29;2345:7;2324:29;;;;;;;;;;;;;;;:36;:38::i;:::-;2317:45;;2225:144;;;:::o;1992:49:0:-;2037:4;1992:49;;;:::o;4104:153:7:-;4198:52;4217:12;:10;:12::i;:::-;4231:8;4241;4198:18;:52::i;:::-;4104:153;;:::o;5185:315::-;5353:41;5372:12;:10;:12::i;:::-;5386:7;5353:18;:41::i;:::-;5345:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;5455:38;5469:4;5475:2;5479:7;5488:4;5455:13;:38::i;:::-;5185:315;;;;:::o;4174:564:21:-;4393:6;4374:15;:25;;4366:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;4438:14;4455:169;4482:87;1825:71;4542:9;4553:5;4560:6;4509:58;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;4499:69;;;;;;4482:16;:87::i;:::-;4583:1;4598;4613;4455:13;:169::i;:::-;4438:186;;4651:17;4661:6;4651:9;:17::i;:::-;4642:5;:26;4634:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;4703:28;4713:6;4721:9;4703;:28::i;:::-;4356:382;4174:564;;;;;;:::o;1855:189:20:-;1978:13;2014:23;2029:7;2014:14;:23::i;:::-;2007:30;;1855:189;;;:::o;1073:190::-;533:24;2470:16:0;2481:4;2470:10;:16::i;:::-;1198:22:20::1;1208:2;1212:7;1198:9;:22::i;:::-;1230:26;1243:7;1252:3;1230:12;:26::i;:::-;1073:190:::0;;;;:::o;495:62::-;533:24;495:62;:::o;5206:147:0:-;5290:18;5303:4;5290:12;:18::i;:::-;2470:16;2481:4;2470:10;:16::i;:::-;5320:26:::1;5332:4;5338:7;5320:11;:26::i;:::-;5206:147:::0;;;:::o;427:62:20:-;465:24;427:62;:::o;4323:162:7:-;4420:4;4443:18;:25;4462:5;4443:25;;;;;;;;;;;;;;;:35;4469:8;4443:35;;;;;;;;;;;;;;;;;;;;;;;;;4436:42;;4323:162;;;;:::o;2571:202:0:-;2656:4;2694:32;2679:47;;;:11;:47;;;;:87;;;;2730:36;2754:11;2730:23;:36::i;:::-;2679:87;2672:94;;2571:202;;;:::o;11592:133:7:-;11673:16;11681:7;11673;:16::i;:::-;11665:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;11592:133;:::o;640:96:3:-;693:7;719:10;712:17;;640:96;:::o;10894:171:7:-;10995:2;10968:15;:24;10984:7;10968:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;11050:7;11046:2;11012:46;;11021:23;11036:7;11021:14;:23::i;:::-;11012:46;;;;;;;;;;;;10894:171;;:::o;7252:261::-;7345:4;7361:13;7377:23;7392:7;7377:14;:23::i;:::-;7361:39;;7429:5;7418:16;;:7;:16;;;:52;;;;7438:32;7455:5;7462:7;7438:16;:32::i;:::-;7418:52;:87;;;;7498:7;7474:31;;:20;7486:7;7474:11;:20::i;:::-;:31;;;7418:87;7410:96;;;7252:261;;;;:::o;10177:605::-;10331:4;10304:31;;:23;10319:7;10304:14;:23::i;:::-;:31;;;10296:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;10409:1;10395:16;;:2;:16;;;;10387:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;10463:39;10484:4;10490:2;10494:7;10463:20;:39::i;:::-;10564:29;10581:1;10585:7;10564:8;:29::i;:::-;10623:1;10604:9;:15;10614:4;10604:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;10651:1;10634:9;:13;10644:2;10634:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;10681:2;10662:7;:16;10670:7;10662:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;10718:7;10714:2;10699:27;;10708:4;10699:27;;;;;;;;;;;;10737:38;10757:4;10763:2;10767:7;10737:19;:38::i;:::-;10177:605;;;:::o;3299:103:0:-;3365:30;3376:4;3382:12;:10;:12::i;:::-;3365:10;:30::i;:::-;3299:103;:::o;7439:233::-;7522:22;7530:4;7536:7;7522;:22::i;:::-;7517:149;;7592:4;7560:6;:12;7567:4;7560:12;;;;;;;;;;;:20;;:29;7581:7;7560:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;7642:12;:10;:12::i;:::-;7615:40;;7633:7;7615:40;;7627:4;7615:40;;;;;;;;;;7517:149;7439:233;;:::o;3143:308:22:-;3196:7;3236:12;3219:29;;3227:4;3219:29;;;:66;;;;;3269:16;3252:13;:33;3219:66;3215:230;;;3308:24;3301:31;;;;3215:230;3370:64;3392:10;3404:12;3418:15;3370:21;:64::i;:::-;3363:71;;3143:308;;:::o;7843:234:0:-;7926:22;7934:4;7940:7;7926;:22::i;:::-;7922:149;;;7996:5;7964:6;:12;7971:4;7964:12;;;;;;;;;;;:20;;:29;7985:7;7964:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;8047:12;:10;:12::i;:::-;8020:40;;8038:7;8020:40;;8032:4;8020:40;;;;;;;;;;7922:149;7843:234;;:::o;1271:578:2:-;1357:7;1398:12;1384:11;:26;1376:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;1458:12;1473:4;:17;;:24;;;;1458:39;;1507:11;1532:244;1545:4;1539:3;:10;1532:244;;;1565:11;1579:23;1592:3;1597:4;1579:12;:23::i;:::-;1565:37;;1658:11;1620:4;:17;;1638:3;1620:22;;;;;;;;:::i;:::-;;;;;;;;;:35;;;;;;;;;;;;:49;;;1616:150;;;1696:3;1689:10;;1616:150;;;1750:1;1744:3;:7;;;;:::i;:::-;1738:13;;1616:150;1551:225;1532:244;;;1800:1;1792:4;:9;:50;;1808:4;:17;;1833:1;1826:4;:8;;;;:::i;:::-;1808:27;;;;;;;;:::i;:::-;;;;;;;;;:34;;;;;;;;;;;;1792:50;;;1804:1;1792:50;1785:57;;;;;;1271:578;;;;:::o;2426:117:17:-;1479:16;:14;:16::i;:::-;2494:5:::1;2484:7;;:15;;;;;;;;;;;;;;;;;;2514:22;2523:12;:10;:12::i;:::-;2514:22;;;;;;:::i;:::-;;;;;;;;2426:117::o:0;1736:113:20:-;1822:20;1834:7;1822:11;:20::i;:::-;1736:113;:::o;4902:313:21:-;4984:19;5006:18;5016:7;5006:9;:18::i;:::-;4984:40;;5057:9;5034:11;:20;5046:7;5034:20;;;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;5120:9;5082:48;;5107:11;5082:48;;5098:7;5082:48;;;;;;;;;;;;5140:68;5159:11;5172:9;5183:24;5199:7;5183:15;:24::i;:::-;5140:18;:68::i;:::-;4974:241;4902:313;;:::o;827:112:4:-;892:7;918;:14;;;911:21;;827:112;;;:::o;2179:115:17:-;1232:19;:17;:19::i;:::-;2248:4:::1;2238:7;;:14;;;;;;;;;;;;;;;;;;2267:20;2274:12;:10;:12::i;:::-;2267:20;;;;;;:::i;:::-;;;;;;;;2179:115::o:0;891:190:2:-;952:7;971:11;985:4;:17;;:24;;;;971:38;;1033:1;1026:3;:8;:48;;1041:4;:17;;1065:1;1059:3;:7;;;;:::i;:::-;1041:26;;;;;;;;:::i;:::-;;;;;;;;;:33;;;;;;;;;;;;1026:48;;;1037:1;1026:48;1019:55;;;;;891:190;;;:::o;11201:307:7:-;11351:8;11342:17;;:5;:17;;;;11334:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;11437:8;11399:18;:25;11418:5;11399:25;;;;;;;;;;;;;;;:35;11425:8;11399:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;11482:8;11460:41;;11475:5;11460:41;;;11492:8;11460:41;;;;;;:::i;:::-;;;;;;;;11201:307;;;:::o;6361:305::-;6511:28;6521:4;6527:2;6531:7;6511:9;:28::i;:::-;6557:47;6580:4;6586:2;6590:7;6599:4;6557:22;:47::i;:::-;6549:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;6361:305;;;;:::o;4339:165:22:-;4416:7;4442:55;4464:20;:18;:20::i;:::-;4486:10;4442:21;:55::i;:::-;4435:62;;4339:165;;;:::o;6902:270:5:-;7025:7;7045:17;7064:18;7086:25;7097:4;7103:1;7106;7109;7086:10;:25::i;:::-;7044:67;;;;7121:18;7133:5;7121:11;:18::i;:::-;7156:9;7149:16;;;;6902:270;;;;;;:::o;6853:203:21:-;6913:15;6940:30;6973:7;:14;6981:5;6973:14;;;;;;;;;;;;;;;6940:47;;7007:15;:5;:13;:15::i;:::-;6997:25;;7032:17;:5;:15;:17::i;:::-;6930:126;6853:203;;;:::o;481:608:9:-;554:13;579:23;594:7;579:14;:23::i;:::-;613;639:10;:19;650:7;639:19;;;;;;;;;;;613:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;668:18;689:10;:8;:10::i;:::-;668:31;;794:1;778:4;772:18;:23;768:70;;;818:9;811:16;;;;;;768:70;966:1;946:9;940:23;:27;936:106;;;1014:4;1020:9;997:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;983:48;;;;;;936:106;1059:23;1074:7;1059:14;:23::i;:::-;1052:30;;;;481:608;;;;:::o;7843:108:7:-;7918:26;7928:2;7932:7;7918:26;;;;;;;;;;;;:9;:26::i;:::-;7843:108;;:::o;1236:214:9:-;1335:16;1343:7;1335;:16::i;:::-;1327:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;1434:9;1412:10;:19;1423:7;1412:19;;;;;;;;;;;:31;;;;;;;;;;;;:::i;:::-;;1236:214;;:::o;1505:300:7:-;1607:4;1657:25;1642:40;;;:11;:40;;;;:104;;;;1713:33;1698:48;;;:11;:48;;;;1642:104;:156;;;;1762:36;1786:11;1762:23;:36::i;:::-;1642:156;1623:175;;1505:300;;;:::o;6969:125::-;7034:4;7085:1;7057:30;;:7;:16;7065:7;7057:16;;;;;;;;;;;;;;;;;;;;;:30;;;;7050:37;;6969:125;;;:::o;1269:195:20:-;1232:19:17;:17;:19::i;:::-;1412:45:20::1;1439:4;1445:2;1449:7;1412:26;:45::i;:::-;1269:195:::0;;;:::o;1538:192::-;1679:44;1705:4;1711:2;1715:7;1679:25;:44::i;:::-;1538:192;;;:::o;3683:492:0:-;3771:22;3779:4;3785:7;3771;:22::i;:::-;3766:403;;3954:41;3982:7;3954:41;;3992:2;3954:19;:41::i;:::-;4066:38;4094:4;4086:13;;4101:2;4066:19;:38::i;:::-;3861:265;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3809:349;;;;;;;;;;;:::i;:::-;;;;;;;;3766:403;3683:492;;:::o;3457:257:22:-;3597:7;3644:8;3654;3664:11;3677:13;3700:4;3633:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3623:84;;;;;;3616:91;;3457:257;;;;;:::o;806:153:16:-;868:7;951:1;946;942;:5;941:11;;;;:::i;:::-;936:1;932;:5;931:21;;;;:::i;:::-;924:28;;806:153;;;;:::o;1938:106:17:-;2004:8;:6;:8::i;:::-;1996:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;1938:106::o;1668:200:9:-;1736:20;1748:7;1736:11;:20::i;:::-;1808:1;1777:10;:19;1788:7;1777:19;;;;;;;;;;;1771:33;;;;;:::i;:::-;;;:38;1767:95;;1832:10;:19;1843:7;1832:19;;;;;;;;;;;;1825:26;;;;:::i;:::-;1767:95;1668:200;:::o;1207:133:23:-;1289:7;1315:18;1325:7;1315:9;:18::i;:::-;1308:25;;1207:133;;;:::o;5920:610:21:-;6050:2;6042:10;;:4;:10;;;;:24;;;;;6065:1;6056:6;:10;6042:24;6038:486;;;6102:1;6086:18;;:4;:18;;;6082:215;;6125:16;6143;6163:50;6195:9;6206:6;6163:20;:26;6184:4;6163:26;;;;;;;;;;;;;;;:31;;:50;;;;;:::i;:::-;6124:89;;;;6257:4;6236:46;;;6263:8;6273;6236:46;;;;;;;:::i;:::-;;;;;;;;6106:191;;6082:215;6328:1;6314:16;;:2;:16;;;6310:204;;6351:16;6369;6389:43;6419:4;6425:6;6389:20;:24;6410:2;6389:24;;;;;;;;;;;;;;;:29;;:43;;;;;:::i;:::-;6350:82;;;;6476:2;6455:44;;;6480:8;6490;6455:44;;;;;;;:::i;:::-;;;;;;;;6332:182;;6310:204;6038:486;5920:610;;;:::o;1760:106:17:-;1830:8;:6;:8::i;:::-;1829:9;1821:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;1760:106::o;12277:831:7:-;12426:4;12446:15;:2;:13;;;:15::i;:::-;12442:660;;;12497:2;12481:36;;;12518:12;:10;:12::i;:::-;12532:4;12538:7;12547:4;12481:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;12477:573;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12736:1;12719:6;:13;:18;12715:321;;;12761:60;;;;;;;;;;:::i;:::-;;;;;;;;12715:321;12988:6;12982:13;12973:6;12969:2;12965:15;12958:38;12477:573;12612:41;;;12602:51;;;:6;:51;;;;12595:58;;;;;12442:660;13087:4;13080:11;;12277:831;;;;;;;:::o;8547:194:5:-;8640:7;8705:15;8722:10;8676:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;8666:68;;;;;;8659:75;;8547:194;;;;:::o;5166:1603::-;5292:7;5301:12;6216:66;6211:1;6203:10;;:79;6199:161;;;6314:1;6318:30;6298:51;;;;;;6199:161;6378:2;6373:1;:7;;;;:18;;;;;6389:2;6384:1;:7;;;;6373:18;6369:100;;;6423:1;6427:30;6407:51;;;;;;6369:100;6563:14;6580:24;6590:4;6596:1;6599;6602;6580:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6563:41;;6636:1;6618:20;;:6;:20;;;6614:101;;;6670:1;6674:29;6654:50;;;;;;;6614:101;6733:6;6741:20;6725:37;;;;;5166:1603;;;;;;;;:::o;547:631::-;624:20;615:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;611:561;;;660:7;;611:561;720:29;711:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;707:465;;;765:34;;;;;;;;;;:::i;:::-;;;;;;;;707:465;829:35;820:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;816:356;;;880:41;;;;;;;;;;:::i;:::-;;;;;;;;816:356;951:30;942:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;938:234;;;997:44;;;;;;;;;;:::i;:::-;;;;;;;;938:234;1071:30;1062:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;1058:114;;;1117:44;;;;;;;;;;:::i;:::-;;;;;;;;1058:114;547:631;;:::o;945:123:4:-;1050:1;1032:7;:14;;;:19;;;;;;;;;;;945:123;:::o;786::20:-;838:13;863:39;;;;;;;;;;;;;;;;;;;786:123;:::o;2735:276:7:-;2808:13;2833:23;2848:7;2833:14;:23::i;:::-;2867:21;2891:10;:8;:10::i;:::-;2867:34;;2942:1;2924:7;2918:21;:25;:86;;;;;;;;;;;;;;;;;2970:7;2979:18;:7;:16;:18::i;:::-;2953:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2918:86;2911:93;;;2735:276;;;:::o;8172:309::-;8296:18;8302:2;8306:7;8296:5;:18::i;:::-;8345:53;8376:1;8380:2;8384:7;8393:4;8345:22;:53::i;:::-;8324:150;;;;;;;;;;;;:::i;:::-;;;;;;;;;8172:309;;;:::o;829:155:6:-;914:4;952:25;937:40;;;:11;:40;;;;930:47;;829:155;;;:::o;13664:122:7:-;;;;:::o;907:232:23:-;1045:33;1066:4;1072:2;1076:1;1045:20;:33::i;:::-;1088:44;1114:4;1120:2;1124:7;1088:25;:44::i;:::-;907:232;;;:::o;1652:441:19:-;1727:13;1752:19;1797:1;1788:6;1784:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;1774:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1752:47;;1809:15;:6;1816:1;1809:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;1834;:6;1841:1;1834:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;1864:9;1889:1;1880:6;1876:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;1864:26;;1859:132;1896:1;1892;:5;1859:132;;;1930:12;1951:3;1943:5;:11;1930:25;;;;;;;:::i;:::-;;;;;1918:6;1925:1;1918:9;;;;;;;;:::i;:::-;;;;;:37;;;;;;;;;;;1979:1;1969:11;;;;;1899:3;;;;:::i;:::-;;;1859:132;;;;2017:1;2008:5;:10;2000:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;2079:6;2065:21;;;1652:441;;;;:::o;9447:406:7:-;9506:13;9522:23;9537:7;9522:14;:23::i;:::-;9506:39;;9556:48;9577:5;9592:1;9596:7;9556:20;:48::i;:::-;9642:29;9659:1;9663:7;9642:8;:29::i;:::-;9702:1;9682:9;:16;9692:5;9682:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;9720:7;:16;9728:7;9720:16;;;;;;;;;;;;9713:23;;;;;;;;;;;9780:7;9776:1;9752:36;;9761:5;9752:36;;;;;;;;;;;;9799:47;9819:5;9834:1;9838:7;9799:19;:47::i;:::-;9496:357;9447:406;:::o;6638:101:21:-;6701:7;6731:1;6727;:5;;;;:::i;:::-;6720:12;;6638:101;;;;:::o;2812:230:2:-;2965:7;2974;3000:35;3005:4;3011:23;3014:12;3021:4;3014:6;:12::i;:::-;3028:5;3011:2;:23;;:::i;:::-;3000:4;:35::i;:::-;2993:42;;;;2812:230;;;;;;:::o;6536:96:21:-;6594:7;6624:1;6620;:5;;;;:::i;:::-;6613:12;;6536:96;;;;:::o;1175:320:1:-;1235:4;1487:1;1465:7;:19;;;:23;1458:30;;1175:320;;;:::o;392:703:19:-;448:13;674:1;665:5;:10;661:51;;;691:10;;;;;;;;;;;;;;;;;;;;;661:51;721:12;736:5;721:20;;751:14;775:75;790:1;782:4;:9;775:75;;807:8;;;;;:::i;:::-;;;;837:2;829:10;;;;;:::i;:::-;;;775:75;;;859:19;891:6;881:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;859:39;;908:150;924:1;915:5;:10;908:150;;951:1;941:11;;;;;:::i;:::-;;;1017:2;1009:5;:10;;;;:::i;:::-;996:2;:24;;;;:::i;:::-;983:39;;966:6;973;966:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1045:2;1036:11;;;;;:::i;:::-;;;908:150;;;1081:6;1067:21;;;;;392:703;;;;:::o;8803:427:7:-;8896:1;8882:16;;:2;:16;;;;8874:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;8954:16;8962:7;8954;:16::i;:::-;8953:17;8945:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;9014:45;9043:1;9047:2;9051:7;9014:20;:45::i;:::-;9087:1;9070:9;:13;9080:2;9070:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;9117:2;9098:7;:16;9106:7;9098:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;9160:7;9156:2;9135:33;;9152:1;9135:33;;;;;;;;;;;;9179:44;9207:1;9211:2;9215:7;9179:19;:44::i;:::-;8803:427;;:::o;5449:385:21:-;5598:1;5582:18;;:4;:18;;;5578:85;;;5616:36;5639:4;5645:6;5616:17;:22;;:36;;;;;:::i;:::-;;;5578:85;5690:1;5676:16;;:2;:16;;;5672:88;;;5708:41;5731:9;5742:6;5708:17;:22;;:41;;;;;:::i;:::-;;;5672:88;5769:58;5788:15;5798:4;5788:9;:15::i;:::-;5805:13;5815:2;5805:9;:13::i;:::-;5820:6;5769:18;:58::i;:::-;5449:385;;;:::o;14158:121:7:-;;;;:::o;2027:553:2:-;2096:7;2105;2124:11;2138:4;:17;;:24;;;;2124:38;;2172:11;2186:12;2193:4;2186:6;:12::i;:::-;2172:26;;2218:1;2212:3;:7;:66;;;;;2266:12;2223:4;:17;;2247:1;2241:3;:7;;;;:::i;:::-;2223:26;;;;;;;;:::i;:::-;;;;;;;;;:39;;;;;;;;;;;;:55;;;2212:66;2208:337;;;2330:25;2349:5;2330:18;:25::i;:::-;2294:4;:17;;2318:1;2312:3;:7;;;;:::i;:::-;2294:26;;;;;;;;:::i;:::-;;;;;;;;;:33;;;:61;;;;;;;;;;;;;;;;;;2208:337;;;2386:4;:17;;2426:94;;;;;;;;2452:31;2470:12;2452:17;:31::i;:::-;2426:94;;;;;;2493:25;2512:5;2493:18;:25::i;:::-;2426:94;;;;;2386:148;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2208:337;2562:3;2567:5;2554:19;;;;;;2027:553;;;;;:::o;2751:192:18:-;2808:7;2844:17;2835:26;;:5;:26;;2827:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;2930:5;2915:21;;2751:192;;;:::o;15179:187::-;15235:6;15270:16;15261:25;;:5;:25;;15253:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;15353:5;15339:20;;15179:187;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:24:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:139::-;1171:5;1209:6;1196:20;1187:29;;1225:33;1252:5;1225:33;:::i;:::-;1125:139;;;;:::o;1270:137::-;1315:5;1353:6;1340:20;1331:29;;1369:32;1395:5;1369:32;:::i;:::-;1270:137;;;;:::o;1413:141::-;1469:5;1500:6;1494:13;1485:22;;1516:32;1542:5;1516:32;:::i;:::-;1413:141;;;;:::o;1573:338::-;1628:5;1677:3;1670:4;1662:6;1658:17;1654:27;1644:122;;1685:79;;:::i;:::-;1644:122;1802:6;1789:20;1827:78;1901:3;1893:6;1886:4;1878:6;1874:17;1827:78;:::i;:::-;1818:87;;1634:277;1573:338;;;;:::o;1931:340::-;1987:5;2036:3;2029:4;2021:6;2017:17;2013:27;2003:122;;2044:79;;:::i;:::-;2003:122;2161:6;2148:20;2186:79;2261:3;2253:6;2246:4;2238:6;2234:17;2186:79;:::i;:::-;2177:88;;1993:278;1931:340;;;;:::o;2277:139::-;2323:5;2361:6;2348:20;2339:29;;2377:33;2404:5;2377:33;:::i;:::-;2277:139;;;;:::o;2422:135::-;2466:5;2504:6;2491:20;2482:29;;2520:31;2545:5;2520:31;:::i;:::-;2422:135;;;;:::o;2563:329::-;2622:6;2671:2;2659:9;2650:7;2646:23;2642:32;2639:119;;;2677:79;;:::i;:::-;2639:119;2797:1;2822:53;2867:7;2858:6;2847:9;2843:22;2822:53;:::i;:::-;2812:63;;2768:117;2563:329;;;;:::o;2898:474::-;2966:6;2974;3023:2;3011:9;3002:7;2998:23;2994:32;2991:119;;;3029:79;;:::i;:::-;2991:119;3149:1;3174:53;3219:7;3210:6;3199:9;3195:22;3174:53;:::i;:::-;3164:63;;3120:117;3276:2;3302:53;3347:7;3338:6;3327:9;3323:22;3302:53;:::i;:::-;3292:63;;3247:118;2898:474;;;;;:::o;3378:619::-;3455:6;3463;3471;3520:2;3508:9;3499:7;3495:23;3491:32;3488:119;;;3526:79;;:::i;:::-;3488:119;3646:1;3671:53;3716:7;3707:6;3696:9;3692:22;3671:53;:::i;:::-;3661:63;;3617:117;3773:2;3799:53;3844:7;3835:6;3824:9;3820:22;3799:53;:::i;:::-;3789:63;;3744:118;3901:2;3927:53;3972:7;3963:6;3952:9;3948:22;3927:53;:::i;:::-;3917:63;;3872:118;3378:619;;;;;:::o;4003:943::-;4098:6;4106;4114;4122;4171:3;4159:9;4150:7;4146:23;4142:33;4139:120;;;4178:79;;:::i;:::-;4139:120;4298:1;4323:53;4368:7;4359:6;4348:9;4344:22;4323:53;:::i;:::-;4313:63;;4269:117;4425:2;4451:53;4496:7;4487:6;4476:9;4472:22;4451:53;:::i;:::-;4441:63;;4396:118;4553:2;4579:53;4624:7;4615:6;4604:9;4600:22;4579:53;:::i;:::-;4569:63;;4524:118;4709:2;4698:9;4694:18;4681:32;4740:18;4732:6;4729:30;4726:117;;;4762:79;;:::i;:::-;4726:117;4867:62;4921:7;4912:6;4901:9;4897:22;4867:62;:::i;:::-;4857:72;;4652:287;4003:943;;;;;;;:::o;4952:468::-;5017:6;5025;5074:2;5062:9;5053:7;5049:23;5045:32;5042:119;;;5080:79;;:::i;:::-;5042:119;5200:1;5225:53;5270:7;5261:6;5250:9;5246:22;5225:53;:::i;:::-;5215:63;;5171:117;5327:2;5353:50;5395:7;5386:6;5375:9;5371:22;5353:50;:::i;:::-;5343:60;;5298:115;4952:468;;;;;:::o;5426:474::-;5494:6;5502;5551:2;5539:9;5530:7;5526:23;5522:32;5519:119;;;5557:79;;:::i;:::-;5519:119;5677:1;5702:53;5747:7;5738:6;5727:9;5723:22;5702:53;:::i;:::-;5692:63;;5648:117;5804:2;5830:53;5875:7;5866:6;5855:9;5851:22;5830:53;:::i;:::-;5820:63;;5775:118;5426:474;;;;;:::o;5906:799::-;5993:6;6001;6009;6058:2;6046:9;6037:7;6033:23;6029:32;6026:119;;;6064:79;;:::i;:::-;6026:119;6184:1;6209:53;6254:7;6245:6;6234:9;6230:22;6209:53;:::i;:::-;6199:63;;6155:117;6311:2;6337:53;6382:7;6373:6;6362:9;6358:22;6337:53;:::i;:::-;6327:63;;6282:118;6467:2;6456:9;6452:18;6439:32;6498:18;6490:6;6487:30;6484:117;;;6520:79;;:::i;:::-;6484:117;6625:63;6680:7;6671:6;6660:9;6656:22;6625:63;:::i;:::-;6615:73;;6410:288;5906:799;;;;;:::o;6711:1053::-;6813:6;6821;6829;6837;6845;6853;6902:3;6890:9;6881:7;6877:23;6873:33;6870:120;;;6909:79;;:::i;:::-;6870:120;7029:1;7054:53;7099:7;7090:6;7079:9;7075:22;7054:53;:::i;:::-;7044:63;;7000:117;7156:2;7182:53;7227:7;7218:6;7207:9;7203:22;7182:53;:::i;:::-;7172:63;;7127:118;7284:2;7310:53;7355:7;7346:6;7335:9;7331:22;7310:53;:::i;:::-;7300:63;;7255:118;7412:2;7438:51;7481:7;7472:6;7461:9;7457:22;7438:51;:::i;:::-;7428:61;;7383:116;7538:3;7565:53;7610:7;7601:6;7590:9;7586:22;7565:53;:::i;:::-;7555:63;;7509:119;7667:3;7694:53;7739:7;7730:6;7719:9;7715:22;7694:53;:::i;:::-;7684:63;;7638:119;6711:1053;;;;;;;;:::o;7770:329::-;7829:6;7878:2;7866:9;7857:7;7853:23;7849:32;7846:119;;;7884:79;;:::i;:::-;7846:119;8004:1;8029:53;8074:7;8065:6;8054:9;8050:22;8029:53;:::i;:::-;8019:63;;7975:117;7770:329;;;;:::o;8105:474::-;8173:6;8181;8230:2;8218:9;8209:7;8205:23;8201:32;8198:119;;;8236:79;;:::i;:::-;8198:119;8356:1;8381:53;8426:7;8417:6;8406:9;8402:22;8381:53;:::i;:::-;8371:63;;8327:117;8483:2;8509:53;8554:7;8545:6;8534:9;8530:22;8509:53;:::i;:::-;8499:63;;8454:118;8105:474;;;;;:::o;8585:327::-;8643:6;8692:2;8680:9;8671:7;8667:23;8663:32;8660:119;;;8698:79;;:::i;:::-;8660:119;8818:1;8843:52;8887:7;8878:6;8867:9;8863:22;8843:52;:::i;:::-;8833:62;;8789:116;8585:327;;;;:::o;8918:349::-;8987:6;9036:2;9024:9;9015:7;9011:23;9007:32;9004:119;;;9042:79;;:::i;:::-;9004:119;9162:1;9187:63;9242:7;9233:6;9222:9;9218:22;9187:63;:::i;:::-;9177:73;;9133:127;8918:349;;;;:::o;9273:329::-;9332:6;9381:2;9369:9;9360:7;9356:23;9352:32;9349:119;;;9387:79;;:::i;:::-;9349:119;9507:1;9532:53;9577:7;9568:6;9557:9;9553:22;9532:53;:::i;:::-;9522:63;;9478:117;9273:329;;;;:::o;9608:118::-;9695:24;9713:5;9695:24;:::i;:::-;9690:3;9683:37;9608:118;;:::o;9732:109::-;9813:21;9828:5;9813:21;:::i;:::-;9808:3;9801:34;9732:109;;:::o;9847:118::-;9934:24;9952:5;9934:24;:::i;:::-;9929:3;9922:37;9847:118;;:::o;9971:157::-;10076:45;10096:24;10114:5;10096:24;:::i;:::-;10076:45;:::i;:::-;10071:3;10064:58;9971:157;;:::o;10134:360::-;10220:3;10248:38;10280:5;10248:38;:::i;:::-;10302:70;10365:6;10360:3;10302:70;:::i;:::-;10295:77;;10381:52;10426:6;10421:3;10414:4;10407:5;10403:16;10381:52;:::i;:::-;10458:29;10480:6;10458:29;:::i;:::-;10453:3;10449:39;10442:46;;10224:270;10134:360;;;;:::o;10500:364::-;10588:3;10616:39;10649:5;10616:39;:::i;:::-;10671:71;10735:6;10730:3;10671:71;:::i;:::-;10664:78;;10751:52;10796:6;10791:3;10784:4;10777:5;10773:16;10751:52;:::i;:::-;10828:29;10850:6;10828:29;:::i;:::-;10823:3;10819:39;10812:46;;10592:272;10500:364;;;;:::o;10870:377::-;10976:3;11004:39;11037:5;11004:39;:::i;:::-;11059:89;11141:6;11136:3;11059:89;:::i;:::-;11052:96;;11157:52;11202:6;11197:3;11190:4;11183:5;11179:16;11157:52;:::i;:::-;11234:6;11229:3;11225:16;11218:23;;10980:267;10870:377;;;;:::o;11253:366::-;11395:3;11416:67;11480:2;11475:3;11416:67;:::i;:::-;11409:74;;11492:93;11581:3;11492:93;:::i;:::-;11610:2;11605:3;11601:12;11594:19;;11253:366;;;:::o;11625:::-;11767:3;11788:67;11852:2;11847:3;11788:67;:::i;:::-;11781:74;;11864:93;11953:3;11864:93;:::i;:::-;11982:2;11977:3;11973:12;11966:19;;11625:366;;;:::o;11997:::-;12139:3;12160:67;12224:2;12219:3;12160:67;:::i;:::-;12153:74;;12236:93;12325:3;12236:93;:::i;:::-;12354:2;12349:3;12345:12;12338:19;;11997:366;;;:::o;12369:::-;12511:3;12532:67;12596:2;12591:3;12532:67;:::i;:::-;12525:74;;12608:93;12697:3;12608:93;:::i;:::-;12726:2;12721:3;12717:12;12710:19;;12369:366;;;:::o;12741:::-;12883:3;12904:67;12968:2;12963:3;12904:67;:::i;:::-;12897:74;;12980:93;13069:3;12980:93;:::i;:::-;13098:2;13093:3;13089:12;13082:19;;12741:366;;;:::o;13113:::-;13255:3;13276:67;13340:2;13335:3;13276:67;:::i;:::-;13269:74;;13352:93;13441:3;13352:93;:::i;:::-;13470:2;13465:3;13461:12;13454:19;;13113:366;;;:::o;13485:::-;13627:3;13648:67;13712:2;13707:3;13648:67;:::i;:::-;13641:74;;13724:93;13813:3;13724:93;:::i;:::-;13842:2;13837:3;13833:12;13826:19;;13485:366;;;:::o;13857:::-;13999:3;14020:67;14084:2;14079:3;14020:67;:::i;:::-;14013:74;;14096:93;14185:3;14096:93;:::i;:::-;14214:2;14209:3;14205:12;14198:19;;13857:366;;;:::o;14229:400::-;14389:3;14410:84;14492:1;14487:3;14410:84;:::i;:::-;14403:91;;14503:93;14592:3;14503:93;:::i;:::-;14621:1;14616:3;14612:11;14605:18;;14229:400;;;:::o;14635:366::-;14777:3;14798:67;14862:2;14857:3;14798:67;:::i;:::-;14791:74;;14874:93;14963:3;14874:93;:::i;:::-;14992:2;14987:3;14983:12;14976:19;;14635:366;;;:::o;15007:::-;15149:3;15170:67;15234:2;15229:3;15170:67;:::i;:::-;15163:74;;15246:93;15335:3;15246:93;:::i;:::-;15364:2;15359:3;15355:12;15348:19;;15007:366;;;:::o;15379:::-;15521:3;15542:67;15606:2;15601:3;15542:67;:::i;:::-;15535:74;;15618:93;15707:3;15618:93;:::i;:::-;15736:2;15731:3;15727:12;15720:19;;15379:366;;;:::o;15751:::-;15893:3;15914:67;15978:2;15973:3;15914:67;:::i;:::-;15907:74;;15990:93;16079:3;15990:93;:::i;:::-;16108:2;16103:3;16099:12;16092:19;;15751:366;;;:::o;16123:::-;16265:3;16286:67;16350:2;16345:3;16286:67;:::i;:::-;16279:74;;16362:93;16451:3;16362:93;:::i;:::-;16480:2;16475:3;16471:12;16464:19;;16123:366;;;:::o;16495:::-;16637:3;16658:67;16722:2;16717:3;16658:67;:::i;:::-;16651:74;;16734:93;16823:3;16734:93;:::i;:::-;16852:2;16847:3;16843:12;16836:19;;16495:366;;;:::o;16867:::-;17009:3;17030:67;17094:2;17089:3;17030:67;:::i;:::-;17023:74;;17106:93;17195:3;17106:93;:::i;:::-;17224:2;17219:3;17215:12;17208:19;;16867:366;;;:::o;17239:::-;17381:3;17402:67;17466:2;17461:3;17402:67;:::i;:::-;17395:74;;17478:93;17567:3;17478:93;:::i;:::-;17596:2;17591:3;17587:12;17580:19;;17239:366;;;:::o;17611:::-;17753:3;17774:67;17838:2;17833:3;17774:67;:::i;:::-;17767:74;;17850:93;17939:3;17850:93;:::i;:::-;17968:2;17963:3;17959:12;17952:19;;17611:366;;;:::o;17983:::-;18125:3;18146:67;18210:2;18205:3;18146:67;:::i;:::-;18139:74;;18222:93;18311:3;18222:93;:::i;:::-;18340:2;18335:3;18331:12;18324:19;;17983:366;;;:::o;18355:::-;18497:3;18518:67;18582:2;18577:3;18518:67;:::i;:::-;18511:74;;18594:93;18683:3;18594:93;:::i;:::-;18712:2;18707:3;18703:12;18696:19;;18355:366;;;:::o;18727:::-;18869:3;18890:67;18954:2;18949:3;18890:67;:::i;:::-;18883:74;;18966:93;19055:3;18966:93;:::i;:::-;19084:2;19079:3;19075:12;19068:19;;18727:366;;;:::o;19099:::-;19241:3;19262:67;19326:2;19321:3;19262:67;:::i;:::-;19255:74;;19338:93;19427:3;19338:93;:::i;:::-;19456:2;19451:3;19447:12;19440:19;;19099:366;;;:::o;19471:::-;19613:3;19634:67;19698:2;19693:3;19634:67;:::i;:::-;19627:74;;19710:93;19799:3;19710:93;:::i;:::-;19828:2;19823:3;19819:12;19812:19;;19471:366;;;:::o;19843:::-;19985:3;20006:67;20070:2;20065:3;20006:67;:::i;:::-;19999:74;;20082:93;20171:3;20082:93;:::i;:::-;20200:2;20195:3;20191:12;20184:19;;19843:366;;;:::o;20215:::-;20357:3;20378:67;20442:2;20437:3;20378:67;:::i;:::-;20371:74;;20454:93;20543:3;20454:93;:::i;:::-;20572:2;20567:3;20563:12;20556:19;;20215:366;;;:::o;20587:402::-;20747:3;20768:85;20850:2;20845:3;20768:85;:::i;:::-;20761:92;;20862:93;20951:3;20862:93;:::i;:::-;20980:2;20975:3;20971:12;20964:19;;20587:402;;;:::o;20995:366::-;21137:3;21158:67;21222:2;21217:3;21158:67;:::i;:::-;21151:74;;21234:93;21323:3;21234:93;:::i;:::-;21352:2;21347:3;21343:12;21336:19;;20995:366;;;:::o;21367:402::-;21527:3;21548:85;21630:2;21625:3;21548:85;:::i;:::-;21541:92;;21642:93;21731:3;21642:93;:::i;:::-;21760:2;21755:3;21751:12;21744:19;;21367:402;;;:::o;21775:366::-;21917:3;21938:67;22002:2;21997:3;21938:67;:::i;:::-;21931:74;;22014:93;22103:3;22014:93;:::i;:::-;22132:2;22127:3;22123:12;22116:19;;21775:366;;;:::o;22147:118::-;22234:24;22252:5;22234:24;:::i;:::-;22229:3;22222:37;22147:118;;:::o;22271:112::-;22354:22;22370:5;22354:22;:::i;:::-;22349:3;22342:35;22271:112;;:::o;22389:435::-;22569:3;22591:95;22682:3;22673:6;22591:95;:::i;:::-;22584:102;;22703:95;22794:3;22785:6;22703:95;:::i;:::-;22696:102;;22815:3;22808:10;;22389:435;;;;;:::o;22830:663::-;23071:3;23093:148;23237:3;23093:148;:::i;:::-;23086:155;;23251:75;23322:3;23313:6;23251:75;:::i;:::-;23351:2;23346:3;23342:12;23335:19;;23364:75;23435:3;23426:6;23364:75;:::i;:::-;23464:2;23459:3;23455:12;23448:19;;23484:3;23477:10;;22830:663;;;;;:::o;23499:967::-;23881:3;23903:148;24047:3;23903:148;:::i;:::-;23896:155;;24068:95;24159:3;24150:6;24068:95;:::i;:::-;24061:102;;24180:148;24324:3;24180:148;:::i;:::-;24173:155;;24345:95;24436:3;24427:6;24345:95;:::i;:::-;24338:102;;24457:3;24450:10;;23499:967;;;;;:::o;24472:222::-;24565:4;24603:2;24592:9;24588:18;24580:26;;24616:71;24684:1;24673:9;24669:17;24660:6;24616:71;:::i;:::-;24472:222;;;;:::o;24700:640::-;24895:4;24933:3;24922:9;24918:19;24910:27;;24947:71;25015:1;25004:9;25000:17;24991:6;24947:71;:::i;:::-;25028:72;25096:2;25085:9;25081:18;25072:6;25028:72;:::i;:::-;25110;25178:2;25167:9;25163:18;25154:6;25110:72;:::i;:::-;25229:9;25223:4;25219:20;25214:2;25203:9;25199:18;25192:48;25257:76;25328:4;25319:6;25257:76;:::i;:::-;25249:84;;24700:640;;;;;;;:::o;25346:210::-;25433:4;25471:2;25460:9;25456:18;25448:26;;25484:65;25546:1;25535:9;25531:17;25522:6;25484:65;:::i;:::-;25346:210;;;;:::o;25562:222::-;25655:4;25693:2;25682:9;25678:18;25670:26;;25706:71;25774:1;25763:9;25759:17;25750:6;25706:71;:::i;:::-;25562:222;;;;:::o;25790:553::-;25967:4;26005:3;25994:9;25990:19;25982:27;;26019:71;26087:1;26076:9;26072:17;26063:6;26019:71;:::i;:::-;26100:72;26168:2;26157:9;26153:18;26144:6;26100:72;:::i;:::-;26182;26250:2;26239:9;26235:18;26226:6;26182:72;:::i;:::-;26264;26332:2;26321:9;26317:18;26308:6;26264:72;:::i;:::-;25790:553;;;;;;;:::o;26349:664::-;26554:4;26592:3;26581:9;26577:19;26569:27;;26606:71;26674:1;26663:9;26659:17;26650:6;26606:71;:::i;:::-;26687:72;26755:2;26744:9;26740:18;26731:6;26687:72;:::i;:::-;26769;26837:2;26826:9;26822:18;26813:6;26769:72;:::i;:::-;26851;26919:2;26908:9;26904:18;26895:6;26851:72;:::i;:::-;26933:73;27001:3;26990:9;26986:19;26977:6;26933:73;:::i;:::-;26349:664;;;;;;;;:::o;27019:545::-;27192:4;27230:3;27219:9;27215:19;27207:27;;27244:71;27312:1;27301:9;27297:17;27288:6;27244:71;:::i;:::-;27325:68;27389:2;27378:9;27374:18;27365:6;27325:68;:::i;:::-;27403:72;27471:2;27460:9;27456:18;27447:6;27403:72;:::i;:::-;27485;27553:2;27542:9;27538:18;27529:6;27485:72;:::i;:::-;27019:545;;;;;;;:::o;27570:313::-;27683:4;27721:2;27710:9;27706:18;27698:26;;27770:9;27764:4;27760:20;27756:1;27745:9;27741:17;27734:47;27798:78;27871:4;27862:6;27798:78;:::i;:::-;27790:86;;27570:313;;;;:::o;27889:419::-;28055:4;28093:2;28082:9;28078:18;28070:26;;28142:9;28136:4;28132:20;28128:1;28117:9;28113:17;28106:47;28170:131;28296:4;28170:131;:::i;:::-;28162:139;;27889:419;;;:::o;28314:::-;28480:4;28518:2;28507:9;28503:18;28495:26;;28567:9;28561:4;28557:20;28553:1;28542:9;28538:17;28531:47;28595:131;28721:4;28595:131;:::i;:::-;28587:139;;28314:419;;;:::o;28739:::-;28905:4;28943:2;28932:9;28928:18;28920:26;;28992:9;28986:4;28982:20;28978:1;28967:9;28963:17;28956:47;29020:131;29146:4;29020:131;:::i;:::-;29012:139;;28739:419;;;:::o;29164:::-;29330:4;29368:2;29357:9;29353:18;29345:26;;29417:9;29411:4;29407:20;29403:1;29392:9;29388:17;29381:47;29445:131;29571:4;29445:131;:::i;:::-;29437:139;;29164:419;;;:::o;29589:::-;29755:4;29793:2;29782:9;29778:18;29770:26;;29842:9;29836:4;29832:20;29828:1;29817:9;29813:17;29806:47;29870:131;29996:4;29870:131;:::i;:::-;29862:139;;29589:419;;;:::o;30014:::-;30180:4;30218:2;30207:9;30203:18;30195:26;;30267:9;30261:4;30257:20;30253:1;30242:9;30238:17;30231:47;30295:131;30421:4;30295:131;:::i;:::-;30287:139;;30014:419;;;:::o;30439:::-;30605:4;30643:2;30632:9;30628:18;30620:26;;30692:9;30686:4;30682:20;30678:1;30667:9;30663:17;30656:47;30720:131;30846:4;30720:131;:::i;:::-;30712:139;;30439:419;;;:::o;30864:::-;31030:4;31068:2;31057:9;31053:18;31045:26;;31117:9;31111:4;31107:20;31103:1;31092:9;31088:17;31081:47;31145:131;31271:4;31145:131;:::i;:::-;31137:139;;30864:419;;;:::o;31289:::-;31455:4;31493:2;31482:9;31478:18;31470:26;;31542:9;31536:4;31532:20;31528:1;31517:9;31513:17;31506:47;31570:131;31696:4;31570:131;:::i;:::-;31562:139;;31289:419;;;:::o;31714:::-;31880:4;31918:2;31907:9;31903:18;31895:26;;31967:9;31961:4;31957:20;31953:1;31942:9;31938:17;31931:47;31995:131;32121:4;31995:131;:::i;:::-;31987:139;;31714:419;;;:::o;32139:::-;32305:4;32343:2;32332:9;32328:18;32320:26;;32392:9;32386:4;32382:20;32378:1;32367:9;32363:17;32356:47;32420:131;32546:4;32420:131;:::i;:::-;32412:139;;32139:419;;;:::o;32564:::-;32730:4;32768:2;32757:9;32753:18;32745:26;;32817:9;32811:4;32807:20;32803:1;32792:9;32788:17;32781:47;32845:131;32971:4;32845:131;:::i;:::-;32837:139;;32564:419;;;:::o;32989:::-;33155:4;33193:2;33182:9;33178:18;33170:26;;33242:9;33236:4;33232:20;33228:1;33217:9;33213:17;33206:47;33270:131;33396:4;33270:131;:::i;:::-;33262:139;;32989:419;;;:::o;33414:::-;33580:4;33618:2;33607:9;33603:18;33595:26;;33667:9;33661:4;33657:20;33653:1;33642:9;33638:17;33631:47;33695:131;33821:4;33695:131;:::i;:::-;33687:139;;33414:419;;;:::o;33839:::-;34005:4;34043:2;34032:9;34028:18;34020:26;;34092:9;34086:4;34082:20;34078:1;34067:9;34063:17;34056:47;34120:131;34246:4;34120:131;:::i;:::-;34112:139;;33839:419;;;:::o;34264:::-;34430:4;34468:2;34457:9;34453:18;34445:26;;34517:9;34511:4;34507:20;34503:1;34492:9;34488:17;34481:47;34545:131;34671:4;34545:131;:::i;:::-;34537:139;;34264:419;;;:::o;34689:::-;34855:4;34893:2;34882:9;34878:18;34870:26;;34942:9;34936:4;34932:20;34928:1;34917:9;34913:17;34906:47;34970:131;35096:4;34970:131;:::i;:::-;34962:139;;34689:419;;;:::o;35114:::-;35280:4;35318:2;35307:9;35303:18;35295:26;;35367:9;35361:4;35357:20;35353:1;35342:9;35338:17;35331:47;35395:131;35521:4;35395:131;:::i;:::-;35387:139;;35114:419;;;:::o;35539:::-;35705:4;35743:2;35732:9;35728:18;35720:26;;35792:9;35786:4;35782:20;35778:1;35767:9;35763:17;35756:47;35820:131;35946:4;35820:131;:::i;:::-;35812:139;;35539:419;;;:::o;35964:::-;36130:4;36168:2;36157:9;36153:18;36145:26;;36217:9;36211:4;36207:20;36203:1;36192:9;36188:17;36181:47;36245:131;36371:4;36245:131;:::i;:::-;36237:139;;35964:419;;;:::o;36389:::-;36555:4;36593:2;36582:9;36578:18;36570:26;;36642:9;36636:4;36632:20;36628:1;36617:9;36613:17;36606:47;36670:131;36796:4;36670:131;:::i;:::-;36662:139;;36389:419;;;:::o;36814:::-;36980:4;37018:2;37007:9;37003:18;36995:26;;37067:9;37061:4;37057:20;37053:1;37042:9;37038:17;37031:47;37095:131;37221:4;37095:131;:::i;:::-;37087:139;;36814:419;;;:::o;37239:::-;37405:4;37443:2;37432:9;37428:18;37420:26;;37492:9;37486:4;37482:20;37478:1;37467:9;37463:17;37456:47;37520:131;37646:4;37520:131;:::i;:::-;37512:139;;37239:419;;;:::o;37664:::-;37830:4;37868:2;37857:9;37853:18;37845:26;;37917:9;37911:4;37907:20;37903:1;37892:9;37888:17;37881:47;37945:131;38071:4;37945:131;:::i;:::-;37937:139;;37664:419;;;:::o;38089:::-;38255:4;38293:2;38282:9;38278:18;38270:26;;38342:9;38336:4;38332:20;38328:1;38317:9;38313:17;38306:47;38370:131;38496:4;38370:131;:::i;:::-;38362:139;;38089:419;;;:::o;38514:::-;38680:4;38718:2;38707:9;38703:18;38695:26;;38767:9;38761:4;38757:20;38753:1;38742:9;38738:17;38731:47;38795:131;38921:4;38795:131;:::i;:::-;38787:139;;38514:419;;;:::o;38939:222::-;39032:4;39070:2;39059:9;39055:18;39047:26;;39083:71;39151:1;39140:9;39136:17;39127:6;39083:71;:::i;:::-;38939:222;;;;:::o;39167:332::-;39288:4;39326:2;39315:9;39311:18;39303:26;;39339:71;39407:1;39396:9;39392:17;39383:6;39339:71;:::i;:::-;39420:72;39488:2;39477:9;39473:18;39464:6;39420:72;:::i;:::-;39167:332;;;;;:::o;39505:129::-;39539:6;39566:20;;:::i;:::-;39556:30;;39595:33;39623:4;39615:6;39595:33;:::i;:::-;39505:129;;;:::o;39640:75::-;39673:6;39706:2;39700:9;39690:19;;39640:75;:::o;39721:307::-;39782:4;39872:18;39864:6;39861:30;39858:56;;;39894:18;;:::i;:::-;39858:56;39932:29;39954:6;39932:29;:::i;:::-;39924:37;;40016:4;40010;40006:15;39998:23;;39721:307;;;:::o;40034:308::-;40096:4;40186:18;40178:6;40175:30;40172:56;;;40208:18;;:::i;:::-;40172:56;40246:29;40268:6;40246:29;:::i;:::-;40238:37;;40330:4;40324;40320:15;40312:23;;40034:308;;;:::o;40348:98::-;40399:6;40433:5;40427:12;40417:22;;40348:98;;;:::o;40452:99::-;40504:6;40538:5;40532:12;40522:22;;40452:99;;;:::o;40557:168::-;40640:11;40674:6;40669:3;40662:19;40714:4;40709:3;40705:14;40690:29;;40557:168;;;;:::o;40731:169::-;40815:11;40849:6;40844:3;40837:19;40889:4;40884:3;40880:14;40865:29;;40731:169;;;;:::o;40906:148::-;41008:11;41045:3;41030:18;;40906:148;;;;:::o;41060:305::-;41100:3;41119:20;41137:1;41119:20;:::i;:::-;41114:25;;41153:20;41171:1;41153:20;:::i;:::-;41148:25;;41307:1;41239:66;41235:74;41232:1;41229:81;41226:107;;;41313:18;;:::i;:::-;41226:107;41357:1;41354;41350:9;41343:16;;41060:305;;;;:::o;41371:185::-;41411:1;41428:20;41446:1;41428:20;:::i;:::-;41423:25;;41462:20;41480:1;41462:20;:::i;:::-;41457:25;;41501:1;41491:35;;41506:18;;:::i;:::-;41491:35;41548:1;41545;41541:9;41536:14;;41371:185;;;;:::o;41562:348::-;41602:7;41625:20;41643:1;41625:20;:::i;:::-;41620:25;;41659:20;41677:1;41659:20;:::i;:::-;41654:25;;41847:1;41779:66;41775:74;41772:1;41769:81;41764:1;41757:9;41750:17;41746:105;41743:131;;;41854:18;;:::i;:::-;41743:131;41902:1;41899;41895:9;41884:20;;41562:348;;;;:::o;41916:191::-;41956:4;41976:20;41994:1;41976:20;:::i;:::-;41971:25;;42010:20;42028:1;42010:20;:::i;:::-;42005:25;;42049:1;42046;42043:8;42040:34;;;42054:18;;:::i;:::-;42040:34;42099:1;42096;42092:9;42084:17;;41916:191;;;;:::o;42113:96::-;42150:7;42179:24;42197:5;42179:24;:::i;:::-;42168:35;;42113:96;;;:::o;42215:90::-;42249:7;42292:5;42285:13;42278:21;42267:32;;42215:90;;;:::o;42311:77::-;42348:7;42377:5;42366:16;;42311:77;;;:::o;42394:149::-;42430:7;42470:66;42463:5;42459:78;42448:89;;42394:149;;;:::o;42549:126::-;42586:7;42626:42;42619:5;42615:54;42604:65;;42549:126;;;:::o;42681:77::-;42718:7;42747:5;42736:16;;42681:77;;;:::o;42764:86::-;42799:7;42839:4;42832:5;42828:16;42817:27;;42764:86;;;:::o;42856:154::-;42940:6;42935:3;42930;42917:30;43002:1;42993:6;42988:3;42984:16;42977:27;42856:154;;;:::o;43016:307::-;43084:1;43094:113;43108:6;43105:1;43102:13;43094:113;;;43193:1;43188:3;43184:11;43178:18;43174:1;43169:3;43165:11;43158:39;43130:2;43127:1;43123:10;43118:15;;43094:113;;;43225:6;43222:1;43219:13;43216:101;;;43305:1;43296:6;43291:3;43287:16;43280:27;43216:101;43065:258;43016:307;;;:::o;43329:171::-;43368:3;43391:24;43409:5;43391:24;:::i;:::-;43382:33;;43437:4;43430:5;43427:15;43424:41;;;43445:18;;:::i;:::-;43424:41;43492:1;43485:5;43481:13;43474:20;;43329:171;;;:::o;43506:320::-;43550:6;43587:1;43581:4;43577:12;43567:22;;43634:1;43628:4;43624:12;43655:18;43645:81;;43711:4;43703:6;43699:17;43689:27;;43645:81;43773:2;43765:6;43762:14;43742:18;43739:38;43736:84;;;43792:18;;:::i;:::-;43736:84;43557:269;43506:320;;;:::o;43832:281::-;43915:27;43937:4;43915:27;:::i;:::-;43907:6;43903:40;44045:6;44033:10;44030:22;44009:18;43997:10;43994:34;43991:62;43988:88;;;44056:18;;:::i;:::-;43988:88;44096:10;44092:2;44085:22;43875:238;43832:281;;:::o;44119:233::-;44158:3;44181:24;44199:5;44181:24;:::i;:::-;44172:33;;44227:66;44220:5;44217:77;44214:103;;;44297:18;;:::i;:::-;44214:103;44344:1;44337:5;44333:13;44326:20;;44119:233;;;:::o;44358:79::-;44397:7;44426:5;44415:16;;44358:79;;;:::o;44443:176::-;44475:1;44492:20;44510:1;44492:20;:::i;:::-;44487:25;;44526:20;44544:1;44526:20;:::i;:::-;44521:25;;44565:1;44555:35;;44570:18;;:::i;:::-;44555:35;44611:1;44608;44604:9;44599:14;;44443:176;;;;:::o;44625:180::-;44673:77;44670:1;44663:88;44770:4;44767:1;44760:15;44794:4;44791:1;44784:15;44811:180;44859:77;44856:1;44849:88;44956:4;44953:1;44946:15;44980:4;44977:1;44970:15;44997:180;45045:77;45042:1;45035:88;45142:4;45139:1;45132:15;45166:4;45163:1;45156:15;45183:180;45231:77;45228:1;45221:88;45328:4;45325:1;45318:15;45352:4;45349:1;45342:15;45369:180;45417:77;45414:1;45407:88;45514:4;45511:1;45504:15;45538:4;45535:1;45528:15;45555:180;45603:77;45600:1;45593:88;45700:4;45697:1;45690:15;45724:4;45721:1;45714:15;45741:117;45850:1;45847;45840:12;45864:117;45973:1;45970;45963:12;45987:117;46096:1;46093;46086:12;46110:117;46219:1;46216;46209:12;46233:102;46274:6;46325:2;46321:7;46316:2;46309:5;46305:14;46301:28;46291:38;;46233:102;;;:::o;46341:174::-;46481:26;46477:1;46469:6;46465:14;46458:50;46341:174;:::o;46521:182::-;46661:34;46657:1;46649:6;46645:14;46638:58;46521:182;:::o;46709:170::-;46849:22;46845:1;46837:6;46833:14;46826:46;46709:170;:::o;46885:::-;47025:22;47021:1;47013:6;47009:14;47002:46;46885:170;:::o;47061:181::-;47201:33;47197:1;47189:6;47185:14;47178:57;47061:181;:::o;47248:237::-;47388:34;47384:1;47376:6;47372:14;47365:58;47457:20;47452:2;47444:6;47440:15;47433:45;47248:237;:::o;47491:224::-;47631:34;47627:1;47619:6;47615:14;47608:58;47700:7;47695:2;47687:6;47683:15;47676:32;47491:224;:::o;47721:178::-;47861:30;47857:1;47849:6;47845:14;47838:54;47721:178;:::o;47905:214::-;48045:66;48041:1;48033:6;48029:14;48022:90;47905:214;:::o;48125:223::-;48265:34;48261:1;48253:6;48249:14;48242:58;48334:6;48329:2;48321:6;48317:15;48310:31;48125:223;:::o;48354:175::-;48494:27;48490:1;48482:6;48478:14;48471:51;48354:175;:::o;48535:221::-;48675:34;48671:1;48663:6;48659:14;48652:58;48744:4;48739:2;48731:6;48727:15;48720:29;48535:221;:::o;48762:182::-;48902:34;48898:1;48890:6;48886:14;48879:58;48762:182;:::o;48950:166::-;49090:18;49086:1;49078:6;49074:14;49067:42;48950:166;:::o;49122:228::-;49262:34;49258:1;49250:6;49246:14;49239:58;49331:11;49326:2;49318:6;49314:15;49307:36;49122:228;:::o;49356:174::-;49496:26;49492:1;49484:6;49480:14;49473:50;49356:174;:::o;49536:233::-;49676:34;49672:1;49664:6;49660:14;49653:58;49745:16;49740:2;49732:6;49728:15;49721:41;49536:233;:::o;49775:176::-;49915:28;49911:1;49903:6;49899:14;49892:52;49775:176;:::o;49957:221::-;50097:34;50093:1;50085:6;50081:14;50074:58;50166:4;50161:2;50153:6;50149:15;50142:29;49957:221;:::o;50184:249::-;50324:34;50320:1;50312:6;50308:14;50301:58;50393:32;50388:2;50380:6;50376:15;50369:57;50184:249;:::o;50439:182::-;50579:34;50575:1;50567:6;50563:14;50556:58;50439:182;:::o;50627:226::-;50767:34;50763:1;50755:6;50751:14;50744:58;50836:9;50831:2;50823:6;50819:15;50812:34;50627:226;:::o;50859:174::-;50999:26;50995:1;50987:6;50983:14;50976:50;50859:174;:::o;51039:220::-;51179:34;51175:1;51167:6;51163:14;51156:58;51248:3;51243:2;51235:6;51231:15;51224:28;51039:220;:::o;51265:225::-;51405:34;51401:1;51393:6;51389:14;51382:58;51474:8;51469:2;51461:6;51457:15;51450:33;51265:225;:::o;51496:173::-;51636:25;51632:1;51624:6;51620:14;51613:49;51496:173;:::o;51675:233::-;51815:34;51811:1;51803:6;51799:14;51792:58;51884:16;51879:2;51871:6;51867:15;51860:41;51675:233;:::o;51914:167::-;52054:19;52050:1;52042:6;52038:14;52031:43;51914:167;:::o;52087:234::-;52227:34;52223:1;52215:6;52211:14;52204:58;52296:17;52291:2;52283:6;52279:15;52272:42;52087:234;:::o;52327:122::-;52400:24;52418:5;52400:24;:::i;:::-;52393:5;52390:35;52380:63;;52439:1;52436;52429:12;52380:63;52327:122;:::o;52455:116::-;52525:21;52540:5;52525:21;:::i;:::-;52518:5;52515:32;52505:60;;52561:1;52558;52551:12;52505:60;52455:116;:::o;52577:122::-;52650:24;52668:5;52650:24;:::i;:::-;52643:5;52640:35;52630:63;;52689:1;52686;52679:12;52630:63;52577:122;:::o;52705:120::-;52777:23;52794:5;52777:23;:::i;:::-;52770:5;52767:34;52757:62;;52815:1;52812;52805:12;52757:62;52705:120;:::o;52831:122::-;52904:24;52922:5;52904:24;:::i;:::-;52897:5;52894:35;52884:63;;52943:1;52940;52933:12;52884:63;52831:122;:::o;52959:118::-;53030:22;53046:5;53030:22;:::i;:::-;53023:5;53020:33;53010:61;;53067:1;53064;53057:12;53010:61;52959:118;:::o
Swarm Source
ipfs://d79d4d5220e13c992159dd55bc8f0b234a7dd1c9f399f28b08adfb6d19e7046a
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.