Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
0 TGB
Holders
615
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 TGBLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
TrippyGANBirbs
Compiler Version
v0.8.12+commit.f00d7308
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-07-05 */ // SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.12; /** * @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`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must 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 Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @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 * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } /** * @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 overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not 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 { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: 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 || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev 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 {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } /** * @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() { _transferOwnership(_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 { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } /** * @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 that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } interface ERC721check { function balanceOf(address) external view returns (uint256); } contract TrippyGANBirbs is Ownable, ERC721, ReentrancyGuard { using Counters for Counters.Counter; Counters.Counter private _tokenSupply; uint256 public constant MAX_BIRBS = 1000; bool public GANToadzMintIsActive = false; bool public BGANMintIsActive = false; bool public PublicSaleIsActive = false; address public TrippyGANToadzAddress = 0x2Ad0ED1621EaaB92C71f53DdE4BABa88e5C0BC44; address public BGANAddress = 0x31385d3520bCED94f77AaE104b406994D8F2168C; mapping(address => bool) public TGANclaimStatus; mapping(address => bool) public BGANclaimStatus; mapping (uint256 => string) private _tokenName; mapping (uint256 => string) private _tokenBG; mapping (uint256 => string) private _tokenBody; mapping (uint256 => string) private _tokenEyes; mapping (uint256 => string) private _tokenHead; string private _imageTokenURI; constructor() ERC721("Trippy GAN Birbs", "TGB") public { } //Trippy GAN Toadz free mint function GANToadzMint() public nonReentrant { require(GANToadzMintIsActive, "Not Active"); require(ERC721check(TrippyGANToadzAddress).balanceOf(msg.sender)>0,"Not a Trippy GAN Toad owner"); require(msg.sender == tx.origin); require(!TGANclaimStatus[msg.sender], "Birb already claimed"); uint256 mintIndex = _tokenSupply.current() + 1; require(mintIndex <= MAX_BIRBS, "Sold Out"); _tokenSupply.increment(); _safeMint(msg.sender, mintIndex); TGANclaimStatus[msg.sender] = true; } //BGAN free mint function BGANMint() public nonReentrant { require(BGANMintIsActive, "Not Active"); require(ERC721check(BGANAddress).balanceOf(msg.sender)>0,"Not a BGAN owner"); require(msg.sender == tx.origin); require(!BGANclaimStatus[msg.sender], "Birb already claimed"); uint256 mintIndex = _tokenSupply.current() + 1; require(mintIndex <= MAX_BIRBS, "Sold Out"); _tokenSupply.increment(); _safeMint(msg.sender, mintIndex); BGANclaimStatus[msg.sender] = true; } //Public sale function PublicMint() public nonReentrant { require(PublicSaleIsActive, "Not Active"); require(msg.sender == tx.origin); uint256 mintIndex = _tokenSupply.current() + 1; require(mintIndex <= MAX_BIRBS, "Sold Out"); _tokenSupply.increment(); _safeMint(msg.sender, mintIndex); } function remainingSupply() public view returns (uint256) { return MAX_BIRBS - _tokenSupply.current(); } function tokenSupply() public view returns (uint256) { return _tokenSupply.current(); } function toggleGANToadzMint() public onlyOwner { GANToadzMintIsActive = !GANToadzMintIsActive; } function toggleBGANMint() public onlyOwner { BGANMintIsActive = !BGANMintIsActive; } function togglePublicSale() public onlyOwner { PublicSaleIsActive = !PublicSaleIsActive; } function _imageURI() internal view virtual returns (string memory) { return _imageTokenURI; } function setimageURI(string memory imageURI) external onlyOwner { _imageTokenURI = imageURI; } //Get the metadata for a token in base64 format function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "Token not found"); return string( abi.encodePacked( "data:application/json;base64,", base64( abi.encodePacked( '{"name":"Birb #', uint2str(tokenId),' ',_tokenName[tokenId], '", "description": "Trippy GAN Birbs - A flock of 1,000 GAN created birbs.", "attributes": [{"trait_type":"Background", "value":"' ,_tokenBG[tokenId],'"},' '{"trait_type":"Body", "value":"' ,_tokenBody[tokenId],'"},' '{"trait_type":"Eyes", "value":"' ,_tokenEyes[tokenId],'"},' '{"trait_type":"Head", "value":"' ,_tokenHead[tokenId],'"}' '], ' '"image": "' ,_imageTokenURI, uint2str(tokenId), '.png', '"}' ) ) ) ); } //Changes the metadata for Birb tokenId function changeMetadata(uint256 tokenId, string memory newName, string memory newBG, string memory newBody, string memory newEyes, string memory newHead) public { address owner = ownerOf(tokenId); require(_msgSender() == owner, "ERC721: caller is not the owner"); require(validateMetadata(newName) == true, "Not a valid new name"); require(validateMetadata(newBG) == true, "Not a valid new trait"); require(validateMetadata(newBody) == true, "Not a valid new trait"); require(validateMetadata(newEyes) == true, "Not a valid new trait"); require(validateMetadata(newHead) == true, "Not a valid new trait"); _tokenName[tokenId] = newName; _tokenBG[tokenId] = newBG; _tokenBody[tokenId] = newBody; _tokenEyes[tokenId] = newEyes; _tokenHead[tokenId] = newHead; emit NameChange(tokenId, newName); emit BGChange(tokenId, newBG); emit BodyChange(tokenId, newBody); emit EyesChange(tokenId, newEyes); emit HeadChange(tokenId, newHead); } // Events event NameChange (uint256 indexed birbId, string newName); event BGChange (uint256 indexed birbId, string newBG); event BodyChange (uint256 indexed birbId, string newBody); event EyesChange (uint256 indexed birbId, string newEyes); event HeadChange (uint256 indexed birbId, string newHead); //Returns name of the NFT at index. function tokenNameByIndex(uint256 index) public view returns (string memory) { return _tokenName[index]; } //Check if the name string is valid (Alphanumeric and spaces without leading or trailing space) function validateMetadata(string memory str) public pure returns (bool){ bytes memory b = bytes(str); if(b.length < 1) return false; if(b.length > 25) return false; // Cannot be longer than 25 characters if(b[0] == 0x20) return false; // Leading space if (b[b.length - 1] == 0x20) return false; // Trailing space bytes1 lastChar = b[0]; for(uint i; i<b.length; i++){ bytes1 char = b[i]; if (char == 0x20 && lastChar == 0x20) return false; // Cannot contain continous spaces if( !(char >= 0x30 && char <= 0x39) && //9-0 !(char >= 0x41 && char <= 0x5A) && //A-Z !(char >= 0x61 && char <= 0x7A) && //a-z !(char == 0x20) //space ) return false; lastChar = char; } return true; } //Converts the string to lowercase function toLower(string memory str) public pure returns (string memory){ bytes memory bStr = bytes(str); bytes memory bLower = new bytes(bStr.length); for (uint i = 0; i < bStr.length; i++) { // Uppercase character if ((uint8(bStr[i]) >= 65) && (uint8(bStr[i]) <= 90)) { bLower[i] = bytes1(uint8(bStr[i]) + 32); } else { bLower[i] = bStr[i]; } } return string(bLower); } // Base64 by Brecht Devos - <[email protected]> // Provides a function for encoding some bytes in base64 string internal constant TABLE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; function base64(bytes memory data) internal pure returns (string memory) { if (data.length == 0) return ''; // load the table into memory string memory table = TABLE; // multiply by 4/3 rounded up uint256 encodedLen = 4 * ((data.length + 2) / 3); // add some extra buffer at the end required for the writing string memory result = new string(encodedLen + 32); assembly { // set the actual output length mstore(result, encodedLen) // prepare the lookup table let tablePtr := add(table, 1) // input ptr let dataPtr := data let endPtr := add(dataPtr, mload(data)) // result ptr, jump over length let resultPtr := add(result, 32) // run over the input, 3 bytes at a time for {} lt(dataPtr, endPtr) {} { dataPtr := add(dataPtr, 3) // read 3 bytes let input := mload(dataPtr) // write 4 characters mstore(resultPtr, shl(248, mload(add(tablePtr, and(shr(18, input), 0x3F))))) resultPtr := add(resultPtr, 1) mstore(resultPtr, shl(248, mload(add(tablePtr, and(shr(12, input), 0x3F))))) resultPtr := add(resultPtr, 1) mstore(resultPtr, shl(248, mload(add(tablePtr, and(shr( 6, input), 0x3F))))) resultPtr := add(resultPtr, 1) mstore(resultPtr, shl(248, mload(add(tablePtr, and( input, 0x3F))))) resultPtr := add(resultPtr, 1) } // padding with '=' switch mod(mload(data), 3) case 1 { mstore(sub(resultPtr, 2), shl(240, 0x3d3d)) } case 2 { mstore(sub(resultPtr, 1), shl(248, 0x3d)) } } return result; } //Helper function to convert uint to string function uint2str(uint256 _i) internal pure returns (string memory _uintAsString) { if (_i == 0) { return "0"; } uint256 j = _i; uint256 len; while (j != 0) { len++; j /= 10; } bytes memory bstr = new bytes(len); uint256 k = len; while (_i != 0) { k = k - 1; uint8 temp = (48 + uint8(_i - (_i / 10) * 10)); bytes1 b1 = bytes1(temp); bstr[k] = b1; _i /= 10; } return string(bstr); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"birbId","type":"uint256"},{"indexed":false,"internalType":"string","name":"newBG","type":"string"}],"name":"BGChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"birbId","type":"uint256"},{"indexed":false,"internalType":"string","name":"newBody","type":"string"}],"name":"BodyChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"birbId","type":"uint256"},{"indexed":false,"internalType":"string","name":"newEyes","type":"string"}],"name":"EyesChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"birbId","type":"uint256"},{"indexed":false,"internalType":"string","name":"newHead","type":"string"}],"name":"HeadChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"birbId","type":"uint256"},{"indexed":false,"internalType":"string","name":"newName","type":"string"}],"name":"NameChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"BGANAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BGANMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"BGANMintIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"BGANclaimStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GANToadzMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"GANToadzMintIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_BIRBS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PublicMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"PublicSaleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"TGANclaimStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TrippyGANToadzAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"newName","type":"string"},{"internalType":"string","name":"newBG","type":"string"},{"internalType":"string","name":"newBody","type":"string"},{"internalType":"string","name":"newEyes","type":"string"},{"internalType":"string","name":"newHead","type":"string"}],"name":"changeMetadata","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":"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":"remainingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"imageURI","type":"string"}],"name":"setimageURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"str","type":"string"}],"name":"toLower","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"toggleBGANMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleGANToadzMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"togglePublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenNameByIndex","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenSupply","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":[{"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":[{"internalType":"string","name":"str","type":"string"}],"name":"validateMetadata","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"}]
Contract Creation Code
60806040526000600960006101000a81548160ff0219169083151502179055506000600960016101000a81548160ff0219169083151502179055506000600960026101000a81548160ff021916908315150217905550732ad0ed1621eaab92c71f53dde4baba88e5c0bc44600960036101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507331385d3520bced94f77aae104b406994d8f2168c600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200010c57600080fd5b506040518060400160405280601081526020017f5472697070792047414e204269726273000000000000000000000000000000008152506040518060400160405280600381526020017f5447420000000000000000000000000000000000000000000000000000000000815250620001996200018d620001db60201b60201c565b620001e360201b60201c565b8160019080519060200190620001b1929190620002a7565b508060029080519060200190620001ca929190620002a7565b5050506001600781905550620003bc565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002b59062000386565b90600052602060002090601f016020900481019282620002d9576000855562000325565b82601f10620002f457805160ff191683800117855562000325565b8280016001018555821562000325579182015b828111156200032457825182559160200191906001019062000307565b5b50905062000334919062000338565b5090565b5b808211156200035357600081600090555060010162000339565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200039f57607f821691505b60208210811415620003b657620003b562000357565b5b50919050565b61519380620003cc6000396000f3fe608060405234801561001057600080fd5b50600436106102275760003560e01c80637cb806c711610130578063c2c40095116100b8578063e222c7f91161007c578063e222c7f914610642578063e985e9c51461064c578063ea3107f41461067c578063f2fde38b14610686578063fe1881c4146106a257610227565b8063c2c400951461058a578063c87b56dd146105a8578063cd63b709146105d8578063d4e2ab7d14610608578063da0239a61461062457610227565b8063a22cb465116100ff578063a22cb465146104f8578063a774c92014610514578063b0886d0714610532578063b88d4fde14610550578063c0b19d551461056c57610227565b80637cb806c7146104825780638da5cb5b1461048c5780639416b423146104aa57806395d89b41146104da57610227565b80634293ac59116101b35780636d522418116101825780636d522418146103ca57806370a08231146103fa578063715018a61461042a57806372f1f7c2146104345780637824407f1461046457610227565b80634293ac591461034257806357cc330a146103725780636352211e146103905780636cef6b2a146103c057610227565b806320d515c3116101fa57806320d515c3146102c657806323b872dd146102d05780633f56064d146102ec5780633f6a96c01461030857806342842e0e1461032657610227565b806301ffc9a71461022c57806306fdde031461025c578063081812fc1461027a578063095ea7b3146102aa575b600080fd5b6102466004803603810190610241919061343d565b6106ac565b6040516102539190613485565b60405180910390f35b61026461078e565b6040516102719190613539565b60405180910390f35b610294600480360381019061028f9190613591565b610820565b6040516102a191906135ff565b60405180910390f35b6102c460048036038101906102bf9190613646565b6108a5565b005b6102ce6109bd565b005b6102ea60048036038101906102e59190613686565b610a65565b005b6103066004803603810190610301919061380e565b610ac5565b005b610310610b5b565b60405161031d9190613485565b60405180910390f35b610340600480360381019061033b9190613686565b610b6e565b005b61035c60048036038101906103579190613857565b610b8e565b6040516103699190613485565b60405180910390f35b61037a610bae565b60405161038791906135ff565b60405180910390f35b6103aa60048036038101906103a59190613591565b610bd4565b6040516103b791906135ff565b60405180910390f35b6103c8610c86565b005b6103e460048036038101906103df9190613591565b610d2e565b6040516103f19190613539565b60405180910390f35b610414600480360381019061040f9190613857565b610dd3565b6040516104219190613893565b60405180910390f35b610432610e8b565b005b61044e6004803603810190610449919061380e565b610f13565b60405161045b9190613485565b60405180910390f35b61046c611245565b6040516104799190613893565b60405180910390f35b61048a611256565b005b61049461156c565b6040516104a191906135ff565b60405180910390f35b6104c460048036038101906104bf919061380e565b611595565b6040516104d19190613539565b60405180910390f35b6104e261174d565b6040516104ef9190613539565b60405180910390f35b610512600480360381019061050d91906138da565b6117df565b005b61051c6117f5565b6040516105299190613485565b60405180910390f35b61053a611808565b6040516105479190613893565b60405180910390f35b61056a600480360381019061056591906139bb565b61180e565b005b610574611870565b6040516105819190613485565b60405180910390f35b610592611883565b60405161059f91906135ff565b60405180910390f35b6105c260048036038101906105bd9190613591565b6118a9565b6040516105cf9190613539565b60405180910390f35b6105f260048036038101906105ed9190613857565b6119ba565b6040516105ff9190613485565b60405180910390f35b610622600480360381019061061d9190613a3e565b6119da565b005b61062c611dd0565b6040516106399190613893565b60405180910390f35b61064a611dee565b005b61066660048036038101906106619190613b57565b611e96565b6040516106739190613485565b60405180910390f35b610684611f2a565b005b6106a0600480360381019061069b9190613857565b612240565b005b6106aa612338565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061077757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061078757506107868261248b565b5b9050919050565b60606001805461079d90613bc6565b80601f01602080910402602001604051908101604052809291908181526020018280546107c990613bc6565b80156108165780601f106107eb57610100808354040283529160200191610816565b820191906000526020600020905b8154815290600101906020018083116107f957829003601f168201915b5050505050905090565b600061082b826124f5565b61086a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086190613c6a565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108b082610bd4565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610921576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091890613cfc565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610940612561565b73ffffffffffffffffffffffffffffffffffffffff16148061096f575061096e81610969612561565b611e96565b5b6109ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a590613d8e565b60405180910390fd5b6109b88383612569565b505050565b6109c5612561565b73ffffffffffffffffffffffffffffffffffffffff166109e361156c565b73ffffffffffffffffffffffffffffffffffffffff1614610a39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3090613dfa565b60405180910390fd5b600960019054906101000a900460ff1615600960016101000a81548160ff021916908315150217905550565b610a76610a70612561565b82612622565b610ab5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aac90613e8c565b60405180910390fd5b610ac0838383612700565b505050565b610acd612561565b73ffffffffffffffffffffffffffffffffffffffff16610aeb61156c565b73ffffffffffffffffffffffffffffffffffffffff1614610b41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3890613dfa565b60405180910390fd5b8060129080519060200190610b5792919061332e565b5050565b600960009054906101000a900460ff1681565b610b898383836040518060200160405280600081525061180e565b505050565b600b6020528060005260406000206000915054906101000a900460ff1681565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610c7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7490613f1e565b60405180910390fd5b80915050919050565b610c8e612561565b73ffffffffffffffffffffffffffffffffffffffff16610cac61156c565b73ffffffffffffffffffffffffffffffffffffffff1614610d02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf990613dfa565b60405180910390fd5b600960009054906101000a900460ff1615600960006101000a81548160ff021916908315150217905550565b6060600d60008381526020019081526020016000208054610d4e90613bc6565b80601f0160208091040260200160405190810160405280929190818152602001828054610d7a90613bc6565b8015610dc75780601f10610d9c57610100808354040283529160200191610dc7565b820191906000526020600020905b815481529060010190602001808311610daa57829003601f168201915b50505050509050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610e44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3b90613fb0565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610e93612561565b73ffffffffffffffffffffffffffffffffffffffff16610eb161156c565b73ffffffffffffffffffffffffffffffffffffffff1614610f07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610efe90613dfa565b60405180910390fd5b610f116000612967565b565b600080829050600181511015610f2d576000915050611240565b601981511115610f41576000915050611240565b602060f81b81600081518110610f5a57610f59613fd0565b5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415610f97576000915050611240565b602060f81b8160018351610fab919061402e565b81518110610fbc57610fbb613fd0565b5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415610ff9576000915050611240565b60008160008151811061100f5761100e613fd0565b5b602001015160f81c60f81b905060005b825181101561123857600083828151811061103d5761103c613fd0565b5b602001015160f81c60f81b9050602060f81b817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480156110a45750602060f81b837effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b156110b6576000945050505050611240565b603060f81b817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916101580156111125750603960f81b817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191611155b1580156111785750604160f81b817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916101580156111765750605a60f81b817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191611155b155b80156111dd5750606160f81b817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916101580156111db5750607a60f81b817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191611155b155b801561120f5750602060f81b817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614155b15611221576000945050505050611240565b80925050808061123090614062565b91505061101f565b506001925050505b919050565b60006112516008612a2b565b905090565b6002600754141561129c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611293906140f7565b60405180910390fd5b6002600781905550600960019054906101000a900460ff166112f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ea90614163565b60405180910390fd5b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b815260040161135091906135ff565b602060405180830381865afa15801561136d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113919190614198565b116113d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c890614211565b60405180910390fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461140957600080fd5b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611496576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148d9061427d565b60405180910390fd5b600060016114a46008612a2b565b6114ae919061429d565b90506103e88111156114f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ec9061433f565b60405180910390fd5b6114ff6008612a39565b6115093382612a4f565b6001600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550506001600781905550565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060008290506000815167ffffffffffffffff8111156115b9576115b86136e3565b5b6040519080825280601f01601f1916602001820160405280156115eb5781602001600182028036833780820191505090505b50905060005b825181101561174257604183828151811061160f5761160e613fd0565b5b602001015160f81c60f81b60f81c60ff16101580156116525750605a83828151811061163e5761163d613fd0565b5b602001015160f81c60f81b60f81c60ff1611155b156116ce57602083828151811061166c5761166b613fd0565b5b602001015160f81c60f81b60f81c611684919061436c565b60f81b82828151811061169a57611699613fd0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535061172f565b8281815181106116e1576116e0613fd0565b5b602001015160f81c60f81b8282815181106116ff576116fe613fd0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b808061173a90614062565b9150506115f1565b508092505050919050565b60606002805461175c90613bc6565b80601f016020809104026020016040519081016040528092919081815260200182805461178890613bc6565b80156117d55780601f106117aa576101008083540402835291602001916117d5565b820191906000526020600020905b8154815290600101906020018083116117b857829003601f168201915b5050505050905090565b6117f16117ea612561565b8383612a6d565b5050565b600960029054906101000a900460ff1681565b6103e881565b61181f611819612561565b83612622565b61185e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185590613e8c565b60405180910390fd5b61186a84848484612bda565b50505050565b600960019054906101000a900460ff1681565b600960039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606118b4826124f5565b6118f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ea906143ef565b60405180910390fd5b6119946118ff83612c36565b600d6000858152602001908152602001600020600e6000868152602001908152602001600020600f6000878152602001908152602001600020601060008881526020019081526020016000206011600089815260200190815260200160002060126119698a612c36565b60405160200161198098979695949392919061486f565b604051602081830303815290604052612dbf565b6040516020016119a49190614990565b6040516020818303038152906040529050919050565b600c6020528060005260406000206000915054906101000a900460ff1681565b60006119e587610bd4565b90508073ffffffffffffffffffffffffffffffffffffffff16611a06612561565b73ffffffffffffffffffffffffffffffffffffffff1614611a5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a53906149fe565b60405180910390fd5b60011515611a6987610f13565b151514611aab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa290614a6a565b60405180910390fd5b60011515611ab886610f13565b151514611afa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af190614ad6565b60405180910390fd5b60011515611b0785610f13565b151514611b49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4090614ad6565b60405180910390fd5b60011515611b5684610f13565b151514611b98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8f90614ad6565b60405180910390fd5b60011515611ba583610f13565b151514611be7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bde90614ad6565b60405180910390fd5b85600d60008981526020019081526020016000209080519060200190611c0e92919061332e565b5084600e60008981526020019081526020016000209080519060200190611c3692919061332e565b5083600f60008981526020019081526020016000209080519060200190611c5e92919061332e565b5082601060008981526020019081526020016000209080519060200190611c8692919061332e565b5081601160008981526020019081526020016000209080519060200190611cae92919061332e565b50867f7e632a301794d8d4a81ea7e20f37d1947158d36e66403af04ba85dd194b66f1b87604051611cdf9190613539565b60405180910390a2867fad478c874e2e4ffe869e0150b0ebf1e50e2da9bc00667263a23a3100ba06a60d86604051611d179190613539565b60405180910390a2867f2d206ddd60b4e9c90db16bedd987b8d12dae4402fa9775dc0ce46a0bb7c1faf185604051611d4f9190613539565b60405180910390a2867f686efb8ef39403234848c46f6b75a164977618a4751895270a53de9f225083e384604051611d879190613539565b60405180910390a2867fba2f0306bb13ab154152f914acf38f1dccfb16629375c8c8e51e503d169cecd883604051611dbf9190613539565b60405180910390a250505050505050565b6000611ddc6008612a2b565b6103e8611de9919061402e565b905090565b611df6612561565b73ffffffffffffffffffffffffffffffffffffffff16611e1461156c565b73ffffffffffffffffffffffffffffffffffffffff1614611e6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6190613dfa565b60405180910390fd5b600960029054906101000a900460ff1615600960026101000a81548160ff021916908315150217905550565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60026007541415611f70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f67906140f7565b60405180910390fd5b6002600781905550600960009054906101000a900460ff16611fc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fbe90614163565b60405180910390fd5b6000600960039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b815260040161202491906135ff565b602060405180830381865afa158015612041573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120659190614198565b116120a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209c90614b42565b60405180910390fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146120dd57600080fd5b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561216a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121619061427d565b60405180910390fd5b600060016121786008612a2b565b612182919061429d565b90506103e88111156121c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c09061433f565b60405180910390fd5b6121d36008612a39565b6121dd3382612a4f565b6001600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550506001600781905550565b612248612561565b73ffffffffffffffffffffffffffffffffffffffff1661226661156c565b73ffffffffffffffffffffffffffffffffffffffff16146122bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b390613dfa565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561232c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232390614bd4565b60405180910390fd5b61233581612967565b50565b6002600754141561237e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612375906140f7565b60405180910390fd5b6002600781905550600960029054906101000a900460ff166123d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123cc90614163565b60405180910390fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461240d57600080fd5b6000600161241b6008612a2b565b612425919061429d565b90506103e881111561246c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124639061433f565b60405180910390fd5b6124766008612a39565b6124803382612a4f565b506001600781905550565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166125dc83610bd4565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061262d826124f5565b61266c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161266390614c66565b60405180910390fd5b600061267783610bd4565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806126b957506126b88185611e96565b5b806126f757508373ffffffffffffffffffffffffffffffffffffffff166126df84610820565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661272082610bd4565b73ffffffffffffffffffffffffffffffffffffffff1614612776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276d90614cf8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127dd90614d8a565b60405180910390fd5b6127f1838383612f44565b6127fc600082612569565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461284c919061402e565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128a3919061429d565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612962838383612f49565b505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081600001549050919050565b6001816000016000828254019250508190555050565b612a69828260405180602001604052806000815250612f4e565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612adc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ad390614df6565b60405180910390fd5b80600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612bcd9190613485565b60405180910390a3505050565b612be5848484612700565b612bf184848484612fa9565b612c30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c2790614e88565b60405180910390fd5b50505050565b60606000821415612c7e576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612dba565b600082905060005b60008214612cb0578080612c9990614062565b915050600a82612ca99190614ed7565b9150612c86565b60008167ffffffffffffffff811115612ccc57612ccb6136e3565b5b6040519080825280601f01601f191660200182016040528015612cfe5781602001600182028036833780820191505090505b50905060008290505b60008614612db257600181612d1c919061402e565b90506000600a8088612d2e9190614ed7565b612d389190614f08565b87612d43919061402e565b6030612d4f919061436c565b905060008160f81b905080848481518110612d6d57612d6c613fd0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a88612da99190614ed7565b97505050612d07565b819450505050505b919050565b6060600082511415612de257604051806020016040528060008152509050612f3f565b600060405180606001604052806040815260200161511e6040913990506000600360028551612e11919061429d565b612e1b9190614ed7565b6004612e279190614f08565b90506000602082612e38919061429d565b67ffffffffffffffff811115612e5157612e506136e3565b5b6040519080825280601f01601f191660200182016040528015612e835781602001600182028036833780820191505090505b509050818152600183018586518101602084015b81831015612efe576003830192508251603f8160121c1685015160f81b8252600182019150603f81600c1c1685015160f81b8252600182019150603f8160061c1685015160f81b8252600182019150603f811685015160f81b825260018201915050612e97565b600389510660018114612f185760028114612f2857612f33565b613d3d60f01b6002830352612f33565b603d60f81b60018303525b50505050508093505050505b919050565b505050565b505050565b612f588383613131565b612f656000848484612fa9565b612fa4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f9b90614e88565b60405180910390fd5b505050565b6000612fca8473ffffffffffffffffffffffffffffffffffffffff1661330b565b15613124578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612ff3612561565b8786866040518563ffffffff1660e01b81526004016130159493929190614fb7565b6020604051808303816000875af192505050801561305157506040513d601f19601f8201168201806040525081019061304e9190615018565b60015b6130d4573d8060008114613081576040519150601f19603f3d011682016040523d82523d6000602084013e613086565b606091505b506000815114156130cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130c390614e88565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613129565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156131a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161319890615091565b60405180910390fd5b6131aa816124f5565b156131ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131e1906150fd565b60405180910390fd5b6131f660008383612f44565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613246919061429d565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461330760008383612f49565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b82805461333a90613bc6565b90600052602060002090601f01602090048101928261335c57600085556133a3565b82601f1061337557805160ff19168380011785556133a3565b828001600101855582156133a3579182015b828111156133a2578251825591602001919060010190613387565b5b5090506133b091906133b4565b5090565b5b808211156133cd5760008160009055506001016133b5565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61341a816133e5565b811461342557600080fd5b50565b60008135905061343781613411565b92915050565b600060208284031215613453576134526133db565b5b600061346184828501613428565b91505092915050565b60008115159050919050565b61347f8161346a565b82525050565b600060208201905061349a6000830184613476565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156134da5780820151818401526020810190506134bf565b838111156134e9576000848401525b50505050565b6000601f19601f8301169050919050565b600061350b826134a0565b61351581856134ab565b93506135258185602086016134bc565b61352e816134ef565b840191505092915050565b600060208201905081810360008301526135538184613500565b905092915050565b6000819050919050565b61356e8161355b565b811461357957600080fd5b50565b60008135905061358b81613565565b92915050565b6000602082840312156135a7576135a66133db565b5b60006135b58482850161357c565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006135e9826135be565b9050919050565b6135f9816135de565b82525050565b600060208201905061361460008301846135f0565b92915050565b613623816135de565b811461362e57600080fd5b50565b6000813590506136408161361a565b92915050565b6000806040838503121561365d5761365c6133db565b5b600061366b85828601613631565b925050602061367c8582860161357c565b9150509250929050565b60008060006060848603121561369f5761369e6133db565b5b60006136ad86828701613631565b93505060206136be86828701613631565b92505060406136cf8682870161357c565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61371b826134ef565b810181811067ffffffffffffffff8211171561373a576137396136e3565b5b80604052505050565b600061374d6133d1565b90506137598282613712565b919050565b600067ffffffffffffffff821115613779576137786136e3565b5b613782826134ef565b9050602081019050919050565b82818337600083830152505050565b60006137b16137ac8461375e565b613743565b9050828152602081018484840111156137cd576137cc6136de565b5b6137d884828561378f565b509392505050565b600082601f8301126137f5576137f46136d9565b5b813561380584826020860161379e565b91505092915050565b600060208284031215613824576138236133db565b5b600082013567ffffffffffffffff811115613842576138416133e0565b5b61384e848285016137e0565b91505092915050565b60006020828403121561386d5761386c6133db565b5b600061387b84828501613631565b91505092915050565b61388d8161355b565b82525050565b60006020820190506138a86000830184613884565b92915050565b6138b78161346a565b81146138c257600080fd5b50565b6000813590506138d4816138ae565b92915050565b600080604083850312156138f1576138f06133db565b5b60006138ff85828601613631565b9250506020613910858286016138c5565b9150509250929050565b600067ffffffffffffffff821115613935576139346136e3565b5b61393e826134ef565b9050602081019050919050565b600061395e6139598461391a565b613743565b90508281526020810184848401111561397a576139796136de565b5b61398584828561378f565b509392505050565b600082601f8301126139a2576139a16136d9565b5b81356139b284826020860161394b565b91505092915050565b600080600080608085870312156139d5576139d46133db565b5b60006139e387828801613631565b94505060206139f487828801613631565b9350506040613a058782880161357c565b925050606085013567ffffffffffffffff811115613a2657613a256133e0565b5b613a328782880161398d565b91505092959194509250565b60008060008060008060c08789031215613a5b57613a5a6133db565b5b6000613a6989828a0161357c565b965050602087013567ffffffffffffffff811115613a8a57613a896133e0565b5b613a9689828a016137e0565b955050604087013567ffffffffffffffff811115613ab757613ab66133e0565b5b613ac389828a016137e0565b945050606087013567ffffffffffffffff811115613ae457613ae36133e0565b5b613af089828a016137e0565b935050608087013567ffffffffffffffff811115613b1157613b106133e0565b5b613b1d89828a016137e0565b92505060a087013567ffffffffffffffff811115613b3e57613b3d6133e0565b5b613b4a89828a016137e0565b9150509295509295509295565b60008060408385031215613b6e57613b6d6133db565b5b6000613b7c85828601613631565b9250506020613b8d85828601613631565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613bde57607f821691505b60208210811415613bf257613bf1613b97565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613c54602c836134ab565b9150613c5f82613bf8565b604082019050919050565b60006020820190508181036000830152613c8381613c47565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613ce66021836134ab565b9150613cf182613c8a565b604082019050919050565b60006020820190508181036000830152613d1581613cd9565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000613d786038836134ab565b9150613d8382613d1c565b604082019050919050565b60006020820190508181036000830152613da781613d6b565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613de46020836134ab565b9150613def82613dae565b602082019050919050565b60006020820190508181036000830152613e1381613dd7565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000613e766031836134ab565b9150613e8182613e1a565b604082019050919050565b60006020820190508181036000830152613ea581613e69565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000613f086029836134ab565b9150613f1382613eac565b604082019050919050565b60006020820190508181036000830152613f3781613efb565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000613f9a602a836134ab565b9150613fa582613f3e565b604082019050919050565b60006020820190508181036000830152613fc981613f8d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006140398261355b565b91506140448361355b565b92508282101561405757614056613fff565b5b828203905092915050565b600061406d8261355b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156140a05761409f613fff565b5b600182019050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006140e1601f836134ab565b91506140ec826140ab565b602082019050919050565b60006020820190508181036000830152614110816140d4565b9050919050565b7f4e6f742041637469766500000000000000000000000000000000000000000000600082015250565b600061414d600a836134ab565b915061415882614117565b602082019050919050565b6000602082019050818103600083015261417c81614140565b9050919050565b60008151905061419281613565565b92915050565b6000602082840312156141ae576141ad6133db565b5b60006141bc84828501614183565b91505092915050565b7f4e6f742061204247414e206f776e657200000000000000000000000000000000600082015250565b60006141fb6010836134ab565b9150614206826141c5565b602082019050919050565b6000602082019050818103600083015261422a816141ee565b9050919050565b7f4269726220616c726561647920636c61696d6564000000000000000000000000600082015250565b60006142676014836134ab565b915061427282614231565b602082019050919050565b600060208201905081810360008301526142968161425a565b9050919050565b60006142a88261355b565b91506142b38361355b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156142e8576142e7613fff565b5b828201905092915050565b7f536f6c64204f7574000000000000000000000000000000000000000000000000600082015250565b60006143296008836134ab565b9150614334826142f3565b602082019050919050565b600060208201905081810360008301526143588161431c565b9050919050565b600060ff82169050919050565b60006143778261435f565b91506143828361435f565b92508260ff0382111561439857614397613fff565b5b828201905092915050565b7f546f6b656e206e6f7420666f756e640000000000000000000000000000000000600082015250565b60006143d9600f836134ab565b91506143e4826143a3565b602082019050919050565b60006020820190508181036000830152614408816143cc565b9050919050565b600081905092915050565b7f7b226e616d65223a224269726220230000000000000000000000000000000000600082015250565b6000614450600f8361440f565b915061445b8261441a565b600f82019050919050565b6000614471826134a0565b61447b818561440f565b935061448b8185602086016134bc565b80840191505092915050565b7f2000000000000000000000000000000000000000000000000000000000000000600082015250565b60006144cd60018361440f565b91506144d882614497565b600182019050919050565b60008190508160005260206000209050919050565b6000815461450581613bc6565b61450f818661440f565b9450600182166000811461452a576001811461453b5761456e565b60ff1983168652818601935061456e565b614544856144e3565b60005b8381101561456657815481890152600182019150602081019050614547565b838801955050505b50505092915050565b7f222c20226465736372697074696f6e223a20225472697070792047414e20426960008201527f726273202d204120666c6f636b206f6620312c3030302047414e20637265617460208201527f65642062697262732e222c202261747472696275746573223a205b7b2274726160408201527f69745f74797065223a224261636b67726f756e64222c202276616c7565223a22606082015250565b600061461f60808361440f565b915061462a82614577565b608082019050919050565b7f227d2c7b2274726169745f74797065223a22426f6479222c202276616c75652260008201527f3a22000000000000000000000000000000000000000000000000000000000000602082015250565b600061469160228361440f565b915061469c82614635565b602282019050919050565b7f227d2c7b2274726169745f74797065223a2245796573222c202276616c75652260008201527f3a22000000000000000000000000000000000000000000000000000000000000602082015250565b600061470360228361440f565b915061470e826146a7565b602282019050919050565b7f227d2c7b2274726169745f74797065223a2248656164222c202276616c75652260008201527f3a22000000000000000000000000000000000000000000000000000000000000602082015250565b600061477560228361440f565b915061478082614719565b602282019050919050565b7f227d5d2c2022696d616765223a20220000000000000000000000000000000000600082015250565b60006147c1600f8361440f565b91506147cc8261478b565b600f82019050919050565b7f2e706e6700000000000000000000000000000000000000000000000000000000600082015250565b600061480d60048361440f565b9150614818826147d7565b600482019050919050565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b600061485960028361440f565b915061486482614823565b600282019050919050565b600061487a82614443565b9150614886828b614466565b9150614891826144c0565b915061489d828a6144f8565b91506148a882614612565b91506148b482896144f8565b91506148bf82614684565b91506148cb82886144f8565b91506148d6826146f6565b91506148e282876144f8565b91506148ed82614768565b91506148f982866144f8565b9150614904826147b4565b915061491082856144f8565b915061491c8284614466565b915061492782614800565b91506149328261484c565b91508190509998505050505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b600061497a601d8361440f565b915061498582614944565b601d82019050919050565b600061499b8261496d565b91506149a78284614466565b915081905092915050565b7f4552433732313a2063616c6c6572206973206e6f7420746865206f776e657200600082015250565b60006149e8601f836134ab565b91506149f3826149b2565b602082019050919050565b60006020820190508181036000830152614a17816149db565b9050919050565b7f4e6f7420612076616c6964206e6577206e616d65000000000000000000000000600082015250565b6000614a546014836134ab565b9150614a5f82614a1e565b602082019050919050565b60006020820190508181036000830152614a8381614a47565b9050919050565b7f4e6f7420612076616c6964206e65772074726169740000000000000000000000600082015250565b6000614ac06015836134ab565b9150614acb82614a8a565b602082019050919050565b60006020820190508181036000830152614aef81614ab3565b9050919050565b7f4e6f742061205472697070792047414e20546f6164206f776e65720000000000600082015250565b6000614b2c601b836134ab565b9150614b3782614af6565b602082019050919050565b60006020820190508181036000830152614b5b81614b1f565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614bbe6026836134ab565b9150614bc982614b62565b604082019050919050565b60006020820190508181036000830152614bed81614bb1565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614c50602c836134ab565b9150614c5b82614bf4565b604082019050919050565b60006020820190508181036000830152614c7f81614c43565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000614ce26025836134ab565b9150614ced82614c86565b604082019050919050565b60006020820190508181036000830152614d1181614cd5565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614d746024836134ab565b9150614d7f82614d18565b604082019050919050565b60006020820190508181036000830152614da381614d67565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614de06019836134ab565b9150614deb82614daa565b602082019050919050565b60006020820190508181036000830152614e0f81614dd3565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614e726032836134ab565b9150614e7d82614e16565b604082019050919050565b60006020820190508181036000830152614ea181614e65565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614ee28261355b565b9150614eed8361355b565b925082614efd57614efc614ea8565b5b828204905092915050565b6000614f138261355b565b9150614f1e8361355b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614f5757614f56613fff565b5b828202905092915050565b600081519050919050565b600082825260208201905092915050565b6000614f8982614f62565b614f938185614f6d565b9350614fa38185602086016134bc565b614fac816134ef565b840191505092915050565b6000608082019050614fcc60008301876135f0565b614fd960208301866135f0565b614fe66040830185613884565b8181036060830152614ff88184614f7e565b905095945050505050565b60008151905061501281613411565b92915050565b60006020828403121561502e5761502d6133db565b5b600061503c84828501615003565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061507b6020836134ab565b915061508682615045565b602082019050919050565b600060208201905081810360008301526150aa8161506e565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006150e7601c836134ab565b91506150f2826150b1565b602082019050919050565b60006020820190508181036000830152615116816150da565b905091905056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa26469706673582212201d01d8e5a3c0430ec6cfd0dc99814556c5fe51f55f9f6e5c37b80597c64d6fac64736f6c634300080c0033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102275760003560e01c80637cb806c711610130578063c2c40095116100b8578063e222c7f91161007c578063e222c7f914610642578063e985e9c51461064c578063ea3107f41461067c578063f2fde38b14610686578063fe1881c4146106a257610227565b8063c2c400951461058a578063c87b56dd146105a8578063cd63b709146105d8578063d4e2ab7d14610608578063da0239a61461062457610227565b8063a22cb465116100ff578063a22cb465146104f8578063a774c92014610514578063b0886d0714610532578063b88d4fde14610550578063c0b19d551461056c57610227565b80637cb806c7146104825780638da5cb5b1461048c5780639416b423146104aa57806395d89b41146104da57610227565b80634293ac59116101b35780636d522418116101825780636d522418146103ca57806370a08231146103fa578063715018a61461042a57806372f1f7c2146104345780637824407f1461046457610227565b80634293ac591461034257806357cc330a146103725780636352211e146103905780636cef6b2a146103c057610227565b806320d515c3116101fa57806320d515c3146102c657806323b872dd146102d05780633f56064d146102ec5780633f6a96c01461030857806342842e0e1461032657610227565b806301ffc9a71461022c57806306fdde031461025c578063081812fc1461027a578063095ea7b3146102aa575b600080fd5b6102466004803603810190610241919061343d565b6106ac565b6040516102539190613485565b60405180910390f35b61026461078e565b6040516102719190613539565b60405180910390f35b610294600480360381019061028f9190613591565b610820565b6040516102a191906135ff565b60405180910390f35b6102c460048036038101906102bf9190613646565b6108a5565b005b6102ce6109bd565b005b6102ea60048036038101906102e59190613686565b610a65565b005b6103066004803603810190610301919061380e565b610ac5565b005b610310610b5b565b60405161031d9190613485565b60405180910390f35b610340600480360381019061033b9190613686565b610b6e565b005b61035c60048036038101906103579190613857565b610b8e565b6040516103699190613485565b60405180910390f35b61037a610bae565b60405161038791906135ff565b60405180910390f35b6103aa60048036038101906103a59190613591565b610bd4565b6040516103b791906135ff565b60405180910390f35b6103c8610c86565b005b6103e460048036038101906103df9190613591565b610d2e565b6040516103f19190613539565b60405180910390f35b610414600480360381019061040f9190613857565b610dd3565b6040516104219190613893565b60405180910390f35b610432610e8b565b005b61044e6004803603810190610449919061380e565b610f13565b60405161045b9190613485565b60405180910390f35b61046c611245565b6040516104799190613893565b60405180910390f35b61048a611256565b005b61049461156c565b6040516104a191906135ff565b60405180910390f35b6104c460048036038101906104bf919061380e565b611595565b6040516104d19190613539565b60405180910390f35b6104e261174d565b6040516104ef9190613539565b60405180910390f35b610512600480360381019061050d91906138da565b6117df565b005b61051c6117f5565b6040516105299190613485565b60405180910390f35b61053a611808565b6040516105479190613893565b60405180910390f35b61056a600480360381019061056591906139bb565b61180e565b005b610574611870565b6040516105819190613485565b60405180910390f35b610592611883565b60405161059f91906135ff565b60405180910390f35b6105c260048036038101906105bd9190613591565b6118a9565b6040516105cf9190613539565b60405180910390f35b6105f260048036038101906105ed9190613857565b6119ba565b6040516105ff9190613485565b60405180910390f35b610622600480360381019061061d9190613a3e565b6119da565b005b61062c611dd0565b6040516106399190613893565b60405180910390f35b61064a611dee565b005b61066660048036038101906106619190613b57565b611e96565b6040516106739190613485565b60405180910390f35b610684611f2a565b005b6106a0600480360381019061069b9190613857565b612240565b005b6106aa612338565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061077757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061078757506107868261248b565b5b9050919050565b60606001805461079d90613bc6565b80601f01602080910402602001604051908101604052809291908181526020018280546107c990613bc6565b80156108165780601f106107eb57610100808354040283529160200191610816565b820191906000526020600020905b8154815290600101906020018083116107f957829003601f168201915b5050505050905090565b600061082b826124f5565b61086a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086190613c6a565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108b082610bd4565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610921576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091890613cfc565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610940612561565b73ffffffffffffffffffffffffffffffffffffffff16148061096f575061096e81610969612561565b611e96565b5b6109ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a590613d8e565b60405180910390fd5b6109b88383612569565b505050565b6109c5612561565b73ffffffffffffffffffffffffffffffffffffffff166109e361156c565b73ffffffffffffffffffffffffffffffffffffffff1614610a39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3090613dfa565b60405180910390fd5b600960019054906101000a900460ff1615600960016101000a81548160ff021916908315150217905550565b610a76610a70612561565b82612622565b610ab5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aac90613e8c565b60405180910390fd5b610ac0838383612700565b505050565b610acd612561565b73ffffffffffffffffffffffffffffffffffffffff16610aeb61156c565b73ffffffffffffffffffffffffffffffffffffffff1614610b41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3890613dfa565b60405180910390fd5b8060129080519060200190610b5792919061332e565b5050565b600960009054906101000a900460ff1681565b610b898383836040518060200160405280600081525061180e565b505050565b600b6020528060005260406000206000915054906101000a900460ff1681565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610c7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7490613f1e565b60405180910390fd5b80915050919050565b610c8e612561565b73ffffffffffffffffffffffffffffffffffffffff16610cac61156c565b73ffffffffffffffffffffffffffffffffffffffff1614610d02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf990613dfa565b60405180910390fd5b600960009054906101000a900460ff1615600960006101000a81548160ff021916908315150217905550565b6060600d60008381526020019081526020016000208054610d4e90613bc6565b80601f0160208091040260200160405190810160405280929190818152602001828054610d7a90613bc6565b8015610dc75780601f10610d9c57610100808354040283529160200191610dc7565b820191906000526020600020905b815481529060010190602001808311610daa57829003601f168201915b50505050509050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610e44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3b90613fb0565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610e93612561565b73ffffffffffffffffffffffffffffffffffffffff16610eb161156c565b73ffffffffffffffffffffffffffffffffffffffff1614610f07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610efe90613dfa565b60405180910390fd5b610f116000612967565b565b600080829050600181511015610f2d576000915050611240565b601981511115610f41576000915050611240565b602060f81b81600081518110610f5a57610f59613fd0565b5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415610f97576000915050611240565b602060f81b8160018351610fab919061402e565b81518110610fbc57610fbb613fd0565b5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415610ff9576000915050611240565b60008160008151811061100f5761100e613fd0565b5b602001015160f81c60f81b905060005b825181101561123857600083828151811061103d5761103c613fd0565b5b602001015160f81c60f81b9050602060f81b817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480156110a45750602060f81b837effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b156110b6576000945050505050611240565b603060f81b817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916101580156111125750603960f81b817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191611155b1580156111785750604160f81b817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916101580156111765750605a60f81b817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191611155b155b80156111dd5750606160f81b817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916101580156111db5750607a60f81b817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191611155b155b801561120f5750602060f81b817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614155b15611221576000945050505050611240565b80925050808061123090614062565b91505061101f565b506001925050505b919050565b60006112516008612a2b565b905090565b6002600754141561129c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611293906140f7565b60405180910390fd5b6002600781905550600960019054906101000a900460ff166112f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ea90614163565b60405180910390fd5b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b815260040161135091906135ff565b602060405180830381865afa15801561136d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113919190614198565b116113d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c890614211565b60405180910390fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461140957600080fd5b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611496576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148d9061427d565b60405180910390fd5b600060016114a46008612a2b565b6114ae919061429d565b90506103e88111156114f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ec9061433f565b60405180910390fd5b6114ff6008612a39565b6115093382612a4f565b6001600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550506001600781905550565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060008290506000815167ffffffffffffffff8111156115b9576115b86136e3565b5b6040519080825280601f01601f1916602001820160405280156115eb5781602001600182028036833780820191505090505b50905060005b825181101561174257604183828151811061160f5761160e613fd0565b5b602001015160f81c60f81b60f81c60ff16101580156116525750605a83828151811061163e5761163d613fd0565b5b602001015160f81c60f81b60f81c60ff1611155b156116ce57602083828151811061166c5761166b613fd0565b5b602001015160f81c60f81b60f81c611684919061436c565b60f81b82828151811061169a57611699613fd0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535061172f565b8281815181106116e1576116e0613fd0565b5b602001015160f81c60f81b8282815181106116ff576116fe613fd0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b808061173a90614062565b9150506115f1565b508092505050919050565b60606002805461175c90613bc6565b80601f016020809104026020016040519081016040528092919081815260200182805461178890613bc6565b80156117d55780601f106117aa576101008083540402835291602001916117d5565b820191906000526020600020905b8154815290600101906020018083116117b857829003601f168201915b5050505050905090565b6117f16117ea612561565b8383612a6d565b5050565b600960029054906101000a900460ff1681565b6103e881565b61181f611819612561565b83612622565b61185e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185590613e8c565b60405180910390fd5b61186a84848484612bda565b50505050565b600960019054906101000a900460ff1681565b600960039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606118b4826124f5565b6118f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ea906143ef565b60405180910390fd5b6119946118ff83612c36565b600d6000858152602001908152602001600020600e6000868152602001908152602001600020600f6000878152602001908152602001600020601060008881526020019081526020016000206011600089815260200190815260200160002060126119698a612c36565b60405160200161198098979695949392919061486f565b604051602081830303815290604052612dbf565b6040516020016119a49190614990565b6040516020818303038152906040529050919050565b600c6020528060005260406000206000915054906101000a900460ff1681565b60006119e587610bd4565b90508073ffffffffffffffffffffffffffffffffffffffff16611a06612561565b73ffffffffffffffffffffffffffffffffffffffff1614611a5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a53906149fe565b60405180910390fd5b60011515611a6987610f13565b151514611aab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa290614a6a565b60405180910390fd5b60011515611ab886610f13565b151514611afa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af190614ad6565b60405180910390fd5b60011515611b0785610f13565b151514611b49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4090614ad6565b60405180910390fd5b60011515611b5684610f13565b151514611b98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8f90614ad6565b60405180910390fd5b60011515611ba583610f13565b151514611be7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bde90614ad6565b60405180910390fd5b85600d60008981526020019081526020016000209080519060200190611c0e92919061332e565b5084600e60008981526020019081526020016000209080519060200190611c3692919061332e565b5083600f60008981526020019081526020016000209080519060200190611c5e92919061332e565b5082601060008981526020019081526020016000209080519060200190611c8692919061332e565b5081601160008981526020019081526020016000209080519060200190611cae92919061332e565b50867f7e632a301794d8d4a81ea7e20f37d1947158d36e66403af04ba85dd194b66f1b87604051611cdf9190613539565b60405180910390a2867fad478c874e2e4ffe869e0150b0ebf1e50e2da9bc00667263a23a3100ba06a60d86604051611d179190613539565b60405180910390a2867f2d206ddd60b4e9c90db16bedd987b8d12dae4402fa9775dc0ce46a0bb7c1faf185604051611d4f9190613539565b60405180910390a2867f686efb8ef39403234848c46f6b75a164977618a4751895270a53de9f225083e384604051611d879190613539565b60405180910390a2867fba2f0306bb13ab154152f914acf38f1dccfb16629375c8c8e51e503d169cecd883604051611dbf9190613539565b60405180910390a250505050505050565b6000611ddc6008612a2b565b6103e8611de9919061402e565b905090565b611df6612561565b73ffffffffffffffffffffffffffffffffffffffff16611e1461156c565b73ffffffffffffffffffffffffffffffffffffffff1614611e6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6190613dfa565b60405180910390fd5b600960029054906101000a900460ff1615600960026101000a81548160ff021916908315150217905550565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60026007541415611f70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f67906140f7565b60405180910390fd5b6002600781905550600960009054906101000a900460ff16611fc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fbe90614163565b60405180910390fd5b6000600960039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b815260040161202491906135ff565b602060405180830381865afa158015612041573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120659190614198565b116120a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209c90614b42565b60405180910390fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146120dd57600080fd5b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561216a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121619061427d565b60405180910390fd5b600060016121786008612a2b565b612182919061429d565b90506103e88111156121c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c09061433f565b60405180910390fd5b6121d36008612a39565b6121dd3382612a4f565b6001600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550506001600781905550565b612248612561565b73ffffffffffffffffffffffffffffffffffffffff1661226661156c565b73ffffffffffffffffffffffffffffffffffffffff16146122bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b390613dfa565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561232c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232390614bd4565b60405180910390fd5b61233581612967565b50565b6002600754141561237e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612375906140f7565b60405180910390fd5b6002600781905550600960029054906101000a900460ff166123d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123cc90614163565b60405180910390fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461240d57600080fd5b6000600161241b6008612a2b565b612425919061429d565b90506103e881111561246c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124639061433f565b60405180910390fd5b6124766008612a39565b6124803382612a4f565b506001600781905550565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166125dc83610bd4565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061262d826124f5565b61266c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161266390614c66565b60405180910390fd5b600061267783610bd4565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806126b957506126b88185611e96565b5b806126f757508373ffffffffffffffffffffffffffffffffffffffff166126df84610820565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661272082610bd4565b73ffffffffffffffffffffffffffffffffffffffff1614612776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276d90614cf8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127dd90614d8a565b60405180910390fd5b6127f1838383612f44565b6127fc600082612569565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461284c919061402e565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128a3919061429d565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612962838383612f49565b505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081600001549050919050565b6001816000016000828254019250508190555050565b612a69828260405180602001604052806000815250612f4e565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612adc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ad390614df6565b60405180910390fd5b80600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612bcd9190613485565b60405180910390a3505050565b612be5848484612700565b612bf184848484612fa9565b612c30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c2790614e88565b60405180910390fd5b50505050565b60606000821415612c7e576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612dba565b600082905060005b60008214612cb0578080612c9990614062565b915050600a82612ca99190614ed7565b9150612c86565b60008167ffffffffffffffff811115612ccc57612ccb6136e3565b5b6040519080825280601f01601f191660200182016040528015612cfe5781602001600182028036833780820191505090505b50905060008290505b60008614612db257600181612d1c919061402e565b90506000600a8088612d2e9190614ed7565b612d389190614f08565b87612d43919061402e565b6030612d4f919061436c565b905060008160f81b905080848481518110612d6d57612d6c613fd0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a88612da99190614ed7565b97505050612d07565b819450505050505b919050565b6060600082511415612de257604051806020016040528060008152509050612f3f565b600060405180606001604052806040815260200161511e6040913990506000600360028551612e11919061429d565b612e1b9190614ed7565b6004612e279190614f08565b90506000602082612e38919061429d565b67ffffffffffffffff811115612e5157612e506136e3565b5b6040519080825280601f01601f191660200182016040528015612e835781602001600182028036833780820191505090505b509050818152600183018586518101602084015b81831015612efe576003830192508251603f8160121c1685015160f81b8252600182019150603f81600c1c1685015160f81b8252600182019150603f8160061c1685015160f81b8252600182019150603f811685015160f81b825260018201915050612e97565b600389510660018114612f185760028114612f2857612f33565b613d3d60f01b6002830352612f33565b603d60f81b60018303525b50505050508093505050505b919050565b505050565b505050565b612f588383613131565b612f656000848484612fa9565b612fa4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f9b90614e88565b60405180910390fd5b505050565b6000612fca8473ffffffffffffffffffffffffffffffffffffffff1661330b565b15613124578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612ff3612561565b8786866040518563ffffffff1660e01b81526004016130159493929190614fb7565b6020604051808303816000875af192505050801561305157506040513d601f19601f8201168201806040525081019061304e9190615018565b60015b6130d4573d8060008114613081576040519150601f19603f3d011682016040523d82523d6000602084013e613086565b606091505b506000815114156130cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130c390614e88565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613129565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156131a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161319890615091565b60405180910390fd5b6131aa816124f5565b156131ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131e1906150fd565b60405180910390fd5b6131f660008383612f44565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613246919061429d565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461330760008383612f49565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b82805461333a90613bc6565b90600052602060002090601f01602090048101928261335c57600085556133a3565b82601f1061337557805160ff19168380011785556133a3565b828001600101855582156133a3579182015b828111156133a2578251825591602001919060010190613387565b5b5090506133b091906133b4565b5090565b5b808211156133cd5760008160009055506001016133b5565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61341a816133e5565b811461342557600080fd5b50565b60008135905061343781613411565b92915050565b600060208284031215613453576134526133db565b5b600061346184828501613428565b91505092915050565b60008115159050919050565b61347f8161346a565b82525050565b600060208201905061349a6000830184613476565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156134da5780820151818401526020810190506134bf565b838111156134e9576000848401525b50505050565b6000601f19601f8301169050919050565b600061350b826134a0565b61351581856134ab565b93506135258185602086016134bc565b61352e816134ef565b840191505092915050565b600060208201905081810360008301526135538184613500565b905092915050565b6000819050919050565b61356e8161355b565b811461357957600080fd5b50565b60008135905061358b81613565565b92915050565b6000602082840312156135a7576135a66133db565b5b60006135b58482850161357c565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006135e9826135be565b9050919050565b6135f9816135de565b82525050565b600060208201905061361460008301846135f0565b92915050565b613623816135de565b811461362e57600080fd5b50565b6000813590506136408161361a565b92915050565b6000806040838503121561365d5761365c6133db565b5b600061366b85828601613631565b925050602061367c8582860161357c565b9150509250929050565b60008060006060848603121561369f5761369e6133db565b5b60006136ad86828701613631565b93505060206136be86828701613631565b92505060406136cf8682870161357c565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61371b826134ef565b810181811067ffffffffffffffff8211171561373a576137396136e3565b5b80604052505050565b600061374d6133d1565b90506137598282613712565b919050565b600067ffffffffffffffff821115613779576137786136e3565b5b613782826134ef565b9050602081019050919050565b82818337600083830152505050565b60006137b16137ac8461375e565b613743565b9050828152602081018484840111156137cd576137cc6136de565b5b6137d884828561378f565b509392505050565b600082601f8301126137f5576137f46136d9565b5b813561380584826020860161379e565b91505092915050565b600060208284031215613824576138236133db565b5b600082013567ffffffffffffffff811115613842576138416133e0565b5b61384e848285016137e0565b91505092915050565b60006020828403121561386d5761386c6133db565b5b600061387b84828501613631565b91505092915050565b61388d8161355b565b82525050565b60006020820190506138a86000830184613884565b92915050565b6138b78161346a565b81146138c257600080fd5b50565b6000813590506138d4816138ae565b92915050565b600080604083850312156138f1576138f06133db565b5b60006138ff85828601613631565b9250506020613910858286016138c5565b9150509250929050565b600067ffffffffffffffff821115613935576139346136e3565b5b61393e826134ef565b9050602081019050919050565b600061395e6139598461391a565b613743565b90508281526020810184848401111561397a576139796136de565b5b61398584828561378f565b509392505050565b600082601f8301126139a2576139a16136d9565b5b81356139b284826020860161394b565b91505092915050565b600080600080608085870312156139d5576139d46133db565b5b60006139e387828801613631565b94505060206139f487828801613631565b9350506040613a058782880161357c565b925050606085013567ffffffffffffffff811115613a2657613a256133e0565b5b613a328782880161398d565b91505092959194509250565b60008060008060008060c08789031215613a5b57613a5a6133db565b5b6000613a6989828a0161357c565b965050602087013567ffffffffffffffff811115613a8a57613a896133e0565b5b613a9689828a016137e0565b955050604087013567ffffffffffffffff811115613ab757613ab66133e0565b5b613ac389828a016137e0565b945050606087013567ffffffffffffffff811115613ae457613ae36133e0565b5b613af089828a016137e0565b935050608087013567ffffffffffffffff811115613b1157613b106133e0565b5b613b1d89828a016137e0565b92505060a087013567ffffffffffffffff811115613b3e57613b3d6133e0565b5b613b4a89828a016137e0565b9150509295509295509295565b60008060408385031215613b6e57613b6d6133db565b5b6000613b7c85828601613631565b9250506020613b8d85828601613631565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613bde57607f821691505b60208210811415613bf257613bf1613b97565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613c54602c836134ab565b9150613c5f82613bf8565b604082019050919050565b60006020820190508181036000830152613c8381613c47565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613ce66021836134ab565b9150613cf182613c8a565b604082019050919050565b60006020820190508181036000830152613d1581613cd9565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000613d786038836134ab565b9150613d8382613d1c565b604082019050919050565b60006020820190508181036000830152613da781613d6b565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613de46020836134ab565b9150613def82613dae565b602082019050919050565b60006020820190508181036000830152613e1381613dd7565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000613e766031836134ab565b9150613e8182613e1a565b604082019050919050565b60006020820190508181036000830152613ea581613e69565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000613f086029836134ab565b9150613f1382613eac565b604082019050919050565b60006020820190508181036000830152613f3781613efb565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000613f9a602a836134ab565b9150613fa582613f3e565b604082019050919050565b60006020820190508181036000830152613fc981613f8d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006140398261355b565b91506140448361355b565b92508282101561405757614056613fff565b5b828203905092915050565b600061406d8261355b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156140a05761409f613fff565b5b600182019050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006140e1601f836134ab565b91506140ec826140ab565b602082019050919050565b60006020820190508181036000830152614110816140d4565b9050919050565b7f4e6f742041637469766500000000000000000000000000000000000000000000600082015250565b600061414d600a836134ab565b915061415882614117565b602082019050919050565b6000602082019050818103600083015261417c81614140565b9050919050565b60008151905061419281613565565b92915050565b6000602082840312156141ae576141ad6133db565b5b60006141bc84828501614183565b91505092915050565b7f4e6f742061204247414e206f776e657200000000000000000000000000000000600082015250565b60006141fb6010836134ab565b9150614206826141c5565b602082019050919050565b6000602082019050818103600083015261422a816141ee565b9050919050565b7f4269726220616c726561647920636c61696d6564000000000000000000000000600082015250565b60006142676014836134ab565b915061427282614231565b602082019050919050565b600060208201905081810360008301526142968161425a565b9050919050565b60006142a88261355b565b91506142b38361355b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156142e8576142e7613fff565b5b828201905092915050565b7f536f6c64204f7574000000000000000000000000000000000000000000000000600082015250565b60006143296008836134ab565b9150614334826142f3565b602082019050919050565b600060208201905081810360008301526143588161431c565b9050919050565b600060ff82169050919050565b60006143778261435f565b91506143828361435f565b92508260ff0382111561439857614397613fff565b5b828201905092915050565b7f546f6b656e206e6f7420666f756e640000000000000000000000000000000000600082015250565b60006143d9600f836134ab565b91506143e4826143a3565b602082019050919050565b60006020820190508181036000830152614408816143cc565b9050919050565b600081905092915050565b7f7b226e616d65223a224269726220230000000000000000000000000000000000600082015250565b6000614450600f8361440f565b915061445b8261441a565b600f82019050919050565b6000614471826134a0565b61447b818561440f565b935061448b8185602086016134bc565b80840191505092915050565b7f2000000000000000000000000000000000000000000000000000000000000000600082015250565b60006144cd60018361440f565b91506144d882614497565b600182019050919050565b60008190508160005260206000209050919050565b6000815461450581613bc6565b61450f818661440f565b9450600182166000811461452a576001811461453b5761456e565b60ff1983168652818601935061456e565b614544856144e3565b60005b8381101561456657815481890152600182019150602081019050614547565b838801955050505b50505092915050565b7f222c20226465736372697074696f6e223a20225472697070792047414e20426960008201527f726273202d204120666c6f636b206f6620312c3030302047414e20637265617460208201527f65642062697262732e222c202261747472696275746573223a205b7b2274726160408201527f69745f74797065223a224261636b67726f756e64222c202276616c7565223a22606082015250565b600061461f60808361440f565b915061462a82614577565b608082019050919050565b7f227d2c7b2274726169745f74797065223a22426f6479222c202276616c75652260008201527f3a22000000000000000000000000000000000000000000000000000000000000602082015250565b600061469160228361440f565b915061469c82614635565b602282019050919050565b7f227d2c7b2274726169745f74797065223a2245796573222c202276616c75652260008201527f3a22000000000000000000000000000000000000000000000000000000000000602082015250565b600061470360228361440f565b915061470e826146a7565b602282019050919050565b7f227d2c7b2274726169745f74797065223a2248656164222c202276616c75652260008201527f3a22000000000000000000000000000000000000000000000000000000000000602082015250565b600061477560228361440f565b915061478082614719565b602282019050919050565b7f227d5d2c2022696d616765223a20220000000000000000000000000000000000600082015250565b60006147c1600f8361440f565b91506147cc8261478b565b600f82019050919050565b7f2e706e6700000000000000000000000000000000000000000000000000000000600082015250565b600061480d60048361440f565b9150614818826147d7565b600482019050919050565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b600061485960028361440f565b915061486482614823565b600282019050919050565b600061487a82614443565b9150614886828b614466565b9150614891826144c0565b915061489d828a6144f8565b91506148a882614612565b91506148b482896144f8565b91506148bf82614684565b91506148cb82886144f8565b91506148d6826146f6565b91506148e282876144f8565b91506148ed82614768565b91506148f982866144f8565b9150614904826147b4565b915061491082856144f8565b915061491c8284614466565b915061492782614800565b91506149328261484c565b91508190509998505050505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b600061497a601d8361440f565b915061498582614944565b601d82019050919050565b600061499b8261496d565b91506149a78284614466565b915081905092915050565b7f4552433732313a2063616c6c6572206973206e6f7420746865206f776e657200600082015250565b60006149e8601f836134ab565b91506149f3826149b2565b602082019050919050565b60006020820190508181036000830152614a17816149db565b9050919050565b7f4e6f7420612076616c6964206e6577206e616d65000000000000000000000000600082015250565b6000614a546014836134ab565b9150614a5f82614a1e565b602082019050919050565b60006020820190508181036000830152614a8381614a47565b9050919050565b7f4e6f7420612076616c6964206e65772074726169740000000000000000000000600082015250565b6000614ac06015836134ab565b9150614acb82614a8a565b602082019050919050565b60006020820190508181036000830152614aef81614ab3565b9050919050565b7f4e6f742061205472697070792047414e20546f6164206f776e65720000000000600082015250565b6000614b2c601b836134ab565b9150614b3782614af6565b602082019050919050565b60006020820190508181036000830152614b5b81614b1f565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614bbe6026836134ab565b9150614bc982614b62565b604082019050919050565b60006020820190508181036000830152614bed81614bb1565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614c50602c836134ab565b9150614c5b82614bf4565b604082019050919050565b60006020820190508181036000830152614c7f81614c43565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000614ce26025836134ab565b9150614ced82614c86565b604082019050919050565b60006020820190508181036000830152614d1181614cd5565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614d746024836134ab565b9150614d7f82614d18565b604082019050919050565b60006020820190508181036000830152614da381614d67565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614de06019836134ab565b9150614deb82614daa565b602082019050919050565b60006020820190508181036000830152614e0f81614dd3565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614e726032836134ab565b9150614e7d82614e16565b604082019050919050565b60006020820190508181036000830152614ea181614e65565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614ee28261355b565b9150614eed8361355b565b925082614efd57614efc614ea8565b5b828204905092915050565b6000614f138261355b565b9150614f1e8361355b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614f5757614f56613fff565b5b828202905092915050565b600081519050919050565b600082825260208201905092915050565b6000614f8982614f62565b614f938185614f6d565b9350614fa38185602086016134bc565b614fac816134ef565b840191505092915050565b6000608082019050614fcc60008301876135f0565b614fd960208301866135f0565b614fe66040830185613884565b8181036060830152614ff88184614f7e565b905095945050505050565b60008151905061501281613411565b92915050565b60006020828403121561502e5761502d6133db565b5b600061503c84828501615003565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061507b6020836134ab565b915061508682615045565b602082019050919050565b600060208201905081810360008301526150aa8161506e565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006150e7601c836134ab565b91506150f2826150b1565b602082019050919050565b60006020820190508181036000830152615116816150da565b905091905056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa26469706673582212201d01d8e5a3c0430ec6cfd0dc99814556c5fe51f55f9f6e5c37b80597c64d6fac64736f6c634300080c0033
Deployed Bytecode Sourcemap
39781:10396:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20259:305;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21204:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22764:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22287:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42573:94;;;:::i;:::-;;23514:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42900:108;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39981:40;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23924:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40282:47;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40204:71;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20898:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42459:106;;;:::i;:::-;;45635:120;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20628:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34946:103;;;:::i;:::-;;45864:922;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42350:101;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41356:512;;;:::i;:::-;;34295:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46834:506;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21373:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23057:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40071:38;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39934:40;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24180:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40028:36;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40116:81;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43065:1050;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40336:47;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44166:1089;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42225:117;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42675:104;;;:::i;:::-;;23283:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40787:541;;;:::i;:::-;;35204:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41893:320;;;:::i;:::-;;20259:305;20361:4;20413:25;20398:40;;;:11;:40;;;;:105;;;;20470:33;20455:48;;;:11;:48;;;;20398:105;:158;;;;20520:36;20544:11;20520:23;:36::i;:::-;20398:158;20378:178;;20259:305;;;:::o;21204:100::-;21258:13;21291:5;21284:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21204:100;:::o;22764:221::-;22840:7;22868:16;22876:7;22868;:16::i;:::-;22860:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22953:15;:24;22969:7;22953:24;;;;;;;;;;;;;;;;;;;;;22946:31;;22764:221;;;:::o;22287:411::-;22368:13;22384:23;22399:7;22384:14;:23::i;:::-;22368:39;;22432:5;22426:11;;:2;:11;;;;22418:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;22526:5;22510:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;22535:37;22552:5;22559:12;:10;:12::i;:::-;22535:16;:37::i;:::-;22510:62;22488:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;22669:21;22678:2;22682:7;22669:8;:21::i;:::-;22357:341;22287:411;;:::o;42573:94::-;34526:12;:10;:12::i;:::-;34515:23;;:7;:5;:7::i;:::-;:23;;;34507:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42643:16:::1;;;;;;;;;;;42642:17;42623:16;;:36;;;;;;;;;;;;;;;;;;42573:94::o:0;23514:339::-;23709:41;23728:12;:10;:12::i;:::-;23742:7;23709:18;:41::i;:::-;23701:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;23817:28;23827:4;23833:2;23837:7;23817:9;:28::i;:::-;23514:339;;;:::o;42900:108::-;34526:12;:10;:12::i;:::-;34515:23;;:7;:5;:7::i;:::-;:23;;;34507:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42992:8:::1;42975:14;:25;;;;;;;;;;;;:::i;:::-;;42900:108:::0;:::o;39981:40::-;;;;;;;;;;;;;:::o;23924:185::-;24062:39;24079:4;24085:2;24089:7;24062:39;;;;;;;;;;;;:16;:39::i;:::-;23924:185;;;:::o;40282:47::-;;;;;;;;;;;;;;;;;;;;;;:::o;40204:71::-;;;;;;;;;;;;;:::o;20898:239::-;20970:7;20990:13;21006:7;:16;21014:7;21006:16;;;;;;;;;;;;;;;;;;;;;20990:32;;21058:1;21041:19;;:5;:19;;;;21033:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21124:5;21117:12;;;20898:239;;;:::o;42459:106::-;34526:12;:10;:12::i;:::-;34515:23;;:7;:5;:7::i;:::-;:23;;;34507:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42537:20:::1;;;;;;;;;;;42536:21;42513:20;;:44;;;;;;;;;;;;;;;;;;42459:106::o:0;45635:120::-;45697:13;45730:10;:17;45741:5;45730:17;;;;;;;;;;;45723:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45635:120;;;:::o;20628:208::-;20700:7;20745:1;20728:19;;:5;:19;;;;20720:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;20812:9;:16;20822:5;20812:16;;;;;;;;;;;;;;;;20805:23;;20628:208;;;:::o;34946:103::-;34526:12;:10;:12::i;:::-;34515:23;;:7;:5;:7::i;:::-;:23;;;34507:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35011:30:::1;35038:1;35011:18;:30::i;:::-;34946:103::o:0;45864:922::-;45930:4;45946:14;45969:3;45946:27;;45998:1;45987;:8;:12;45984:29;;;46008:5;46001:12;;;;;45984:29;46038:2;46027:1;:8;:13;46024:30;;;46049:5;46042:12;;;;;46024:30;46115:4;46107:12;;:1;46109;46107:4;;;;;;;;:::i;:::-;;;;;;;;;;:12;;;;46104:29;;;46128:5;46121:12;;;;;46104:29;46184:4;46165:23;;:1;46178;46167;:8;:12;;;;:::i;:::-;46165:15;;;;;;;;:::i;:::-;;;;;;;;;;:23;;;;46161:41;;;46197:5;46190:12;;;;;46161:41;46233:15;46251:1;46253;46251:4;;;;;;;;:::i;:::-;;;;;;;;;;46233:22;;46272:6;46268:487;46282:1;:8;46280:1;:10;46268:487;;;46311:11;46325:1;46327;46325:4;;;;;;;;:::i;:::-;;;;;;;;;;46311:18;;46358:4;46350:12;;:4;:12;;;;:32;;;;;46378:4;46366:16;;:8;:16;;;;46350:32;46346:50;;;46391:5;46384:12;;;;;;;;46346:50;46479:4;46471:12;;:4;:12;;;;;:28;;;;;46495:4;46487:12;;:4;:12;;;;;46471:28;46469:31;:89;;;;;46537:4;46529:12;;:4;:12;;;;;:28;;;;;46553:4;46545:12;;:4;:12;;;;;46529:28;46527:31;46469:89;:147;;;;;46595:4;46587:12;;:4;:12;;;;;:28;;;;;46611:4;46603:12;;:4;:12;;;;;46587:28;46585:31;46469:147;:189;;;;;46653:4;46645:12;;:4;:12;;;;46643:15;46469:189;46448:263;;;46706:5;46699:12;;;;;;;;46448:263;46739:4;46728:15;;46296:459;46292:3;;;;;:::i;:::-;;;;46268:487;;;;46774:4;46767:11;;;;45864:922;;;;:::o;42350:101::-;42394:7;42421:22;:12;:20;:22::i;:::-;42414:29;;42350:101;:::o;41356:512::-;38738:1;39336:7;;:19;;39328:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;38738:1;39469:7;:18;;;;41411:16:::1;;;;;;;;;;;41403:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;41504:1;41469:11;;;;;;;;;;;41457:34;;;41492:10;41457:46;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:48;41449:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;41554:9;41540:23;;:10;:23;;;41532:32;;;::::0;::::1;;41580:15;:27;41596:10;41580:27;;;;;;;;;;;;;;;;;;;;;;;;;41579:28;41571:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;41641:17;41686:1;41661:22;:12;:20;:22::i;:::-;:26;;;;:::i;:::-;41641:46;;39970:4;41702:9;:22;;41694:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;41750:24;:12;:22;:24::i;:::-;41785:32;41795:10;41807:9;41785;:32::i;:::-;41858:4;41828:15;:27;41844:10;41828:27;;;;;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;41396:472;38694:1:::0;39648:7;:22;;;;41356:512::o;34295:87::-;34341:7;34368:6;;;;;;;;;;;34361:13;;34295:87;:::o;46834:506::-;46891:13;46916:17;46942:3;46916:30;;46957:19;46989:4;:11;46979:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46957:44;;47017:6;47012:289;47033:4;:11;47029:1;:15;47012:289;;;47125:2;47113:4;47118:1;47113:7;;;;;;;;:::i;:::-;;;;;;;;;;47107:14;;:20;;;;47106:48;;;;;47151:2;47139:4;47144:1;47139:7;;;;;;;;:::i;:::-;;;;;;;;;;47133:14;;:20;;;;47106:48;47102:188;;;47211:2;47200:4;47205:1;47200:7;;;;;;;;:::i;:::-;;;;;;;;;;47194:14;;:19;;;;:::i;:::-;47187:27;;47175:6;47182:1;47175:9;;;;;;;;:::i;:::-;;;;;:39;;;;;;;;;;;47102:188;;;47267:4;47272:1;47267:7;;;;;;;;:::i;:::-;;;;;;;;;;47255:6;47262:1;47255:9;;;;;;;;:::i;:::-;;;;;:19;;;;;;;;;;;47102:188;47046:3;;;;;:::i;:::-;;;;47012:289;;;;47325:6;47311:21;;;;46834:506;;;:::o;21373:104::-;21429:13;21462:7;21455:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21373:104;:::o;23057:155::-;23152:52;23171:12;:10;:12::i;:::-;23185:8;23195;23152:18;:52::i;:::-;23057:155;;:::o;40071:38::-;;;;;;;;;;;;;:::o;39934:40::-;39970:4;39934:40;:::o;24180:328::-;24355:41;24374:12;:10;:12::i;:::-;24388:7;24355:18;:41::i;:::-;24347:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24461:39;24475:4;24481:2;24485:7;24494:5;24461:13;:39::i;:::-;24180:328;;;;:::o;40028:36::-;;;;;;;;;;;;;:::o;40116:81::-;;;;;;;;;;;;;:::o;43065:1050::-;43163:13;43196:16;43204:7;43196;:16::i;:::-;43188:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;43345:744;43433:17;43442:7;43433:8;:17::i;:::-;43455:10;:19;43466:7;43455:19;;;;;;;;;;;43638:8;:17;43647:7;43638:17;;;;;;;;;;;43727:10;:19;43738:7;43727:19;;;;;;;;;;;43818:10;:19;43829:7;43818:19;;;;;;;;;;;43909:10;:19;43920:7;43909:19;;;;;;;;;;;43999:14;44015:17;44024:7;44015:8;:17::i;:::-;43366:710;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;43345:6;:744::i;:::-;43272:828;;;;;;;;:::i;:::-;;;;;;;;;;;;;43241:868;;43065:1050;;;:::o;40336:47::-;;;;;;;;;;;;;;;;;;;;;;:::o;44166:1089::-;44338:13;44354:16;44362:7;44354;:16::i;:::-;44338:32;;44405:5;44389:21;;:12;:10;:12::i;:::-;:21;;;44381:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;44494:4;44465:33;;:25;44482:7;44465:16;:25::i;:::-;:33;;;44457:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;44569:4;44542:31;;:23;44559:5;44542:16;:23::i;:::-;:31;;;44534:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;44647:4;44618:33;;:25;44635:7;44618:16;:25::i;:::-;:33;;;44610:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;44725:4;44696:33;;:25;44713:7;44696:16;:25::i;:::-;:33;;;44688:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;44803:4;44774:33;;:25;44791:7;44774:16;:25::i;:::-;:33;;;44766:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;44868:7;44846:10;:19;44857:7;44846:19;;;;;;;;;;;:29;;;;;;;;;;;;:::i;:::-;;44906:5;44886:8;:17;44895:7;44886:17;;;;;;;;;;;:25;;;;;;;;;;;;:::i;:::-;;44944:7;44922:10;:19;44933:7;44922:19;;;;;;;;;;;:29;;;;;;;;;;;;:::i;:::-;;44984:7;44962:10;:19;44973:7;44962:19;;;;;;;;;;;:29;;;;;;;;;;;;:::i;:::-;;45024:7;45002:10;:19;45013:7;45002:19;;;;;;;;;;;:29;;;;;;;;;;;;:::i;:::-;;45058:7;45047:28;45067:7;45047:28;;;;;;:::i;:::-;;;;;;;;45100:7;45091:24;45109:5;45091:24;;;;;;:::i;:::-;;;;;;;;45142:7;45131:28;45151:7;45131:28;;;;;;:::i;:::-;;;;;;;;45186:7;45175:28;45195:7;45175:28;;;;;;:::i;:::-;;;;;;;;45230:7;45219:28;45239:7;45219:28;;;;;;:::i;:::-;;;;;;;;44327:928;44166:1089;;;;;;:::o;42225:117::-;42273:7;42312:22;:12;:20;:22::i;:::-;39970:4;42300:34;;;;:::i;:::-;42293:41;;42225:117;:::o;42675:104::-;34526:12;:10;:12::i;:::-;34515:23;;:7;:5;:7::i;:::-;:23;;;34507:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42753:18:::1;;;;;;;;;;;42752:19;42731:18;;:40;;;;;;;;;;;;;;;;;;42675:104::o:0;23283:164::-;23380:4;23404:18;:25;23423:5;23404:25;;;;;;;;;;;;;;;:35;23430:8;23404:35;;;;;;;;;;;;;;;;;;;;;;;;;23397:42;;23283:164;;;;:::o;40787:541::-;38738:1;39336:7;;:19;;39328:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;38738:1;39469:7;:18;;;;40846:20:::1;;;;;;;;;;;40838:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;40953:1;40908:21;;;;;;;;;;;40896:44;;;40941:10;40896:56;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:58;40888:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;41014:9;41000:23;;:10;:23;;;40992:32;;;::::0;::::1;;41040:15;:27;41056:10;41040:27;;;;;;;;;;;;;;;;;;;;;;;;;41039:28;41031:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;41101:17;41146:1;41121:22;:12;:20;:22::i;:::-;:26;;;;:::i;:::-;41101:46;;39970:4;41162:9;:22;;41154:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;41210:24;:12;:22;:24::i;:::-;41245:32;41255:10;41267:9;41245;:32::i;:::-;41318:4;41288:15;:27;41304:10;41288:27;;;;;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;40831:497;38694:1:::0;39648:7;:22;;;;40787:541::o;35204:201::-;34526:12;:10;:12::i;:::-;34515:23;;:7;:5;:7::i;:::-;:23;;;34507:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35313:1:::1;35293:22;;:8;:22;;;;35285:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;35369:28;35388:8;35369:18;:28::i;:::-;35204:201:::0;:::o;41893:320::-;38738:1;39336:7;;:19;;39328:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;38738:1;39469:7;:18;;;;41950::::1;;;;;;;;;;;41942:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;42012:9;41998:23;;:10;:23;;;41990:32;;;::::0;::::1;;42031:17;42076:1;42051:22;:12;:20;:22::i;:::-;:26;;;;:::i;:::-;42031:46;;39970:4;42092:9;:22;;42084:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;42140:24;:12;:22;:24::i;:::-;42175:32;42185:10;42197:9;42175;:32::i;:::-;41935:278;38694:1:::0;39648:7;:22;;;;41893:320::o;18868:157::-;18953:4;18992:25;18977:40;;;:11;:40;;;;18970:47;;18868:157;;;:::o;26018:127::-;26083:4;26135:1;26107:30;;:7;:16;26115:7;26107:16;;;;;;;;;;;;;;;;;;;;;:30;;;;26100:37;;26018:127;;;:::o;15969:98::-;16022:7;16049:10;16042:17;;15969:98;:::o;30164:174::-;30266:2;30239:15;:24;30255:7;30239:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30322:7;30318:2;30284:46;;30293:23;30308:7;30293:14;:23::i;:::-;30284:46;;;;;;;;;;;;30164:174;;:::o;26312:348::-;26405:4;26430:16;26438:7;26430;:16::i;:::-;26422:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26506:13;26522:23;26537:7;26522:14;:23::i;:::-;26506:39;;26575:5;26564:16;;:7;:16;;;:52;;;;26584:32;26601:5;26608:7;26584:16;:32::i;:::-;26564:52;:87;;;;26644:7;26620:31;;:20;26632:7;26620:11;:20::i;:::-;:31;;;26564:87;26556:96;;;26312:348;;;;:::o;29421:625::-;29580:4;29553:31;;:23;29568:7;29553:14;:23::i;:::-;:31;;;29545:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;29659:1;29645:16;;:2;:16;;;;29637:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;29715:39;29736:4;29742:2;29746:7;29715:20;:39::i;:::-;29819:29;29836:1;29840:7;29819:8;:29::i;:::-;29880:1;29861:9;:15;29871:4;29861:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;29909:1;29892:9;:13;29902:2;29892:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29940:2;29921:7;:16;29929:7;29921:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29979:7;29975:2;29960:27;;29969:4;29960:27;;;;;;;;;;;;30000:38;30020:4;30026:2;30030:7;30000:19;:38::i;:::-;29421:625;;;:::o;35565:191::-;35639:16;35658:6;;;;;;;;;;;35639:25;;35684:8;35675:6;;:17;;;;;;;;;;;;;;;;;;35739:8;35708:40;;35729:8;35708:40;;;;;;;;;;;;35628:128;35565:191;:::o;36494:114::-;36559:7;36586;:14;;;36579:21;;36494:114;;;:::o;36616:127::-;36723:1;36705:7;:14;;;:19;;;;;;;;;;;36616:127;:::o;27002:110::-;27078:26;27088:2;27092:7;27078:26;;;;;;;;;;;;:9;:26::i;:::-;27002:110;;:::o;30480:315::-;30635:8;30626:17;;:5;:17;;;;30618:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;30722:8;30684:18;:25;30703:5;30684:25;;;;;;;;;;;;;;;:35;30710:8;30684:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;30768:8;30746:41;;30761:5;30746:41;;;30778:8;30746:41;;;;;;:::i;:::-;;;;;;;;30480:315;;;:::o;25390:::-;25547:28;25557:4;25563:2;25567:7;25547:9;:28::i;:::-;25594:48;25617:4;25623:2;25627:7;25636:5;25594:22;:48::i;:::-;25586:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;25390:315;;;;:::o;49659:513::-;49727:27;49776:1;49770:2;:7;49766:40;;;49788:10;;;;;;;;;;;;;;;;;;;;;49766:40;49812:9;49824:2;49812:14;;49833:11;49851:53;49863:1;49858;:6;49851:53;;49875:5;;;;;:::i;:::-;;;;49894:2;49889:7;;;;;:::i;:::-;;;49851:53;;;49910:17;49940:3;49930:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49910:34;;49951:9;49963:3;49951:15;;49973:168;49986:1;49980:2;:7;49973:168;;50006:1;50002;:5;;;;:::i;:::-;49998:9;;50016:10;50058:2;50052;50047;:7;;;;:::i;:::-;50046:14;;;;:::i;:::-;50041:2;:19;;;;:::i;:::-;50030:2;:31;;;;:::i;:::-;50016:46;;50071:9;50090:4;50083:12;;50071:24;;50114:2;50104:4;50109:1;50104:7;;;;;;;;:::i;:::-;;;;;:12;;;;;;;;;;;50131:2;50125:8;;;;;:::i;:::-;;;49989:152;;49973:168;;;50161:4;50147:19;;;;;;49659:513;;;;:::o;47569:2037::-;47627:13;47672:1;47657:4;:11;:16;47653:31;;;47675:9;;;;;;;;;;;;;;;;47653:31;47744:19;47766:5;;;;;;;;;;;;;;;;;47744:27;;47823:18;47869:1;47864;47850:4;:11;:15;;;;:::i;:::-;47849:21;;;;:::i;:::-;47844:1;:27;;;;:::i;:::-;47823:48;;47954:20;48001:2;47988:10;:15;;;;:::i;:::-;47977:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47954:50;;48101:10;48093:6;48086:26;48208:1;48201:5;48197:13;48279:4;48330;48324:11;48315:7;48311:25;48438:2;48430:6;48426:15;48523:810;48542:6;48533:7;48530:19;48523:810;;;48608:1;48599:7;48595:15;48584:26;;48695:7;48689:14;48842:4;48834:5;48830:2;48826:14;48822:25;48812:8;48808:40;48802:47;48797:3;48793:57;48782:9;48775:76;48896:1;48885:9;48881:17;48868:30;;48982:4;48974:5;48970:2;48966:14;48962:25;48952:8;48948:40;48942:47;48937:3;48933:57;48922:9;48915:76;49036:1;49025:9;49021:17;49008:30;;49122:4;49114:5;49111:1;49106:14;49102:25;49092:8;49088:40;49082:47;49077:3;49073:57;49062:9;49055:76;49176:1;49165:9;49161:17;49148:30;;49262:4;49254:5;49242:25;49232:8;49228:40;49222:47;49217:3;49213:57;49202:9;49195:76;49316:1;49305:9;49301:17;49288:30;;48566:767;48523:810;;;49418:1;49411:4;49405:11;49401:19;49439:1;49434:54;;;;49507:1;49502:52;;;;49394:160;;49434:54;49478:6;49473:3;49469:16;49465:1;49454:9;49450:17;49443:43;49434:54;;49502:52;49546:4;49541:3;49537:14;49533:1;49522:9;49518:17;49511:41;49394:160;;48026:1539;;;;49592:6;49585:13;;;;;47569:2037;;;;:::o;32731:126::-;;;;:::o;33242:125::-;;;;:::o;27339:321::-;27469:18;27475:2;27479:7;27469:5;:18::i;:::-;27520:54;27551:1;27555:2;27559:7;27568:5;27520:22;:54::i;:::-;27498:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;27339:321;;;:::o;31360:799::-;31515:4;31536:15;:2;:13;;;:15::i;:::-;31532:620;;;31588:2;31572:36;;;31609:12;:10;:12::i;:::-;31623:4;31629:7;31638:5;31572:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;31568:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31831:1;31814:6;:13;:18;31810:272;;;31857:60;;;;;;;;;;:::i;:::-;;;;;;;;31810:272;32032:6;32026:13;32017:6;32013:2;32009:15;32002:38;31568:529;31705:41;;;31695:51;;;:6;:51;;;;31688:58;;;;;31532:620;32136:4;32129:11;;31360:799;;;;;;;:::o;27996:439::-;28090:1;28076:16;;:2;:16;;;;28068:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;28149:16;28157:7;28149;:16::i;:::-;28148:17;28140:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28211:45;28240:1;28244:2;28248:7;28211:20;:45::i;:::-;28286:1;28269:9;:13;28279:2;28269:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;28317:2;28298:7;:16;28306:7;28298:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;28362:7;28358:2;28337:33;;28354:1;28337:33;;;;;;;;;;;;28383:44;28411:1;28415:2;28419:7;28383:19;:44::i;:::-;27996:439;;:::o;8159:326::-;8219:4;8476:1;8454:7;:19;;;:23;8447:30;;8159:326;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:619::-;5015:6;5023;5031;5080:2;5068:9;5059:7;5055:23;5051:32;5048:119;;;5086:79;;:::i;:::-;5048:119;5206:1;5231:53;5276:7;5267:6;5256:9;5252:22;5231:53;:::i;:::-;5221:63;;5177:117;5333:2;5359:53;5404:7;5395:6;5384:9;5380:22;5359:53;:::i;:::-;5349:63;;5304:118;5461:2;5487:53;5532:7;5523:6;5512:9;5508:22;5487:53;:::i;:::-;5477:63;;5432:118;4938:619;;;;;:::o;5563:117::-;5672:1;5669;5662:12;5686:117;5795:1;5792;5785:12;5809:180;5857:77;5854:1;5847:88;5954:4;5951:1;5944:15;5978:4;5975:1;5968:15;5995:281;6078:27;6100:4;6078:27;:::i;:::-;6070:6;6066:40;6208:6;6196:10;6193:22;6172:18;6160:10;6157:34;6154:62;6151:88;;;6219:18;;:::i;:::-;6151:88;6259:10;6255:2;6248:22;6038:238;5995:281;;:::o;6282:129::-;6316:6;6343:20;;:::i;:::-;6333:30;;6372:33;6400:4;6392:6;6372:33;:::i;:::-;6282:129;;;:::o;6417:308::-;6479:4;6569:18;6561:6;6558:30;6555:56;;;6591:18;;:::i;:::-;6555:56;6629:29;6651:6;6629:29;:::i;:::-;6621:37;;6713:4;6707;6703:15;6695:23;;6417:308;;;:::o;6731:154::-;6815:6;6810:3;6805;6792:30;6877:1;6868:6;6863:3;6859:16;6852:27;6731:154;;;:::o;6891:412::-;6969:5;6994:66;7010:49;7052:6;7010:49;:::i;:::-;6994:66;:::i;:::-;6985:75;;7083:6;7076:5;7069:21;7121:4;7114:5;7110:16;7159:3;7150:6;7145:3;7141:16;7138:25;7135:112;;;7166:79;;:::i;:::-;7135:112;7256:41;7290:6;7285:3;7280;7256:41;:::i;:::-;6975:328;6891:412;;;;;:::o;7323:340::-;7379:5;7428:3;7421:4;7413:6;7409:17;7405:27;7395:122;;7436:79;;:::i;:::-;7395:122;7553:6;7540:20;7578:79;7653:3;7645:6;7638:4;7630:6;7626:17;7578:79;:::i;:::-;7569:88;;7385:278;7323:340;;;;:::o;7669:509::-;7738:6;7787:2;7775:9;7766:7;7762:23;7758:32;7755:119;;;7793:79;;:::i;:::-;7755:119;7941:1;7930:9;7926:17;7913:31;7971:18;7963:6;7960:30;7957:117;;;7993:79;;:::i;:::-;7957:117;8098:63;8153:7;8144:6;8133:9;8129:22;8098:63;:::i;:::-;8088:73;;7884:287;7669:509;;;;:::o;8184:329::-;8243:6;8292:2;8280:9;8271:7;8267:23;8263:32;8260:119;;;8298:79;;:::i;:::-;8260:119;8418:1;8443:53;8488:7;8479:6;8468:9;8464:22;8443:53;:::i;:::-;8433:63;;8389:117;8184:329;;;;:::o;8519:118::-;8606:24;8624:5;8606:24;:::i;:::-;8601:3;8594:37;8519:118;;:::o;8643:222::-;8736:4;8774:2;8763:9;8759:18;8751:26;;8787:71;8855:1;8844:9;8840:17;8831:6;8787:71;:::i;:::-;8643:222;;;;:::o;8871:116::-;8941:21;8956:5;8941:21;:::i;:::-;8934:5;8931:32;8921:60;;8977:1;8974;8967:12;8921:60;8871:116;:::o;8993:133::-;9036:5;9074:6;9061:20;9052:29;;9090:30;9114:5;9090:30;:::i;:::-;8993:133;;;;:::o;9132:468::-;9197:6;9205;9254:2;9242:9;9233:7;9229:23;9225:32;9222:119;;;9260:79;;:::i;:::-;9222:119;9380:1;9405:53;9450:7;9441:6;9430:9;9426:22;9405:53;:::i;:::-;9395:63;;9351:117;9507:2;9533:50;9575:7;9566:6;9555:9;9551:22;9533:50;:::i;:::-;9523:60;;9478:115;9132:468;;;;;:::o;9606:307::-;9667:4;9757:18;9749:6;9746:30;9743:56;;;9779:18;;:::i;:::-;9743:56;9817:29;9839:6;9817:29;:::i;:::-;9809:37;;9901:4;9895;9891:15;9883:23;;9606:307;;;:::o;9919:410::-;9996:5;10021:65;10037:48;10078:6;10037:48;:::i;:::-;10021:65;:::i;:::-;10012:74;;10109:6;10102:5;10095:21;10147:4;10140:5;10136:16;10185:3;10176:6;10171:3;10167:16;10164:25;10161:112;;;10192:79;;:::i;:::-;10161:112;10282:41;10316:6;10311:3;10306;10282:41;:::i;:::-;10002:327;9919:410;;;;;:::o;10348:338::-;10403:5;10452:3;10445:4;10437:6;10433:17;10429:27;10419:122;;10460:79;;:::i;:::-;10419:122;10577:6;10564:20;10602:78;10676:3;10668:6;10661:4;10653:6;10649:17;10602:78;:::i;:::-;10593:87;;10409:277;10348:338;;;;:::o;10692:943::-;10787:6;10795;10803;10811;10860:3;10848:9;10839:7;10835:23;10831:33;10828:120;;;10867:79;;:::i;:::-;10828:120;10987:1;11012:53;11057:7;11048:6;11037:9;11033:22;11012:53;:::i;:::-;11002:63;;10958:117;11114:2;11140:53;11185:7;11176:6;11165:9;11161:22;11140:53;:::i;:::-;11130:63;;11085:118;11242:2;11268:53;11313:7;11304:6;11293:9;11289:22;11268:53;:::i;:::-;11258:63;;11213:118;11398:2;11387:9;11383:18;11370:32;11429:18;11421:6;11418:30;11415:117;;;11451:79;;:::i;:::-;11415:117;11556:62;11610:7;11601:6;11590:9;11586:22;11556:62;:::i;:::-;11546:72;;11341:287;10692:943;;;;;;;:::o;11641:1957::-;11795:6;11803;11811;11819;11827;11835;11884:3;11872:9;11863:7;11859:23;11855:33;11852:120;;;11891:79;;:::i;:::-;11852:120;12011:1;12036:53;12081:7;12072:6;12061:9;12057:22;12036:53;:::i;:::-;12026:63;;11982:117;12166:2;12155:9;12151:18;12138:32;12197:18;12189:6;12186:30;12183:117;;;12219:79;;:::i;:::-;12183:117;12324:63;12379:7;12370:6;12359:9;12355:22;12324:63;:::i;:::-;12314:73;;12109:288;12464:2;12453:9;12449:18;12436:32;12495:18;12487:6;12484:30;12481:117;;;12517:79;;:::i;:::-;12481:117;12622:63;12677:7;12668:6;12657:9;12653:22;12622:63;:::i;:::-;12612:73;;12407:288;12762:2;12751:9;12747:18;12734:32;12793:18;12785:6;12782:30;12779:117;;;12815:79;;:::i;:::-;12779:117;12920:63;12975:7;12966:6;12955:9;12951:22;12920:63;:::i;:::-;12910:73;;12705:288;13060:3;13049:9;13045:19;13032:33;13092:18;13084:6;13081:30;13078:117;;;13114:79;;:::i;:::-;13078:117;13219:63;13274:7;13265:6;13254:9;13250:22;13219:63;:::i;:::-;13209:73;;13003:289;13359:3;13348:9;13344:19;13331:33;13391:18;13383:6;13380:30;13377:117;;;13413:79;;:::i;:::-;13377:117;13518:63;13573:7;13564:6;13553:9;13549:22;13518:63;:::i;:::-;13508:73;;13302:289;11641:1957;;;;;;;;:::o;13604:474::-;13672:6;13680;13729:2;13717:9;13708:7;13704:23;13700:32;13697:119;;;13735:79;;:::i;:::-;13697:119;13855:1;13880:53;13925:7;13916:6;13905:9;13901:22;13880:53;:::i;:::-;13870:63;;13826:117;13982:2;14008:53;14053:7;14044:6;14033:9;14029:22;14008:53;:::i;:::-;13998:63;;13953:118;13604:474;;;;;:::o;14084:180::-;14132:77;14129:1;14122:88;14229:4;14226:1;14219:15;14253:4;14250:1;14243:15;14270:320;14314:6;14351:1;14345:4;14341:12;14331:22;;14398:1;14392:4;14388:12;14419:18;14409:81;;14475:4;14467:6;14463:17;14453:27;;14409:81;14537:2;14529:6;14526:14;14506:18;14503:38;14500:84;;;14556:18;;:::i;:::-;14500:84;14321:269;14270:320;;;:::o;14596:231::-;14736:34;14732:1;14724:6;14720:14;14713:58;14805:14;14800:2;14792:6;14788:15;14781:39;14596:231;:::o;14833:366::-;14975:3;14996:67;15060:2;15055:3;14996:67;:::i;:::-;14989:74;;15072:93;15161:3;15072:93;:::i;:::-;15190:2;15185:3;15181:12;15174:19;;14833:366;;;:::o;15205:419::-;15371:4;15409:2;15398:9;15394:18;15386:26;;15458:9;15452:4;15448:20;15444:1;15433:9;15429:17;15422:47;15486:131;15612:4;15486:131;:::i;:::-;15478:139;;15205:419;;;:::o;15630:220::-;15770:34;15766:1;15758:6;15754:14;15747:58;15839:3;15834:2;15826:6;15822:15;15815:28;15630:220;:::o;15856:366::-;15998:3;16019:67;16083:2;16078:3;16019:67;:::i;:::-;16012:74;;16095:93;16184:3;16095:93;:::i;:::-;16213:2;16208:3;16204:12;16197:19;;15856:366;;;:::o;16228:419::-;16394:4;16432:2;16421:9;16417:18;16409:26;;16481:9;16475:4;16471:20;16467:1;16456:9;16452:17;16445:47;16509:131;16635:4;16509:131;:::i;:::-;16501:139;;16228:419;;;:::o;16653:243::-;16793:34;16789:1;16781:6;16777:14;16770:58;16862:26;16857:2;16849:6;16845:15;16838:51;16653:243;:::o;16902:366::-;17044:3;17065:67;17129:2;17124:3;17065:67;:::i;:::-;17058:74;;17141:93;17230:3;17141:93;:::i;:::-;17259:2;17254:3;17250:12;17243:19;;16902:366;;;:::o;17274:419::-;17440:4;17478:2;17467:9;17463:18;17455:26;;17527:9;17521:4;17517:20;17513:1;17502:9;17498:17;17491:47;17555:131;17681:4;17555:131;:::i;:::-;17547:139;;17274:419;;;:::o;17699:182::-;17839:34;17835:1;17827:6;17823:14;17816:58;17699:182;:::o;17887:366::-;18029:3;18050:67;18114:2;18109:3;18050:67;:::i;:::-;18043:74;;18126:93;18215:3;18126:93;:::i;:::-;18244:2;18239:3;18235:12;18228:19;;17887:366;;;:::o;18259:419::-;18425:4;18463:2;18452:9;18448:18;18440:26;;18512:9;18506:4;18502:20;18498:1;18487:9;18483:17;18476:47;18540:131;18666:4;18540:131;:::i;:::-;18532:139;;18259:419;;;:::o;18684:236::-;18824:34;18820:1;18812:6;18808:14;18801:58;18893:19;18888:2;18880:6;18876:15;18869:44;18684:236;:::o;18926:366::-;19068:3;19089:67;19153:2;19148:3;19089:67;:::i;:::-;19082:74;;19165:93;19254:3;19165:93;:::i;:::-;19283:2;19278:3;19274:12;19267:19;;18926:366;;;:::o;19298:419::-;19464:4;19502:2;19491:9;19487:18;19479:26;;19551:9;19545:4;19541:20;19537:1;19526:9;19522:17;19515:47;19579:131;19705:4;19579:131;:::i;:::-;19571:139;;19298:419;;;:::o;19723:228::-;19863:34;19859:1;19851:6;19847:14;19840:58;19932:11;19927:2;19919:6;19915:15;19908:36;19723:228;:::o;19957:366::-;20099:3;20120:67;20184:2;20179:3;20120:67;:::i;:::-;20113:74;;20196:93;20285:3;20196:93;:::i;:::-;20314:2;20309:3;20305:12;20298:19;;19957:366;;;:::o;20329:419::-;20495:4;20533:2;20522:9;20518:18;20510:26;;20582:9;20576:4;20572:20;20568:1;20557:9;20553:17;20546:47;20610:131;20736:4;20610:131;:::i;:::-;20602:139;;20329:419;;;:::o;20754:229::-;20894:34;20890:1;20882:6;20878:14;20871:58;20963:12;20958:2;20950:6;20946:15;20939:37;20754:229;:::o;20989:366::-;21131:3;21152:67;21216:2;21211:3;21152:67;:::i;:::-;21145:74;;21228:93;21317:3;21228:93;:::i;:::-;21346:2;21341:3;21337:12;21330:19;;20989:366;;;:::o;21361:419::-;21527:4;21565:2;21554:9;21550:18;21542:26;;21614:9;21608:4;21604:20;21600:1;21589:9;21585:17;21578:47;21642:131;21768:4;21642:131;:::i;:::-;21634:139;;21361:419;;;:::o;21786:180::-;21834:77;21831:1;21824:88;21931:4;21928:1;21921:15;21955:4;21952:1;21945:15;21972:180;22020:77;22017:1;22010:88;22117:4;22114:1;22107:15;22141:4;22138:1;22131:15;22158:191;22198:4;22218:20;22236:1;22218:20;:::i;:::-;22213:25;;22252:20;22270:1;22252:20;:::i;:::-;22247:25;;22291:1;22288;22285:8;22282:34;;;22296:18;;:::i;:::-;22282:34;22341:1;22338;22334:9;22326:17;;22158:191;;;;:::o;22355:233::-;22394:3;22417:24;22435:5;22417:24;:::i;:::-;22408:33;;22463:66;22456:5;22453:77;22450:103;;;22533:18;;:::i;:::-;22450:103;22580:1;22573:5;22569:13;22562:20;;22355:233;;;:::o;22594:181::-;22734:33;22730:1;22722:6;22718:14;22711:57;22594:181;:::o;22781:366::-;22923:3;22944:67;23008:2;23003:3;22944:67;:::i;:::-;22937:74;;23020:93;23109:3;23020:93;:::i;:::-;23138:2;23133:3;23129:12;23122:19;;22781:366;;;:::o;23153:419::-;23319:4;23357:2;23346:9;23342:18;23334:26;;23406:9;23400:4;23396:20;23392:1;23381:9;23377:17;23370:47;23434:131;23560:4;23434:131;:::i;:::-;23426:139;;23153:419;;;:::o;23578:160::-;23718:12;23714:1;23706:6;23702:14;23695:36;23578:160;:::o;23744:366::-;23886:3;23907:67;23971:2;23966:3;23907:67;:::i;:::-;23900:74;;23983:93;24072:3;23983:93;:::i;:::-;24101:2;24096:3;24092:12;24085:19;;23744:366;;;:::o;24116:419::-;24282:4;24320:2;24309:9;24305:18;24297:26;;24369:9;24363:4;24359:20;24355:1;24344:9;24340:17;24333:47;24397:131;24523:4;24397:131;:::i;:::-;24389:139;;24116:419;;;:::o;24541:143::-;24598:5;24629:6;24623:13;24614:22;;24645:33;24672:5;24645:33;:::i;:::-;24541:143;;;;:::o;24690:351::-;24760:6;24809:2;24797:9;24788:7;24784:23;24780:32;24777:119;;;24815:79;;:::i;:::-;24777:119;24935:1;24960:64;25016:7;25007:6;24996:9;24992:22;24960:64;:::i;:::-;24950:74;;24906:128;24690:351;;;;:::o;25047:166::-;25187:18;25183:1;25175:6;25171:14;25164:42;25047:166;:::o;25219:366::-;25361:3;25382:67;25446:2;25441:3;25382:67;:::i;:::-;25375:74;;25458:93;25547:3;25458:93;:::i;:::-;25576:2;25571:3;25567:12;25560:19;;25219:366;;;:::o;25591:419::-;25757:4;25795:2;25784:9;25780:18;25772:26;;25844:9;25838:4;25834:20;25830:1;25819:9;25815:17;25808:47;25872:131;25998:4;25872:131;:::i;:::-;25864:139;;25591:419;;;:::o;26016:170::-;26156:22;26152:1;26144:6;26140:14;26133:46;26016:170;:::o;26192:366::-;26334:3;26355:67;26419:2;26414:3;26355:67;:::i;:::-;26348:74;;26431:93;26520:3;26431:93;:::i;:::-;26549:2;26544:3;26540:12;26533:19;;26192:366;;;:::o;26564:419::-;26730:4;26768:2;26757:9;26753:18;26745:26;;26817:9;26811:4;26807:20;26803:1;26792:9;26788:17;26781:47;26845:131;26971:4;26845:131;:::i;:::-;26837:139;;26564:419;;;:::o;26989:305::-;27029:3;27048:20;27066:1;27048:20;:::i;:::-;27043:25;;27082:20;27100:1;27082:20;:::i;:::-;27077:25;;27236:1;27168:66;27164:74;27161:1;27158:81;27155:107;;;27242:18;;:::i;:::-;27155:107;27286:1;27283;27279:9;27272:16;;26989:305;;;;:::o;27300:158::-;27440:10;27436:1;27428:6;27424:14;27417:34;27300:158;:::o;27464:365::-;27606:3;27627:66;27691:1;27686:3;27627:66;:::i;:::-;27620:73;;27702:93;27791:3;27702:93;:::i;:::-;27820:2;27815:3;27811:12;27804:19;;27464:365;;;:::o;27835:419::-;28001:4;28039:2;28028:9;28024:18;28016:26;;28088:9;28082:4;28078:20;28074:1;28063:9;28059:17;28052:47;28116:131;28242:4;28116:131;:::i;:::-;28108:139;;27835:419;;;:::o;28260:86::-;28295:7;28335:4;28328:5;28324:16;28313:27;;28260:86;;;:::o;28352:237::-;28390:3;28409:18;28425:1;28409:18;:::i;:::-;28404:23;;28441:18;28457:1;28441:18;:::i;:::-;28436:23;;28531:1;28525:4;28521:12;28518:1;28515:19;28512:45;;;28537:18;;:::i;:::-;28512:45;28581:1;28578;28574:9;28567:16;;28352:237;;;;:::o;28595:165::-;28735:17;28731:1;28723:6;28719:14;28712:41;28595:165;:::o;28766:366::-;28908:3;28929:67;28993:2;28988:3;28929:67;:::i;:::-;28922:74;;29005:93;29094:3;29005:93;:::i;:::-;29123:2;29118:3;29114:12;29107:19;;28766:366;;;:::o;29138:419::-;29304:4;29342:2;29331:9;29327:18;29319:26;;29391:9;29385:4;29381:20;29377:1;29366:9;29362:17;29355:47;29419:131;29545:4;29419:131;:::i;:::-;29411:139;;29138:419;;;:::o;29563:148::-;29665:11;29702:3;29687:18;;29563:148;;;;:::o;29717:214::-;29857:66;29853:1;29845:6;29841:14;29834:90;29717:214;:::o;29937:402::-;30097:3;30118:85;30200:2;30195:3;30118:85;:::i;:::-;30111:92;;30212:93;30301:3;30212:93;:::i;:::-;30330:2;30325:3;30321:12;30314:19;;29937:402;;;:::o;30345:377::-;30451:3;30479:39;30512:5;30479:39;:::i;:::-;30534:89;30616:6;30611:3;30534:89;:::i;:::-;30527:96;;30632:52;30677:6;30672:3;30665:4;30658:5;30654:16;30632:52;:::i;:::-;30709:6;30704:3;30700:16;30693:23;;30455:267;30345:377;;;;:::o;30728:151::-;30868:3;30864:1;30856:6;30852:14;30845:27;30728:151;:::o;30885:400::-;31045:3;31066:84;31148:1;31143:3;31066:84;:::i;:::-;31059:91;;31159:93;31248:3;31159:93;:::i;:::-;31277:1;31272:3;31268:11;31261:18;;30885:400;;;:::o;31291:141::-;31340:4;31363:3;31355:11;;31386:3;31383:1;31376:14;31420:4;31417:1;31407:18;31399:26;;31291:141;;;:::o;31462:845::-;31565:3;31602:5;31596:12;31631:36;31657:9;31631:36;:::i;:::-;31683:89;31765:6;31760:3;31683:89;:::i;:::-;31676:96;;31803:1;31792:9;31788:17;31819:1;31814:137;;;;31965:1;31960:341;;;;31781:520;;31814:137;31898:4;31894:9;31883;31879:25;31874:3;31867:38;31934:6;31929:3;31925:16;31918:23;;31814:137;;31960:341;32027:38;32059:5;32027:38;:::i;:::-;32087:1;32101:154;32115:6;32112:1;32109:13;32101:154;;;32189:7;32183:14;32179:1;32174:3;32170:11;32163:35;32239:1;32230:7;32226:15;32215:26;;32137:4;32134:1;32130:12;32125:17;;32101:154;;;32284:6;32279:3;32275:16;32268:23;;31967:334;;31781:520;;31569:738;;31462:845;;;;:::o;32313:485::-;32453:66;32449:1;32441:6;32437:14;32430:90;32554:34;32549:2;32541:6;32537:15;32530:59;32623:66;32618:2;32610:6;32606:15;32599:91;32724:66;32719:2;32711:6;32707:15;32700:91;32313:485;:::o;32804:404::-;32964:3;32985:86;33067:3;33062;32985:86;:::i;:::-;32978:93;;33080;33169:3;33080:93;:::i;:::-;33198:3;33193;33189:13;33182:20;;32804:404;;;:::o;33214:315::-;33354:66;33350:1;33342:6;33338:14;33331:90;33455:66;33450:2;33442:6;33438:15;33431:91;33214:315;:::o;33535:402::-;33695:3;33716:85;33798:2;33793:3;33716:85;:::i;:::-;33709:92;;33810:93;33899:3;33810:93;:::i;:::-;33928:2;33923:3;33919:12;33912:19;;33535:402;;;:::o;33943:315::-;34083:66;34079:1;34071:6;34067:14;34060:90;34184:66;34179:2;34171:6;34167:15;34160:91;33943:315;:::o;34264:402::-;34424:3;34445:85;34527:2;34522:3;34445:85;:::i;:::-;34438:92;;34539:93;34628:3;34539:93;:::i;:::-;34657:2;34652:3;34648:12;34641:19;;34264:402;;;:::o;34672:315::-;34812:66;34808:1;34800:6;34796:14;34789:90;34913:66;34908:2;34900:6;34896:15;34889:91;34672:315;:::o;34993:402::-;35153:3;35174:85;35256:2;35251:3;35174:85;:::i;:::-;35167:92;;35268:93;35357:3;35268:93;:::i;:::-;35386:2;35381:3;35377:12;35370:19;;34993:402;;;:::o;35401:214::-;35541:66;35537:1;35529:6;35525:14;35518:90;35401:214;:::o;35621:402::-;35781:3;35802:85;35884:2;35879:3;35802:85;:::i;:::-;35795:92;;35896:93;35985:3;35896:93;:::i;:::-;36014:2;36009:3;36005:12;35998:19;;35621:402;;;:::o;36029:154::-;36169:6;36165:1;36157:6;36153:14;36146:30;36029:154;:::o;36189:400::-;36349:3;36370:84;36452:1;36447:3;36370:84;:::i;:::-;36363:91;;36463:93;36552:3;36463:93;:::i;:::-;36581:1;36576:3;36572:11;36565:18;;36189:400;;;:::o;36595:214::-;36735:66;36731:1;36723:6;36719:14;36712:90;36595:214;:::o;36815:400::-;36975:3;36996:84;37078:1;37073:3;36996:84;:::i;:::-;36989:91;;37089:93;37178:3;37089:93;:::i;:::-;37207:1;37202:3;37198:11;37191:18;;36815:400;;;:::o;37221:3753::-;38580:3;38602:148;38746:3;38602:148;:::i;:::-;38595:155;;38767:95;38858:3;38849:6;38767:95;:::i;:::-;38760:102;;38879:148;39023:3;38879:148;:::i;:::-;38872:155;;39044:92;39132:3;39123:6;39044:92;:::i;:::-;39037:99;;39153:148;39297:3;39153:148;:::i;:::-;39146:155;;39318:92;39406:3;39397:6;39318:92;:::i;:::-;39311:99;;39427:148;39571:3;39427:148;:::i;:::-;39420:155;;39592:92;39680:3;39671:6;39592:92;:::i;:::-;39585:99;;39701:148;39845:3;39701:148;:::i;:::-;39694:155;;39866:92;39954:3;39945:6;39866:92;:::i;:::-;39859:99;;39975:148;40119:3;39975:148;:::i;:::-;39968:155;;40140:92;40228:3;40219:6;40140:92;:::i;:::-;40133:99;;40249:148;40393:3;40249:148;:::i;:::-;40242:155;;40414:92;40502:3;40493:6;40414:92;:::i;:::-;40407:99;;40523:95;40614:3;40605:6;40523:95;:::i;:::-;40516:102;;40635:148;40779:3;40635:148;:::i;:::-;40628:155;;40800:148;40944:3;40800:148;:::i;:::-;40793:155;;40965:3;40958:10;;37221:3753;;;;;;;;;;;:::o;40980:179::-;41120:31;41116:1;41108:6;41104:14;41097:55;40980:179;:::o;41165:402::-;41325:3;41346:85;41428:2;41423:3;41346:85;:::i;:::-;41339:92;;41440:93;41529:3;41440:93;:::i;:::-;41558:2;41553:3;41549:12;41542:19;;41165:402;;;:::o;41573:541::-;41806:3;41828:148;41972:3;41828:148;:::i;:::-;41821:155;;41993:95;42084:3;42075:6;41993:95;:::i;:::-;41986:102;;42105:3;42098:10;;41573:541;;;;:::o;42120:181::-;42260:33;42256:1;42248:6;42244:14;42237:57;42120:181;:::o;42307:366::-;42449:3;42470:67;42534:2;42529:3;42470:67;:::i;:::-;42463:74;;42546:93;42635:3;42546:93;:::i;:::-;42664:2;42659:3;42655:12;42648:19;;42307:366;;;:::o;42679:419::-;42845:4;42883:2;42872:9;42868:18;42860:26;;42932:9;42926:4;42922:20;42918:1;42907:9;42903:17;42896:47;42960:131;43086:4;42960:131;:::i;:::-;42952:139;;42679:419;;;:::o;43104:170::-;43244:22;43240:1;43232:6;43228:14;43221:46;43104:170;:::o;43280:366::-;43422:3;43443:67;43507:2;43502:3;43443:67;:::i;:::-;43436:74;;43519:93;43608:3;43519:93;:::i;:::-;43637:2;43632:3;43628:12;43621:19;;43280:366;;;:::o;43652:419::-;43818:4;43856:2;43845:9;43841:18;43833:26;;43905:9;43899:4;43895:20;43891:1;43880:9;43876:17;43869:47;43933:131;44059:4;43933:131;:::i;:::-;43925:139;;43652:419;;;:::o;44077:171::-;44217:23;44213:1;44205:6;44201:14;44194:47;44077:171;:::o;44254:366::-;44396:3;44417:67;44481:2;44476:3;44417:67;:::i;:::-;44410:74;;44493:93;44582:3;44493:93;:::i;:::-;44611:2;44606:3;44602:12;44595:19;;44254:366;;;:::o;44626:419::-;44792:4;44830:2;44819:9;44815:18;44807:26;;44879:9;44873:4;44869:20;44865:1;44854:9;44850:17;44843:47;44907:131;45033:4;44907:131;:::i;:::-;44899:139;;44626:419;;;:::o;45051:177::-;45191:29;45187:1;45179:6;45175:14;45168:53;45051:177;:::o;45234:366::-;45376:3;45397:67;45461:2;45456:3;45397:67;:::i;:::-;45390:74;;45473:93;45562:3;45473:93;:::i;:::-;45591:2;45586:3;45582:12;45575:19;;45234:366;;;:::o;45606:419::-;45772:4;45810:2;45799:9;45795:18;45787:26;;45859:9;45853:4;45849:20;45845:1;45834:9;45830:17;45823:47;45887:131;46013:4;45887:131;:::i;:::-;45879:139;;45606:419;;;:::o;46031:225::-;46171:34;46167:1;46159:6;46155:14;46148:58;46240:8;46235:2;46227:6;46223:15;46216:33;46031:225;:::o;46262:366::-;46404:3;46425:67;46489:2;46484:3;46425:67;:::i;:::-;46418:74;;46501:93;46590:3;46501:93;:::i;:::-;46619:2;46614:3;46610:12;46603:19;;46262:366;;;:::o;46634:419::-;46800:4;46838:2;46827:9;46823:18;46815:26;;46887:9;46881:4;46877:20;46873:1;46862:9;46858:17;46851:47;46915:131;47041:4;46915:131;:::i;:::-;46907:139;;46634:419;;;:::o;47059:231::-;47199:34;47195:1;47187:6;47183:14;47176:58;47268:14;47263:2;47255:6;47251:15;47244:39;47059:231;:::o;47296:366::-;47438:3;47459:67;47523:2;47518:3;47459:67;:::i;:::-;47452:74;;47535:93;47624:3;47535:93;:::i;:::-;47653:2;47648:3;47644:12;47637:19;;47296:366;;;:::o;47668:419::-;47834:4;47872:2;47861:9;47857:18;47849:26;;47921:9;47915:4;47911:20;47907:1;47896:9;47892:17;47885:47;47949:131;48075:4;47949:131;:::i;:::-;47941:139;;47668:419;;;:::o;48093:224::-;48233:34;48229:1;48221:6;48217:14;48210:58;48302:7;48297:2;48289:6;48285:15;48278:32;48093:224;:::o;48323:366::-;48465:3;48486:67;48550:2;48545:3;48486:67;:::i;:::-;48479:74;;48562:93;48651:3;48562:93;:::i;:::-;48680:2;48675:3;48671:12;48664:19;;48323:366;;;:::o;48695:419::-;48861:4;48899:2;48888:9;48884:18;48876:26;;48948:9;48942:4;48938:20;48934:1;48923:9;48919:17;48912:47;48976:131;49102:4;48976:131;:::i;:::-;48968:139;;48695:419;;;:::o;49120:223::-;49260:34;49256:1;49248:6;49244:14;49237:58;49329:6;49324:2;49316:6;49312:15;49305:31;49120:223;:::o;49349:366::-;49491:3;49512:67;49576:2;49571:3;49512:67;:::i;:::-;49505:74;;49588:93;49677:3;49588:93;:::i;:::-;49706:2;49701:3;49697:12;49690:19;;49349:366;;;:::o;49721:419::-;49887:4;49925:2;49914:9;49910:18;49902:26;;49974:9;49968:4;49964:20;49960:1;49949:9;49945:17;49938:47;50002:131;50128:4;50002:131;:::i;:::-;49994:139;;49721:419;;;:::o;50146:175::-;50286:27;50282:1;50274:6;50270:14;50263:51;50146:175;:::o;50327:366::-;50469:3;50490:67;50554:2;50549:3;50490:67;:::i;:::-;50483:74;;50566:93;50655:3;50566:93;:::i;:::-;50684:2;50679:3;50675:12;50668:19;;50327:366;;;:::o;50699:419::-;50865:4;50903:2;50892:9;50888:18;50880:26;;50952:9;50946:4;50942:20;50938:1;50927:9;50923:17;50916:47;50980:131;51106:4;50980:131;:::i;:::-;50972:139;;50699:419;;;:::o;51124:237::-;51264:34;51260:1;51252:6;51248:14;51241:58;51333:20;51328:2;51320:6;51316:15;51309:45;51124:237;:::o;51367:366::-;51509:3;51530:67;51594:2;51589:3;51530:67;:::i;:::-;51523:74;;51606:93;51695:3;51606:93;:::i;:::-;51724:2;51719:3;51715:12;51708:19;;51367:366;;;:::o;51739:419::-;51905:4;51943:2;51932:9;51928:18;51920:26;;51992:9;51986:4;51982:20;51978:1;51967:9;51963:17;51956:47;52020:131;52146:4;52020:131;:::i;:::-;52012:139;;51739:419;;;:::o;52164:180::-;52212:77;52209:1;52202:88;52309:4;52306:1;52299:15;52333:4;52330:1;52323:15;52350:185;52390:1;52407:20;52425:1;52407:20;:::i;:::-;52402:25;;52441:20;52459:1;52441:20;:::i;:::-;52436:25;;52480:1;52470:35;;52485:18;;:::i;:::-;52470:35;52527:1;52524;52520:9;52515:14;;52350:185;;;;:::o;52541:348::-;52581:7;52604:20;52622:1;52604:20;:::i;:::-;52599:25;;52638:20;52656:1;52638:20;:::i;:::-;52633:25;;52826:1;52758:66;52754:74;52751:1;52748:81;52743:1;52736:9;52729:17;52725:105;52722:131;;;52833:18;;:::i;:::-;52722:131;52881:1;52878;52874:9;52863:20;;52541:348;;;;:::o;52895:98::-;52946:6;52980:5;52974:12;52964:22;;52895:98;;;:::o;52999:168::-;53082:11;53116:6;53111:3;53104:19;53156:4;53151:3;53147:14;53132:29;;52999:168;;;;:::o;53173:360::-;53259:3;53287:38;53319:5;53287:38;:::i;:::-;53341:70;53404:6;53399:3;53341:70;:::i;:::-;53334:77;;53420:52;53465:6;53460:3;53453:4;53446:5;53442:16;53420:52;:::i;:::-;53497:29;53519:6;53497:29;:::i;:::-;53492:3;53488:39;53481:46;;53263:270;53173:360;;;;:::o;53539:640::-;53734:4;53772:3;53761:9;53757:19;53749:27;;53786:71;53854:1;53843:9;53839:17;53830:6;53786:71;:::i;:::-;53867:72;53935:2;53924:9;53920:18;53911:6;53867:72;:::i;:::-;53949;54017:2;54006:9;54002:18;53993:6;53949:72;:::i;:::-;54068:9;54062:4;54058:20;54053:2;54042:9;54038:18;54031:48;54096:76;54167:4;54158:6;54096:76;:::i;:::-;54088:84;;53539:640;;;;;;;:::o;54185:141::-;54241:5;54272:6;54266:13;54257:22;;54288:32;54314:5;54288:32;:::i;:::-;54185:141;;;;:::o;54332:349::-;54401:6;54450:2;54438:9;54429:7;54425:23;54421:32;54418:119;;;54456:79;;:::i;:::-;54418:119;54576:1;54601:63;54656:7;54647:6;54636:9;54632:22;54601:63;:::i;:::-;54591:73;;54547:127;54332:349;;;;:::o;54687:182::-;54827:34;54823:1;54815:6;54811:14;54804:58;54687:182;:::o;54875:366::-;55017:3;55038:67;55102:2;55097:3;55038:67;:::i;:::-;55031:74;;55114:93;55203:3;55114:93;:::i;:::-;55232:2;55227:3;55223:12;55216:19;;54875:366;;;:::o;55247:419::-;55413:4;55451:2;55440:9;55436:18;55428:26;;55500:9;55494:4;55490:20;55486:1;55475:9;55471:17;55464:47;55528:131;55654:4;55528:131;:::i;:::-;55520:139;;55247:419;;;:::o;55672:178::-;55812:30;55808:1;55800:6;55796:14;55789:54;55672:178;:::o;55856:366::-;55998:3;56019:67;56083:2;56078:3;56019:67;:::i;:::-;56012:74;;56095:93;56184:3;56095:93;:::i;:::-;56213:2;56208:3;56204:12;56197:19;;55856:366;;;:::o;56228:419::-;56394:4;56432:2;56421:9;56417:18;56409:26;;56481:9;56475:4;56471:20;56467:1;56456:9;56452:17;56445:47;56509:131;56635:4;56509:131;:::i;:::-;56501:139;;56228:419;;;:::o
Swarm Source
ipfs://1d01d8e5a3c0430ec6cfd0dc99814556c5fe51f55f9f6e5c37b80597c64d6fac
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.