Overview
ETH Balance
0.24 ETH
Eth Value
$788.99 (@ $3,287.46/ETH)More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 9 from a total of 9 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Approval For... | 16218931 | 755 days ago | IN | 0 ETH | 0.00052126 | ||||
Set Approval For... | 14474404 | 1021 days ago | IN | 0 ETH | 0.00141772 | ||||
Claim | 13735964 | 1135 days ago | IN | 0.02 ETH | 0.02643935 | ||||
Claim | 13250057 | 1212 days ago | IN | 0.04 ETH | 0.01495183 | ||||
Claim | 13236118 | 1214 days ago | IN | 0.02 ETH | 0.01010032 | ||||
Claim | 13230683 | 1215 days ago | IN | 0.02 ETH | 0.00738511 | ||||
Claim | 13228840 | 1215 days ago | IN | 0.02 ETH | 0.01303567 | ||||
Claim | 13228806 | 1215 days ago | IN | 0.1 ETH | 0.04481906 | ||||
Claim | 13228323 | 1215 days ago | IN | 0.02 ETH | 0.01115318 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
Haikus
Compiler Version
v0.8.6+commit.11564f7e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-09-14 */ // SPDX-License-Identifier: MIT /* __ __ ___ __ __ ___ __ __ _______. | | | | / \ | | | |/ / | | | | / | | |__| | / ^ \ | | | ' / | | | | | (----` | __ | / /_\ \ | | | < | | | | \ \ | | | | / _____ \ | | | . \ | `--' | .----) | |__| |__| /__/ \__\ |__| |__|\__\ \______/ |_______/ Check out https://haikus.org for more info! */ pragma solidity ^0.8.0; /// [MIT License] /// @title Base64 /// @notice Provides a function for encoding some bytes in base64 /// @author Brecht Devos <[email protected]> library Base64 { bytes internal constant TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; /// @notice Encodes some bytes to the base64 representation function encode(bytes memory data) internal pure returns (string memory) { uint256 len = data.length; if (len == 0) return ""; // multiply by 4/3 rounded up uint256 encodedLen = 4 * ((len + 2) / 3); // Add some extra buffer at the end bytes memory result = new bytes(encodedLen + 32); bytes memory table = TABLE; assembly { let tablePtr := add(table, 1) let resultPtr := add(result, 32) for { let i := 0 } lt(i, len) { } { i := add(i, 3) let input := and(mload(add(data, i)), 0xffffff) let out := mload(add(tablePtr, and(shr(18, input), 0x3F))) out := shl(8, out) out := add(out, and(mload(add(tablePtr, and(shr(12, input), 0x3F))), 0xFF)) out := shl(8, out) out := add(out, and(mload(add(tablePtr, and(shr(6, input), 0x3F))), 0xFF)) out := shl(8, out) out := add(out, and(mload(add(tablePtr, and(input, 0x3F))), 0xFF)) out := shl(224, out) mstore(resultPtr, out) resultPtr := add(resultPtr, 4) } switch mod(len, 3) case 1 { mstore(sub(resultPtr, 2), shl(240, 0x3d3d)) } case 2 { mstore(sub(resultPtr, 1), shl(248, 0x3d)) } mstore(result, encodedLen) } return string(result); } } /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } /** * @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 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 Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } /** * @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 make 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; } } /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) private 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 Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } contract Haikus is ERC721Enumerable, ReentrancyGuard, Ownable { using Strings for uint; uint internal constant tokenPriceInWei = 20000000000000000; enum pieces{ TopHalfOneLine, TopHalfTwoLines, BottomHalfOneLine, BottomHalfTwoLines } enum pos{ linebreak, noun1, noun2, noun3, adjective1, adjective2, adjective3, determiner1, conjunction1, pronoun1, adverb1, adverb2, adverb3, preposition1, preposition2, verb1, verb2, noun1p, /* plural nouns */ noun2p, noun3p, verb2g, /* gerunds aka -ing verbs*/ verb3g, verb1pa, /* past tense verbs */ verb2pa } string[4] public svgPart = [ '<svg xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMinYMin meet" viewBox="0 0 400 400"> <linearGradient spreadMethod="pad" id="g" x1="0%" y1="0%" x2="129%" y2="38%"> <stop offset="0" style="stop-color:rgb(252, 225, 178);stop-opacity:1;"/> <stop offset="56%" style="stop-color:rgb(252, 228, 178);stop-opacity:1;"/> <stop offset="100%" style="stop-color:rgb(220, 155, 37);stop-opacity:1;"/> </linearGradient> <filter id="w"> <feTurbulence x="0" y="0" baseFrequency="0.01" numOctaves="5" seed="1"/> <feDisplacementMap result="t" in="SourceGraphic" scale="20" /> <feMerge> <feMergeNode in="t"/> </feMerge> </filter> <style> text { fill: #692e09; font-family: serif; font-size: 18px; } </style> <rect width="97%" height="97%" filter="url(#w)" fill="url(#g)" /> <text x="30" y="50">', '</text><text x="30" y="80" class="base">', '</text><text x="30" y="110" class="base">', '</text></svg>' ]; mapping(uint256 => string) public poemNames; mapping(uint256 => pos[]) private topParts1; mapping(uint256 => pos[]) private topParts2; mapping(uint256 => pos[]) private bottomParts1; mapping(uint256 => pos[]) private bottomParts2; mapping(pos => string[]) private partOfSpeech; uint private topParts1Count = 0; uint private topParts2Count = 0; uint private bottomParts1Count = 0; uint private bottomParts2Count = 0; constructor() ERC721("Haikus", "HAIKU") Ownable() { topParts1[0] = [pos.preposition1, pos.adjective2, pos.noun2p]; topParts1[1] = [pos.noun1p, pos.preposition1, pos.noun3]; topParts1[2] = [pos.adjective3, pos.noun2]; topParts1[3] = [pos.adjective2, pos.noun3]; topParts1Count = 4; topParts2[0] = [pos.adjective3, pos.noun2, pos.linebreak, pos.noun2p, pos.verb1, pos.determiner1, pos.adjective1, pos.adjective1, pos.noun1p]; topParts2[1] = [pos.adjective2, pos.adjective1, pos.noun2, pos.linebreak, pos.verb2g, pos.noun2p, pos.preposition1, pos.determiner1, pos.noun1]; topParts2[2] = [pos.determiner1, pos.noun2p, pos.verb1, pos.noun1p, pos.linebreak, pos.preposition1, pos.adjective3, pos.noun3p]; topParts2[3] = [pos.adverb1, pos.preposition2, pos.determiner1, pos.noun1, pos.linebreak, pos.adjective1, pos.adjective3, pos.noun3p]; topParts2[4] = [pos.adverb3, pos.verb2g, pos.linebreak, pos.determiner1, pos.adjective3, pos.adjective2, pos.noun1]; topParts2Count = 5; bottomParts1[0] = [pos.adjective1, pos.adjective1, pos.noun2p, pos.verb1]; bottomParts1[1] = [pos.determiner1, pos.adjective2, pos.noun2p]; bottomParts1[2] = [pos.determiner1, pos.noun3p, pos.verb2g, pos.noun1p]; bottomParts1[3] = [pos.preposition1, pos.determiner1, pos.adjective2, pos.noun1]; bottomParts1[4] = [pos.adjective2, pos.noun3p]; bottomParts1Count = 5; bottomParts2[0] = [pos.adverb2, pos.pronoun1, pos.verb2pa, pos.determiner1, pos.noun1, pos.linebreak, pos.conjunction1, pos.pronoun1, pos.verb1pa, pos.noun1p]; bottomParts2[1] = [pos.preposition1, pos.determiner1, pos.adjective1, pos.adjective2, pos.noun2, pos.linebreak, pos.adverb3, pos.verb2g]; bottomParts2[2] = [pos.adjective2, pos.noun2p, pos.verb1, pos.preposition1, pos.noun1, pos.linebreak, pos.preposition1, pos.determiner1, pos.verb2g, pos.noun1p]; bottomParts2[3] = [pos.preposition1, pos.determiner1, pos.adjective3, pos.noun2, pos.linebreak, pos.verb2g, pos.preposition1, pos.noun2]; bottomParts2[4] = [pos.determiner1, pos.noun2p, pos.verb2, pos.determiner1, pos.noun1p, pos.linebreak, pos.preposition1, pos.adjective2, pos.noun2p]; bottomParts2Count = 5; partOfSpeech[pos.linebreak] = [""]; partOfSpeech[pos.noun1] = ["guilt", "sun", "thought", "mind", "heart", "strength", "time", "light", "mood", "death", "dream", "hope", "blame", "taste", "love", "fear", "world", "flame", "sight", "night", "soul"]; // must support plural -s suffix and still be 1 syllable partOfSpeech[pos.noun2] = ["outlook", "whisper", "water", "ocean", "vision", "nature", "feeling", "matter", "lover", "summer", "sunset", "mindset", "mother", "father", "concern", "culture", "future", "twilight", "window", "morning", "mirror", "winter", "mountain", "blossom", "heaven", "treasure"]; partOfSpeech[pos.noun3] = ["solitude", "charisma", "attention", "idea", "intention", "adventure", "holiday", "period", "depression", "example", "medicine", "funeral", "solution", "miracle", "horizon", "reunion"]; partOfSpeech[pos.adjective1] = ["long", "blue", "cold", "deaf", "tough", "blind", "dim", "grim", "sweet", "warm", "scared", "old", "young", "scarce", "dark", "new", "true", "fair", "dead", "real", "wild", "kind", "pure", "proud", "odd", "foul", "poor", "ripe", "stale", "calm"]; partOfSpeech[pos.adjective2] = ["vibrant", "distant", "lovely", "lonely", "flowing", "busy", "scary", "dreary", "basic", "tender", "loveless", "hopeless", "hopeful", "evil", "welcome", "joyful", "ugly", "lucky", "early", "perfect", "future", "useful", "useless", "loyal", "sacred", "brilliant", "silent", "fallen", "freezing", "shameless", "naked"]; partOfSpeech[pos.adjective3] = ["beautiful", "enchanting", "glistening", "intricate", "different", "difficult", "curious", "lovable", "positive", "negative", "Hollywood", "attractive", "essential", "unwanted", "unstable", "permanent", "flexible", "abundant", "logical", "impressive", "peaceful", "typical"]; partOfSpeech[pos.determiner1] = ["the", "my", "their", "your", "his", "her", "our", "such"]; partOfSpeech[pos.conjunction1] = ["and", "while", "as", "but", "since", "yet", "so", "now", "which", "though"]; partOfSpeech[pos.adverb1] = ["down", "up", "then", "soon", "here"]; partOfSpeech[pos.adverb2] = ["quickly", "slowly", "boldly", "rarely", "wildly", "warmly", "freely", "vaguely", "weakly", "truly", "gently", "cruelly", "daily", "often"]; partOfSpeech[pos.adverb3] = ["everywhere", "angrily", "cheerfully", "frantically", "nervously", "silently", "solemnly", "massively", "cleverly", "bitterly", "anxiously"]; partOfSpeech[pos.verb1] = ["kill", "learn", "talk", "weep", "fail", "bloom", "touch", "slow", "vex", "fool", "shock", "kiss", "laugh", "watch", "lack", "pass", "trick", "pray", "join", "drown", "spoil"]; // must support -ing and -ed suffixes partOfSpeech[pos.verb2] = ["sweeten", "cower", "destroy", "open", "reveal", "ruin", "delay", "possess", "allow", "follow", "accept", "perform", "mirror", "travel", "gather", "master", "vanish", "finish", "order", "maintain", "fulfill", "transform"]; partOfSpeech[pos.pronoun1] = ["you", "he", "she", "it", "they", "we", "I", "few", "most"]; partOfSpeech[pos.preposition1] = ["to", "in", "for", "through", "with", "like", "of", "from", "at"]; partOfSpeech[pos.preposition2] = ["under", "over", "between", "above", "below", "upon", "before", "across", "after", "among", "behind", "beyond", "inside", "outside", "unlike", "within", "without"]; } function assembleSentence(uint256 tokenId) public view returns (string memory firstLine, string memory secondLine, string memory thirdLine) { pieces[2] memory parts; uint rand = uint(keccak256(abi.encode("HTTPS://WWW.HAIKUS.ORG", tokenId))); // Must be deterministic! // Determine which part to use if((rand % 20) < 10) { parts[0] = pieces.TopHalfOneLine; parts[1] = pieces.BottomHalfTwoLines; } else { parts[0] = pieces.TopHalfTwoLines; parts[1] = pieces.BottomHalfOneLine; } for(uint x = 0; x < parts.length; x++) { pos[] memory structure; // Grab a random template for the part if(parts[x] == pieces.TopHalfOneLine) { structure = topParts1[rand % topParts1Count]; } else if(parts[x] == pieces.TopHalfTwoLines){ structure = topParts2[rand % topParts2Count]; } else if(parts[x] == pieces.BottomHalfOneLine){ structure = bottomParts1[rand % bottomParts1Count]; } else if(parts[x] == pieces.BottomHalfTwoLines){ structure = bottomParts2[rand % bottomParts2Count]; } string memory output = ''; pos lastPoS; // Replace template with actual words for (uint i=0; i<structure.length; i++) { uint rand2 = uint(keccak256(abi.encode("HTTPS://WWW.HAIKUS.ORG", parts[x], tokenId, i))); string memory word; pos currentPoSKey = structure[i]; // Check if linebreak: if(currentPoSKey == pos.linebreak) { if(parts[x] == pieces.TopHalfTwoLines) { firstLine = output; // set first line output = ""; // second line will get set below } else if(parts[x] == pieces.BottomHalfTwoLines) { secondLine = output; // set second line output = ""; // third line will get set below } } else { // Check if plural: currentPoSKey = fetchKey(structure[i]); if(structure[i] != currentPoSKey) { word = join(partOfSpeech[currentPoSKey][rand2 % partOfSpeech[currentPoSKey].length], 's'); } else { // Check if gerund: currentPoSKey = fetchKeyForGerunds(structure[i]); if(structure[i] != currentPoSKey) { word = join(partOfSpeech[currentPoSKey][rand2 % partOfSpeech[currentPoSKey].length], 'ing'); } else { // Check if paste tense: currentPoSKey = fetchKeyForPastTenses(structure[i]); if(structure[i] != currentPoSKey) { word = join(partOfSpeech[currentPoSKey][rand2 % partOfSpeech[currentPoSKey].length], 'ed'); } else { word = partOfSpeech[currentPoSKey][rand2 % partOfSpeech[currentPoSKey].length]; } } } } // Add commas/spaces if(i > 0) { if(needsComma(currentPoSKey, lastPoS)) { output = join(output, ", "); } else { if(bytes(output).length != 0) { // Only add space if we're not at the beginning of a string output = join(output, ' '); } } } // Add to output output = join(output, word); if(i == structure.length-1) { output = join(output, "."); } lastPoS = structure[i]; } // Set return values if(parts[x] == pieces.TopHalfOneLine) { firstLine = output; } else if(parts[x] == pieces.TopHalfTwoLines) { secondLine = output; } else if(parts[x] == pieces.BottomHalfOneLine) { thirdLine = output; } else if(parts[x] == pieces.BottomHalfTwoLines) { thirdLine = output; } } } function join(string memory s1, string memory s2) internal pure returns (string memory) { return string(abi.encodePacked(s1, s2)); } function needsComma(pos s1, pos s2) internal pure returns (bool) { if((s1 == pos.adjective1) || (s1 == pos.adjective2) || (s1 == pos.adjective3)) { if((s2 == pos.adjective1) || (s2 == pos.adjective2) || (s2 == pos.adjective3)) { return true; } } if((s1 == pos.noun1) || (s1 == pos.noun2) || (s1 == pos.noun3)) { if((s2 == pos.noun1) || (s2 == pos.noun2) || (s2 == pos.noun3)) { return true; } } return false; } function fetchKey(pos s1) internal pure returns (pos) { // Switch key if plural if(s1 == pos.noun1p) return pos.noun1; else if(s1 == pos.noun2p) return pos.noun2; else if(s1 == pos.noun3p) return pos.noun3; return s1; } function fetchKeyForGerunds(pos s1) internal pure returns (pos) { // Switch key if gerund if(s1 == pos.verb2g) return pos.verb1; else if(s1 == pos.verb3g) return pos.verb2; return s1; } function fetchKeyForPastTenses(pos s1) internal pure returns (pos) { // Switch key if past tense if(s1 == pos.verb1pa) return pos.verb1; else if(s1 == pos.verb2pa) return pos.verb2; return s1; } function tokenURI(uint256 tokenId) override public view returns (string memory) { string memory line1; string memory line2; string memory line3; (line1, line2, line3) = assembleSentence(tokenId); string memory output = string(abi.encodePacked(svgPart[0], line1, svgPart[1], line2, svgPart[2], line3, svgPart[3])); string memory json = Base64.encode(bytes(string(abi.encodePacked('{"name": "', poemNames[tokenId], '", "description": "Haikus is a collection of Haiku poems, uniquely generated on the Ethereum blockchain. Learn more at https://haikus.org /// ', line1, ' ', line2, ' ', line3, '", "image": "data:image/svg+xml;base64,', Base64.encode(bytes(output)), '"}')))); output = string(abi.encodePacked('data:application/json;base64,', json)); return output; } function ownerClaim(uint256 tokenId) public nonReentrant onlyOwner { require(tokenId > 7777 && tokenId < 8001, "bad ID"); _safeMint(owner(), tokenId); poemNames[tokenId] = join("Haiku #", tokenId.toString()); } function claim(uint256[] memory tokenIds) public payable nonReentrant { require(tx.origin == _msgSender()); require(tokenIds.length <= 20, "Oof"); require(msg.value >= (tokenPriceInWei * tokenIds.length), "Not enough ETH"); for (uint256 i = 0; i < tokenIds.length; i++) { require(tokenIds[i] > 0 && tokenIds[i] < 7778, "bad ID"); _safeMint(_msgSender(), tokenIds[i]); poemNames[tokenIds[i]] = join("Haiku #", tokenIds[i].toString()); } } function changeName(uint256 tokenId, string memory newName) public { require(_msgSender() == ownerOf(tokenId), "Not owner"); poemNames[tokenId] = newName; } function changeSVG(string memory part1, string memory part2, string memory part3, string memory part4) public onlyOwner { svgPart[0] = part1; svgPart[1] = part2; svgPart[2] = part3; svgPart[3] = part4; } function withdraw() public onlyOwner { payable(_msgSender()).transfer(address(this).balance); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"assembleSentence","outputs":[{"internalType":"string","name":"firstLine","type":"string"},{"internalType":"string","name":"secondLine","type":"string"},{"internalType":"string","name":"thirdLine","type":"string"}],"stateMutability":"view","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"}],"name":"changeName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"part1","type":"string"},{"internalType":"string","name":"part2","type":"string"},{"internalType":"string","name":"part3","type":"string"},{"internalType":"string","name":"part4","type":"string"}],"name":"changeSVG","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"claim","outputs":[],"stateMutability":"payable","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":"ownerClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poemNames","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"svgPart","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405260405180608001604052806040518061034001604052806103138152602001630000d08b61031391398152602001604051806060016040528060288152602001630000d063602891398152602001604051806060016040528060298152602001630000d39e6029913981526020016040518060400160405280600d81526020017f3c2f746578743e3c2f7376673e00000000000000000000000000000000000000815250815250600c90600463000000bf92919063000063b6565b50600060165560006017556000601855600060195534801563000000e257600080fd5b506040518060400160405280600681526020017f4861696b757300000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f4841494b55000000000000000000000000000000000000000000000000000000815250816000908051906020019063000001699291906300006417565b50806001908051906020019063000001849291906300006417565b5050506001600a8190555063000001b363000001a663000062e860201b60201c565b63000062f060201b60201c565b6040518060600160405280600d601781111563000001d85763000001d76300007110565b5b601781111563000001f05763000001ef6300007110565b5b815260200160056017811115630000020f57630000020e6300007110565b5b601781111563000002275763000002266300007110565b5b81526020016012601781111563000002465763000002456300007110565b5b6017811115630000025e57630000025d6300007110565b5b81525060116000808152602001908152602001600020906003630000028692919063000064b3565b5060405180606001604052806011601781111563000002ac5763000002ab6300007110565b5b601781111563000002c45763000002c36300007110565b5b8152602001600d601781111563000002e35763000002e26300007110565b5b601781111563000002fb5763000002fa6300007110565b5b815260200160036017811115630000031a5763000003196300007110565b5b601781111563000003325763000003316300007110565b5b8152506011600060018152602001908152602001600020906003630000035b92919063000064b3565b5060405180604001604052806006601781111563000003815763000003806300007110565b5b601781111563000003995763000003986300007110565b5b81526020016002601781111563000003b85763000003b76300007110565b5b601781111563000003d05763000003cf6300007110565b5b815250601160006002815260200190815260200160002090600263000003f9929190630000657d565b50604051806040016040528060056017811115630000041f57630000041e6300007110565b5b601781111563000004375763000004366300007110565b5b81526020016003601781111563000004565763000004556300007110565b5b6017811115630000046e57630000046d6300007110565b5b81525060116000600381526020019081526020016000209060026300000497929190630000657d565b5060046016819055506040518061012001604052806006601781111563000004c65763000004c56300007110565b5b601781111563000004de5763000004dd6300007110565b5b81526020016002601781111563000004fd5763000004fc6300007110565b5b601781111563000005155763000005146300007110565b5b81526020016000601781111563000005345763000005336300007110565b5b6017811115630000054c57630000054b6300007110565b5b815260200160126017811115630000056b57630000056a6300007110565b5b601781111563000005835763000005826300007110565b5b8152602001600f601781111563000005a25763000005a16300007110565b5b601781111563000005ba5763000005b96300007110565b5b81526020016007601781111563000005d95763000005d86300007110565b5b601781111563000005f15763000005f06300007110565b5b815260200160046017811115630000061057630000060f6300007110565b5b601781111563000006285763000006276300007110565b5b81526020016004601781111563000006475763000006466300007110565b5b6017811115630000065f57630000065e6300007110565b5b815260200160116017811115630000067e57630000067d6300007110565b5b601781111563000006965763000006956300007110565b5b8152506012600080815260200190815260200160002090600963000006be9291906300006647565b506040518061012001604052806005601781111563000006e55763000006e46300007110565b5b601781111563000006fd5763000006fc6300007110565b5b815260200160046017811115630000071c57630000071b6300007110565b5b601781111563000007345763000007336300007110565b5b81526020016002601781111563000007535763000007526300007110565b5b6017811115630000076b57630000076a6300007110565b5b815260200160006017811115630000078a5763000007896300007110565b5b601781111563000007a25763000007a16300007110565b5b81526020016014601781111563000007c15763000007c06300007110565b5b601781111563000007d95763000007d86300007110565b5b81526020016012601781111563000007f85763000007f76300007110565b5b6017811115630000081057630000080f6300007110565b5b8152602001600d6017811115630000082f57630000082e6300007110565b5b601781111563000008475763000008466300007110565b5b81526020016007601781111563000008665763000008656300007110565b5b6017811115630000087e57630000087d6300007110565b5b815260200160016017811115630000089d57630000089c6300007110565b5b601781111563000008b55763000008b46300007110565b5b815250601260006001815260200190815260200160002090600963000008de9291906300006647565b506040518061010001604052806007601781111563000009055763000009046300007110565b5b6017811115630000091d57630000091c6300007110565b5b815260200160126017811115630000093c57630000093b6300007110565b5b601781111563000009545763000009536300007110565b5b8152602001600f601781111563000009735763000009726300007110565b5b6017811115630000098b57630000098a6300007110565b5b81526020016011601781111563000009aa5763000009a96300007110565b5b601781111563000009c25763000009c16300007110565b5b81526020016000601781111563000009e15763000009e06300007110565b5b601781111563000009f95763000009f86300007110565b5b8152602001600d60178111156300000a18576300000a176300007110565b5b60178111156300000a30576300000a2f6300007110565b5b8152602001600660178111156300000a4f576300000a4e6300007110565b5b60178111156300000a67576300000a666300007110565b5b8152602001601360178111156300000a86576300000a856300007110565b5b60178111156300000a9e576300000a9d6300007110565b5b81525060126000600281526020019081526020016000209060086300000ac79291906300006711565b50604051806101000160405280600a60178111156300000aee576300000aed6300007110565b5b60178111156300000b06576300000b056300007110565b5b8152602001600e60178111156300000b25576300000b246300007110565b5b60178111156300000b3d576300000b3c6300007110565b5b8152602001600760178111156300000b5c576300000b5b6300007110565b5b60178111156300000b74576300000b736300007110565b5b8152602001600160178111156300000b93576300000b926300007110565b5b60178111156300000bab576300000baa6300007110565b5b8152602001600060178111156300000bca576300000bc96300007110565b5b60178111156300000be2576300000be16300007110565b5b8152602001600460178111156300000c01576300000c006300007110565b5b60178111156300000c19576300000c186300007110565b5b8152602001600660178111156300000c38576300000c376300007110565b5b60178111156300000c50576300000c4f6300007110565b5b8152602001601360178111156300000c6f576300000c6e6300007110565b5b60178111156300000c87576300000c866300007110565b5b81525060126000600381526020019081526020016000209060086300000cb09291906300006711565b506040518060e00160405280600c60178111156300000cd6576300000cd56300007110565b5b60178111156300000cee576300000ced6300007110565b5b8152602001601460178111156300000d0d576300000d0c6300007110565b5b60178111156300000d25576300000d246300007110565b5b8152602001600060178111156300000d44576300000d436300007110565b5b60178111156300000d5c576300000d5b6300007110565b5b8152602001600760178111156300000d7b576300000d7a6300007110565b5b60178111156300000d93576300000d926300007110565b5b8152602001600660178111156300000db2576300000db16300007110565b5b60178111156300000dca576300000dc96300007110565b5b8152602001600560178111156300000de9576300000de86300007110565b5b60178111156300000e01576300000e006300007110565b5b8152602001600160178111156300000e20576300000e1f6300007110565b5b60178111156300000e38576300000e376300007110565b5b81525060126000600481526020019081526020016000209060076300000e6192919063000067db565b5060056017819055506040518060800160405280600460178111156300000e8f576300000e8e6300007110565b5b60178111156300000ea7576300000ea66300007110565b5b8152602001600460178111156300000ec6576300000ec56300007110565b5b60178111156300000ede576300000edd6300007110565b5b8152602001601260178111156300000efd576300000efc6300007110565b5b60178111156300000f15576300000f146300007110565b5b8152602001600f60178111156300000f34576300000f336300007110565b5b60178111156300000f4c576300000f4b6300007110565b5b815250601360008081526020019081526020016000209060046300000f7492919063000068a5565b506040518060600160405280600760178111156300000f9a576300000f996300007110565b5b60178111156300000fb2576300000fb16300007110565b5b8152602001600560178111156300000fd1576300000fd06300007110565b5b60178111156300000fe9576300000fe86300007110565b5b81526020016012601781111563000010085763000010076300007110565b5b6017811115630000102057630000101f6300007110565b5b8152506013600060018152602001908152602001600020906003630000104992919063000064b3565b50604051806080016040528060076017811115630000106f57630000106e6300007110565b5b601781111563000010875763000010866300007110565b5b81526020016013601781111563000010a65763000010a56300007110565b5b601781111563000010be5763000010bd6300007110565b5b81526020016014601781111563000010dd5763000010dc6300007110565b5b601781111563000010f55763000010f46300007110565b5b81526020016011601781111563000011145763000011136300007110565b5b6017811115630000112c57630000112b6300007110565b5b8152506013600060028152602001908152602001600020906004630000115592919063000068a5565b506040518060800160405280600d6017811115630000117b57630000117a6300007110565b5b601781111563000011935763000011926300007110565b5b81526020016007601781111563000011b25763000011b16300007110565b5b601781111563000011ca5763000011c96300007110565b5b81526020016005601781111563000011e95763000011e86300007110565b5b601781111563000012015763000012006300007110565b5b815260200160016017811115630000122057630000121f6300007110565b5b601781111563000012385763000012376300007110565b5b8152506013600060038152602001908152602001600020906004630000126192919063000068a5565b5060405180604001604052806005601781111563000012875763000012866300007110565b5b6017811115630000129f57630000129e6300007110565b5b81526020016013601781111563000012be5763000012bd6300007110565b5b601781111563000012d65763000012d56300007110565b5b815250601360006004815260200190815260200160002090600263000012ff929190630000657d565b506005601881905550604051806101400160405280600b6017811115630000132e57630000132d6300007110565b5b601781111563000013465763000013456300007110565b5b81526020016009601781111563000013655763000013646300007110565b5b6017811115630000137d57630000137c6300007110565b5b8152602001601780811115630000139b57630000139a6300007110565b5b601781111563000013b35763000013b26300007110565b5b81526020016007601781111563000013d25763000013d16300007110565b5b601781111563000013ea5763000013e96300007110565b5b81526020016001601781111563000014095763000014086300007110565b5b601781111563000014215763000014206300007110565b5b815260200160006017811115630000144057630000143f6300007110565b5b601781111563000014585763000014576300007110565b5b81526020016008601781111563000014775763000014766300007110565b5b6017811115630000148f57630000148e6300007110565b5b81526020016009601781111563000014ae5763000014ad6300007110565b5b601781111563000014c65763000014c56300007110565b5b81526020016016601781111563000014e55763000014e46300007110565b5b601781111563000014fd5763000014fc6300007110565b5b815260200160116017811115630000151c57630000151b6300007110565b5b601781111563000015345763000015336300007110565b5b8152506014600080815260200190815260200160002090600a630000155c929190630000696f565b50604051806101000160405280600d601781111563000015835763000015826300007110565b5b6017811115630000159b57630000159a6300007110565b5b81526020016007601781111563000015ba5763000015b96300007110565b5b601781111563000015d25763000015d16300007110565b5b81526020016004601781111563000015f15763000015f06300007110565b5b601781111563000016095763000016086300007110565b5b81526020016005601781111563000016285763000016276300007110565b5b6017811115630000164057630000163f6300007110565b5b815260200160026017811115630000165f57630000165e6300007110565b5b601781111563000016775763000016766300007110565b5b81526020016000601781111563000016965763000016956300007110565b5b601781111563000016ae5763000016ad6300007110565b5b8152602001600c601781111563000016cd5763000016cc6300007110565b5b601781111563000016e55763000016e46300007110565b5b81526020016014601781111563000017045763000017036300007110565b5b6017811115630000171c57630000171b6300007110565b5b815250601460006001815260200190815260200160002090600863000017459291906300006711565b5060405180610140016040528060056017811115630000176c57630000176b6300007110565b5b601781111563000017845763000017836300007110565b5b81526020016012601781111563000017a35763000017a26300007110565b5b601781111563000017bb5763000017ba6300007110565b5b8152602001600f601781111563000017da5763000017d96300007110565b5b601781111563000017f25763000017f16300007110565b5b8152602001600d601781111563000018115763000018106300007110565b5b601781111563000018295763000018286300007110565b5b81526020016001601781111563000018485763000018476300007110565b5b6017811115630000186057630000185f6300007110565b5b815260200160006017811115630000187f57630000187e6300007110565b5b601781111563000018975763000018966300007110565b5b8152602001600d601781111563000018b65763000018b56300007110565b5b601781111563000018ce5763000018cd6300007110565b5b81526020016007601781111563000018ed5763000018ec6300007110565b5b601781111563000019055763000019046300007110565b5b81526020016014601781111563000019245763000019236300007110565b5b6017811115630000193c57630000193b6300007110565b5b815260200160116017811115630000195b57630000195a6300007110565b5b601781111563000019735763000019726300007110565b5b815250601460006002815260200190815260200160002090600a630000199c929190630000696f565b50604051806101000160405280600d601781111563000019c35763000019c26300007110565b5b601781111563000019db5763000019da6300007110565b5b81526020016007601781111563000019fa5763000019f96300007110565b5b60178111156300001a12576300001a116300007110565b5b8152602001600660178111156300001a31576300001a306300007110565b5b60178111156300001a49576300001a486300007110565b5b8152602001600260178111156300001a68576300001a676300007110565b5b60178111156300001a80576300001a7f6300007110565b5b8152602001600060178111156300001a9f576300001a9e6300007110565b5b60178111156300001ab7576300001ab66300007110565b5b8152602001601460178111156300001ad6576300001ad56300007110565b5b60178111156300001aee576300001aed6300007110565b5b8152602001600d60178111156300001b0d576300001b0c6300007110565b5b60178111156300001b25576300001b246300007110565b5b8152602001600260178111156300001b44576300001b436300007110565b5b60178111156300001b5c576300001b5b6300007110565b5b81525060146000600381526020019081526020016000209060086300001b859291906300006711565b50604051806101200160405280600760178111156300001bac576300001bab6300007110565b5b60178111156300001bc4576300001bc36300007110565b5b8152602001601260178111156300001be3576300001be26300007110565b5b60178111156300001bfb576300001bfa6300007110565b5b8152602001601060178111156300001c1a576300001c196300007110565b5b60178111156300001c32576300001c316300007110565b5b8152602001600760178111156300001c51576300001c506300007110565b5b60178111156300001c69576300001c686300007110565b5b8152602001601160178111156300001c88576300001c876300007110565b5b60178111156300001ca0576300001c9f6300007110565b5b8152602001600060178111156300001cbf576300001cbe6300007110565b5b60178111156300001cd7576300001cd66300007110565b5b8152602001600d60178111156300001cf6576300001cf56300007110565b5b60178111156300001d0e576300001d0d6300007110565b5b8152602001600560178111156300001d2d576300001d2c6300007110565b5b60178111156300001d45576300001d446300007110565b5b8152602001601260178111156300001d64576300001d636300007110565b5b60178111156300001d7c576300001d7b6300007110565b5b81525060146000600481526020019081526020016000209060096300001da59291906300006647565b506005601981905550604051806020016040528060405180602001604052806000815250815250601560008060178111156300001de9576300001de86300007110565b5b60178111156300001e01576300001e006300007110565b5b81526020019081526020016000209060016300001e219291906300006a39565b50604051806102a001604052806040518060400160405280600581526020017f6775696c7400000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f73756e000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f74686f756768740000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f6d696e640000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f686561727400000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f737472656e67746800000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f74696d650000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f6c6967687400000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f6d6f6f640000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f646561746800000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f647265616d00000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f686f70650000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f626c616d6500000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f746173746500000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f6c6f76650000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f666561720000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f776f726c6400000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f666c616d6500000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f736967687400000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f6e6967687400000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f736f756c00000000000000000000000000000000000000000000000000000000815250815250601560006001601781111563000023215763000023206300007110565b5b601781111563000023395763000023386300007110565b5b815260200190815260200160002090601563000023599291906300006aa7565b506040518061034001604052806040518060400160405280600781526020017f6f75746c6f6f6b0000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f776869737065720000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f776174657200000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f6f6365616e00000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f766973696f6e000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f6e6174757265000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f6665656c696e670000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f6d6174746572000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f6c6f76657200000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f73756d6d6572000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f73756e736574000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f6d696e647365740000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f6d6f74686572000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f666174686572000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f636f6e6365726e0000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f63756c747572650000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f667574757265000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f7477696c6967687400000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f77696e646f77000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f6d6f726e696e670000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f6d6972726f72000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f77696e746572000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f6d6f756e7461696e00000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f626c6f73736f6d0000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f68656176656e000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f74726561737572650000000000000000000000000000000000000000000000008152508152506015600060026017811115630000298057630000297f6300007110565b5b601781111563000029985763000029976300007110565b5b815260200190815260200160002090601a63000029b89291906300006b15565b506040518061020001604052806040518060400160405280600881526020017f736f6c697475646500000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f6368617269736d6100000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f617474656e74696f6e000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f696465610000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f696e74656e74696f6e000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f616476656e74757265000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f686f6c696461790000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f706572696f64000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f64657072657373696f6e0000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f6578616d706c650000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f6d65646963696e6500000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f66756e6572616c0000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f736f6c7574696f6e00000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f6d697261636c650000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f686f72697a6f6e0000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f7265756e696f6e0000000000000000000000000000000000000000000000000081525081525060156000600360178111156300002d91576300002d906300007110565b5b60178111156300002da9576300002da86300007110565b5b81526020019081526020016000209060106300002dc99291906300006b83565b50604051806103c001604052806040518060400160405280600481526020017f6c6f6e670000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f626c75650000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f636f6c640000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f646561660000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f746f75676800000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f626c696e6400000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f64696d000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f6772696d0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f737765657400000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f7761726d0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f736361726564000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f6f6c64000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f796f756e6700000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f736361726365000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f6461726b0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f6e6577000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f747275650000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f666169720000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f646561640000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f7265616c0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f77696c640000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f6b696e640000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f707572650000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f70726f756400000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f6f6464000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f666f756c0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f706f6f720000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f726970650000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f7374616c6500000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f63616c6d00000000000000000000000000000000000000000000000000000000815250815250601560006004601781111563000034dc5763000034db6300007110565b5b601781111563000034f45763000034f36300007110565b5b815260200190815260200160002090601e63000035149291906300006bf1565b50604051806103e001604052806040518060400160405280600781526020017f76696272616e740000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f64697374616e740000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f6c6f76656c79000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f6c6f6e656c79000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f666c6f77696e670000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f627573790000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f736361727900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f647265617279000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f626173696300000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f74656e646572000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f6c6f76656c65737300000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f686f70656c65737300000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f686f706566756c0000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f6576696c0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f77656c636f6d650000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f6a6f7966756c000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f75676c790000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f6c75636b7900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f6561726c7900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f706572666563740000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f667574757265000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f75736566756c000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f7573656c6573730000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f6c6f79616c00000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f736163726564000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f6272696c6c69616e74000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f73696c656e74000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f66616c6c656e000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f667265657a696e6700000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f7368616d656c657373000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f6e616b656400000000000000000000000000000000000000000000000000000081525081525060156000600560178111156300003c62576300003c616300007110565b5b60178111156300003c7a576300003c796300007110565b5b815260200190815260200160002090601f6300003c9a9291906300006c5f565b50604051806102c001604052806040518060400160405280600981526020017f62656175746966756c000000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f656e6368616e74696e670000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f676c697374656e696e670000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f696e74726963617465000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f646966666572656e74000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f646966666963756c74000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f637572696f75730000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f6c6f7661626c650000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f706f73697469766500000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f6e6567617469766500000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f486f6c6c79776f6f64000000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f617474726163746976650000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f657373656e7469616c000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f756e77616e74656400000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f756e737461626c6500000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f7065726d616e656e74000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f666c657869626c6500000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f6162756e64616e7400000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f6c6f676963616c0000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f696d70726573736976650000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f706561636566756c00000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f7479706963616c00000000000000000000000000000000000000000000000000815250815250601560006006601781111563000041d55763000041d46300007110565b5b601781111563000041ed5763000041ec6300007110565b5b8152602001908152602001600020906016630000420d9291906300006ccd565b506040518061010001604052806040518060400160405280600381526020017f746865000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600281526020017f6d7900000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f746865697200000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f796f75720000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f686973000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f686572000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f6f7572000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f73756368000000000000000000000000000000000000000000000000000000008152508152506015600060076017811115630000440e57630000440d6300007110565b5b601781111563000044265763000044256300007110565b5b815260200190815260200160002090600863000044469291906300006d3b565b506040518061014001604052806040518060400160405280600381526020017f616e64000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f7768696c6500000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600281526020017f617300000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f627574000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f73696e636500000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f796574000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600281526020017f736f00000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f6e6f77000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f776869636800000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f74686f7567680000000000000000000000000000000000000000000000000000815250815250601560006008601781111563000046bd5763000046bc6300007110565b5b601781111563000046d55763000046d46300007110565b5b815260200190815260200160002090600a63000046f59291906300006da9565b506040518060a001604052806040518060400160405280600481526020017f646f776e0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600281526020017f757000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f7468656e0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f736f6f6e0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f686572650000000000000000000000000000000000000000000000000000000081525081525060156000600a601781111563000048445763000048436300007110565b5b6017811115630000485c57630000485b6300007110565b5b8152602001908152602001600020906005630000487c9291906300006e17565b50604051806101c001604052806040518060400160405280600781526020017f717569636b6c790000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f736c6f776c79000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f626f6c646c79000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f726172656c79000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f77696c646c79000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f7761726d6c79000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f667265656c79000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f76616775656c790000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f7765616b6c79000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f7472756c7900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f67656e746c79000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f637275656c6c790000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f6461696c7900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f6f6674656e00000000000000000000000000000000000000000000000000000081525081525060156000600b60178111156300004bdf576300004bde6300007110565b5b60178111156300004bf7576300004bf66300007110565b5b815260200190815260200160002090600e6300004c179291906300006e85565b506040518061016001604052806040518060400160405280600a81526020017f657665727977686572650000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f616e6772696c790000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f636865657266756c6c790000000000000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f6672616e746963616c6c7900000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f6e6572766f75736c79000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f73696c656e746c7900000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f736f6c656d6e6c7900000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f6d6173736976656c79000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f636c657665726c7900000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f6269747465726c7900000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f616e78696f75736c79000000000000000000000000000000000000000000000081525081525060156000600c60178111156300004ec9576300004ec86300007110565b5b60178111156300004ee1576300004ee06300007110565b5b815260200190815260200160002090600b6300004f019291906300006ef3565b50604051806102a001604052806040518060400160405280600481526020017f6b696c6c0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f6c6561726e00000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f74616c6b0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f776565700000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f6661696c0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f626c6f6f6d00000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f746f75636800000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f736c6f770000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f766578000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f666f6f6c0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f73686f636b00000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f6b6973730000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f6c6175676800000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f776174636800000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f6c61636b0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f706173730000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f747269636b00000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f707261790000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f6a6f696e0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f64726f776e00000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f73706f696c00000000000000000000000000000000000000000000000000000081525081525060156000600f601781111563000054015763000054006300007110565b5b601781111563000054195763000054186300007110565b5b815260200190815260200160002090601563000054399291906300006aa7565b50604051806102c001604052806040518060400160405280600781526020017f7377656574656e0000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f636f77657200000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f64657374726f790000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f6f70656e0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f72657665616c000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f7275696e0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f64656c617900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f706f73736573730000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f616c6c6f7700000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f666f6c6c6f77000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f616363657074000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f706572666f726d0000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f6d6972726f72000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f74726176656c000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f676174686572000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f6d6173746572000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f76616e697368000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f66696e697368000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f6f7264657200000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f6d61696e7461696e00000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f66756c66696c6c0000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f7472616e73666f726d0000000000000000000000000000000000000000000000815250815250601560006010601781111563000059745763000059736300007110565b5b6017811115630000598c57630000598b6300007110565b5b815260200190815260200160002090601663000059ac9291906300006ccd565b506040518061012001604052806040518060400160405280600381526020017f796f75000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600281526020017f686500000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f736865000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600281526020017f697400000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f746865790000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600281526020017f776500000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f490000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f666577000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f6d6f73740000000000000000000000000000000000000000000000000000000081525081525060156000600960178111156300005be8576300005be76300007110565b5b60178111156300005c00576300005bff6300007110565b5b81526020019081526020016000209060096300005c209291906300006f61565b506040518061012001604052806040518060400160405280600281526020017f746f00000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600281526020017f696e00000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f666f72000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f7468726f7567680000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f776974680000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f6c696b650000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600281526020017f6f6600000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f66726f6d0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600281526020017f617400000000000000000000000000000000000000000000000000000000000081525081525060156000600d60178111156300005e5c576300005e5b6300007110565b5b60178111156300005e74576300005e736300007110565b5b81526020019081526020016000209060096300005e949291906300006f61565b506040518061022001604052806040518060400160405280600581526020017f756e64657200000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f6f7665720000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f6265747765656e0000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f61626f766500000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f62656c6f7700000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f75706f6e0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f6265666f7265000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f6163726f7373000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f616674657200000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f616d6f6e6700000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f626568696e64000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f6265796f6e64000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f696e73696465000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f6f7574736964650000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f756e6c696b65000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f77697468696e000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f776974686f75740000000000000000000000000000000000000000000000000081525081525060156000600e601781111563000062a85763000062a76300007110565b5b601781111563000062c05763000062bf6300007110565b5b815260200190815260200160002090601163000062e09291906300006fcf565b50630000716e565b600033905090565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b82600481019282156300006402579160200282015b82811115630000640157825182908051906020019063000063ef9291906300006417565b509160200191906001019063000063cb565b5b50905063000064139190630000703d565b5090565b82805463000064279063000070d6565b90600052602060002090601f016020900481019282630000644d5760008555630000649e565b82601f10630000646a57805160ff1916838001178555630000649e565b82800160010185558215630000649e579182015b82811115630000649d578251825591602001919060010190630000647e565b5b50905063000064af91906300007069565b5090565b82805482825590600052602060002090601f0160209004810192821563000065685791602002820160005b83821115630000653557835183826101000a81548160ff0219169083601781111563000065125763000065116300007110565b5b0217905550926020019260010160208160000104928301926001030263000064de565b801563000065665782816101000a81549060ff02191690556001016020816000010492830192600103026300006535565b505b509050630000657991906300007069565b5090565b82805482825590600052602060002090601f0160209004810192821563000066325791602002820160005b8382111563000065ff57835183826101000a81548160ff0219169083601781111563000065dc5763000065db6300007110565b5b0217905550926020019260010160208160000104928301926001030263000065a8565b801563000066305782816101000a81549060ff021916905560010160208160000104928301926001030263000065ff565b505b509050630000664391906300007069565b5090565b82805482825590600052602060002090601f0160209004810192821563000066fc5791602002820160005b8382111563000066c957835183826101000a81548160ff0219169083601781111563000066a65763000066a56300007110565b5b021790555092602001926001016020816000010492830192600103026300006672565b801563000066fa5782816101000a81549060ff021916905560010160208160000104928301926001030263000066c9565b505b509050630000670d91906300007069565b5090565b82805482825590600052602060002090601f0160209004810192821563000067c65791602002820160005b83821115630000679357835183826101000a81548160ff02191690836017811115630000677057630000676f6300007110565b5b02179055509260200192600101602081600001049283019260010302630000673c565b801563000067c45782816101000a81549060ff02191690556001016020816000010492830192600103026300006793565b505b50905063000067d791906300007069565b5090565b82805482825590600052602060002090601f0160209004810192821563000068905791602002820160005b83821115630000685d57835183826101000a81548160ff02191690836017811115630000683a5763000068396300007110565b5b021790555092602001926001016020816000010492830192600103026300006806565b8015630000688e5782816101000a81549060ff0219169055600101602081600001049283019260010302630000685d565b505b50905063000068a191906300007069565b5090565b82805482825590600052602060002090601f01602090048101928215630000695a5791602002820160005b83821115630000692757835183826101000a81548160ff0219169083601781111563000069045763000069036300007110565b5b0217905550926020019260010160208160000104928301926001030263000068d0565b801563000069585782816101000a81549060ff02191690556001016020816000010492830192600103026300006927565b505b509050630000696b91906300007069565b5090565b82805482825590600052602060002090601f016020900481019282156300006a245791602002820160005b8382111563000069f157835183826101000a81548160ff0219169083601781111563000069ce5763000069cd6300007110565b5b02179055509260200192600101602081600001049283019260010302630000699a565b80156300006a225782816101000a81549060ff021916905560010160208160000104928301926001030263000069f1565b505b5090506300006a3591906300007069565b5090565b8280548282559060005260206000209081019282156300006a92579160200282015b828111156300006a915782518290805190602001906300006a7f9291906300006417565b50916020019190600101906300006a5b565b5b5090506300006aa39190630000703d565b5090565b8280548282559060005260206000209081019282156300006b00579160200282015b828111156300006aff5782518290805190602001906300006aed9291906300006417565b50916020019190600101906300006ac9565b5b5090506300006b119190630000703d565b5090565b8280548282559060005260206000209081019282156300006b6e579160200282015b828111156300006b6d5782518290805190602001906300006b5b9291906300006417565b50916020019190600101906300006b37565b5b5090506300006b7f9190630000703d565b5090565b8280548282559060005260206000209081019282156300006bdc579160200282015b828111156300006bdb5782518290805190602001906300006bc99291906300006417565b50916020019190600101906300006ba5565b5b5090506300006bed9190630000703d565b5090565b8280548282559060005260206000209081019282156300006c4a579160200282015b828111156300006c495782518290805190602001906300006c379291906300006417565b50916020019190600101906300006c13565b5b5090506300006c5b9190630000703d565b5090565b8280548282559060005260206000209081019282156300006cb8579160200282015b828111156300006cb75782518290805190602001906300006ca59291906300006417565b50916020019190600101906300006c81565b5b5090506300006cc99190630000703d565b5090565b8280548282559060005260206000209081019282156300006d26579160200282015b828111156300006d255782518290805190602001906300006d139291906300006417565b50916020019190600101906300006cef565b5b5090506300006d379190630000703d565b5090565b8280548282559060005260206000209081019282156300006d94579160200282015b828111156300006d935782518290805190602001906300006d819291906300006417565b50916020019190600101906300006d5d565b5b5090506300006da59190630000703d565b5090565b8280548282559060005260206000209081019282156300006e02579160200282015b828111156300006e015782518290805190602001906300006def9291906300006417565b50916020019190600101906300006dcb565b5b5090506300006e139190630000703d565b5090565b8280548282559060005260206000209081019282156300006e70579160200282015b828111156300006e6f5782518290805190602001906300006e5d9291906300006417565b50916020019190600101906300006e39565b5b5090506300006e819190630000703d565b5090565b8280548282559060005260206000209081019282156300006ede579160200282015b828111156300006edd5782518290805190602001906300006ecb9291906300006417565b50916020019190600101906300006ea7565b5b5090506300006eef9190630000703d565b5090565b8280548282559060005260206000209081019282156300006f4c579160200282015b828111156300006f4b5782518290805190602001906300006f399291906300006417565b50916020019190600101906300006f15565b5b5090506300006f5d9190630000703d565b5090565b8280548282559060005260206000209081019282156300006fba579160200282015b828111156300006fb95782518290805190602001906300006fa79291906300006417565b50916020019190600101906300006f83565b5b5090506300006fcb9190630000703d565b5090565b8280548282559060005260206000209081019282156300007028579160200282015b82811115630000702757825182908051906020019063000070159291906300006417565b50916020019190600101906300006ff1565b5b50905063000070399190630000703d565b5090565b5b8082111563000070655760008181630000705a9190630000708a565b50600101630000703e565b5090565b5b808211156300007086576000816000905550600101630000706a565b5090565b508054630000709a9063000070d6565b6000825580601f1063000070b0575063000070d3565b601f01602090049060005260206000209081019063000070d291906300007069565b5b50565b6000600282049050600182168063000070f057607f821691505b60208210811415630000710a576300007109630000713f565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b615ee480630000717f6000396000f3fe60806040526004361061019c5760003560e01c80636ba4c138116100ec578063b88d4fde1161008a578063cda9633811610064578063cda96338146105db578063e985e9c51461061a578063f2fde38b14610657578063fe31eaa8146106805761019c565b8063b88d4fde1461054c578063c39cbef114610575578063c87b56dd1461059e5761019c565b80638da5cb5b116100c65780638da5cb5b1461049057806395d89b41146104bb578063a22cb465146104e6578063b1fc98e81461050f5761019c565b80636ba4c1381461042057806370a082311461043c578063715018a6146104795761019c565b80632f745c591161015957806343054782116101335780634305478214610340578063434f48c41461037d5780634f6ccce7146103a65780636352211e146103e35761019c565b80632f745c59146102c35780633ccfd60b1461030057806342842e0e146103175761019c565b806301ffc9a7146101a157806306fdde03146101de578063081812fc14610209578063095ea7b31461024657806318160ddd1461026f57806323b872dd1461029a575b600080fd5b3480156101ad57600080fd5b506101c860048036038101906101c391906144d8565b6106a9565b6040516101d59190614d86565b60405180910390f35b3480156101ea57600080fd5b506101f3610723565b6040516102009190614da1565b60405180910390f35b34801561021557600080fd5b50610230600480360381019061022b9190614609565b6107b5565b60405161023d9190614d1f565b60405180910390f35b34801561025257600080fd5b5061026d6004803603810190610268919061444f565b61083a565b005b34801561027b57600080fd5b50610284610952565b6040516102919190615147565b60405180910390f35b3480156102a657600080fd5b506102c160048036038101906102bc9190614339565b61095f565b005b3480156102cf57600080fd5b506102ea60048036038101906102e5919061444f565b6109bf565b6040516102f79190615147565b60405180910390f35b34801561030c57600080fd5b50610315610a64565b005b34801561032357600080fd5b5061033e60048036038101906103399190614339565b610b30565b005b34801561034c57600080fd5b5061036760048036038101906103629190614609565b610b50565b6040516103749190614da1565b60405180910390f35b34801561038957600080fd5b506103a4600480360381019061039f9190614609565b610bf0565b005b3480156103b257600080fd5b506103cd60048036038101906103c89190614609565b610d95565b6040516103da9190615147565b60405180910390f35b3480156103ef57600080fd5b5061040a60048036038101906104059190614609565b610e06565b6040516104179190614d1f565b60405180910390f35b61043a6004803603810190610435919061448f565b610eb8565b005b34801561044857600080fd5b50610463600480360381019061045e91906142cc565b61115c565b6040516104709190615147565b60405180910390f35b34801561048557600080fd5b5061048e611214565b005b34801561049c57600080fd5b506104a561129c565b6040516104b29190614d1f565b60405180910390f35b3480156104c757600080fd5b506104d06112c6565b6040516104dd9190614da1565b60405180910390f35b3480156104f257600080fd5b5061050d6004803603810190610508919061440f565b611358565b005b34801561051b57600080fd5b5061053660048036038101906105319190614609565b6114d9565b6040516105439190614da1565b60405180910390f35b34801561055857600080fd5b50610573600480360381019061056e919061438c565b61157c565b005b34801561058157600080fd5b5061059c60048036038101906105979190614636565b6115de565b005b3480156105aa57600080fd5b506105c560048036038101906105c09190614609565b611687565b6040516105d29190614da1565b60405180910390f35b3480156105e757600080fd5b5061060260048036038101906105fd9190614609565b6117a3565b60405161061193929190614dc3565b60405180910390f35b34801561062657600080fd5b50610641600480360381019061063c91906142f9565b612775565b60405161064e9190614d86565b60405180910390f35b34801561066357600080fd5b5061067e600480360381019061067991906142cc565b612809565b005b34801561068c57600080fd5b506106a760048036038101906106a29190614532565b612901565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061071c575061071b82612a2f565b5b9050919050565b6060600080546107329061545d565b80601f016020809104026020016040519081016040528092919081815260200182805461075e9061545d565b80156107ab5780601f10610780576101008083540402835291602001916107ab565b820191906000526020600020905b81548152906001019060200180831161078e57829003601f168201915b5050505050905090565b60006107c082612b11565b6107ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107f690615027565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061084582610e06565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156108b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ad90615087565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108d5612b7d565b73ffffffffffffffffffffffffffffffffffffffff1614806109045750610903816108fe612b7d565b612775565b5b610943576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093a90614f67565b60405180910390fd5b61094d8383612b85565b505050565b6000600880549050905090565b61097061096a612b7d565b82612c3e565b6109af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a6906150c7565b60405180910390fd5b6109ba838383612d1c565b505050565b60006109ca8361115c565b8210610a0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0290614e87565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610a6c612b7d565b73ffffffffffffffffffffffffffffffffffffffff16610a8a61129c565b73ffffffffffffffffffffffffffffffffffffffff1614610ae0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad790615047565b60405180910390fd5b610ae8612b7d565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610b2d573d6000803e3d6000fd5b50565b610b4b8383836040518060200160405280600081525061157c565b505050565b60106020528060005260406000206000915090508054610b6f9061545d565b80601f0160208091040260200160405190810160405280929190818152602001828054610b9b9061545d565b8015610be85780601f10610bbd57610100808354040283529160200191610be8565b820191906000526020600020905b815481529060010190602001808311610bcb57829003601f168201915b505050505081565b6002600a541415610c36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2d90615127565b60405180910390fd5b6002600a81905550610c46612b7d565b73ffffffffffffffffffffffffffffffffffffffff16610c6461129c565b73ffffffffffffffffffffffffffffffffffffffff1614610cba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb190615047565b60405180910390fd5b611e6181118015610ccc5750611f4181105b610d0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0290614fc7565b60405180910390fd5b610d1c610d1661129c565b82612f78565b610d636040518060400160405280600781526020017f4861696b75202300000000000000000000000000000000000000000000000000815250610d5e83612f96565b6130f7565b601060008381526020019081526020016000209080519060200190610d89929190614020565b506001600a8190555050565b6000610d9f610952565b8210610de0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd7906150e7565b60405180910390fd5b60088281548110610df457610df3615625565b5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610eaf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea690614fa7565b60405180910390fd5b80915050919050565b6002600a541415610efe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef590615127565b60405180910390fd5b6002600a81905550610f0e612b7d565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610f4557600080fd5b601481511115610f8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8190615107565b60405180910390fd5b805166470de4df820000610f9e91906152f4565b341015610fe0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd790615007565b60405180910390fd5b60005b815181101561115057600082828151811061100157611000615625565b5b60200260200101511180156110315750611e6282828151811061102757611026615625565b5b6020026020010151105b611070576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106790614fc7565b60405180910390fd5b61109b61107b612b7d565b83838151811061108e5761108d615625565b5b6020026020010151612f78565b6110fc6040518060400160405280600781526020017f4861696b752023000000000000000000000000000000000000000000000000008152506110f78484815181106110ea576110e9615625565b5b6020026020010151612f96565b6130f7565b6010600084848151811061111357611112615625565b5b60200260200101518152602001908152602001600020908051906020019061113c929190614020565b508080611148906154c0565b915050610fe3565b506001600a8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c490614f87565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61121c612b7d565b73ffffffffffffffffffffffffffffffffffffffff1661123a61129c565b73ffffffffffffffffffffffffffffffffffffffff1614611290576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128790615047565b60405180910390fd5b61129a6000613123565b565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546112d59061545d565b80601f01602080910402602001604051908101604052809291908181526020018280546113019061545d565b801561134e5780601f106113235761010080835404028352916020019161134e565b820191906000526020600020905b81548152906001019060200180831161133157829003601f168201915b5050505050905090565b611360612b7d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c590614f27565b60405180910390fd5b80600560006113db612b7d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611488612b7d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516114cd9190614d86565b60405180910390a35050565b600c81600481106114e957600080fd5b0160009150905080546114fb9061545d565b80601f01602080910402602001604051908101604052809291908181526020018280546115279061545d565b80156115745780601f1061154957610100808354040283529160200191611574565b820191906000526020600020905b81548152906001019060200180831161155757829003601f168201915b505050505081565b61158d611587612b7d565b83612c3e565b6115cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c3906150c7565b60405180910390fd5b6115d8848484846131e9565b50505050565b6115e782610e06565b73ffffffffffffffffffffffffffffffffffffffff16611605612b7d565b73ffffffffffffffffffffffffffffffffffffffff161461165b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611652906150a7565b60405180910390fd5b80601060008481526020019081526020016000209080519060200190611682929190614020565b505050565b606080606080611696856117a3565b8093508194508295505050506000600c6000600481106116b9576116b8615625565b5b0184600c6001600481106116d0576116cf615625565b5b0185600c6002600481106116e7576116e6615625565b5b0186600c6003600481106116fe576116fd615625565b5b016040516020016117159796959493929190614c0b565b604051602081830303815290604052905060006117726010600089815260200190815260200160002086868661174a87613245565b60405160200161175e959493929190614c70565b604051602081830303815290604052613245565b9050806040516020016117859190614cfd565b60405160208183030381529060405291508195505050505050919050565b60608060606117b06140a6565b6000856040516020016117c39190614e59565b6040516020818303038152906040528051906020012060001c9050600a6014826117ed9190615509565b10156118825760008260006002811061180957611808615625565b5b602002019060038111156118205761181f615598565b5b9081600381111561183457611833615598565b5b8152505060038260016002811061184e5761184d615625565b5b6020020190600381111561186557611864615598565b5b9081600381111561187957611878615598565b5b8152505061190d565b60018260006002811061189857611897615625565b5b602002019060038111156118af576118ae615598565b5b908160038111156118c3576118c2615598565b5b815250506002826001600281106118dd576118dc615625565b5b602002019060038111156118f4576118f3615598565b5b9081600381111561190857611907615598565b5b815250505b60005b600281101561276b5760606000600381111561192f5761192e615598565b5b84836002811061194257611941615625565b5b6020020151600381111561195957611958615598565b5b1415611a0a5760116000601654856119719190615509565b81526020019081526020016000208054806020026020016040519081016040528092919081815260200182805480156119fe57602002820191906000526020600020906000905b82829054906101000a900460ff1660178111156119d8576119d7615598565b5b815260200190600101906020826000010492830192600103820291508084116119b85790505b50505050509050611cd5565b60016003811115611a1e57611a1d615598565b5b848360028110611a3157611a30615625565b5b60200201516003811115611a4857611a47615598565b5b1415611af9576012600060175485611a609190615509565b8152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015611aed57602002820191906000526020600020906000905b82829054906101000a900460ff166017811115611ac757611ac6615598565b5b81526020019060010190602082600001049283019260010382029150808411611aa75790505b50505050509050611cd4565b60026003811115611b0d57611b0c615598565b5b848360028110611b2057611b1f615625565b5b60200201516003811115611b3757611b36615598565b5b1415611be8576013600060185485611b4f9190615509565b8152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015611bdc57602002820191906000526020600020906000905b82829054906101000a900460ff166017811115611bb657611bb5615598565b5b81526020019060010190602082600001049283019260010382029150808411611b965790505b50505050509050611cd3565b600380811115611bfb57611bfa615598565b5b848360028110611c0e57611c0d615625565b5b60200201516003811115611c2557611c24615598565b5b1415611cd2576014600060195485611c3d9190615509565b8152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015611cca57602002820191906000526020600020906000905b82829054906101000a900460ff166017811115611ca457611ca3615598565b5b81526020019060010190602082600001049283019260010382029150808411611c845790505b505050505090505b5b5b5b6000604051806020016040528060008152509050600080600090505b8351811015612626576000878660028110611d0f57611d0e615625565b5b60200201518c83604051602001611d2893929190614e0f565b6040516020818303038152906040528051906020012060001c905060606000868481518110611d5a57611d59615625565b5b6020026020010151905060006017811115611d7857611d77615598565b5b816017811115611d8b57611d8a615598565b5b1415611e4e5760016003811115611da557611da4615598565b5b8a8960028110611db857611db7615625565b5b60200201516003811115611dcf57611dce615598565b5b1415611def57859c50604051806020016040528060008152509550611e49565b600380811115611e0257611e01615598565b5b8a8960028110611e1557611e14615625565b5b60200201516003811115611e2c57611e2b615598565b5b1415611e4857859b506040518060200160405280600081525095505b5b6124e5565b611e71878581518110611e6457611e63615625565b5b60200260200101516133dd565b9050806017811115611e8657611e85615598565b5b878581518110611e9957611e98615625565b5b60200260200101516017811115611eb357611eb2615598565b5b1461201e5761201760156000836017811115611ed257611ed1615598565b5b6017811115611ee457611ee3615598565b5b815260200190815260200160002060156000846017811115611f0957611f08615598565b5b6017811115611f1b57611f1a615598565b5b81526020019081526020016000208054905085611f389190615509565b81548110611f4957611f48615625565b5b906000526020600020018054611f5e9061545d565b80601f0160208091040260200160405190810160405280929190818152602001828054611f8a9061545d565b8015611fd75780601f10611fac57610100808354040283529160200191611fd7565b820191906000526020600020905b815481529060010190602001808311611fba57829003601f168201915b50505050506040518060400160405280600181526020017f73000000000000000000000000000000000000000000000000000000000000008152506130f7565b91506124e4565b61204187858151811061203457612033615625565b5b602002602001015161348a565b905080601781111561205657612055615598565b5b87858151811061206957612068615625565b5b6020026020010151601781111561208357612082615598565b5b146121ee576121e7601560008360178111156120a2576120a1615598565b5b60178111156120b4576120b3615598565b5b8152602001908152602001600020601560008460178111156120d9576120d8615598565b5b60178111156120eb576120ea615598565b5b815260200190815260200160002080549050856121089190615509565b8154811061211957612118615625565b5b90600052602060002001805461212e9061545d565b80601f016020809104026020016040519081016040528092919081815260200182805461215a9061545d565b80156121a75780601f1061217c576101008083540402835291602001916121a7565b820191906000526020600020905b81548152906001019060200180831161218a57829003601f168201915b50505050506040518060400160405280600381526020017f696e6700000000000000000000000000000000000000000000000000000000008152506130f7565b91506124e3565b61221187858151811061220457612203615625565b5b6020026020010151613501565b905080601781111561222657612225615598565b5b87858151811061223957612238615625565b5b6020026020010151601781111561225357612252615598565b5b146123be576123b76015600083601781111561227257612271615598565b5b601781111561228457612283615598565b5b8152602001908152602001600020601560008460178111156122a9576122a8615598565b5b60178111156122bb576122ba615598565b5b815260200190815260200160002080549050856122d89190615509565b815481106122e9576122e8615625565b5b9060005260206000200180546122fe9061545d565b80601f016020809104026020016040519081016040528092919081815260200182805461232a9061545d565b80156123775780601f1061234c57610100808354040283529160200191612377565b820191906000526020600020905b81548152906001019060200180831161235a57829003601f168201915b50505050506040518060400160405280600281526020017f65640000000000000000000000000000000000000000000000000000000000008152506130f7565b91506124e2565b601560008260178111156123d5576123d4615598565b5b60178111156123e7576123e6615598565b5b81526020019081526020016000206015600083601781111561240c5761240b615598565b5b601781111561241e5761241d615598565b5b8152602001908152602001600020805490508461243b9190615509565b8154811061244c5761244b615625565b5b9060005260206000200180546124619061545d565b80601f016020809104026020016040519081016040528092919081815260200182805461248d9061545d565b80156124da5780601f106124af576101008083540402835291602001916124da565b820191906000526020600020905b8154815290600101906020018083116124bd57829003601f168201915b505050505091505b5b5b5b6000841115612590576124f88186613577565b156125435761253c866040518060400160405280600281526020017f2c200000000000000000000000000000000000000000000000000000000000008152506130f7565b955061258f565b600086511461258e5761258b866040518060400160405280600181526020017f20000000000000000000000000000000000000000000000000000000000000008152506130f7565b95505b5b5b61259a86836130f7565b9550600187516125aa919061534e565b8414156125f3576125f0866040518060400160405280600181526020017f2e000000000000000000000000000000000000000000000000000000000000008152506130f7565b95505b86848151811061260657612605615625565b5b60200260200101519450505050808061261e906154c0565b915050611cf1565b506000600381111561263b5761263a615598565b5b86856002811061264e5761264d615625565b5b6020020151600381111561266557612664615598565b5b141561267357819850612755565b6001600381111561268757612686615598565b5b86856002811061269a57612699615625565b5b602002015160038111156126b1576126b0615598565b5b14156126bf57819750612754565b600260038111156126d3576126d2615598565b5b8685600281106126e6576126e5615625565b5b602002015160038111156126fd576126fc615598565b5b141561270b57819650612753565b60038081111561271e5761271d615598565b5b86856002811061273157612730615625565b5b6020020151600381111561274857612747615598565b5b1415612752578196505b5b5b5b5050508080612763906154c0565b915050611910565b5050509193909250565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612811612b7d565b73ffffffffffffffffffffffffffffffffffffffff1661282f61129c565b73ffffffffffffffffffffffffffffffffffffffff1614612885576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287c90615047565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156128f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ec90614ec7565b60405180910390fd5b6128fe81613123565b50565b612909612b7d565b73ffffffffffffffffffffffffffffffffffffffff1661292761129c565b73ffffffffffffffffffffffffffffffffffffffff161461297d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161297490615047565b60405180910390fd5b83600c60006004811061299357612992615625565b5b0190805190602001906129a7929190614020565b5082600c6001600481106129be576129bd615625565b5b0190805190602001906129d2929190614020565b5081600c6002600481106129e9576129e8615625565b5b0190805190602001906129fd929190614020565b5080600c600360048110612a1457612a13615625565b5b019080519060200190612a28929190614020565b5050505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612afa57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612b0a5750612b09826137c4565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612bf883610e06565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612c4982612b11565b612c88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c7f90614f47565b60405180910390fd5b6000612c9383610e06565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612d0257508373ffffffffffffffffffffffffffffffffffffffff16612cea846107b5565b73ffffffffffffffffffffffffffffffffffffffff16145b80612d135750612d128185612775565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612d3c82610e06565b73ffffffffffffffffffffffffffffffffffffffff1614612d92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d8990615067565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612df990614f07565b60405180910390fd5b612e0d83838361382e565b612e18600082612b85565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e68919061534e565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ebf919061526d565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b612f92828260405180602001604052806000815250613942565b5050565b60606000821415612fde576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506130f2565b600082905060005b60008214613010578080612ff9906154c0565b915050600a8261300991906152c3565b9150612fe6565b60008167ffffffffffffffff81111561302c5761302b615654565b5b6040519080825280601f01601f19166020018201604052801561305e5781602001600182028036833780820191505090505b5090505b600085146130eb57600182613077919061534e565b9150600a856130869190615509565b6030613092919061526d565b60f81b8183815181106130a8576130a7615625565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856130e491906152c3565b9450613062565b8093505050505b919050565b6060828260405160200161310c929190614be7565b604051602081830303815290604052905092915050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6131f4848484612d1c565b6132008484848461399d565b61323f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161323690614ea7565b60405180910390fd5b50505050565b6060600082519050600081141561326e57604051806020016040528060008152509150506133d8565b6000600360028361327f919061526d565b61328991906152c3565b600461329591906152f4565b905060006020826132a6919061526d565b67ffffffffffffffff8111156132bf576132be615654565b5b6040519080825280601f01601f1916602001820160405280156132f15781602001600182028036833780820191505090505b5090506000604051806060016040528060408152602001615e6f604091399050600181016020830160005b868110156133955760038101905062ffffff818a015116603f8160121c168401518060081b905060ff603f83600c1c1686015116810190508060081b905060ff603f8360061c1686015116810190508060081b905060ff603f831686015116810190508060e01b9050808452600484019350505061331c565b5060038606600181146133af57600281146133bf576133ca565b613d3d60f01b60028303526133ca565b603d60f81b60018303525b508484525050819450505050505b919050565b6000601160178111156133f3576133f2615598565b5b82601781111561340657613405615598565b5b14156134155760019050613485565b6012601781111561342957613428615598565b5b82601781111561343c5761343b615598565b5b141561344b5760029050613485565b6013601781111561345f5761345e615598565b5b82601781111561347257613471615598565b5b14156134815760039050613485565b8190505b919050565b6000601460178111156134a05761349f615598565b5b8260178111156134b3576134b2615598565b5b14156134c257600f90506134fc565b601560178111156134d6576134d5615598565b5b8260178111156134e9576134e8615598565b5b14156134f857601090506134fc565b8190505b919050565b60006016601781111561351757613516615598565b5b82601781111561352a57613529615598565b5b141561353957600f9050613572565b60178081111561354c5761354b615598565b5b82601781111561355f5761355e615598565b5b141561356e5760109050613572565b8190505b919050565b60006004601781111561358d5761358c615598565b5b8360178111156135a05761359f615598565b5b14806135d05750600560178111156135bb576135ba615598565b5b8360178111156135ce576135cd615598565b5b145b806135ff5750600660178111156135ea576135e9615598565b5b8360178111156135fd576135fc615598565b5b145b15613699576004601781111561361857613617615598565b5b82601781111561362b5761362a615598565b5b148061365b57506005601781111561364657613645615598565b5b82601781111561365957613658615598565b5b145b8061368a57506006601781111561367557613674615598565b5b82601781111561368857613687615598565b5b145b1561369857600190506137be565b5b600160178111156136ad576136ac615598565b5b8360178111156136c0576136bf615598565b5b14806136f05750600260178111156136db576136da615598565b5b8360178111156136ee576136ed615598565b5b145b8061371f57506003601781111561370a57613709615598565b5b83601781111561371d5761371c615598565b5b145b156137b9576001601781111561373857613737615598565b5b82601781111561374b5761374a615598565b5b148061377b57506002601781111561376657613765615598565b5b82601781111561377957613778615598565b5b145b806137aa57506003601781111561379557613794615598565b5b8260178111156137a8576137a7615598565b5b145b156137b857600190506137be565b5b600090505b92915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b613839838383613b34565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561387c5761387781613b39565b6138bb565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146138ba576138b98382613b82565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156138fe576138f981613cef565b61393d565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461393c5761393b8282613dc0565b5b5b505050565b61394c8383613e3f565b613959600084848461399d565b613998576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161398f90614ea7565b60405180910390fd5b505050565b60006139be8473ffffffffffffffffffffffffffffffffffffffff1661400d565b15613b27578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026139e7612b7d565b8786866040518563ffffffff1660e01b8152600401613a099493929190614d3a565b602060405180830381600087803b158015613a2357600080fd5b505af1925050508015613a5457506040513d601f19601f82011682018060405250810190613a519190614505565b60015b613ad7573d8060008114613a84576040519150601f19603f3d011682016040523d82523d6000602084013e613a89565b606091505b50600081511415613acf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ac690614ea7565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613b2c565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613b8f8461115c565b613b99919061534e565b9050600060076000848152602001908152602001600020549050818114613c7e576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613d03919061534e565b9050600060096000848152602001908152602001600020549050600060088381548110613d3357613d32615625565b5b906000526020600020015490508060088381548110613d5557613d54615625565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613da457613da36155f6565b5b6001900381819060005260206000200160009055905550505050565b6000613dcb8361115c565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613eaf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ea690614fe7565b60405180910390fd5b613eb881612b11565b15613ef8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613eef90614ee7565b60405180910390fd5b613f046000838361382e565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613f54919061526d565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b82805461402c9061545d565b90600052602060002090601f01602090048101928261404e5760008555614095565b82601f1061406757805160ff1916838001178555614095565b82800160010185558215614095579182015b82811115614094578251825591602001919060010190614079565b5b5090506140a291906140c8565b5090565b6040518060400160405280600290602082028036833780820191505090505090565b5b808211156140e15760008160009055506001016140c9565b5090565b60006140f86140f384615187565b615162565b9050808382526020820190508285602086028201111561411b5761411a615688565b5b60005b8581101561414b578161413188826142b7565b84526020840193506020830192505060018101905061411e565b5050509392505050565b6000614168614163846151b3565b615162565b9050828152602081018484840111156141845761418361568d565b5b61418f84828561541b565b509392505050565b60006141aa6141a5846151e4565b615162565b9050828152602081018484840111156141c6576141c561568d565b5b6141d184828561541b565b509392505050565b6000813590506141e881615e12565b92915050565b600082601f83011261420357614202615683565b5b81356142138482602086016140e5565b91505092915050565b60008135905061422b81615e29565b92915050565b60008135905061424081615e40565b92915050565b60008151905061425581615e40565b92915050565b600082601f8301126142705761426f615683565b5b8135614280848260208601614155565b91505092915050565b600082601f83011261429e5761429d615683565b5b81356142ae848260208601614197565b91505092915050565b6000813590506142c681615e57565b92915050565b6000602082840312156142e2576142e1615697565b5b60006142f0848285016141d9565b91505092915050565b600080604083850312156143105761430f615697565b5b600061431e858286016141d9565b925050602061432f858286016141d9565b9150509250929050565b60008060006060848603121561435257614351615697565b5b6000614360868287016141d9565b9350506020614371868287016141d9565b9250506040614382868287016142b7565b9150509250925092565b600080600080608085870312156143a6576143a5615697565b5b60006143b4878288016141d9565b94505060206143c5878288016141d9565b93505060406143d6878288016142b7565b925050606085013567ffffffffffffffff8111156143f7576143f6615692565b5b6144038782880161425b565b91505092959194509250565b6000806040838503121561442657614425615697565b5b6000614434858286016141d9565b92505060206144458582860161421c565b9150509250929050565b6000806040838503121561446657614465615697565b5b6000614474858286016141d9565b9250506020614485858286016142b7565b9150509250929050565b6000602082840312156144a5576144a4615697565b5b600082013567ffffffffffffffff8111156144c3576144c2615692565b5b6144cf848285016141ee565b91505092915050565b6000602082840312156144ee576144ed615697565b5b60006144fc84828501614231565b91505092915050565b60006020828403121561451b5761451a615697565b5b600061452984828501614246565b91505092915050565b6000806000806080858703121561454c5761454b615697565b5b600085013567ffffffffffffffff81111561456a57614569615692565b5b61457687828801614289565b945050602085013567ffffffffffffffff81111561459757614596615692565b5b6145a387828801614289565b935050604085013567ffffffffffffffff8111156145c4576145c3615692565b5b6145d087828801614289565b925050606085013567ffffffffffffffff8111156145f1576145f0615692565b5b6145fd87828801614289565b91505092959194509250565b60006020828403121561461f5761461e615697565b5b600061462d848285016142b7565b91505092915050565b6000806040838503121561464d5761464c615697565b5b600061465b858286016142b7565b925050602083013567ffffffffffffffff81111561467c5761467b615692565b5b61468885828601614289565b9150509250929050565b61469b81615382565b82525050565b6146aa81615394565b82525050565b60006146bb8261522a565b6146c58185615240565b93506146d581856020860161542a565b6146de8161569c565b840191505092915050565b6146f281615409565b82525050565b600061470382615235565b61470d8185615251565b935061471d81856020860161542a565b6147268161569c565b840191505092915050565b600061473c82615235565b6147468185615262565b935061475681856020860161542a565b80840191505092915050565b6000815461476f8161545d565b6147798186615262565b9450600182166000811461479457600181146147a5576147d8565b60ff198316865281860193506147d8565b6147ae85615215565b60005b838110156147d0578154818901526001820191506020810190506147b1565b838801955050505b50505092915050565b60006147ee601683615251565b91506147f9826156ad565b602082019050919050565b6000614811602b83615251565b915061481c826156d6565b604082019050919050565b6000614834603283615251565b915061483f82615725565b604082019050919050565b6000614857602683615251565b915061486282615774565b604082019050919050565b600061487a601c83615251565b9150614885826157c3565b602082019050919050565b600061489d602483615251565b91506148a8826157ec565b604082019050919050565b60006148c0601983615251565b91506148cb8261583b565b602082019050919050565b60006148e3602c83615251565b91506148ee82615864565b604082019050919050565b6000614906600183615262565b9150614911826158b3565b600182019050919050565b6000614929603883615251565b9150614934826158dc565b604082019050919050565b600061494c602a83615251565b91506149578261592b565b604082019050919050565b600061496f602983615251565b915061497a8261597a565b604082019050919050565b6000614992600683615251565b915061499d826159c9565b602082019050919050565b60006149b5600283615262565b91506149c0826159f2565b600282019050919050565b60006149d8602083615251565b91506149e382615a1b565b602082019050919050565b60006149fb600e83615251565b9150614a0682615a44565b602082019050919050565b6000614a1e602c83615251565b9150614a2982615a6d565b604082019050919050565b6000614a41602083615251565b9150614a4c82615abc565b602082019050919050565b6000614a64602983615251565b9150614a6f82615ae5565b604082019050919050565b6000614a87602783615262565b9150614a9282615b34565b602782019050919050565b6000614aaa600a83615262565b9150614ab582615b83565b600a82019050919050565b6000614acd602183615251565b9150614ad882615bac565b604082019050919050565b6000614af0601d83615262565b9150614afb82615bfb565b601d82019050919050565b6000614b13600983615251565b9150614b1e82615c24565b602082019050919050565b6000614b36603183615251565b9150614b4182615c4d565b604082019050919050565b6000614b59602c83615251565b9150614b6482615c9c565b604082019050919050565b6000614b7c600383615251565b9150614b8782615ceb565b602082019050919050565b6000614b9f601f83615251565b9150614baa82615d14565b602082019050919050565b6000614bc2608e83615262565b9150614bcd82615d3d565b608e82019050919050565b614be1816153ff565b82525050565b6000614bf38285614731565b9150614bff8284614731565b91508190509392505050565b6000614c17828a614762565b9150614c238289614731565b9150614c2f8288614762565b9150614c3b8287614731565b9150614c478286614762565b9150614c538285614731565b9150614c5f8284614762565b915081905098975050505050505050565b6000614c7b82614a9d565b9150614c878288614762565b9150614c9282614bb5565b9150614c9e8287614731565b9150614ca9826148f9565b9150614cb58286614731565b9150614cc0826148f9565b9150614ccc8285614731565b9150614cd782614a7a565b9150614ce38284614731565b9150614cee826149a8565b91508190509695505050505050565b6000614d0882614ae3565b9150614d148284614731565b915081905092915050565b6000602082019050614d346000830184614692565b92915050565b6000608082019050614d4f6000830187614692565b614d5c6020830186614692565b614d696040830185614bd8565b8181036060830152614d7b81846146b0565b905095945050505050565b6000602082019050614d9b60008301846146a1565b92915050565b60006020820190508181036000830152614dbb81846146f8565b905092915050565b60006060820190508181036000830152614ddd81866146f8565b90508181036020830152614df181856146f8565b90508181036040830152614e0581846146f8565b9050949350505050565b60006080820190508181036000830152614e28816147e1565b9050614e3760208301866146e9565b614e446040830185614bd8565b614e516060830184614bd8565b949350505050565b60006040820190508181036000830152614e72816147e1565b9050614e816020830184614bd8565b92915050565b60006020820190508181036000830152614ea081614804565b9050919050565b60006020820190508181036000830152614ec081614827565b9050919050565b60006020820190508181036000830152614ee08161484a565b9050919050565b60006020820190508181036000830152614f008161486d565b9050919050565b60006020820190508181036000830152614f2081614890565b9050919050565b60006020820190508181036000830152614f40816148b3565b9050919050565b60006020820190508181036000830152614f60816148d6565b9050919050565b60006020820190508181036000830152614f808161491c565b9050919050565b60006020820190508181036000830152614fa08161493f565b9050919050565b60006020820190508181036000830152614fc081614962565b9050919050565b60006020820190508181036000830152614fe081614985565b9050919050565b60006020820190508181036000830152615000816149cb565b9050919050565b60006020820190508181036000830152615020816149ee565b9050919050565b6000602082019050818103600083015261504081614a11565b9050919050565b6000602082019050818103600083015261506081614a34565b9050919050565b6000602082019050818103600083015261508081614a57565b9050919050565b600060208201905081810360008301526150a081614ac0565b9050919050565b600060208201905081810360008301526150c081614b06565b9050919050565b600060208201905081810360008301526150e081614b29565b9050919050565b6000602082019050818103600083015261510081614b4c565b9050919050565b6000602082019050818103600083015261512081614b6f565b9050919050565b6000602082019050818103600083015261514081614b92565b9050919050565b600060208201905061515c6000830184614bd8565b92915050565b600061516c61517d565b9050615178828261548f565b919050565b6000604051905090565b600067ffffffffffffffff8211156151a2576151a1615654565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156151ce576151cd615654565b5b6151d78261569c565b9050602081019050919050565b600067ffffffffffffffff8211156151ff576151fe615654565b5b6152088261569c565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000615278826153ff565b9150615283836153ff565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156152b8576152b761553a565b5b828201905092915050565b60006152ce826153ff565b91506152d9836153ff565b9250826152e9576152e8615569565b5b828204905092915050565b60006152ff826153ff565b915061530a836153ff565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156153435761534261553a565b5b828202905092915050565b6000615359826153ff565b9150615364836153ff565b9250828210156153775761537661553a565b5b828203905092915050565b600061538d826153df565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60008190506153da82615dfe565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000615414826153cc565b9050919050565b82818337600083830152505050565b60005b8381101561544857808201518184015260208101905061542d565b83811115615457576000848401525b50505050565b6000600282049050600182168061547557607f821691505b60208210811415615489576154886155c7565b5b50919050565b6154988261569c565b810181811067ffffffffffffffff821117156154b7576154b6615654565b5b80604052505050565b60006154cb826153ff565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156154fe576154fd61553a565b5b600182019050919050565b6000615514826153ff565b915061551f836153ff565b92508261552f5761552e615569565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f48545450533a2f2f5757572e4841494b55532e4f524700000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2000000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f6261642049440000000000000000000000000000000000000000000000000000600082015250565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4e6f7420656e6f75676820455448000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f222c2022696d616765223a2022646174613a696d6167652f7376672b786d6c3b60008201527f6261736536342c00000000000000000000000000000000000000000000000000602082015250565b7f7b226e616d65223a202200000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b7f4e6f74206f776e65720000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4f6f660000000000000000000000000000000000000000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f222c20226465736372697074696f6e223a20224861696b75732069732061206360008201527f6f6c6c656374696f6e206f66204861696b7520706f656d732c20756e6971756560208201527f6c792067656e657261746564206f6e2074686520457468657265756d20626c6f60408201527f636b636861696e2e204c6561726e206d6f72652061742068747470733a2f2f6860608201527f61696b75732e6f7267202f2f2f20000000000000000000000000000000000000608082015250565b60048110615e0f57615e0e615598565b5b50565b615e1b81615382565b8114615e2657600080fd5b50565b615e3281615394565b8114615e3d57600080fd5b50565b615e49816153a0565b8114615e5457600080fd5b50565b615e60816153ff565b8114615e6b57600080fd5b5056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa264697066735822122077eadbc653a383755cc445aeb819373ce57502d0d99a695ba193998febc247b164736f6c634300080600333c2f746578743e3c7465787420783d2233302220793d2238302220636c6173733d2262617365223e3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302034303020343030223e203c6c696e6561724772616469656e74207370726561644d6574686f643d22706164222069643d2267222078313d223025222079313d223025222078323d2231323925222079323d22333825223e203c73746f70206f66667365743d223022207374796c653d2273746f702d636f6c6f723a726762283235322c203232352c20313738293b73746f702d6f7061636974793a313b222f3e203c73746f70206f66667365743d2235362522207374796c653d2273746f702d636f6c6f723a726762283235322c203232382c20313738293b73746f702d6f7061636974793a313b222f3e203c73746f70206f66667365743d223130302522207374796c653d2273746f702d636f6c6f723a726762283232302c203135352c203337293b73746f702d6f7061636974793a313b222f3e203c2f6c696e6561724772616469656e743e203c66696c7465722069643d2277223e203c666554757262756c656e636520783d22302220793d22302220626173654672657175656e63793d22302e303122206e756d4f6374617665733d22352220736565643d2231222f3e203c6665446973706c6163656d656e744d617020726573756c743d22742220696e3d22536f757263654772617068696322207363616c653d22323022202f3e203c66654d657267653e203c66654d657267654e6f646520696e3d2274222f3e203c2f66654d657267653e203c2f66696c7465723e203c7374796c653e2074657874207b2066696c6c3a20233639326530393b20666f6e742d66616d696c793a2073657269663b20666f6e742d73697a653a20313870783b207d203c2f7374796c653e203c726563742077696474683d2239372522206865696768743d22393725222066696c7465723d2275726c28237729222066696c6c3d2275726c2823672922202f3e203c7465787420783d2233302220793d223530223e3c2f746578743e3c7465787420783d2233302220793d223131302220636c6173733d2262617365223e
Deployed Bytecode
0x60806040526004361061019c5760003560e01c80636ba4c138116100ec578063b88d4fde1161008a578063cda9633811610064578063cda96338146105db578063e985e9c51461061a578063f2fde38b14610657578063fe31eaa8146106805761019c565b8063b88d4fde1461054c578063c39cbef114610575578063c87b56dd1461059e5761019c565b80638da5cb5b116100c65780638da5cb5b1461049057806395d89b41146104bb578063a22cb465146104e6578063b1fc98e81461050f5761019c565b80636ba4c1381461042057806370a082311461043c578063715018a6146104795761019c565b80632f745c591161015957806343054782116101335780634305478214610340578063434f48c41461037d5780634f6ccce7146103a65780636352211e146103e35761019c565b80632f745c59146102c35780633ccfd60b1461030057806342842e0e146103175761019c565b806301ffc9a7146101a157806306fdde03146101de578063081812fc14610209578063095ea7b31461024657806318160ddd1461026f57806323b872dd1461029a575b600080fd5b3480156101ad57600080fd5b506101c860048036038101906101c391906144d8565b6106a9565b6040516101d59190614d86565b60405180910390f35b3480156101ea57600080fd5b506101f3610723565b6040516102009190614da1565b60405180910390f35b34801561021557600080fd5b50610230600480360381019061022b9190614609565b6107b5565b60405161023d9190614d1f565b60405180910390f35b34801561025257600080fd5b5061026d6004803603810190610268919061444f565b61083a565b005b34801561027b57600080fd5b50610284610952565b6040516102919190615147565b60405180910390f35b3480156102a657600080fd5b506102c160048036038101906102bc9190614339565b61095f565b005b3480156102cf57600080fd5b506102ea60048036038101906102e5919061444f565b6109bf565b6040516102f79190615147565b60405180910390f35b34801561030c57600080fd5b50610315610a64565b005b34801561032357600080fd5b5061033e60048036038101906103399190614339565b610b30565b005b34801561034c57600080fd5b5061036760048036038101906103629190614609565b610b50565b6040516103749190614da1565b60405180910390f35b34801561038957600080fd5b506103a4600480360381019061039f9190614609565b610bf0565b005b3480156103b257600080fd5b506103cd60048036038101906103c89190614609565b610d95565b6040516103da9190615147565b60405180910390f35b3480156103ef57600080fd5b5061040a60048036038101906104059190614609565b610e06565b6040516104179190614d1f565b60405180910390f35b61043a6004803603810190610435919061448f565b610eb8565b005b34801561044857600080fd5b50610463600480360381019061045e91906142cc565b61115c565b6040516104709190615147565b60405180910390f35b34801561048557600080fd5b5061048e611214565b005b34801561049c57600080fd5b506104a561129c565b6040516104b29190614d1f565b60405180910390f35b3480156104c757600080fd5b506104d06112c6565b6040516104dd9190614da1565b60405180910390f35b3480156104f257600080fd5b5061050d6004803603810190610508919061440f565b611358565b005b34801561051b57600080fd5b5061053660048036038101906105319190614609565b6114d9565b6040516105439190614da1565b60405180910390f35b34801561055857600080fd5b50610573600480360381019061056e919061438c565b61157c565b005b34801561058157600080fd5b5061059c60048036038101906105979190614636565b6115de565b005b3480156105aa57600080fd5b506105c560048036038101906105c09190614609565b611687565b6040516105d29190614da1565b60405180910390f35b3480156105e757600080fd5b5061060260048036038101906105fd9190614609565b6117a3565b60405161061193929190614dc3565b60405180910390f35b34801561062657600080fd5b50610641600480360381019061063c91906142f9565b612775565b60405161064e9190614d86565b60405180910390f35b34801561066357600080fd5b5061067e600480360381019061067991906142cc565b612809565b005b34801561068c57600080fd5b506106a760048036038101906106a29190614532565b612901565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061071c575061071b82612a2f565b5b9050919050565b6060600080546107329061545d565b80601f016020809104026020016040519081016040528092919081815260200182805461075e9061545d565b80156107ab5780601f10610780576101008083540402835291602001916107ab565b820191906000526020600020905b81548152906001019060200180831161078e57829003601f168201915b5050505050905090565b60006107c082612b11565b6107ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107f690615027565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061084582610e06565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156108b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ad90615087565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108d5612b7d565b73ffffffffffffffffffffffffffffffffffffffff1614806109045750610903816108fe612b7d565b612775565b5b610943576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093a90614f67565b60405180910390fd5b61094d8383612b85565b505050565b6000600880549050905090565b61097061096a612b7d565b82612c3e565b6109af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a6906150c7565b60405180910390fd5b6109ba838383612d1c565b505050565b60006109ca8361115c565b8210610a0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0290614e87565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610a6c612b7d565b73ffffffffffffffffffffffffffffffffffffffff16610a8a61129c565b73ffffffffffffffffffffffffffffffffffffffff1614610ae0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad790615047565b60405180910390fd5b610ae8612b7d565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610b2d573d6000803e3d6000fd5b50565b610b4b8383836040518060200160405280600081525061157c565b505050565b60106020528060005260406000206000915090508054610b6f9061545d565b80601f0160208091040260200160405190810160405280929190818152602001828054610b9b9061545d565b8015610be85780601f10610bbd57610100808354040283529160200191610be8565b820191906000526020600020905b815481529060010190602001808311610bcb57829003601f168201915b505050505081565b6002600a541415610c36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2d90615127565b60405180910390fd5b6002600a81905550610c46612b7d565b73ffffffffffffffffffffffffffffffffffffffff16610c6461129c565b73ffffffffffffffffffffffffffffffffffffffff1614610cba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb190615047565b60405180910390fd5b611e6181118015610ccc5750611f4181105b610d0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0290614fc7565b60405180910390fd5b610d1c610d1661129c565b82612f78565b610d636040518060400160405280600781526020017f4861696b75202300000000000000000000000000000000000000000000000000815250610d5e83612f96565b6130f7565b601060008381526020019081526020016000209080519060200190610d89929190614020565b506001600a8190555050565b6000610d9f610952565b8210610de0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd7906150e7565b60405180910390fd5b60088281548110610df457610df3615625565b5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610eaf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea690614fa7565b60405180910390fd5b80915050919050565b6002600a541415610efe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef590615127565b60405180910390fd5b6002600a81905550610f0e612b7d565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610f4557600080fd5b601481511115610f8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8190615107565b60405180910390fd5b805166470de4df820000610f9e91906152f4565b341015610fe0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd790615007565b60405180910390fd5b60005b815181101561115057600082828151811061100157611000615625565b5b60200260200101511180156110315750611e6282828151811061102757611026615625565b5b6020026020010151105b611070576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106790614fc7565b60405180910390fd5b61109b61107b612b7d565b83838151811061108e5761108d615625565b5b6020026020010151612f78565b6110fc6040518060400160405280600781526020017f4861696b752023000000000000000000000000000000000000000000000000008152506110f78484815181106110ea576110e9615625565b5b6020026020010151612f96565b6130f7565b6010600084848151811061111357611112615625565b5b60200260200101518152602001908152602001600020908051906020019061113c929190614020565b508080611148906154c0565b915050610fe3565b506001600a8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c490614f87565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61121c612b7d565b73ffffffffffffffffffffffffffffffffffffffff1661123a61129c565b73ffffffffffffffffffffffffffffffffffffffff1614611290576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128790615047565b60405180910390fd5b61129a6000613123565b565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546112d59061545d565b80601f01602080910402602001604051908101604052809291908181526020018280546113019061545d565b801561134e5780601f106113235761010080835404028352916020019161134e565b820191906000526020600020905b81548152906001019060200180831161133157829003601f168201915b5050505050905090565b611360612b7d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c590614f27565b60405180910390fd5b80600560006113db612b7d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611488612b7d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516114cd9190614d86565b60405180910390a35050565b600c81600481106114e957600080fd5b0160009150905080546114fb9061545d565b80601f01602080910402602001604051908101604052809291908181526020018280546115279061545d565b80156115745780601f1061154957610100808354040283529160200191611574565b820191906000526020600020905b81548152906001019060200180831161155757829003601f168201915b505050505081565b61158d611587612b7d565b83612c3e565b6115cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c3906150c7565b60405180910390fd5b6115d8848484846131e9565b50505050565b6115e782610e06565b73ffffffffffffffffffffffffffffffffffffffff16611605612b7d565b73ffffffffffffffffffffffffffffffffffffffff161461165b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611652906150a7565b60405180910390fd5b80601060008481526020019081526020016000209080519060200190611682929190614020565b505050565b606080606080611696856117a3565b8093508194508295505050506000600c6000600481106116b9576116b8615625565b5b0184600c6001600481106116d0576116cf615625565b5b0185600c6002600481106116e7576116e6615625565b5b0186600c6003600481106116fe576116fd615625565b5b016040516020016117159796959493929190614c0b565b604051602081830303815290604052905060006117726010600089815260200190815260200160002086868661174a87613245565b60405160200161175e959493929190614c70565b604051602081830303815290604052613245565b9050806040516020016117859190614cfd565b60405160208183030381529060405291508195505050505050919050565b60608060606117b06140a6565b6000856040516020016117c39190614e59565b6040516020818303038152906040528051906020012060001c9050600a6014826117ed9190615509565b10156118825760008260006002811061180957611808615625565b5b602002019060038111156118205761181f615598565b5b9081600381111561183457611833615598565b5b8152505060038260016002811061184e5761184d615625565b5b6020020190600381111561186557611864615598565b5b9081600381111561187957611878615598565b5b8152505061190d565b60018260006002811061189857611897615625565b5b602002019060038111156118af576118ae615598565b5b908160038111156118c3576118c2615598565b5b815250506002826001600281106118dd576118dc615625565b5b602002019060038111156118f4576118f3615598565b5b9081600381111561190857611907615598565b5b815250505b60005b600281101561276b5760606000600381111561192f5761192e615598565b5b84836002811061194257611941615625565b5b6020020151600381111561195957611958615598565b5b1415611a0a5760116000601654856119719190615509565b81526020019081526020016000208054806020026020016040519081016040528092919081815260200182805480156119fe57602002820191906000526020600020906000905b82829054906101000a900460ff1660178111156119d8576119d7615598565b5b815260200190600101906020826000010492830192600103820291508084116119b85790505b50505050509050611cd5565b60016003811115611a1e57611a1d615598565b5b848360028110611a3157611a30615625565b5b60200201516003811115611a4857611a47615598565b5b1415611af9576012600060175485611a609190615509565b8152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015611aed57602002820191906000526020600020906000905b82829054906101000a900460ff166017811115611ac757611ac6615598565b5b81526020019060010190602082600001049283019260010382029150808411611aa75790505b50505050509050611cd4565b60026003811115611b0d57611b0c615598565b5b848360028110611b2057611b1f615625565b5b60200201516003811115611b3757611b36615598565b5b1415611be8576013600060185485611b4f9190615509565b8152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015611bdc57602002820191906000526020600020906000905b82829054906101000a900460ff166017811115611bb657611bb5615598565b5b81526020019060010190602082600001049283019260010382029150808411611b965790505b50505050509050611cd3565b600380811115611bfb57611bfa615598565b5b848360028110611c0e57611c0d615625565b5b60200201516003811115611c2557611c24615598565b5b1415611cd2576014600060195485611c3d9190615509565b8152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015611cca57602002820191906000526020600020906000905b82829054906101000a900460ff166017811115611ca457611ca3615598565b5b81526020019060010190602082600001049283019260010382029150808411611c845790505b505050505090505b5b5b5b6000604051806020016040528060008152509050600080600090505b8351811015612626576000878660028110611d0f57611d0e615625565b5b60200201518c83604051602001611d2893929190614e0f565b6040516020818303038152906040528051906020012060001c905060606000868481518110611d5a57611d59615625565b5b6020026020010151905060006017811115611d7857611d77615598565b5b816017811115611d8b57611d8a615598565b5b1415611e4e5760016003811115611da557611da4615598565b5b8a8960028110611db857611db7615625565b5b60200201516003811115611dcf57611dce615598565b5b1415611def57859c50604051806020016040528060008152509550611e49565b600380811115611e0257611e01615598565b5b8a8960028110611e1557611e14615625565b5b60200201516003811115611e2c57611e2b615598565b5b1415611e4857859b506040518060200160405280600081525095505b5b6124e5565b611e71878581518110611e6457611e63615625565b5b60200260200101516133dd565b9050806017811115611e8657611e85615598565b5b878581518110611e9957611e98615625565b5b60200260200101516017811115611eb357611eb2615598565b5b1461201e5761201760156000836017811115611ed257611ed1615598565b5b6017811115611ee457611ee3615598565b5b815260200190815260200160002060156000846017811115611f0957611f08615598565b5b6017811115611f1b57611f1a615598565b5b81526020019081526020016000208054905085611f389190615509565b81548110611f4957611f48615625565b5b906000526020600020018054611f5e9061545d565b80601f0160208091040260200160405190810160405280929190818152602001828054611f8a9061545d565b8015611fd75780601f10611fac57610100808354040283529160200191611fd7565b820191906000526020600020905b815481529060010190602001808311611fba57829003601f168201915b50505050506040518060400160405280600181526020017f73000000000000000000000000000000000000000000000000000000000000008152506130f7565b91506124e4565b61204187858151811061203457612033615625565b5b602002602001015161348a565b905080601781111561205657612055615598565b5b87858151811061206957612068615625565b5b6020026020010151601781111561208357612082615598565b5b146121ee576121e7601560008360178111156120a2576120a1615598565b5b60178111156120b4576120b3615598565b5b8152602001908152602001600020601560008460178111156120d9576120d8615598565b5b60178111156120eb576120ea615598565b5b815260200190815260200160002080549050856121089190615509565b8154811061211957612118615625565b5b90600052602060002001805461212e9061545d565b80601f016020809104026020016040519081016040528092919081815260200182805461215a9061545d565b80156121a75780601f1061217c576101008083540402835291602001916121a7565b820191906000526020600020905b81548152906001019060200180831161218a57829003601f168201915b50505050506040518060400160405280600381526020017f696e6700000000000000000000000000000000000000000000000000000000008152506130f7565b91506124e3565b61221187858151811061220457612203615625565b5b6020026020010151613501565b905080601781111561222657612225615598565b5b87858151811061223957612238615625565b5b6020026020010151601781111561225357612252615598565b5b146123be576123b76015600083601781111561227257612271615598565b5b601781111561228457612283615598565b5b8152602001908152602001600020601560008460178111156122a9576122a8615598565b5b60178111156122bb576122ba615598565b5b815260200190815260200160002080549050856122d89190615509565b815481106122e9576122e8615625565b5b9060005260206000200180546122fe9061545d565b80601f016020809104026020016040519081016040528092919081815260200182805461232a9061545d565b80156123775780601f1061234c57610100808354040283529160200191612377565b820191906000526020600020905b81548152906001019060200180831161235a57829003601f168201915b50505050506040518060400160405280600281526020017f65640000000000000000000000000000000000000000000000000000000000008152506130f7565b91506124e2565b601560008260178111156123d5576123d4615598565b5b60178111156123e7576123e6615598565b5b81526020019081526020016000206015600083601781111561240c5761240b615598565b5b601781111561241e5761241d615598565b5b8152602001908152602001600020805490508461243b9190615509565b8154811061244c5761244b615625565b5b9060005260206000200180546124619061545d565b80601f016020809104026020016040519081016040528092919081815260200182805461248d9061545d565b80156124da5780601f106124af576101008083540402835291602001916124da565b820191906000526020600020905b8154815290600101906020018083116124bd57829003601f168201915b505050505091505b5b5b5b6000841115612590576124f88186613577565b156125435761253c866040518060400160405280600281526020017f2c200000000000000000000000000000000000000000000000000000000000008152506130f7565b955061258f565b600086511461258e5761258b866040518060400160405280600181526020017f20000000000000000000000000000000000000000000000000000000000000008152506130f7565b95505b5b5b61259a86836130f7565b9550600187516125aa919061534e565b8414156125f3576125f0866040518060400160405280600181526020017f2e000000000000000000000000000000000000000000000000000000000000008152506130f7565b95505b86848151811061260657612605615625565b5b60200260200101519450505050808061261e906154c0565b915050611cf1565b506000600381111561263b5761263a615598565b5b86856002811061264e5761264d615625565b5b6020020151600381111561266557612664615598565b5b141561267357819850612755565b6001600381111561268757612686615598565b5b86856002811061269a57612699615625565b5b602002015160038111156126b1576126b0615598565b5b14156126bf57819750612754565b600260038111156126d3576126d2615598565b5b8685600281106126e6576126e5615625565b5b602002015160038111156126fd576126fc615598565b5b141561270b57819650612753565b60038081111561271e5761271d615598565b5b86856002811061273157612730615625565b5b6020020151600381111561274857612747615598565b5b1415612752578196505b5b5b5b5050508080612763906154c0565b915050611910565b5050509193909250565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612811612b7d565b73ffffffffffffffffffffffffffffffffffffffff1661282f61129c565b73ffffffffffffffffffffffffffffffffffffffff1614612885576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287c90615047565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156128f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ec90614ec7565b60405180910390fd5b6128fe81613123565b50565b612909612b7d565b73ffffffffffffffffffffffffffffffffffffffff1661292761129c565b73ffffffffffffffffffffffffffffffffffffffff161461297d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161297490615047565b60405180910390fd5b83600c60006004811061299357612992615625565b5b0190805190602001906129a7929190614020565b5082600c6001600481106129be576129bd615625565b5b0190805190602001906129d2929190614020565b5081600c6002600481106129e9576129e8615625565b5b0190805190602001906129fd929190614020565b5080600c600360048110612a1457612a13615625565b5b019080519060200190612a28929190614020565b5050505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612afa57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612b0a5750612b09826137c4565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612bf883610e06565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612c4982612b11565b612c88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c7f90614f47565b60405180910390fd5b6000612c9383610e06565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612d0257508373ffffffffffffffffffffffffffffffffffffffff16612cea846107b5565b73ffffffffffffffffffffffffffffffffffffffff16145b80612d135750612d128185612775565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612d3c82610e06565b73ffffffffffffffffffffffffffffffffffffffff1614612d92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d8990615067565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612df990614f07565b60405180910390fd5b612e0d83838361382e565b612e18600082612b85565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e68919061534e565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ebf919061526d565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b612f92828260405180602001604052806000815250613942565b5050565b60606000821415612fde576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506130f2565b600082905060005b60008214613010578080612ff9906154c0565b915050600a8261300991906152c3565b9150612fe6565b60008167ffffffffffffffff81111561302c5761302b615654565b5b6040519080825280601f01601f19166020018201604052801561305e5781602001600182028036833780820191505090505b5090505b600085146130eb57600182613077919061534e565b9150600a856130869190615509565b6030613092919061526d565b60f81b8183815181106130a8576130a7615625565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856130e491906152c3565b9450613062565b8093505050505b919050565b6060828260405160200161310c929190614be7565b604051602081830303815290604052905092915050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6131f4848484612d1c565b6132008484848461399d565b61323f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161323690614ea7565b60405180910390fd5b50505050565b6060600082519050600081141561326e57604051806020016040528060008152509150506133d8565b6000600360028361327f919061526d565b61328991906152c3565b600461329591906152f4565b905060006020826132a6919061526d565b67ffffffffffffffff8111156132bf576132be615654565b5b6040519080825280601f01601f1916602001820160405280156132f15781602001600182028036833780820191505090505b5090506000604051806060016040528060408152602001615e6f604091399050600181016020830160005b868110156133955760038101905062ffffff818a015116603f8160121c168401518060081b905060ff603f83600c1c1686015116810190508060081b905060ff603f8360061c1686015116810190508060081b905060ff603f831686015116810190508060e01b9050808452600484019350505061331c565b5060038606600181146133af57600281146133bf576133ca565b613d3d60f01b60028303526133ca565b603d60f81b60018303525b508484525050819450505050505b919050565b6000601160178111156133f3576133f2615598565b5b82601781111561340657613405615598565b5b14156134155760019050613485565b6012601781111561342957613428615598565b5b82601781111561343c5761343b615598565b5b141561344b5760029050613485565b6013601781111561345f5761345e615598565b5b82601781111561347257613471615598565b5b14156134815760039050613485565b8190505b919050565b6000601460178111156134a05761349f615598565b5b8260178111156134b3576134b2615598565b5b14156134c257600f90506134fc565b601560178111156134d6576134d5615598565b5b8260178111156134e9576134e8615598565b5b14156134f857601090506134fc565b8190505b919050565b60006016601781111561351757613516615598565b5b82601781111561352a57613529615598565b5b141561353957600f9050613572565b60178081111561354c5761354b615598565b5b82601781111561355f5761355e615598565b5b141561356e5760109050613572565b8190505b919050565b60006004601781111561358d5761358c615598565b5b8360178111156135a05761359f615598565b5b14806135d05750600560178111156135bb576135ba615598565b5b8360178111156135ce576135cd615598565b5b145b806135ff5750600660178111156135ea576135e9615598565b5b8360178111156135fd576135fc615598565b5b145b15613699576004601781111561361857613617615598565b5b82601781111561362b5761362a615598565b5b148061365b57506005601781111561364657613645615598565b5b82601781111561365957613658615598565b5b145b8061368a57506006601781111561367557613674615598565b5b82601781111561368857613687615598565b5b145b1561369857600190506137be565b5b600160178111156136ad576136ac615598565b5b8360178111156136c0576136bf615598565b5b14806136f05750600260178111156136db576136da615598565b5b8360178111156136ee576136ed615598565b5b145b8061371f57506003601781111561370a57613709615598565b5b83601781111561371d5761371c615598565b5b145b156137b9576001601781111561373857613737615598565b5b82601781111561374b5761374a615598565b5b148061377b57506002601781111561376657613765615598565b5b82601781111561377957613778615598565b5b145b806137aa57506003601781111561379557613794615598565b5b8260178111156137a8576137a7615598565b5b145b156137b857600190506137be565b5b600090505b92915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b613839838383613b34565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561387c5761387781613b39565b6138bb565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146138ba576138b98382613b82565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156138fe576138f981613cef565b61393d565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461393c5761393b8282613dc0565b5b5b505050565b61394c8383613e3f565b613959600084848461399d565b613998576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161398f90614ea7565b60405180910390fd5b505050565b60006139be8473ffffffffffffffffffffffffffffffffffffffff1661400d565b15613b27578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026139e7612b7d565b8786866040518563ffffffff1660e01b8152600401613a099493929190614d3a565b602060405180830381600087803b158015613a2357600080fd5b505af1925050508015613a5457506040513d601f19601f82011682018060405250810190613a519190614505565b60015b613ad7573d8060008114613a84576040519150601f19603f3d011682016040523d82523d6000602084013e613a89565b606091505b50600081511415613acf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ac690614ea7565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613b2c565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613b8f8461115c565b613b99919061534e565b9050600060076000848152602001908152602001600020549050818114613c7e576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613d03919061534e565b9050600060096000848152602001908152602001600020549050600060088381548110613d3357613d32615625565b5b906000526020600020015490508060088381548110613d5557613d54615625565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613da457613da36155f6565b5b6001900381819060005260206000200160009055905550505050565b6000613dcb8361115c565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613eaf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ea690614fe7565b60405180910390fd5b613eb881612b11565b15613ef8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613eef90614ee7565b60405180910390fd5b613f046000838361382e565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613f54919061526d565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b82805461402c9061545d565b90600052602060002090601f01602090048101928261404e5760008555614095565b82601f1061406757805160ff1916838001178555614095565b82800160010185558215614095579182015b82811115614094578251825591602001919060010190614079565b5b5090506140a291906140c8565b5090565b6040518060400160405280600290602082028036833780820191505090505090565b5b808211156140e15760008160009055506001016140c9565b5090565b60006140f86140f384615187565b615162565b9050808382526020820190508285602086028201111561411b5761411a615688565b5b60005b8581101561414b578161413188826142b7565b84526020840193506020830192505060018101905061411e565b5050509392505050565b6000614168614163846151b3565b615162565b9050828152602081018484840111156141845761418361568d565b5b61418f84828561541b565b509392505050565b60006141aa6141a5846151e4565b615162565b9050828152602081018484840111156141c6576141c561568d565b5b6141d184828561541b565b509392505050565b6000813590506141e881615e12565b92915050565b600082601f83011261420357614202615683565b5b81356142138482602086016140e5565b91505092915050565b60008135905061422b81615e29565b92915050565b60008135905061424081615e40565b92915050565b60008151905061425581615e40565b92915050565b600082601f8301126142705761426f615683565b5b8135614280848260208601614155565b91505092915050565b600082601f83011261429e5761429d615683565b5b81356142ae848260208601614197565b91505092915050565b6000813590506142c681615e57565b92915050565b6000602082840312156142e2576142e1615697565b5b60006142f0848285016141d9565b91505092915050565b600080604083850312156143105761430f615697565b5b600061431e858286016141d9565b925050602061432f858286016141d9565b9150509250929050565b60008060006060848603121561435257614351615697565b5b6000614360868287016141d9565b9350506020614371868287016141d9565b9250506040614382868287016142b7565b9150509250925092565b600080600080608085870312156143a6576143a5615697565b5b60006143b4878288016141d9565b94505060206143c5878288016141d9565b93505060406143d6878288016142b7565b925050606085013567ffffffffffffffff8111156143f7576143f6615692565b5b6144038782880161425b565b91505092959194509250565b6000806040838503121561442657614425615697565b5b6000614434858286016141d9565b92505060206144458582860161421c565b9150509250929050565b6000806040838503121561446657614465615697565b5b6000614474858286016141d9565b9250506020614485858286016142b7565b9150509250929050565b6000602082840312156144a5576144a4615697565b5b600082013567ffffffffffffffff8111156144c3576144c2615692565b5b6144cf848285016141ee565b91505092915050565b6000602082840312156144ee576144ed615697565b5b60006144fc84828501614231565b91505092915050565b60006020828403121561451b5761451a615697565b5b600061452984828501614246565b91505092915050565b6000806000806080858703121561454c5761454b615697565b5b600085013567ffffffffffffffff81111561456a57614569615692565b5b61457687828801614289565b945050602085013567ffffffffffffffff81111561459757614596615692565b5b6145a387828801614289565b935050604085013567ffffffffffffffff8111156145c4576145c3615692565b5b6145d087828801614289565b925050606085013567ffffffffffffffff8111156145f1576145f0615692565b5b6145fd87828801614289565b91505092959194509250565b60006020828403121561461f5761461e615697565b5b600061462d848285016142b7565b91505092915050565b6000806040838503121561464d5761464c615697565b5b600061465b858286016142b7565b925050602083013567ffffffffffffffff81111561467c5761467b615692565b5b61468885828601614289565b9150509250929050565b61469b81615382565b82525050565b6146aa81615394565b82525050565b60006146bb8261522a565b6146c58185615240565b93506146d581856020860161542a565b6146de8161569c565b840191505092915050565b6146f281615409565b82525050565b600061470382615235565b61470d8185615251565b935061471d81856020860161542a565b6147268161569c565b840191505092915050565b600061473c82615235565b6147468185615262565b935061475681856020860161542a565b80840191505092915050565b6000815461476f8161545d565b6147798186615262565b9450600182166000811461479457600181146147a5576147d8565b60ff198316865281860193506147d8565b6147ae85615215565b60005b838110156147d0578154818901526001820191506020810190506147b1565b838801955050505b50505092915050565b60006147ee601683615251565b91506147f9826156ad565b602082019050919050565b6000614811602b83615251565b915061481c826156d6565b604082019050919050565b6000614834603283615251565b915061483f82615725565b604082019050919050565b6000614857602683615251565b915061486282615774565b604082019050919050565b600061487a601c83615251565b9150614885826157c3565b602082019050919050565b600061489d602483615251565b91506148a8826157ec565b604082019050919050565b60006148c0601983615251565b91506148cb8261583b565b602082019050919050565b60006148e3602c83615251565b91506148ee82615864565b604082019050919050565b6000614906600183615262565b9150614911826158b3565b600182019050919050565b6000614929603883615251565b9150614934826158dc565b604082019050919050565b600061494c602a83615251565b91506149578261592b565b604082019050919050565b600061496f602983615251565b915061497a8261597a565b604082019050919050565b6000614992600683615251565b915061499d826159c9565b602082019050919050565b60006149b5600283615262565b91506149c0826159f2565b600282019050919050565b60006149d8602083615251565b91506149e382615a1b565b602082019050919050565b60006149fb600e83615251565b9150614a0682615a44565b602082019050919050565b6000614a1e602c83615251565b9150614a2982615a6d565b604082019050919050565b6000614a41602083615251565b9150614a4c82615abc565b602082019050919050565b6000614a64602983615251565b9150614a6f82615ae5565b604082019050919050565b6000614a87602783615262565b9150614a9282615b34565b602782019050919050565b6000614aaa600a83615262565b9150614ab582615b83565b600a82019050919050565b6000614acd602183615251565b9150614ad882615bac565b604082019050919050565b6000614af0601d83615262565b9150614afb82615bfb565b601d82019050919050565b6000614b13600983615251565b9150614b1e82615c24565b602082019050919050565b6000614b36603183615251565b9150614b4182615c4d565b604082019050919050565b6000614b59602c83615251565b9150614b6482615c9c565b604082019050919050565b6000614b7c600383615251565b9150614b8782615ceb565b602082019050919050565b6000614b9f601f83615251565b9150614baa82615d14565b602082019050919050565b6000614bc2608e83615262565b9150614bcd82615d3d565b608e82019050919050565b614be1816153ff565b82525050565b6000614bf38285614731565b9150614bff8284614731565b91508190509392505050565b6000614c17828a614762565b9150614c238289614731565b9150614c2f8288614762565b9150614c3b8287614731565b9150614c478286614762565b9150614c538285614731565b9150614c5f8284614762565b915081905098975050505050505050565b6000614c7b82614a9d565b9150614c878288614762565b9150614c9282614bb5565b9150614c9e8287614731565b9150614ca9826148f9565b9150614cb58286614731565b9150614cc0826148f9565b9150614ccc8285614731565b9150614cd782614a7a565b9150614ce38284614731565b9150614cee826149a8565b91508190509695505050505050565b6000614d0882614ae3565b9150614d148284614731565b915081905092915050565b6000602082019050614d346000830184614692565b92915050565b6000608082019050614d4f6000830187614692565b614d5c6020830186614692565b614d696040830185614bd8565b8181036060830152614d7b81846146b0565b905095945050505050565b6000602082019050614d9b60008301846146a1565b92915050565b60006020820190508181036000830152614dbb81846146f8565b905092915050565b60006060820190508181036000830152614ddd81866146f8565b90508181036020830152614df181856146f8565b90508181036040830152614e0581846146f8565b9050949350505050565b60006080820190508181036000830152614e28816147e1565b9050614e3760208301866146e9565b614e446040830185614bd8565b614e516060830184614bd8565b949350505050565b60006040820190508181036000830152614e72816147e1565b9050614e816020830184614bd8565b92915050565b60006020820190508181036000830152614ea081614804565b9050919050565b60006020820190508181036000830152614ec081614827565b9050919050565b60006020820190508181036000830152614ee08161484a565b9050919050565b60006020820190508181036000830152614f008161486d565b9050919050565b60006020820190508181036000830152614f2081614890565b9050919050565b60006020820190508181036000830152614f40816148b3565b9050919050565b60006020820190508181036000830152614f60816148d6565b9050919050565b60006020820190508181036000830152614f808161491c565b9050919050565b60006020820190508181036000830152614fa08161493f565b9050919050565b60006020820190508181036000830152614fc081614962565b9050919050565b60006020820190508181036000830152614fe081614985565b9050919050565b60006020820190508181036000830152615000816149cb565b9050919050565b60006020820190508181036000830152615020816149ee565b9050919050565b6000602082019050818103600083015261504081614a11565b9050919050565b6000602082019050818103600083015261506081614a34565b9050919050565b6000602082019050818103600083015261508081614a57565b9050919050565b600060208201905081810360008301526150a081614ac0565b9050919050565b600060208201905081810360008301526150c081614b06565b9050919050565b600060208201905081810360008301526150e081614b29565b9050919050565b6000602082019050818103600083015261510081614b4c565b9050919050565b6000602082019050818103600083015261512081614b6f565b9050919050565b6000602082019050818103600083015261514081614b92565b9050919050565b600060208201905061515c6000830184614bd8565b92915050565b600061516c61517d565b9050615178828261548f565b919050565b6000604051905090565b600067ffffffffffffffff8211156151a2576151a1615654565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156151ce576151cd615654565b5b6151d78261569c565b9050602081019050919050565b600067ffffffffffffffff8211156151ff576151fe615654565b5b6152088261569c565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000615278826153ff565b9150615283836153ff565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156152b8576152b761553a565b5b828201905092915050565b60006152ce826153ff565b91506152d9836153ff565b9250826152e9576152e8615569565b5b828204905092915050565b60006152ff826153ff565b915061530a836153ff565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156153435761534261553a565b5b828202905092915050565b6000615359826153ff565b9150615364836153ff565b9250828210156153775761537661553a565b5b828203905092915050565b600061538d826153df565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60008190506153da82615dfe565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000615414826153cc565b9050919050565b82818337600083830152505050565b60005b8381101561544857808201518184015260208101905061542d565b83811115615457576000848401525b50505050565b6000600282049050600182168061547557607f821691505b60208210811415615489576154886155c7565b5b50919050565b6154988261569c565b810181811067ffffffffffffffff821117156154b7576154b6615654565b5b80604052505050565b60006154cb826153ff565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156154fe576154fd61553a565b5b600182019050919050565b6000615514826153ff565b915061551f836153ff565b92508261552f5761552e615569565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f48545450533a2f2f5757572e4841494b55532e4f524700000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2000000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f6261642049440000000000000000000000000000000000000000000000000000600082015250565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4e6f7420656e6f75676820455448000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f222c2022696d616765223a2022646174613a696d6167652f7376672b786d6c3b60008201527f6261736536342c00000000000000000000000000000000000000000000000000602082015250565b7f7b226e616d65223a202200000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b7f4e6f74206f776e65720000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4f6f660000000000000000000000000000000000000000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f222c20226465736372697074696f6e223a20224861696b75732069732061206360008201527f6f6c6c656374696f6e206f66204861696b7520706f656d732c20756e6971756560208201527f6c792067656e657261746564206f6e2074686520457468657265756d20626c6f60408201527f636b636861696e2e204c6561726e206d6f72652061742068747470733a2f2f6860608201527f61696b75732e6f7267202f2f2f20000000000000000000000000000000000000608082015250565b60048110615e0f57615e0e615598565b5b50565b615e1b81615382565b8114615e2657600080fd5b50565b615e3281615394565b8114615e3d57600080fd5b50565b615e49816153a0565b8114615e5457600080fd5b50565b615e60816153ff565b8114615e6b57600080fd5b5056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa264697066735822122077eadbc653a383755cc445aeb819373ce57502d0d99a695ba193998febc247b164736f6c63430008060033
Deployed Bytecode Sourcemap
46901:15823:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40751:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27865:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29424:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28947:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41391:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30314:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41059:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62610:109;;;;;;;;;;;;;:::i;:::-;;30724:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48663:43;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61387:242;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41581:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27559:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61637:526;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27289:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12257:94;;;;;;;;;;;;;:::i;:::-;;11606:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28034:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29717:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47687:967;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30980:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62171:179;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60533:846;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54877:4242;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;30083:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12506:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62358:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40751:224;40853:4;40892:35;40877:50;;;:11;:50;;;;:90;;;;40931:36;40955:11;40931:23;:36::i;:::-;40877:90;40870:97;;40751:224;;;:::o;27865:100::-;27919:13;27952:5;27945:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27865:100;:::o;29424:221::-;29500:7;29528:16;29536:7;29528;:16::i;:::-;29520:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;29613:15;:24;29629:7;29613:24;;;;;;;;;;;;;;;;;;;;;29606:31;;29424:221;;;:::o;28947:411::-;29028:13;29044:23;29059:7;29044:14;:23::i;:::-;29028:39;;29092:5;29086:11;;:2;:11;;;;29078:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;29186:5;29170:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;29195:37;29212:5;29219:12;:10;:12::i;:::-;29195:16;:37::i;:::-;29170:62;29148:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;29329:21;29338:2;29342:7;29329:8;:21::i;:::-;29017:341;28947:411;;:::o;41391:113::-;41452:7;41479:10;:17;;;;41472:24;;41391:113;:::o;30314:339::-;30509:41;30528:12;:10;:12::i;:::-;30542:7;30509:18;:41::i;:::-;30501:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;30617:28;30627:4;30633:2;30637:7;30617:9;:28::i;:::-;30314:339;;;:::o;41059:256::-;41156:7;41192:23;41209:5;41192:16;:23::i;:::-;41184:5;:31;41176:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;41281:12;:19;41294:5;41281:19;;;;;;;;;;;;;;;:26;41301:5;41281:26;;;;;;;;;;;;41274:33;;41059:256;;;;:::o;62610:109::-;11837:12;:10;:12::i;:::-;11826:23;;:7;:5;:7::i;:::-;:23;;;11818:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62666:12:::1;:10;:12::i;:::-;62658:30;;:53;62689:21;62658:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;62610:109::o:0;30724:185::-;30862:39;30879:4;30885:2;30889:7;30862:39;;;;;;;;;;;;:16;:39::i;:::-;30724:185;;;:::o;48663:43::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;61387:242::-;14545:1;15141:7;;:19;;15133:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;14545:1;15274:7;:18;;;;11837:12:::1;:10;:12::i;:::-;11826:23;;:7;:5;:7::i;:::-;:23;;;11818:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61483:4:::2;61473:7;:14;:32;;;;;61501:4;61491:7;:14;61473:32;61465:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;61527:27;61537:7;:5;:7::i;:::-;61546;61527:9;:27::i;:::-;61586:35;;;;;;;;;;;;;;;;;::::0;61602:18:::2;:7;:16;:18::i;:::-;61586:4;:35::i;:::-;61565:9;:18;61575:7;61565:18;;;;;;;;;;;:56;;;;;;;;;;;;:::i;:::-;;14501:1:::0;15453:7;:22;;;;61387:242;:::o;41581:233::-;41656:7;41692:30;:28;:30::i;:::-;41684:5;:38;41676:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;41789:10;41800:5;41789:17;;;;;;;;:::i;:::-;;;;;;;;;;41782:24;;41581:233;;;:::o;27559:239::-;27631:7;27651:13;27667:7;:16;27675:7;27667:16;;;;;;;;;;;;;;;;;;;;;27651:32;;27719:1;27702:19;;:5;:19;;;;27694:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27785:5;27778:12;;;27559:239;;;:::o;61637:526::-;14545:1;15141:7;;:19;;15133:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;14545:1;15274:7;:18;;;;61739:12:::1;:10;:12::i;:::-;61726:25;;:9;:25;;;61718:34;;;::::0;::::1;;61790:2;61771:8;:15;:21;;61763:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;61851:8;:15;47042:17;61833:33;;;;:::i;:::-;61819:9;:48;;61811:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;61902:9;61897:259;61921:8;:15;61917:1;:19;61897:259;;;61980:1;61966:8;61975:1;61966:11;;;;;;;;:::i;:::-;;;;;;;;:15;:37;;;;;61999:4;61985:8;61994:1;61985:11;;;;;;;;:::i;:::-;;;;;;;;:18;61966:37;61958:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;62029:36;62039:12;:10;:12::i;:::-;62053:8;62062:1;62053:11;;;;;;;;:::i;:::-;;;;;;;;62029:9;:36::i;:::-;62105:39;;;;;;;;;;;;;;;;;::::0;62121:22:::1;:8;62130:1;62121:11;;;;;;;;:::i;:::-;;;;;;;;:20;:22::i;:::-;62105:4;:39::i;:::-;62080:9;:22;62090:8;62099:1;62090:11;;;;;;;;:::i;:::-;;;;;;;;62080:22;;;;;;;;;;;:64;;;;;;;;;;;;:::i;:::-;;61938:3;;;;;:::i;:::-;;;;61897:259;;;;14501:1:::0;15453:7;:22;;;;61637:526;:::o;27289:208::-;27361:7;27406:1;27389:19;;:5;:19;;;;27381:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;27473:9;:16;27483:5;27473:16;;;;;;;;;;;;;;;;27466:23;;27289:208;;;:::o;12257:94::-;11837:12;:10;:12::i;:::-;11826:23;;:7;:5;:7::i;:::-;:23;;;11818:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;12322:21:::1;12340:1;12322:9;:21::i;:::-;12257:94::o:0;11606:87::-;11652:7;11679:6;;;;;;;;;;;11672:13;;11606:87;:::o;28034:104::-;28090:13;28123:7;28116:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28034:104;:::o;29717:295::-;29832:12;:10;:12::i;:::-;29820:24;;:8;:24;;;;29812:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;29932:8;29887:18;:32;29906:12;:10;:12::i;:::-;29887:32;;;;;;;;;;;;;;;:42;29920:8;29887:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;29985:8;29956:48;;29971:12;:10;:12::i;:::-;29956:48;;;29995:8;29956:48;;;;;;:::i;:::-;;;;;;;;29717:295;;:::o;47687:967::-;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;30980:328::-;31155:41;31174:12;:10;:12::i;:::-;31188:7;31155:18;:41::i;:::-;31147:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;31261:39;31275:4;31281:2;31285:7;31294:5;31261:13;:39::i;:::-;30980:328;;;;:::o;62171:179::-;62273:16;62281:7;62273;:16::i;:::-;62257:32;;:12;:10;:12::i;:::-;:32;;;62249:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;62335:7;62314:9;:18;62324:7;62314:18;;;;;;;;;;;:28;;;;;;;;;;;;:::i;:::-;;62171:179;;:::o;60533:846::-;60598:13;60624:19;60654;60684;60738:25;60755:7;60738:16;:25::i;:::-;60714:49;;;;;;;;;;;;60776:20;60823:7;60831:1;60823:10;;;;;;;:::i;:::-;;;60835:5;60842:7;60850:1;60842:10;;;;;;;:::i;:::-;;;60854:5;60861:7;60869:1;60861:10;;;;;;;:::i;:::-;;;60873:5;60880:7;60888:1;60880:10;;;;;;;:::i;:::-;;;60806:85;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;60776:116;;60905:18;60926:336;60984:9;:18;60994:7;60984:18;;;;;;;;;;;61150:5;61162;61174;61224:28;61244:6;61224:13;:28::i;:::-;60953:306;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;60926:13;:336::i;:::-;60905:357;;61339:4;61289:55;;;;;;;;:::i;:::-;;;;;;;;;;;;;61273:72;;61365:6;61358:13;;;;;;;60533:846;;;:::o;54877:4242::-;54941:23;54966:24;54992:23;55028:22;;:::i;:::-;55061:9;55125:7;55088:45;;;;;;;;:::i;:::-;;;;;;;;;;;;;55078:56;;;;;;55073:62;;55061:74;;55231:2;55225;55218:4;:9;;;;:::i;:::-;55217:16;55214:239;;;55259:21;55248:5;55254:1;55248:8;;;;;;;:::i;:::-;;;;;:32;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;55304:25;55293:5;55299:1;55293:8;;;;;;;:::i;:::-;;;;;:36;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;55214:239;;;55371:22;55360:5;55366:1;55360:8;;;;;;;:::i;:::-;;;;;:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;55417:24;55406:5;55412:1;55406:8;;;;;;;:::i;:::-;;;;;:35;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;55214:239;55469:6;55465:3647;55485:12;55481:1;:16;55465:3647;;;55517:22;55619:21;55607:33;;;;;;;;:::i;:::-;;:5;55613:1;55607:8;;;;;;;:::i;:::-;;;;;;:33;;;;;;;;:::i;:::-;;;55604:479;;;55669:9;:32;55686:14;;55679:4;:21;;;;:::i;:::-;55669:32;;;;;;;;;;;55657:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55604:479;;;55736:22;55724:34;;;;;;;;:::i;:::-;;:5;55730:1;55724:8;;;;;;;:::i;:::-;;;;;;:34;;;;;;;;:::i;:::-;;;55721:362;;;55786:9;:32;55803:14;;55796:4;:21;;;;:::i;:::-;55786:32;;;;;;;;;;;55774:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55721:362;;;55853:24;55841:36;;;;;;;;:::i;:::-;;:5;55847:1;55841:8;;;;;;;:::i;:::-;;;;;;:36;;;;;;;;:::i;:::-;;;55838:245;;;55905:12;:38;55925:17;;55918:4;:24;;;;:::i;:::-;55905:38;;;;;;;;;;;55893:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55838:245;;;55978:25;55966:37;;;;;;;;:::i;:::-;;:5;55972:1;55966:8;;;;;;;:::i;:::-;;;;;;:37;;;;;;;;:::i;:::-;;;55963:120;;;56031:12;:38;56051:17;;56044:4;:24;;;;:::i;:::-;56031:38;;;;;;;;;;;56019:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55963:120;55838:245;55721:362;55604:479;56095:20;:25;;;;;;;;;;;;;;56133:11;56213:6;56220:1;56213:8;;56208:2478;56225:9;:16;56223:1;:18;56208:2478;;;56263:10;56328:5;56334:1;56328:8;;;;;;;:::i;:::-;;;;;;56338:7;56347:1;56291:58;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56281:69;;;;;;56276:75;;56263:88;;56368:18;56403:17;56423:9;56433:1;56423:12;;;;;;;;:::i;:::-;;;;;;;;56403:32;;56510:13;56493:30;;;;;;;;:::i;:::-;;:13;:30;;;;;;;;:::i;:::-;;;56490:1545;;;56559:22;56547:34;;;;;;;;:::i;:::-;;:5;56553:1;56547:8;;;;;;;:::i;:::-;;;;;;:34;;;;;;;;:::i;:::-;;;56544:374;;;56616:6;56604:18;;56661:11;;;;;;;;;;;;;;56544:374;;;56747:25;56735:37;;;;;;;;:::i;:::-;;:5;56741:1;56735:8;;;;;;;:::i;:::-;;;;;;:37;;;;;;;;:::i;:::-;;;56732:186;;;56808:6;56795:19;;56854:11;;;;;;;;;;;;;;56732:186;56544:374;56490:1545;;;57013:22;57022:9;57032:1;57022:12;;;;;;;;:::i;:::-;;;;;;;;57013:8;:22::i;:::-;56997:38;;57073:13;57057:29;;;;;;;;:::i;:::-;;:9;57067:1;57057:12;;;;;;;;:::i;:::-;;;;;;;;:29;;;;;;;;:::i;:::-;;;57054:964;;57116:82;57121:12;:27;57134:13;57121:27;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57157:12;:27;57170:13;57157:27;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:34;;;;57149:5;:42;;;;:::i;:::-;57121:71;;;;;;;;:::i;:::-;;;;;;;;;57116:82;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:4;:82::i;:::-;57109:89;;57054:964;;;57300:32;57319:9;57329:1;57319:12;;;;;;;;:::i;:::-;;;;;;;;57300:18;:32::i;:::-;57284:48;;57372:13;57356:29;;;;;;;;:::i;:::-;;:9;57366:1;57356:12;;;;;;;;:::i;:::-;;;;;;;;:29;;;;;;;;:::i;:::-;;;57353:646;;57417:84;57422:12;:27;57435:13;57422:27;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57458:12;:27;57471:13;57458:27;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:34;;;;57450:5;:42;;;;:::i;:::-;57422:71;;;;;;;;:::i;:::-;;;;;;;;;57417:84;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:4;:84::i;:::-;57410:91;;57353:646;;;57614:35;57636:9;57646:1;57636:12;;;;;;;;:::i;:::-;;;;;;;;57614:21;:35::i;:::-;57598:51;;57691:13;57675:29;;;;;;;;:::i;:::-;;:9;57685:1;57675:12;;;;;;;;:::i;:::-;;;;;;;;:29;;;;;;;;:::i;:::-;;;57672:306;;57738:83;57743:12;:27;57756:13;57743:27;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57779:12;:27;57792:13;57779:27;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:34;;;;57771:5;:42;;;;:::i;:::-;57743:71;;;;;;;;:::i;:::-;;;;;;;;;57738:83;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:4;:83::i;:::-;57731:90;;57672:306;;;57883:12;:27;57896:13;57883:27;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57919:12;:27;57932:13;57919:27;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:34;;;;57911:5;:42;;;;:::i;:::-;57883:71;;;;;;;;:::i;:::-;;;;;;;;;57876:78;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57672:306;57353:646;57054:964;56490:1545;58096:1;58092;:5;58089:360;;;58121:34;58132:13;58147:7;58121:10;:34::i;:::-;58118:314;;;58187:18;58192:6;58187:18;;;;;;;;;;;;;;;;;:4;:18::i;:::-;58178:27;;58118:314;;;58279:1;58261:6;58255:20;:25;58252:161;;58374:17;58379:6;58374:17;;;;;;;;;;;;;;;;;:4;:17::i;:::-;58365:26;;58252:161;58118:314;58089:360;58508:18;58513:6;58521:4;58508;:18::i;:::-;58499:27;;58568:1;58551:9;:16;:18;;;;:::i;:::-;58546:1;:23;58543:91;;;58599:17;58604:6;58599:17;;;;;;;;;;;;;;;;;:4;:17::i;:::-;58590:26;;58543:91;58660:9;58670:1;58660:12;;;;;;;;:::i;:::-;;;;;;;;58650:22;;56248:2438;;;56243:3;;;;;:::i;:::-;;;;56208:2478;;;;58747:21;58735:33;;;;;;;;:::i;:::-;;:5;58741:1;58735:8;;;;;;;:::i;:::-;;;;;;:33;;;;;;;;:::i;:::-;;;58732:367;;;58797:6;58785:18;;58732:367;;;58838:22;58826:34;;;;;;;;:::i;:::-;;:5;58832:1;58826:8;;;;;;;:::i;:::-;;;;;;:34;;;;;;;;:::i;:::-;;;58823:276;;;58890:6;58877:19;;58823:276;;;58931:24;58919:36;;;;;;;;:::i;:::-;;:5;58925:1;58919:8;;;;;;;:::i;:::-;;;;;;:36;;;;;;;;:::i;:::-;;;58916:183;;;58984:6;58972:18;;58916:183;;;59025:25;59013:37;;;;;;;;:::i;:::-;;:5;59019:1;59013:8;;;;;;;:::i;:::-;;;;;;:37;;;;;;;;:::i;:::-;;;59010:89;;;59079:6;59067:18;;59010:89;58916:183;58823:276;58732:367;55504:3608;;;55499:3;;;;;:::i;:::-;;;;55465:3647;;;;55017:4102;;54877:4242;;;;;:::o;30083:164::-;30180:4;30204:18;:25;30223:5;30204:25;;;;;;;;;;;;;;;:35;30230:8;30204:35;;;;;;;;;;;;;;;;;;;;;;;;;30197:42;;30083:164;;;;:::o;12506:192::-;11837:12;:10;:12::i;:::-;11826:23;;:7;:5;:7::i;:::-;:23;;;11818:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;12615:1:::1;12595:22;;:8;:22;;;;12587:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;12671:19;12681:8;12671:9;:19::i;:::-;12506:192:::0;:::o;62358:244::-;11837:12;:10;:12::i;:::-;11826:23;;:7;:5;:7::i;:::-;:23;;;11818:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62502:5:::1;62489:7;62497:1;62489:10;;;;;;;:::i;:::-;;;:18;;;;;;;;;;;;:::i;:::-;;62531:5;62518:7;62526:1;62518:10;;;;;;;:::i;:::-;;;:18;;;;;;;;;;;;:::i;:::-;;62560:5;62547:7;62555:1;62547:10;;;;;;;:::i;:::-;;;:18;;;;;;;;;;;;:::i;:::-;;62589:5;62576:7;62584:1;62576:10;;;;;;;:::i;:::-;;;:18;;;;;;;;;;;;:::i;:::-;;62358:244:::0;;;;:::o;26920:305::-;27022:4;27074:25;27059:40;;;:11;:40;;;;:105;;;;27131:33;27116:48;;;:11;:48;;;;27059:105;:158;;;;27181:36;27205:11;27181:23;:36::i;:::-;27059:158;27039:178;;26920:305;;;:::o;32818:127::-;32883:4;32935:1;32907:30;;:7;:16;32915:7;32907:16;;;;;;;;;;;;;;;;;;;;;:30;;;;32900:37;;32818:127;;;:::o;10466:98::-;10519:7;10546:10;10539:17;;10466:98;:::o;36800:174::-;36902:2;36875:15;:24;36891:7;36875:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;36958:7;36954:2;36920:46;;36929:23;36944:7;36929:14;:23::i;:::-;36920:46;;;;;;;;;;;;36800:174;;:::o;33112:348::-;33205:4;33230:16;33238:7;33230;:16::i;:::-;33222:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;33306:13;33322:23;33337:7;33322:14;:23::i;:::-;33306:39;;33375:5;33364:16;;:7;:16;;;:51;;;;33408:7;33384:31;;:20;33396:7;33384:11;:20::i;:::-;:31;;;33364:51;:87;;;;33419:32;33436:5;33443:7;33419:16;:32::i;:::-;33364:87;33356:96;;;33112:348;;;;:::o;36104:578::-;36263:4;36236:31;;:23;36251:7;36236:14;:23::i;:::-;:31;;;36228:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;36346:1;36332:16;;:2;:16;;;;36324:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;36402:39;36423:4;36429:2;36433:7;36402:20;:39::i;:::-;36506:29;36523:1;36527:7;36506:8;:29::i;:::-;36567:1;36548:9;:15;36558:4;36548:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;36596:1;36579:9;:13;36589:2;36579:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;36627:2;36608:7;:16;36616:7;36608:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;36666:7;36662:2;36647:27;;36656:4;36647:27;;;;;;;;;;;;36104:578;;;:::o;33802:110::-;33878:26;33888:2;33892:7;33878:26;;;;;;;;;;;;:9;:26::i;:::-;33802:110;;:::o;8162:723::-;8218:13;8448:1;8439:5;:10;8435:53;;;8466:10;;;;;;;;;;;;;;;;;;;;;8435:53;8498:12;8513:5;8498:20;;8529:14;8554:78;8569:1;8561:4;:9;8554:78;;8587:8;;;;;:::i;:::-;;;;8618:2;8610:10;;;;;:::i;:::-;;;8554:78;;;8642:19;8674:6;8664:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8642:39;;8692:154;8708:1;8699:5;:10;8692:154;;8736:1;8726:11;;;;;:::i;:::-;;;8803:2;8795:5;:10;;;;:::i;:::-;8782:2;:24;;;;:::i;:::-;8769:39;;8752:6;8759;8752:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;8832:2;8823:11;;;;;:::i;:::-;;;8692:154;;;8870:6;8856:21;;;;;8162:723;;;;:::o;59129:146::-;59202:13;59259:2;59263;59242:24;;;;;;;;;:::i;:::-;;;;;;;;;;;;;59228:39;;59129:146;;;;:::o;12706:173::-;12762:16;12781:6;;;;;;;;;;;12762:25;;12807:8;12798:6;;:17;;;;;;;;;;;;;;;;;;12862:8;12831:40;;12852:8;12831:40;;;;;;;;;;;;12751:128;12706:173;:::o;32190:315::-;32347:28;32357:4;32363:2;32367:7;32347:9;:28::i;:::-;32394:48;32417:4;32423:2;32427:7;32436:5;32394:22;:48::i;:::-;32386:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;32190:315;;;;:::o;849:1607::-;907:13;933:11;947:4;:11;933:25;;980:1;973:3;:8;969:23;;;983:9;;;;;;;;;;;;;;;;;969:23;1044:18;1082:1;1077;1071:3;:7;;;;:::i;:::-;1070:13;;;;:::i;:::-;1065:1;:19;;;;:::i;:::-;1044:40;;1142:19;1187:2;1174:10;:15;;;;:::i;:::-;1164:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1142:48;;1203:18;1224:5;;;;;;;;;;;;;;;;;1203:26;;1293:1;1286:5;1282:13;1338:2;1330:6;1326:15;1389:1;1357:777;1412:3;1409:1;1406:10;1357:777;;;1467:1;1464;1460:9;1455:14;;1525:8;1520:1;1514:4;1510:12;1504:19;1500:34;1605:4;1597:5;1593:2;1589:14;1585:25;1575:8;1571:40;1565:47;1644:3;1641:1;1637:11;1630:18;;1735:4;1726;1718:5;1714:2;1710:14;1706:25;1696:8;1692:40;1686:47;1682:58;1677:3;1673:68;1666:75;;1773:3;1770:1;1766:11;1759:18;;1863:4;1854;1846:5;1843:1;1839:13;1835:24;1825:8;1821:39;1815:46;1811:57;1806:3;1802:67;1795:74;;1901:3;1898:1;1894:11;1887:18;;1983:4;1974;1967:5;1963:16;1953:8;1949:31;1943:38;1939:49;1934:3;1930:59;1923:66;;2023:3;2018;2014:13;2007:20;;2065:3;2054:9;2047:22;2117:1;2106:9;2102:17;2089:30;;1436:698;;1357:777;;;1361:44;2166:1;2161:3;2157:11;2187:1;2182:84;;;;2285:1;2280:82;;;;2150:212;;2182:84;2243:6;2238:3;2234:16;2230:1;2219:9;2215:17;2208:43;2182:84;;2280:82;2341:4;2336:3;2332:14;2328:1;2317:9;2313:17;2306:41;2150:212;;2393:10;2385:6;2378:26;1251:1164;;2441:6;2427:21;;;;;;849:1607;;;;:::o;59799:261::-;59848:3;59902:10;59896:16;;;;;;;;:::i;:::-;;:2;:16;;;;;;;;:::i;:::-;;;59893:139;;;59921:9;59914:16;;;;59893:139;59953:10;59947:16;;;;;;;;:::i;:::-;;:2;:16;;;;;;;;:::i;:::-;;;59944:88;;;59972:9;59965:16;;;;59944:88;60004:10;59998:16;;;;;;;;:::i;:::-;;:2;:16;;;;;;;;:::i;:::-;;;59995:37;;;60023:9;60016:16;;;;59995:37;60050:2;60043:9;;59799:261;;;;:::o;60068:220::-;60127:3;60181:10;60175:16;;;;;;;;:::i;:::-;;:2;:16;;;;;;;;:::i;:::-;;;60172:88;;;60200:9;60193:16;;;;60172:88;60232:10;60226:16;;;;;;;;:::i;:::-;;:2;:16;;;;;;;;:::i;:::-;;;60223:37;;;60251:9;60244:16;;;;60223:37;60278:2;60271:9;;60068:220;;;;:::o;60296:229::-;60358:3;60416:11;60410:17;;;;;;;;:::i;:::-;;:2;:17;;;;;;;;:::i;:::-;;;60407:90;;;60436:9;60429:16;;;;60407:90;60468:11;60462:17;;;;;;;;:::i;:::-;;:2;:17;;;;;;;;:::i;:::-;;;60459:38;;;60488:9;60481:16;;;;60459:38;60515:2;60508:9;;60296:229;;;;:::o;59283:508::-;59342:4;59367:14;59361:20;;;;;;;;:::i;:::-;;:2;:20;;;;;;;;:::i;:::-;;;59360:48;;;;59393:14;59387:20;;;;;;;;:::i;:::-;;:2;:20;;;;;;;;:::i;:::-;;;59360:48;:74;;;;59419:14;59413:20;;;;;;;;:::i;:::-;;:2;:20;;;;;;;;:::i;:::-;;;59360:74;59357:214;;;59457:14;59451:20;;;;;;;;:::i;:::-;;:2;:20;;;;;;;;:::i;:::-;;;59450:48;;;;59483:14;59477:20;;;;;;;;:::i;:::-;;:2;:20;;;;;;;;:::i;:::-;;;59450:48;:74;;;;59509:14;59503:20;;;;;;;;:::i;:::-;;:2;:20;;;;;;;;:::i;:::-;;;59450:74;59447:115;;;59546:4;59539:11;;;;59447:115;59357:214;59589:9;59583:15;;;;;;;;:::i;:::-;;:2;:15;;;;;;;;:::i;:::-;;;59582:38;;;;59610:9;59604:15;;;;;;;;:::i;:::-;;:2;:15;;;;;;;;:::i;:::-;;;59582:38;:59;;;;59631:9;59625:15;;;;;;;;:::i;:::-;;:2;:15;;;;;;;;:::i;:::-;;;59582:59;59579:184;;;59664:9;59658:15;;;;;;;;:::i;:::-;;:2;:15;;;;;;;;:::i;:::-;;;59657:38;;;;59685:9;59679:15;;;;;;;;:::i;:::-;;:2;:15;;;;;;;;:::i;:::-;;;59657:38;:59;;;;59706:9;59700:15;;;;;;;;:::i;:::-;;:2;:15;;;;;;;;:::i;:::-;;;59657:59;59654:100;;;59738:4;59731:11;;;;59654:100;59579:184;59778:5;59771:12;;59283:508;;;;;:::o;25527:157::-;25612:4;25651:25;25636:40;;;:11;:40;;;;25629:47;;25527:157;;;:::o;42427:589::-;42571:45;42598:4;42604:2;42608:7;42571:26;:45::i;:::-;42649:1;42633:18;;:4;:18;;;42629:187;;;42668:40;42700:7;42668:31;:40::i;:::-;42629:187;;;42738:2;42730:10;;:4;:10;;;42726:90;;42757:47;42790:4;42796:7;42757:32;:47::i;:::-;42726:90;42629:187;42844:1;42830:16;;:2;:16;;;42826:183;;;42863:45;42900:7;42863:36;:45::i;:::-;42826:183;;;42936:4;42930:10;;:2;:10;;;42926:83;;42957:40;42985:2;42989:7;42957:27;:40::i;:::-;42926:83;42826:183;42427:589;;;:::o;34139:321::-;34269:18;34275:2;34279:7;34269:5;:18::i;:::-;34320:54;34351:1;34355:2;34359:7;34368:5;34320:22;:54::i;:::-;34298:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;34139:321;;;:::o;37539:803::-;37694:4;37715:15;:2;:13;;;:15::i;:::-;37711:624;;;37767:2;37751:36;;;37788:12;:10;:12::i;:::-;37802:4;37808:7;37817:5;37751:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;37747:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38014:1;37997:6;:13;:18;37993:272;;;38040:60;;;;;;;;;;:::i;:::-;;;;;;;;37993:272;38215:6;38209:13;38200:6;38196:2;38192:15;38185:38;37747:533;37884:45;;;37874:55;;;:6;:55;;;;37867:62;;;;;37711:624;38319:4;38312:11;;37539:803;;;;;;;:::o;38914:126::-;;;;:::o;43739:164::-;43843:10;:17;;;;43816:15;:24;43832:7;43816:24;;;;;;;;;;;:44;;;;43871:10;43887:7;43871:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43739:164;:::o;44530:988::-;44796:22;44846:1;44821:22;44838:4;44821:16;:22::i;:::-;:26;;;;:::i;:::-;44796:51;;44858:18;44879:17;:26;44897:7;44879:26;;;;;;;;;;;;44858:47;;45026:14;45012:10;:28;45008:328;;45057:19;45079:12;:18;45092:4;45079:18;;;;;;;;;;;;;;;:34;45098:14;45079:34;;;;;;;;;;;;45057:56;;45163:11;45130:12;:18;45143:4;45130:18;;;;;;;;;;;;;;;:30;45149:10;45130:30;;;;;;;;;;;:44;;;;45280:10;45247:17;:30;45265:11;45247:30;;;;;;;;;;;:43;;;;45042:294;45008:328;45432:17;:26;45450:7;45432:26;;;;;;;;;;;45425:33;;;45476:12;:18;45489:4;45476:18;;;;;;;;;;;;;;;:34;45495:14;45476:34;;;;;;;;;;;45469:41;;;44611:907;;44530:988;;:::o;45813:1079::-;46066:22;46111:1;46091:10;:17;;;;:21;;;;:::i;:::-;46066:46;;46123:18;46144:15;:24;46160:7;46144:24;;;;;;;;;;;;46123:45;;46495:19;46517:10;46528:14;46517:26;;;;;;;;:::i;:::-;;;;;;;;;;46495:48;;46581:11;46556:10;46567;46556:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;46692:10;46661:15;:28;46677:11;46661:28;;;;;;;;;;;:41;;;;46833:15;:24;46849:7;46833:24;;;;;;;;;;;46826:31;;;46868:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;45884:1008;;;45813:1079;:::o;43317:221::-;43402:14;43419:20;43436:2;43419:16;:20::i;:::-;43402:37;;43477:7;43450:12;:16;43463:2;43450:16;;;;;;;;;;;;;;;:24;43467:6;43450:24;;;;;;;;;;;:34;;;;43524:6;43495:17;:26;43513:7;43495:26;;;;;;;;;;;:35;;;;43391:147;43317:221;;:::o;34796:382::-;34890:1;34876:16;;:2;:16;;;;34868:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;34949:16;34957:7;34949;:16::i;:::-;34948:17;34940:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;35011:45;35040:1;35044:2;35048:7;35011:20;:45::i;:::-;35086:1;35069:9;:13;35079:2;35069:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;35117:2;35098:7;:16;35106:7;35098:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;35162:7;35158:2;35137:33;;35154:1;35137:33;;;;;;;;;;;;34796:382;;:::o;17699:387::-;17759:4;17967:12;18034:7;18022:20;18014:28;;18077:1;18070:4;:8;18063:15;;;17699:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:2;;;404:79;;:::i;:::-;350:2;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;;;;;;:::o;752:410::-;829:5;854:65;870:48;911:6;870:48;:::i;:::-;854:65;:::i;:::-;845:74;;942:6;935:5;928:21;980:4;973:5;969:16;1018:3;1009:6;1004:3;1000:16;997:25;994:2;;;1025:79;;:::i;:::-;994:2;1115:41;1149:6;1144:3;1139;1115:41;:::i;:::-;835:327;;;;;;:::o;1168:412::-;1246:5;1271:66;1287:49;1329:6;1287:49;:::i;:::-;1271:66;:::i;:::-;1262:75;;1360:6;1353:5;1346:21;1398:4;1391:5;1387:16;1436:3;1427:6;1422:3;1418:16;1415:25;1412:2;;;1443:79;;:::i;:::-;1412:2;1533:41;1567:6;1562:3;1557;1533:41;:::i;:::-;1252:328;;;;;;:::o;1586:139::-;1632:5;1670:6;1657:20;1648:29;;1686:33;1713:5;1686:33;:::i;:::-;1638:87;;;;:::o;1748:370::-;1819:5;1868:3;1861:4;1853:6;1849:17;1845:27;1835:2;;1876:79;;:::i;:::-;1835:2;1993:6;1980:20;2018:94;2108:3;2100:6;2093:4;2085:6;2081:17;2018:94;:::i;:::-;2009:103;;1825:293;;;;;:::o;2124:133::-;2167:5;2205:6;2192:20;2183:29;;2221:30;2245:5;2221:30;:::i;:::-;2173:84;;;;:::o;2263:137::-;2308:5;2346:6;2333:20;2324:29;;2362:32;2388:5;2362:32;:::i;:::-;2314:86;;;;:::o;2406:141::-;2462:5;2493:6;2487:13;2478:22;;2509:32;2535:5;2509:32;:::i;:::-;2468:79;;;;:::o;2566:338::-;2621:5;2670:3;2663:4;2655:6;2651:17;2647:27;2637:2;;2678:79;;:::i;:::-;2637:2;2795:6;2782:20;2820:78;2894:3;2886:6;2879:4;2871:6;2867:17;2820:78;:::i;:::-;2811:87;;2627:277;;;;;:::o;2924:340::-;2980:5;3029:3;3022:4;3014:6;3010:17;3006:27;2996:2;;3037:79;;:::i;:::-;2996:2;3154:6;3141:20;3179:79;3254:3;3246:6;3239:4;3231:6;3227:17;3179:79;:::i;:::-;3170:88;;2986:278;;;;;:::o;3270:139::-;3316:5;3354:6;3341:20;3332:29;;3370:33;3397:5;3370:33;:::i;:::-;3322:87;;;;:::o;3415:329::-;3474:6;3523:2;3511:9;3502:7;3498:23;3494:32;3491:2;;;3529:79;;:::i;:::-;3491:2;3649:1;3674:53;3719:7;3710:6;3699:9;3695:22;3674:53;:::i;:::-;3664:63;;3620:117;3481:263;;;;:::o;3750:474::-;3818:6;3826;3875:2;3863:9;3854:7;3850:23;3846:32;3843:2;;;3881:79;;:::i;:::-;3843:2;4001:1;4026:53;4071:7;4062:6;4051:9;4047:22;4026:53;:::i;:::-;4016:63;;3972:117;4128:2;4154:53;4199:7;4190:6;4179:9;4175:22;4154:53;:::i;:::-;4144:63;;4099:118;3833:391;;;;;:::o;4230:619::-;4307:6;4315;4323;4372:2;4360:9;4351:7;4347:23;4343:32;4340:2;;;4378:79;;:::i;:::-;4340:2;4498:1;4523:53;4568:7;4559:6;4548:9;4544:22;4523:53;:::i;:::-;4513:63;;4469:117;4625:2;4651:53;4696:7;4687:6;4676:9;4672:22;4651:53;:::i;:::-;4641:63;;4596:118;4753:2;4779:53;4824:7;4815:6;4804:9;4800:22;4779:53;:::i;:::-;4769:63;;4724:118;4330:519;;;;;:::o;4855:943::-;4950:6;4958;4966;4974;5023:3;5011:9;5002:7;4998:23;4994:33;4991:2;;;5030:79;;:::i;:::-;4991:2;5150:1;5175:53;5220:7;5211:6;5200:9;5196:22;5175:53;:::i;:::-;5165:63;;5121:117;5277:2;5303:53;5348:7;5339:6;5328:9;5324:22;5303:53;:::i;:::-;5293:63;;5248:118;5405:2;5431:53;5476:7;5467:6;5456:9;5452:22;5431:53;:::i;:::-;5421:63;;5376:118;5561:2;5550:9;5546:18;5533:32;5592:18;5584:6;5581:30;5578:2;;;5614:79;;:::i;:::-;5578:2;5719:62;5773:7;5764:6;5753:9;5749:22;5719:62;:::i;:::-;5709:72;;5504:287;4981:817;;;;;;;:::o;5804:468::-;5869:6;5877;5926:2;5914:9;5905:7;5901:23;5897:32;5894:2;;;5932:79;;:::i;:::-;5894:2;6052:1;6077:53;6122:7;6113:6;6102:9;6098:22;6077:53;:::i;:::-;6067:63;;6023:117;6179:2;6205:50;6247:7;6238:6;6227:9;6223:22;6205:50;:::i;:::-;6195:60;;6150:115;5884:388;;;;;:::o;6278:474::-;6346:6;6354;6403:2;6391:9;6382:7;6378:23;6374:32;6371:2;;;6409:79;;:::i;:::-;6371:2;6529:1;6554:53;6599:7;6590:6;6579:9;6575:22;6554:53;:::i;:::-;6544:63;;6500:117;6656:2;6682:53;6727:7;6718:6;6707:9;6703:22;6682:53;:::i;:::-;6672:63;;6627:118;6361:391;;;;;:::o;6758:539::-;6842:6;6891:2;6879:9;6870:7;6866:23;6862:32;6859:2;;;6897:79;;:::i;:::-;6859:2;7045:1;7034:9;7030:17;7017:31;7075:18;7067:6;7064:30;7061:2;;;7097:79;;:::i;:::-;7061:2;7202:78;7272:7;7263:6;7252:9;7248:22;7202:78;:::i;:::-;7192:88;;6988:302;6849:448;;;;:::o;7303:327::-;7361:6;7410:2;7398:9;7389:7;7385:23;7381:32;7378:2;;;7416:79;;:::i;:::-;7378:2;7536:1;7561:52;7605:7;7596:6;7585:9;7581:22;7561:52;:::i;:::-;7551:62;;7507:116;7368:262;;;;:::o;7636:349::-;7705:6;7754:2;7742:9;7733:7;7729:23;7725:32;7722:2;;;7760:79;;:::i;:::-;7722:2;7880:1;7905:63;7960:7;7951:6;7940:9;7936:22;7905:63;:::i;:::-;7895:73;;7851:127;7712:273;;;;:::o;7991:1485::-;8117:6;8125;8133;8141;8190:3;8178:9;8169:7;8165:23;8161:33;8158:2;;;8197:79;;:::i;:::-;8158:2;8345:1;8334:9;8330:17;8317:31;8375:18;8367:6;8364:30;8361:2;;;8397:79;;:::i;:::-;8361:2;8502:63;8557:7;8548:6;8537:9;8533:22;8502:63;:::i;:::-;8492:73;;8288:287;8642:2;8631:9;8627:18;8614:32;8673:18;8665:6;8662:30;8659:2;;;8695:79;;:::i;:::-;8659:2;8800:63;8855:7;8846:6;8835:9;8831:22;8800:63;:::i;:::-;8790:73;;8585:288;8940:2;8929:9;8925:18;8912:32;8971:18;8963:6;8960:30;8957:2;;;8993:79;;:::i;:::-;8957:2;9098:63;9153:7;9144:6;9133:9;9129:22;9098:63;:::i;:::-;9088:73;;8883:288;9238:2;9227:9;9223:18;9210:32;9269:18;9261:6;9258:30;9255:2;;;9291:79;;:::i;:::-;9255:2;9396:63;9451:7;9442:6;9431:9;9427:22;9396:63;:::i;:::-;9386:73;;9181:288;8148:1328;;;;;;;:::o;9482:329::-;9541:6;9590:2;9578:9;9569:7;9565:23;9561:32;9558:2;;;9596:79;;:::i;:::-;9558:2;9716:1;9741:53;9786:7;9777:6;9766:9;9762:22;9741:53;:::i;:::-;9731:63;;9687:117;9548:263;;;;:::o;9817:654::-;9895:6;9903;9952:2;9940:9;9931:7;9927:23;9923:32;9920:2;;;9958:79;;:::i;:::-;9920:2;10078:1;10103:53;10148:7;10139:6;10128:9;10124:22;10103:53;:::i;:::-;10093:63;;10049:117;10233:2;10222:9;10218:18;10205:32;10264:18;10256:6;10253:30;10250:2;;;10286:79;;:::i;:::-;10250:2;10391:63;10446:7;10437:6;10426:9;10422:22;10391:63;:::i;:::-;10381:73;;10176:288;9910:561;;;;;:::o;10477:118::-;10564:24;10582:5;10564:24;:::i;:::-;10559:3;10552:37;10542:53;;:::o;10601:109::-;10682:21;10697:5;10682:21;:::i;:::-;10677:3;10670:34;10660:50;;:::o;10716:360::-;10802:3;10830:38;10862:5;10830:38;:::i;:::-;10884:70;10947:6;10942:3;10884:70;:::i;:::-;10877:77;;10963:52;11008:6;11003:3;10996:4;10989:5;10985:16;10963:52;:::i;:::-;11040:29;11062:6;11040:29;:::i;:::-;11035:3;11031:39;11024:46;;10806:270;;;;;:::o;11082:149::-;11178:46;11218:5;11178:46;:::i;:::-;11173:3;11166:59;11156:75;;:::o;11237:364::-;11325:3;11353:39;11386:5;11353:39;:::i;:::-;11408:71;11472:6;11467:3;11408:71;:::i;:::-;11401:78;;11488:52;11533:6;11528:3;11521:4;11514:5;11510:16;11488:52;:::i;:::-;11565:29;11587:6;11565:29;:::i;:::-;11560:3;11556:39;11549:46;;11329:272;;;;;:::o;11607:377::-;11713:3;11741:39;11774:5;11741:39;:::i;:::-;11796:89;11878:6;11873:3;11796:89;:::i;:::-;11789:96;;11894:52;11939:6;11934:3;11927:4;11920:5;11916:16;11894:52;:::i;:::-;11971:6;11966:3;11962:16;11955:23;;11717:267;;;;;:::o;12014:845::-;12117:3;12154:5;12148:12;12183:36;12209:9;12183:36;:::i;:::-;12235:89;12317:6;12312:3;12235:89;:::i;:::-;12228:96;;12355:1;12344:9;12340:17;12371:1;12366:137;;;;12517:1;12512:341;;;;12333:520;;12366:137;12450:4;12446:9;12435;12431:25;12426:3;12419:38;12486:6;12481:3;12477:16;12470:23;;12366:137;;12512:341;12579:38;12611:5;12579:38;:::i;:::-;12639:1;12653:154;12667:6;12664:1;12661:13;12653:154;;;12741:7;12735:14;12731:1;12726:3;12722:11;12715:35;12791:1;12782:7;12778:15;12767:26;;12689:4;12686:1;12682:12;12677:17;;12653:154;;;12836:6;12831:3;12827:16;12820:23;;12519:334;;12333:520;;12121:738;;;;;;:::o;12865:366::-;13007:3;13028:67;13092:2;13087:3;13028:67;:::i;:::-;13021:74;;13104:93;13193:3;13104:93;:::i;:::-;13222:2;13217:3;13213:12;13206:19;;13011:220;;;:::o;13237:366::-;13379:3;13400:67;13464:2;13459:3;13400:67;:::i;:::-;13393:74;;13476:93;13565:3;13476:93;:::i;:::-;13594:2;13589:3;13585:12;13578:19;;13383:220;;;:::o;13609:366::-;13751:3;13772:67;13836:2;13831:3;13772:67;:::i;:::-;13765:74;;13848:93;13937:3;13848:93;:::i;:::-;13966:2;13961:3;13957:12;13950:19;;13755:220;;;:::o;13981:366::-;14123:3;14144:67;14208:2;14203:3;14144:67;:::i;:::-;14137:74;;14220:93;14309:3;14220:93;:::i;:::-;14338:2;14333:3;14329:12;14322:19;;14127:220;;;:::o;14353:366::-;14495:3;14516:67;14580:2;14575:3;14516:67;:::i;:::-;14509:74;;14592:93;14681:3;14592:93;:::i;:::-;14710:2;14705:3;14701:12;14694:19;;14499:220;;;:::o;14725:366::-;14867:3;14888:67;14952:2;14947:3;14888:67;:::i;:::-;14881:74;;14964:93;15053:3;14964:93;:::i;:::-;15082:2;15077:3;15073:12;15066:19;;14871:220;;;:::o;15097:366::-;15239:3;15260:67;15324:2;15319:3;15260:67;:::i;:::-;15253:74;;15336:93;15425:3;15336:93;:::i;:::-;15454:2;15449:3;15445:12;15438:19;;15243:220;;;:::o;15469:366::-;15611:3;15632:67;15696:2;15691:3;15632:67;:::i;:::-;15625:74;;15708:93;15797:3;15708:93;:::i;:::-;15826:2;15821:3;15817:12;15810:19;;15615:220;;;:::o;15841:400::-;16001:3;16022:84;16104:1;16099:3;16022:84;:::i;:::-;16015:91;;16115:93;16204:3;16115:93;:::i;:::-;16233:1;16228:3;16224:11;16217:18;;16005:236;;;:::o;16247:366::-;16389:3;16410:67;16474:2;16469:3;16410:67;:::i;:::-;16403:74;;16486:93;16575:3;16486:93;:::i;:::-;16604:2;16599:3;16595:12;16588:19;;16393:220;;;:::o;16619:366::-;16761:3;16782:67;16846:2;16841:3;16782:67;:::i;:::-;16775:74;;16858:93;16947:3;16858:93;:::i;:::-;16976:2;16971:3;16967:12;16960:19;;16765:220;;;:::o;16991:366::-;17133:3;17154:67;17218:2;17213:3;17154:67;:::i;:::-;17147:74;;17230:93;17319:3;17230:93;:::i;:::-;17348:2;17343:3;17339:12;17332:19;;17137:220;;;:::o;17363:365::-;17505:3;17526:66;17590:1;17585:3;17526:66;:::i;:::-;17519:73;;17601:93;17690:3;17601:93;:::i;:::-;17719:2;17714:3;17710:12;17703:19;;17509:219;;;:::o;17734:400::-;17894:3;17915:84;17997:1;17992:3;17915:84;:::i;:::-;17908:91;;18008:93;18097:3;18008:93;:::i;:::-;18126:1;18121:3;18117:11;18110:18;;17898:236;;;:::o;18140:366::-;18282:3;18303:67;18367:2;18362:3;18303:67;:::i;:::-;18296:74;;18379:93;18468:3;18379:93;:::i;:::-;18497:2;18492:3;18488:12;18481:19;;18286:220;;;:::o;18512:366::-;18654:3;18675:67;18739:2;18734:3;18675:67;:::i;:::-;18668:74;;18751:93;18840:3;18751:93;:::i;:::-;18869:2;18864:3;18860:12;18853:19;;18658:220;;;:::o;18884:366::-;19026:3;19047:67;19111:2;19106:3;19047:67;:::i;:::-;19040:74;;19123:93;19212:3;19123:93;:::i;:::-;19241:2;19236:3;19232:12;19225:19;;19030:220;;;:::o;19256:366::-;19398:3;19419:67;19483:2;19478:3;19419:67;:::i;:::-;19412:74;;19495:93;19584:3;19495:93;:::i;:::-;19613:2;19608:3;19604:12;19597:19;;19402:220;;;:::o;19628:366::-;19770:3;19791:67;19855:2;19850:3;19791:67;:::i;:::-;19784:74;;19867:93;19956:3;19867:93;:::i;:::-;19985:2;19980:3;19976:12;19969:19;;19774:220;;;:::o;20000:402::-;20160:3;20181:85;20263:2;20258:3;20181:85;:::i;:::-;20174:92;;20275:93;20364:3;20275:93;:::i;:::-;20393:2;20388:3;20384:12;20377:19;;20164:238;;;:::o;20408:402::-;20568:3;20589:85;20671:2;20666:3;20589:85;:::i;:::-;20582:92;;20683:93;20772:3;20683:93;:::i;:::-;20801:2;20796:3;20792:12;20785:19;;20572:238;;;:::o;20816:366::-;20958:3;20979:67;21043:2;21038:3;20979:67;:::i;:::-;20972:74;;21055:93;21144:3;21055:93;:::i;:::-;21173:2;21168:3;21164:12;21157:19;;20962:220;;;:::o;21188:402::-;21348:3;21369:85;21451:2;21446:3;21369:85;:::i;:::-;21362:92;;21463:93;21552:3;21463:93;:::i;:::-;21581:2;21576:3;21572:12;21565:19;;21352:238;;;:::o;21596:365::-;21738:3;21759:66;21823:1;21818:3;21759:66;:::i;:::-;21752:73;;21834:93;21923:3;21834:93;:::i;:::-;21952:2;21947:3;21943:12;21936:19;;21742:219;;;:::o;21967:366::-;22109:3;22130:67;22194:2;22189:3;22130:67;:::i;:::-;22123:74;;22206:93;22295:3;22206:93;:::i;:::-;22324:2;22319:3;22315:12;22308:19;;22113:220;;;:::o;22339:366::-;22481:3;22502:67;22566:2;22561:3;22502:67;:::i;:::-;22495:74;;22578:93;22667:3;22578:93;:::i;:::-;22696:2;22691:3;22687:12;22680:19;;22485:220;;;:::o;22711:365::-;22853:3;22874:66;22938:1;22933:3;22874:66;:::i;:::-;22867:73;;22949:93;23038:3;22949:93;:::i;:::-;23067:2;23062:3;23058:12;23051:19;;22857:219;;;:::o;23082:366::-;23224:3;23245:67;23309:2;23304:3;23245:67;:::i;:::-;23238:74;;23321:93;23410:3;23321:93;:::i;:::-;23439:2;23434:3;23430:12;23423:19;;23228:220;;;:::o;23454:404::-;23614:3;23635:86;23717:3;23712;23635:86;:::i;:::-;23628:93;;23730;23819:3;23730:93;:::i;:::-;23848:3;23843;23839:13;23832:20;;23618:240;;;:::o;23864:118::-;23951:24;23969:5;23951:24;:::i;:::-;23946:3;23939:37;23929:53;;:::o;23988:435::-;24168:3;24190:95;24281:3;24272:6;24190:95;:::i;:::-;24183:102;;24302:95;24393:3;24384:6;24302:95;:::i;:::-;24295:102;;24414:3;24407:10;;24172:251;;;;;:::o;24429:1211::-;24837:3;24859:92;24947:3;24938:6;24859:92;:::i;:::-;24852:99;;24968:95;25059:3;25050:6;24968:95;:::i;:::-;24961:102;;25080:92;25168:3;25159:6;25080:92;:::i;:::-;25073:99;;25189:95;25280:3;25271:6;25189:95;:::i;:::-;25182:102;;25301:92;25389:3;25380:6;25301:92;:::i;:::-;25294:99;;25410:95;25501:3;25492:6;25410:95;:::i;:::-;25403:102;;25522:92;25610:3;25601:6;25522:92;:::i;:::-;25515:99;;25631:3;25624:10;;24841:799;;;;;;;;;;:::o;25646:2505::-;26573:3;26595:148;26739:3;26595:148;:::i;:::-;26588:155;;26760:92;26848:3;26839:6;26760:92;:::i;:::-;26753:99;;26869:148;27013:3;26869:148;:::i;:::-;26862:155;;27034:95;27125:3;27116:6;27034:95;:::i;:::-;27027:102;;27146:148;27290:3;27146:148;:::i;:::-;27139:155;;27311:95;27402:3;27393:6;27311:95;:::i;:::-;27304:102;;27423:148;27567:3;27423:148;:::i;:::-;27416:155;;27588:95;27679:3;27670:6;27588:95;:::i;:::-;27581:102;;27700:148;27844:3;27700:148;:::i;:::-;27693:155;;27865:95;27956:3;27947:6;27865:95;:::i;:::-;27858:102;;27977:148;28121:3;27977:148;:::i;:::-;27970:155;;28142:3;28135:10;;26577:1574;;;;;;;;:::o;28157:541::-;28390:3;28412:148;28556:3;28412:148;:::i;:::-;28405:155;;28577:95;28668:3;28659:6;28577:95;:::i;:::-;28570:102;;28689:3;28682:10;;28394:304;;;;:::o;28704:222::-;28797:4;28835:2;28824:9;28820:18;28812:26;;28848:71;28916:1;28905:9;28901:17;28892:6;28848:71;:::i;:::-;28802:124;;;;:::o;28932:640::-;29127:4;29165:3;29154:9;29150:19;29142:27;;29179:71;29247:1;29236:9;29232:17;29223:6;29179:71;:::i;:::-;29260:72;29328:2;29317:9;29313:18;29304:6;29260:72;:::i;:::-;29342;29410:2;29399:9;29395:18;29386:6;29342:72;:::i;:::-;29461:9;29455:4;29451:20;29446:2;29435:9;29431:18;29424:48;29489:76;29560:4;29551:6;29489:76;:::i;:::-;29481:84;;29132:440;;;;;;;:::o;29578:210::-;29665:4;29703:2;29692:9;29688:18;29680:26;;29716:65;29778:1;29767:9;29763:17;29754:6;29716:65;:::i;:::-;29670:118;;;;:::o;29794:313::-;29907:4;29945:2;29934:9;29930:18;29922:26;;29994:9;29988:4;29984:20;29980:1;29969:9;29965:17;29958:47;30022:78;30095:4;30086:6;30022:78;:::i;:::-;30014:86;;29912:195;;;;:::o;30113:715::-;30322:4;30360:2;30349:9;30345:18;30337:26;;30409:9;30403:4;30399:20;30395:1;30384:9;30380:17;30373:47;30437:78;30510:4;30501:6;30437:78;:::i;:::-;30429:86;;30562:9;30556:4;30552:20;30547:2;30536:9;30532:18;30525:48;30590:78;30663:4;30654:6;30590:78;:::i;:::-;30582:86;;30715:9;30709:4;30705:20;30700:2;30689:9;30685:18;30678:48;30743:78;30816:4;30807:6;30743:78;:::i;:::-;30735:86;;30327:501;;;;;;:::o;30834:768::-;31093:4;31131:3;31120:9;31116:19;31108:27;;31181:9;31175:4;31171:20;31167:1;31156:9;31152:17;31145:47;31209:131;31335:4;31209:131;:::i;:::-;31201:139;;31350:81;31427:2;31416:9;31412:18;31403:6;31350:81;:::i;:::-;31441:72;31509:2;31498:9;31494:18;31485:6;31441:72;:::i;:::-;31523;31591:2;31580:9;31576:18;31567:6;31523:72;:::i;:::-;31098:504;;;;;;:::o;31608:529::-;31802:4;31840:2;31829:9;31825:18;31817:26;;31889:9;31883:4;31879:20;31875:1;31864:9;31860:17;31853:47;31917:131;32043:4;31917:131;:::i;:::-;31909:139;;32058:72;32126:2;32115:9;32111:18;32102:6;32058:72;:::i;:::-;31807:330;;;;:::o;32143:419::-;32309:4;32347:2;32336:9;32332:18;32324:26;;32396:9;32390:4;32386:20;32382:1;32371:9;32367:17;32360:47;32424:131;32550:4;32424:131;:::i;:::-;32416:139;;32314:248;;;:::o;32568:419::-;32734:4;32772:2;32761:9;32757:18;32749:26;;32821:9;32815:4;32811:20;32807:1;32796:9;32792:17;32785:47;32849:131;32975:4;32849:131;:::i;:::-;32841:139;;32739:248;;;:::o;32993:419::-;33159:4;33197:2;33186:9;33182:18;33174:26;;33246:9;33240:4;33236:20;33232:1;33221:9;33217:17;33210:47;33274:131;33400:4;33274:131;:::i;:::-;33266:139;;33164:248;;;:::o;33418:419::-;33584:4;33622:2;33611:9;33607:18;33599:26;;33671:9;33665:4;33661:20;33657:1;33646:9;33642:17;33635:47;33699:131;33825:4;33699:131;:::i;:::-;33691:139;;33589:248;;;:::o;33843:419::-;34009:4;34047:2;34036:9;34032:18;34024:26;;34096:9;34090:4;34086:20;34082:1;34071:9;34067:17;34060:47;34124:131;34250:4;34124:131;:::i;:::-;34116:139;;34014:248;;;:::o;34268:419::-;34434:4;34472:2;34461:9;34457:18;34449:26;;34521:9;34515:4;34511:20;34507:1;34496:9;34492:17;34485:47;34549:131;34675:4;34549:131;:::i;:::-;34541:139;;34439:248;;;:::o;34693:419::-;34859:4;34897:2;34886:9;34882:18;34874:26;;34946:9;34940:4;34936:20;34932:1;34921:9;34917:17;34910:47;34974:131;35100:4;34974:131;:::i;:::-;34966:139;;34864:248;;;:::o;35118:419::-;35284:4;35322:2;35311:9;35307:18;35299:26;;35371:9;35365:4;35361:20;35357:1;35346:9;35342:17;35335:47;35399:131;35525:4;35399:131;:::i;:::-;35391:139;;35289:248;;;:::o;35543:419::-;35709:4;35747:2;35736:9;35732:18;35724:26;;35796:9;35790:4;35786:20;35782:1;35771:9;35767:17;35760:47;35824:131;35950:4;35824:131;:::i;:::-;35816:139;;35714:248;;;:::o;35968:419::-;36134:4;36172:2;36161:9;36157:18;36149:26;;36221:9;36215:4;36211:20;36207:1;36196:9;36192:17;36185:47;36249:131;36375:4;36249:131;:::i;:::-;36241:139;;36139:248;;;:::o;36393:419::-;36559:4;36597:2;36586:9;36582:18;36574:26;;36646:9;36640:4;36636:20;36632:1;36621:9;36617:17;36610:47;36674:131;36800:4;36674:131;:::i;:::-;36666:139;;36564:248;;;:::o;36818:419::-;36984:4;37022:2;37011:9;37007:18;36999:26;;37071:9;37065:4;37061:20;37057:1;37046:9;37042:17;37035:47;37099:131;37225:4;37099:131;:::i;:::-;37091:139;;36989:248;;;:::o;37243:419::-;37409:4;37447:2;37436:9;37432:18;37424:26;;37496:9;37490:4;37486:20;37482:1;37471:9;37467:17;37460:47;37524:131;37650:4;37524:131;:::i;:::-;37516:139;;37414:248;;;:::o;37668:419::-;37834:4;37872:2;37861:9;37857:18;37849:26;;37921:9;37915:4;37911:20;37907:1;37896:9;37892:17;37885:47;37949:131;38075:4;37949:131;:::i;:::-;37941:139;;37839:248;;;:::o;38093:419::-;38259:4;38297:2;38286:9;38282:18;38274:26;;38346:9;38340:4;38336:20;38332:1;38321:9;38317:17;38310:47;38374:131;38500:4;38374:131;:::i;:::-;38366:139;;38264:248;;;:::o;38518:419::-;38684:4;38722:2;38711:9;38707:18;38699:26;;38771:9;38765:4;38761:20;38757:1;38746:9;38742:17;38735:47;38799:131;38925:4;38799:131;:::i;:::-;38791:139;;38689:248;;;:::o;38943:419::-;39109:4;39147:2;39136:9;39132:18;39124:26;;39196:9;39190:4;39186:20;39182:1;39171:9;39167:17;39160:47;39224:131;39350:4;39224:131;:::i;:::-;39216:139;;39114:248;;;:::o;39368:419::-;39534:4;39572:2;39561:9;39557:18;39549:26;;39621:9;39615:4;39611:20;39607:1;39596:9;39592:17;39585:47;39649:131;39775:4;39649:131;:::i;:::-;39641:139;;39539:248;;;:::o;39793:419::-;39959:4;39997:2;39986:9;39982:18;39974:26;;40046:9;40040:4;40036:20;40032:1;40021:9;40017:17;40010:47;40074:131;40200:4;40074:131;:::i;:::-;40066:139;;39964:248;;;:::o;40218:419::-;40384:4;40422:2;40411:9;40407:18;40399:26;;40471:9;40465:4;40461:20;40457:1;40446:9;40442:17;40435:47;40499:131;40625:4;40499:131;:::i;:::-;40491:139;;40389:248;;;:::o;40643:419::-;40809:4;40847:2;40836:9;40832:18;40824:26;;40896:9;40890:4;40886:20;40882:1;40871:9;40867:17;40860:47;40924:131;41050:4;40924:131;:::i;:::-;40916:139;;40814:248;;;:::o;41068:419::-;41234:4;41272:2;41261:9;41257:18;41249:26;;41321:9;41315:4;41311:20;41307:1;41296:9;41292:17;41285:47;41349:131;41475:4;41349:131;:::i;:::-;41341:139;;41239:248;;;:::o;41493:222::-;41586:4;41624:2;41613:9;41609:18;41601:26;;41637:71;41705:1;41694:9;41690:17;41681:6;41637:71;:::i;:::-;41591:124;;;;:::o;41721:129::-;41755:6;41782:20;;:::i;:::-;41772:30;;41811:33;41839:4;41831:6;41811:33;:::i;:::-;41762:88;;;:::o;41856:75::-;41889:6;41922:2;41916:9;41906:19;;41896:35;:::o;41937:311::-;42014:4;42104:18;42096:6;42093:30;42090:2;;;42126:18;;:::i;:::-;42090:2;42176:4;42168:6;42164:17;42156:25;;42236:4;42230;42226:15;42218:23;;42019:229;;;:::o;42254:307::-;42315:4;42405:18;42397:6;42394:30;42391:2;;;42427:18;;:::i;:::-;42391:2;42465:29;42487:6;42465:29;:::i;:::-;42457:37;;42549:4;42543;42539:15;42531:23;;42320:241;;;:::o;42567:308::-;42629:4;42719:18;42711:6;42708:30;42705:2;;;42741:18;;:::i;:::-;42705:2;42779:29;42801:6;42779:29;:::i;:::-;42771:37;;42863:4;42857;42853:15;42845:23;;42634:241;;;:::o;42881:141::-;42930:4;42953:3;42945:11;;42976:3;42973:1;42966:14;43010:4;43007:1;42997:18;42989:26;;42935:87;;;:::o;43028:98::-;43079:6;43113:5;43107:12;43097:22;;43086:40;;;:::o;43132:99::-;43184:6;43218:5;43212:12;43202:22;;43191:40;;;:::o;43237:168::-;43320:11;43354:6;43349:3;43342:19;43394:4;43389:3;43385:14;43370:29;;43332:73;;;;:::o;43411:169::-;43495:11;43529:6;43524:3;43517:19;43569:4;43564:3;43560:14;43545:29;;43507:73;;;;:::o;43586:148::-;43688:11;43725:3;43710:18;;43700:34;;;;:::o;43740:305::-;43780:3;43799:20;43817:1;43799:20;:::i;:::-;43794:25;;43833:20;43851:1;43833:20;:::i;:::-;43828:25;;43987:1;43919:66;43915:74;43912:1;43909:81;43906:2;;;43993:18;;:::i;:::-;43906:2;44037:1;44034;44030:9;44023:16;;43784:261;;;;:::o;44051:185::-;44091:1;44108:20;44126:1;44108:20;:::i;:::-;44103:25;;44142:20;44160:1;44142:20;:::i;:::-;44137:25;;44181:1;44171:2;;44186:18;;:::i;:::-;44171:2;44228:1;44225;44221:9;44216:14;;44093:143;;;;:::o;44242:348::-;44282:7;44305:20;44323:1;44305:20;:::i;:::-;44300:25;;44339:20;44357:1;44339:20;:::i;:::-;44334:25;;44527:1;44459:66;44455:74;44452:1;44449:81;44444:1;44437:9;44430:17;44426:105;44423:2;;;44534:18;;:::i;:::-;44423:2;44582:1;44579;44575:9;44564:20;;44290:300;;;;:::o;44596:191::-;44636:4;44656:20;44674:1;44656:20;:::i;:::-;44651:25;;44690:20;44708:1;44690:20;:::i;:::-;44685:25;;44729:1;44726;44723:8;44720:2;;;44734:18;;:::i;:::-;44720:2;44779:1;44776;44772:9;44764:17;;44641:146;;;;:::o;44793:96::-;44830:7;44859:24;44877:5;44859:24;:::i;:::-;44848:35;;44838:51;;;:::o;44895:90::-;44929:7;44972:5;44965:13;44958:21;44947:32;;44937:48;;;:::o;44991:149::-;45027:7;45067:66;45060:5;45056:78;45045:89;;45035:105;;;:::o;45146:133::-;45194:7;45223:5;45212:16;;45229:44;45267:5;45229:44;:::i;:::-;45202:77;;;:::o;45285:126::-;45322:7;45362:42;45355:5;45351:54;45340:65;;45330:81;;;:::o;45417:77::-;45454:7;45483:5;45472:16;;45462:32;;;:::o;45500:133::-;45559:9;45592:35;45621:5;45592:35;:::i;:::-;45579:48;;45569:64;;;:::o;45639:154::-;45723:6;45718:3;45713;45700:30;45785:1;45776:6;45771:3;45767:16;45760:27;45690:103;;;:::o;45799:307::-;45867:1;45877:113;45891:6;45888:1;45885:13;45877:113;;;45976:1;45971:3;45967:11;45961:18;45957:1;45952:3;45948:11;45941:39;45913:2;45910:1;45906:10;45901:15;;45877:113;;;46008:6;46005:1;46002:13;45999:2;;;46088:1;46079:6;46074:3;46070:16;46063:27;45999:2;45848:258;;;;:::o;46112:320::-;46156:6;46193:1;46187:4;46183:12;46173:22;;46240:1;46234:4;46230:12;46261:18;46251:2;;46317:4;46309:6;46305:17;46295:27;;46251:2;46379;46371:6;46368:14;46348:18;46345:38;46342:2;;;46398:18;;:::i;:::-;46342:2;46163:269;;;;:::o;46438:281::-;46521:27;46543:4;46521:27;:::i;:::-;46513:6;46509:40;46651:6;46639:10;46636:22;46615:18;46603:10;46600:34;46597:62;46594:2;;;46662:18;;:::i;:::-;46594:2;46702:10;46698:2;46691:22;46481:238;;;:::o;46725:233::-;46764:3;46787:24;46805:5;46787:24;:::i;:::-;46778:33;;46833:66;46826:5;46823:77;46820:2;;;46903:18;;:::i;:::-;46820:2;46950:1;46943:5;46939:13;46932:20;;46768:190;;;:::o;46964:176::-;46996:1;47013:20;47031:1;47013:20;:::i;:::-;47008:25;;47047:20;47065:1;47047:20;:::i;:::-;47042:25;;47086:1;47076:2;;47091:18;;:::i;:::-;47076:2;47132:1;47129;47125:9;47120:14;;46998:142;;;;:::o;47146:180::-;47194:77;47191:1;47184:88;47291:4;47288:1;47281:15;47315:4;47312:1;47305:15;47332:180;47380:77;47377:1;47370:88;47477:4;47474:1;47467:15;47501:4;47498:1;47491:15;47518:180;47566:77;47563:1;47556:88;47663:4;47660:1;47653:15;47687:4;47684:1;47677:15;47704:180;47752:77;47749:1;47742:88;47849:4;47846:1;47839:15;47873:4;47870:1;47863:15;47890:180;47938:77;47935:1;47928:88;48035:4;48032:1;48025:15;48059:4;48056:1;48049:15;48076:180;48124:77;48121:1;48114:88;48221:4;48218:1;48211:15;48245:4;48242:1;48235:15;48262:180;48310:77;48307:1;48300:88;48407:4;48404:1;48397:15;48431:4;48428:1;48421:15;48448:117;48557:1;48554;48547:12;48571:117;48680:1;48677;48670:12;48694:117;48803:1;48800;48793:12;48817:117;48926:1;48923;48916:12;48940:117;49049:1;49046;49039:12;49063:102;49104:6;49155:2;49151:7;49146:2;49139:5;49135:14;49131:28;49121:38;;49111:54;;;:::o;49171:176::-;49311:24;49307:1;49299:6;49295:14;49288:48;49277:70;:::o;49357:242::-;49501:34;49497:1;49489:6;49485:14;49478:58;49574:13;49569:2;49561:6;49557:15;49550:38;49463:136;:::o;49609:249::-;49753:34;49749:1;49741:6;49737:14;49730:58;49826:20;49821:2;49813:6;49809:15;49802:45;49715:143;:::o;49868:237::-;50012:34;50008:1;50000:6;49996:14;49989:58;50085:8;50080:2;50072:6;50068:15;50061:33;49974:131;:::o;50115:186::-;50259:30;50255:1;50247:6;50243:14;50236:54;50221:80;:::o;50311:235::-;50455:34;50451:1;50443:6;50439:14;50432:58;50528:6;50523:2;50515:6;50511:15;50504:31;50417:129;:::o;50556:183::-;50700:27;50696:1;50688:6;50684:14;50677:51;50662:77;:::o;50749:243::-;50893:34;50889:1;50881:6;50877:14;50870:58;50966:14;50961:2;50953:6;50949:15;50942:39;50855:137;:::o;51002:159::-;51146:3;51142:1;51134:6;51130:14;51123:27;51108:53;:::o;51171:255::-;51315:34;51311:1;51303:6;51299:14;51292:58;51388:26;51383:2;51375:6;51371:15;51364:51;51277:149;:::o;51436:241::-;51580:34;51576:1;51568:6;51564:14;51557:58;51653:12;51648:2;51640:6;51636:15;51629:37;51542:135;:::o;51687:240::-;51831:34;51827:1;51819:6;51815:14;51808:58;51904:11;51899:2;51891:6;51887:15;51880:36;51793:134;:::o;51937:164::-;52081:8;52077:1;52069:6;52065:14;52058:32;52043:58;:::o;52111:222::-;52255:66;52251:1;52243:6;52239:14;52232:90;52217:116;:::o;52343:190::-;52487:34;52483:1;52475:6;52471:14;52464:58;52449:84;:::o;52543:172::-;52687:16;52683:1;52675:6;52671:14;52664:40;52649:66;:::o;52725:243::-;52869:34;52865:1;52857:6;52853:14;52846:58;52942:14;52937:2;52929:6;52925:15;52918:39;52831:137;:::o;52978:190::-;53122:34;53118:1;53110:6;53106:14;53099:58;53084:84;:::o;53178:240::-;53322:34;53318:1;53310:6;53306:14;53299:58;53395:11;53390:2;53382:6;53378:15;53371:36;53284:134;:::o;53428:270::-;53572:66;53568:1;53560:6;53556:14;53549:90;53677:9;53672:2;53664:6;53660:15;53653:34;53534:164;:::o;53708:222::-;53852:66;53848:1;53840:6;53836:14;53829:90;53814:116;:::o;53940:232::-;54084:34;54080:1;54072:6;54068:14;54061:58;54157:3;54152:2;54144:6;54140:15;54133:28;54046:126;:::o;54182:187::-;54326:31;54322:1;54314:6;54310:14;54303:55;54288:81;:::o;54379:167::-;54523:11;54519:1;54511:6;54507:14;54500:35;54485:61;:::o;54556:248::-;54700:34;54696:1;54688:6;54684:14;54677:58;54773:19;54768:2;54760:6;54756:15;54749:44;54662:142;:::o;54814:243::-;54958:34;54954:1;54946:6;54942:14;54935:58;55031:14;55026:2;55018:6;55014:15;55007:39;54920:137;:::o;55067:161::-;55211:5;55207:1;55199:6;55195:14;55188:29;55173:55;:::o;55238:189::-;55382:33;55378:1;55370:6;55366:14;55359:57;55344:83;:::o;55437:509::-;55581:66;55577:1;55569:6;55565:14;55558:90;55686:34;55681:2;55673:6;55669:15;55662:59;55759:34;55754:2;55746:6;55742:15;55735:59;55832:34;55827:2;55819:6;55815:15;55808:59;55910:16;55904:3;55896:6;55892:16;55885:42;55543:403;:::o;55964:140::-;56060:1;56053:5;56050:12;56040:2;;56066:18;;:::i;:::-;56040:2;56018:86;:::o;56122:146::-;56207:24;56225:5;56207:24;:::i;:::-;56200:5;56197:35;56187:2;;56246:1;56243;56236:12;56187:2;56165:103;:::o;56286:140::-;56368:21;56383:5;56368:21;:::i;:::-;56361:5;56358:32;56348:2;;56404:1;56401;56394:12;56348:2;56326:100;:::o;56444:144::-;56528:23;56545:5;56528:23;:::i;:::-;56521:5;56518:34;56508:2;;56566:1;56563;56556:12;56508:2;56486:102;:::o;56606:146::-;56691:24;56709:5;56691:24;:::i;:::-;56684:5;56681:35;56671:2;;56730:1;56727;56720:12;56671:2;56649:103;:::o
Swarm Source
ipfs://77eadbc653a383755cc445aeb819373ce57502d0d99a695ba193998febc247b1
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | Ether (ETH) | 100.00% | $3,287.46 | 0.24 | $788.99 |
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.