More Info
Private Name Tags
ContractCreator
TokenTracker
Multichain Info
No addresses found
Latest 25 from a total of 2,090 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Approval For... | 17771880 | 12 days ago | IN | 0 ETH | 0.00000002 | ||||
Set Approval For... | 14735757 | 82 days ago | IN | 0 ETH | 0.00000001 | ||||
Set Approval For... | 14699347 | 83 days ago | IN | 0 ETH | 0.00000001 | ||||
Set Approval For... | 14699120 | 83 days ago | IN | 0 ETH | 0.00000006 | ||||
Set Approval For... | 14699117 | 83 days ago | IN | 0 ETH | 0.00000001 | ||||
Set Approval For... | 14699075 | 83 days ago | IN | 0 ETH | 0.00000001 | ||||
Set Approval For... | 14698851 | 83 days ago | IN | 0 ETH | 0.00000001 | ||||
Set Approval For... | 14698711 | 83 days ago | IN | 0 ETH | 0.00000001 | ||||
Set Approval For... | 14698565 | 83 days ago | IN | 0 ETH | 0.00000001 | ||||
Set Approval For... | 14129632 | 96 days ago | IN | 0 ETH | 0 | ||||
Set Approval For... | 13380361 | 113 days ago | IN | 0 ETH | 0 | ||||
Set Approval For... | 13138544 | 119 days ago | IN | 0 ETH | 0.00000001 | ||||
Set Approval For... | 12832945 | 126 days ago | IN | 0 ETH | 0.00000006 | ||||
Set Approval For... | 12479617 | 134 days ago | IN | 0 ETH | 0.00000004 | ||||
Set Approval For... | 12031259 | 145 days ago | IN | 0 ETH | 0.00000023 | ||||
Set Approval For... | 10792404 | 173 days ago | IN | 0 ETH | 0.00000009 | ||||
Set Approval For... | 10480801 | 180 days ago | IN | 0 ETH | 0.00000007 | ||||
Set Approval For... | 10480792 | 180 days ago | IN | 0 ETH | 0.00000007 | ||||
Set Approval For... | 10249168 | 186 days ago | IN | 0 ETH | 0.00000019 | ||||
Set Approval For... | 10249084 | 186 days ago | IN | 0 ETH | 0.00000019 | ||||
Set Approval For... | 10249030 | 186 days ago | IN | 0 ETH | 0.00000019 | ||||
Set Approval For... | 10248988 | 186 days ago | IN | 0 ETH | 0.00000019 | ||||
Set Approval For... | 9749313 | 197 days ago | IN | 0 ETH | 0.00000007 | ||||
Set Approval For... | 9534147 | 202 days ago | IN | 0 ETH | 0.00000017 | ||||
Set Approval For... | 9134533 | 212 days ago | IN | 0 ETH | 0.00000012 |
Loading...
Loading
Contract Name:
EnfineoAccessPass
Compiler Version
v0.8.18+commit.87f61d96
Contract Source Code (Solidity)
/** *Submitted for verification at blastscan.io on 2024-03-27 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.17; /// @title Enfineo Access Pass /// @author Andre Costa @ LuxLabs.io // 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; } } // OpenZeppelin Contracts v4.4.1 (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Trees proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = keccak256(abi.encodePacked(computedHash, proofElement)); } else { // Hash(current element of the proof + current computed hash) computedHash = keccak256(abi.encodePacked(proofElement, computedHash)); } } return computedHash; } } // 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); } // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.0 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.0 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; address internal _oldOwner; uint256 internal lastOwnershipTransfer; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Returns the address of the previous owner. */ function oldOwner() public view virtual returns (address) { return _oldOwner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner_ = _owner; _oldOwner = oldOwner_; _owner = newOwner; lastOwnershipTransfer = block.timestamp; emit OwnershipTransferred(oldOwner_, newOwner); } } // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } /** * @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 = _ownerOf(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 or 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 or 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 or 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 the owner of the `tokenId`. Does NOT revert if token doesn't exist */ function _ownerOf(uint256 tokenId) internal view virtual returns (address) { return _owners[tokenId]; } /** * @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 _ownerOf(tokenId) != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || 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, 1); // Check that tokenId was not minted by `_beforeTokenTransfer` hook require(!_exists(tokenId), "ERC721: token already minted"); unchecked { // Will not overflow unless all 2**256 token ids are minted to the same owner. // Given that tokens are minted one by one, it is impossible in practice that // this ever happens. Might change if we allow batch minting. // The ERC fails to describe this case. _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId, 1); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * This is an internal function that does not check if the sender is authorized to operate on the token. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId, 1); // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook owner = ERC721.ownerOf(tokenId); // Clear approvals delete _tokenApprovals[tokenId]; _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId, 1); } /** * @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, 1); // Check that tokenId was not transferred by `_beforeTokenTransfer` hook require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); // Clear approvals from the previous owner delete _tokenApprovals[tokenId]; _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId, 1); } /** * @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. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`. * - When `from` is zero, the tokens will be minted for `to`. * - When `to` is zero, ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 firstTokenId, uint256 batchSize) internal virtual {} /** * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`. * - When `from` is zero, the tokens were minted for `to`. * - When `to` is zero, ``from``'s tokens were burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer(address from, address to, uint256 firstTokenId, uint256 batchSize) internal virtual {} /** * @dev Unsafe write access to the balances, used by extensions that "mint" tokens using an {ownerOf} override. * * WARNING: Anyone calling this MUST ensure that the balances remain consistent with the ownership. The invariant * being that for any address `a` the value returned by `balanceOf(a)` must be equal to the number of tokens such * that `ownerOf(tokenId)` is `a`. */ // solhint-disable-next-line func-name-mixedcase function __unsafe_increaseBalance(address account, uint256 amount) internal { _balances[account] += amount; } } contract EnfineoAccessPass is ERC721, Ownable { /// @notice The base uri of the project string public baseURI; /// @notice The collection's max supply uint256 public maxSupply = 1000; /// @notice Total reserved uint256 public reserved = 15; uint256 public reservedMinted; /// @notice Total guaranteed mint count uint256 public guaranteed; /// @dev Merkle tree root hash for guaranteed list bytes32 public rootForGuaranteed; /// @dev Merkle tree root hash for allowed list bytes32 public rootForOversubscribed; /// @dev Mapping to check if an address has already minted to avoid double mints on allow list mints mapping(address => bool) public mintedOnGuaranteed; mapping(address => bool) public mintedOnOversubscribed; /// @dev Counters library to track token id and counts using Counters for Counters.Counter; Counters.Counter private _tokenIdCounter; Counters.Counter private _guaranteedAllowListMintedCounter; Counters.Counter private _oversubscribedAllowListMintedCounter; /// @dev Different states of minting enum MintState { PAUSED, // Minting is paused GUARANTEED, // Guaranteed allow list OVERSUBSCRIBED, // General allow list PUBLIC // Open to public } MintState public mintState = MintState.PAUSED; constructor() ERC721("Enfineo Access Pass", "EAP") { baseURI = "ipfs://QmUn1EgRSjqFj5sX9TEv9PVcQQGYekM29qMfUKjXu9DMiP/"; } /// Base uri functions ///@notice Returns the base uri ///@return Base uri function _baseURI() internal view override returns (string memory) { return baseURI; } ///@notice Sets a new base uri ///@dev Only callable by owner ///@param newBaseURI The new base uri function setBaseURI(string memory newBaseURI) external onlyOwner { baseURI = newBaseURI; } ///@notice Returns the token uri ///@dev Updated to include json ///@param tokenId Token id function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(tokenId <= _tokenIdCounter.current(), "URI query for nonexistent token"); return bytes(baseURI).length > 0 ? string.concat(baseURI, Strings.toString(tokenId), ".json") : ""; } /// Minting functions ///@notice Mints nft token for allowed list addresses ///@dev Uses Merkle tree proof ///@param proof The Merkle tree proof of the allow list address function mintAllowlist(address receiver, bytes32[] calldata proof) external { /// Check if the sale is paused require(mintState == MintState.GUARANTEED || mintState == MintState.OVERSUBSCRIBED, "Not in allowlist minting states"); require(_tokenIdCounter.current() < maxSupply, "Max supply minted"); /// Check if user is on the allow list bytes32 leaf = keccak256(abi.encodePacked(receiver)); /// Update the root based on the state bytes32 root; // If current state is for guaranteed mints, set to the guaranteed hash if (mintState == MintState.GUARANTEED) { /// Set the correct root hash root = rootForGuaranteed; /// Check that user has not minted on guaranteed list require(mintedOnGuaranteed[receiver] == false, "User already minted on guaranteed list"); // Check there is sufficient guaranteed mint supply left require(totalGuaranteedAllowListMinted() < guaranteed, "Max guaranteed supply minted"); /// Increase the allow list minted count _guaranteedAllowListMintedCounter.increment(); /// Set that address has minted mintedOnGuaranteed[receiver] = true; } // If current state is for oversubscribed, set to the oversubscribed hash if (mintState == MintState.OVERSUBSCRIBED) { /// Set the correct root hash root = rootForOversubscribed; /// Check that user has not minted on oversubscribed list require(mintedOnOversubscribed[receiver] == false, "User already minted on oversubscribed list"); /// Check there is sufficient oversubscribed supply left /// Balance for oversubscribed mint = max supply minus reserved and guaranteed count require(totalOversubscribedAllowListMinted() < maxSupply - reserved - guaranteed, "Max allow list supply minted"); _oversubscribedAllowListMintedCounter.increment(); /// Set that address has minted mintedOnOversubscribed[receiver] = true; } // Check the merkle proof require(MerkleProof.verify(proof, root, leaf), "Invalid proof"); /// Get current token id then increase it uint256 tokenId = _tokenIdCounter.current(); _tokenIdCounter.increment(); /// Mint the token _safeMint(receiver, tokenId); } ///@notice Mints a token to caller addresses function mintPublic(address receiver) external { require(mintState == MintState.PUBLIC, "Public mint inactive"); /// Check balance of supply /// Total supply minus reserved require(_tokenIdCounter.current() < maxSupply - reserved, "Max available public supply minted"); /// Get current token id then increase it uint256 tokenId = _tokenIdCounter.current(); _tokenIdCounter.increment(); /// Mint the token _safeMint(receiver, tokenId); } ///@notice Mint from reserve supply ///@dev Only callable by owner ///@param to Array of addresses to receive airdrop function mintFromReserved(address to, uint256 amount) external onlyOwner { /// Check balance of supply require(amount + reservedMinted <= reserved, "Amount exceeds reserved supply"); for(uint i; i < amount;) { /// Get current token id then increase it uint256 tokenId = _tokenIdCounter.current(); _tokenIdCounter.increment(); /// Mint the token _safeMint(to, tokenId); /// Unchecked i to save gas unchecked { i++; } } reservedMinted += amount; } /// Other view and admin functions /** * @param merkleRoot_ The new merkle root */ function setMerkleRootGuaranteed(bytes32 merkleRoot_) external onlyOwner { rootForGuaranteed = merkleRoot_; } /** * @param merkleRoot_ The new merkle root */ function setMerkleOversubscribed(bytes32 merkleRoot_) external onlyOwner { rootForOversubscribed = merkleRoot_; } ///@notice Returns the total number of nftes minted function totalMinted() public view returns(uint256) { /// Token id starts from index 0 and counter is always incremented after mint, representing the total minted count return _tokenIdCounter.current(); } ///@notice Returns the current number of guaranteed allow list minted function totalGuaranteedAllowListMinted() public view returns(uint256) { /// Token id starts from index 0 and counter is always incremented after mint, representing the total minted count return _guaranteedAllowListMintedCounter.current(); } ///@notice Returns the current number of oversubscribed allow list minted function totalOversubscribedAllowListMinted() public view returns(uint256) { /// Token id starts from index 0 and counter is always incremented after mint, representing the total minted count return _oversubscribedAllowListMintedCounter.current(); } ///@notice Returns the total allow list minted function totalAllowListMinted() public view returns(uint256) { /// Token id starts from index 0 and counter is always incremented after mint, representing the total minted count return _guaranteedAllowListMintedCounter.current() + _oversubscribedAllowListMintedCounter.current(); } /** * Set mint state. * @param mintState_ The new state of the contract. */ function setMintState(uint256 mintState_) external onlyOwner { require(mintState_ < 5, "Invalid State!"); mintState = MintState(mintState_); } ///@notice Function to update guaranteed mint count ///@param count New guaranteed mint count function setGuaranteedCount(uint256 count) external onlyOwner { guaranteed = count; } ///@notice Function to update reserved mint count ///@param count New reserved mint count function setReservedCount(uint256 count) external onlyOwner { reserved = count; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"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":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"guaranteed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"mintAllowlist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mintFromReserved","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"mintPublic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintState","outputs":[{"internalType":"enum EnfineoAccessPass.MintState","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintedOnGuaranteed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintedOnOversubscribed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oldOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserved","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reservedMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rootForGuaranteed","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rootForOversubscribed","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"setGuaranteedCount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkleRoot_","type":"bytes32"}],"name":"setMerkleOversubscribed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkleRoot_","type":"bytes32"}],"name":"setMerkleRootGuaranteed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintState_","type":"uint256"}],"name":"setMintState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"setReservedCount","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":[],"name":"totalAllowListMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalGuaranteedAllowListMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalOversubscribedAllowListMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526103e8600a55600f600b556000601560006101000a81548160ff0219169083600381111562000038576200003762000244565b5b02179055503480156200004a57600080fd5b506040518060400160405280601381526020017f456e66696e656f204163636573732050617373000000000000000000000000008152506040518060400160405280600381526020017f45415000000000000000000000000000000000000000000000000000000000008152508160009081620000c89190620004ed565b508060019081620000da9190620004ed565b505050620000fd620000f16200012e60201b60201c565b6200013660201b60201c565b60405180606001604052806036815260200162004de56036913960099081620001279190620004ed565b50620005d4565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905080600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426008819055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620002f557607f821691505b6020821081036200030b576200030a620002ad565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620003757fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000336565b62000381868362000336565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620003ce620003c8620003c28462000399565b620003a3565b62000399565b9050919050565b6000819050919050565b620003ea83620003ad565b62000402620003f982620003d5565b84845462000343565b825550505050565b600090565b620004196200040a565b62000426818484620003df565b505050565b5b818110156200044e57620004426000826200040f565b6001810190506200042c565b5050565b601f8211156200049d57620004678162000311565b620004728462000326565b8101602085101562000482578190505b6200049a620004918562000326565b8301826200042b565b50505b505050565b600082821c905092915050565b6000620004c260001984600802620004a2565b1980831691505092915050565b6000620004dd8383620004af565b9150826002028217905092915050565b620004f88262000273565b67ffffffffffffffff8111156200051457620005136200027e565b5b620005208254620002dc565b6200052d82828562000452565b600060209050601f83116001811462000565576000841562000550578287015190505b6200055c8582620004cf565b865550620005cc565b601f198416620005758662000311565b60005b828110156200059f5784890151825560018201915060208501945060208101905062000578565b86831015620005bf5784890151620005bb601f891682620004af565b8355505b6001600288020188555050505b505050505050565b61480180620005e46000396000f3fe608060405234801561001057600080fd5b50600436106102485760003560e01c80638da5cb5b1161013b578063c87b56dd116100b8578063f20423141161007c578063f2042314146106c9578063f2fde38b146106e7578063f487404f14610703578063f9c957d814610721578063fe60d12c1461073d57610248565b8063c87b56dd1461060f578063d371f76b1461063f578063d5abeb011461065d578063e921dad21461067b578063e985e9c51461069957610248565b8063ab81e062116100ff578063ab81e0621461056d578063ad8c3f3314610589578063b2422232146105a5578063b88d4fde146105d5578063c051e38a146105f157610248565b80638da5cb5b146104db57806395d89b41146104f9578063a06cb71914610517578063a22cb46514610533578063a2309ff81461054f57610248565b806335d5959a116101c95780636352211e1161018d5780636352211e146104235780636c0360eb1461045357806370a0823114610471578063715018a6146104a1578063893807aa146104ab57610248565b806335d5959a146103935780633c186018146103af57806342842e0e146103cd5780634f297ccc146103e957806355f804b31461040757610248565b80630bb862d1116102105780630bb862d11461030357806316f9b7071461031f57806323b872dd1461033b5780632dc7b8551461035757806332f4681c1461037557610248565b806301ffc9a71461024d57806306fdde031461027d578063081812fc1461029b578063084520b4146102cb578063095ea7b3146102e7575b600080fd5b61026760048036038101906102629190612bcc565b61075b565b6040516102749190612c14565b60405180910390f35b61028561083d565b6040516102929190612cbf565b60405180910390f35b6102b560048036038101906102b09190612d17565b6108cf565b6040516102c29190612d85565b60405180910390f35b6102e560048036038101906102e09190612dcc565b610915565b005b61030160048036038101906102fc9190612dcc565b610a3c565b005b61031d60048036038101906103189190612d17565b610b53565b005b61033960048036038101906103349190612d17565b610c51565b005b61035560048036038101906103509190612e0c565b610cd7565b005b61035f610d37565b60405161036c9190612e78565b60405180910390f35b61037d610d3d565b60405161038a9190612ea2565b60405180910390f35b6103ad60048036038101906103a89190612ee9565b610d43565b005b6103b7610dc9565b6040516103c49190612ea2565b60405180910390f35b6103e760048036038101906103e29190612e0c565b610dee565b005b6103f1610e0e565b6040516103fe9190612ea2565b60405180910390f35b610421600480360381019061041c919061304b565b610e14565b005b61043d60048036038101906104389190612d17565b610ea3565b60405161044a9190612d85565b60405180910390f35b61045b610f29565b6040516104689190612cbf565b60405180910390f35b61048b60048036038101906104869190613094565b610fb7565b6040516104989190612ea2565b60405180910390f35b6104a961106e565b005b6104c560048036038101906104c09190613094565b6110f6565b6040516104d29190612c14565b60405180910390f35b6104e3611116565b6040516104f09190612d85565b60405180910390f35b610501611140565b60405161050e9190612cbf565b60405180910390f35b610531600480360381019061052c9190613094565b6111d2565b005b61054d600480360381019061054891906130ed565b6112c7565b005b6105576112dd565b6040516105649190612ea2565b60405180910390f35b6105876004803603810190610582919061318d565b6112ee565b005b6105a3600480360381019061059e9190612ee9565b6117ed565b005b6105bf60048036038101906105ba9190613094565b611873565b6040516105cc9190612c14565b60405180910390f35b6105ef60048036038101906105ea919061328e565b611893565b005b6105f96118f5565b6040516106069190613388565b60405180910390f35b61062960048036038101906106249190612d17565b611908565b6040516106369190612cbf565b60405180910390f35b6106476119b4565b6040516106549190612ea2565b60405180910390f35b6106656119c5565b6040516106729190612ea2565b60405180910390f35b6106836119cb565b6040516106909190612e78565b60405180910390f35b6106b360048036038101906106ae91906133a3565b6119d1565b6040516106c09190612c14565b60405180910390f35b6106d1611a65565b6040516106de9190612ea2565b60405180910390f35b61070160048036038101906106fc9190613094565b611a76565b005b61070b611b6d565b6040516107189190612d85565b60405180910390f35b61073b60048036038101906107369190612d17565b611b97565b005b610745611c1d565b6040516107529190612ea2565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061082657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610836575061083582611c23565b5b9050919050565b60606000805461084c90613412565b80601f016020809104026020016040519081016040528092919081815260200182805461087890613412565b80156108c55780601f1061089a576101008083540402835291602001916108c5565b820191906000526020600020905b8154815290600101906020018083116108a857829003601f168201915b5050505050905090565b60006108da82611c8d565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b61091d611cd8565b73ffffffffffffffffffffffffffffffffffffffff1661093b611116565b73ffffffffffffffffffffffffffffffffffffffff1614610991576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109889061348f565b60405180910390fd5b600b54600c54826109a291906134de565b11156109e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109da9061355e565b60405180910390fd5b60005b81811015610a1e5760006109fa6012611ce0565b9050610a066012611cee565b610a108482611d04565b8180600101925050506109e6565b5080600c6000828254610a3191906134de565b925050819055505050565b6000610a4782610ea3565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610ab7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aae906135f0565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ad6611cd8565b73ffffffffffffffffffffffffffffffffffffffff161480610b055750610b0481610aff611cd8565b6119d1565b5b610b44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3b90613682565b60405180910390fd5b610b4e8383611d22565b505050565b610b5b611cd8565b73ffffffffffffffffffffffffffffffffffffffff16610b79611116565b73ffffffffffffffffffffffffffffffffffffffff1614610bcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc69061348f565b60405180910390fd5b60058110610c12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c09906136ee565b60405180910390fd5b806003811115610c2557610c24613311565b5b601560006101000a81548160ff02191690836003811115610c4957610c48613311565b5b021790555050565b610c59611cd8565b73ffffffffffffffffffffffffffffffffffffffff16610c77611116565b73ffffffffffffffffffffffffffffffffffffffff1614610ccd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc49061348f565b60405180910390fd5b80600b8190555050565b610ce8610ce2611cd8565b82611ddb565b610d27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1e90613780565b60405180910390fd5b610d32838383611eb9565b505050565b600e5481565b600d5481565b610d4b611cd8565b73ffffffffffffffffffffffffffffffffffffffff16610d69611116565b73ffffffffffffffffffffffffffffffffffffffff1614610dbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db69061348f565b60405180910390fd5b80600e8190555050565b6000610dd56014611ce0565b610ddf6013611ce0565b610de991906134de565b905090565b610e0983838360405180602001604052806000815250611893565b505050565b600c5481565b610e1c611cd8565b73ffffffffffffffffffffffffffffffffffffffff16610e3a611116565b73ffffffffffffffffffffffffffffffffffffffff1614610e90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e879061348f565b60405180910390fd5b8060099081610e9f919061394c565b5050565b600080610eaf836121c4565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1790613a6a565b60405180910390fd5b80915050919050565b60098054610f3690613412565b80601f0160208091040260200160405190810160405280929190818152602001828054610f6290613412565b8015610faf5780601f10610f8457610100808354040283529160200191610faf565b820191906000526020600020905b815481529060010190602001808311610f9257829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611027576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101e90613afc565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611076611cd8565b73ffffffffffffffffffffffffffffffffffffffff16611094611116565b73ffffffffffffffffffffffffffffffffffffffff16146110ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e19061348f565b60405180910390fd5b6110f46000612201565b565b60116020528060005260406000206000915054906101000a900460ff1681565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461114f90613412565b80601f016020809104026020016040519081016040528092919081815260200182805461117b90613412565b80156111c85780601f1061119d576101008083540402835291602001916111c8565b820191906000526020600020905b8154815290600101906020018083116111ab57829003601f168201915b5050505050905090565b6003808111156111e5576111e4613311565b5b601560009054906101000a900460ff16600381111561120757611206613311565b5b14611247576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123e90613b68565b60405180910390fd5b600b54600a546112579190613b88565b6112616012611ce0565b106112a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129890613c2e565b60405180910390fd5b60006112ad6012611ce0565b90506112b96012611cee565b6112c38282611d04565b5050565b6112d96112d2611cd8565b838361230f565b5050565b60006112e96012611ce0565b905090565b6001600381111561130257611301613311565b5b601560009054906101000a900460ff16600381111561132457611323613311565b5b148061136357506002600381111561133f5761133e613311565b5b601560009054906101000a900460ff16600381111561136157611360613311565b5b145b6113a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139990613c9a565b60405180910390fd5b600a546113af6012611ce0565b106113ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e690613d06565b60405180910390fd5b6000836040516020016114029190613d6e565b6040516020818303038152906040528051906020012090506000600160038111156114305761142f613311565b5b601560009054906101000a900460ff16600381111561145257611451613311565b5b0361159d57600e54905060001515601060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515146114ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e690613dfb565b60405180910390fd5b600d546114fa611a65565b1061153a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153190613e67565b60405180910390fd5b6115446013611cee565b6001601060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b600260038111156115b1576115b0613311565b5b601560009054906101000a900460ff1660038111156115d3576115d2613311565b5b0361173857600f54905060001515601160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611670576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166790613ef9565b60405180910390fd5b600d54600b54600a546116839190613b88565b61168d9190613b88565b6116956119b4565b106116d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116cc90613f65565b60405180910390fd5b6116df6014611cee565b6001601160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b611784848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050828461247b565b6117c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ba90613fd1565b60405180910390fd5b60006117cf6012611ce0565b90506117db6012611cee565b6117e58682611d04565b505050505050565b6117f5611cd8565b73ffffffffffffffffffffffffffffffffffffffff16611813611116565b73ffffffffffffffffffffffffffffffffffffffff1614611869576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118609061348f565b60405180910390fd5b80600f8190555050565b60106020528060005260406000206000915054906101000a900460ff1681565b6118a461189e611cd8565b83611ddb565b6118e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118da90613780565b60405180910390fd5b6118ef84848484612492565b50505050565b601560009054906101000a900460ff1681565b60606119146012611ce0565b821115611956576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194d9061403d565b60405180910390fd5b60006009805461196590613412565b90501161198157604051806020016040528060008152506119ad565b600961198c836124ee565b60405160200161199d929190614142565b6040516020818303038152906040525b9050919050565b60006119c06014611ce0565b905090565b600a5481565b600f5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000611a716013611ce0565b905090565b611a7e611cd8565b73ffffffffffffffffffffffffffffffffffffffff16611a9c611116565b73ffffffffffffffffffffffffffffffffffffffff1614611af2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae99061348f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611b61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b58906141e7565b60405180910390fd5b611b6a81612201565b50565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611b9f611cd8565b73ffffffffffffffffffffffffffffffffffffffff16611bbd611116565b73ffffffffffffffffffffffffffffffffffffffff1614611c13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0a9061348f565b60405180910390fd5b80600d8190555050565b600b5481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611c968161264e565b611cd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ccc90613a6a565b60405180910390fd5b50565b600033905090565b600081600001549050919050565b6001816000016000828254019250508190555050565b611d1e82826040518060200160405280600081525061268f565b5050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611d9583610ea3565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611de68261264e565b611e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1c90614279565b60405180910390fd5b6000611e3083610ea3565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611e725750611e7181856119d1565b5b80611eb057508373ffffffffffffffffffffffffffffffffffffffff16611e98846108cf565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611ed982610ea3565b73ffffffffffffffffffffffffffffffffffffffff1614611f2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f269061430b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611f9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f959061439d565b60405180910390fd5b611fab83838360016126ea565b8273ffffffffffffffffffffffffffffffffffffffff16611fcb82610ea3565b73ffffffffffffffffffffffffffffffffffffffff1614612021576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120189061430b565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120a79190613b88565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120fe91906134de565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46121bf83838360016126f0565b505050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905080600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426008819055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361237d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237490614409565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161246e9190612c14565b60405180910390a3505050565b60008261248885846126f6565b1490509392505050565b61249d848484611eb9565b6124a9848484846127a9565b6124e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124df9061449b565b60405180910390fd5b50505050565b606060008203612535576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612649565b600082905060005b60008214612567578080612550906144bb565b915050600a826125609190614532565b915061253d565b60008167ffffffffffffffff81111561258357612582612f20565b5b6040519080825280601f01601f1916602001820160405280156125b55781602001600182028036833780820191505090505b5090505b60008514612642576001826125ce9190613b88565b9150600a856125dd9190614563565b60306125e991906134de565b60f81b8183815181106125ff576125fe614594565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561263b9190614532565b94506125b9565b8093505050505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff16612670836121c4565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6126998383612930565b6126a660008484846127a9565b6126e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126dc9061449b565b60405180910390fd5b505050565b50505050565b50505050565b60008082905060005b845181101561279e57600085828151811061271d5761271c614594565b5b6020026020010151905080831161275e5782816040516020016127419291906145e4565b60405160208183030381529060405280519060200120925061278a565b80836040516020016127719291906145e4565b6040516020818303038152906040528051906020012092505b508080612796906144bb565b9150506126ff565b508091505092915050565b60006127ca8473ffffffffffffffffffffffffffffffffffffffff16612b4d565b15612923578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026127f3611cd8565b8786866040518563ffffffff1660e01b81526004016128159493929190614665565b6020604051808303816000875af192505050801561285157506040513d601f19601f8201168201806040525081019061284e91906146c6565b60015b6128d3573d8060008114612881576040519150601f19603f3d011682016040523d82523d6000602084013e612886565b606091505b5060008151036128cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128c29061449b565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612928565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361299f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129969061473f565b60405180910390fd5b6129a88161264e565b156129e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129df906147ab565b60405180910390fd5b6129f66000838360016126ea565b6129ff8161264e565b15612a3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a36906147ab565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612b496000838360016126f0565b5050565b600080823b905060008111915050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612ba981612b74565b8114612bb457600080fd5b50565b600081359050612bc681612ba0565b92915050565b600060208284031215612be257612be1612b6a565b5b6000612bf084828501612bb7565b91505092915050565b60008115159050919050565b612c0e81612bf9565b82525050565b6000602082019050612c296000830184612c05565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612c69578082015181840152602081019050612c4e565b60008484015250505050565b6000601f19601f8301169050919050565b6000612c9182612c2f565b612c9b8185612c3a565b9350612cab818560208601612c4b565b612cb481612c75565b840191505092915050565b60006020820190508181036000830152612cd98184612c86565b905092915050565b6000819050919050565b612cf481612ce1565b8114612cff57600080fd5b50565b600081359050612d1181612ceb565b92915050565b600060208284031215612d2d57612d2c612b6a565b5b6000612d3b84828501612d02565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612d6f82612d44565b9050919050565b612d7f81612d64565b82525050565b6000602082019050612d9a6000830184612d76565b92915050565b612da981612d64565b8114612db457600080fd5b50565b600081359050612dc681612da0565b92915050565b60008060408385031215612de357612de2612b6a565b5b6000612df185828601612db7565b9250506020612e0285828601612d02565b9150509250929050565b600080600060608486031215612e2557612e24612b6a565b5b6000612e3386828701612db7565b9350506020612e4486828701612db7565b9250506040612e5586828701612d02565b9150509250925092565b6000819050919050565b612e7281612e5f565b82525050565b6000602082019050612e8d6000830184612e69565b92915050565b612e9c81612ce1565b82525050565b6000602082019050612eb76000830184612e93565b92915050565b612ec681612e5f565b8114612ed157600080fd5b50565b600081359050612ee381612ebd565b92915050565b600060208284031215612eff57612efe612b6a565b5b6000612f0d84828501612ed4565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612f5882612c75565b810181811067ffffffffffffffff82111715612f7757612f76612f20565b5b80604052505050565b6000612f8a612b60565b9050612f968282612f4f565b919050565b600067ffffffffffffffff821115612fb657612fb5612f20565b5b612fbf82612c75565b9050602081019050919050565b82818337600083830152505050565b6000612fee612fe984612f9b565b612f80565b90508281526020810184848401111561300a57613009612f1b565b5b613015848285612fcc565b509392505050565b600082601f83011261303257613031612f16565b5b8135613042848260208601612fdb565b91505092915050565b60006020828403121561306157613060612b6a565b5b600082013567ffffffffffffffff81111561307f5761307e612b6f565b5b61308b8482850161301d565b91505092915050565b6000602082840312156130aa576130a9612b6a565b5b60006130b884828501612db7565b91505092915050565b6130ca81612bf9565b81146130d557600080fd5b50565b6000813590506130e7816130c1565b92915050565b6000806040838503121561310457613103612b6a565b5b600061311285828601612db7565b9250506020613123858286016130d8565b9150509250929050565b600080fd5b600080fd5b60008083601f84011261314d5761314c612f16565b5b8235905067ffffffffffffffff81111561316a5761316961312d565b5b60208301915083602082028301111561318657613185613132565b5b9250929050565b6000806000604084860312156131a6576131a5612b6a565b5b60006131b486828701612db7565b935050602084013567ffffffffffffffff8111156131d5576131d4612b6f565b5b6131e186828701613137565b92509250509250925092565b600067ffffffffffffffff82111561320857613207612f20565b5b61321182612c75565b9050602081019050919050565b600061323161322c846131ed565b612f80565b90508281526020810184848401111561324d5761324c612f1b565b5b613258848285612fcc565b509392505050565b600082601f83011261327557613274612f16565b5b813561328584826020860161321e565b91505092915050565b600080600080608085870312156132a8576132a7612b6a565b5b60006132b687828801612db7565b94505060206132c787828801612db7565b93505060406132d887828801612d02565b925050606085013567ffffffffffffffff8111156132f9576132f8612b6f565b5b61330587828801613260565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6004811061335157613350613311565b5b50565b600081905061336282613340565b919050565b600061337282613354565b9050919050565b61338281613367565b82525050565b600060208201905061339d6000830184613379565b92915050565b600080604083850312156133ba576133b9612b6a565b5b60006133c885828601612db7565b92505060206133d985828601612db7565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061342a57607f821691505b60208210810361343d5761343c6133e3565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613479602083612c3a565b915061348482613443565b602082019050919050565b600060208201905081810360008301526134a88161346c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006134e982612ce1565b91506134f483612ce1565b925082820190508082111561350c5761350b6134af565b5b92915050565b7f416d6f756e74206578636565647320726573657276656420737570706c790000600082015250565b6000613548601e83612c3a565b915061355382613512565b602082019050919050565b600060208201905081810360008301526135778161353b565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006135da602183612c3a565b91506135e58261357e565b604082019050919050565b60006020820190508181036000830152613609816135cd565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b600061366c603d83612c3a565b915061367782613610565b604082019050919050565b6000602082019050818103600083015261369b8161365f565b9050919050565b7f496e76616c696420537461746521000000000000000000000000000000000000600082015250565b60006136d8600e83612c3a565b91506136e3826136a2565b602082019050919050565b60006020820190508181036000830152613707816136cb565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b600061376a602d83612c3a565b91506137758261370e565b604082019050919050565b600060208201905081810360008301526137998161375d565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026138027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826137c5565b61380c86836137c5565b95508019841693508086168417925050509392505050565b6000819050919050565b600061384961384461383f84612ce1565b613824565b612ce1565b9050919050565b6000819050919050565b6138638361382e565b61387761386f82613850565b8484546137d2565b825550505050565b600090565b61388c61387f565b61389781848461385a565b505050565b5b818110156138bb576138b0600082613884565b60018101905061389d565b5050565b601f821115613900576138d1816137a0565b6138da846137b5565b810160208510156138e9578190505b6138fd6138f5856137b5565b83018261389c565b50505b505050565b600082821c905092915050565b600061392360001984600802613905565b1980831691505092915050565b600061393c8383613912565b9150826002028217905092915050565b61395582612c2f565b67ffffffffffffffff81111561396e5761396d612f20565b5b6139788254613412565b6139838282856138bf565b600060209050601f8311600181146139b657600084156139a4578287015190505b6139ae8582613930565b865550613a16565b601f1984166139c4866137a0565b60005b828110156139ec578489015182556001820191506020850194506020810190506139c7565b86831015613a095784890151613a05601f891682613912565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000613a54601883612c3a565b9150613a5f82613a1e565b602082019050919050565b60006020820190508181036000830152613a8381613a47565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000613ae6602983612c3a565b9150613af182613a8a565b604082019050919050565b60006020820190508181036000830152613b1581613ad9565b9050919050565b7f5075626c6963206d696e7420696e616374697665000000000000000000000000600082015250565b6000613b52601483612c3a565b9150613b5d82613b1c565b602082019050919050565b60006020820190508181036000830152613b8181613b45565b9050919050565b6000613b9382612ce1565b9150613b9e83612ce1565b9250828203905081811115613bb657613bb56134af565b5b92915050565b7f4d617820617661696c61626c65207075626c696320737570706c79206d696e7460008201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b6000613c18602283612c3a565b9150613c2382613bbc565b604082019050919050565b60006020820190508181036000830152613c4781613c0b565b9050919050565b7f4e6f7420696e20616c6c6f776c697374206d696e74696e672073746174657300600082015250565b6000613c84601f83612c3a565b9150613c8f82613c4e565b602082019050919050565b60006020820190508181036000830152613cb381613c77565b9050919050565b7f4d617820737570706c79206d696e746564000000000000000000000000000000600082015250565b6000613cf0601183612c3a565b9150613cfb82613cba565b602082019050919050565b60006020820190508181036000830152613d1f81613ce3565b9050919050565b60008160601b9050919050565b6000613d3e82613d26565b9050919050565b6000613d5082613d33565b9050919050565b613d68613d6382612d64565b613d45565b82525050565b6000613d7a8284613d57565b60148201915081905092915050565b7f5573657220616c7265616479206d696e746564206f6e2067756172616e74656560008201527f64206c6973740000000000000000000000000000000000000000000000000000602082015250565b6000613de5602683612c3a565b9150613df082613d89565b604082019050919050565b60006020820190508181036000830152613e1481613dd8565b9050919050565b7f4d61782067756172616e7465656420737570706c79206d696e74656400000000600082015250565b6000613e51601c83612c3a565b9150613e5c82613e1b565b602082019050919050565b60006020820190508181036000830152613e8081613e44565b9050919050565b7f5573657220616c7265616479206d696e746564206f6e206f766572737562736360008201527f7269626564206c69737400000000000000000000000000000000000000000000602082015250565b6000613ee3602a83612c3a565b9150613eee82613e87565b604082019050919050565b60006020820190508181036000830152613f1281613ed6565b9050919050565b7f4d617820616c6c6f77206c69737420737570706c79206d696e74656400000000600082015250565b6000613f4f601c83612c3a565b9150613f5a82613f19565b602082019050919050565b60006020820190508181036000830152613f7e81613f42565b9050919050565b7f496e76616c69642070726f6f6600000000000000000000000000000000000000600082015250565b6000613fbb600d83612c3a565b9150613fc682613f85565b602082019050919050565b60006020820190508181036000830152613fea81613fae565b9050919050565b7f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e00600082015250565b6000614027601f83612c3a565b915061403282613ff1565b602082019050919050565b600060208201905081810360008301526140568161401a565b9050919050565b600081905092915050565b6000815461407581613412565b61407f818661405d565b9450600182166000811461409a57600181146140af576140e2565b60ff19831686528115158202860193506140e2565b6140b8856137a0565b60005b838110156140da578154818901526001820191506020810190506140bb565b838801955050505b50505092915050565b60006140f682612c2f565b614100818561405d565b9350614110818560208601612c4b565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000815250565b600061414e8285614068565b915061415a82846140eb565b91506141658261411c565b6005820191508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006141d1602683612c3a565b91506141dc82614175565b604082019050919050565b60006020820190508181036000830152614200816141c4565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614263602c83612c3a565b915061426e82614207565b604082019050919050565b6000602082019050818103600083015261429281614256565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006142f5602583612c3a565b915061430082614299565b604082019050919050565b60006020820190508181036000830152614324816142e8565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614387602483612c3a565b91506143928261432b565b604082019050919050565b600060208201905081810360008301526143b68161437a565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006143f3601983612c3a565b91506143fe826143bd565b602082019050919050565b60006020820190508181036000830152614422816143e6565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614485603283612c3a565b915061449082614429565b604082019050919050565b600060208201905081810360008301526144b481614478565b9050919050565b60006144c682612ce1565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036144f8576144f76134af565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061453d82612ce1565b915061454883612ce1565b92508261455857614557614503565b5b828204905092915050565b600061456e82612ce1565b915061457983612ce1565b92508261458957614588614503565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b6145de6145d982612e5f565b6145c3565b82525050565b60006145f082856145cd565b60208201915061460082846145cd565b6020820191508190509392505050565b600081519050919050565b600082825260208201905092915050565b600061463782614610565b614641818561461b565b9350614651818560208601612c4b565b61465a81612c75565b840191505092915050565b600060808201905061467a6000830187612d76565b6146876020830186612d76565b6146946040830185612e93565b81810360608301526146a6818461462c565b905095945050505050565b6000815190506146c081612ba0565b92915050565b6000602082840312156146dc576146db612b6a565b5b60006146ea848285016146b1565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614729602083612c3a565b9150614734826146f3565b602082019050919050565b600060208201905081810360008301526147588161471c565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614795601c83612c3a565b91506147a08261475f565b602082019050919050565b600060208201905081810360008301526147c481614788565b905091905056fea26469706673582212200f34e1f14ea718630dba9dc90a87314cf396b94680595ef19bb71d393bec802f64736f6c63430008120033697066733a2f2f516d556e31456752536a71466a357358395445763950566351514759656b4d3239714d66554b6a587539444d69502f
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102485760003560e01c80638da5cb5b1161013b578063c87b56dd116100b8578063f20423141161007c578063f2042314146106c9578063f2fde38b146106e7578063f487404f14610703578063f9c957d814610721578063fe60d12c1461073d57610248565b8063c87b56dd1461060f578063d371f76b1461063f578063d5abeb011461065d578063e921dad21461067b578063e985e9c51461069957610248565b8063ab81e062116100ff578063ab81e0621461056d578063ad8c3f3314610589578063b2422232146105a5578063b88d4fde146105d5578063c051e38a146105f157610248565b80638da5cb5b146104db57806395d89b41146104f9578063a06cb71914610517578063a22cb46514610533578063a2309ff81461054f57610248565b806335d5959a116101c95780636352211e1161018d5780636352211e146104235780636c0360eb1461045357806370a0823114610471578063715018a6146104a1578063893807aa146104ab57610248565b806335d5959a146103935780633c186018146103af57806342842e0e146103cd5780634f297ccc146103e957806355f804b31461040757610248565b80630bb862d1116102105780630bb862d11461030357806316f9b7071461031f57806323b872dd1461033b5780632dc7b8551461035757806332f4681c1461037557610248565b806301ffc9a71461024d57806306fdde031461027d578063081812fc1461029b578063084520b4146102cb578063095ea7b3146102e7575b600080fd5b61026760048036038101906102629190612bcc565b61075b565b6040516102749190612c14565b60405180910390f35b61028561083d565b6040516102929190612cbf565b60405180910390f35b6102b560048036038101906102b09190612d17565b6108cf565b6040516102c29190612d85565b60405180910390f35b6102e560048036038101906102e09190612dcc565b610915565b005b61030160048036038101906102fc9190612dcc565b610a3c565b005b61031d60048036038101906103189190612d17565b610b53565b005b61033960048036038101906103349190612d17565b610c51565b005b61035560048036038101906103509190612e0c565b610cd7565b005b61035f610d37565b60405161036c9190612e78565b60405180910390f35b61037d610d3d565b60405161038a9190612ea2565b60405180910390f35b6103ad60048036038101906103a89190612ee9565b610d43565b005b6103b7610dc9565b6040516103c49190612ea2565b60405180910390f35b6103e760048036038101906103e29190612e0c565b610dee565b005b6103f1610e0e565b6040516103fe9190612ea2565b60405180910390f35b610421600480360381019061041c919061304b565b610e14565b005b61043d60048036038101906104389190612d17565b610ea3565b60405161044a9190612d85565b60405180910390f35b61045b610f29565b6040516104689190612cbf565b60405180910390f35b61048b60048036038101906104869190613094565b610fb7565b6040516104989190612ea2565b60405180910390f35b6104a961106e565b005b6104c560048036038101906104c09190613094565b6110f6565b6040516104d29190612c14565b60405180910390f35b6104e3611116565b6040516104f09190612d85565b60405180910390f35b610501611140565b60405161050e9190612cbf565b60405180910390f35b610531600480360381019061052c9190613094565b6111d2565b005b61054d600480360381019061054891906130ed565b6112c7565b005b6105576112dd565b6040516105649190612ea2565b60405180910390f35b6105876004803603810190610582919061318d565b6112ee565b005b6105a3600480360381019061059e9190612ee9565b6117ed565b005b6105bf60048036038101906105ba9190613094565b611873565b6040516105cc9190612c14565b60405180910390f35b6105ef60048036038101906105ea919061328e565b611893565b005b6105f96118f5565b6040516106069190613388565b60405180910390f35b61062960048036038101906106249190612d17565b611908565b6040516106369190612cbf565b60405180910390f35b6106476119b4565b6040516106549190612ea2565b60405180910390f35b6106656119c5565b6040516106729190612ea2565b60405180910390f35b6106836119cb565b6040516106909190612e78565b60405180910390f35b6106b360048036038101906106ae91906133a3565b6119d1565b6040516106c09190612c14565b60405180910390f35b6106d1611a65565b6040516106de9190612ea2565b60405180910390f35b61070160048036038101906106fc9190613094565b611a76565b005b61070b611b6d565b6040516107189190612d85565b60405180910390f35b61073b60048036038101906107369190612d17565b611b97565b005b610745611c1d565b6040516107529190612ea2565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061082657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610836575061083582611c23565b5b9050919050565b60606000805461084c90613412565b80601f016020809104026020016040519081016040528092919081815260200182805461087890613412565b80156108c55780601f1061089a576101008083540402835291602001916108c5565b820191906000526020600020905b8154815290600101906020018083116108a857829003601f168201915b5050505050905090565b60006108da82611c8d565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b61091d611cd8565b73ffffffffffffffffffffffffffffffffffffffff1661093b611116565b73ffffffffffffffffffffffffffffffffffffffff1614610991576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109889061348f565b60405180910390fd5b600b54600c54826109a291906134de565b11156109e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109da9061355e565b60405180910390fd5b60005b81811015610a1e5760006109fa6012611ce0565b9050610a066012611cee565b610a108482611d04565b8180600101925050506109e6565b5080600c6000828254610a3191906134de565b925050819055505050565b6000610a4782610ea3565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610ab7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aae906135f0565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ad6611cd8565b73ffffffffffffffffffffffffffffffffffffffff161480610b055750610b0481610aff611cd8565b6119d1565b5b610b44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3b90613682565b60405180910390fd5b610b4e8383611d22565b505050565b610b5b611cd8565b73ffffffffffffffffffffffffffffffffffffffff16610b79611116565b73ffffffffffffffffffffffffffffffffffffffff1614610bcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc69061348f565b60405180910390fd5b60058110610c12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c09906136ee565b60405180910390fd5b806003811115610c2557610c24613311565b5b601560006101000a81548160ff02191690836003811115610c4957610c48613311565b5b021790555050565b610c59611cd8565b73ffffffffffffffffffffffffffffffffffffffff16610c77611116565b73ffffffffffffffffffffffffffffffffffffffff1614610ccd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc49061348f565b60405180910390fd5b80600b8190555050565b610ce8610ce2611cd8565b82611ddb565b610d27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1e90613780565b60405180910390fd5b610d32838383611eb9565b505050565b600e5481565b600d5481565b610d4b611cd8565b73ffffffffffffffffffffffffffffffffffffffff16610d69611116565b73ffffffffffffffffffffffffffffffffffffffff1614610dbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db69061348f565b60405180910390fd5b80600e8190555050565b6000610dd56014611ce0565b610ddf6013611ce0565b610de991906134de565b905090565b610e0983838360405180602001604052806000815250611893565b505050565b600c5481565b610e1c611cd8565b73ffffffffffffffffffffffffffffffffffffffff16610e3a611116565b73ffffffffffffffffffffffffffffffffffffffff1614610e90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e879061348f565b60405180910390fd5b8060099081610e9f919061394c565b5050565b600080610eaf836121c4565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1790613a6a565b60405180910390fd5b80915050919050565b60098054610f3690613412565b80601f0160208091040260200160405190810160405280929190818152602001828054610f6290613412565b8015610faf5780601f10610f8457610100808354040283529160200191610faf565b820191906000526020600020905b815481529060010190602001808311610f9257829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611027576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101e90613afc565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611076611cd8565b73ffffffffffffffffffffffffffffffffffffffff16611094611116565b73ffffffffffffffffffffffffffffffffffffffff16146110ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e19061348f565b60405180910390fd5b6110f46000612201565b565b60116020528060005260406000206000915054906101000a900460ff1681565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461114f90613412565b80601f016020809104026020016040519081016040528092919081815260200182805461117b90613412565b80156111c85780601f1061119d576101008083540402835291602001916111c8565b820191906000526020600020905b8154815290600101906020018083116111ab57829003601f168201915b5050505050905090565b6003808111156111e5576111e4613311565b5b601560009054906101000a900460ff16600381111561120757611206613311565b5b14611247576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123e90613b68565b60405180910390fd5b600b54600a546112579190613b88565b6112616012611ce0565b106112a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129890613c2e565b60405180910390fd5b60006112ad6012611ce0565b90506112b96012611cee565b6112c38282611d04565b5050565b6112d96112d2611cd8565b838361230f565b5050565b60006112e96012611ce0565b905090565b6001600381111561130257611301613311565b5b601560009054906101000a900460ff16600381111561132457611323613311565b5b148061136357506002600381111561133f5761133e613311565b5b601560009054906101000a900460ff16600381111561136157611360613311565b5b145b6113a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139990613c9a565b60405180910390fd5b600a546113af6012611ce0565b106113ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e690613d06565b60405180910390fd5b6000836040516020016114029190613d6e565b6040516020818303038152906040528051906020012090506000600160038111156114305761142f613311565b5b601560009054906101000a900460ff16600381111561145257611451613311565b5b0361159d57600e54905060001515601060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515146114ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e690613dfb565b60405180910390fd5b600d546114fa611a65565b1061153a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153190613e67565b60405180910390fd5b6115446013611cee565b6001601060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b600260038111156115b1576115b0613311565b5b601560009054906101000a900460ff1660038111156115d3576115d2613311565b5b0361173857600f54905060001515601160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611670576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166790613ef9565b60405180910390fd5b600d54600b54600a546116839190613b88565b61168d9190613b88565b6116956119b4565b106116d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116cc90613f65565b60405180910390fd5b6116df6014611cee565b6001601160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b611784848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050828461247b565b6117c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ba90613fd1565b60405180910390fd5b60006117cf6012611ce0565b90506117db6012611cee565b6117e58682611d04565b505050505050565b6117f5611cd8565b73ffffffffffffffffffffffffffffffffffffffff16611813611116565b73ffffffffffffffffffffffffffffffffffffffff1614611869576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118609061348f565b60405180910390fd5b80600f8190555050565b60106020528060005260406000206000915054906101000a900460ff1681565b6118a461189e611cd8565b83611ddb565b6118e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118da90613780565b60405180910390fd5b6118ef84848484612492565b50505050565b601560009054906101000a900460ff1681565b60606119146012611ce0565b821115611956576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194d9061403d565b60405180910390fd5b60006009805461196590613412565b90501161198157604051806020016040528060008152506119ad565b600961198c836124ee565b60405160200161199d929190614142565b6040516020818303038152906040525b9050919050565b60006119c06014611ce0565b905090565b600a5481565b600f5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000611a716013611ce0565b905090565b611a7e611cd8565b73ffffffffffffffffffffffffffffffffffffffff16611a9c611116565b73ffffffffffffffffffffffffffffffffffffffff1614611af2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae99061348f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611b61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b58906141e7565b60405180910390fd5b611b6a81612201565b50565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611b9f611cd8565b73ffffffffffffffffffffffffffffffffffffffff16611bbd611116565b73ffffffffffffffffffffffffffffffffffffffff1614611c13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0a9061348f565b60405180910390fd5b80600d8190555050565b600b5481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611c968161264e565b611cd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ccc90613a6a565b60405180910390fd5b50565b600033905090565b600081600001549050919050565b6001816000016000828254019250508190555050565b611d1e82826040518060200160405280600081525061268f565b5050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611d9583610ea3565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611de68261264e565b611e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1c90614279565b60405180910390fd5b6000611e3083610ea3565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611e725750611e7181856119d1565b5b80611eb057508373ffffffffffffffffffffffffffffffffffffffff16611e98846108cf565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611ed982610ea3565b73ffffffffffffffffffffffffffffffffffffffff1614611f2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f269061430b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611f9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f959061439d565b60405180910390fd5b611fab83838360016126ea565b8273ffffffffffffffffffffffffffffffffffffffff16611fcb82610ea3565b73ffffffffffffffffffffffffffffffffffffffff1614612021576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120189061430b565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120a79190613b88565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120fe91906134de565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46121bf83838360016126f0565b505050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905080600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426008819055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361237d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237490614409565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161246e9190612c14565b60405180910390a3505050565b60008261248885846126f6565b1490509392505050565b61249d848484611eb9565b6124a9848484846127a9565b6124e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124df9061449b565b60405180910390fd5b50505050565b606060008203612535576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612649565b600082905060005b60008214612567578080612550906144bb565b915050600a826125609190614532565b915061253d565b60008167ffffffffffffffff81111561258357612582612f20565b5b6040519080825280601f01601f1916602001820160405280156125b55781602001600182028036833780820191505090505b5090505b60008514612642576001826125ce9190613b88565b9150600a856125dd9190614563565b60306125e991906134de565b60f81b8183815181106125ff576125fe614594565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561263b9190614532565b94506125b9565b8093505050505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff16612670836121c4565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6126998383612930565b6126a660008484846127a9565b6126e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126dc9061449b565b60405180910390fd5b505050565b50505050565b50505050565b60008082905060005b845181101561279e57600085828151811061271d5761271c614594565b5b6020026020010151905080831161275e5782816040516020016127419291906145e4565b60405160208183030381529060405280519060200120925061278a565b80836040516020016127719291906145e4565b6040516020818303038152906040528051906020012092505b508080612796906144bb565b9150506126ff565b508091505092915050565b60006127ca8473ffffffffffffffffffffffffffffffffffffffff16612b4d565b15612923578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026127f3611cd8565b8786866040518563ffffffff1660e01b81526004016128159493929190614665565b6020604051808303816000875af192505050801561285157506040513d601f19601f8201168201806040525081019061284e91906146c6565b60015b6128d3573d8060008114612881576040519150601f19603f3d011682016040523d82523d6000602084013e612886565b606091505b5060008151036128cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128c29061449b565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612928565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361299f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129969061473f565b60405180910390fd5b6129a88161264e565b156129e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129df906147ab565b60405180910390fd5b6129f66000838360016126ea565b6129ff8161264e565b15612a3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a36906147ab565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612b496000838360016126f0565b5050565b600080823b905060008111915050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612ba981612b74565b8114612bb457600080fd5b50565b600081359050612bc681612ba0565b92915050565b600060208284031215612be257612be1612b6a565b5b6000612bf084828501612bb7565b91505092915050565b60008115159050919050565b612c0e81612bf9565b82525050565b6000602082019050612c296000830184612c05565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612c69578082015181840152602081019050612c4e565b60008484015250505050565b6000601f19601f8301169050919050565b6000612c9182612c2f565b612c9b8185612c3a565b9350612cab818560208601612c4b565b612cb481612c75565b840191505092915050565b60006020820190508181036000830152612cd98184612c86565b905092915050565b6000819050919050565b612cf481612ce1565b8114612cff57600080fd5b50565b600081359050612d1181612ceb565b92915050565b600060208284031215612d2d57612d2c612b6a565b5b6000612d3b84828501612d02565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612d6f82612d44565b9050919050565b612d7f81612d64565b82525050565b6000602082019050612d9a6000830184612d76565b92915050565b612da981612d64565b8114612db457600080fd5b50565b600081359050612dc681612da0565b92915050565b60008060408385031215612de357612de2612b6a565b5b6000612df185828601612db7565b9250506020612e0285828601612d02565b9150509250929050565b600080600060608486031215612e2557612e24612b6a565b5b6000612e3386828701612db7565b9350506020612e4486828701612db7565b9250506040612e5586828701612d02565b9150509250925092565b6000819050919050565b612e7281612e5f565b82525050565b6000602082019050612e8d6000830184612e69565b92915050565b612e9c81612ce1565b82525050565b6000602082019050612eb76000830184612e93565b92915050565b612ec681612e5f565b8114612ed157600080fd5b50565b600081359050612ee381612ebd565b92915050565b600060208284031215612eff57612efe612b6a565b5b6000612f0d84828501612ed4565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612f5882612c75565b810181811067ffffffffffffffff82111715612f7757612f76612f20565b5b80604052505050565b6000612f8a612b60565b9050612f968282612f4f565b919050565b600067ffffffffffffffff821115612fb657612fb5612f20565b5b612fbf82612c75565b9050602081019050919050565b82818337600083830152505050565b6000612fee612fe984612f9b565b612f80565b90508281526020810184848401111561300a57613009612f1b565b5b613015848285612fcc565b509392505050565b600082601f83011261303257613031612f16565b5b8135613042848260208601612fdb565b91505092915050565b60006020828403121561306157613060612b6a565b5b600082013567ffffffffffffffff81111561307f5761307e612b6f565b5b61308b8482850161301d565b91505092915050565b6000602082840312156130aa576130a9612b6a565b5b60006130b884828501612db7565b91505092915050565b6130ca81612bf9565b81146130d557600080fd5b50565b6000813590506130e7816130c1565b92915050565b6000806040838503121561310457613103612b6a565b5b600061311285828601612db7565b9250506020613123858286016130d8565b9150509250929050565b600080fd5b600080fd5b60008083601f84011261314d5761314c612f16565b5b8235905067ffffffffffffffff81111561316a5761316961312d565b5b60208301915083602082028301111561318657613185613132565b5b9250929050565b6000806000604084860312156131a6576131a5612b6a565b5b60006131b486828701612db7565b935050602084013567ffffffffffffffff8111156131d5576131d4612b6f565b5b6131e186828701613137565b92509250509250925092565b600067ffffffffffffffff82111561320857613207612f20565b5b61321182612c75565b9050602081019050919050565b600061323161322c846131ed565b612f80565b90508281526020810184848401111561324d5761324c612f1b565b5b613258848285612fcc565b509392505050565b600082601f83011261327557613274612f16565b5b813561328584826020860161321e565b91505092915050565b600080600080608085870312156132a8576132a7612b6a565b5b60006132b687828801612db7565b94505060206132c787828801612db7565b93505060406132d887828801612d02565b925050606085013567ffffffffffffffff8111156132f9576132f8612b6f565b5b61330587828801613260565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6004811061335157613350613311565b5b50565b600081905061336282613340565b919050565b600061337282613354565b9050919050565b61338281613367565b82525050565b600060208201905061339d6000830184613379565b92915050565b600080604083850312156133ba576133b9612b6a565b5b60006133c885828601612db7565b92505060206133d985828601612db7565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061342a57607f821691505b60208210810361343d5761343c6133e3565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613479602083612c3a565b915061348482613443565b602082019050919050565b600060208201905081810360008301526134a88161346c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006134e982612ce1565b91506134f483612ce1565b925082820190508082111561350c5761350b6134af565b5b92915050565b7f416d6f756e74206578636565647320726573657276656420737570706c790000600082015250565b6000613548601e83612c3a565b915061355382613512565b602082019050919050565b600060208201905081810360008301526135778161353b565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006135da602183612c3a565b91506135e58261357e565b604082019050919050565b60006020820190508181036000830152613609816135cd565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b600061366c603d83612c3a565b915061367782613610565b604082019050919050565b6000602082019050818103600083015261369b8161365f565b9050919050565b7f496e76616c696420537461746521000000000000000000000000000000000000600082015250565b60006136d8600e83612c3a565b91506136e3826136a2565b602082019050919050565b60006020820190508181036000830152613707816136cb565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b600061376a602d83612c3a565b91506137758261370e565b604082019050919050565b600060208201905081810360008301526137998161375d565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026138027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826137c5565b61380c86836137c5565b95508019841693508086168417925050509392505050565b6000819050919050565b600061384961384461383f84612ce1565b613824565b612ce1565b9050919050565b6000819050919050565b6138638361382e565b61387761386f82613850565b8484546137d2565b825550505050565b600090565b61388c61387f565b61389781848461385a565b505050565b5b818110156138bb576138b0600082613884565b60018101905061389d565b5050565b601f821115613900576138d1816137a0565b6138da846137b5565b810160208510156138e9578190505b6138fd6138f5856137b5565b83018261389c565b50505b505050565b600082821c905092915050565b600061392360001984600802613905565b1980831691505092915050565b600061393c8383613912565b9150826002028217905092915050565b61395582612c2f565b67ffffffffffffffff81111561396e5761396d612f20565b5b6139788254613412565b6139838282856138bf565b600060209050601f8311600181146139b657600084156139a4578287015190505b6139ae8582613930565b865550613a16565b601f1984166139c4866137a0565b60005b828110156139ec578489015182556001820191506020850194506020810190506139c7565b86831015613a095784890151613a05601f891682613912565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000613a54601883612c3a565b9150613a5f82613a1e565b602082019050919050565b60006020820190508181036000830152613a8381613a47565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000613ae6602983612c3a565b9150613af182613a8a565b604082019050919050565b60006020820190508181036000830152613b1581613ad9565b9050919050565b7f5075626c6963206d696e7420696e616374697665000000000000000000000000600082015250565b6000613b52601483612c3a565b9150613b5d82613b1c565b602082019050919050565b60006020820190508181036000830152613b8181613b45565b9050919050565b6000613b9382612ce1565b9150613b9e83612ce1565b9250828203905081811115613bb657613bb56134af565b5b92915050565b7f4d617820617661696c61626c65207075626c696320737570706c79206d696e7460008201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b6000613c18602283612c3a565b9150613c2382613bbc565b604082019050919050565b60006020820190508181036000830152613c4781613c0b565b9050919050565b7f4e6f7420696e20616c6c6f776c697374206d696e74696e672073746174657300600082015250565b6000613c84601f83612c3a565b9150613c8f82613c4e565b602082019050919050565b60006020820190508181036000830152613cb381613c77565b9050919050565b7f4d617820737570706c79206d696e746564000000000000000000000000000000600082015250565b6000613cf0601183612c3a565b9150613cfb82613cba565b602082019050919050565b60006020820190508181036000830152613d1f81613ce3565b9050919050565b60008160601b9050919050565b6000613d3e82613d26565b9050919050565b6000613d5082613d33565b9050919050565b613d68613d6382612d64565b613d45565b82525050565b6000613d7a8284613d57565b60148201915081905092915050565b7f5573657220616c7265616479206d696e746564206f6e2067756172616e74656560008201527f64206c6973740000000000000000000000000000000000000000000000000000602082015250565b6000613de5602683612c3a565b9150613df082613d89565b604082019050919050565b60006020820190508181036000830152613e1481613dd8565b9050919050565b7f4d61782067756172616e7465656420737570706c79206d696e74656400000000600082015250565b6000613e51601c83612c3a565b9150613e5c82613e1b565b602082019050919050565b60006020820190508181036000830152613e8081613e44565b9050919050565b7f5573657220616c7265616479206d696e746564206f6e206f766572737562736360008201527f7269626564206c69737400000000000000000000000000000000000000000000602082015250565b6000613ee3602a83612c3a565b9150613eee82613e87565b604082019050919050565b60006020820190508181036000830152613f1281613ed6565b9050919050565b7f4d617820616c6c6f77206c69737420737570706c79206d696e74656400000000600082015250565b6000613f4f601c83612c3a565b9150613f5a82613f19565b602082019050919050565b60006020820190508181036000830152613f7e81613f42565b9050919050565b7f496e76616c69642070726f6f6600000000000000000000000000000000000000600082015250565b6000613fbb600d83612c3a565b9150613fc682613f85565b602082019050919050565b60006020820190508181036000830152613fea81613fae565b9050919050565b7f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e00600082015250565b6000614027601f83612c3a565b915061403282613ff1565b602082019050919050565b600060208201905081810360008301526140568161401a565b9050919050565b600081905092915050565b6000815461407581613412565b61407f818661405d565b9450600182166000811461409a57600181146140af576140e2565b60ff19831686528115158202860193506140e2565b6140b8856137a0565b60005b838110156140da578154818901526001820191506020810190506140bb565b838801955050505b50505092915050565b60006140f682612c2f565b614100818561405d565b9350614110818560208601612c4b565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000815250565b600061414e8285614068565b915061415a82846140eb565b91506141658261411c565b6005820191508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006141d1602683612c3a565b91506141dc82614175565b604082019050919050565b60006020820190508181036000830152614200816141c4565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614263602c83612c3a565b915061426e82614207565b604082019050919050565b6000602082019050818103600083015261429281614256565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006142f5602583612c3a565b915061430082614299565b604082019050919050565b60006020820190508181036000830152614324816142e8565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614387602483612c3a565b91506143928261432b565b604082019050919050565b600060208201905081810360008301526143b68161437a565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006143f3601983612c3a565b91506143fe826143bd565b602082019050919050565b60006020820190508181036000830152614422816143e6565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614485603283612c3a565b915061449082614429565b604082019050919050565b600060208201905081810360008301526144b481614478565b9050919050565b60006144c682612ce1565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036144f8576144f76134af565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061453d82612ce1565b915061454883612ce1565b92508261455857614557614503565b5b828204905092915050565b600061456e82612ce1565b915061457983612ce1565b92508261458957614588614503565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b6145de6145d982612e5f565b6145c3565b82525050565b60006145f082856145cd565b60208201915061460082846145cd565b6020820191508190509392505050565b600081519050919050565b600082825260208201905092915050565b600061463782614610565b614641818561461b565b9350614651818560208601612c4b565b61465a81612c75565b840191505092915050565b600060808201905061467a6000830187612d76565b6146876020830186612d76565b6146946040830185612e93565b81810360608301526146a6818461462c565b905095945050505050565b6000815190506146c081612ba0565b92915050565b6000602082840312156146dc576146db612b6a565b5b60006146ea848285016146b1565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614729602083612c3a565b9150614734826146f3565b602082019050919050565b600060208201905081810360008301526147588161471c565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614795601c83612c3a565b91506147a08261475f565b602082019050919050565b600060208201905081810360008301526147c481614788565b905091905056fea26469706673582212200f34e1f14ea718630dba9dc90a87314cf396b94680595ef19bb71d393bec802f64736f6c63430008120033
Deployed Bytecode Sourcemap
42365:9026:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27081:305;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28009:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29521:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48252:631;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29039:416;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50791:175;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51288:96;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30221:301;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42826:32;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42735:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48998:123;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50380:304;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30593:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42651:29;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44243:104;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27719:223;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42466:21;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27450:207;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21927:103;;;:::i;:::-;;43129:54;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21101:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28178:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47577:533;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29764:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49386:227;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44961:2557;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49194:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43071:50;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30815:279;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43719:45;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44463:298;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50047:272;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42542:31;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42920:36;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29990:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49696:264;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22185:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21270:93;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51079:100;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42615:28;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27081:305;27183:4;27235:25;27220:40;;;:11;:40;;;;:105;;;;27292:33;27277:48;;;:11;:48;;;;27220:105;:158;;;;27342:36;27366:11;27342:23;:36::i;:::-;27220:158;27200:178;;27081:305;;;:::o;28009:100::-;28063:13;28096:5;28089:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28009:100;:::o;29521:171::-;29597:7;29617:23;29632:7;29617:14;:23::i;:::-;29660:15;:24;29676:7;29660:24;;;;;;;;;;;;;;;;;;;;;29653:31;;29521:171;;;:::o;48252:631::-;21507:12;:10;:12::i;:::-;21496:23;;:7;:5;:7::i;:::-;:23;;;21488:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48408:8:::1;;48390:14;;48381:6;:23;;;;:::i;:::-;:35;;48373:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;48477:6;48473:368;48489:6;48485:1;:10;48473:368;;;48568:15;48586:25;:15;:23;:25::i;:::-;48568:43;;48626:27;:15;:25;:27::i;:::-;48702:22;48712:2;48716:7;48702:9;:22::i;:::-;48811:3;;;;;;;48498:343;48473:368;;;;48869:6;48851:14;;:24;;;;;;;:::i;:::-;;;;;;;;48252:631:::0;;:::o;29039:416::-;29120:13;29136:23;29151:7;29136:14;:23::i;:::-;29120:39;;29184:5;29178:11;;:2;:11;;;29170:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;29278:5;29262:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;29287:37;29304:5;29311:12;:10;:12::i;:::-;29287:16;:37::i;:::-;29262:62;29240:173;;;;;;;;;;;;:::i;:::-;;;;;;;;;29426:21;29435:2;29439:7;29426:8;:21::i;:::-;29109:346;29039:416;;:::o;50791:175::-;21507:12;:10;:12::i;:::-;21496:23;;:7;:5;:7::i;:::-;:23;;;21488:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50884:1:::1;50871:10;:14;50863:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;50947:10;50937:21;;;;;;;;:::i;:::-;;50925:9;;:33;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;50791:175:::0;:::o;51288:96::-;21507:12;:10;:12::i;:::-;21496:23;;:7;:5;:7::i;:::-;:23;;;21488:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51370:5:::1;51359:8;:16;;;;51288:96:::0;:::o;30221:301::-;30382:41;30401:12;:10;:12::i;:::-;30415:7;30382:18;:41::i;:::-;30374:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;30486:28;30496:4;30502:2;30506:7;30486:9;:28::i;:::-;30221:301;;;:::o;42826:32::-;;;;:::o;42735:25::-;;;;:::o;48998:123::-;21507:12;:10;:12::i;:::-;21496:23;;:7;:5;:7::i;:::-;:23;;;21488:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49102:11:::1;49082:17;:31;;;;48998:123:::0;:::o;50380:304::-;50432:7;50628:47;:37;:45;:47::i;:::-;50582:43;:33;:41;:43::i;:::-;:93;;;;:::i;:::-;50575:100;;50380:304;:::o;30593:151::-;30697:39;30714:4;30720:2;30724:7;30697:39;;;;;;;;;;;;:16;:39::i;:::-;30593:151;;;:::o;42651:29::-;;;;:::o;44243:104::-;21507:12;:10;:12::i;:::-;21496:23;;:7;:5;:7::i;:::-;:23;;;21488:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44329:10:::1;44319:7;:20;;;;;;:::i;:::-;;44243:104:::0;:::o;27719:223::-;27791:7;27811:13;27827:17;27836:7;27827:8;:17::i;:::-;27811:33;;27880:1;27863:19;;:5;:19;;;27855:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;27929:5;27922:12;;;27719:223;;;:::o;42466:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;27450:207::-;27522:7;27567:1;27550:19;;:5;:19;;;27542:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27633:9;:16;27643:5;27633:16;;;;;;;;;;;;;;;;27626:23;;27450:207;;;:::o;21927:103::-;21507:12;:10;:12::i;:::-;21496:23;;:7;:5;:7::i;:::-;:23;;;21488:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;21992:30:::1;22019:1;21992:18;:30::i;:::-;21927:103::o:0;43129:54::-;;;;;;;;;;;;;;;;;;;;;;:::o;21101:87::-;21147:7;21174:6;;;;;;;;;;;21167:13;;21101:87;:::o;28178:104::-;28234:13;28267:7;28260:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28178:104;:::o;47577:533::-;47658:16;47645:29;;;;;;;;:::i;:::-;;:9;;;;;;;;;;;:29;;;;;;;;:::i;:::-;;;47637:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;47840:8;;47828:9;;:20;;;;:::i;:::-;47800:25;:15;:23;:25::i;:::-;:48;47792:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;47952:15;47970:25;:15;:23;:25::i;:::-;47952:43;;48006:27;:15;:25;:27::i;:::-;48074:28;48084:8;48094:7;48074:9;:28::i;:::-;47624:486;47577:533;:::o;29764:155::-;29859:52;29878:12;:10;:12::i;:::-;29892:8;29902;29859:18;:52::i;:::-;29764:155;;:::o;49386:227::-;49429:7;49579:25;:15;:23;:25::i;:::-;49572:32;;49386:227;:::o;44961:2557::-;45110:20;45097:33;;;;;;;;:::i;:::-;;:9;;;;;;;;;;;:33;;;;;;;;:::i;:::-;;;:74;;;;45147:24;45134:37;;;;;;;;:::i;:::-;;:9;;;;;;;;;;;:37;;;;;;;;:::i;:::-;;;45097:74;45089:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;45256:9;;45228:25;:15;:23;:25::i;:::-;:37;45220:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;45349:12;45391:8;45374:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;45364:37;;;;;;45349:52;;45470:12;45593:20;45580:33;;;;;;;;:::i;:::-;;:9;;;;;;;;;;;:33;;;;;;;;:::i;:::-;;;45576:720;;45682:17;;45675:24;;45824:5;45792:37;;:18;:28;45811:8;45792:28;;;;;;;;;;;;;;;;;;;;;;;;;:37;;;45784:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;46015:10;;45980:32;:30;:32::i;:::-;:45;45972:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;46142:45;:33;:43;:45::i;:::-;46280:4;46249:18;:28;46268:8;46249:28;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;45576:720;46409:24;46396:37;;;;;;;;:::i;:::-;;:9;;;;;;;;;;;:37;;;;;;;;:::i;:::-;;;46392:794;;46502:21;;46495:28;;46656:5;46620:41;;:22;:32;46643:8;46620:32;;;;;;;;;;;;;;;;;;;;;;;;;:41;;;46612:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;46963:10;;46952:8;;46940:9;;:20;;;;:::i;:::-;:33;;;;:::i;:::-;46901:36;:34;:36::i;:::-;:72;46893:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;47024:49;:37;:47;:49::i;:::-;47170:4;47135:22;:32;47158:8;47135:32;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;46392:794;47241:37;47260:5;;47241:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47267:4;47273;47241:18;:37::i;:::-;47233:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;47360:15;47378:25;:15;:23;:25::i;:::-;47360:43;;47414:27;:15;:25;:27::i;:::-;47482:28;47492:8;47502:7;47482:9;:28::i;:::-;45037:2481;;;44961:2557;;;:::o;49194:127::-;21507:12;:10;:12::i;:::-;21496:23;;:7;:5;:7::i;:::-;:23;;;21488:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49302:11:::1;49278:21;:35;;;;49194:127:::0;:::o;43071:50::-;;;;;;;;;;;;;;;;;;;;;;:::o;30815:279::-;30946:41;30965:12;:10;:12::i;:::-;30979:7;30946:18;:41::i;:::-;30938:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;31048:38;31062:4;31068:2;31072:7;31081:4;31048:13;:38::i;:::-;30815:279;;;;:::o;43719:45::-;;;;;;;;;;;;;:::o;44463:298::-;44536:13;44581:25;:15;:23;:25::i;:::-;44570:7;:36;;44562:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;44686:1;44668:7;44662:21;;;;;:::i;:::-;;;:25;:91;;;;;;;;;;;;;;;;;44704:7;44713:25;44730:7;44713:16;:25::i;:::-;44690:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;44662:91;44655:98;;44463:298;;;:::o;50047:272::-;50113:7;50263:47;:37;:45;:47::i;:::-;50256:54;;50047:272;:::o;42542:31::-;;;;:::o;42920:36::-;;;;:::o;29990:164::-;30087:4;30111:18;:25;30130:5;30111:25;;;;;;;;;;;;;;;:35;30137:8;30111:35;;;;;;;;;;;;;;;;;;;;;;;;;30104:42;;29990:164;;;;:::o;49696:264::-;49758:7;49908:43;:33;:41;:43::i;:::-;49901:50;;49696:264;:::o;22185:201::-;21507:12;:10;:12::i;:::-;21496:23;;:7;:5;:7::i;:::-;:23;;;21488:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;22294:1:::1;22274:22;;:8;:22;;::::0;22266:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;22350:28;22369:8;22350:18;:28::i;:::-;22185:201:::0;:::o;21270:93::-;21319:7;21346:9;;;;;;;;;;;21339:16;;21270:93;:::o;51079:100::-;21507:12;:10;:12::i;:::-;21496:23;;:7;:5;:7::i;:::-;:23;;;21488:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51165:5:::1;51152:10;:18;;;;51079:100:::0;:::o;42615:28::-;;;;:::o;25690:157::-;25775:4;25814:25;25799:40;;;:11;:40;;;;25792:47;;25690:157;;;:::o;38515:135::-;38597:16;38605:7;38597;:16::i;:::-;38589:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;38515:135;:::o;19745:98::-;19798:7;19825:10;19818:17;;19745:98;:::o;950:114::-;1015:7;1042;:14;;;1035:21;;950:114;;;:::o;1072:127::-;1179:1;1161:7;:14;;;:19;;;;;;;;;;;1072:127;:::o;33774:110::-;33850:26;33860:2;33864:7;33850:26;;;;;;;;;;;;:9;:26::i;:::-;33774:110;;:::o;37828:174::-;37930:2;37903:15;:24;37919:7;37903:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;37986:7;37982:2;37948:46;;37957:23;37972:7;37957:14;:23::i;:::-;37948:46;;;;;;;;;;;;37828:174;;:::o;33084:348::-;33177:4;33202:16;33210:7;33202;:16::i;:::-;33194:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;33278:13;33294:23;33309:7;33294:14;:23::i;:::-;33278:39;;33347:5;33336:16;;:7;:16;;;:52;;;;33356:32;33373:5;33380:7;33356:16;:32::i;:::-;33336:52;:87;;;;33416:7;33392:31;;:20;33404:7;33392:11;:20::i;:::-;:31;;;33336:87;33328:96;;;33084:348;;;;:::o;36924:785::-;37049:4;37022:31;;:23;37037:7;37022:14;:23::i;:::-;:31;;;37014:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;37128:1;37114:16;;:2;:16;;;37106:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;37184:42;37205:4;37211:2;37215:7;37224:1;37184:20;:42::i;:::-;37356:4;37329:31;;:23;37344:7;37329:14;:23::i;:::-;:31;;;37321:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;37474:15;:24;37490:7;37474:24;;;;;;;;;;;;37467:31;;;;;;;;;;;37530:1;37511:9;:15;37521:4;37511:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;37559:1;37542:9;:13;37552:2;37542:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;37600:2;37581:7;:16;37589:7;37581:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;37639:7;37635:2;37620:27;;37629:4;37620:27;;;;;;;;;;;;37660:41;37680:4;37686:2;37690:7;37699:1;37660:19;:41::i;:::-;36924:785;;;:::o;32359:117::-;32425:7;32452;:16;32460:7;32452:16;;;;;;;;;;;;;;;;;;;;;32445:23;;32359:117;;;:::o;22546:275::-;22620:17;22640:6;;;;;;;;;;;22620:26;;22669:9;22657;;:21;;;;;;;;;;;;;;;;;;22698:8;22689:6;;:17;;;;;;;;;;;;;;;;;;22741:15;22717:21;:39;;;;22804:8;22772:41;;22793:9;22772:41;;;;;;;;;;;;22609:212;22546:275;:::o;38145:281::-;38266:8;38257:17;;:5;:17;;;38249:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;38353:8;38315:18;:25;38334:5;38315:25;;;;;;;;;;;;;;;:35;38341:8;38315:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;38399:8;38377:41;;38392:5;38377:41;;;38409:8;38377:41;;;;;;:::i;:::-;;;;;;;;38145:281;;;:::o;2378:190::-;2503:4;2556;2527:25;2540:5;2547:4;2527:12;:25::i;:::-;:33;2520:40;;2378:190;;;;;:::o;31975:270::-;32088:28;32098:4;32104:2;32108:7;32088:9;:28::i;:::-;32135:47;32158:4;32164:2;32168:7;32177:4;32135:22;:47::i;:::-;32127:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;31975:270;;;;:::o;23137:723::-;23193:13;23423:1;23414:5;:10;23410:53;;23441:10;;;;;;;;;;;;;;;;;;;;;23410:53;23473:12;23488:5;23473:20;;23504:14;23529:78;23544:1;23536:4;:9;23529:78;;23562:8;;;;;:::i;:::-;;;;23593:2;23585:10;;;;;:::i;:::-;;;23529:78;;;23617:19;23649:6;23639:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23617:39;;23667:154;23683:1;23674:5;:10;23667:154;;23711:1;23701:11;;;;;:::i;:::-;;;23778:2;23770:5;:10;;;;:::i;:::-;23757:2;:24;;;;:::i;:::-;23744:39;;23727:6;23734;23727:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;23807:2;23798:11;;;;;:::i;:::-;;;23667:154;;;23845:6;23831:21;;;;;23137:723;;;;:::o;32789:128::-;32854:4;32907:1;32878:31;;:17;32887:7;32878:8;:17::i;:::-;:31;;;;32871:38;;32789:128;;;:::o;34111:285::-;34206:18;34212:2;34216:7;34206:5;:18::i;:::-;34257:53;34288:1;34292:2;34296:7;34305:4;34257:22;:53::i;:::-;34235:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;34111:285;;;:::o;40799:116::-;;;;;:::o;41637:115::-;;;;;:::o;2930:701::-;3013:7;3033:20;3056:4;3033:27;;3076:9;3071:523;3095:5;:12;3091:1;:16;3071:523;;;3129:20;3152:5;3158:1;3152:8;;;;;;;;:::i;:::-;;;;;;;;3129:31;;3195:12;3179;:28;3175:408;;3349:12;3363;3332:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3322:55;;;;;;3307:70;;3175:408;;;3539:12;3553;3522:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3512:55;;;;;;3497:70;;3175:408;3114:480;3109:3;;;;;:::i;:::-;;;;3071:523;;;;3611:12;3604:19;;;2930:701;;;;:::o;39214:853::-;39368:4;39389:15;:2;:13;;;:15::i;:::-;39385:675;;;39441:2;39425:36;;;39462:12;:10;:12::i;:::-;39476:4;39482:7;39491:4;39425:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;39421:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39683:1;39666:6;:13;:18;39662:328;;39709:60;;;;;;;;;;:::i;:::-;;;;;;;;39662:328;39940:6;39934:13;39925:6;39921:2;39917:15;39910:38;39421:584;39557:41;;;39547:51;;;:6;:51;;;;39540:58;;;;;39385:675;40044:4;40037:11;;39214:853;;;;;;;:::o;34732:942::-;34826:1;34812:16;;:2;:16;;;34804:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;34885:16;34893:7;34885;:16::i;:::-;34884:17;34876:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;34947:48;34976:1;34980:2;34984:7;34993:1;34947:20;:48::i;:::-;35094:16;35102:7;35094;:16::i;:::-;35093:17;35085:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;35509:1;35492:9;:13;35502:2;35492:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;35553:2;35534:7;:16;35542:7;35534:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;35598:7;35594:2;35573:33;;35590:1;35573:33;;;;;;;;;;;;35619:47;35647:1;35651:2;35655:7;35664:1;35619:19;:47::i;:::-;34732:942;;:::o;11735:387::-;11795:4;12003:12;12070:7;12058:20;12050:28;;12113:1;12106:4;:8;12099:15;;;11735:387;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:619::-;4967:6;4975;4983;5032:2;5020:9;5011:7;5007:23;5003:32;5000:119;;;5038:79;;:::i;:::-;5000:119;5158:1;5183:53;5228:7;5219:6;5208:9;5204:22;5183:53;:::i;:::-;5173:63;;5129:117;5285:2;5311:53;5356:7;5347:6;5336:9;5332:22;5311:53;:::i;:::-;5301:63;;5256:118;5413:2;5439:53;5484:7;5475:6;5464:9;5460:22;5439:53;:::i;:::-;5429:63;;5384:118;4890:619;;;;;:::o;5515:77::-;5552:7;5581:5;5570:16;;5515:77;;;:::o;5598:118::-;5685:24;5703:5;5685:24;:::i;:::-;5680:3;5673:37;5598:118;;:::o;5722:222::-;5815:4;5853:2;5842:9;5838:18;5830:26;;5866:71;5934:1;5923:9;5919:17;5910:6;5866:71;:::i;:::-;5722:222;;;;:::o;5950:118::-;6037:24;6055:5;6037:24;:::i;:::-;6032:3;6025:37;5950:118;;:::o;6074:222::-;6167:4;6205:2;6194:9;6190:18;6182:26;;6218:71;6286:1;6275:9;6271:17;6262:6;6218:71;:::i;:::-;6074:222;;;;:::o;6302:122::-;6375:24;6393:5;6375:24;:::i;:::-;6368:5;6365:35;6355:63;;6414:1;6411;6404:12;6355:63;6302:122;:::o;6430:139::-;6476:5;6514:6;6501:20;6492:29;;6530:33;6557:5;6530:33;:::i;:::-;6430:139;;;;:::o;6575:329::-;6634:6;6683:2;6671:9;6662:7;6658:23;6654:32;6651:119;;;6689:79;;:::i;:::-;6651:119;6809:1;6834:53;6879:7;6870:6;6859:9;6855:22;6834:53;:::i;:::-;6824:63;;6780:117;6575:329;;;;:::o;6910:117::-;7019:1;7016;7009:12;7033:117;7142:1;7139;7132:12;7156:180;7204:77;7201:1;7194:88;7301:4;7298:1;7291:15;7325:4;7322:1;7315:15;7342:281;7425:27;7447:4;7425:27;:::i;:::-;7417:6;7413:40;7555:6;7543:10;7540:22;7519:18;7507:10;7504:34;7501:62;7498:88;;;7566:18;;:::i;:::-;7498:88;7606:10;7602:2;7595:22;7385:238;7342:281;;:::o;7629:129::-;7663:6;7690:20;;:::i;:::-;7680:30;;7719:33;7747:4;7739:6;7719:33;:::i;:::-;7629:129;;;:::o;7764:308::-;7826:4;7916:18;7908:6;7905:30;7902:56;;;7938:18;;:::i;:::-;7902:56;7976:29;7998:6;7976:29;:::i;:::-;7968:37;;8060:4;8054;8050:15;8042:23;;7764:308;;;:::o;8078:146::-;8175:6;8170:3;8165;8152:30;8216:1;8207:6;8202:3;8198:16;8191:27;8078:146;;;:::o;8230:425::-;8308:5;8333:66;8349:49;8391:6;8349:49;:::i;:::-;8333:66;:::i;:::-;8324:75;;8422:6;8415:5;8408:21;8460:4;8453:5;8449:16;8498:3;8489:6;8484:3;8480:16;8477:25;8474:112;;;8505:79;;:::i;:::-;8474:112;8595:54;8642:6;8637:3;8632;8595:54;:::i;:::-;8314:341;8230:425;;;;;:::o;8675:340::-;8731:5;8780:3;8773:4;8765:6;8761:17;8757:27;8747:122;;8788:79;;:::i;:::-;8747:122;8905:6;8892:20;8930:79;9005:3;8997:6;8990:4;8982:6;8978:17;8930:79;:::i;:::-;8921:88;;8737:278;8675:340;;;;:::o;9021:509::-;9090:6;9139:2;9127:9;9118:7;9114:23;9110:32;9107:119;;;9145:79;;:::i;:::-;9107:119;9293:1;9282:9;9278:17;9265:31;9323:18;9315:6;9312:30;9309:117;;;9345:79;;:::i;:::-;9309:117;9450:63;9505:7;9496:6;9485:9;9481:22;9450:63;:::i;:::-;9440:73;;9236:287;9021:509;;;;:::o;9536:329::-;9595:6;9644:2;9632:9;9623:7;9619:23;9615:32;9612:119;;;9650:79;;:::i;:::-;9612:119;9770:1;9795:53;9840:7;9831:6;9820:9;9816:22;9795:53;:::i;:::-;9785:63;;9741:117;9536:329;;;;:::o;9871:116::-;9941:21;9956:5;9941:21;:::i;:::-;9934:5;9931:32;9921:60;;9977:1;9974;9967:12;9921:60;9871:116;:::o;9993:133::-;10036:5;10074:6;10061:20;10052:29;;10090:30;10114:5;10090:30;:::i;:::-;9993:133;;;;:::o;10132:468::-;10197:6;10205;10254:2;10242:9;10233:7;10229:23;10225:32;10222:119;;;10260:79;;:::i;:::-;10222:119;10380:1;10405:53;10450:7;10441:6;10430:9;10426:22;10405:53;:::i;:::-;10395:63;;10351:117;10507:2;10533:50;10575:7;10566:6;10555:9;10551:22;10533:50;:::i;:::-;10523:60;;10478:115;10132:468;;;;;:::o;10606:117::-;10715:1;10712;10705:12;10729:117;10838:1;10835;10828:12;10869:568;10942:8;10952:6;11002:3;10995:4;10987:6;10983:17;10979:27;10969:122;;11010:79;;:::i;:::-;10969:122;11123:6;11110:20;11100:30;;11153:18;11145:6;11142:30;11139:117;;;11175:79;;:::i;:::-;11139:117;11289:4;11281:6;11277:17;11265:29;;11343:3;11335:4;11327:6;11323:17;11313:8;11309:32;11306:41;11303:128;;;11350:79;;:::i;:::-;11303:128;10869:568;;;;;:::o;11443:704::-;11538:6;11546;11554;11603:2;11591:9;11582:7;11578:23;11574:32;11571:119;;;11609:79;;:::i;:::-;11571:119;11729:1;11754:53;11799:7;11790:6;11779:9;11775:22;11754:53;:::i;:::-;11744:63;;11700:117;11884:2;11873:9;11869:18;11856:32;11915:18;11907:6;11904:30;11901:117;;;11937:79;;:::i;:::-;11901:117;12050:80;12122:7;12113:6;12102:9;12098:22;12050:80;:::i;:::-;12032:98;;;;11827:313;11443:704;;;;;:::o;12153:307::-;12214:4;12304:18;12296:6;12293:30;12290:56;;;12326:18;;:::i;:::-;12290:56;12364:29;12386:6;12364:29;:::i;:::-;12356:37;;12448:4;12442;12438:15;12430:23;;12153:307;;;:::o;12466:423::-;12543:5;12568:65;12584:48;12625:6;12584:48;:::i;:::-;12568:65;:::i;:::-;12559:74;;12656:6;12649:5;12642:21;12694:4;12687:5;12683:16;12732:3;12723:6;12718:3;12714:16;12711:25;12708:112;;;12739:79;;:::i;:::-;12708:112;12829:54;12876:6;12871:3;12866;12829:54;:::i;:::-;12549:340;12466:423;;;;;:::o;12908:338::-;12963:5;13012:3;13005:4;12997:6;12993:17;12989:27;12979:122;;13020:79;;:::i;:::-;12979:122;13137:6;13124:20;13162:78;13236:3;13228:6;13221:4;13213:6;13209:17;13162:78;:::i;:::-;13153:87;;12969:277;12908:338;;;;:::o;13252:943::-;13347:6;13355;13363;13371;13420:3;13408:9;13399:7;13395:23;13391:33;13388:120;;;13427:79;;:::i;:::-;13388:120;13547:1;13572:53;13617:7;13608:6;13597:9;13593:22;13572:53;:::i;:::-;13562:63;;13518:117;13674:2;13700:53;13745:7;13736:6;13725:9;13721:22;13700:53;:::i;:::-;13690:63;;13645:118;13802:2;13828:53;13873:7;13864:6;13853:9;13849:22;13828:53;:::i;:::-;13818:63;;13773:118;13958:2;13947:9;13943:18;13930:32;13989:18;13981:6;13978:30;13975:117;;;14011:79;;:::i;:::-;13975:117;14116:62;14170:7;14161:6;14150:9;14146:22;14116:62;:::i;:::-;14106:72;;13901:287;13252:943;;;;;;;:::o;14201:180::-;14249:77;14246:1;14239:88;14346:4;14343:1;14336:15;14370:4;14367:1;14360:15;14387:119;14474:1;14467:5;14464:12;14454:46;;14480:18;;:::i;:::-;14454:46;14387:119;:::o;14512:139::-;14563:7;14592:5;14581:16;;14598:47;14639:5;14598:47;:::i;:::-;14512:139;;;:::o;14657:::-;14719:9;14752:38;14784:5;14752:38;:::i;:::-;14739:51;;14657:139;;;:::o;14802:155::-;14901:49;14944:5;14901:49;:::i;:::-;14896:3;14889:62;14802:155;;:::o;14963:246::-;15068:4;15106:2;15095:9;15091:18;15083:26;;15119:83;15199:1;15188:9;15184:17;15175:6;15119:83;:::i;:::-;14963:246;;;;:::o;15215:474::-;15283:6;15291;15340:2;15328:9;15319:7;15315:23;15311:32;15308:119;;;15346:79;;:::i;:::-;15308:119;15466:1;15491:53;15536:7;15527:6;15516:9;15512:22;15491:53;:::i;:::-;15481:63;;15437:117;15593:2;15619:53;15664:7;15655:6;15644:9;15640:22;15619:53;:::i;:::-;15609:63;;15564:118;15215:474;;;;;:::o;15695:180::-;15743:77;15740:1;15733:88;15840:4;15837:1;15830:15;15864:4;15861:1;15854:15;15881:320;15925:6;15962:1;15956:4;15952:12;15942:22;;16009:1;16003:4;15999:12;16030:18;16020:81;;16086:4;16078:6;16074:17;16064:27;;16020:81;16148:2;16140:6;16137:14;16117:18;16114:38;16111:84;;16167:18;;:::i;:::-;16111:84;15932:269;15881:320;;;:::o;16207:182::-;16347:34;16343:1;16335:6;16331:14;16324:58;16207:182;:::o;16395:366::-;16537:3;16558:67;16622:2;16617:3;16558:67;:::i;:::-;16551:74;;16634:93;16723:3;16634:93;:::i;:::-;16752:2;16747:3;16743:12;16736:19;;16395:366;;;:::o;16767:419::-;16933:4;16971:2;16960:9;16956:18;16948:26;;17020:9;17014:4;17010:20;17006:1;16995:9;16991:17;16984:47;17048:131;17174:4;17048:131;:::i;:::-;17040:139;;16767:419;;;:::o;17192:180::-;17240:77;17237:1;17230:88;17337:4;17334:1;17327:15;17361:4;17358:1;17351:15;17378:191;17418:3;17437:20;17455:1;17437:20;:::i;:::-;17432:25;;17471:20;17489:1;17471:20;:::i;:::-;17466:25;;17514:1;17511;17507:9;17500:16;;17535:3;17532:1;17529:10;17526:36;;;17542:18;;:::i;:::-;17526:36;17378:191;;;;:::o;17575:180::-;17715:32;17711:1;17703:6;17699:14;17692:56;17575:180;:::o;17761:366::-;17903:3;17924:67;17988:2;17983:3;17924:67;:::i;:::-;17917:74;;18000:93;18089:3;18000:93;:::i;:::-;18118:2;18113:3;18109:12;18102:19;;17761:366;;;:::o;18133:419::-;18299:4;18337:2;18326:9;18322:18;18314:26;;18386:9;18380:4;18376:20;18372:1;18361:9;18357:17;18350:47;18414:131;18540:4;18414:131;:::i;:::-;18406:139;;18133:419;;;:::o;18558:220::-;18698:34;18694:1;18686:6;18682:14;18675:58;18767:3;18762:2;18754:6;18750:15;18743:28;18558:220;:::o;18784:366::-;18926:3;18947:67;19011:2;19006:3;18947:67;:::i;:::-;18940:74;;19023:93;19112:3;19023:93;:::i;:::-;19141:2;19136:3;19132:12;19125:19;;18784:366;;;:::o;19156:419::-;19322:4;19360:2;19349:9;19345:18;19337:26;;19409:9;19403:4;19399:20;19395:1;19384:9;19380:17;19373:47;19437:131;19563:4;19437:131;:::i;:::-;19429:139;;19156:419;;;:::o;19581:248::-;19721:34;19717:1;19709:6;19705:14;19698:58;19790:31;19785:2;19777:6;19773:15;19766:56;19581:248;:::o;19835:366::-;19977:3;19998:67;20062:2;20057:3;19998:67;:::i;:::-;19991:74;;20074:93;20163:3;20074:93;:::i;:::-;20192:2;20187:3;20183:12;20176:19;;19835:366;;;:::o;20207:419::-;20373:4;20411:2;20400:9;20396:18;20388:26;;20460:9;20454:4;20450:20;20446:1;20435:9;20431:17;20424:47;20488:131;20614:4;20488:131;:::i;:::-;20480:139;;20207:419;;;:::o;20632:164::-;20772:16;20768:1;20760:6;20756:14;20749:40;20632:164;:::o;20802:366::-;20944:3;20965:67;21029:2;21024:3;20965:67;:::i;:::-;20958:74;;21041:93;21130:3;21041:93;:::i;:::-;21159:2;21154:3;21150:12;21143:19;;20802:366;;;:::o;21174:419::-;21340:4;21378:2;21367:9;21363:18;21355:26;;21427:9;21421:4;21417:20;21413:1;21402:9;21398:17;21391:47;21455:131;21581:4;21455:131;:::i;:::-;21447:139;;21174:419;;;:::o;21599:232::-;21739:34;21735:1;21727:6;21723:14;21716:58;21808:15;21803:2;21795:6;21791:15;21784:40;21599:232;:::o;21837:366::-;21979:3;22000:67;22064:2;22059:3;22000:67;:::i;:::-;21993:74;;22076:93;22165:3;22076:93;:::i;:::-;22194:2;22189:3;22185:12;22178:19;;21837:366;;;:::o;22209:419::-;22375:4;22413:2;22402:9;22398:18;22390:26;;22462:9;22456:4;22452:20;22448:1;22437:9;22433:17;22426:47;22490:131;22616:4;22490:131;:::i;:::-;22482:139;;22209:419;;;:::o;22634:141::-;22683:4;22706:3;22698:11;;22729:3;22726:1;22719:14;22763:4;22760:1;22750:18;22742:26;;22634:141;;;:::o;22781:93::-;22818:6;22865:2;22860;22853:5;22849:14;22845:23;22835:33;;22781:93;;;:::o;22880:107::-;22924:8;22974:5;22968:4;22964:16;22943:37;;22880:107;;;;:::o;22993:393::-;23062:6;23112:1;23100:10;23096:18;23135:97;23165:66;23154:9;23135:97;:::i;:::-;23253:39;23283:8;23272:9;23253:39;:::i;:::-;23241:51;;23325:4;23321:9;23314:5;23310:21;23301:30;;23374:4;23364:8;23360:19;23353:5;23350:30;23340:40;;23069:317;;22993:393;;;;;:::o;23392:60::-;23420:3;23441:5;23434:12;;23392:60;;;:::o;23458:142::-;23508:9;23541:53;23559:34;23568:24;23586:5;23568:24;:::i;:::-;23559:34;:::i;:::-;23541:53;:::i;:::-;23528:66;;23458:142;;;:::o;23606:75::-;23649:3;23670:5;23663:12;;23606:75;;;:::o;23687:269::-;23797:39;23828:7;23797:39;:::i;:::-;23858:91;23907:41;23931:16;23907:41;:::i;:::-;23899:6;23892:4;23886:11;23858:91;:::i;:::-;23852:4;23845:105;23763:193;23687:269;;;:::o;23962:73::-;24007:3;23962:73;:::o;24041:189::-;24118:32;;:::i;:::-;24159:65;24217:6;24209;24203:4;24159:65;:::i;:::-;24094:136;24041:189;;:::o;24236:186::-;24296:120;24313:3;24306:5;24303:14;24296:120;;;24367:39;24404:1;24397:5;24367:39;:::i;:::-;24340:1;24333:5;24329:13;24320:22;;24296:120;;;24236:186;;:::o;24428:543::-;24529:2;24524:3;24521:11;24518:446;;;24563:38;24595:5;24563:38;:::i;:::-;24647:29;24665:10;24647:29;:::i;:::-;24637:8;24633:44;24830:2;24818:10;24815:18;24812:49;;;24851:8;24836:23;;24812:49;24874:80;24930:22;24948:3;24930:22;:::i;:::-;24920:8;24916:37;24903:11;24874:80;:::i;:::-;24533:431;;24518:446;24428:543;;;:::o;24977:117::-;25031:8;25081:5;25075:4;25071:16;25050:37;;24977:117;;;;:::o;25100:169::-;25144:6;25177:51;25225:1;25221:6;25213:5;25210:1;25206:13;25177:51;:::i;:::-;25173:56;25258:4;25252;25248:15;25238:25;;25151:118;25100:169;;;;:::o;25274:295::-;25350:4;25496:29;25521:3;25515:4;25496:29;:::i;:::-;25488:37;;25558:3;25555:1;25551:11;25545:4;25542:21;25534:29;;25274:295;;;;:::o;25574:1395::-;25691:37;25724:3;25691:37;:::i;:::-;25793:18;25785:6;25782:30;25779:56;;;25815:18;;:::i;:::-;25779:56;25859:38;25891:4;25885:11;25859:38;:::i;:::-;25944:67;26004:6;25996;25990:4;25944:67;:::i;:::-;26038:1;26062:4;26049:17;;26094:2;26086:6;26083:14;26111:1;26106:618;;;;26768:1;26785:6;26782:77;;;26834:9;26829:3;26825:19;26819:26;26810:35;;26782:77;26885:67;26945:6;26938:5;26885:67;:::i;:::-;26879:4;26872:81;26741:222;26076:887;;26106:618;26158:4;26154:9;26146:6;26142:22;26192:37;26224:4;26192:37;:::i;:::-;26251:1;26265:208;26279:7;26276:1;26273:14;26265:208;;;26358:9;26353:3;26349:19;26343:26;26335:6;26328:42;26409:1;26401:6;26397:14;26387:24;;26456:2;26445:9;26441:18;26428:31;;26302:4;26299:1;26295:12;26290:17;;26265:208;;;26501:6;26492:7;26489:19;26486:179;;;26559:9;26554:3;26550:19;26544:26;26602:48;26644:4;26636:6;26632:17;26621:9;26602:48;:::i;:::-;26594:6;26587:64;26509:156;26486:179;26711:1;26707;26699:6;26695:14;26691:22;26685:4;26678:36;26113:611;;;26076:887;;25666:1303;;;25574:1395;;:::o;26975:174::-;27115:26;27111:1;27103:6;27099:14;27092:50;26975:174;:::o;27155:366::-;27297:3;27318:67;27382:2;27377:3;27318:67;:::i;:::-;27311:74;;27394:93;27483:3;27394:93;:::i;:::-;27512:2;27507:3;27503:12;27496:19;;27155:366;;;:::o;27527:419::-;27693:4;27731:2;27720:9;27716:18;27708:26;;27780:9;27774:4;27770:20;27766:1;27755:9;27751:17;27744:47;27808:131;27934:4;27808:131;:::i;:::-;27800:139;;27527:419;;;:::o;27952:228::-;28092:34;28088:1;28080:6;28076:14;28069:58;28161:11;28156:2;28148:6;28144:15;28137:36;27952:228;:::o;28186:366::-;28328:3;28349:67;28413:2;28408:3;28349:67;:::i;:::-;28342:74;;28425:93;28514:3;28425:93;:::i;:::-;28543:2;28538:3;28534:12;28527:19;;28186:366;;;:::o;28558:419::-;28724:4;28762:2;28751:9;28747:18;28739:26;;28811:9;28805:4;28801:20;28797:1;28786:9;28782:17;28775:47;28839:131;28965:4;28839:131;:::i;:::-;28831:139;;28558:419;;;:::o;28983:170::-;29123:22;29119:1;29111:6;29107:14;29100:46;28983:170;:::o;29159:366::-;29301:3;29322:67;29386:2;29381:3;29322:67;:::i;:::-;29315:74;;29398:93;29487:3;29398:93;:::i;:::-;29516:2;29511:3;29507:12;29500:19;;29159:366;;;:::o;29531:419::-;29697:4;29735:2;29724:9;29720:18;29712:26;;29784:9;29778:4;29774:20;29770:1;29759:9;29755:17;29748:47;29812:131;29938:4;29812:131;:::i;:::-;29804:139;;29531:419;;;:::o;29956:194::-;29996:4;30016:20;30034:1;30016:20;:::i;:::-;30011:25;;30050:20;30068:1;30050:20;:::i;:::-;30045:25;;30094:1;30091;30087:9;30079:17;;30118:1;30112:4;30109:11;30106:37;;;30123:18;;:::i;:::-;30106:37;29956:194;;;;:::o;30156:221::-;30296:34;30292:1;30284:6;30280:14;30273:58;30365:4;30360:2;30352:6;30348:15;30341:29;30156:221;:::o;30383:366::-;30525:3;30546:67;30610:2;30605:3;30546:67;:::i;:::-;30539:74;;30622:93;30711:3;30622:93;:::i;:::-;30740:2;30735:3;30731:12;30724:19;;30383:366;;;:::o;30755:419::-;30921:4;30959:2;30948:9;30944:18;30936:26;;31008:9;31002:4;30998:20;30994:1;30983:9;30979:17;30972:47;31036:131;31162:4;31036:131;:::i;:::-;31028:139;;30755:419;;;:::o;31180:181::-;31320:33;31316:1;31308:6;31304:14;31297:57;31180:181;:::o;31367:366::-;31509:3;31530:67;31594:2;31589:3;31530:67;:::i;:::-;31523:74;;31606:93;31695:3;31606:93;:::i;:::-;31724:2;31719:3;31715:12;31708:19;;31367:366;;;:::o;31739:419::-;31905:4;31943:2;31932:9;31928:18;31920:26;;31992:9;31986:4;31982:20;31978:1;31967:9;31963:17;31956:47;32020:131;32146:4;32020:131;:::i;:::-;32012:139;;31739:419;;;:::o;32164:167::-;32304:19;32300:1;32292:6;32288:14;32281:43;32164:167;:::o;32337:366::-;32479:3;32500:67;32564:2;32559:3;32500:67;:::i;:::-;32493:74;;32576:93;32665:3;32576:93;:::i;:::-;32694:2;32689:3;32685:12;32678:19;;32337:366;;;:::o;32709:419::-;32875:4;32913:2;32902:9;32898:18;32890:26;;32962:9;32956:4;32952:20;32948:1;32937:9;32933:17;32926:47;32990:131;33116:4;32990:131;:::i;:::-;32982:139;;32709:419;;;:::o;33134:94::-;33167:8;33215:5;33211:2;33207:14;33186:35;;33134:94;;;:::o;33234:::-;33273:7;33302:20;33316:5;33302:20;:::i;:::-;33291:31;;33234:94;;;:::o;33334:100::-;33373:7;33402:26;33422:5;33402:26;:::i;:::-;33391:37;;33334:100;;;:::o;33440:157::-;33545:45;33565:24;33583:5;33565:24;:::i;:::-;33545:45;:::i;:::-;33540:3;33533:58;33440:157;;:::o;33603:256::-;33715:3;33730:75;33801:3;33792:6;33730:75;:::i;:::-;33830:2;33825:3;33821:12;33814:19;;33850:3;33843:10;;33603:256;;;;:::o;33865:225::-;34005:34;34001:1;33993:6;33989:14;33982:58;34074:8;34069:2;34061:6;34057:15;34050:33;33865:225;:::o;34096:366::-;34238:3;34259:67;34323:2;34318:3;34259:67;:::i;:::-;34252:74;;34335:93;34424:3;34335:93;:::i;:::-;34453:2;34448:3;34444:12;34437:19;;34096:366;;;:::o;34468:419::-;34634:4;34672:2;34661:9;34657:18;34649:26;;34721:9;34715:4;34711:20;34707:1;34696:9;34692:17;34685:47;34749:131;34875:4;34749:131;:::i;:::-;34741:139;;34468:419;;;:::o;34893:178::-;35033:30;35029:1;35021:6;35017:14;35010:54;34893:178;:::o;35077:366::-;35219:3;35240:67;35304:2;35299:3;35240:67;:::i;:::-;35233:74;;35316:93;35405:3;35316:93;:::i;:::-;35434:2;35429:3;35425:12;35418:19;;35077:366;;;:::o;35449:419::-;35615:4;35653:2;35642:9;35638:18;35630:26;;35702:9;35696:4;35692:20;35688:1;35677:9;35673:17;35666:47;35730:131;35856:4;35730:131;:::i;:::-;35722:139;;35449:419;;;:::o;35874:229::-;36014:34;36010:1;36002:6;35998:14;35991:58;36083:12;36078:2;36070:6;36066:15;36059:37;35874:229;:::o;36109:366::-;36251:3;36272:67;36336:2;36331:3;36272:67;:::i;:::-;36265:74;;36348:93;36437:3;36348:93;:::i;:::-;36466:2;36461:3;36457:12;36450:19;;36109:366;;;:::o;36481:419::-;36647:4;36685:2;36674:9;36670:18;36662:26;;36734:9;36728:4;36724:20;36720:1;36709:9;36705:17;36698:47;36762:131;36888:4;36762:131;:::i;:::-;36754:139;;36481:419;;;:::o;36906:178::-;37046:30;37042:1;37034:6;37030:14;37023:54;36906:178;:::o;37090:366::-;37232:3;37253:67;37317:2;37312:3;37253:67;:::i;:::-;37246:74;;37329:93;37418:3;37329:93;:::i;:::-;37447:2;37442:3;37438:12;37431:19;;37090:366;;;:::o;37462:419::-;37628:4;37666:2;37655:9;37651:18;37643:26;;37715:9;37709:4;37705:20;37701:1;37690:9;37686:17;37679:47;37743:131;37869:4;37743:131;:::i;:::-;37735:139;;37462:419;;;:::o;37887:163::-;38027:15;38023:1;38015:6;38011:14;38004:39;37887:163;:::o;38056:366::-;38198:3;38219:67;38283:2;38278:3;38219:67;:::i;:::-;38212:74;;38295:93;38384:3;38295:93;:::i;:::-;38413:2;38408:3;38404:12;38397:19;;38056:366;;;:::o;38428:419::-;38594:4;38632:2;38621:9;38617:18;38609:26;;38681:9;38675:4;38671:20;38667:1;38656:9;38652:17;38645:47;38709:131;38835:4;38709:131;:::i;:::-;38701:139;;38428:419;;;:::o;38853:181::-;38993:33;38989:1;38981:6;38977:14;38970:57;38853:181;:::o;39040:366::-;39182:3;39203:67;39267:2;39262:3;39203:67;:::i;:::-;39196:74;;39279:93;39368:3;39279:93;:::i;:::-;39397:2;39392:3;39388:12;39381:19;;39040:366;;;:::o;39412:419::-;39578:4;39616:2;39605:9;39601:18;39593:26;;39665:9;39659:4;39655:20;39651:1;39640:9;39636:17;39629:47;39693:131;39819:4;39693:131;:::i;:::-;39685:139;;39412:419;;;:::o;39837:148::-;39939:11;39976:3;39961:18;;39837:148;;;;:::o;40015:874::-;40118:3;40155:5;40149:12;40184:36;40210:9;40184:36;:::i;:::-;40236:89;40318:6;40313:3;40236:89;:::i;:::-;40229:96;;40356:1;40345:9;40341:17;40372:1;40367:166;;;;40547:1;40542:341;;;;40334:549;;40367:166;40451:4;40447:9;40436;40432:25;40427:3;40420:38;40513:6;40506:14;40499:22;40491:6;40487:35;40482:3;40478:45;40471:52;;40367:166;;40542:341;40609:38;40641:5;40609:38;:::i;:::-;40669:1;40683:154;40697:6;40694:1;40691:13;40683:154;;;40771:7;40765:14;40761:1;40756:3;40752:11;40745:35;40821:1;40812:7;40808:15;40797:26;;40719:4;40716:1;40712:12;40707:17;;40683:154;;;40866:6;40861:3;40857:16;40850:23;;40549:334;;40334:549;;40122:767;;40015:874;;;;:::o;40895:390::-;41001:3;41029:39;41062:5;41029:39;:::i;:::-;41084:89;41166:6;41161:3;41084:89;:::i;:::-;41077:96;;41182:65;41240:6;41235:3;41228:4;41221:5;41217:16;41182:65;:::i;:::-;41272:6;41267:3;41263:16;41256:23;;41005:280;40895:390;;;;:::o;41291:182::-;41459:7;41454:3;41447:20;41291:182;:::o;41479:693::-;41746:3;41768:92;41856:3;41847:6;41768:92;:::i;:::-;41761:99;;41877:95;41968:3;41959:6;41877:95;:::i;:::-;41870:102;;41982:137;42115:3;41982:137;:::i;:::-;42144:1;42139:3;42135:11;42128:18;;42163:3;42156:10;;41479:693;;;;;:::o;42178:225::-;42318:34;42314:1;42306:6;42302:14;42295:58;42387:8;42382:2;42374:6;42370:15;42363:33;42178:225;:::o;42409:366::-;42551:3;42572:67;42636:2;42631:3;42572:67;:::i;:::-;42565:74;;42648:93;42737:3;42648:93;:::i;:::-;42766:2;42761:3;42757:12;42750:19;;42409:366;;;:::o;42781:419::-;42947:4;42985:2;42974:9;42970:18;42962:26;;43034:9;43028:4;43024:20;43020:1;43009:9;43005:17;42998:47;43062:131;43188:4;43062:131;:::i;:::-;43054:139;;42781:419;;;:::o;43206:231::-;43346:34;43342:1;43334:6;43330:14;43323:58;43415:14;43410:2;43402:6;43398:15;43391:39;43206:231;:::o;43443:366::-;43585:3;43606:67;43670:2;43665:3;43606:67;:::i;:::-;43599:74;;43682:93;43771:3;43682:93;:::i;:::-;43800:2;43795:3;43791:12;43784:19;;43443:366;;;:::o;43815:419::-;43981:4;44019:2;44008:9;44004:18;43996:26;;44068:9;44062:4;44058:20;44054:1;44043:9;44039:17;44032:47;44096:131;44222:4;44096:131;:::i;:::-;44088:139;;43815:419;;;:::o;44240:224::-;44380:34;44376:1;44368:6;44364:14;44357:58;44449:7;44444:2;44436:6;44432:15;44425:32;44240:224;:::o;44470:366::-;44612:3;44633:67;44697:2;44692:3;44633:67;:::i;:::-;44626:74;;44709:93;44798:3;44709:93;:::i;:::-;44827:2;44822:3;44818:12;44811:19;;44470:366;;;:::o;44842:419::-;45008:4;45046:2;45035:9;45031:18;45023:26;;45095:9;45089:4;45085:20;45081:1;45070:9;45066:17;45059:47;45123:131;45249:4;45123:131;:::i;:::-;45115:139;;44842:419;;;:::o;45267:223::-;45407:34;45403:1;45395:6;45391:14;45384:58;45476:6;45471:2;45463:6;45459:15;45452:31;45267:223;:::o;45496:366::-;45638:3;45659:67;45723:2;45718:3;45659:67;:::i;:::-;45652:74;;45735:93;45824:3;45735:93;:::i;:::-;45853:2;45848:3;45844:12;45837:19;;45496:366;;;:::o;45868:419::-;46034:4;46072:2;46061:9;46057:18;46049:26;;46121:9;46115:4;46111:20;46107:1;46096:9;46092:17;46085:47;46149:131;46275:4;46149:131;:::i;:::-;46141:139;;45868:419;;;:::o;46293:175::-;46433:27;46429:1;46421:6;46417:14;46410:51;46293:175;:::o;46474:366::-;46616:3;46637:67;46701:2;46696:3;46637:67;:::i;:::-;46630:74;;46713:93;46802:3;46713:93;:::i;:::-;46831:2;46826:3;46822:12;46815:19;;46474:366;;;:::o;46846:419::-;47012:4;47050:2;47039:9;47035:18;47027:26;;47099:9;47093:4;47089:20;47085:1;47074:9;47070:17;47063:47;47127:131;47253:4;47127:131;:::i;:::-;47119:139;;46846:419;;;:::o;47271:237::-;47411:34;47407:1;47399:6;47395:14;47388:58;47480:20;47475:2;47467:6;47463:15;47456:45;47271:237;:::o;47514:366::-;47656:3;47677:67;47741:2;47736:3;47677:67;:::i;:::-;47670:74;;47753:93;47842:3;47753:93;:::i;:::-;47871:2;47866:3;47862:12;47855:19;;47514:366;;;:::o;47886:419::-;48052:4;48090:2;48079:9;48075:18;48067:26;;48139:9;48133:4;48129:20;48125:1;48114:9;48110:17;48103:47;48167:131;48293:4;48167:131;:::i;:::-;48159:139;;47886:419;;;:::o;48311:233::-;48350:3;48373:24;48391:5;48373:24;:::i;:::-;48364:33;;48419:66;48412:5;48409:77;48406:103;;48489:18;;:::i;:::-;48406:103;48536:1;48529:5;48525:13;48518:20;;48311:233;;;:::o;48550:180::-;48598:77;48595:1;48588:88;48695:4;48692:1;48685:15;48719:4;48716:1;48709:15;48736:185;48776:1;48793:20;48811:1;48793:20;:::i;:::-;48788:25;;48827:20;48845:1;48827:20;:::i;:::-;48822:25;;48866:1;48856:35;;48871:18;;:::i;:::-;48856:35;48913:1;48910;48906:9;48901:14;;48736:185;;;;:::o;48927:176::-;48959:1;48976:20;48994:1;48976:20;:::i;:::-;48971:25;;49010:20;49028:1;49010:20;:::i;:::-;49005:25;;49049:1;49039:35;;49054:18;;:::i;:::-;49039:35;49095:1;49092;49088:9;49083:14;;48927:176;;;;:::o;49109:180::-;49157:77;49154:1;49147:88;49254:4;49251:1;49244:15;49278:4;49275:1;49268:15;49295:79;49334:7;49363:5;49352:16;;49295:79;;;:::o;49380:157::-;49485:45;49505:24;49523:5;49505:24;:::i;:::-;49485:45;:::i;:::-;49480:3;49473:58;49380:157;;:::o;49543:397::-;49683:3;49698:75;49769:3;49760:6;49698:75;:::i;:::-;49798:2;49793:3;49789:12;49782:19;;49811:75;49882:3;49873:6;49811:75;:::i;:::-;49911:2;49906:3;49902:12;49895:19;;49931:3;49924:10;;49543:397;;;;;:::o;49946:98::-;49997:6;50031:5;50025:12;50015:22;;49946:98;;;:::o;50050:168::-;50133:11;50167:6;50162:3;50155:19;50207:4;50202:3;50198:14;50183:29;;50050:168;;;;:::o;50224:373::-;50310:3;50338:38;50370:5;50338:38;:::i;:::-;50392:70;50455:6;50450:3;50392:70;:::i;:::-;50385:77;;50471:65;50529:6;50524:3;50517:4;50510:5;50506:16;50471:65;:::i;:::-;50561:29;50583:6;50561:29;:::i;:::-;50556:3;50552:39;50545:46;;50314:283;50224:373;;;;:::o;50603:640::-;50798:4;50836:3;50825:9;50821:19;50813:27;;50850:71;50918:1;50907:9;50903:17;50894:6;50850:71;:::i;:::-;50931:72;50999:2;50988:9;50984:18;50975:6;50931:72;:::i;:::-;51013;51081:2;51070:9;51066:18;51057:6;51013:72;:::i;:::-;51132:9;51126:4;51122:20;51117:2;51106:9;51102:18;51095:48;51160:76;51231:4;51222:6;51160:76;:::i;:::-;51152:84;;50603:640;;;;;;;:::o;51249:141::-;51305:5;51336:6;51330:13;51321:22;;51352:32;51378:5;51352:32;:::i;:::-;51249:141;;;;:::o;51396:349::-;51465:6;51514:2;51502:9;51493:7;51489:23;51485:32;51482:119;;;51520:79;;:::i;:::-;51482:119;51640:1;51665:63;51720:7;51711:6;51700:9;51696:22;51665:63;:::i;:::-;51655:73;;51611:127;51396:349;;;;:::o;51751:182::-;51891:34;51887:1;51879:6;51875:14;51868:58;51751:182;:::o;51939:366::-;52081:3;52102:67;52166:2;52161:3;52102:67;:::i;:::-;52095:74;;52178:93;52267:3;52178:93;:::i;:::-;52296:2;52291:3;52287:12;52280:19;;51939:366;;;:::o;52311:419::-;52477:4;52515:2;52504:9;52500:18;52492:26;;52564:9;52558:4;52554:20;52550:1;52539:9;52535:17;52528:47;52592:131;52718:4;52592:131;:::i;:::-;52584:139;;52311:419;;;:::o;52736:178::-;52876:30;52872:1;52864:6;52860:14;52853:54;52736:178;:::o;52920:366::-;53062:3;53083:67;53147:2;53142:3;53083:67;:::i;:::-;53076:74;;53159:93;53248:3;53159:93;:::i;:::-;53277:2;53272:3;53268:12;53261:19;;52920:366;;;:::o;53292:419::-;53458:4;53496:2;53485:9;53481:18;53473:26;;53545:9;53539:4;53535:20;53531:1;53520:9;53516:17;53509:47;53573:131;53699:4;53573:131;:::i;:::-;53565:139;;53292:419;;;:::o
Swarm Source
ipfs://0f34e1f14ea718630dba9dc90a87314cf396b94680595ef19bb71d393bec802f
Loading...
Loading
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.