ERC-721
Overview
Max Total Supply
0 UGO
Holders
519
Market
Volume (24H)
0.0395 ETH
Min Price (24H)
$144.15 @ 0.039499 ETH
Max Price (24H)
$144.15 @ 0.039499 ETH
Other Info
Token Contract
Balance
0 UGOLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
UprisingGenesisOrigins
Compiler Version
v0.8.18+commit.87f61d96
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-08-14 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.17; /// @title Uprising Genesis: Origins /// @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 UprisingGenesisOrigins is ERC721, Ownable { /// @notice The base uri of the project string public baseURI; /// @notice The collection's max supply uint256 public maxSupply = 1111; /// @notice Total reserved uint256 public reserved = 111; 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("Uprising Genesis: Origins", "UGO") { baseURI = "ipfs://QmeFJ6TPnvJc6X6dyK1xjRr1TDbNW8vtuJuvTrVjkV8HYX/"; } /// 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 { 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
[{"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 UprisingGenesisOrigins.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
6080604052610457600a55606f600b556000601560006101000a81548160ff0219169083600381111562000038576200003762000244565b5b02179055503480156200004a57600080fd5b506040518060400160405280601981526020017f5570726973696e672047656e657369733a204f726967696e73000000000000008152506040518060400160405280600381526020017f55474f00000000000000000000000000000000000000000000000000000000008152508160009081620000c89190620004ed565b508060019081620000da9190620004ed565b505050620000fd620000f16200012e60201b60201c565b6200013660201b60201c565b60405180606001604052806036815260200162004d366036913960099081620001279190620004ed565b50620005d4565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905080600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426008819055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620002f557607f821691505b6020821081036200030b576200030a620002ad565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620003757fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000336565b62000381868362000336565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620003ce620003c8620003c28462000399565b620003a3565b62000399565b9050919050565b6000819050919050565b620003ea83620003ad565b62000402620003f982620003d5565b84845462000343565b825550505050565b600090565b620004196200040a565b62000426818484620003df565b505050565b5b818110156200044e57620004426000826200040f565b6001810190506200042c565b5050565b601f8211156200049d57620004678162000311565b620004728462000326565b8101602085101562000482578190505b6200049a620004918562000326565b8301826200042b565b50505b505050565b600082821c905092915050565b6000620004c260001984600802620004a2565b1980831691505092915050565b6000620004dd8383620004af565b9150826002028217905092915050565b620004f88262000273565b67ffffffffffffffff8111156200051457620005136200027e565b5b620005208254620002dc565b6200052d82828562000452565b600060209050601f83116001811462000565576000841562000550578287015190505b6200055c8582620004cf565b865550620005cc565b601f198416620005758662000311565b60005b828110156200059f5784890151825560018201915060208501945060208101905062000578565b86831015620005bf5784890151620005bb601f891682620004af565b8355505b6001600288020188555050505b505050505050565b61475280620005e46000396000f3fe608060405234801561001057600080fd5b50600436106102485760003560e01c80638da5cb5b1161013b578063c87b56dd116100b8578063f20423141161007c578063f2042314146106c9578063f2fde38b146106e7578063f487404f14610703578063f9c957d814610721578063fe60d12c1461073d57610248565b8063c87b56dd1461060f578063d371f76b1461063f578063d5abeb011461065d578063e921dad21461067b578063e985e9c51461069957610248565b8063ab81e062116100ff578063ab81e0621461056d578063ad8c3f3314610589578063b2422232146105a5578063b88d4fde146105d5578063c051e38a146105f157610248565b80638da5cb5b146104db57806395d89b41146104f9578063a06cb71914610517578063a22cb46514610533578063a2309ff81461054f57610248565b806335d5959a116101c95780636352211e1161018d5780636352211e146104235780636c0360eb1461045357806370a0823114610471578063715018a6146104a1578063893807aa146104ab57610248565b806335d5959a146103935780633c186018146103af57806342842e0e146103cd5780634f297ccc146103e957806355f804b31461040757610248565b80630bb862d1116102105780630bb862d11461030357806316f9b7071461031f57806323b872dd1461033b5780632dc7b8551461035757806332f4681c1461037557610248565b806301ffc9a71461024d57806306fdde031461027d578063081812fc1461029b578063084520b4146102cb578063095ea7b3146102e7575b600080fd5b61026760048036038101906102629190612b89565b61075b565b6040516102749190612bd1565b60405180910390f35b61028561083d565b6040516102929190612c7c565b60405180910390f35b6102b560048036038101906102b09190612cd4565b6108cf565b6040516102c29190612d42565b60405180910390f35b6102e560048036038101906102e09190612d89565b610915565b005b61030160048036038101906102fc9190612d89565b610a3c565b005b61031d60048036038101906103189190612cd4565b610b53565b005b61033960048036038101906103349190612cd4565b610c0e565b005b61035560048036038101906103509190612dc9565b610c94565b005b61035f610cf4565b60405161036c9190612e35565b60405180910390f35b61037d610cfa565b60405161038a9190612e5f565b60405180910390f35b6103ad60048036038101906103a89190612ea6565b610d00565b005b6103b7610d86565b6040516103c49190612e5f565b60405180910390f35b6103e760048036038101906103e29190612dc9565b610dab565b005b6103f1610dcb565b6040516103fe9190612e5f565b60405180910390f35b610421600480360381019061041c9190613008565b610dd1565b005b61043d60048036038101906104389190612cd4565b610e60565b60405161044a9190612d42565b60405180910390f35b61045b610ee6565b6040516104689190612c7c565b60405180910390f35b61048b60048036038101906104869190613051565b610f74565b6040516104989190612e5f565b60405180910390f35b6104a961102b565b005b6104c560048036038101906104c09190613051565b6110b3565b6040516104d29190612bd1565b60405180910390f35b6104e36110d3565b6040516104f09190612d42565b60405180910390f35b6105016110fd565b60405161050e9190612c7c565b60405180910390f35b610531600480360381019061052c9190613051565b61118f565b005b61054d600480360381019061054891906130aa565b611284565b005b61055761129a565b6040516105649190612e5f565b60405180910390f35b6105876004803603810190610582919061314a565b6112ab565b005b6105a3600480360381019061059e9190612ea6565b6117aa565b005b6105bf60048036038101906105ba9190613051565b611830565b6040516105cc9190612bd1565b60405180910390f35b6105ef60048036038101906105ea919061324b565b611850565b005b6105f96118b2565b6040516106069190613345565b60405180910390f35b61062960048036038101906106249190612cd4565b6118c5565b6040516106369190612c7c565b60405180910390f35b610647611971565b6040516106549190612e5f565b60405180910390f35b610665611982565b6040516106729190612e5f565b60405180910390f35b610683611988565b6040516106909190612e35565b60405180910390f35b6106b360048036038101906106ae9190613360565b61198e565b6040516106c09190612bd1565b60405180910390f35b6106d1611a22565b6040516106de9190612e5f565b60405180910390f35b61070160048036038101906106fc9190613051565b611a33565b005b61070b611b2a565b6040516107189190612d42565b60405180910390f35b61073b60048036038101906107369190612cd4565b611b54565b005b610745611bda565b6040516107529190612e5f565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061082657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610836575061083582611be0565b5b9050919050565b60606000805461084c906133cf565b80601f0160208091040260200160405190810160405280929190818152602001828054610878906133cf565b80156108c55780601f1061089a576101008083540402835291602001916108c5565b820191906000526020600020905b8154815290600101906020018083116108a857829003601f168201915b5050505050905090565b60006108da82611c4a565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b61091d611c95565b73ffffffffffffffffffffffffffffffffffffffff1661093b6110d3565b73ffffffffffffffffffffffffffffffffffffffff1614610991576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109889061344c565b60405180910390fd5b600b54600c54826109a2919061349b565b11156109e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109da9061351b565b60405180910390fd5b60005b81811015610a1e5760006109fa6012611c9d565b9050610a066012611cab565b610a108482611cc1565b8180600101925050506109e6565b5080600c6000828254610a31919061349b565b925050819055505050565b6000610a4782610e60565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610ab7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aae906135ad565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ad6611c95565b73ffffffffffffffffffffffffffffffffffffffff161480610b055750610b0481610aff611c95565b61198e565b5b610b44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3b9061363f565b60405180910390fd5b610b4e8383611cdf565b505050565b610b5b611c95565b73ffffffffffffffffffffffffffffffffffffffff16610b796110d3565b73ffffffffffffffffffffffffffffffffffffffff1614610bcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc69061344c565b60405180910390fd5b806003811115610be257610be16132ce565b5b601560006101000a81548160ff02191690836003811115610c0657610c056132ce565b5b021790555050565b610c16611c95565b73ffffffffffffffffffffffffffffffffffffffff16610c346110d3565b73ffffffffffffffffffffffffffffffffffffffff1614610c8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c819061344c565b60405180910390fd5b80600b8190555050565b610ca5610c9f611c95565b82611d98565b610ce4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cdb906136d1565b60405180910390fd5b610cef838383611e76565b505050565b600e5481565b600d5481565b610d08611c95565b73ffffffffffffffffffffffffffffffffffffffff16610d266110d3565b73ffffffffffffffffffffffffffffffffffffffff1614610d7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d739061344c565b60405180910390fd5b80600e8190555050565b6000610d926014611c9d565b610d9c6013611c9d565b610da6919061349b565b905090565b610dc683838360405180602001604052806000815250611850565b505050565b600c5481565b610dd9611c95565b73ffffffffffffffffffffffffffffffffffffffff16610df76110d3565b73ffffffffffffffffffffffffffffffffffffffff1614610e4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e449061344c565b60405180910390fd5b8060099081610e5c919061389d565b5050565b600080610e6c83612181565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610edd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed4906139bb565b60405180910390fd5b80915050919050565b60098054610ef3906133cf565b80601f0160208091040260200160405190810160405280929190818152602001828054610f1f906133cf565b8015610f6c5780601f10610f4157610100808354040283529160200191610f6c565b820191906000526020600020905b815481529060010190602001808311610f4f57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610fe4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fdb90613a4d565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611033611c95565b73ffffffffffffffffffffffffffffffffffffffff166110516110d3565b73ffffffffffffffffffffffffffffffffffffffff16146110a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109e9061344c565b60405180910390fd5b6110b160006121be565b565b60116020528060005260406000206000915054906101000a900460ff1681565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461110c906133cf565b80601f0160208091040260200160405190810160405280929190818152602001828054611138906133cf565b80156111855780601f1061115a57610100808354040283529160200191611185565b820191906000526020600020905b81548152906001019060200180831161116857829003601f168201915b5050505050905090565b6003808111156111a2576111a16132ce565b5b601560009054906101000a900460ff1660038111156111c4576111c36132ce565b5b14611204576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111fb90613ab9565b60405180910390fd5b600b54600a546112149190613ad9565b61121e6012611c9d565b1061125e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125590613b7f565b60405180910390fd5b600061126a6012611c9d565b90506112766012611cab565b6112808282611cc1565b5050565b61129661128f611c95565b83836122cc565b5050565b60006112a66012611c9d565b905090565b600160038111156112bf576112be6132ce565b5b601560009054906101000a900460ff1660038111156112e1576112e06132ce565b5b14806113205750600260038111156112fc576112fb6132ce565b5b601560009054906101000a900460ff16600381111561131e5761131d6132ce565b5b145b61135f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135690613beb565b60405180910390fd5b600a5461136c6012611c9d565b106113ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a390613c57565b60405180910390fd5b6000836040516020016113bf9190613cbf565b6040516020818303038152906040528051906020012090506000600160038111156113ed576113ec6132ce565b5b601560009054906101000a900460ff16600381111561140f5761140e6132ce565b5b0361155a57600e54905060001515601060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515146114ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a390613d4c565b60405180910390fd5b600d546114b7611a22565b106114f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ee90613db8565b60405180910390fd5b6115016013611cab565b6001601060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b6002600381111561156e5761156d6132ce565b5b601560009054906101000a900460ff1660038111156115905761158f6132ce565b5b036116f557600f54905060001515601160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151461162d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162490613e4a565b60405180910390fd5b600d54600b54600a546116409190613ad9565b61164a9190613ad9565b611652611971565b10611692576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168990613eb6565b60405180910390fd5b61169c6014611cab565b6001601160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b611741848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508284612438565b611780576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177790613f22565b60405180910390fd5b600061178c6012611c9d565b90506117986012611cab565b6117a28682611cc1565b505050505050565b6117b2611c95565b73ffffffffffffffffffffffffffffffffffffffff166117d06110d3565b73ffffffffffffffffffffffffffffffffffffffff1614611826576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181d9061344c565b60405180910390fd5b80600f8190555050565b60106020528060005260406000206000915054906101000a900460ff1681565b61186161185b611c95565b83611d98565b6118a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611897906136d1565b60405180910390fd5b6118ac8484848461244f565b50505050565b601560009054906101000a900460ff1681565b60606118d16012611c9d565b821115611913576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190a90613f8e565b60405180910390fd5b600060098054611922906133cf565b90501161193e576040518060200160405280600081525061196a565b6009611949836124ab565b60405160200161195a929190614093565b6040516020818303038152906040525b9050919050565b600061197d6014611c9d565b905090565b600a5481565b600f5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000611a2e6013611c9d565b905090565b611a3b611c95565b73ffffffffffffffffffffffffffffffffffffffff16611a596110d3565b73ffffffffffffffffffffffffffffffffffffffff1614611aaf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa69061344c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611b1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1590614138565b60405180910390fd5b611b27816121be565b50565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611b5c611c95565b73ffffffffffffffffffffffffffffffffffffffff16611b7a6110d3565b73ffffffffffffffffffffffffffffffffffffffff1614611bd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc79061344c565b60405180910390fd5b80600d8190555050565b600b5481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611c538161260b565b611c92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c89906139bb565b60405180910390fd5b50565b600033905090565b600081600001549050919050565b6001816000016000828254019250508190555050565b611cdb82826040518060200160405280600081525061264c565b5050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611d5283610e60565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611da38261260b565b611de2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd9906141ca565b60405180910390fd5b6000611ded83610e60565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611e2f5750611e2e818561198e565b5b80611e6d57508373ffffffffffffffffffffffffffffffffffffffff16611e55846108cf565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611e9682610e60565b73ffffffffffffffffffffffffffffffffffffffff1614611eec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee39061425c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611f5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f52906142ee565b60405180910390fd5b611f6883838360016126a7565b8273ffffffffffffffffffffffffffffffffffffffff16611f8882610e60565b73ffffffffffffffffffffffffffffffffffffffff1614611fde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd59061425c565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120649190613ad9565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120bb919061349b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461217c83838360016126ad565b505050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905080600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426008819055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361233a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123319061435a565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161242b9190612bd1565b60405180910390a3505050565b60008261244585846126b3565b1490509392505050565b61245a848484611e76565b61246684848484612766565b6124a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249c906143ec565b60405180910390fd5b50505050565b6060600082036124f2576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612606565b600082905060005b6000821461252457808061250d9061440c565b915050600a8261251d9190614483565b91506124fa565b60008167ffffffffffffffff8111156125405761253f612edd565b5b6040519080825280601f01601f1916602001820160405280156125725781602001600182028036833780820191505090505b5090505b600085146125ff5760018261258b9190613ad9565b9150600a8561259a91906144b4565b60306125a6919061349b565b60f81b8183815181106125bc576125bb6144e5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856125f89190614483565b9450612576565b8093505050505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff1661262d83612181565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b61265683836128ed565b6126636000848484612766565b6126a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612699906143ec565b60405180910390fd5b505050565b50505050565b50505050565b60008082905060005b845181101561275b5760008582815181106126da576126d96144e5565b5b6020026020010151905080831161271b5782816040516020016126fe929190614535565b604051602081830303815290604052805190602001209250612747565b808360405160200161272e929190614535565b6040516020818303038152906040528051906020012092505b5080806127539061440c565b9150506126bc565b508091505092915050565b60006127878473ffffffffffffffffffffffffffffffffffffffff16612b0a565b156128e0578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026127b0611c95565b8786866040518563ffffffff1660e01b81526004016127d294939291906145b6565b6020604051808303816000875af192505050801561280e57506040513d601f19601f8201168201806040525081019061280b9190614617565b60015b612890573d806000811461283e576040519150601f19603f3d011682016040523d82523d6000602084013e612843565b606091505b506000815103612888576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287f906143ec565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506128e5565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361295c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161295390614690565b60405180910390fd5b6129658161260b565b156129a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299c906146fc565b60405180910390fd5b6129b36000838360016126a7565b6129bc8161260b565b156129fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129f3906146fc565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612b066000838360016126ad565b5050565b600080823b905060008111915050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612b6681612b31565b8114612b7157600080fd5b50565b600081359050612b8381612b5d565b92915050565b600060208284031215612b9f57612b9e612b27565b5b6000612bad84828501612b74565b91505092915050565b60008115159050919050565b612bcb81612bb6565b82525050565b6000602082019050612be66000830184612bc2565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612c26578082015181840152602081019050612c0b565b60008484015250505050565b6000601f19601f8301169050919050565b6000612c4e82612bec565b612c588185612bf7565b9350612c68818560208601612c08565b612c7181612c32565b840191505092915050565b60006020820190508181036000830152612c968184612c43565b905092915050565b6000819050919050565b612cb181612c9e565b8114612cbc57600080fd5b50565b600081359050612cce81612ca8565b92915050565b600060208284031215612cea57612ce9612b27565b5b6000612cf884828501612cbf565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612d2c82612d01565b9050919050565b612d3c81612d21565b82525050565b6000602082019050612d576000830184612d33565b92915050565b612d6681612d21565b8114612d7157600080fd5b50565b600081359050612d8381612d5d565b92915050565b60008060408385031215612da057612d9f612b27565b5b6000612dae85828601612d74565b9250506020612dbf85828601612cbf565b9150509250929050565b600080600060608486031215612de257612de1612b27565b5b6000612df086828701612d74565b9350506020612e0186828701612d74565b9250506040612e1286828701612cbf565b9150509250925092565b6000819050919050565b612e2f81612e1c565b82525050565b6000602082019050612e4a6000830184612e26565b92915050565b612e5981612c9e565b82525050565b6000602082019050612e746000830184612e50565b92915050565b612e8381612e1c565b8114612e8e57600080fd5b50565b600081359050612ea081612e7a565b92915050565b600060208284031215612ebc57612ebb612b27565b5b6000612eca84828501612e91565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612f1582612c32565b810181811067ffffffffffffffff82111715612f3457612f33612edd565b5b80604052505050565b6000612f47612b1d565b9050612f538282612f0c565b919050565b600067ffffffffffffffff821115612f7357612f72612edd565b5b612f7c82612c32565b9050602081019050919050565b82818337600083830152505050565b6000612fab612fa684612f58565b612f3d565b905082815260208101848484011115612fc757612fc6612ed8565b5b612fd2848285612f89565b509392505050565b600082601f830112612fef57612fee612ed3565b5b8135612fff848260208601612f98565b91505092915050565b60006020828403121561301e5761301d612b27565b5b600082013567ffffffffffffffff81111561303c5761303b612b2c565b5b61304884828501612fda565b91505092915050565b60006020828403121561306757613066612b27565b5b600061307584828501612d74565b91505092915050565b61308781612bb6565b811461309257600080fd5b50565b6000813590506130a48161307e565b92915050565b600080604083850312156130c1576130c0612b27565b5b60006130cf85828601612d74565b92505060206130e085828601613095565b9150509250929050565b600080fd5b600080fd5b60008083601f84011261310a57613109612ed3565b5b8235905067ffffffffffffffff811115613127576131266130ea565b5b602083019150836020820283011115613143576131426130ef565b5b9250929050565b60008060006040848603121561316357613162612b27565b5b600061317186828701612d74565b935050602084013567ffffffffffffffff81111561319257613191612b2c565b5b61319e868287016130f4565b92509250509250925092565b600067ffffffffffffffff8211156131c5576131c4612edd565b5b6131ce82612c32565b9050602081019050919050565b60006131ee6131e9846131aa565b612f3d565b90508281526020810184848401111561320a57613209612ed8565b5b613215848285612f89565b509392505050565b600082601f83011261323257613231612ed3565b5b81356132428482602086016131db565b91505092915050565b6000806000806080858703121561326557613264612b27565b5b600061327387828801612d74565b945050602061328487828801612d74565b935050604061329587828801612cbf565b925050606085013567ffffffffffffffff8111156132b6576132b5612b2c565b5b6132c28782880161321d565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6004811061330e5761330d6132ce565b5b50565b600081905061331f826132fd565b919050565b600061332f82613311565b9050919050565b61333f81613324565b82525050565b600060208201905061335a6000830184613336565b92915050565b6000806040838503121561337757613376612b27565b5b600061338585828601612d74565b925050602061339685828601612d74565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806133e757607f821691505b6020821081036133fa576133f96133a0565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613436602083612bf7565b915061344182613400565b602082019050919050565b6000602082019050818103600083015261346581613429565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006134a682612c9e565b91506134b183612c9e565b92508282019050808211156134c9576134c861346c565b5b92915050565b7f416d6f756e74206578636565647320726573657276656420737570706c790000600082015250565b6000613505601e83612bf7565b9150613510826134cf565b602082019050919050565b60006020820190508181036000830152613534816134f8565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613597602183612bf7565b91506135a28261353b565b604082019050919050565b600060208201905081810360008301526135c68161358a565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000613629603d83612bf7565b9150613634826135cd565b604082019050919050565b600060208201905081810360008301526136588161361c565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b60006136bb602d83612bf7565b91506136c68261365f565b604082019050919050565b600060208201905081810360008301526136ea816136ae565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026137537fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613716565b61375d8683613716565b95508019841693508086168417925050509392505050565b6000819050919050565b600061379a61379561379084612c9e565b613775565b612c9e565b9050919050565b6000819050919050565b6137b48361377f565b6137c86137c0826137a1565b848454613723565b825550505050565b600090565b6137dd6137d0565b6137e88184846137ab565b505050565b5b8181101561380c576138016000826137d5565b6001810190506137ee565b5050565b601f82111561385157613822816136f1565b61382b84613706565b8101602085101561383a578190505b61384e61384685613706565b8301826137ed565b50505b505050565b600082821c905092915050565b600061387460001984600802613856565b1980831691505092915050565b600061388d8383613863565b9150826002028217905092915050565b6138a682612bec565b67ffffffffffffffff8111156138bf576138be612edd565b5b6138c982546133cf565b6138d4828285613810565b600060209050601f83116001811461390757600084156138f5578287015190505b6138ff8582613881565b865550613967565b601f198416613915866136f1565b60005b8281101561393d57848901518255600182019150602085019450602081019050613918565b8683101561395a5784890151613956601f891682613863565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b60006139a5601883612bf7565b91506139b08261396f565b602082019050919050565b600060208201905081810360008301526139d481613998565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000613a37602983612bf7565b9150613a42826139db565b604082019050919050565b60006020820190508181036000830152613a6681613a2a565b9050919050565b7f5075626c6963206d696e7420696e616374697665000000000000000000000000600082015250565b6000613aa3601483612bf7565b9150613aae82613a6d565b602082019050919050565b60006020820190508181036000830152613ad281613a96565b9050919050565b6000613ae482612c9e565b9150613aef83612c9e565b9250828203905081811115613b0757613b0661346c565b5b92915050565b7f4d617820617661696c61626c65207075626c696320737570706c79206d696e7460008201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b6000613b69602283612bf7565b9150613b7482613b0d565b604082019050919050565b60006020820190508181036000830152613b9881613b5c565b9050919050565b7f4e6f7420696e20616c6c6f776c697374206d696e74696e672073746174657300600082015250565b6000613bd5601f83612bf7565b9150613be082613b9f565b602082019050919050565b60006020820190508181036000830152613c0481613bc8565b9050919050565b7f4d617820737570706c79206d696e746564000000000000000000000000000000600082015250565b6000613c41601183612bf7565b9150613c4c82613c0b565b602082019050919050565b60006020820190508181036000830152613c7081613c34565b9050919050565b60008160601b9050919050565b6000613c8f82613c77565b9050919050565b6000613ca182613c84565b9050919050565b613cb9613cb482612d21565b613c96565b82525050565b6000613ccb8284613ca8565b60148201915081905092915050565b7f5573657220616c7265616479206d696e746564206f6e2067756172616e74656560008201527f64206c6973740000000000000000000000000000000000000000000000000000602082015250565b6000613d36602683612bf7565b9150613d4182613cda565b604082019050919050565b60006020820190508181036000830152613d6581613d29565b9050919050565b7f4d61782067756172616e7465656420737570706c79206d696e74656400000000600082015250565b6000613da2601c83612bf7565b9150613dad82613d6c565b602082019050919050565b60006020820190508181036000830152613dd181613d95565b9050919050565b7f5573657220616c7265616479206d696e746564206f6e206f766572737562736360008201527f7269626564206c69737400000000000000000000000000000000000000000000602082015250565b6000613e34602a83612bf7565b9150613e3f82613dd8565b604082019050919050565b60006020820190508181036000830152613e6381613e27565b9050919050565b7f4d617820616c6c6f77206c69737420737570706c79206d696e74656400000000600082015250565b6000613ea0601c83612bf7565b9150613eab82613e6a565b602082019050919050565b60006020820190508181036000830152613ecf81613e93565b9050919050565b7f496e76616c69642070726f6f6600000000000000000000000000000000000000600082015250565b6000613f0c600d83612bf7565b9150613f1782613ed6565b602082019050919050565b60006020820190508181036000830152613f3b81613eff565b9050919050565b7f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e00600082015250565b6000613f78601f83612bf7565b9150613f8382613f42565b602082019050919050565b60006020820190508181036000830152613fa781613f6b565b9050919050565b600081905092915050565b60008154613fc6816133cf565b613fd08186613fae565b94506001821660008114613feb576001811461400057614033565b60ff1983168652811515820286019350614033565b614009856136f1565b60005b8381101561402b5781548189015260018201915060208101905061400c565b838801955050505b50505092915050565b600061404782612bec565b6140518185613fae565b9350614061818560208601612c08565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000815250565b600061409f8285613fb9565b91506140ab828461403c565b91506140b68261406d565b6005820191508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614122602683612bf7565b915061412d826140c6565b604082019050919050565b6000602082019050818103600083015261415181614115565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006141b4602c83612bf7565b91506141bf82614158565b604082019050919050565b600060208201905081810360008301526141e3816141a7565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000614246602583612bf7565b9150614251826141ea565b604082019050919050565b6000602082019050818103600083015261427581614239565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006142d8602483612bf7565b91506142e38261427c565b604082019050919050565b60006020820190508181036000830152614307816142cb565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614344601983612bf7565b915061434f8261430e565b602082019050919050565b6000602082019050818103600083015261437381614337565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006143d6603283612bf7565b91506143e18261437a565b604082019050919050565b60006020820190508181036000830152614405816143c9565b9050919050565b600061441782612c9e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036144495761444861346c565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061448e82612c9e565b915061449983612c9e565b9250826144a9576144a8614454565b5b828204905092915050565b60006144bf82612c9e565b91506144ca83612c9e565b9250826144da576144d9614454565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b61452f61452a82612e1c565b614514565b82525050565b6000614541828561451e565b602082019150614551828461451e565b6020820191508190509392505050565b600081519050919050565b600082825260208201905092915050565b600061458882614561565b614592818561456c565b93506145a2818560208601612c08565b6145ab81612c32565b840191505092915050565b60006080820190506145cb6000830187612d33565b6145d86020830186612d33565b6145e56040830185612e50565b81810360608301526145f7818461457d565b905095945050505050565b60008151905061461181612b5d565b92915050565b60006020828403121561462d5761462c612b27565b5b600061463b84828501614602565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061467a602083612bf7565b915061468582614644565b602082019050919050565b600060208201905081810360008301526146a98161466d565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006146e6601c83612bf7565b91506146f1826146b0565b602082019050919050565b60006020820190508181036000830152614715816146d9565b905091905056fea264697066735822122094ba8e15e1a979ee7ca96b9f21f677a3002c19a9820127fea1b77a066a0fd6b564736f6c63430008120033697066733a2f2f516d65464a3654506e764a6336583664794b31786a5272315444624e57387674754a75765472566a6b56384859582f
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102485760003560e01c80638da5cb5b1161013b578063c87b56dd116100b8578063f20423141161007c578063f2042314146106c9578063f2fde38b146106e7578063f487404f14610703578063f9c957d814610721578063fe60d12c1461073d57610248565b8063c87b56dd1461060f578063d371f76b1461063f578063d5abeb011461065d578063e921dad21461067b578063e985e9c51461069957610248565b8063ab81e062116100ff578063ab81e0621461056d578063ad8c3f3314610589578063b2422232146105a5578063b88d4fde146105d5578063c051e38a146105f157610248565b80638da5cb5b146104db57806395d89b41146104f9578063a06cb71914610517578063a22cb46514610533578063a2309ff81461054f57610248565b806335d5959a116101c95780636352211e1161018d5780636352211e146104235780636c0360eb1461045357806370a0823114610471578063715018a6146104a1578063893807aa146104ab57610248565b806335d5959a146103935780633c186018146103af57806342842e0e146103cd5780634f297ccc146103e957806355f804b31461040757610248565b80630bb862d1116102105780630bb862d11461030357806316f9b7071461031f57806323b872dd1461033b5780632dc7b8551461035757806332f4681c1461037557610248565b806301ffc9a71461024d57806306fdde031461027d578063081812fc1461029b578063084520b4146102cb578063095ea7b3146102e7575b600080fd5b61026760048036038101906102629190612b89565b61075b565b6040516102749190612bd1565b60405180910390f35b61028561083d565b6040516102929190612c7c565b60405180910390f35b6102b560048036038101906102b09190612cd4565b6108cf565b6040516102c29190612d42565b60405180910390f35b6102e560048036038101906102e09190612d89565b610915565b005b61030160048036038101906102fc9190612d89565b610a3c565b005b61031d60048036038101906103189190612cd4565b610b53565b005b61033960048036038101906103349190612cd4565b610c0e565b005b61035560048036038101906103509190612dc9565b610c94565b005b61035f610cf4565b60405161036c9190612e35565b60405180910390f35b61037d610cfa565b60405161038a9190612e5f565b60405180910390f35b6103ad60048036038101906103a89190612ea6565b610d00565b005b6103b7610d86565b6040516103c49190612e5f565b60405180910390f35b6103e760048036038101906103e29190612dc9565b610dab565b005b6103f1610dcb565b6040516103fe9190612e5f565b60405180910390f35b610421600480360381019061041c9190613008565b610dd1565b005b61043d60048036038101906104389190612cd4565b610e60565b60405161044a9190612d42565b60405180910390f35b61045b610ee6565b6040516104689190612c7c565b60405180910390f35b61048b60048036038101906104869190613051565b610f74565b6040516104989190612e5f565b60405180910390f35b6104a961102b565b005b6104c560048036038101906104c09190613051565b6110b3565b6040516104d29190612bd1565b60405180910390f35b6104e36110d3565b6040516104f09190612d42565b60405180910390f35b6105016110fd565b60405161050e9190612c7c565b60405180910390f35b610531600480360381019061052c9190613051565b61118f565b005b61054d600480360381019061054891906130aa565b611284565b005b61055761129a565b6040516105649190612e5f565b60405180910390f35b6105876004803603810190610582919061314a565b6112ab565b005b6105a3600480360381019061059e9190612ea6565b6117aa565b005b6105bf60048036038101906105ba9190613051565b611830565b6040516105cc9190612bd1565b60405180910390f35b6105ef60048036038101906105ea919061324b565b611850565b005b6105f96118b2565b6040516106069190613345565b60405180910390f35b61062960048036038101906106249190612cd4565b6118c5565b6040516106369190612c7c565b60405180910390f35b610647611971565b6040516106549190612e5f565b60405180910390f35b610665611982565b6040516106729190612e5f565b60405180910390f35b610683611988565b6040516106909190612e35565b60405180910390f35b6106b360048036038101906106ae9190613360565b61198e565b6040516106c09190612bd1565b60405180910390f35b6106d1611a22565b6040516106de9190612e5f565b60405180910390f35b61070160048036038101906106fc9190613051565b611a33565b005b61070b611b2a565b6040516107189190612d42565b60405180910390f35b61073b60048036038101906107369190612cd4565b611b54565b005b610745611bda565b6040516107529190612e5f565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061082657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610836575061083582611be0565b5b9050919050565b60606000805461084c906133cf565b80601f0160208091040260200160405190810160405280929190818152602001828054610878906133cf565b80156108c55780601f1061089a576101008083540402835291602001916108c5565b820191906000526020600020905b8154815290600101906020018083116108a857829003601f168201915b5050505050905090565b60006108da82611c4a565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b61091d611c95565b73ffffffffffffffffffffffffffffffffffffffff1661093b6110d3565b73ffffffffffffffffffffffffffffffffffffffff1614610991576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109889061344c565b60405180910390fd5b600b54600c54826109a2919061349b565b11156109e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109da9061351b565b60405180910390fd5b60005b81811015610a1e5760006109fa6012611c9d565b9050610a066012611cab565b610a108482611cc1565b8180600101925050506109e6565b5080600c6000828254610a31919061349b565b925050819055505050565b6000610a4782610e60565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610ab7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aae906135ad565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ad6611c95565b73ffffffffffffffffffffffffffffffffffffffff161480610b055750610b0481610aff611c95565b61198e565b5b610b44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3b9061363f565b60405180910390fd5b610b4e8383611cdf565b505050565b610b5b611c95565b73ffffffffffffffffffffffffffffffffffffffff16610b796110d3565b73ffffffffffffffffffffffffffffffffffffffff1614610bcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc69061344c565b60405180910390fd5b806003811115610be257610be16132ce565b5b601560006101000a81548160ff02191690836003811115610c0657610c056132ce565b5b021790555050565b610c16611c95565b73ffffffffffffffffffffffffffffffffffffffff16610c346110d3565b73ffffffffffffffffffffffffffffffffffffffff1614610c8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c819061344c565b60405180910390fd5b80600b8190555050565b610ca5610c9f611c95565b82611d98565b610ce4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cdb906136d1565b60405180910390fd5b610cef838383611e76565b505050565b600e5481565b600d5481565b610d08611c95565b73ffffffffffffffffffffffffffffffffffffffff16610d266110d3565b73ffffffffffffffffffffffffffffffffffffffff1614610d7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d739061344c565b60405180910390fd5b80600e8190555050565b6000610d926014611c9d565b610d9c6013611c9d565b610da6919061349b565b905090565b610dc683838360405180602001604052806000815250611850565b505050565b600c5481565b610dd9611c95565b73ffffffffffffffffffffffffffffffffffffffff16610df76110d3565b73ffffffffffffffffffffffffffffffffffffffff1614610e4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e449061344c565b60405180910390fd5b8060099081610e5c919061389d565b5050565b600080610e6c83612181565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610edd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed4906139bb565b60405180910390fd5b80915050919050565b60098054610ef3906133cf565b80601f0160208091040260200160405190810160405280929190818152602001828054610f1f906133cf565b8015610f6c5780601f10610f4157610100808354040283529160200191610f6c565b820191906000526020600020905b815481529060010190602001808311610f4f57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610fe4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fdb90613a4d565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611033611c95565b73ffffffffffffffffffffffffffffffffffffffff166110516110d3565b73ffffffffffffffffffffffffffffffffffffffff16146110a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109e9061344c565b60405180910390fd5b6110b160006121be565b565b60116020528060005260406000206000915054906101000a900460ff1681565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461110c906133cf565b80601f0160208091040260200160405190810160405280929190818152602001828054611138906133cf565b80156111855780601f1061115a57610100808354040283529160200191611185565b820191906000526020600020905b81548152906001019060200180831161116857829003601f168201915b5050505050905090565b6003808111156111a2576111a16132ce565b5b601560009054906101000a900460ff1660038111156111c4576111c36132ce565b5b14611204576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111fb90613ab9565b60405180910390fd5b600b54600a546112149190613ad9565b61121e6012611c9d565b1061125e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125590613b7f565b60405180910390fd5b600061126a6012611c9d565b90506112766012611cab565b6112808282611cc1565b5050565b61129661128f611c95565b83836122cc565b5050565b60006112a66012611c9d565b905090565b600160038111156112bf576112be6132ce565b5b601560009054906101000a900460ff1660038111156112e1576112e06132ce565b5b14806113205750600260038111156112fc576112fb6132ce565b5b601560009054906101000a900460ff16600381111561131e5761131d6132ce565b5b145b61135f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135690613beb565b60405180910390fd5b600a5461136c6012611c9d565b106113ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a390613c57565b60405180910390fd5b6000836040516020016113bf9190613cbf565b6040516020818303038152906040528051906020012090506000600160038111156113ed576113ec6132ce565b5b601560009054906101000a900460ff16600381111561140f5761140e6132ce565b5b0361155a57600e54905060001515601060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515146114ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a390613d4c565b60405180910390fd5b600d546114b7611a22565b106114f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ee90613db8565b60405180910390fd5b6115016013611cab565b6001601060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b6002600381111561156e5761156d6132ce565b5b601560009054906101000a900460ff1660038111156115905761158f6132ce565b5b036116f557600f54905060001515601160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151461162d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162490613e4a565b60405180910390fd5b600d54600b54600a546116409190613ad9565b61164a9190613ad9565b611652611971565b10611692576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168990613eb6565b60405180910390fd5b61169c6014611cab565b6001601160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b611741848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508284612438565b611780576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177790613f22565b60405180910390fd5b600061178c6012611c9d565b90506117986012611cab565b6117a28682611cc1565b505050505050565b6117b2611c95565b73ffffffffffffffffffffffffffffffffffffffff166117d06110d3565b73ffffffffffffffffffffffffffffffffffffffff1614611826576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181d9061344c565b60405180910390fd5b80600f8190555050565b60106020528060005260406000206000915054906101000a900460ff1681565b61186161185b611c95565b83611d98565b6118a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611897906136d1565b60405180910390fd5b6118ac8484848461244f565b50505050565b601560009054906101000a900460ff1681565b60606118d16012611c9d565b821115611913576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190a90613f8e565b60405180910390fd5b600060098054611922906133cf565b90501161193e576040518060200160405280600081525061196a565b6009611949836124ab565b60405160200161195a929190614093565b6040516020818303038152906040525b9050919050565b600061197d6014611c9d565b905090565b600a5481565b600f5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000611a2e6013611c9d565b905090565b611a3b611c95565b73ffffffffffffffffffffffffffffffffffffffff16611a596110d3565b73ffffffffffffffffffffffffffffffffffffffff1614611aaf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa69061344c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611b1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1590614138565b60405180910390fd5b611b27816121be565b50565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611b5c611c95565b73ffffffffffffffffffffffffffffffffffffffff16611b7a6110d3565b73ffffffffffffffffffffffffffffffffffffffff1614611bd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc79061344c565b60405180910390fd5b80600d8190555050565b600b5481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611c538161260b565b611c92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c89906139bb565b60405180910390fd5b50565b600033905090565b600081600001549050919050565b6001816000016000828254019250508190555050565b611cdb82826040518060200160405280600081525061264c565b5050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611d5283610e60565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611da38261260b565b611de2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd9906141ca565b60405180910390fd5b6000611ded83610e60565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611e2f5750611e2e818561198e565b5b80611e6d57508373ffffffffffffffffffffffffffffffffffffffff16611e55846108cf565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611e9682610e60565b73ffffffffffffffffffffffffffffffffffffffff1614611eec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee39061425c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611f5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f52906142ee565b60405180910390fd5b611f6883838360016126a7565b8273ffffffffffffffffffffffffffffffffffffffff16611f8882610e60565b73ffffffffffffffffffffffffffffffffffffffff1614611fde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd59061425c565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120649190613ad9565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120bb919061349b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461217c83838360016126ad565b505050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905080600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426008819055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361233a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123319061435a565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161242b9190612bd1565b60405180910390a3505050565b60008261244585846126b3565b1490509392505050565b61245a848484611e76565b61246684848484612766565b6124a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249c906143ec565b60405180910390fd5b50505050565b6060600082036124f2576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612606565b600082905060005b6000821461252457808061250d9061440c565b915050600a8261251d9190614483565b91506124fa565b60008167ffffffffffffffff8111156125405761253f612edd565b5b6040519080825280601f01601f1916602001820160405280156125725781602001600182028036833780820191505090505b5090505b600085146125ff5760018261258b9190613ad9565b9150600a8561259a91906144b4565b60306125a6919061349b565b60f81b8183815181106125bc576125bb6144e5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856125f89190614483565b9450612576565b8093505050505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff1661262d83612181565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b61265683836128ed565b6126636000848484612766565b6126a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612699906143ec565b60405180910390fd5b505050565b50505050565b50505050565b60008082905060005b845181101561275b5760008582815181106126da576126d96144e5565b5b6020026020010151905080831161271b5782816040516020016126fe929190614535565b604051602081830303815290604052805190602001209250612747565b808360405160200161272e929190614535565b6040516020818303038152906040528051906020012092505b5080806127539061440c565b9150506126bc565b508091505092915050565b60006127878473ffffffffffffffffffffffffffffffffffffffff16612b0a565b156128e0578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026127b0611c95565b8786866040518563ffffffff1660e01b81526004016127d294939291906145b6565b6020604051808303816000875af192505050801561280e57506040513d601f19601f8201168201806040525081019061280b9190614617565b60015b612890573d806000811461283e576040519150601f19603f3d011682016040523d82523d6000602084013e612843565b606091505b506000815103612888576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287f906143ec565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506128e5565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361295c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161295390614690565b60405180910390fd5b6129658161260b565b156129a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299c906146fc565b60405180910390fd5b6129b36000838360016126a7565b6129bc8161260b565b156129fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129f3906146fc565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612b066000838360016126ad565b5050565b600080823b905060008111915050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612b6681612b31565b8114612b7157600080fd5b50565b600081359050612b8381612b5d565b92915050565b600060208284031215612b9f57612b9e612b27565b5b6000612bad84828501612b74565b91505092915050565b60008115159050919050565b612bcb81612bb6565b82525050565b6000602082019050612be66000830184612bc2565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612c26578082015181840152602081019050612c0b565b60008484015250505050565b6000601f19601f8301169050919050565b6000612c4e82612bec565b612c588185612bf7565b9350612c68818560208601612c08565b612c7181612c32565b840191505092915050565b60006020820190508181036000830152612c968184612c43565b905092915050565b6000819050919050565b612cb181612c9e565b8114612cbc57600080fd5b50565b600081359050612cce81612ca8565b92915050565b600060208284031215612cea57612ce9612b27565b5b6000612cf884828501612cbf565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612d2c82612d01565b9050919050565b612d3c81612d21565b82525050565b6000602082019050612d576000830184612d33565b92915050565b612d6681612d21565b8114612d7157600080fd5b50565b600081359050612d8381612d5d565b92915050565b60008060408385031215612da057612d9f612b27565b5b6000612dae85828601612d74565b9250506020612dbf85828601612cbf565b9150509250929050565b600080600060608486031215612de257612de1612b27565b5b6000612df086828701612d74565b9350506020612e0186828701612d74565b9250506040612e1286828701612cbf565b9150509250925092565b6000819050919050565b612e2f81612e1c565b82525050565b6000602082019050612e4a6000830184612e26565b92915050565b612e5981612c9e565b82525050565b6000602082019050612e746000830184612e50565b92915050565b612e8381612e1c565b8114612e8e57600080fd5b50565b600081359050612ea081612e7a565b92915050565b600060208284031215612ebc57612ebb612b27565b5b6000612eca84828501612e91565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612f1582612c32565b810181811067ffffffffffffffff82111715612f3457612f33612edd565b5b80604052505050565b6000612f47612b1d565b9050612f538282612f0c565b919050565b600067ffffffffffffffff821115612f7357612f72612edd565b5b612f7c82612c32565b9050602081019050919050565b82818337600083830152505050565b6000612fab612fa684612f58565b612f3d565b905082815260208101848484011115612fc757612fc6612ed8565b5b612fd2848285612f89565b509392505050565b600082601f830112612fef57612fee612ed3565b5b8135612fff848260208601612f98565b91505092915050565b60006020828403121561301e5761301d612b27565b5b600082013567ffffffffffffffff81111561303c5761303b612b2c565b5b61304884828501612fda565b91505092915050565b60006020828403121561306757613066612b27565b5b600061307584828501612d74565b91505092915050565b61308781612bb6565b811461309257600080fd5b50565b6000813590506130a48161307e565b92915050565b600080604083850312156130c1576130c0612b27565b5b60006130cf85828601612d74565b92505060206130e085828601613095565b9150509250929050565b600080fd5b600080fd5b60008083601f84011261310a57613109612ed3565b5b8235905067ffffffffffffffff811115613127576131266130ea565b5b602083019150836020820283011115613143576131426130ef565b5b9250929050565b60008060006040848603121561316357613162612b27565b5b600061317186828701612d74565b935050602084013567ffffffffffffffff81111561319257613191612b2c565b5b61319e868287016130f4565b92509250509250925092565b600067ffffffffffffffff8211156131c5576131c4612edd565b5b6131ce82612c32565b9050602081019050919050565b60006131ee6131e9846131aa565b612f3d565b90508281526020810184848401111561320a57613209612ed8565b5b613215848285612f89565b509392505050565b600082601f83011261323257613231612ed3565b5b81356132428482602086016131db565b91505092915050565b6000806000806080858703121561326557613264612b27565b5b600061327387828801612d74565b945050602061328487828801612d74565b935050604061329587828801612cbf565b925050606085013567ffffffffffffffff8111156132b6576132b5612b2c565b5b6132c28782880161321d565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6004811061330e5761330d6132ce565b5b50565b600081905061331f826132fd565b919050565b600061332f82613311565b9050919050565b61333f81613324565b82525050565b600060208201905061335a6000830184613336565b92915050565b6000806040838503121561337757613376612b27565b5b600061338585828601612d74565b925050602061339685828601612d74565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806133e757607f821691505b6020821081036133fa576133f96133a0565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613436602083612bf7565b915061344182613400565b602082019050919050565b6000602082019050818103600083015261346581613429565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006134a682612c9e565b91506134b183612c9e565b92508282019050808211156134c9576134c861346c565b5b92915050565b7f416d6f756e74206578636565647320726573657276656420737570706c790000600082015250565b6000613505601e83612bf7565b9150613510826134cf565b602082019050919050565b60006020820190508181036000830152613534816134f8565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613597602183612bf7565b91506135a28261353b565b604082019050919050565b600060208201905081810360008301526135c68161358a565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000613629603d83612bf7565b9150613634826135cd565b604082019050919050565b600060208201905081810360008301526136588161361c565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b60006136bb602d83612bf7565b91506136c68261365f565b604082019050919050565b600060208201905081810360008301526136ea816136ae565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026137537fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613716565b61375d8683613716565b95508019841693508086168417925050509392505050565b6000819050919050565b600061379a61379561379084612c9e565b613775565b612c9e565b9050919050565b6000819050919050565b6137b48361377f565b6137c86137c0826137a1565b848454613723565b825550505050565b600090565b6137dd6137d0565b6137e88184846137ab565b505050565b5b8181101561380c576138016000826137d5565b6001810190506137ee565b5050565b601f82111561385157613822816136f1565b61382b84613706565b8101602085101561383a578190505b61384e61384685613706565b8301826137ed565b50505b505050565b600082821c905092915050565b600061387460001984600802613856565b1980831691505092915050565b600061388d8383613863565b9150826002028217905092915050565b6138a682612bec565b67ffffffffffffffff8111156138bf576138be612edd565b5b6138c982546133cf565b6138d4828285613810565b600060209050601f83116001811461390757600084156138f5578287015190505b6138ff8582613881565b865550613967565b601f198416613915866136f1565b60005b8281101561393d57848901518255600182019150602085019450602081019050613918565b8683101561395a5784890151613956601f891682613863565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b60006139a5601883612bf7565b91506139b08261396f565b602082019050919050565b600060208201905081810360008301526139d481613998565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000613a37602983612bf7565b9150613a42826139db565b604082019050919050565b60006020820190508181036000830152613a6681613a2a565b9050919050565b7f5075626c6963206d696e7420696e616374697665000000000000000000000000600082015250565b6000613aa3601483612bf7565b9150613aae82613a6d565b602082019050919050565b60006020820190508181036000830152613ad281613a96565b9050919050565b6000613ae482612c9e565b9150613aef83612c9e565b9250828203905081811115613b0757613b0661346c565b5b92915050565b7f4d617820617661696c61626c65207075626c696320737570706c79206d696e7460008201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b6000613b69602283612bf7565b9150613b7482613b0d565b604082019050919050565b60006020820190508181036000830152613b9881613b5c565b9050919050565b7f4e6f7420696e20616c6c6f776c697374206d696e74696e672073746174657300600082015250565b6000613bd5601f83612bf7565b9150613be082613b9f565b602082019050919050565b60006020820190508181036000830152613c0481613bc8565b9050919050565b7f4d617820737570706c79206d696e746564000000000000000000000000000000600082015250565b6000613c41601183612bf7565b9150613c4c82613c0b565b602082019050919050565b60006020820190508181036000830152613c7081613c34565b9050919050565b60008160601b9050919050565b6000613c8f82613c77565b9050919050565b6000613ca182613c84565b9050919050565b613cb9613cb482612d21565b613c96565b82525050565b6000613ccb8284613ca8565b60148201915081905092915050565b7f5573657220616c7265616479206d696e746564206f6e2067756172616e74656560008201527f64206c6973740000000000000000000000000000000000000000000000000000602082015250565b6000613d36602683612bf7565b9150613d4182613cda565b604082019050919050565b60006020820190508181036000830152613d6581613d29565b9050919050565b7f4d61782067756172616e7465656420737570706c79206d696e74656400000000600082015250565b6000613da2601c83612bf7565b9150613dad82613d6c565b602082019050919050565b60006020820190508181036000830152613dd181613d95565b9050919050565b7f5573657220616c7265616479206d696e746564206f6e206f766572737562736360008201527f7269626564206c69737400000000000000000000000000000000000000000000602082015250565b6000613e34602a83612bf7565b9150613e3f82613dd8565b604082019050919050565b60006020820190508181036000830152613e6381613e27565b9050919050565b7f4d617820616c6c6f77206c69737420737570706c79206d696e74656400000000600082015250565b6000613ea0601c83612bf7565b9150613eab82613e6a565b602082019050919050565b60006020820190508181036000830152613ecf81613e93565b9050919050565b7f496e76616c69642070726f6f6600000000000000000000000000000000000000600082015250565b6000613f0c600d83612bf7565b9150613f1782613ed6565b602082019050919050565b60006020820190508181036000830152613f3b81613eff565b9050919050565b7f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e00600082015250565b6000613f78601f83612bf7565b9150613f8382613f42565b602082019050919050565b60006020820190508181036000830152613fa781613f6b565b9050919050565b600081905092915050565b60008154613fc6816133cf565b613fd08186613fae565b94506001821660008114613feb576001811461400057614033565b60ff1983168652811515820286019350614033565b614009856136f1565b60005b8381101561402b5781548189015260018201915060208101905061400c565b838801955050505b50505092915050565b600061404782612bec565b6140518185613fae565b9350614061818560208601612c08565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000815250565b600061409f8285613fb9565b91506140ab828461403c565b91506140b68261406d565b6005820191508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614122602683612bf7565b915061412d826140c6565b604082019050919050565b6000602082019050818103600083015261415181614115565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006141b4602c83612bf7565b91506141bf82614158565b604082019050919050565b600060208201905081810360008301526141e3816141a7565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000614246602583612bf7565b9150614251826141ea565b604082019050919050565b6000602082019050818103600083015261427581614239565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006142d8602483612bf7565b91506142e38261427c565b604082019050919050565b60006020820190508181036000830152614307816142cb565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614344601983612bf7565b915061434f8261430e565b602082019050919050565b6000602082019050818103600083015261437381614337565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006143d6603283612bf7565b91506143e18261437a565b604082019050919050565b60006020820190508181036000830152614405816143c9565b9050919050565b600061441782612c9e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036144495761444861346c565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061448e82612c9e565b915061449983612c9e565b9250826144a9576144a8614454565b5b828204905092915050565b60006144bf82612c9e565b91506144ca83612c9e565b9250826144da576144d9614454565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b61452f61452a82612e1c565b614514565b82525050565b6000614541828561451e565b602082019150614551828461451e565b6020820191508190509392505050565b600081519050919050565b600082825260208201905092915050565b600061458882614561565b614592818561456c565b93506145a2818560208601612c08565b6145ab81612c32565b840191505092915050565b60006080820190506145cb6000830187612d33565b6145d86020830186612d33565b6145e56040830185612e50565b81810360608301526145f7818461457d565b905095945050505050565b60008151905061461181612b5d565b92915050565b60006020828403121561462d5761462c612b27565b5b600061463b84828501614602565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061467a602083612bf7565b915061468582614644565b602082019050919050565b600060208201905081810360008301526146a98161466d565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006146e6601c83612bf7565b91506146f1826146b0565b602082019050919050565b60006020820190508181036000830152614715816146d9565b905091905056fea264697066735822122094ba8e15e1a979ee7ca96b9f21f677a3002c19a9820127fea1b77a066a0fd6b564736f6c63430008120033
Deployed Bytecode Sourcemap
42371:8976:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27087:305;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28015:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29527:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48262:631;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29045:416;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50801:121;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51244:96;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30227:301;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42838:32;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42747:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49008:123;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50390:304;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30599:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42663:29;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44253:104;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27725:223;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42477:21;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27456:207;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21933:103;;;:::i;:::-;;43141:54;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21107:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28184:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47587:533;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29770:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49396:227;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44971:2557;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49204:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43083:50;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30821:279;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43731:45;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44473:298;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50057:272;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42553:31;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42932:36;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29996:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49706:264;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22191:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21276:93;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51035:100;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42626:29;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27087:305;27189:4;27241:25;27226:40;;;:11;:40;;;;:105;;;;27298:33;27283:48;;;:11;:48;;;;27226:105;:158;;;;27348:36;27372:11;27348:23;:36::i;:::-;27226:158;27206:178;;27087:305;;;:::o;28015:100::-;28069:13;28102:5;28095:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28015:100;:::o;29527:171::-;29603:7;29623:23;29638:7;29623:14;:23::i;:::-;29666:15;:24;29682:7;29666:24;;;;;;;;;;;;;;;;;;;;;29659:31;;29527:171;;;:::o;48262:631::-;21513:12;:10;:12::i;:::-;21502:23;;:7;:5;:7::i;:::-;:23;;;21494:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48418:8:::1;;48400:14;;48391:6;:23;;;;:::i;:::-;:35;;48383:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;48487:6;48483:368;48499:6;48495:1;:10;48483:368;;;48578:15;48596:25;:15;:23;:25::i;:::-;48578:43;;48636:27;:15;:25;:27::i;:::-;48712:22;48722:2;48726:7;48712:9;:22::i;:::-;48821:3;;;;;;;48508:343;48483:368;;;;48879:6;48861:14;;:24;;;;;;;:::i;:::-;;;;;;;;48262:631:::0;;:::o;29045:416::-;29126:13;29142:23;29157:7;29142:14;:23::i;:::-;29126:39;;29190:5;29184:11;;:2;:11;;;29176:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;29284:5;29268:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;29293:37;29310:5;29317:12;:10;:12::i;:::-;29293:16;:37::i;:::-;29268:62;29246:173;;;;;;;;;;;;:::i;:::-;;;;;;;;;29432:21;29441:2;29445:7;29432:8;:21::i;:::-;29115:346;29045:416;;:::o;50801:121::-;21513:12;:10;:12::i;:::-;21502:23;;:7;:5;:7::i;:::-;:23;;;21494:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50903:10:::1;50893:21;;;;;;;;:::i;:::-;;50881:9;;:33;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;50801:121:::0;:::o;51244:96::-;21513:12;:10;:12::i;:::-;21502:23;;:7;:5;:7::i;:::-;:23;;;21494:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51326:5:::1;51315:8;:16;;;;51244:96:::0;:::o;30227:301::-;30388:41;30407:12;:10;:12::i;:::-;30421:7;30388:18;:41::i;:::-;30380:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;30492:28;30502:4;30508:2;30512:7;30492:9;:28::i;:::-;30227:301;;;:::o;42838:32::-;;;;:::o;42747:25::-;;;;:::o;49008:123::-;21513:12;:10;:12::i;:::-;21502:23;;:7;:5;:7::i;:::-;:23;;;21494:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49112:11:::1;49092:17;:31;;;;49008:123:::0;:::o;50390:304::-;50442:7;50638:47;:37;:45;:47::i;:::-;50592:43;:33;:41;:43::i;:::-;:93;;;;:::i;:::-;50585:100;;50390:304;:::o;30599:151::-;30703:39;30720:4;30726:2;30730:7;30703:39;;;;;;;;;;;;:16;:39::i;:::-;30599:151;;;:::o;42663:29::-;;;;:::o;44253:104::-;21513:12;:10;:12::i;:::-;21502:23;;:7;:5;:7::i;:::-;:23;;;21494:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44339:10:::1;44329:7;:20;;;;;;:::i;:::-;;44253:104:::0;:::o;27725:223::-;27797:7;27817:13;27833:17;27842:7;27833:8;:17::i;:::-;27817:33;;27886:1;27869:19;;:5;:19;;;27861:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;27935:5;27928:12;;;27725:223;;;:::o;42477:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;27456:207::-;27528:7;27573:1;27556:19;;:5;:19;;;27548:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27639:9;:16;27649:5;27639:16;;;;;;;;;;;;;;;;27632:23;;27456:207;;;:::o;21933:103::-;21513:12;:10;:12::i;:::-;21502:23;;:7;:5;:7::i;:::-;:23;;;21494:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;21998:30:::1;22025:1;21998:18;:30::i;:::-;21933:103::o:0;43141:54::-;;;;;;;;;;;;;;;;;;;;;;:::o;21107:87::-;21153:7;21180:6;;;;;;;;;;;21173:13;;21107:87;:::o;28184:104::-;28240:13;28273:7;28266:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28184:104;:::o;47587:533::-;47668:16;47655:29;;;;;;;;:::i;:::-;;:9;;;;;;;;;;;:29;;;;;;;;:::i;:::-;;;47647:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;47850:8;;47838:9;;:20;;;;:::i;:::-;47810:25;:15;:23;:25::i;:::-;:48;47802:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;47962:15;47980:25;:15;:23;:25::i;:::-;47962:43;;48016:27;:15;:25;:27::i;:::-;48084:28;48094:8;48104:7;48084:9;:28::i;:::-;47634:486;47587:533;:::o;29770:155::-;29865:52;29884:12;:10;:12::i;:::-;29898:8;29908;29865:18;:52::i;:::-;29770:155;;:::o;49396:227::-;49439:7;49589:25;:15;:23;:25::i;:::-;49582:32;;49396:227;:::o;44971:2557::-;45120:20;45107:33;;;;;;;;:::i;:::-;;:9;;;;;;;;;;;:33;;;;;;;;:::i;:::-;;;:74;;;;45157:24;45144:37;;;;;;;;:::i;:::-;;:9;;;;;;;;;;;:37;;;;;;;;:::i;:::-;;;45107:74;45099:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;45266:9;;45238:25;:15;:23;:25::i;:::-;:37;45230:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;45359:12;45401:8;45384:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;45374:37;;;;;;45359:52;;45480:12;45603:20;45590:33;;;;;;;;:::i;:::-;;:9;;;;;;;;;;;:33;;;;;;;;:::i;:::-;;;45586:720;;45692:17;;45685:24;;45834:5;45802:37;;:18;:28;45821:8;45802:28;;;;;;;;;;;;;;;;;;;;;;;;;:37;;;45794:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;46025:10;;45990:32;:30;:32::i;:::-;:45;45982:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;46152:45;:33;:43;:45::i;:::-;46290:4;46259:18;:28;46278:8;46259:28;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;45586:720;46419:24;46406:37;;;;;;;;:::i;:::-;;:9;;;;;;;;;;;:37;;;;;;;;:::i;:::-;;;46402:794;;46512:21;;46505:28;;46666:5;46630:41;;:22;:32;46653:8;46630:32;;;;;;;;;;;;;;;;;;;;;;;;;:41;;;46622:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;46973:10;;46962:8;;46950:9;;:20;;;;:::i;:::-;:33;;;;:::i;:::-;46911:36;:34;:36::i;:::-;:72;46903:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;47034:49;:37;:47;:49::i;:::-;47180:4;47145:22;:32;47168:8;47145:32;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;46402:794;47251:37;47270:5;;47251:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47277:4;47283;47251:18;:37::i;:::-;47243:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;47370:15;47388:25;:15;:23;:25::i;:::-;47370:43;;47424:27;:15;:25;:27::i;:::-;47492:28;47502:8;47512:7;47492:9;:28::i;:::-;45047:2481;;;44971:2557;;;:::o;49204:127::-;21513:12;:10;:12::i;:::-;21502:23;;:7;:5;:7::i;:::-;:23;;;21494:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49312:11:::1;49288:21;:35;;;;49204:127:::0;:::o;43083:50::-;;;;;;;;;;;;;;;;;;;;;;:::o;30821:279::-;30952:41;30971:12;:10;:12::i;:::-;30985:7;30952:18;:41::i;:::-;30944:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;31054:38;31068:4;31074:2;31078:7;31087:4;31054:13;:38::i;:::-;30821:279;;;;:::o;43731:45::-;;;;;;;;;;;;;:::o;44473:298::-;44546:13;44591:25;:15;:23;:25::i;:::-;44580:7;:36;;44572:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;44696:1;44678:7;44672:21;;;;;:::i;:::-;;;:25;:91;;;;;;;;;;;;;;;;;44714:7;44723:25;44740:7;44723:16;:25::i;:::-;44700:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;44672:91;44665:98;;44473:298;;;:::o;50057:272::-;50123:7;50273:47;:37;:45;:47::i;:::-;50266:54;;50057:272;:::o;42553:31::-;;;;:::o;42932:36::-;;;;:::o;29996:164::-;30093:4;30117:18;:25;30136:5;30117:25;;;;;;;;;;;;;;;:35;30143:8;30117:35;;;;;;;;;;;;;;;;;;;;;;;;;30110:42;;29996:164;;;;:::o;49706:264::-;49768:7;49918:43;:33;:41;:43::i;:::-;49911:50;;49706:264;:::o;22191:201::-;21513:12;:10;:12::i;:::-;21502:23;;:7;:5;:7::i;:::-;:23;;;21494:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;22300:1:::1;22280:22;;:8;:22;;::::0;22272:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;22356:28;22375:8;22356:18;:28::i;:::-;22191:201:::0;:::o;21276:93::-;21325:7;21352:9;;;;;;;;;;;21345:16;;21276:93;:::o;51035:100::-;21513:12;:10;:12::i;:::-;21502:23;;:7;:5;:7::i;:::-;:23;;;21494:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51121:5:::1;51108:10;:18;;;;51035:100:::0;:::o;42626:29::-;;;;:::o;25696:157::-;25781:4;25820:25;25805:40;;;:11;:40;;;;25798:47;;25696:157;;;:::o;38521:135::-;38603:16;38611:7;38603;:16::i;:::-;38595:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;38521:135;:::o;19751:98::-;19804:7;19831:10;19824:17;;19751:98;:::o;956:114::-;1021:7;1048;:14;;;1041:21;;956:114;;;:::o;1078:127::-;1185:1;1167:7;:14;;;:19;;;;;;;;;;;1078:127;:::o;33780:110::-;33856:26;33866:2;33870:7;33856:26;;;;;;;;;;;;:9;:26::i;:::-;33780:110;;:::o;37834:174::-;37936:2;37909:15;:24;37925:7;37909:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;37992:7;37988:2;37954:46;;37963:23;37978:7;37963:14;:23::i;:::-;37954:46;;;;;;;;;;;;37834:174;;:::o;33090:348::-;33183:4;33208:16;33216:7;33208;:16::i;:::-;33200:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;33284:13;33300:23;33315:7;33300:14;:23::i;:::-;33284:39;;33353:5;33342:16;;:7;:16;;;:52;;;;33362:32;33379:5;33386:7;33362:16;:32::i;:::-;33342:52;:87;;;;33422:7;33398:31;;:20;33410:7;33398:11;:20::i;:::-;:31;;;33342:87;33334:96;;;33090:348;;;;:::o;36930:785::-;37055:4;37028:31;;:23;37043:7;37028:14;:23::i;:::-;:31;;;37020:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;37134:1;37120:16;;:2;:16;;;37112:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;37190:42;37211:4;37217:2;37221:7;37230:1;37190:20;:42::i;:::-;37362:4;37335:31;;:23;37350:7;37335:14;:23::i;:::-;:31;;;37327:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;37480:15;:24;37496:7;37480:24;;;;;;;;;;;;37473:31;;;;;;;;;;;37536:1;37517:9;:15;37527:4;37517:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;37565:1;37548:9;:13;37558:2;37548:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;37606:2;37587:7;:16;37595:7;37587:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;37645:7;37641:2;37626:27;;37635:4;37626:27;;;;;;;;;;;;37666:41;37686:4;37692:2;37696:7;37705:1;37666:19;:41::i;:::-;36930:785;;;:::o;32365:117::-;32431:7;32458;:16;32466:7;32458:16;;;;;;;;;;;;;;;;;;;;;32451:23;;32365:117;;;:::o;22552:275::-;22626:17;22646:6;;;;;;;;;;;22626:26;;22675:9;22663;;:21;;;;;;;;;;;;;;;;;;22704:8;22695:6;;:17;;;;;;;;;;;;;;;;;;22747:15;22723:21;:39;;;;22810:8;22778:41;;22799:9;22778:41;;;;;;;;;;;;22615:212;22552:275;:::o;38151:281::-;38272:8;38263:17;;:5;:17;;;38255:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;38359:8;38321:18;:25;38340:5;38321:25;;;;;;;;;;;;;;;:35;38347:8;38321:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;38405:8;38383:41;;38398:5;38383:41;;;38415:8;38383:41;;;;;;:::i;:::-;;;;;;;;38151:281;;;:::o;2384:190::-;2509:4;2562;2533:25;2546:5;2553:4;2533:12;:25::i;:::-;:33;2526:40;;2384:190;;;;;:::o;31981:270::-;32094:28;32104:4;32110:2;32114:7;32094:9;:28::i;:::-;32141:47;32164:4;32170:2;32174:7;32183:4;32141:22;:47::i;:::-;32133:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;31981:270;;;;:::o;23143:723::-;23199:13;23429:1;23420:5;:10;23416:53;;23447:10;;;;;;;;;;;;;;;;;;;;;23416:53;23479:12;23494:5;23479:20;;23510:14;23535:78;23550:1;23542:4;:9;23535:78;;23568:8;;;;;:::i;:::-;;;;23599:2;23591:10;;;;;:::i;:::-;;;23535:78;;;23623:19;23655:6;23645:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23623:39;;23673:154;23689:1;23680:5;:10;23673:154;;23717:1;23707:11;;;;;:::i;:::-;;;23784:2;23776:5;:10;;;;:::i;:::-;23763:2;:24;;;;:::i;:::-;23750:39;;23733:6;23740;23733:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;23813:2;23804:11;;;;;:::i;:::-;;;23673:154;;;23851:6;23837:21;;;;;23143:723;;;;:::o;32795:128::-;32860:4;32913:1;32884:31;;:17;32893:7;32884:8;:17::i;:::-;:31;;;;32877:38;;32795:128;;;:::o;34117:285::-;34212:18;34218:2;34222:7;34212:5;:18::i;:::-;34263:53;34294:1;34298:2;34302:7;34311:4;34263:22;:53::i;:::-;34241:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;34117:285;;;:::o;40805:116::-;;;;;:::o;41643:115::-;;;;;:::o;2936:701::-;3019:7;3039:20;3062:4;3039:27;;3082:9;3077:523;3101:5;:12;3097:1;:16;3077:523;;;3135:20;3158:5;3164:1;3158:8;;;;;;;;:::i;:::-;;;;;;;;3135:31;;3201:12;3185;:28;3181:408;;3355:12;3369;3338:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3328:55;;;;;;3313:70;;3181:408;;;3545:12;3559;3528:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3518:55;;;;;;3503:70;;3181:408;3120:480;3115:3;;;;;:::i;:::-;;;;3077:523;;;;3617:12;3610:19;;;2936:701;;;;:::o;39220:853::-;39374:4;39395:15;:2;:13;;;:15::i;:::-;39391:675;;;39447:2;39431:36;;;39468:12;:10;:12::i;:::-;39482:4;39488:7;39497:4;39431:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;39427:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39689:1;39672:6;:13;:18;39668:328;;39715:60;;;;;;;;;;:::i;:::-;;;;;;;;39668:328;39946:6;39940:13;39931:6;39927:2;39923:15;39916:38;39427:584;39563:41;;;39553:51;;;:6;:51;;;;39546:58;;;;;39391:675;40050:4;40043:11;;39220:853;;;;;;;:::o;34738:942::-;34832:1;34818:16;;:2;:16;;;34810:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;34891:16;34899:7;34891;:16::i;:::-;34890:17;34882:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;34953:48;34982:1;34986:2;34990:7;34999:1;34953:20;:48::i;:::-;35100:16;35108:7;35100;:16::i;:::-;35099:17;35091:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;35515:1;35498:9;:13;35508:2;35498:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;35559:2;35540:7;:16;35548:7;35540:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;35604:7;35600:2;35579:33;;35596:1;35579:33;;;;;;;;;;;;35625:47;35653:1;35657:2;35661:7;35670:1;35625:19;:47::i;:::-;34738:942;;:::o;11741:387::-;11801:4;12009:12;12076:7;12064:20;12056:28;;12119:1;12112:4;:8;12105:15;;;11741: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:232::-;20772:34;20768:1;20760:6;20756:14;20749:58;20841:15;20836:2;20828:6;20824:15;20817:40;20632:232;:::o;20870:366::-;21012:3;21033:67;21097:2;21092:3;21033:67;:::i;:::-;21026:74;;21109:93;21198:3;21109:93;:::i;:::-;21227:2;21222:3;21218:12;21211:19;;20870:366;;;:::o;21242:419::-;21408:4;21446:2;21435:9;21431:18;21423:26;;21495:9;21489:4;21485:20;21481:1;21470:9;21466:17;21459:47;21523:131;21649:4;21523:131;:::i;:::-;21515:139;;21242:419;;;:::o;21667:141::-;21716:4;21739:3;21731:11;;21762:3;21759:1;21752:14;21796:4;21793:1;21783:18;21775:26;;21667:141;;;:::o;21814:93::-;21851:6;21898:2;21893;21886:5;21882:14;21878:23;21868:33;;21814:93;;;:::o;21913:107::-;21957:8;22007:5;22001:4;21997:16;21976:37;;21913:107;;;;:::o;22026:393::-;22095:6;22145:1;22133:10;22129:18;22168:97;22198:66;22187:9;22168:97;:::i;:::-;22286:39;22316:8;22305:9;22286:39;:::i;:::-;22274:51;;22358:4;22354:9;22347:5;22343:21;22334:30;;22407:4;22397:8;22393:19;22386:5;22383:30;22373:40;;22102:317;;22026:393;;;;;:::o;22425:60::-;22453:3;22474:5;22467:12;;22425:60;;;:::o;22491:142::-;22541:9;22574:53;22592:34;22601:24;22619:5;22601:24;:::i;:::-;22592:34;:::i;:::-;22574:53;:::i;:::-;22561:66;;22491:142;;;:::o;22639:75::-;22682:3;22703:5;22696:12;;22639:75;;;:::o;22720:269::-;22830:39;22861:7;22830:39;:::i;:::-;22891:91;22940:41;22964:16;22940:41;:::i;:::-;22932:6;22925:4;22919:11;22891:91;:::i;:::-;22885:4;22878:105;22796:193;22720:269;;;:::o;22995:73::-;23040:3;22995:73;:::o;23074:189::-;23151:32;;:::i;:::-;23192:65;23250:6;23242;23236:4;23192:65;:::i;:::-;23127:136;23074:189;;:::o;23269:186::-;23329:120;23346:3;23339:5;23336:14;23329:120;;;23400:39;23437:1;23430:5;23400:39;:::i;:::-;23373:1;23366:5;23362:13;23353:22;;23329:120;;;23269:186;;:::o;23461:543::-;23562:2;23557:3;23554:11;23551:446;;;23596:38;23628:5;23596:38;:::i;:::-;23680:29;23698:10;23680:29;:::i;:::-;23670:8;23666:44;23863:2;23851:10;23848:18;23845:49;;;23884:8;23869:23;;23845:49;23907:80;23963:22;23981:3;23963:22;:::i;:::-;23953:8;23949:37;23936:11;23907:80;:::i;:::-;23566:431;;23551:446;23461:543;;;:::o;24010:117::-;24064:8;24114:5;24108:4;24104:16;24083:37;;24010:117;;;;:::o;24133:169::-;24177:6;24210:51;24258:1;24254:6;24246:5;24243:1;24239:13;24210:51;:::i;:::-;24206:56;24291:4;24285;24281:15;24271:25;;24184:118;24133:169;;;;:::o;24307:295::-;24383:4;24529:29;24554:3;24548:4;24529:29;:::i;:::-;24521:37;;24591:3;24588:1;24584:11;24578:4;24575:21;24567:29;;24307:295;;;;:::o;24607:1395::-;24724:37;24757:3;24724:37;:::i;:::-;24826:18;24818:6;24815:30;24812:56;;;24848:18;;:::i;:::-;24812:56;24892:38;24924:4;24918:11;24892:38;:::i;:::-;24977:67;25037:6;25029;25023:4;24977:67;:::i;:::-;25071:1;25095:4;25082:17;;25127:2;25119:6;25116:14;25144:1;25139:618;;;;25801:1;25818:6;25815:77;;;25867:9;25862:3;25858:19;25852:26;25843:35;;25815:77;25918:67;25978:6;25971:5;25918:67;:::i;:::-;25912:4;25905:81;25774:222;25109:887;;25139:618;25191:4;25187:9;25179:6;25175:22;25225:37;25257:4;25225:37;:::i;:::-;25284:1;25298:208;25312:7;25309:1;25306:14;25298:208;;;25391:9;25386:3;25382:19;25376:26;25368:6;25361:42;25442:1;25434:6;25430:14;25420:24;;25489:2;25478:9;25474:18;25461:31;;25335:4;25332:1;25328:12;25323:17;;25298:208;;;25534:6;25525:7;25522:19;25519:179;;;25592:9;25587:3;25583:19;25577:26;25635:48;25677:4;25669:6;25665:17;25654:9;25635:48;:::i;:::-;25627:6;25620:64;25542:156;25519:179;25744:1;25740;25732:6;25728:14;25724:22;25718:4;25711:36;25146:611;;;25109:887;;24699:1303;;;24607:1395;;:::o;26008:174::-;26148:26;26144:1;26136:6;26132:14;26125:50;26008:174;:::o;26188:366::-;26330:3;26351:67;26415:2;26410:3;26351:67;:::i;:::-;26344:74;;26427:93;26516:3;26427:93;:::i;:::-;26545:2;26540:3;26536:12;26529:19;;26188:366;;;:::o;26560:419::-;26726:4;26764:2;26753:9;26749:18;26741:26;;26813:9;26807:4;26803:20;26799:1;26788:9;26784:17;26777:47;26841:131;26967:4;26841:131;:::i;:::-;26833:139;;26560:419;;;:::o;26985:228::-;27125:34;27121:1;27113:6;27109:14;27102:58;27194:11;27189:2;27181:6;27177:15;27170:36;26985:228;:::o;27219:366::-;27361:3;27382:67;27446:2;27441:3;27382:67;:::i;:::-;27375:74;;27458:93;27547:3;27458:93;:::i;:::-;27576:2;27571:3;27567:12;27560:19;;27219:366;;;:::o;27591:419::-;27757:4;27795:2;27784:9;27780:18;27772:26;;27844:9;27838:4;27834:20;27830:1;27819:9;27815:17;27808:47;27872:131;27998:4;27872:131;:::i;:::-;27864:139;;27591:419;;;:::o;28016:170::-;28156:22;28152:1;28144:6;28140:14;28133:46;28016:170;:::o;28192:366::-;28334:3;28355:67;28419:2;28414:3;28355:67;:::i;:::-;28348:74;;28431:93;28520:3;28431:93;:::i;:::-;28549:2;28544:3;28540:12;28533:19;;28192:366;;;:::o;28564:419::-;28730:4;28768:2;28757:9;28753:18;28745:26;;28817:9;28811:4;28807:20;28803:1;28792:9;28788:17;28781:47;28845:131;28971:4;28845:131;:::i;:::-;28837:139;;28564:419;;;:::o;28989:194::-;29029:4;29049:20;29067:1;29049:20;:::i;:::-;29044:25;;29083:20;29101:1;29083:20;:::i;:::-;29078:25;;29127:1;29124;29120:9;29112:17;;29151:1;29145:4;29142:11;29139:37;;;29156:18;;:::i;:::-;29139:37;28989:194;;;;:::o;29189:221::-;29329:34;29325:1;29317:6;29313:14;29306:58;29398:4;29393:2;29385:6;29381:15;29374:29;29189:221;:::o;29416:366::-;29558:3;29579:67;29643:2;29638:3;29579:67;:::i;:::-;29572:74;;29655:93;29744:3;29655:93;:::i;:::-;29773:2;29768:3;29764:12;29757:19;;29416:366;;;:::o;29788:419::-;29954:4;29992:2;29981:9;29977:18;29969:26;;30041:9;30035:4;30031:20;30027:1;30016:9;30012:17;30005:47;30069:131;30195:4;30069:131;:::i;:::-;30061:139;;29788:419;;;:::o;30213:181::-;30353:33;30349:1;30341:6;30337:14;30330:57;30213:181;:::o;30400:366::-;30542:3;30563:67;30627:2;30622:3;30563:67;:::i;:::-;30556:74;;30639:93;30728:3;30639:93;:::i;:::-;30757:2;30752:3;30748:12;30741:19;;30400:366;;;:::o;30772:419::-;30938:4;30976:2;30965:9;30961:18;30953:26;;31025:9;31019:4;31015:20;31011:1;31000:9;30996:17;30989:47;31053:131;31179:4;31053:131;:::i;:::-;31045:139;;30772:419;;;:::o;31197:167::-;31337:19;31333:1;31325:6;31321:14;31314:43;31197:167;:::o;31370:366::-;31512:3;31533:67;31597:2;31592:3;31533:67;:::i;:::-;31526:74;;31609:93;31698:3;31609:93;:::i;:::-;31727:2;31722:3;31718:12;31711:19;;31370:366;;;:::o;31742:419::-;31908:4;31946:2;31935:9;31931:18;31923:26;;31995:9;31989:4;31985:20;31981:1;31970:9;31966:17;31959:47;32023:131;32149:4;32023:131;:::i;:::-;32015:139;;31742:419;;;:::o;32167:94::-;32200:8;32248:5;32244:2;32240:14;32219:35;;32167:94;;;:::o;32267:::-;32306:7;32335:20;32349:5;32335:20;:::i;:::-;32324:31;;32267:94;;;:::o;32367:100::-;32406:7;32435:26;32455:5;32435:26;:::i;:::-;32424:37;;32367:100;;;:::o;32473:157::-;32578:45;32598:24;32616:5;32598:24;:::i;:::-;32578:45;:::i;:::-;32573:3;32566:58;32473:157;;:::o;32636:256::-;32748:3;32763:75;32834:3;32825:6;32763:75;:::i;:::-;32863:2;32858:3;32854:12;32847:19;;32883:3;32876:10;;32636:256;;;;:::o;32898:225::-;33038:34;33034:1;33026:6;33022:14;33015:58;33107:8;33102:2;33094:6;33090:15;33083:33;32898:225;:::o;33129:366::-;33271:3;33292:67;33356:2;33351:3;33292:67;:::i;:::-;33285:74;;33368:93;33457:3;33368:93;:::i;:::-;33486:2;33481:3;33477:12;33470:19;;33129:366;;;:::o;33501:419::-;33667:4;33705:2;33694:9;33690:18;33682:26;;33754:9;33748:4;33744:20;33740:1;33729:9;33725:17;33718:47;33782:131;33908:4;33782:131;:::i;:::-;33774:139;;33501:419;;;:::o;33926:178::-;34066:30;34062:1;34054:6;34050:14;34043:54;33926:178;:::o;34110:366::-;34252:3;34273:67;34337:2;34332:3;34273:67;:::i;:::-;34266:74;;34349:93;34438:3;34349:93;:::i;:::-;34467:2;34462:3;34458:12;34451:19;;34110:366;;;:::o;34482:419::-;34648:4;34686:2;34675:9;34671:18;34663:26;;34735:9;34729:4;34725:20;34721:1;34710:9;34706:17;34699:47;34763:131;34889:4;34763:131;:::i;:::-;34755:139;;34482:419;;;:::o;34907:229::-;35047:34;35043:1;35035:6;35031:14;35024:58;35116:12;35111:2;35103:6;35099:15;35092:37;34907:229;:::o;35142:366::-;35284:3;35305:67;35369:2;35364:3;35305:67;:::i;:::-;35298:74;;35381:93;35470:3;35381:93;:::i;:::-;35499:2;35494:3;35490:12;35483:19;;35142:366;;;:::o;35514:419::-;35680:4;35718:2;35707:9;35703:18;35695:26;;35767:9;35761:4;35757:20;35753:1;35742:9;35738:17;35731:47;35795:131;35921:4;35795:131;:::i;:::-;35787:139;;35514:419;;;:::o;35939:178::-;36079:30;36075:1;36067:6;36063:14;36056:54;35939:178;:::o;36123:366::-;36265:3;36286:67;36350:2;36345:3;36286:67;:::i;:::-;36279:74;;36362:93;36451:3;36362:93;:::i;:::-;36480:2;36475:3;36471:12;36464:19;;36123:366;;;:::o;36495:419::-;36661:4;36699:2;36688:9;36684:18;36676:26;;36748:9;36742:4;36738:20;36734:1;36723:9;36719:17;36712:47;36776:131;36902:4;36776:131;:::i;:::-;36768:139;;36495:419;;;:::o;36920:163::-;37060:15;37056:1;37048:6;37044:14;37037:39;36920:163;:::o;37089:366::-;37231:3;37252:67;37316:2;37311:3;37252:67;:::i;:::-;37245:74;;37328:93;37417:3;37328:93;:::i;:::-;37446:2;37441:3;37437:12;37430:19;;37089:366;;;:::o;37461:419::-;37627:4;37665:2;37654:9;37650:18;37642:26;;37714:9;37708:4;37704:20;37700:1;37689:9;37685:17;37678:47;37742:131;37868:4;37742:131;:::i;:::-;37734:139;;37461:419;;;:::o;37886:181::-;38026:33;38022:1;38014:6;38010:14;38003:57;37886:181;:::o;38073:366::-;38215:3;38236:67;38300:2;38295:3;38236:67;:::i;:::-;38229:74;;38312:93;38401:3;38312:93;:::i;:::-;38430:2;38425:3;38421:12;38414:19;;38073:366;;;:::o;38445:419::-;38611:4;38649:2;38638:9;38634:18;38626:26;;38698:9;38692:4;38688:20;38684:1;38673:9;38669:17;38662:47;38726:131;38852:4;38726:131;:::i;:::-;38718:139;;38445:419;;;:::o;38870:148::-;38972:11;39009:3;38994:18;;38870:148;;;;:::o;39048:874::-;39151:3;39188:5;39182:12;39217:36;39243:9;39217:36;:::i;:::-;39269:89;39351:6;39346:3;39269:89;:::i;:::-;39262:96;;39389:1;39378:9;39374:17;39405:1;39400:166;;;;39580:1;39575:341;;;;39367:549;;39400:166;39484:4;39480:9;39469;39465:25;39460:3;39453:38;39546:6;39539:14;39532:22;39524:6;39520:35;39515:3;39511:45;39504:52;;39400:166;;39575:341;39642:38;39674:5;39642:38;:::i;:::-;39702:1;39716:154;39730:6;39727:1;39724:13;39716:154;;;39804:7;39798:14;39794:1;39789:3;39785:11;39778:35;39854:1;39845:7;39841:15;39830:26;;39752:4;39749:1;39745:12;39740:17;;39716:154;;;39899:6;39894:3;39890:16;39883:23;;39582:334;;39367:549;;39155:767;;39048:874;;;;:::o;39928:390::-;40034:3;40062:39;40095:5;40062:39;:::i;:::-;40117:89;40199:6;40194:3;40117:89;:::i;:::-;40110:96;;40215:65;40273:6;40268:3;40261:4;40254:5;40250:16;40215:65;:::i;:::-;40305:6;40300:3;40296:16;40289:23;;40038:280;39928:390;;;;:::o;40324:182::-;40492:7;40487:3;40480:20;40324:182;:::o;40512:693::-;40779:3;40801:92;40889:3;40880:6;40801:92;:::i;:::-;40794:99;;40910:95;41001:3;40992:6;40910:95;:::i;:::-;40903:102;;41015:137;41148:3;41015:137;:::i;:::-;41177:1;41172:3;41168:11;41161:18;;41196:3;41189:10;;40512:693;;;;;:::o;41211:225::-;41351:34;41347:1;41339:6;41335:14;41328:58;41420:8;41415:2;41407:6;41403:15;41396:33;41211:225;:::o;41442:366::-;41584:3;41605:67;41669:2;41664:3;41605:67;:::i;:::-;41598:74;;41681:93;41770:3;41681:93;:::i;:::-;41799:2;41794:3;41790:12;41783:19;;41442:366;;;:::o;41814:419::-;41980:4;42018:2;42007:9;42003:18;41995:26;;42067:9;42061:4;42057:20;42053:1;42042:9;42038:17;42031:47;42095:131;42221:4;42095:131;:::i;:::-;42087:139;;41814:419;;;:::o;42239:231::-;42379:34;42375:1;42367:6;42363:14;42356:58;42448:14;42443:2;42435:6;42431:15;42424:39;42239:231;:::o;42476:366::-;42618:3;42639:67;42703:2;42698:3;42639:67;:::i;:::-;42632:74;;42715:93;42804:3;42715:93;:::i;:::-;42833:2;42828:3;42824:12;42817:19;;42476:366;;;:::o;42848:419::-;43014:4;43052:2;43041:9;43037:18;43029:26;;43101:9;43095:4;43091:20;43087:1;43076:9;43072:17;43065:47;43129:131;43255:4;43129:131;:::i;:::-;43121:139;;42848:419;;;:::o;43273:224::-;43413:34;43409:1;43401:6;43397:14;43390:58;43482:7;43477:2;43469:6;43465:15;43458:32;43273:224;:::o;43503:366::-;43645:3;43666:67;43730:2;43725:3;43666:67;:::i;:::-;43659:74;;43742:93;43831:3;43742:93;:::i;:::-;43860:2;43855:3;43851:12;43844:19;;43503:366;;;:::o;43875:419::-;44041:4;44079:2;44068:9;44064:18;44056:26;;44128:9;44122:4;44118:20;44114:1;44103:9;44099:17;44092:47;44156:131;44282:4;44156:131;:::i;:::-;44148:139;;43875:419;;;:::o;44300:223::-;44440:34;44436:1;44428:6;44424:14;44417:58;44509:6;44504:2;44496:6;44492:15;44485:31;44300:223;:::o;44529:366::-;44671:3;44692:67;44756:2;44751:3;44692:67;:::i;:::-;44685:74;;44768:93;44857:3;44768:93;:::i;:::-;44886:2;44881:3;44877:12;44870:19;;44529:366;;;:::o;44901:419::-;45067:4;45105:2;45094:9;45090:18;45082:26;;45154:9;45148:4;45144:20;45140:1;45129:9;45125:17;45118:47;45182:131;45308:4;45182:131;:::i;:::-;45174:139;;44901:419;;;:::o;45326:175::-;45466:27;45462:1;45454:6;45450:14;45443:51;45326:175;:::o;45507:366::-;45649:3;45670:67;45734:2;45729:3;45670:67;:::i;:::-;45663:74;;45746:93;45835:3;45746:93;:::i;:::-;45864:2;45859:3;45855:12;45848:19;;45507:366;;;:::o;45879:419::-;46045:4;46083:2;46072:9;46068:18;46060:26;;46132:9;46126:4;46122:20;46118:1;46107:9;46103:17;46096:47;46160:131;46286:4;46160:131;:::i;:::-;46152:139;;45879:419;;;:::o;46304:237::-;46444:34;46440:1;46432:6;46428:14;46421:58;46513:20;46508:2;46500:6;46496:15;46489:45;46304:237;:::o;46547:366::-;46689:3;46710:67;46774:2;46769:3;46710:67;:::i;:::-;46703:74;;46786:93;46875:3;46786:93;:::i;:::-;46904:2;46899:3;46895:12;46888:19;;46547:366;;;:::o;46919:419::-;47085:4;47123:2;47112:9;47108:18;47100:26;;47172:9;47166:4;47162:20;47158:1;47147:9;47143:17;47136:47;47200:131;47326:4;47200:131;:::i;:::-;47192:139;;46919:419;;;:::o;47344:233::-;47383:3;47406:24;47424:5;47406:24;:::i;:::-;47397:33;;47452:66;47445:5;47442:77;47439:103;;47522:18;;:::i;:::-;47439:103;47569:1;47562:5;47558:13;47551:20;;47344:233;;;:::o;47583:180::-;47631:77;47628:1;47621:88;47728:4;47725:1;47718:15;47752:4;47749:1;47742:15;47769:185;47809:1;47826:20;47844:1;47826:20;:::i;:::-;47821:25;;47860:20;47878:1;47860:20;:::i;:::-;47855:25;;47899:1;47889:35;;47904:18;;:::i;:::-;47889:35;47946:1;47943;47939:9;47934:14;;47769:185;;;;:::o;47960:176::-;47992:1;48009:20;48027:1;48009:20;:::i;:::-;48004:25;;48043:20;48061:1;48043:20;:::i;:::-;48038:25;;48082:1;48072:35;;48087:18;;:::i;:::-;48072:35;48128:1;48125;48121:9;48116:14;;47960:176;;;;:::o;48142:180::-;48190:77;48187:1;48180:88;48287:4;48284:1;48277:15;48311:4;48308:1;48301:15;48328:79;48367:7;48396:5;48385:16;;48328:79;;;:::o;48413:157::-;48518:45;48538:24;48556:5;48538:24;:::i;:::-;48518:45;:::i;:::-;48513:3;48506:58;48413:157;;:::o;48576:397::-;48716:3;48731:75;48802:3;48793:6;48731:75;:::i;:::-;48831:2;48826:3;48822:12;48815:19;;48844:75;48915:3;48906:6;48844:75;:::i;:::-;48944:2;48939:3;48935:12;48928:19;;48964:3;48957:10;;48576:397;;;;;:::o;48979:98::-;49030:6;49064:5;49058:12;49048:22;;48979:98;;;:::o;49083:168::-;49166:11;49200:6;49195:3;49188:19;49240:4;49235:3;49231:14;49216:29;;49083:168;;;;:::o;49257:373::-;49343:3;49371:38;49403:5;49371:38;:::i;:::-;49425:70;49488:6;49483:3;49425:70;:::i;:::-;49418:77;;49504:65;49562:6;49557:3;49550:4;49543:5;49539:16;49504:65;:::i;:::-;49594:29;49616:6;49594:29;:::i;:::-;49589:3;49585:39;49578:46;;49347:283;49257:373;;;;:::o;49636:640::-;49831:4;49869:3;49858:9;49854:19;49846:27;;49883:71;49951:1;49940:9;49936:17;49927:6;49883:71;:::i;:::-;49964:72;50032:2;50021:9;50017:18;50008:6;49964:72;:::i;:::-;50046;50114:2;50103:9;50099:18;50090:6;50046:72;:::i;:::-;50165:9;50159:4;50155:20;50150:2;50139:9;50135:18;50128:48;50193:76;50264:4;50255:6;50193:76;:::i;:::-;50185:84;;49636:640;;;;;;;:::o;50282:141::-;50338:5;50369:6;50363:13;50354:22;;50385:32;50411:5;50385:32;:::i;:::-;50282:141;;;;:::o;50429:349::-;50498:6;50547:2;50535:9;50526:7;50522:23;50518:32;50515:119;;;50553:79;;:::i;:::-;50515:119;50673:1;50698:63;50753:7;50744:6;50733:9;50729:22;50698:63;:::i;:::-;50688:73;;50644:127;50429:349;;;;:::o;50784:182::-;50924:34;50920:1;50912:6;50908:14;50901:58;50784:182;:::o;50972:366::-;51114:3;51135:67;51199:2;51194:3;51135:67;:::i;:::-;51128:74;;51211:93;51300:3;51211:93;:::i;:::-;51329:2;51324:3;51320:12;51313:19;;50972:366;;;:::o;51344:419::-;51510:4;51548:2;51537:9;51533:18;51525:26;;51597:9;51591:4;51587:20;51583:1;51572:9;51568:17;51561:47;51625:131;51751:4;51625:131;:::i;:::-;51617:139;;51344:419;;;:::o;51769:178::-;51909:30;51905:1;51897:6;51893:14;51886:54;51769:178;:::o;51953:366::-;52095:3;52116:67;52180:2;52175:3;52116:67;:::i;:::-;52109:74;;52192:93;52281:3;52192:93;:::i;:::-;52310:2;52305:3;52301:12;52294:19;;51953:366;;;:::o;52325:419::-;52491:4;52529:2;52518:9;52514:18;52506:26;;52578:9;52572:4;52568:20;52564:1;52553:9;52549:17;52542:47;52606:131;52732:4;52606:131;:::i;:::-;52598:139;;52325:419;;;:::o
Swarm Source
ipfs://94ba8e15e1a979ee7ca96b9f21f677a3002c19a9820127fea1b77a066a0fd6b5
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.