ERC-721
Overview
Max Total Supply
40 SQUIRREL
Holders
18
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 SQUIRRELLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
OutlawedSquirrel
Compiler Version
v0.8.0+commit.c7dfd78e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-10-05 */ // File @openzeppelin/contracts/utils/introspection/[email protected] // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } /** * @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; } /** * @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); } /** * @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); } /** * @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); } } } } 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; } } /** * @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); } } /** * @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: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } /** * @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; } } /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } contract OutlawedSquirrel is ERC721Enumerable, Ownable { using Strings for uint256; uint256 public constant MAX_SQUIRRELS = 10000; uint256 public constant PRICE = 0.1 ether; uint256 public constant MAX_PER_MINT = 10; uint256 public constant PRESALE_MAX_MINT = 10; uint256 public constant MAX_PER_ADDRESS = 50; uint256 public constant RESERVED_ITEMS = 500; uint256 public reservedClaimed; uint256 public itemsMinted; string public baseTokenURI; bool public publicSaleStarted; bool public presaleStarted; mapping(address => bool) private _presaleEligible; mapping(address => uint256) private _totalClaimed; event BaseURIChanged(string baseURI); event PresaleMint(address minter, uint256 amountOfItems); event PublicSaleMint(address minter, uint256 amountOfItems); constructor(string memory baseURI) ERC721("OutlawedSquirrel", "SQUIRREL") { baseTokenURI = baseURI; } function claimReserved(address recipient, uint256 amount) external onlyOwner { require(reservedClaimed != RESERVED_ITEMS, "Already have claimed all reserved items"); require(reservedClaimed + amount <= RESERVED_ITEMS, "Minting would exceed max reserved items"); require(recipient != address(0), "Cannot add null address"); require(totalSupply() < MAX_SQUIRRELS, "All tokens have been minted"); require(totalSupply() + amount <= MAX_SQUIRRELS, "Minting would exceed max supply"); uint256 _nextTokenId = itemsMinted + 1; for (uint256 i = 0; i < amount; i++) { _safeMint(recipient, _nextTokenId + i); } itemsMinted += amount; reservedClaimed += amount; } function addToPresale(address[] calldata addresses) external onlyOwner { for (uint256 i = 0; i < addresses.length; i++) { require(addresses[i] != address(0), "Cannot add null address"); _presaleEligible[addresses[i]] = true; _totalClaimed[addresses[i]] > 0 ? _totalClaimed[addresses[i]] : 0; } } function checkPresaleEligiblity(address addr) external view returns (bool) { return _presaleEligible[addr]; } function amountClaimedBy(address owner) external view returns (uint256) { require(owner != address(0), "Cannot add null address"); return _totalClaimed[owner]; } function mintPresale(uint256 amountOfItems) external payable { require(presaleStarted, "Presale has not started"); require(_presaleEligible[msg.sender], "You are not eligible for the presale"); require(totalSupply() < MAX_SQUIRRELS, "All tokens have been minted"); require(amountOfItems <= PRESALE_MAX_MINT, "Cannot purchase this many tokens during presale"); require(totalSupply() + amountOfItems <= MAX_SQUIRRELS, "Minting would exceed max supply"); require(_totalClaimed[msg.sender] + amountOfItems <= PRESALE_MAX_MINT, "Purchase exceeds max allowed"); require(amountOfItems > 0, "Must mint at least one item"); require(PRICE * amountOfItems == msg.value, "ETH amount is incorrect"); for (uint256 i = 0; i < amountOfItems; i++) { uint256 tokenId = itemsMinted + 1; itemsMinted += 1; _totalClaimed[msg.sender] += 1; _safeMint(msg.sender, tokenId); } emit PresaleMint(msg.sender, amountOfItems); } function mint(uint256 amountOfItems) external payable { require(publicSaleStarted, "Public sale has not started"); require(totalSupply() < MAX_PER_ADDRESS, "All tokens have been minted"); require(amountOfItems <= MAX_PER_MINT, "Cannot purchase this many tokens in a transaction"); require(totalSupply() + amountOfItems <= MAX_PER_ADDRESS, "Minting would exceed max supply"); require(_totalClaimed[msg.sender] + amountOfItems <= MAX_PER_ADDRESS, "Purchase exceeds max allowed per address"); require(amountOfItems > 0, "You must mint at least one item."); require(PRICE * amountOfItems == msg.value, "ETH amount is incorrect"); for (uint256 i = 0; i < amountOfItems; i++) { uint256 tokenId = itemsMinted + 1; itemsMinted += 1; _totalClaimed[msg.sender] += 1; _safeMint(msg.sender, tokenId); } emit PublicSaleMint(msg.sender, amountOfItems); } function togglePresaleStarted() external onlyOwner { presaleStarted = !presaleStarted; } function togglePublicSaleStarted() external onlyOwner { publicSaleStarted = !publicSaleStarted; } function _baseURI() internal view virtual override returns (string memory) { return baseTokenURI; } function setBaseURI(string memory baseURI) public onlyOwner { baseTokenURI = baseURI; emit BaseURIChanged(baseURI); } function withdraw() public onlyOwner { uint256 balance = address(this).balance; require(balance > 0, "Nothing to withdraw"); (bool success, ) = 0x413E28BE4DC2C9B8B82c49578658AC9A2a6c969F.call{ value: balance }(""); require(success, "Failed to widthdraw Ether"); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"baseURI","type":"string"}],"name":"BaseURIChanged","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":false,"internalType":"address","name":"minter","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountOfItems","type":"uint256"}],"name":"PresaleMint","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"minter","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountOfItems","type":"uint256"}],"name":"PublicSaleMint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_PER_ADDRESS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PER_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SQUIRRELS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRESALE_MAX_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RESERVED_ITEMS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"addToPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"amountClaimedBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"checkPresaleEligiblity","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"claimReserved","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"itemsMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOfItems","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOfItems","type":"uint256"}],"name":"mintPresale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSaleStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reservedClaimed","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":"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":"baseURI","type":"string"}],"name":"setBaseURI","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":[],"name":"togglePresaleStarted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"togglePublicSaleStarted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b50604051620058ac380380620058ac833981810160405281019062000037919062000307565b6040518060400160405280601081526020017f4f75746c61776564537175697272656c000000000000000000000000000000008152506040518060400160405280600881526020017f535155495252454c0000000000000000000000000000000000000000000000008152508160009080519060200190620000bb929190620001e5565b508060019080519060200190620000d4929190620001e5565b505050620000f7620000eb6200011760201b60201c565b6200011f60201b60201c565b80600d90805190602001906200010f929190620001e5565b50506200047d565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001f390620003e9565b90600052602060002090601f01602090048101928262000217576000855562000263565b82601f106200023257805160ff191683800117855562000263565b8280016001018555821562000263579182015b828111156200026257825182559160200191906001019062000245565b5b50905062000272919062000276565b5090565b5b808211156200029157600081600090555060010162000277565b5090565b6000620002ac620002a68462000380565b6200034c565b905082815260208101848484011115620002c557600080fd5b620002d2848285620003b3565b509392505050565b600082601f830112620002ec57600080fd5b8151620002fe84826020860162000295565b91505092915050565b6000602082840312156200031a57600080fd5b600082015167ffffffffffffffff8111156200033557600080fd5b6200034384828501620002da565b91505092915050565b6000604051905081810181811067ffffffffffffffff821117156200037657620003756200044e565b5b8060405250919050565b600067ffffffffffffffff8211156200039e576200039d6200044e565b5b601f19601f8301169050602081019050919050565b60005b83811015620003d3578082015181840152602081019050620003b6565b83811115620003e3576000848401525b50505050565b600060028204905060018216806200040257607f821691505b602082108114156200041957620004186200041f565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61541f806200048d6000396000f3fe60806040526004361061023b5760003560e01c806355f804b31161012e578063a2e91477116100ab578063d547cfb71161006f578063d547cfb714610868578063e985e9c514610893578063ed1fc2a2146108d0578063f2fde38b146108e7578063f759867a146109105761023b565b8063a2e9147714610783578063aef6ee1f146107ae578063b65128a3146107d7578063b88d4fde14610802578063c87b56dd1461082b5761023b565b80638d859f3e116100f25780638d859f3e146106bd5780638da5cb5b146106e857806395d89b4114610713578063a0712d681461073e578063a22cb4651461075a5761023b565b806355f804b3146105d85780635c78a393146106015780636352211e1461062c57806370a0823114610669578063715018a6146106a65761023b565b80631b5757f2116101bc5780633051484e116101805780633051484e146105055780633ccfd60b1461053057806342842e0e146105475780634f6ccce714610570578063549527c3146105ad5761023b565b80631b5757f21461043457806323b872dd1461045d57806324510043146104865780632f745c59146104b15780632f814575146104ee5761023b565b806309d42b301161020357806309d42b30146103395780630aaef2851461036457806318160ddd1461038f578063191f65ac146103ba5780631978f469146103f75761023b565b806301ffc9a71461024057806304549d6f1461027d57806306fdde03146102a8578063081812fc146102d3578063095ea7b314610310575b600080fd5b34801561024c57600080fd5b5061026760048036038101906102629190613c8b565b61092c565b6040516102749190614ab2565b60405180910390f35b34801561028957600080fd5b506102926109a6565b60405161029f9190614ab2565b60405180910390f35b3480156102b457600080fd5b506102bd6109b9565b6040516102ca9190614acd565b60405180910390f35b3480156102df57600080fd5b506102fa60048036038101906102f59190613d1e565b610a4b565b6040516103079190614a22565b60405180910390f35b34801561031c57600080fd5b5061033760048036038101906103329190613c0a565b610ad0565b005b34801561034557600080fd5b5061034e610be8565b60405161035b9190614f4f565b60405180910390f35b34801561037057600080fd5b50610379610bed565b6040516103869190614f4f565b60405180910390f35b34801561039b57600080fd5b506103a4610bf2565b6040516103b19190614f4f565b60405180910390f35b3480156103c657600080fd5b506103e160048036038101906103dc9190613a9f565b610bff565b6040516103ee9190614ab2565b60405180910390f35b34801561040357600080fd5b5061041e60048036038101906104199190613a9f565b610c55565b60405161042b9190614f4f565b60405180910390f35b34801561044057600080fd5b5061045b60048036038101906104569190613c0a565b610d0d565b005b34801561046957600080fd5b50610484600480360381019061047f9190613b04565b610fb2565b005b34801561049257600080fd5b5061049b611012565b6040516104a89190614f4f565b60405180910390f35b3480156104bd57600080fd5b506104d860048036038101906104d39190613c0a565b611018565b6040516104e59190614f4f565b60405180910390f35b3480156104fa57600080fd5b506105036110bd565b005b34801561051157600080fd5b5061051a611165565b6040516105279190614f4f565b60405180910390f35b34801561053c57600080fd5b5061054561116b565b005b34801561055357600080fd5b5061056e60048036038101906105699190613b04565b6112f3565b005b34801561057c57600080fd5b5061059760048036038101906105929190613d1e565b611313565b6040516105a49190614f4f565b60405180910390f35b3480156105b957600080fd5b506105c26113aa565b6040516105cf9190614f4f565b60405180910390f35b3480156105e457600080fd5b506105ff60048036038101906105fa9190613cdd565b6113af565b005b34801561060d57600080fd5b5061061661147c565b6040516106239190614f4f565b60405180910390f35b34801561063857600080fd5b50610653600480360381019061064e9190613d1e565b611482565b6040516106609190614a22565b60405180910390f35b34801561067557600080fd5b50610690600480360381019061068b9190613a9f565b611534565b60405161069d9190614f4f565b60405180910390f35b3480156106b257600080fd5b506106bb6115ec565b005b3480156106c957600080fd5b506106d2611674565b6040516106df9190614f4f565b60405180910390f35b3480156106f457600080fd5b506106fd611680565b60405161070a9190614a22565b60405180910390f35b34801561071f57600080fd5b506107286116aa565b6040516107359190614acd565b60405180910390f35b61075860048036038101906107539190613d1e565b61173c565b005b34801561076657600080fd5b50610781600480360381019061077c9190613bce565b611a7f565b005b34801561078f57600080fd5b50610798611c00565b6040516107a59190614ab2565b60405180910390f35b3480156107ba57600080fd5b506107d560048036038101906107d09190613c46565b611c13565b005b3480156107e357600080fd5b506107ec611f41565b6040516107f99190614f4f565b60405180910390f35b34801561080e57600080fd5b5061082960048036038101906108249190613b53565b611f47565b005b34801561083757600080fd5b50610852600480360381019061084d9190613d1e565b611fa9565b60405161085f9190614acd565b60405180910390f35b34801561087457600080fd5b5061087d612050565b60405161088a9190614acd565b60405180910390f35b34801561089f57600080fd5b506108ba60048036038101906108b59190613ac8565b6120de565b6040516108c79190614ab2565b60405180910390f35b3480156108dc57600080fd5b506108e5612172565b005b3480156108f357600080fd5b5061090e60048036038101906109099190613a9f565b61221a565b005b61092a60048036038101906109259190613d1e565b612312565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061099f575061099e826126e3565b5b9050919050565b600e60019054906101000a900460ff1681565b6060600080546109c890615214565b80601f01602080910402602001604051908101604052809291908181526020018280546109f490615214565b8015610a415780601f10610a1657610100808354040283529160200191610a41565b820191906000526020600020905b815481529060010190602001808311610a2457829003601f168201915b5050505050905090565b6000610a56826127c5565b610a95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8c90614d6f565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610adb82611482565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4390614e2f565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b6b612831565b73ffffffffffffffffffffffffffffffffffffffff161480610b9a5750610b9981610b94612831565b6120de565b5b610bd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd090614c8f565b60405180910390fd5b610be38383612839565b505050565b600a81565b603281565b6000600880549050905090565b6000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610cc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbd90614e6f565b60405180910390fd5b601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610d15612831565b73ffffffffffffffffffffffffffffffffffffffff16610d33611680565b73ffffffffffffffffffffffffffffffffffffffff1614610d89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8090614d8f565b60405180910390fd5b6101f4600b541415610dd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc790614f0f565b60405180910390fd5b6101f481600b54610de19190615049565b1115610e22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1990614eaf565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610e92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8990614e6f565b60405180910390fd5b612710610e9d610bf2565b10610edd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed490614f2f565b60405180910390fd5b61271081610ee9610bf2565b610ef39190615049565b1115610f34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2b90614cef565b60405180910390fd5b60006001600c54610f459190615049565b905060005b82811015610f7a57610f67848284610f629190615049565b6128f2565b8080610f7290615246565b915050610f4a565b5081600c6000828254610f8d9190615049565b9250508190555081600b6000828254610fa69190615049565b92505081905550505050565b610fc3610fbd612831565b82612910565b611002576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff990614e8f565b60405180910390fd5b61100d8383836129ee565b505050565b600b5481565b600061102383611534565b8210611064576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105b90614b6f565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6110c5612831565b73ffffffffffffffffffffffffffffffffffffffff166110e3611680565b73ffffffffffffffffffffffffffffffffffffffff1614611139576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113090614d8f565b60405180910390fd5b600e60009054906101000a900460ff1615600e60006101000a81548160ff021916908315150217905550565b6101f481565b611173612831565b73ffffffffffffffffffffffffffffffffffffffff16611191611680565b73ffffffffffffffffffffffffffffffffffffffff16146111e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111de90614d8f565b60405180910390fd5b60004790506000811161122f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122690614b4f565b60405180910390fd5b600073413e28be4dc2c9b8b82c49578658ac9a2a6c969f73ffffffffffffffffffffffffffffffffffffffff168260405161126990614a0d565b60006040518083038185875af1925050503d80600081146112a6576040519150601f19603f3d011682016040523d82523d6000602084013e6112ab565b606091505b50509050806112ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e690614def565b60405180910390fd5b5050565b61130e83838360405180602001604052806000815250611f47565b505050565b600061131d610bf2565b821061135e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135590614ecf565b60405180910390fd5b60088281548110611398577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b600a81565b6113b7612831565b73ffffffffffffffffffffffffffffffffffffffff166113d5611680565b73ffffffffffffffffffffffffffffffffffffffff161461142b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142290614d8f565b60405180910390fd5b80600d9080519060200190611441929190613879565b507f5411e8ebf1636d9e83d5fc4900bf80cbac82e8790da2a4c94db4895e889eedf6816040516114719190614acd565b60405180910390a150565b600c5481565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561152b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152290614ccf565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159c90614caf565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6115f4612831565b73ffffffffffffffffffffffffffffffffffffffff16611612611680565b73ffffffffffffffffffffffffffffffffffffffff1614611668576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165f90614d8f565b60405180910390fd5b6116726000612c4a565b565b67016345785d8a000081565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546116b990615214565b80601f01602080910402602001604051908101604052809291908181526020018280546116e590615214565b80156117325780601f1061170757610100808354040283529160200191611732565b820191906000526020600020905b81548152906001019060200180831161171557829003601f168201915b5050505050905090565b600e60009054906101000a900460ff1661178b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178290614bef565b60405180910390fd5b6032611795610bf2565b106117d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117cc90614f2f565b60405180910390fd5b600a811115611819576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181090614d0f565b60405180910390fd5b603281611824610bf2565b61182e9190615049565b111561186f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186690614cef565b60405180910390fd5b603281601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546118bc9190615049565b11156118fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f490614e0f565b60405180910390fd5b60008111611940576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193790614e4f565b60405180910390fd5b348167016345785d8a000061195591906150d0565b14611995576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198c90614d4f565b60405180910390fd5b60005b81811015611a425760006001600c546119b19190615049565b90506001600c60008282546119c69190615049565b925050819055506001601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a1d9190615049565b92505081905550611a2e33826128f2565b508080611a3a90615246565b915050611998565b507f239739eec2dbaccb604ff1de6462a5eccd5f3148924696dd88f04d636ff582b53382604051611a74929190614a89565b60405180910390a150565b611a87612831565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611af5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aec90614c2f565b60405180910390fd5b8060056000611b02612831565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611baf612831565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611bf49190614ab2565b60405180910390a35050565b600e60009054906101000a900460ff1681565b611c1b612831565b73ffffffffffffffffffffffffffffffffffffffff16611c39611680565b73ffffffffffffffffffffffffffffffffffffffff1614611c8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8690614d8f565b60405180910390fd5b60005b82829050811015611f3c57600073ffffffffffffffffffffffffffffffffffffffff16838383818110611cee577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002016020810190611d039190613a9f565b73ffffffffffffffffffffffffffffffffffffffff161415611d5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5190614e6f565b60405180910390fd5b6001600f6000858585818110611d99577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002016020810190611dae9190613a9f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600060106000858585818110611e3e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002016020810190611e539190613a9f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411611e9a576000611f28565b60106000848484818110611ed7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002016020810190611eec9190613a9f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020545b508080611f3490615246565b915050611c92565b505050565b61271081565b611f58611f52612831565b83612910565b611f97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8e90614e8f565b60405180910390fd5b611fa384848484612d10565b50505050565b6060611fb4826127c5565b611ff3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fea90614dcf565b60405180910390fd5b6000611ffd612d6c565b9050600081511161201d5760405180602001604052806000815250612048565b8061202784612dfe565b6040516020016120389291906149e9565b6040516020818303038152906040525b915050919050565b600d805461205d90615214565b80601f016020809104026020016040519081016040528092919081815260200182805461208990615214565b80156120d65780601f106120ab576101008083540402835291602001916120d6565b820191906000526020600020905b8154815290600101906020018083116120b957829003601f168201915b505050505081565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61217a612831565b73ffffffffffffffffffffffffffffffffffffffff16612198611680565b73ffffffffffffffffffffffffffffffffffffffff16146121ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e590614d8f565b60405180910390fd5b600e60019054906101000a900460ff1615600e60016101000a81548160ff021916908315150217905550565b612222612831565b73ffffffffffffffffffffffffffffffffffffffff16612240611680565b73ffffffffffffffffffffffffffffffffffffffff1614612296576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228d90614d8f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612306576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122fd90614baf565b60405180910390fd5b61230f81612c4a565b50565b600e60019054906101000a900460ff16612361576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235890614aef565b60405180910390fd5b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166123ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e490614c4f565b60405180910390fd5b6127106123f8610bf2565b10612438576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242f90614f2f565b60405180910390fd5b600a81111561247c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247390614b0f565b60405180910390fd5b61271081612488610bf2565b6124929190615049565b11156124d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ca90614cef565b60405180910390fd5b600a81601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546125209190615049565b1115612561576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255890614eef565b60405180910390fd5b600081116125a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161259b90614b2f565b60405180910390fd5b348167016345785d8a00006125b991906150d0565b146125f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125f090614d4f565b60405180910390fd5b60005b818110156126a65760006001600c546126159190615049565b90506001600c600082825461262a9190615049565b925050819055506001601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126819190615049565b9250508190555061269233826128f2565b50808061269e90615246565b9150506125fc565b507ff5df7d07fef0d8ac7581015ebd1a3b7b7760da84b12f0c8174ae0dcd639cb6a333826040516126d8929190614a89565b60405180910390a150565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806127ae57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806127be57506127bd82612fab565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166128ac83611482565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b61290c828260405180602001604052806000815250613015565b5050565b600061291b826127c5565b61295a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161295190614c6f565b60405180910390fd5b600061296583611482565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806129d457508373ffffffffffffffffffffffffffffffffffffffff166129bc84610a4b565b73ffffffffffffffffffffffffffffffffffffffff16145b806129e557506129e481856120de565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612a0e82611482565b73ffffffffffffffffffffffffffffffffffffffff1614612a64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a5b90614daf565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ad4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612acb90614c0f565b60405180910390fd5b612adf838383613070565b612aea600082612839565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b3a919061512a565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b919190615049565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612d1b8484846129ee565b612d2784848484613184565b612d66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d5d90614b8f565b60405180910390fd5b50505050565b6060600d8054612d7b90615214565b80601f0160208091040260200160405190810160405280929190818152602001828054612da790615214565b8015612df45780601f10612dc957610100808354040283529160200191612df4565b820191906000526020600020905b815481529060010190602001808311612dd757829003601f168201915b5050505050905090565b60606000821415612e46576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612fa6565b600082905060005b60008214612e78578080612e6190615246565b915050600a82612e71919061509f565b9150612e4e565b60008167ffffffffffffffff811115612eba577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612eec5781602001600182028036833780820191505090505b5090505b60008514612f9f57600182612f05919061512a565b9150600a85612f14919061528f565b6030612f209190615049565b60f81b818381518110612f5c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612f98919061509f565b9450612ef0565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61301f838361331b565b61302c6000848484613184565b61306b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161306290614b8f565b60405180910390fd5b505050565b61307b8383836134e9565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156130be576130b9816134ee565b6130fd565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146130fc576130fb8382613537565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156131405761313b816136a4565b61317f565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461317e5761317d82826137e7565b5b5b505050565b60006131a58473ffffffffffffffffffffffffffffffffffffffff16613866565b1561330e578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026131ce612831565b8786866040518563ffffffff1660e01b81526004016131f09493929190614a3d565b602060405180830381600087803b15801561320a57600080fd5b505af192505050801561323b57506040513d601f19601f820116820180604052508101906132389190613cb4565b60015b6132be573d806000811461326b576040519150601f19603f3d011682016040523d82523d6000602084013e613270565b606091505b506000815114156132b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132ad90614b8f565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613313565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561338b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161338290614d2f565b60405180910390fd5b613394816127c5565b156133d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133cb90614bcf565b60405180910390fd5b6133e060008383613070565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546134309190615049565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161354484611534565b61354e919061512a565b9050600060076000848152602001908152602001600020549050818114613633576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506136b8919061512a565b905060006009600084815260200190815260200160002054905060006008838154811061370e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110613756577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806137cb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006137f283611534565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b82805461388590615214565b90600052602060002090601f0160209004810192826138a757600085556138ee565b82601f106138c057805160ff19168380011785556138ee565b828001600101855582156138ee579182015b828111156138ed5782518255916020019190600101906138d2565b5b5090506138fb91906138ff565b5090565b5b80821115613918576000816000905550600101613900565b5090565b600061392f61392a84614f9b565b614f6a565b90508281526020810184848401111561394757600080fd5b6139528482856151d2565b509392505050565b600061396d61396884614fcb565b614f6a565b90508281526020810184848401111561398557600080fd5b6139908482856151d2565b509392505050565b6000813590506139a78161538d565b92915050565b60008083601f8401126139bf57600080fd5b8235905067ffffffffffffffff8111156139d857600080fd5b6020830191508360208202830111156139f057600080fd5b9250929050565b600081359050613a06816153a4565b92915050565b600081359050613a1b816153bb565b92915050565b600081519050613a30816153bb565b92915050565b600082601f830112613a4757600080fd5b8135613a5784826020860161391c565b91505092915050565b600082601f830112613a7157600080fd5b8135613a8184826020860161395a565b91505092915050565b600081359050613a99816153d2565b92915050565b600060208284031215613ab157600080fd5b6000613abf84828501613998565b91505092915050565b60008060408385031215613adb57600080fd5b6000613ae985828601613998565b9250506020613afa85828601613998565b9150509250929050565b600080600060608486031215613b1957600080fd5b6000613b2786828701613998565b9350506020613b3886828701613998565b9250506040613b4986828701613a8a565b9150509250925092565b60008060008060808587031215613b6957600080fd5b6000613b7787828801613998565b9450506020613b8887828801613998565b9350506040613b9987828801613a8a565b925050606085013567ffffffffffffffff811115613bb657600080fd5b613bc287828801613a36565b91505092959194509250565b60008060408385031215613be157600080fd5b6000613bef85828601613998565b9250506020613c00858286016139f7565b9150509250929050565b60008060408385031215613c1d57600080fd5b6000613c2b85828601613998565b9250506020613c3c85828601613a8a565b9150509250929050565b60008060208385031215613c5957600080fd5b600083013567ffffffffffffffff811115613c7357600080fd5b613c7f858286016139ad565b92509250509250929050565b600060208284031215613c9d57600080fd5b6000613cab84828501613a0c565b91505092915050565b600060208284031215613cc657600080fd5b6000613cd484828501613a21565b91505092915050565b600060208284031215613cef57600080fd5b600082013567ffffffffffffffff811115613d0957600080fd5b613d1584828501613a60565b91505092915050565b600060208284031215613d3057600080fd5b6000613d3e84828501613a8a565b91505092915050565b613d508161515e565b82525050565b613d5f81615170565b82525050565b6000613d7082614ffb565b613d7a8185615011565b9350613d8a8185602086016151e1565b613d938161537c565b840191505092915050565b6000613da982615006565b613db3818561502d565b9350613dc38185602086016151e1565b613dcc8161537c565b840191505092915050565b6000613de282615006565b613dec818561503e565b9350613dfc8185602086016151e1565b80840191505092915050565b6000613e1560178361502d565b91507f50726573616c6520686173206e6f7420737461727465640000000000000000006000830152602082019050919050565b6000613e55602f8361502d565b91507f43616e6e6f742070757263686173652074686973206d616e7920746f6b656e7360008301527f20647572696e672070726573616c6500000000000000000000000000000000006020830152604082019050919050565b6000613ebb601b8361502d565b91507f4d757374206d696e74206174206c65617374206f6e65206974656d00000000006000830152602082019050919050565b6000613efb60138361502d565b91507f4e6f7468696e6720746f207769746864726177000000000000000000000000006000830152602082019050919050565b6000613f3b602b8361502d565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b6000613fa160328361502d565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b600061400760268361502d565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061406d601c8361502d565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b60006140ad601b8361502d565b91507f5075626c69632073616c6520686173206e6f74207374617274656400000000006000830152602082019050919050565b60006140ed60248361502d565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061415360198361502d565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b600061419360248361502d565b91507f596f7520617265206e6f7420656c696769626c6520666f72207468652070726560008301527f73616c65000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006141f9602c8361502d565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061425f60388361502d565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b60006142c5602a8361502d565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b600061432b60298361502d565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614391601f8361502d565b91507f4d696e74696e6720776f756c6420657863656564206d617820737570706c79006000830152602082019050919050565b60006143d160318361502d565b91507f43616e6e6f742070757263686173652074686973206d616e7920746f6b656e7360008301527f20696e2061207472616e73616374696f6e0000000000000000000000000000006020830152604082019050919050565b600061443760208361502d565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b600061447760178361502d565b91507f45544820616d6f756e7420697320696e636f72726563740000000000000000006000830152602082019050919050565b60006144b7602c8361502d565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061451d60208361502d565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b600061455d60298361502d565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006145c3602f8361502d565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b600061462960198361502d565b91507f4661696c656420746f20776964746864726177204574686572000000000000006000830152602082019050919050565b600061466960288361502d565b91507f50757263686173652065786365656473206d617820616c6c6f7765642070657260008301527f20616464726573730000000000000000000000000000000000000000000000006020830152604082019050919050565b60006146cf60218361502d565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061473560208361502d565b91507f596f75206d757374206d696e74206174206c65617374206f6e65206974656d2e6000830152602082019050919050565b6000614775600083615022565b9150600082019050919050565b600061478f60178361502d565b91507f43616e6e6f7420616464206e756c6c20616464726573730000000000000000006000830152602082019050919050565b60006147cf60318361502d565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b600061483560278361502d565b91507f4d696e74696e6720776f756c6420657863656564206d6178207265736572766560008301527f64206974656d73000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061489b602c8361502d565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6000614901601c8361502d565b91507f50757263686173652065786365656473206d617820616c6c6f776564000000006000830152602082019050919050565b600061494160278361502d565b91507f416c7265616479206861766520636c61696d656420616c6c207265736572766560008301527f64206974656d73000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006149a7601b8361502d565b91507f416c6c20746f6b656e732068617665206265656e206d696e74656400000000006000830152602082019050919050565b6149e3816151c8565b82525050565b60006149f58285613dd7565b9150614a018284613dd7565b91508190509392505050565b6000614a1882614768565b9150819050919050565b6000602082019050614a376000830184613d47565b92915050565b6000608082019050614a526000830187613d47565b614a5f6020830186613d47565b614a6c60408301856149da565b8181036060830152614a7e8184613d65565b905095945050505050565b6000604082019050614a9e6000830185613d47565b614aab60208301846149da565b9392505050565b6000602082019050614ac76000830184613d56565b92915050565b60006020820190508181036000830152614ae78184613d9e565b905092915050565b60006020820190508181036000830152614b0881613e08565b9050919050565b60006020820190508181036000830152614b2881613e48565b9050919050565b60006020820190508181036000830152614b4881613eae565b9050919050565b60006020820190508181036000830152614b6881613eee565b9050919050565b60006020820190508181036000830152614b8881613f2e565b9050919050565b60006020820190508181036000830152614ba881613f94565b9050919050565b60006020820190508181036000830152614bc881613ffa565b9050919050565b60006020820190508181036000830152614be881614060565b9050919050565b60006020820190508181036000830152614c08816140a0565b9050919050565b60006020820190508181036000830152614c28816140e0565b9050919050565b60006020820190508181036000830152614c4881614146565b9050919050565b60006020820190508181036000830152614c6881614186565b9050919050565b60006020820190508181036000830152614c88816141ec565b9050919050565b60006020820190508181036000830152614ca881614252565b9050919050565b60006020820190508181036000830152614cc8816142b8565b9050919050565b60006020820190508181036000830152614ce88161431e565b9050919050565b60006020820190508181036000830152614d0881614384565b9050919050565b60006020820190508181036000830152614d28816143c4565b9050919050565b60006020820190508181036000830152614d488161442a565b9050919050565b60006020820190508181036000830152614d688161446a565b9050919050565b60006020820190508181036000830152614d88816144aa565b9050919050565b60006020820190508181036000830152614da881614510565b9050919050565b60006020820190508181036000830152614dc881614550565b9050919050565b60006020820190508181036000830152614de8816145b6565b9050919050565b60006020820190508181036000830152614e088161461c565b9050919050565b60006020820190508181036000830152614e288161465c565b9050919050565b60006020820190508181036000830152614e48816146c2565b9050919050565b60006020820190508181036000830152614e6881614728565b9050919050565b60006020820190508181036000830152614e8881614782565b9050919050565b60006020820190508181036000830152614ea8816147c2565b9050919050565b60006020820190508181036000830152614ec881614828565b9050919050565b60006020820190508181036000830152614ee88161488e565b9050919050565b60006020820190508181036000830152614f08816148f4565b9050919050565b60006020820190508181036000830152614f2881614934565b9050919050565b60006020820190508181036000830152614f488161499a565b9050919050565b6000602082019050614f6460008301846149da565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614f9157614f9061534d565b5b8060405250919050565b600067ffffffffffffffff821115614fb657614fb561534d565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614fe657614fe561534d565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000615054826151c8565b915061505f836151c8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115615094576150936152c0565b5b828201905092915050565b60006150aa826151c8565b91506150b5836151c8565b9250826150c5576150c46152ef565b5b828204905092915050565b60006150db826151c8565b91506150e6836151c8565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561511f5761511e6152c0565b5b828202905092915050565b6000615135826151c8565b9150615140836151c8565b925082821015615153576151526152c0565b5b828203905092915050565b6000615169826151a8565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156151ff5780820151818401526020810190506151e4565b8381111561520e576000848401525b50505050565b6000600282049050600182168061522c57607f821691505b602082108114156152405761523f61531e565b5b50919050565b6000615251826151c8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615284576152836152c0565b5b600182019050919050565b600061529a826151c8565b91506152a5836151c8565b9250826152b5576152b46152ef565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b6153968161515e565b81146153a157600080fd5b50565b6153ad81615170565b81146153b857600080fd5b50565b6153c48161517c565b81146153cf57600080fd5b50565b6153db816151c8565b81146153e657600080fd5b5056fea2646970667358221220c75427b2b26459ff877ac6996014b47cd0fcaba309cfbb989a39a352076407fa64736f6c634300080000330000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002668747470733a2f2f64336578786578717067376c666a2e636c6f756466726f6e742e6e65742f0000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x60806040526004361061023b5760003560e01c806355f804b31161012e578063a2e91477116100ab578063d547cfb71161006f578063d547cfb714610868578063e985e9c514610893578063ed1fc2a2146108d0578063f2fde38b146108e7578063f759867a146109105761023b565b8063a2e9147714610783578063aef6ee1f146107ae578063b65128a3146107d7578063b88d4fde14610802578063c87b56dd1461082b5761023b565b80638d859f3e116100f25780638d859f3e146106bd5780638da5cb5b146106e857806395d89b4114610713578063a0712d681461073e578063a22cb4651461075a5761023b565b806355f804b3146105d85780635c78a393146106015780636352211e1461062c57806370a0823114610669578063715018a6146106a65761023b565b80631b5757f2116101bc5780633051484e116101805780633051484e146105055780633ccfd60b1461053057806342842e0e146105475780634f6ccce714610570578063549527c3146105ad5761023b565b80631b5757f21461043457806323b872dd1461045d57806324510043146104865780632f745c59146104b15780632f814575146104ee5761023b565b806309d42b301161020357806309d42b30146103395780630aaef2851461036457806318160ddd1461038f578063191f65ac146103ba5780631978f469146103f75761023b565b806301ffc9a71461024057806304549d6f1461027d57806306fdde03146102a8578063081812fc146102d3578063095ea7b314610310575b600080fd5b34801561024c57600080fd5b5061026760048036038101906102629190613c8b565b61092c565b6040516102749190614ab2565b60405180910390f35b34801561028957600080fd5b506102926109a6565b60405161029f9190614ab2565b60405180910390f35b3480156102b457600080fd5b506102bd6109b9565b6040516102ca9190614acd565b60405180910390f35b3480156102df57600080fd5b506102fa60048036038101906102f59190613d1e565b610a4b565b6040516103079190614a22565b60405180910390f35b34801561031c57600080fd5b5061033760048036038101906103329190613c0a565b610ad0565b005b34801561034557600080fd5b5061034e610be8565b60405161035b9190614f4f565b60405180910390f35b34801561037057600080fd5b50610379610bed565b6040516103869190614f4f565b60405180910390f35b34801561039b57600080fd5b506103a4610bf2565b6040516103b19190614f4f565b60405180910390f35b3480156103c657600080fd5b506103e160048036038101906103dc9190613a9f565b610bff565b6040516103ee9190614ab2565b60405180910390f35b34801561040357600080fd5b5061041e60048036038101906104199190613a9f565b610c55565b60405161042b9190614f4f565b60405180910390f35b34801561044057600080fd5b5061045b60048036038101906104569190613c0a565b610d0d565b005b34801561046957600080fd5b50610484600480360381019061047f9190613b04565b610fb2565b005b34801561049257600080fd5b5061049b611012565b6040516104a89190614f4f565b60405180910390f35b3480156104bd57600080fd5b506104d860048036038101906104d39190613c0a565b611018565b6040516104e59190614f4f565b60405180910390f35b3480156104fa57600080fd5b506105036110bd565b005b34801561051157600080fd5b5061051a611165565b6040516105279190614f4f565b60405180910390f35b34801561053c57600080fd5b5061054561116b565b005b34801561055357600080fd5b5061056e60048036038101906105699190613b04565b6112f3565b005b34801561057c57600080fd5b5061059760048036038101906105929190613d1e565b611313565b6040516105a49190614f4f565b60405180910390f35b3480156105b957600080fd5b506105c26113aa565b6040516105cf9190614f4f565b60405180910390f35b3480156105e457600080fd5b506105ff60048036038101906105fa9190613cdd565b6113af565b005b34801561060d57600080fd5b5061061661147c565b6040516106239190614f4f565b60405180910390f35b34801561063857600080fd5b50610653600480360381019061064e9190613d1e565b611482565b6040516106609190614a22565b60405180910390f35b34801561067557600080fd5b50610690600480360381019061068b9190613a9f565b611534565b60405161069d9190614f4f565b60405180910390f35b3480156106b257600080fd5b506106bb6115ec565b005b3480156106c957600080fd5b506106d2611674565b6040516106df9190614f4f565b60405180910390f35b3480156106f457600080fd5b506106fd611680565b60405161070a9190614a22565b60405180910390f35b34801561071f57600080fd5b506107286116aa565b6040516107359190614acd565b60405180910390f35b61075860048036038101906107539190613d1e565b61173c565b005b34801561076657600080fd5b50610781600480360381019061077c9190613bce565b611a7f565b005b34801561078f57600080fd5b50610798611c00565b6040516107a59190614ab2565b60405180910390f35b3480156107ba57600080fd5b506107d560048036038101906107d09190613c46565b611c13565b005b3480156107e357600080fd5b506107ec611f41565b6040516107f99190614f4f565b60405180910390f35b34801561080e57600080fd5b5061082960048036038101906108249190613b53565b611f47565b005b34801561083757600080fd5b50610852600480360381019061084d9190613d1e565b611fa9565b60405161085f9190614acd565b60405180910390f35b34801561087457600080fd5b5061087d612050565b60405161088a9190614acd565b60405180910390f35b34801561089f57600080fd5b506108ba60048036038101906108b59190613ac8565b6120de565b6040516108c79190614ab2565b60405180910390f35b3480156108dc57600080fd5b506108e5612172565b005b3480156108f357600080fd5b5061090e60048036038101906109099190613a9f565b61221a565b005b61092a60048036038101906109259190613d1e565b612312565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061099f575061099e826126e3565b5b9050919050565b600e60019054906101000a900460ff1681565b6060600080546109c890615214565b80601f01602080910402602001604051908101604052809291908181526020018280546109f490615214565b8015610a415780601f10610a1657610100808354040283529160200191610a41565b820191906000526020600020905b815481529060010190602001808311610a2457829003601f168201915b5050505050905090565b6000610a56826127c5565b610a95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8c90614d6f565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610adb82611482565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4390614e2f565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b6b612831565b73ffffffffffffffffffffffffffffffffffffffff161480610b9a5750610b9981610b94612831565b6120de565b5b610bd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd090614c8f565b60405180910390fd5b610be38383612839565b505050565b600a81565b603281565b6000600880549050905090565b6000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610cc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbd90614e6f565b60405180910390fd5b601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610d15612831565b73ffffffffffffffffffffffffffffffffffffffff16610d33611680565b73ffffffffffffffffffffffffffffffffffffffff1614610d89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8090614d8f565b60405180910390fd5b6101f4600b541415610dd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc790614f0f565b60405180910390fd5b6101f481600b54610de19190615049565b1115610e22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1990614eaf565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610e92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8990614e6f565b60405180910390fd5b612710610e9d610bf2565b10610edd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed490614f2f565b60405180910390fd5b61271081610ee9610bf2565b610ef39190615049565b1115610f34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2b90614cef565b60405180910390fd5b60006001600c54610f459190615049565b905060005b82811015610f7a57610f67848284610f629190615049565b6128f2565b8080610f7290615246565b915050610f4a565b5081600c6000828254610f8d9190615049565b9250508190555081600b6000828254610fa69190615049565b92505081905550505050565b610fc3610fbd612831565b82612910565b611002576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff990614e8f565b60405180910390fd5b61100d8383836129ee565b505050565b600b5481565b600061102383611534565b8210611064576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105b90614b6f565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6110c5612831565b73ffffffffffffffffffffffffffffffffffffffff166110e3611680565b73ffffffffffffffffffffffffffffffffffffffff1614611139576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113090614d8f565b60405180910390fd5b600e60009054906101000a900460ff1615600e60006101000a81548160ff021916908315150217905550565b6101f481565b611173612831565b73ffffffffffffffffffffffffffffffffffffffff16611191611680565b73ffffffffffffffffffffffffffffffffffffffff16146111e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111de90614d8f565b60405180910390fd5b60004790506000811161122f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122690614b4f565b60405180910390fd5b600073413e28be4dc2c9b8b82c49578658ac9a2a6c969f73ffffffffffffffffffffffffffffffffffffffff168260405161126990614a0d565b60006040518083038185875af1925050503d80600081146112a6576040519150601f19603f3d011682016040523d82523d6000602084013e6112ab565b606091505b50509050806112ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e690614def565b60405180910390fd5b5050565b61130e83838360405180602001604052806000815250611f47565b505050565b600061131d610bf2565b821061135e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135590614ecf565b60405180910390fd5b60088281548110611398577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b600a81565b6113b7612831565b73ffffffffffffffffffffffffffffffffffffffff166113d5611680565b73ffffffffffffffffffffffffffffffffffffffff161461142b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142290614d8f565b60405180910390fd5b80600d9080519060200190611441929190613879565b507f5411e8ebf1636d9e83d5fc4900bf80cbac82e8790da2a4c94db4895e889eedf6816040516114719190614acd565b60405180910390a150565b600c5481565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561152b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152290614ccf565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159c90614caf565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6115f4612831565b73ffffffffffffffffffffffffffffffffffffffff16611612611680565b73ffffffffffffffffffffffffffffffffffffffff1614611668576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165f90614d8f565b60405180910390fd5b6116726000612c4a565b565b67016345785d8a000081565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546116b990615214565b80601f01602080910402602001604051908101604052809291908181526020018280546116e590615214565b80156117325780601f1061170757610100808354040283529160200191611732565b820191906000526020600020905b81548152906001019060200180831161171557829003601f168201915b5050505050905090565b600e60009054906101000a900460ff1661178b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178290614bef565b60405180910390fd5b6032611795610bf2565b106117d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117cc90614f2f565b60405180910390fd5b600a811115611819576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181090614d0f565b60405180910390fd5b603281611824610bf2565b61182e9190615049565b111561186f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186690614cef565b60405180910390fd5b603281601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546118bc9190615049565b11156118fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f490614e0f565b60405180910390fd5b60008111611940576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193790614e4f565b60405180910390fd5b348167016345785d8a000061195591906150d0565b14611995576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198c90614d4f565b60405180910390fd5b60005b81811015611a425760006001600c546119b19190615049565b90506001600c60008282546119c69190615049565b925050819055506001601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a1d9190615049565b92505081905550611a2e33826128f2565b508080611a3a90615246565b915050611998565b507f239739eec2dbaccb604ff1de6462a5eccd5f3148924696dd88f04d636ff582b53382604051611a74929190614a89565b60405180910390a150565b611a87612831565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611af5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aec90614c2f565b60405180910390fd5b8060056000611b02612831565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611baf612831565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611bf49190614ab2565b60405180910390a35050565b600e60009054906101000a900460ff1681565b611c1b612831565b73ffffffffffffffffffffffffffffffffffffffff16611c39611680565b73ffffffffffffffffffffffffffffffffffffffff1614611c8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8690614d8f565b60405180910390fd5b60005b82829050811015611f3c57600073ffffffffffffffffffffffffffffffffffffffff16838383818110611cee577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002016020810190611d039190613a9f565b73ffffffffffffffffffffffffffffffffffffffff161415611d5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5190614e6f565b60405180910390fd5b6001600f6000858585818110611d99577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002016020810190611dae9190613a9f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600060106000858585818110611e3e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002016020810190611e539190613a9f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411611e9a576000611f28565b60106000848484818110611ed7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002016020810190611eec9190613a9f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020545b508080611f3490615246565b915050611c92565b505050565b61271081565b611f58611f52612831565b83612910565b611f97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8e90614e8f565b60405180910390fd5b611fa384848484612d10565b50505050565b6060611fb4826127c5565b611ff3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fea90614dcf565b60405180910390fd5b6000611ffd612d6c565b9050600081511161201d5760405180602001604052806000815250612048565b8061202784612dfe565b6040516020016120389291906149e9565b6040516020818303038152906040525b915050919050565b600d805461205d90615214565b80601f016020809104026020016040519081016040528092919081815260200182805461208990615214565b80156120d65780601f106120ab576101008083540402835291602001916120d6565b820191906000526020600020905b8154815290600101906020018083116120b957829003601f168201915b505050505081565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61217a612831565b73ffffffffffffffffffffffffffffffffffffffff16612198611680565b73ffffffffffffffffffffffffffffffffffffffff16146121ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e590614d8f565b60405180910390fd5b600e60019054906101000a900460ff1615600e60016101000a81548160ff021916908315150217905550565b612222612831565b73ffffffffffffffffffffffffffffffffffffffff16612240611680565b73ffffffffffffffffffffffffffffffffffffffff1614612296576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228d90614d8f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612306576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122fd90614baf565b60405180910390fd5b61230f81612c4a565b50565b600e60019054906101000a900460ff16612361576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235890614aef565b60405180910390fd5b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166123ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e490614c4f565b60405180910390fd5b6127106123f8610bf2565b10612438576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242f90614f2f565b60405180910390fd5b600a81111561247c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247390614b0f565b60405180910390fd5b61271081612488610bf2565b6124929190615049565b11156124d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ca90614cef565b60405180910390fd5b600a81601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546125209190615049565b1115612561576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255890614eef565b60405180910390fd5b600081116125a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161259b90614b2f565b60405180910390fd5b348167016345785d8a00006125b991906150d0565b146125f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125f090614d4f565b60405180910390fd5b60005b818110156126a65760006001600c546126159190615049565b90506001600c600082825461262a9190615049565b925050819055506001601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126819190615049565b9250508190555061269233826128f2565b50808061269e90615246565b9150506125fc565b507ff5df7d07fef0d8ac7581015ebd1a3b7b7760da84b12f0c8174ae0dcd639cb6a333826040516126d8929190614a89565b60405180910390a150565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806127ae57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806127be57506127bd82612fab565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166128ac83611482565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b61290c828260405180602001604052806000815250613015565b5050565b600061291b826127c5565b61295a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161295190614c6f565b60405180910390fd5b600061296583611482565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806129d457508373ffffffffffffffffffffffffffffffffffffffff166129bc84610a4b565b73ffffffffffffffffffffffffffffffffffffffff16145b806129e557506129e481856120de565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612a0e82611482565b73ffffffffffffffffffffffffffffffffffffffff1614612a64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a5b90614daf565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ad4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612acb90614c0f565b60405180910390fd5b612adf838383613070565b612aea600082612839565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b3a919061512a565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b919190615049565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612d1b8484846129ee565b612d2784848484613184565b612d66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d5d90614b8f565b60405180910390fd5b50505050565b6060600d8054612d7b90615214565b80601f0160208091040260200160405190810160405280929190818152602001828054612da790615214565b8015612df45780601f10612dc957610100808354040283529160200191612df4565b820191906000526020600020905b815481529060010190602001808311612dd757829003601f168201915b5050505050905090565b60606000821415612e46576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612fa6565b600082905060005b60008214612e78578080612e6190615246565b915050600a82612e71919061509f565b9150612e4e565b60008167ffffffffffffffff811115612eba577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612eec5781602001600182028036833780820191505090505b5090505b60008514612f9f57600182612f05919061512a565b9150600a85612f14919061528f565b6030612f209190615049565b60f81b818381518110612f5c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612f98919061509f565b9450612ef0565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61301f838361331b565b61302c6000848484613184565b61306b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161306290614b8f565b60405180910390fd5b505050565b61307b8383836134e9565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156130be576130b9816134ee565b6130fd565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146130fc576130fb8382613537565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156131405761313b816136a4565b61317f565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461317e5761317d82826137e7565b5b5b505050565b60006131a58473ffffffffffffffffffffffffffffffffffffffff16613866565b1561330e578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026131ce612831565b8786866040518563ffffffff1660e01b81526004016131f09493929190614a3d565b602060405180830381600087803b15801561320a57600080fd5b505af192505050801561323b57506040513d601f19601f820116820180604052508101906132389190613cb4565b60015b6132be573d806000811461326b576040519150601f19603f3d011682016040523d82523d6000602084013e613270565b606091505b506000815114156132b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132ad90614b8f565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613313565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561338b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161338290614d2f565b60405180910390fd5b613394816127c5565b156133d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133cb90614bcf565b60405180910390fd5b6133e060008383613070565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546134309190615049565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161354484611534565b61354e919061512a565b9050600060076000848152602001908152602001600020549050818114613633576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506136b8919061512a565b905060006009600084815260200190815260200160002054905060006008838154811061370e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110613756577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806137cb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006137f283611534565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b82805461388590615214565b90600052602060002090601f0160209004810192826138a757600085556138ee565b82601f106138c057805160ff19168380011785556138ee565b828001600101855582156138ee579182015b828111156138ed5782518255916020019190600101906138d2565b5b5090506138fb91906138ff565b5090565b5b80821115613918576000816000905550600101613900565b5090565b600061392f61392a84614f9b565b614f6a565b90508281526020810184848401111561394757600080fd5b6139528482856151d2565b509392505050565b600061396d61396884614fcb565b614f6a565b90508281526020810184848401111561398557600080fd5b6139908482856151d2565b509392505050565b6000813590506139a78161538d565b92915050565b60008083601f8401126139bf57600080fd5b8235905067ffffffffffffffff8111156139d857600080fd5b6020830191508360208202830111156139f057600080fd5b9250929050565b600081359050613a06816153a4565b92915050565b600081359050613a1b816153bb565b92915050565b600081519050613a30816153bb565b92915050565b600082601f830112613a4757600080fd5b8135613a5784826020860161391c565b91505092915050565b600082601f830112613a7157600080fd5b8135613a8184826020860161395a565b91505092915050565b600081359050613a99816153d2565b92915050565b600060208284031215613ab157600080fd5b6000613abf84828501613998565b91505092915050565b60008060408385031215613adb57600080fd5b6000613ae985828601613998565b9250506020613afa85828601613998565b9150509250929050565b600080600060608486031215613b1957600080fd5b6000613b2786828701613998565b9350506020613b3886828701613998565b9250506040613b4986828701613a8a565b9150509250925092565b60008060008060808587031215613b6957600080fd5b6000613b7787828801613998565b9450506020613b8887828801613998565b9350506040613b9987828801613a8a565b925050606085013567ffffffffffffffff811115613bb657600080fd5b613bc287828801613a36565b91505092959194509250565b60008060408385031215613be157600080fd5b6000613bef85828601613998565b9250506020613c00858286016139f7565b9150509250929050565b60008060408385031215613c1d57600080fd5b6000613c2b85828601613998565b9250506020613c3c85828601613a8a565b9150509250929050565b60008060208385031215613c5957600080fd5b600083013567ffffffffffffffff811115613c7357600080fd5b613c7f858286016139ad565b92509250509250929050565b600060208284031215613c9d57600080fd5b6000613cab84828501613a0c565b91505092915050565b600060208284031215613cc657600080fd5b6000613cd484828501613a21565b91505092915050565b600060208284031215613cef57600080fd5b600082013567ffffffffffffffff811115613d0957600080fd5b613d1584828501613a60565b91505092915050565b600060208284031215613d3057600080fd5b6000613d3e84828501613a8a565b91505092915050565b613d508161515e565b82525050565b613d5f81615170565b82525050565b6000613d7082614ffb565b613d7a8185615011565b9350613d8a8185602086016151e1565b613d938161537c565b840191505092915050565b6000613da982615006565b613db3818561502d565b9350613dc38185602086016151e1565b613dcc8161537c565b840191505092915050565b6000613de282615006565b613dec818561503e565b9350613dfc8185602086016151e1565b80840191505092915050565b6000613e1560178361502d565b91507f50726573616c6520686173206e6f7420737461727465640000000000000000006000830152602082019050919050565b6000613e55602f8361502d565b91507f43616e6e6f742070757263686173652074686973206d616e7920746f6b656e7360008301527f20647572696e672070726573616c6500000000000000000000000000000000006020830152604082019050919050565b6000613ebb601b8361502d565b91507f4d757374206d696e74206174206c65617374206f6e65206974656d00000000006000830152602082019050919050565b6000613efb60138361502d565b91507f4e6f7468696e6720746f207769746864726177000000000000000000000000006000830152602082019050919050565b6000613f3b602b8361502d565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b6000613fa160328361502d565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b600061400760268361502d565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061406d601c8361502d565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b60006140ad601b8361502d565b91507f5075626c69632073616c6520686173206e6f74207374617274656400000000006000830152602082019050919050565b60006140ed60248361502d565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061415360198361502d565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b600061419360248361502d565b91507f596f7520617265206e6f7420656c696769626c6520666f72207468652070726560008301527f73616c65000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006141f9602c8361502d565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061425f60388361502d565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b60006142c5602a8361502d565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b600061432b60298361502d565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614391601f8361502d565b91507f4d696e74696e6720776f756c6420657863656564206d617820737570706c79006000830152602082019050919050565b60006143d160318361502d565b91507f43616e6e6f742070757263686173652074686973206d616e7920746f6b656e7360008301527f20696e2061207472616e73616374696f6e0000000000000000000000000000006020830152604082019050919050565b600061443760208361502d565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b600061447760178361502d565b91507f45544820616d6f756e7420697320696e636f72726563740000000000000000006000830152602082019050919050565b60006144b7602c8361502d565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061451d60208361502d565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b600061455d60298361502d565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006145c3602f8361502d565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b600061462960198361502d565b91507f4661696c656420746f20776964746864726177204574686572000000000000006000830152602082019050919050565b600061466960288361502d565b91507f50757263686173652065786365656473206d617820616c6c6f7765642070657260008301527f20616464726573730000000000000000000000000000000000000000000000006020830152604082019050919050565b60006146cf60218361502d565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061473560208361502d565b91507f596f75206d757374206d696e74206174206c65617374206f6e65206974656d2e6000830152602082019050919050565b6000614775600083615022565b9150600082019050919050565b600061478f60178361502d565b91507f43616e6e6f7420616464206e756c6c20616464726573730000000000000000006000830152602082019050919050565b60006147cf60318361502d565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b600061483560278361502d565b91507f4d696e74696e6720776f756c6420657863656564206d6178207265736572766560008301527f64206974656d73000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061489b602c8361502d565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6000614901601c8361502d565b91507f50757263686173652065786365656473206d617820616c6c6f776564000000006000830152602082019050919050565b600061494160278361502d565b91507f416c7265616479206861766520636c61696d656420616c6c207265736572766560008301527f64206974656d73000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006149a7601b8361502d565b91507f416c6c20746f6b656e732068617665206265656e206d696e74656400000000006000830152602082019050919050565b6149e3816151c8565b82525050565b60006149f58285613dd7565b9150614a018284613dd7565b91508190509392505050565b6000614a1882614768565b9150819050919050565b6000602082019050614a376000830184613d47565b92915050565b6000608082019050614a526000830187613d47565b614a5f6020830186613d47565b614a6c60408301856149da565b8181036060830152614a7e8184613d65565b905095945050505050565b6000604082019050614a9e6000830185613d47565b614aab60208301846149da565b9392505050565b6000602082019050614ac76000830184613d56565b92915050565b60006020820190508181036000830152614ae78184613d9e565b905092915050565b60006020820190508181036000830152614b0881613e08565b9050919050565b60006020820190508181036000830152614b2881613e48565b9050919050565b60006020820190508181036000830152614b4881613eae565b9050919050565b60006020820190508181036000830152614b6881613eee565b9050919050565b60006020820190508181036000830152614b8881613f2e565b9050919050565b60006020820190508181036000830152614ba881613f94565b9050919050565b60006020820190508181036000830152614bc881613ffa565b9050919050565b60006020820190508181036000830152614be881614060565b9050919050565b60006020820190508181036000830152614c08816140a0565b9050919050565b60006020820190508181036000830152614c28816140e0565b9050919050565b60006020820190508181036000830152614c4881614146565b9050919050565b60006020820190508181036000830152614c6881614186565b9050919050565b60006020820190508181036000830152614c88816141ec565b9050919050565b60006020820190508181036000830152614ca881614252565b9050919050565b60006020820190508181036000830152614cc8816142b8565b9050919050565b60006020820190508181036000830152614ce88161431e565b9050919050565b60006020820190508181036000830152614d0881614384565b9050919050565b60006020820190508181036000830152614d28816143c4565b9050919050565b60006020820190508181036000830152614d488161442a565b9050919050565b60006020820190508181036000830152614d688161446a565b9050919050565b60006020820190508181036000830152614d88816144aa565b9050919050565b60006020820190508181036000830152614da881614510565b9050919050565b60006020820190508181036000830152614dc881614550565b9050919050565b60006020820190508181036000830152614de8816145b6565b9050919050565b60006020820190508181036000830152614e088161461c565b9050919050565b60006020820190508181036000830152614e288161465c565b9050919050565b60006020820190508181036000830152614e48816146c2565b9050919050565b60006020820190508181036000830152614e6881614728565b9050919050565b60006020820190508181036000830152614e8881614782565b9050919050565b60006020820190508181036000830152614ea8816147c2565b9050919050565b60006020820190508181036000830152614ec881614828565b9050919050565b60006020820190508181036000830152614ee88161488e565b9050919050565b60006020820190508181036000830152614f08816148f4565b9050919050565b60006020820190508181036000830152614f2881614934565b9050919050565b60006020820190508181036000830152614f488161499a565b9050919050565b6000602082019050614f6460008301846149da565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614f9157614f9061534d565b5b8060405250919050565b600067ffffffffffffffff821115614fb657614fb561534d565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614fe657614fe561534d565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000615054826151c8565b915061505f836151c8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115615094576150936152c0565b5b828201905092915050565b60006150aa826151c8565b91506150b5836151c8565b9250826150c5576150c46152ef565b5b828204905092915050565b60006150db826151c8565b91506150e6836151c8565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561511f5761511e6152c0565b5b828202905092915050565b6000615135826151c8565b9150615140836151c8565b925082821015615153576151526152c0565b5b828203905092915050565b6000615169826151a8565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156151ff5780820151818401526020810190506151e4565b8381111561520e576000848401525b50505050565b6000600282049050600182168061522c57607f821691505b602082108114156152405761523f61531e565b5b50919050565b6000615251826151c8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615284576152836152c0565b5b600182019050919050565b600061529a826151c8565b91506152a5836151c8565b9250826152b5576152b46152ef565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b6153968161515e565b81146153a157600080fd5b50565b6153ad81615170565b81146153b857600080fd5b50565b6153c48161517c565b81146153cf57600080fd5b50565b6153db816151c8565b81146153e657600080fd5b5056fea2646970667358221220c75427b2b26459ff877ac6996014b47cd0fcaba309cfbb989a39a352076407fa64736f6c63430008000033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002668747470733a2f2f64336578786578717067376c666a2e636c6f756466726f6e742e6e65742f0000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : baseURI (string): https://d3exxexqpg7lfj.cloudfront.net/
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000026
Arg [2] : 68747470733a2f2f64336578786578717067376c666a2e636c6f756466726f6e
Arg [3] : 742e6e65742f0000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
43451:5334:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37303:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44000:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20917:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22476:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21999:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43651:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43751:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37943:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45586:123;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45717:186;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44446:763;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23366:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43855:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37611:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48090:111;;;;;;;;;;;;;:::i;:::-;;43802:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48478:304;;;;;;;;;;;;;:::i;:::-;;23776:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38133:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43699:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48330:140;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43894:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20611:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20341:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34982:94;;;;;;;;;;;;;:::i;:::-;;43603:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34331:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21086:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46979:993;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22769:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43964:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45217:361;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43551:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24032:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21261:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43929:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23135:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47980:102;;;;;;;;;;;;;:::i;:::-;;35231:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45911:1060;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37303:224;37405:4;37444:35;37429:50;;;:11;:50;;;;:90;;;;37483:36;37507:11;37483:23;:36::i;:::-;37429:90;37422:97;;37303:224;;;:::o;44000:26::-;;;;;;;;;;;;;:::o;20917:100::-;20971:13;21004:5;20997:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20917:100;:::o;22476:221::-;22552:7;22580:16;22588:7;22580;:16::i;:::-;22572:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22665:15;:24;22681:7;22665:24;;;;;;;;;;;;;;;;;;;;;22658:31;;22476:221;;;:::o;21999:411::-;22080:13;22096:23;22111:7;22096:14;:23::i;:::-;22080:39;;22144:5;22138:11;;:2;:11;;;;22130:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;22238:5;22222:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;22247:37;22264:5;22271:12;:10;:12::i;:::-;22247:16;:37::i;:::-;22222:62;22200:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;22381:21;22390:2;22394:7;22381:8;:21::i;:::-;21999:411;;;:::o;43651:41::-;43690:2;43651:41;:::o;43751:44::-;43793:2;43751:44;:::o;37943:113::-;38004:7;38031:10;:17;;;;38024:24;;37943:113;:::o;45586:123::-;45655:4;45679:16;:22;45696:4;45679:22;;;;;;;;;;;;;;;;;;;;;;;;;45672:29;;45586:123;;;:::o;45717:186::-;45780:7;45825:1;45808:19;;:5;:19;;;;45800:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;45875:13;:20;45889:5;45875:20;;;;;;;;;;;;;;;;45868:27;;45717:186;;;:::o;44446:763::-;34562:12;:10;:12::i;:::-;34551:23;;:7;:5;:7::i;:::-;:23;;;34543:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43843:3:::1;44542:15;;:33;;44534:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;43843:3;44656:6;44638:15;;:24;;;;:::i;:::-;:42;;44630:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;44764:1;44743:23;;:9;:23;;;;44735:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;43591:5;44813:13;:11;:13::i;:::-;:29;44805:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;43591:5;44909:6;44893:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:39;;44885:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;44981:20;45018:1;45004:11;;:15;;;;:::i;:::-;44981:38;;45037:9;45032:102;45056:6;45052:1;:10;45032:102;;;45084:38;45094:9;45120:1;45105:12;:16;;;;:::i;:::-;45084:9;:38::i;:::-;45064:3;;;;;:::i;:::-;;;;45032:102;;;;45159:6;45144:11;;:21;;;;;;;:::i;:::-;;;;;;;;45195:6;45176:15;;:25;;;;;;;:::i;:::-;;;;;;;;34622:1;44446:763:::0;;:::o;23366:339::-;23561:41;23580:12;:10;:12::i;:::-;23594:7;23561:18;:41::i;:::-;23553:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;23669:28;23679:4;23685:2;23689:7;23669:9;:28::i;:::-;23366:339;;;:::o;43855:30::-;;;;:::o;37611:256::-;37708:7;37744:23;37761:5;37744:16;:23::i;:::-;37736:5;:31;37728:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;37833:12;:19;37846:5;37833:19;;;;;;;;;;;;;;;:26;37853:5;37833:26;;;;;;;;;;;;37826:33;;37611:256;;;;:::o;48090:111::-;34562:12;:10;:12::i;:::-;34551:23;;:7;:5;:7::i;:::-;:23;;;34543:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48176:17:::1;;;;;;;;;;;48175:18;48155:17;;:38;;;;;;;;;;;;;;;;;;48090:111::o:0;43802:44::-;43843:3;43802:44;:::o;48478:304::-;34562:12;:10;:12::i;:::-;34551:23;;:7;:5;:7::i;:::-;:23;;;34543:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48526:15:::1;48544:21;48526:39;;48594:1;48584:7;:11;48576:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;48631:12;48649:42;:47;;48705:7;48649:69;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48630:88;;;48737:7;48729:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;34622:1;;48478:304::o:0;23776:185::-;23914:39;23931:4;23937:2;23941:7;23914:39;;;;;;;;;;;;:16;:39::i;:::-;23776:185;;;:::o;38133:233::-;38208:7;38244:30;:28;:30::i;:::-;38236:5;:38;38228:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;38341:10;38352:5;38341:17;;;;;;;;;;;;;;;;;;;;;;;;38334:24;;38133:233;;;:::o;43699:45::-;43742:2;43699:45;:::o;48330:140::-;34562:12;:10;:12::i;:::-;34551:23;;:7;:5;:7::i;:::-;:23;;;34543:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48416:7:::1;48401:12;:22;;;;;;;;;;;;:::i;:::-;;48439:23;48454:7;48439:23;;;;;;:::i;:::-;;;;;;;;48330:140:::0;:::o;43894:26::-;;;;:::o;20611:239::-;20683:7;20703:13;20719:7;:16;20727:7;20719:16;;;;;;;;;;;;;;;;;;;;;20703:32;;20771:1;20754:19;;:5;:19;;;;20746:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;20837:5;20830:12;;;20611:239;;;:::o;20341:208::-;20413:7;20458:1;20441:19;;:5;:19;;;;20433:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;20525:9;:16;20535:5;20525:16;;;;;;;;;;;;;;;;20518:23;;20341:208;;;:::o;34982:94::-;34562:12;:10;:12::i;:::-;34551:23;;:7;:5;:7::i;:::-;:23;;;34543:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35047:21:::1;35065:1;35047:9;:21::i;:::-;34982:94::o:0;43603:41::-;43635:9;43603:41;:::o;34331:87::-;34377:7;34404:6;;;;;;;;;;;34397:13;;34331:87;:::o;21086:104::-;21142:13;21175:7;21168:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21086:104;:::o;46979:993::-;47052:17;;;;;;;;;;;47044:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;43793:2;47120:13;:11;:13::i;:::-;:31;47112:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;43690:2;47202:13;:29;;47194:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;43793:2;47320:13;47304;:11;:13::i;:::-;:29;;;;:::i;:::-;:48;;47296:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;43793:2;47435:13;47407;:25;47421:10;47407:25;;;;;;;;;;;;;;;;:41;;;;:::i;:::-;:60;;47399:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;47547:1;47531:13;:17;47523:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;47629:9;47612:13;43635:9;47604:21;;;;:::i;:::-;:34;47596:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;47684:9;47679:227;47703:13;47699:1;:17;47679:227;;;47738:15;47770:1;47756:11;;:15;;;;:::i;:::-;47738:33;;47803:1;47788:11;;:16;;;;;;;:::i;:::-;;;;;;;;47848:1;47819:13;:25;47833:10;47819:25;;;;;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;47864;47874:10;47886:7;47864:9;:30::i;:::-;47679:227;47718:3;;;;;:::i;:::-;;;;47679:227;;;;47923:41;47938:10;47950:13;47923:41;;;;;;;:::i;:::-;;;;;;;;46979:993;:::o;22769:295::-;22884:12;:10;:12::i;:::-;22872:24;;:8;:24;;;;22864:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;22984:8;22939:18;:32;22958:12;:10;:12::i;:::-;22939:32;;;;;;;;;;;;;;;:42;22972:8;22939:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;23037:8;23008:48;;23023:12;:10;:12::i;:::-;23008:48;;;23047:8;23008:48;;;;;;:::i;:::-;;;;;;;;22769:295;;:::o;43964:29::-;;;;;;;;;;;;;:::o;45217:361::-;34562:12;:10;:12::i;:::-;34551:23;;:7;:5;:7::i;:::-;:23;;;34543:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45304:9:::1;45299:272;45323:9;;:16;;45319:1;:20;45299:272;;;45393:1;45369:26;;:9;;45379:1;45369:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:26;;;;45361:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;45473:4;45440:16;:30;45457:9;;45467:1;45457:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45440:30;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;45524:1;45494:13;:27;45508:9;;45518:1;45508:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45494:27;;;;;;;;;;;;;;;;:31;:65;;45558:1;45494:65;;;45528:13;:27;45542:9;;45552:1;45542:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45528:27;;;;;;;;;;;;;;;;45494:65;;45341:3;;;;;:::i;:::-;;;;45299:272;;;;45217:361:::0;;:::o;43551:45::-;43591:5;43551:45;:::o;24032:328::-;24207:41;24226:12;:10;:12::i;:::-;24240:7;24207:18;:41::i;:::-;24199:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24313:39;24327:4;24333:2;24337:7;24346:5;24313:13;:39::i;:::-;24032:328;;;;:::o;21261:334::-;21334:13;21368:16;21376:7;21368;:16::i;:::-;21360:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;21449:21;21473:10;:8;:10::i;:::-;21449:34;;21525:1;21507:7;21501:21;:25;:86;;;;;;;;;;;;;;;;;21553:7;21562:18;:7;:16;:18::i;:::-;21536:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;21501:86;21494:93;;;21261:334;;;:::o;43929:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;23135:164::-;23232:4;23256:18;:25;23275:5;23256:25;;;;;;;;;;;;;;;:35;23282:8;23256:35;;;;;;;;;;;;;;;;;;;;;;;;;23249:42;;23135:164;;;;:::o;47980:102::-;34562:12;:10;:12::i;:::-;34551:23;;:7;:5;:7::i;:::-;:23;;;34543:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48060:14:::1;;;;;;;;;;;48059:15;48042:14;;:32;;;;;;;;;;;;;;;;;;47980:102::o:0;35231:192::-;34562:12;:10;:12::i;:::-;34551:23;;:7;:5;:7::i;:::-;:23;;;34543:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35340:1:::1;35320:22;;:8;:22;;;;35312:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;35396:19;35406:8;35396:9;:19::i;:::-;35231:192:::0;:::o;45911:1060::-;45991:14;;;;;;;;;;;45983:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;46052:16;:28;46069:10;46052:28;;;;;;;;;;;;;;;;;;;;;;;;;46044:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;43591:5;46140:13;:11;:13::i;:::-;:29;46132:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;43742:2;46220:13;:33;;46212:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;43591:5;46340:13;46324;:11;:13::i;:::-;:29;;;;:::i;:::-;:46;;46316:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;43742:2;46453:13;46425;:25;46439:10;46425:25;;;;;;;;;;;;;;;;:41;;;;:::i;:::-;:61;;46417:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;46554:1;46538:13;:17;46530:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;46631:9;46614:13;43635:9;46606:21;;;;:::i;:::-;:34;46598:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;46686:9;46681:227;46705:13;46701:1;:17;46681:227;;;46740:15;46772:1;46758:11;;:15;;;;:::i;:::-;46740:33;;46805:1;46790:11;;:16;;;;;;;:::i;:::-;;;;;;;;46850:1;46821:13;:25;46835:10;46821:25;;;;;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;46866;46876:10;46888:7;46866:9;:30::i;:::-;46681:227;46720:3;;;;;:::i;:::-;;;;46681:227;;;;46925:38;46937:10;46949:13;46925:38;;;;;;;:::i;:::-;;;;;;;;45911:1060;:::o;19972:305::-;20074:4;20126:25;20111:40;;;:11;:40;;;;:105;;;;20183:33;20168:48;;;:11;:48;;;;20111:105;:158;;;;20233:36;20257:11;20233:23;:36::i;:::-;20111:158;20091:178;;19972:305;;;:::o;25870:127::-;25935:4;25987:1;25959:30;;:7;:16;25967:7;25959:16;;;;;;;;;;;;;;;;;;;;;:30;;;;25952:37;;25870:127;;;:::o;15668:98::-;15721:7;15748:10;15741:17;;15668:98;:::o;29852:174::-;29954:2;29927:15;:24;29943:7;29927:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30010:7;30006:2;29972:46;;29981:23;29996:7;29981:14;:23::i;:::-;29972:46;;;;;;;;;;;;29852:174;;:::o;26854:110::-;26930:26;26940:2;26944:7;26930:26;;;;;;;;;;;;:9;:26::i;:::-;26854:110;;:::o;26164:348::-;26257:4;26282:16;26290:7;26282;:16::i;:::-;26274:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26358:13;26374:23;26389:7;26374:14;:23::i;:::-;26358:39;;26427:5;26416:16;;:7;:16;;;:51;;;;26460:7;26436:31;;:20;26448:7;26436:11;:20::i;:::-;:31;;;26416:51;:87;;;;26471:32;26488:5;26495:7;26471:16;:32::i;:::-;26416:87;26408:96;;;26164:348;;;;:::o;29156:578::-;29315:4;29288:31;;:23;29303:7;29288:14;:23::i;:::-;:31;;;29280:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;29398:1;29384:16;;:2;:16;;;;29376:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;29454:39;29475:4;29481:2;29485:7;29454:20;:39::i;:::-;29558:29;29575:1;29579:7;29558:8;:29::i;:::-;29619:1;29600:9;:15;29610:4;29600:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;29648:1;29631:9;:13;29641:2;29631:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29679:2;29660:7;:16;29668:7;29660:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29718:7;29714:2;29699:27;;29708:4;29699:27;;;;;;;;;;;;29156:578;;;:::o;35431:173::-;35487:16;35506:6;;;;;;;;;;;35487:25;;35532:8;35523:6;;:17;;;;;;;;;;;;;;;;;;35587:8;35556:40;;35577:8;35556:40;;;;;;;;;;;;35431:173;;:::o;25242:315::-;25399:28;25409:4;25415:2;25419:7;25399:9;:28::i;:::-;25446:48;25469:4;25475:2;25479:7;25488:5;25446:22;:48::i;:::-;25438:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;25242:315;;;;:::o;48209:113::-;48269:13;48302:12;48295:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48209:113;:::o;16110:723::-;16166:13;16396:1;16387:5;:10;16383:53;;;16414:10;;;;;;;;;;;;;;;;;;;;;16383:53;16446:12;16461:5;16446:20;;16477:14;16502:78;16517:1;16509:4;:9;16502:78;;16535:8;;;;;:::i;:::-;;;;16566:2;16558:10;;;;;:::i;:::-;;;16502:78;;;16590:19;16622:6;16612:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16590:39;;16640:154;16656:1;16647:5;:10;16640:154;;16684:1;16674:11;;;;;:::i;:::-;;;16751:2;16743:5;:10;;;;:::i;:::-;16730:2;:24;;;;:::i;:::-;16717:39;;16700:6;16707;16700:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;16780:2;16771:11;;;;;:::i;:::-;;;16640:154;;;16818:6;16804:21;;;;;16110:723;;;;:::o;18571:157::-;18656:4;18695:25;18680:40;;;:11;:40;;;;18673:47;;18571:157;;;:::o;27191:321::-;27321:18;27327:2;27331:7;27321:5;:18::i;:::-;27372:54;27403:1;27407:2;27411:7;27420:5;27372:22;:54::i;:::-;27350:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;27191:321;;;:::o;38979:589::-;39123:45;39150:4;39156:2;39160:7;39123:26;:45::i;:::-;39201:1;39185:18;;:4;:18;;;39181:187;;;39220:40;39252:7;39220:31;:40::i;:::-;39181:187;;;39290:2;39282:10;;:4;:10;;;39278:90;;39309:47;39342:4;39348:7;39309:32;:47::i;:::-;39278:90;39181:187;39396:1;39382:16;;:2;:16;;;39378:183;;;39415:45;39452:7;39415:36;:45::i;:::-;39378:183;;;39488:4;39482:10;;:2;:10;;;39478:83;;39509:40;39537:2;39541:7;39509:27;:40::i;:::-;39478:83;39378:183;38979:589;;;:::o;30591:799::-;30746:4;30767:15;:2;:13;;;:15::i;:::-;30763:620;;;30819:2;30803:36;;;30840:12;:10;:12::i;:::-;30854:4;30860:7;30869:5;30803:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;30799:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31062:1;31045:6;:13;:18;31041:272;;;31088:60;;;;;;;;;;:::i;:::-;;;;;;;;31041:272;31263:6;31257:13;31248:6;31244:2;31240:15;31233:38;30799:529;30936:41;;;30926:51;;;:6;:51;;;;30919:58;;;;;30763:620;31367:4;31360:11;;30591:799;;;;;;;:::o;27848:382::-;27942:1;27928:16;;:2;:16;;;;27920:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;28001:16;28009:7;28001;:16::i;:::-;28000:17;27992:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28063:45;28092:1;28096:2;28100:7;28063:20;:45::i;:::-;28138:1;28121:9;:13;28131:2;28121:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;28169:2;28150:7;:16;28158:7;28150:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;28214:7;28210:2;28189:33;;28206:1;28189:33;;;;;;;;;;;;27848:382;;:::o;31962:126::-;;;;:::o;40291:164::-;40395:10;:17;;;;40368:15;:24;40384:7;40368:24;;;;;;;;;;;:44;;;;40423:10;40439:7;40423:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40291:164;:::o;41082:988::-;41348:22;41398:1;41373:22;41390:4;41373:16;:22::i;:::-;:26;;;;:::i;:::-;41348:51;;41410:18;41431:17;:26;41449:7;41431:26;;;;;;;;;;;;41410:47;;41578:14;41564:10;:28;41560:328;;41609:19;41631:12;:18;41644:4;41631:18;;;;;;;;;;;;;;;:34;41650:14;41631:34;;;;;;;;;;;;41609:56;;41715:11;41682:12;:18;41695:4;41682:18;;;;;;;;;;;;;;;:30;41701:10;41682:30;;;;;;;;;;;:44;;;;41832:10;41799:17;:30;41817:11;41799:30;;;;;;;;;;;:43;;;;41560:328;;41984:17;:26;42002:7;41984:26;;;;;;;;;;;41977:33;;;42028:12;:18;42041:4;42028:18;;;;;;;;;;;;;;;:34;42047:14;42028:34;;;;;;;;;;;42021:41;;;41082:988;;;;:::o;42365:1079::-;42618:22;42663:1;42643:10;:17;;;;:21;;;;:::i;:::-;42618:46;;42675:18;42696:15;:24;42712:7;42696:24;;;;;;;;;;;;42675:45;;43047:19;43069:10;43080:14;43069:26;;;;;;;;;;;;;;;;;;;;;;;;43047:48;;43133:11;43108:10;43119;43108:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;43244:10;43213:15;:28;43229:11;43213:28;;;;;;;;;;;:41;;;;43385:15;:24;43401:7;43385:24;;;;;;;;;;;43378:31;;;43420:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42365:1079;;;;:::o;39869:221::-;39954:14;39971:20;39988:2;39971:16;:20::i;:::-;39954:37;;40029:7;40002:12;:16;40015:2;40002:16;;;;;;;;;;;;;;;:24;40019:6;40002:24;;;;;;;;;;;:34;;;;40076:6;40047:17;:26;40065:7;40047:26;;;;;;;;;;;:35;;;;39869:221;;;:::o;7768:387::-;7828:4;8036:12;8103:7;8091:20;8083:28;;8146:1;8139:4;:8;8132:15;;;7768:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:342:1:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:344::-;;458:65;473:49;515:6;473:49;:::i;:::-;458:65;:::i;:::-;449:74;;546:6;539:5;532:21;584:4;577:5;573:16;622:3;613:6;608:3;604:16;601:25;598:2;;;639:1;636;629:12;598:2;652:41;686:6;681:3;676;652:41;:::i;:::-;439:260;;;;;;:::o;705:139::-;;789:6;776:20;767:29;;805:33;832:5;805:33;:::i;:::-;757:87;;;;:::o;867:367::-;;;1000:3;993:4;985:6;981:17;977:27;967:2;;1018:1;1015;1008:12;967:2;1054:6;1041:20;1031:30;;1084:18;1076:6;1073:30;1070:2;;;1116:1;1113;1106:12;1070:2;1153:4;1145:6;1141:17;1129:29;;1207:3;1199:4;1191:6;1187:17;1177:8;1173:32;1170:41;1167:2;;;1224:1;1221;1214:12;1167:2;957:277;;;;;:::o;1240:133::-;;1321:6;1308:20;1299:29;;1337:30;1361:5;1337:30;:::i;:::-;1289:84;;;;:::o;1379:137::-;;1462:6;1449:20;1440:29;;1478:32;1504:5;1478:32;:::i;:::-;1430:86;;;;:::o;1522:141::-;;1609:6;1603:13;1594:22;;1625:32;1651:5;1625:32;:::i;:::-;1584:79;;;;:::o;1682:271::-;;1786:3;1779:4;1771:6;1767:17;1763:27;1753:2;;1804:1;1801;1794:12;1753:2;1844:6;1831:20;1869:78;1943:3;1935:6;1928:4;1920:6;1916:17;1869:78;:::i;:::-;1860:87;;1743:210;;;;;:::o;1973:273::-;;2078:3;2071:4;2063:6;2059:17;2055:27;2045:2;;2096:1;2093;2086:12;2045:2;2136:6;2123:20;2161:79;2236:3;2228:6;2221:4;2213:6;2209:17;2161:79;:::i;:::-;2152:88;;2035:211;;;;;:::o;2252:139::-;;2336:6;2323:20;2314:29;;2352:33;2379:5;2352:33;:::i;:::-;2304:87;;;;:::o;2397:262::-;;2505:2;2493:9;2484:7;2480:23;2476:32;2473:2;;;2521:1;2518;2511:12;2473:2;2564:1;2589:53;2634:7;2625:6;2614:9;2610:22;2589:53;:::i;:::-;2579:63;;2535:117;2463:196;;;;:::o;2665:407::-;;;2790:2;2778:9;2769:7;2765:23;2761:32;2758:2;;;2806:1;2803;2796:12;2758:2;2849:1;2874:53;2919:7;2910:6;2899:9;2895:22;2874:53;:::i;:::-;2864:63;;2820:117;2976:2;3002:53;3047:7;3038:6;3027:9;3023:22;3002:53;:::i;:::-;2992:63;;2947:118;2748:324;;;;;:::o;3078:552::-;;;;3220:2;3208:9;3199:7;3195:23;3191:32;3188:2;;;3236:1;3233;3226:12;3188:2;3279:1;3304:53;3349:7;3340:6;3329:9;3325:22;3304:53;:::i;:::-;3294:63;;3250:117;3406:2;3432:53;3477:7;3468:6;3457:9;3453:22;3432:53;:::i;:::-;3422:63;;3377:118;3534:2;3560:53;3605:7;3596:6;3585:9;3581:22;3560:53;:::i;:::-;3550:63;;3505:118;3178:452;;;;;:::o;3636:809::-;;;;;3804:3;3792:9;3783:7;3779:23;3775:33;3772:2;;;3821:1;3818;3811:12;3772:2;3864:1;3889:53;3934:7;3925:6;3914:9;3910:22;3889:53;:::i;:::-;3879:63;;3835:117;3991:2;4017:53;4062:7;4053:6;4042:9;4038:22;4017:53;:::i;:::-;4007:63;;3962:118;4119:2;4145:53;4190:7;4181:6;4170:9;4166:22;4145:53;:::i;:::-;4135:63;;4090:118;4275:2;4264:9;4260:18;4247:32;4306:18;4298:6;4295:30;4292:2;;;4338:1;4335;4328:12;4292:2;4366:62;4420:7;4411:6;4400:9;4396:22;4366:62;:::i;:::-;4356:72;;4218:220;3762:683;;;;;;;:::o;4451:401::-;;;4573:2;4561:9;4552:7;4548:23;4544:32;4541:2;;;4589:1;4586;4579:12;4541:2;4632:1;4657:53;4702:7;4693:6;4682:9;4678:22;4657:53;:::i;:::-;4647:63;;4603:117;4759:2;4785:50;4827:7;4818:6;4807:9;4803:22;4785:50;:::i;:::-;4775:60;;4730:115;4531:321;;;;;:::o;4858:407::-;;;4983:2;4971:9;4962:7;4958:23;4954:32;4951:2;;;4999:1;4996;4989:12;4951:2;5042:1;5067:53;5112:7;5103:6;5092:9;5088:22;5067:53;:::i;:::-;5057:63;;5013:117;5169:2;5195:53;5240:7;5231:6;5220:9;5216:22;5195:53;:::i;:::-;5185:63;;5140:118;4941:324;;;;;:::o;5271:425::-;;;5414:2;5402:9;5393:7;5389:23;5385:32;5382:2;;;5430:1;5427;5420:12;5382:2;5501:1;5490:9;5486:17;5473:31;5531:18;5523:6;5520:30;5517:2;;;5563:1;5560;5553:12;5517:2;5599:80;5671:7;5662:6;5651:9;5647:22;5599:80;:::i;:::-;5581:98;;;;5444:245;5372:324;;;;;:::o;5702:260::-;;5809:2;5797:9;5788:7;5784:23;5780:32;5777:2;;;5825:1;5822;5815:12;5777:2;5868:1;5893:52;5937:7;5928:6;5917:9;5913:22;5893:52;:::i;:::-;5883:62;;5839:116;5767:195;;;;:::o;5968:282::-;;6086:2;6074:9;6065:7;6061:23;6057:32;6054:2;;;6102:1;6099;6092:12;6054:2;6145:1;6170:63;6225:7;6216:6;6205:9;6201:22;6170:63;:::i;:::-;6160:73;;6116:127;6044:206;;;;:::o;6256:375::-;;6374:2;6362:9;6353:7;6349:23;6345:32;6342:2;;;6390:1;6387;6380:12;6342:2;6461:1;6450:9;6446:17;6433:31;6491:18;6483:6;6480:30;6477:2;;;6523:1;6520;6513:12;6477:2;6551:63;6606:7;6597:6;6586:9;6582:22;6551:63;:::i;:::-;6541:73;;6404:220;6332:299;;;;:::o;6637:262::-;;6745:2;6733:9;6724:7;6720:23;6716:32;6713:2;;;6761:1;6758;6751:12;6713:2;6804:1;6829:53;6874:7;6865:6;6854:9;6850:22;6829:53;:::i;:::-;6819:63;;6775:117;6703:196;;;;:::o;6905:118::-;6992:24;7010:5;6992:24;:::i;:::-;6987:3;6980:37;6970:53;;:::o;7029:109::-;7110:21;7125:5;7110:21;:::i;:::-;7105:3;7098:34;7088:50;;:::o;7144:360::-;;7258:38;7290:5;7258:38;:::i;:::-;7312:70;7375:6;7370:3;7312:70;:::i;:::-;7305:77;;7391:52;7436:6;7431:3;7424:4;7417:5;7413:16;7391:52;:::i;:::-;7468:29;7490:6;7468:29;:::i;:::-;7463:3;7459:39;7452:46;;7234:270;;;;;:::o;7510:364::-;;7626:39;7659:5;7626:39;:::i;:::-;7681:71;7745:6;7740:3;7681:71;:::i;:::-;7674:78;;7761:52;7806:6;7801:3;7794:4;7787:5;7783:16;7761:52;:::i;:::-;7838:29;7860:6;7838:29;:::i;:::-;7833:3;7829:39;7822:46;;7602:272;;;;;:::o;7880:377::-;;8014:39;8047:5;8014:39;:::i;:::-;8069:89;8151:6;8146:3;8069:89;:::i;:::-;8062:96;;8167:52;8212:6;8207:3;8200:4;8193:5;8189:16;8167:52;:::i;:::-;8244:6;8239:3;8235:16;8228:23;;7990:267;;;;;:::o;8263:321::-;;8426:67;8490:2;8485:3;8426:67;:::i;:::-;8419:74;;8523:25;8519:1;8514:3;8510:11;8503:46;8575:2;8570:3;8566:12;8559:19;;8409:175;;;:::o;8590:379::-;;8753:67;8817:2;8812:3;8753:67;:::i;:::-;8746:74;;8850:34;8846:1;8841:3;8837:11;8830:55;8916:17;8911:2;8906:3;8902:12;8895:39;8960:2;8955:3;8951:12;8944:19;;8736:233;;;:::o;8975:325::-;;9138:67;9202:2;9197:3;9138:67;:::i;:::-;9131:74;;9235:29;9231:1;9226:3;9222:11;9215:50;9291:2;9286:3;9282:12;9275:19;;9121:179;;;:::o;9306:317::-;;9469:67;9533:2;9528:3;9469:67;:::i;:::-;9462:74;;9566:21;9562:1;9557:3;9553:11;9546:42;9614:2;9609:3;9605:12;9598:19;;9452:171;;;:::o;9629:375::-;;9792:67;9856:2;9851:3;9792:67;:::i;:::-;9785:74;;9889:34;9885:1;9880:3;9876:11;9869:55;9955:13;9950:2;9945:3;9941:12;9934:35;9995:2;9990:3;9986:12;9979:19;;9775:229;;;:::o;10010:382::-;;10173:67;10237:2;10232:3;10173:67;:::i;:::-;10166:74;;10270:34;10266:1;10261:3;10257:11;10250:55;10336:20;10331:2;10326:3;10322:12;10315:42;10383:2;10378:3;10374:12;10367:19;;10156:236;;;:::o;10398:370::-;;10561:67;10625:2;10620:3;10561:67;:::i;:::-;10554:74;;10658:34;10654:1;10649:3;10645:11;10638:55;10724:8;10719:2;10714:3;10710:12;10703:30;10759:2;10754:3;10750:12;10743:19;;10544:224;;;:::o;10774:326::-;;10937:67;11001:2;10996:3;10937:67;:::i;:::-;10930:74;;11034:30;11030:1;11025:3;11021:11;11014:51;11091:2;11086:3;11082:12;11075:19;;10920:180;;;:::o;11106:325::-;;11269:67;11333:2;11328:3;11269:67;:::i;:::-;11262:74;;11366:29;11362:1;11357:3;11353:11;11346:50;11422:2;11417:3;11413:12;11406:19;;11252:179;;;:::o;11437:368::-;;11600:67;11664:2;11659:3;11600:67;:::i;:::-;11593:74;;11697:34;11693:1;11688:3;11684:11;11677:55;11763:6;11758:2;11753:3;11749:12;11742:28;11796:2;11791:3;11787:12;11780:19;;11583:222;;;:::o;11811:323::-;;11974:67;12038:2;12033:3;11974:67;:::i;:::-;11967:74;;12071:27;12067:1;12062:3;12058:11;12051:48;12125:2;12120:3;12116:12;12109:19;;11957:177;;;:::o;12140:368::-;;12303:67;12367:2;12362:3;12303:67;:::i;:::-;12296:74;;12400:34;12396:1;12391:3;12387:11;12380:55;12466:6;12461:2;12456:3;12452:12;12445:28;12499:2;12494:3;12490:12;12483:19;;12286:222;;;:::o;12514:376::-;;12677:67;12741:2;12736:3;12677:67;:::i;:::-;12670:74;;12774:34;12770:1;12765:3;12761:11;12754:55;12840:14;12835:2;12830:3;12826:12;12819:36;12881:2;12876:3;12872:12;12865:19;;12660:230;;;:::o;12896:388::-;;13059:67;13123:2;13118:3;13059:67;:::i;:::-;13052:74;;13156:34;13152:1;13147:3;13143:11;13136:55;13222:26;13217:2;13212:3;13208:12;13201:48;13275:2;13270:3;13266:12;13259:19;;13042:242;;;:::o;13290:374::-;;13453:67;13517:2;13512:3;13453:67;:::i;:::-;13446:74;;13550:34;13546:1;13541:3;13537:11;13530:55;13616:12;13611:2;13606:3;13602:12;13595:34;13655:2;13650:3;13646:12;13639:19;;13436:228;;;:::o;13670:373::-;;13833:67;13897:2;13892:3;13833:67;:::i;:::-;13826:74;;13930:34;13926:1;13921:3;13917:11;13910:55;13996:11;13991:2;13986:3;13982:12;13975:33;14034:2;14029:3;14025:12;14018:19;;13816:227;;;:::o;14049:329::-;;14212:67;14276:2;14271:3;14212:67;:::i;:::-;14205:74;;14309:33;14305:1;14300:3;14296:11;14289:54;14369:2;14364:3;14360:12;14353:19;;14195:183;;;:::o;14384:381::-;;14547:67;14611:2;14606:3;14547:67;:::i;:::-;14540:74;;14644:34;14640:1;14635:3;14631:11;14624:55;14710:19;14705:2;14700:3;14696:12;14689:41;14756:2;14751:3;14747:12;14740:19;;14530:235;;;:::o;14771:330::-;;14934:67;14998:2;14993:3;14934:67;:::i;:::-;14927:74;;15031:34;15027:1;15022:3;15018:11;15011:55;15092:2;15087:3;15083:12;15076:19;;14917:184;;;:::o;15107:321::-;;15270:67;15334:2;15329:3;15270:67;:::i;:::-;15263:74;;15367:25;15363:1;15358:3;15354:11;15347:46;15419:2;15414:3;15410:12;15403:19;;15253:175;;;:::o;15434:376::-;;15597:67;15661:2;15656:3;15597:67;:::i;:::-;15590:74;;15694:34;15690:1;15685:3;15681:11;15674:55;15760:14;15755:2;15750:3;15746:12;15739:36;15801:2;15796:3;15792:12;15785:19;;15580:230;;;:::o;15816:330::-;;15979:67;16043:2;16038:3;15979:67;:::i;:::-;15972:74;;16076:34;16072:1;16067:3;16063:11;16056:55;16137:2;16132:3;16128:12;16121:19;;15962:184;;;:::o;16152:373::-;;16315:67;16379:2;16374:3;16315:67;:::i;:::-;16308:74;;16412:34;16408:1;16403:3;16399:11;16392:55;16478:11;16473:2;16468:3;16464:12;16457:33;16516:2;16511:3;16507:12;16500:19;;16298:227;;;:::o;16531:379::-;;16694:67;16758:2;16753:3;16694:67;:::i;:::-;16687:74;;16791:34;16787:1;16782:3;16778:11;16771:55;16857:17;16852:2;16847:3;16843:12;16836:39;16901:2;16896:3;16892:12;16885:19;;16677:233;;;:::o;16916:323::-;;17079:67;17143:2;17138:3;17079:67;:::i;:::-;17072:74;;17176:27;17172:1;17167:3;17163:11;17156:48;17230:2;17225:3;17221:12;17214:19;;17062:177;;;:::o;17245:372::-;;17408:67;17472:2;17467:3;17408:67;:::i;:::-;17401:74;;17505:34;17501:1;17496:3;17492:11;17485:55;17571:10;17566:2;17561:3;17557:12;17550:32;17608:2;17603:3;17599:12;17592:19;;17391:226;;;:::o;17623:365::-;;17786:67;17850:2;17845:3;17786:67;:::i;:::-;17779:74;;17883:34;17879:1;17874:3;17870:11;17863:55;17949:3;17944:2;17939:3;17935:12;17928:25;17979:2;17974:3;17970:12;17963:19;;17769:219;;;:::o;17994:330::-;;18157:67;18221:2;18216:3;18157:67;:::i;:::-;18150:74;;18254:34;18250:1;18245:3;18241:11;18234:55;18315:2;18310:3;18306:12;18299:19;;18140:184;;;:::o;18330:297::-;;18510:83;18591:1;18586:3;18510:83;:::i;:::-;18503:90;;18619:1;18614:3;18610:11;18603:18;;18493:134;;;:::o;18633:321::-;;18796:67;18860:2;18855:3;18796:67;:::i;:::-;18789:74;;18893:25;18889:1;18884:3;18880:11;18873:46;18945:2;18940:3;18936:12;18929:19;;18779:175;;;:::o;18960:381::-;;19123:67;19187:2;19182:3;19123:67;:::i;:::-;19116:74;;19220:34;19216:1;19211:3;19207:11;19200:55;19286:19;19281:2;19276:3;19272:12;19265:41;19332:2;19327:3;19323:12;19316:19;;19106:235;;;:::o;19347:371::-;;19510:67;19574:2;19569:3;19510:67;:::i;:::-;19503:74;;19607:34;19603:1;19598:3;19594:11;19587:55;19673:9;19668:2;19663:3;19659:12;19652:31;19709:2;19704:3;19700:12;19693:19;;19493:225;;;:::o;19724:376::-;;19887:67;19951:2;19946:3;19887:67;:::i;:::-;19880:74;;19984:34;19980:1;19975:3;19971:11;19964:55;20050:14;20045:2;20040:3;20036:12;20029:36;20091:2;20086:3;20082:12;20075:19;;19870:230;;;:::o;20106:326::-;;20269:67;20333:2;20328:3;20269:67;:::i;:::-;20262:74;;20366:30;20362:1;20357:3;20353:11;20346:51;20423:2;20418:3;20414:12;20407:19;;20252:180;;;:::o;20438:371::-;;20601:67;20665:2;20660:3;20601:67;:::i;:::-;20594:74;;20698:34;20694:1;20689:3;20685:11;20678:55;20764:9;20759:2;20754:3;20750:12;20743:31;20800:2;20795:3;20791:12;20784:19;;20584:225;;;:::o;20815:325::-;;20978:67;21042:2;21037:3;20978:67;:::i;:::-;20971:74;;21075:29;21071:1;21066:3;21062:11;21055:50;21131:2;21126:3;21122:12;21115:19;;20961:179;;;:::o;21146:118::-;21233:24;21251:5;21233:24;:::i;:::-;21228:3;21221:37;21211:53;;:::o;21270:435::-;;21472:95;21563:3;21554:6;21472:95;:::i;:::-;21465:102;;21584:95;21675:3;21666:6;21584:95;:::i;:::-;21577:102;;21696:3;21689:10;;21454:251;;;;;:::o;21711:379::-;;21917:147;22060:3;21917:147;:::i;:::-;21910:154;;22081:3;22074:10;;21899:191;;;:::o;22096:222::-;;22227:2;22216:9;22212:18;22204:26;;22240:71;22308:1;22297:9;22293:17;22284:6;22240:71;:::i;:::-;22194:124;;;;:::o;22324:640::-;;22557:3;22546:9;22542:19;22534:27;;22571:71;22639:1;22628:9;22624:17;22615:6;22571:71;:::i;:::-;22652:72;22720:2;22709:9;22705:18;22696:6;22652:72;:::i;:::-;22734;22802:2;22791:9;22787:18;22778:6;22734:72;:::i;:::-;22853:9;22847:4;22843:20;22838:2;22827:9;22823:18;22816:48;22881:76;22952:4;22943:6;22881:76;:::i;:::-;22873:84;;22524:440;;;;;;;:::o;22970:332::-;;23129:2;23118:9;23114:18;23106:26;;23142:71;23210:1;23199:9;23195:17;23186:6;23142:71;:::i;:::-;23223:72;23291:2;23280:9;23276:18;23267:6;23223:72;:::i;:::-;23096:206;;;;;:::o;23308:210::-;;23433:2;23422:9;23418:18;23410:26;;23446:65;23508:1;23497:9;23493:17;23484:6;23446:65;:::i;:::-;23400:118;;;;:::o;23524:313::-;;23675:2;23664:9;23660:18;23652:26;;23724:9;23718:4;23714:20;23710:1;23699:9;23695:17;23688:47;23752:78;23825:4;23816:6;23752:78;:::i;:::-;23744:86;;23642:195;;;;:::o;23843:419::-;;24047:2;24036:9;24032:18;24024:26;;24096:9;24090:4;24086:20;24082:1;24071:9;24067:17;24060:47;24124:131;24250:4;24124:131;:::i;:::-;24116:139;;24014:248;;;:::o;24268:419::-;;24472:2;24461:9;24457:18;24449:26;;24521:9;24515:4;24511:20;24507:1;24496:9;24492:17;24485:47;24549:131;24675:4;24549:131;:::i;:::-;24541:139;;24439:248;;;:::o;24693:419::-;;24897:2;24886:9;24882:18;24874:26;;24946:9;24940:4;24936:20;24932:1;24921:9;24917:17;24910:47;24974:131;25100:4;24974:131;:::i;:::-;24966:139;;24864:248;;;:::o;25118:419::-;;25322:2;25311:9;25307:18;25299:26;;25371:9;25365:4;25361:20;25357:1;25346:9;25342:17;25335:47;25399:131;25525:4;25399:131;:::i;:::-;25391:139;;25289:248;;;:::o;25543:419::-;;25747:2;25736:9;25732:18;25724:26;;25796:9;25790:4;25786:20;25782:1;25771:9;25767:17;25760:47;25824:131;25950:4;25824:131;:::i;:::-;25816:139;;25714:248;;;:::o;25968:419::-;;26172:2;26161:9;26157:18;26149:26;;26221:9;26215:4;26211:20;26207:1;26196:9;26192:17;26185:47;26249:131;26375:4;26249:131;:::i;:::-;26241:139;;26139:248;;;:::o;26393:419::-;;26597:2;26586:9;26582:18;26574:26;;26646:9;26640:4;26636:20;26632:1;26621:9;26617:17;26610:47;26674:131;26800:4;26674:131;:::i;:::-;26666:139;;26564:248;;;:::o;26818:419::-;;27022:2;27011:9;27007:18;26999:26;;27071:9;27065:4;27061:20;27057:1;27046:9;27042:17;27035:47;27099:131;27225:4;27099:131;:::i;:::-;27091:139;;26989:248;;;:::o;27243:419::-;;27447:2;27436:9;27432:18;27424:26;;27496:9;27490:4;27486:20;27482:1;27471:9;27467:17;27460:47;27524:131;27650:4;27524:131;:::i;:::-;27516:139;;27414:248;;;:::o;27668:419::-;;27872:2;27861:9;27857:18;27849:26;;27921:9;27915:4;27911:20;27907:1;27896:9;27892:17;27885:47;27949:131;28075:4;27949:131;:::i;:::-;27941:139;;27839:248;;;:::o;28093:419::-;;28297:2;28286:9;28282:18;28274:26;;28346:9;28340:4;28336:20;28332:1;28321:9;28317:17;28310:47;28374:131;28500:4;28374:131;:::i;:::-;28366:139;;28264:248;;;:::o;28518:419::-;;28722:2;28711:9;28707:18;28699:26;;28771:9;28765:4;28761:20;28757:1;28746:9;28742:17;28735:47;28799:131;28925:4;28799:131;:::i;:::-;28791:139;;28689:248;;;:::o;28943:419::-;;29147:2;29136:9;29132:18;29124:26;;29196:9;29190:4;29186:20;29182:1;29171:9;29167:17;29160:47;29224:131;29350:4;29224:131;:::i;:::-;29216:139;;29114:248;;;:::o;29368:419::-;;29572:2;29561:9;29557:18;29549:26;;29621:9;29615:4;29611:20;29607:1;29596:9;29592:17;29585:47;29649:131;29775:4;29649:131;:::i;:::-;29641:139;;29539:248;;;:::o;29793:419::-;;29997:2;29986:9;29982:18;29974:26;;30046:9;30040:4;30036:20;30032:1;30021:9;30017:17;30010:47;30074:131;30200:4;30074:131;:::i;:::-;30066:139;;29964:248;;;:::o;30218:419::-;;30422:2;30411:9;30407:18;30399:26;;30471:9;30465:4;30461:20;30457:1;30446:9;30442:17;30435:47;30499:131;30625:4;30499:131;:::i;:::-;30491:139;;30389:248;;;:::o;30643:419::-;;30847:2;30836:9;30832:18;30824:26;;30896:9;30890:4;30886:20;30882:1;30871:9;30867:17;30860:47;30924:131;31050:4;30924:131;:::i;:::-;30916:139;;30814:248;;;:::o;31068:419::-;;31272:2;31261:9;31257:18;31249:26;;31321:9;31315:4;31311:20;31307:1;31296:9;31292:17;31285:47;31349:131;31475:4;31349:131;:::i;:::-;31341:139;;31239:248;;;:::o;31493:419::-;;31697:2;31686:9;31682:18;31674:26;;31746:9;31740:4;31736:20;31732:1;31721:9;31717:17;31710:47;31774:131;31900:4;31774:131;:::i;:::-;31766:139;;31664:248;;;:::o;31918:419::-;;32122:2;32111:9;32107:18;32099:26;;32171:9;32165:4;32161:20;32157:1;32146:9;32142:17;32135:47;32199:131;32325:4;32199:131;:::i;:::-;32191:139;;32089:248;;;:::o;32343:419::-;;32547:2;32536:9;32532:18;32524:26;;32596:9;32590:4;32586:20;32582:1;32571:9;32567:17;32560:47;32624:131;32750:4;32624:131;:::i;:::-;32616:139;;32514:248;;;:::o;32768:419::-;;32972:2;32961:9;32957:18;32949:26;;33021:9;33015:4;33011:20;33007:1;32996:9;32992:17;32985:47;33049:131;33175:4;33049:131;:::i;:::-;33041:139;;32939:248;;;:::o;33193:419::-;;33397:2;33386:9;33382:18;33374:26;;33446:9;33440:4;33436:20;33432:1;33421:9;33417:17;33410:47;33474:131;33600:4;33474:131;:::i;:::-;33466:139;;33364:248;;;:::o;33618:419::-;;33822:2;33811:9;33807:18;33799:26;;33871:9;33865:4;33861:20;33857:1;33846:9;33842:17;33835:47;33899:131;34025:4;33899:131;:::i;:::-;33891:139;;33789:248;;;:::o;34043:419::-;;34247:2;34236:9;34232:18;34224:26;;34296:9;34290:4;34286:20;34282:1;34271:9;34267:17;34260:47;34324:131;34450:4;34324:131;:::i;:::-;34316:139;;34214:248;;;:::o;34468:419::-;;34672:2;34661:9;34657:18;34649:26;;34721:9;34715:4;34711:20;34707:1;34696:9;34692:17;34685:47;34749:131;34875:4;34749:131;:::i;:::-;34741:139;;34639:248;;;:::o;34893:419::-;;35097:2;35086:9;35082:18;35074:26;;35146:9;35140:4;35136:20;35132:1;35121:9;35117:17;35110:47;35174:131;35300:4;35174:131;:::i;:::-;35166:139;;35064:248;;;:::o;35318:419::-;;35522:2;35511:9;35507:18;35499:26;;35571:9;35565:4;35561:20;35557:1;35546:9;35542:17;35535:47;35599:131;35725:4;35599:131;:::i;:::-;35591:139;;35489:248;;;:::o;35743:419::-;;35947:2;35936:9;35932:18;35924:26;;35996:9;35990:4;35986:20;35982:1;35971:9;35967:17;35960:47;36024:131;36150:4;36024:131;:::i;:::-;36016:139;;35914:248;;;:::o;36168:419::-;;36372:2;36361:9;36357:18;36349:26;;36421:9;36415:4;36411:20;36407:1;36396:9;36392:17;36385:47;36449:131;36575:4;36449:131;:::i;:::-;36441:139;;36339:248;;;:::o;36593:419::-;;36797:2;36786:9;36782:18;36774:26;;36846:9;36840:4;36836:20;36832:1;36821:9;36817:17;36810:47;36874:131;37000:4;36874:131;:::i;:::-;36866:139;;36764:248;;;:::o;37018:419::-;;37222:2;37211:9;37207:18;37199:26;;37271:9;37265:4;37261:20;37257:1;37246:9;37242:17;37235:47;37299:131;37425:4;37299:131;:::i;:::-;37291:139;;37189:248;;;:::o;37443:419::-;;37647:2;37636:9;37632:18;37624:26;;37696:9;37690:4;37686:20;37682:1;37671:9;37667:17;37660:47;37724:131;37850:4;37724:131;:::i;:::-;37716:139;;37614:248;;;:::o;37868:419::-;;38072:2;38061:9;38057:18;38049:26;;38121:9;38115:4;38111:20;38107:1;38096:9;38092:17;38085:47;38149:131;38275:4;38149:131;:::i;:::-;38141:139;;38039:248;;;:::o;38293:419::-;;38497:2;38486:9;38482:18;38474:26;;38546:9;38540:4;38536:20;38532:1;38521:9;38517:17;38510:47;38574:131;38700:4;38574:131;:::i;:::-;38566:139;;38464:248;;;:::o;38718:222::-;;38849:2;38838:9;38834:18;38826:26;;38862:71;38930:1;38919:9;38915:17;38906:6;38862:71;:::i;:::-;38816:124;;;;:::o;38946:283::-;;39012:2;39006:9;38996:19;;39054:4;39046:6;39042:17;39161:6;39149:10;39146:22;39125:18;39113:10;39110:34;39107:62;39104:2;;;39172:18;;:::i;:::-;39104:2;39212:10;39208:2;39201:22;38986:243;;;;:::o;39235:331::-;;39386:18;39378:6;39375:30;39372:2;;;39408:18;;:::i;:::-;39372:2;39493:4;39489:9;39482:4;39474:6;39470:17;39466:33;39458:41;;39554:4;39548;39544:15;39536:23;;39301:265;;;:::o;39572:332::-;;39724:18;39716:6;39713:30;39710:2;;;39746:18;;:::i;:::-;39710:2;39831:4;39827:9;39820:4;39812:6;39808:17;39804:33;39796:41;;39892:4;39886;39882:15;39874:23;;39639:265;;;:::o;39910:98::-;;39995:5;39989:12;39979:22;;39968:40;;;:::o;40014:99::-;;40100:5;40094:12;40084:22;;40073:40;;;:::o;40119:168::-;;40236:6;40231:3;40224:19;40276:4;40271:3;40267:14;40252:29;;40214:73;;;;:::o;40293:147::-;;40431:3;40416:18;;40406:34;;;;:::o;40446:169::-;;40564:6;40559:3;40552:19;40604:4;40599:3;40595:14;40580:29;;40542:73;;;;:::o;40621:148::-;;40760:3;40745:18;;40735:34;;;;:::o;40775:305::-;;40834:20;40852:1;40834:20;:::i;:::-;40829:25;;40868:20;40886:1;40868:20;:::i;:::-;40863:25;;41022:1;40954:66;40950:74;40947:1;40944:81;40941:2;;;41028:18;;:::i;:::-;40941:2;41072:1;41069;41065:9;41058:16;;40819:261;;;;:::o;41086:185::-;;41143:20;41161:1;41143:20;:::i;:::-;41138:25;;41177:20;41195:1;41177:20;:::i;:::-;41172:25;;41216:1;41206:2;;41221:18;;:::i;:::-;41206:2;41263:1;41260;41256:9;41251:14;;41128:143;;;;:::o;41277:348::-;;41340:20;41358:1;41340:20;:::i;:::-;41335:25;;41374:20;41392:1;41374:20;:::i;:::-;41369:25;;41562:1;41494:66;41490:74;41487:1;41484:81;41479:1;41472:9;41465:17;41461:105;41458:2;;;41569:18;;:::i;:::-;41458:2;41617:1;41614;41610:9;41599:20;;41325:300;;;;:::o;41631:191::-;;41691:20;41709:1;41691:20;:::i;:::-;41686:25;;41725:20;41743:1;41725:20;:::i;:::-;41720:25;;41764:1;41761;41758:8;41755:2;;;41769:18;;:::i;:::-;41755:2;41814:1;41811;41807:9;41799:17;;41676:146;;;;:::o;41828:96::-;;41894:24;41912:5;41894:24;:::i;:::-;41883:35;;41873:51;;;:::o;41930:90::-;;42007:5;42000:13;41993:21;41982:32;;41972:48;;;:::o;42026:149::-;;42102:66;42095:5;42091:78;42080:89;;42070:105;;;:::o;42181:126::-;;42258:42;42251:5;42247:54;42236:65;;42226:81;;;:::o;42313:77::-;;42379:5;42368:16;;42358:32;;;:::o;42396:154::-;42480:6;42475:3;42470;42457:30;42542:1;42533:6;42528:3;42524:16;42517:27;42447:103;;;:::o;42556:307::-;42624:1;42634:113;42648:6;42645:1;42642:13;42634:113;;;42733:1;42728:3;42724:11;42718:18;42714:1;42709:3;42705:11;42698:39;42670:2;42667:1;42663:10;42658:15;;42634:113;;;42765:6;42762:1;42759:13;42756:2;;;42845:1;42836:6;42831:3;42827:16;42820:27;42756:2;42605:258;;;;:::o;42869:320::-;;42950:1;42944:4;42940:12;42930:22;;42997:1;42991:4;42987:12;43018:18;43008:2;;43074:4;43066:6;43062:17;43052:27;;43008:2;43136;43128:6;43125:14;43105:18;43102:38;43099:2;;;43155:18;;:::i;:::-;43099:2;42920:269;;;;:::o;43195:233::-;;43257:24;43275:5;43257:24;:::i;:::-;43248:33;;43303:66;43296:5;43293:77;43290:2;;;43373:18;;:::i;:::-;43290:2;43420:1;43413:5;43409:13;43402:20;;43238:190;;;:::o;43434:176::-;;43483:20;43501:1;43483:20;:::i;:::-;43478:25;;43517:20;43535:1;43517:20;:::i;:::-;43512:25;;43556:1;43546:2;;43561:18;;:::i;:::-;43546:2;43602:1;43599;43595:9;43590:14;;43468:142;;;;:::o;43616:180::-;43664:77;43661:1;43654:88;43761:4;43758:1;43751:15;43785:4;43782:1;43775:15;43802:180;43850:77;43847:1;43840:88;43947:4;43944:1;43937:15;43971:4;43968:1;43961:15;43988:180;44036:77;44033:1;44026:88;44133:4;44130:1;44123:15;44157:4;44154:1;44147:15;44174:180;44222:77;44219:1;44212:88;44319:4;44316:1;44309:15;44343:4;44340:1;44333:15;44360:102;;44452:2;44448:7;44443:2;44436:5;44432:14;44428:28;44418:38;;44408:54;;;:::o;44468:122::-;44541:24;44559:5;44541:24;:::i;:::-;44534:5;44531:35;44521:2;;44580:1;44577;44570:12;44521:2;44511:79;:::o;44596:116::-;44666:21;44681:5;44666:21;:::i;:::-;44659:5;44656:32;44646:2;;44702:1;44699;44692:12;44646:2;44636:76;:::o;44718:120::-;44790:23;44807:5;44790:23;:::i;:::-;44783:5;44780:34;44770:2;;44828:1;44825;44818:12;44770:2;44760:78;:::o;44844:122::-;44917:24;44935:5;44917:24;:::i;:::-;44910:5;44907:35;44897:2;;44956:1;44953;44946:12;44897:2;44887:79;:::o
Swarm Source
ipfs://c75427b2b26459ff877ac6996014b47cd0fcaba309cfbb989a39a352076407fa
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.