Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
21 BLOOTWILLYS
Holders
14
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 BLOOTWILLYSLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
WickedWillysBE
Compiler Version
v0.7.6+commit.7338295f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-09-07 */ // SPDX-License-Identifier: MIT // GO TO LINE 1904 TO SEE WHERE THE TOKEN CONTRACT STARTS // File: @openzeppelin/contracts/utils/Context.sol pragma solidity >=0.6.0 <0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN 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 payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File: @openzeppelin/contracts/introspection/IERC165.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol pragma solidity >=0.6.2 <0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 tokenId) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external; } // File: @openzeppelin/contracts/token/ERC721/IERC721Metadata.sol pragma solidity >=0.6.2 <0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC721/IERC721Enumerable.sol pragma solidity >=0.6.2 <0.8.0; /** * @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); } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol pragma solidity >=0.6.0 <0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4); } // File: @openzeppelin/contracts/introspection/ERC165.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts may inherit from this and call {_registerInterface} to declare * their support of an interface. */ abstract contract ERC165 is IERC165 { /* * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7 */ bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7; /** * @dev Mapping of interface ids to whether or not it's supported. */ mapping(bytes4 => bool) private _supportedInterfaces; constructor () { // Derived contracts need only register support for their own interfaces, // we register support for ERC165 itself here _registerInterface(_INTERFACE_ID_ERC165); } /** * @dev See {IERC165-supportsInterface}. * * Time complexity O(1), guaranteed to always use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return _supportedInterfaces[interfaceId]; } /** * @dev Registers the contract as an implementer of the interface defined by * `interfaceId`. Support of the actual ERC165 interface is automatic and * registering its interface id is not required. * * See {IERC165-supportsInterface}. * * Requirements: * * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`). */ function _registerInterface(bytes4 interfaceId) internal virtual { require(interfaceId != 0xffffffff, "ERC165: invalid interface id"); _supportedInterfaces[interfaceId] = true; } } // File: @openzeppelin/contracts/math/SafeMath.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b > a) return (false, 0); return (true, a - b); } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a / b); } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a % b); } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SafeMath: subtraction overflow"); return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) return 0; uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: division by zero"); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: modulo by zero"); return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); return a - b; } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryDiv}. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a % b; } } // File "@openzeppelin/contracts/finance/PaymentSplitter.sol"; pragma solidity >=0.6.2 <0.8.0; /** * @title PaymentSplitter * @dev This contract allows to split Ether payments among a group of accounts. The sender does not need to be aware * that the Ether will be split in this way, since it is handled transparently by the contract. * * The split can be in equal parts or in any other arbitrary proportion. The way this is specified is by assigning each * account to a number of shares. Of all the Ether that this contract receives, each account will then be able to claim * an amount proportional to the percentage of total shares they were assigned. * * `PaymentSplitter` follows a _pull payment_ model. This means that payments are not automatically forwarded to the * accounts but kept in this contract, and the actual transfer is triggered as a separate step by calling the {release} * function. */ contract PaymentSplitter is Context { event PayeeAdded(address account, uint256 shares); event PaymentReleased(address to, uint256 amount); event PaymentReceived(address from, uint256 amount); uint256 private _totalShares; uint256 private _totalReleased; mapping(address => uint256) private _shares; mapping(address => uint256) private _released; address[] private _payees; /** * @dev Creates an instance of `PaymentSplitter` where each account in `payees` is assigned the number of shares at * the matching position in the `shares` array. * * All addresses in `payees` must be non-zero. Both arrays must have the same non-zero length, and there must be no * duplicates in `payees`. */ constructor (address[] memory payees, uint256[] memory shares_) payable { // solhint-disable-next-line max-line-length require(payees.length == shares_.length, "PaymentSplitter: payees and shares length mismatch"); require(payees.length > 0, "PaymentSplitter: no payees"); for (uint256 i = 0; i < payees.length; i++) { _addPayee(payees[i], shares_[i]); } } /** * @dev The Ether received will be logged with {PaymentReceived} events. Note that these events are not fully * reliable: it's possible for a contract to receive Ether without triggering this function. This only affects the * reliability of the events, and not the actual splitting of Ether. * * To learn more about this see the Solidity documentation for * https://solidity.readthedocs.io/en/latest/contracts.html#fallback-function[fallback * functions]. */ receive () external payable virtual { emit PaymentReceived(_msgSender(), msg.value); } /** * @dev Getter for the total shares held by payees. */ function totalShares() public view returns (uint256) { return _totalShares; } /** * @dev Getter for the total amount of Ether already released. */ function totalReleased() public view returns (uint256) { return _totalReleased; } /** * @dev Getter for the amount of shares held by an account. */ function shares(address account) public view returns (uint256) { return _shares[account]; } /** * @dev Getter for the amount of Ether already released to a payee. */ function released(address account) public view returns (uint256) { return _released[account]; } /** * @dev Getter for the address of the payee number `index`. */ function payee(uint256 index) public view returns (address) { return _payees[index]; } /** * @dev Triggers a transfer to `account` of the amount of Ether they are owed, according to their percentage of the * total shares and their previous withdrawals. */ function release(address payable account) public virtual { require(_shares[account] > 0, "PaymentSplitter: account has no shares"); uint256 totalReceived = address(this).balance + _totalReleased; uint256 payment = totalReceived * _shares[account] / _totalShares - _released[account]; require(payment != 0, "PaymentSplitter: account is not due payment"); _released[account] = _released[account] + payment; _totalReleased = _totalReleased + payment; Address.sendValue(account, payment); emit PaymentReleased(account, payment); } /** * @dev Add a new payee to the contract. * @param account The address of the payee to add. * @param shares_ The number of shares owned by the payee. */ function _addPayee(address account, uint256 shares_) private { require(account != address(0), "PaymentSplitter: account is the zero address"); require(shares_ > 0, "PaymentSplitter: shares are 0"); require(_shares[account] == 0, "PaymentSplitter: account already has shares"); _payees.push(account); _shares[account] = shares_; _totalShares = _totalShares + shares_; emit PayeeAdded(account, shares_); } } // File: @openzeppelin/contracts/utils/Address.sol pragma solidity >=0.6.2 <0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly 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"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (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"); // solhint-disable-next-line avoid-low-level-calls (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"); // solhint-disable-next-line avoid-low-level-calls (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"); // solhint-disable-next-line avoid-low-level-calls (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 // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/utils/EnumerableSet.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping (bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement. bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { require(set._values.length > index, "EnumerableSet: index out of bounds"); return set._values[index]; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } } // File: @openzeppelin/contracts/utils/EnumerableMap.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Library for managing an enumerable variant of Solidity's * https://solidity.readthedocs.io/en/latest/types.html#mapping-types[`mapping`] * type. * * Maps have the following properties: * * - Entries are added, removed, and checked for existence in constant time * (O(1)). * - Entries are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableMap for EnumerableMap.UintToAddressMap; * * // Declare a set state variable * EnumerableMap.UintToAddressMap private myMap; * } * ``` * * As of v3.0.0, only maps of type `uint256 -> address` (`UintToAddressMap`) are * supported. */ library EnumerableMap { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Map type with // bytes32 keys and values. // The Map implementation uses private functions, and user-facing // implementations (such as Uint256ToAddressMap) are just wrappers around // the underlying Map. // This means that we can only create new EnumerableMaps for types that fit // in bytes32. struct MapEntry { bytes32 _key; bytes32 _value; } struct Map { // Storage of map keys and values MapEntry[] _entries; // Position of the entry defined by a key in the `entries` array, plus 1 // because index 0 means a key is not in the map. mapping (bytes32 => uint256) _indexes; } /** * @dev Adds a key-value pair to a map, or updates the value for an existing * key. O(1). * * Returns true if the key was added to the map, that is if it was not * already present. */ function _set(Map storage map, bytes32 key, bytes32 value) private returns (bool) { // We read and store the key's index to prevent multiple reads from the same storage slot uint256 keyIndex = map._indexes[key]; if (keyIndex == 0) { // Equivalent to !contains(map, key) map._entries.push(MapEntry({ _key: key, _value: value })); // The entry is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value map._indexes[key] = map._entries.length; return true; } else { map._entries[keyIndex - 1]._value = value; return false; } } /** * @dev Removes a key-value pair from a map. O(1). * * Returns true if the key was removed from the map, that is if it was present. */ function _remove(Map storage map, bytes32 key) private returns (bool) { // We read and store the key's index to prevent multiple reads from the same storage slot uint256 keyIndex = map._indexes[key]; if (keyIndex != 0) { // Equivalent to contains(map, key) // To delete a key-value pair from the _entries array in O(1), we swap the entry to delete with the last one // in the array, and then remove the last entry (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = keyIndex - 1; uint256 lastIndex = map._entries.length - 1; // When the entry to delete is the last one, the swap operation is unnecessary. However, since this occurs // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement. MapEntry storage lastEntry = map._entries[lastIndex]; // Move the last entry to the index where the entry to delete is map._entries[toDeleteIndex] = lastEntry; // Update the index for the moved entry map._indexes[lastEntry._key] = toDeleteIndex + 1; // All indexes are 1-based // Delete the slot where the moved entry was stored map._entries.pop(); // Delete the index for the deleted slot delete map._indexes[key]; return true; } else { return false; } } /** * @dev Returns true if the key is in the map. O(1). */ function _contains(Map storage map, bytes32 key) private view returns (bool) { return map._indexes[key] != 0; } /** * @dev Returns the number of key-value pairs in the map. O(1). */ function _length(Map storage map) private view returns (uint256) { return map._entries.length; } /** * @dev Returns the key-value pair stored at position `index` in the map. O(1). * * Note that there are no guarantees on the ordering of entries inside the * array, and it may change when more entries are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Map storage map, uint256 index) private view returns (bytes32, bytes32) { require(map._entries.length > index, "EnumerableMap: index out of bounds"); MapEntry storage entry = map._entries[index]; return (entry._key, entry._value); } /** * @dev Tries to returns the value associated with `key`. O(1). * Does not revert if `key` is not in the map. */ function _tryGet(Map storage map, bytes32 key) private view returns (bool, bytes32) { uint256 keyIndex = map._indexes[key]; if (keyIndex == 0) return (false, 0); // Equivalent to contains(map, key) return (true, map._entries[keyIndex - 1]._value); // All indexes are 1-based } /** * @dev Returns the value associated with `key`. O(1). * * Requirements: * * - `key` must be in the map. */ function _get(Map storage map, bytes32 key) private view returns (bytes32) { uint256 keyIndex = map._indexes[key]; require(keyIndex != 0, "EnumerableMap: nonexistent key"); // Equivalent to contains(map, key) return map._entries[keyIndex - 1]._value; // All indexes are 1-based } /** * @dev Same as {_get}, with a custom error message when `key` is not in the map. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {_tryGet}. */ function _get(Map storage map, bytes32 key, string memory errorMessage) private view returns (bytes32) { uint256 keyIndex = map._indexes[key]; require(keyIndex != 0, errorMessage); // Equivalent to contains(map, key) return map._entries[keyIndex - 1]._value; // All indexes are 1-based } // UintToAddressMap struct UintToAddressMap { Map _inner; } /** * @dev Adds a key-value pair to a map, or updates the value for an existing * key. O(1). * * Returns true if the key was added to the map, that is if it was not * already present. */ function set(UintToAddressMap storage map, uint256 key, address value) internal returns (bool) { return _set(map._inner, bytes32(key), bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the key was removed from the map, that is if it was present. */ function remove(UintToAddressMap storage map, uint256 key) internal returns (bool) { return _remove(map._inner, bytes32(key)); } /** * @dev Returns true if the key is in the map. O(1). */ function contains(UintToAddressMap storage map, uint256 key) internal view returns (bool) { return _contains(map._inner, bytes32(key)); } /** * @dev Returns the number of elements in the map. O(1). */ function length(UintToAddressMap storage map) internal view returns (uint256) { return _length(map._inner); } /** * @dev Returns the element stored at position `index` in the set. O(1). * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintToAddressMap storage map, uint256 index) internal view returns (uint256, address) { (bytes32 key, bytes32 value) = _at(map._inner, index); return (uint256(key), address(uint160(uint256(value)))); } /** * @dev Tries to returns the value associated with `key`. O(1). * Does not revert if `key` is not in the map. * * _Available since v3.4._ */ function tryGet(UintToAddressMap storage map, uint256 key) internal view returns (bool, address) { (bool success, bytes32 value) = _tryGet(map._inner, bytes32(key)); return (success, address(uint160(uint256(value)))); } /** * @dev Returns the value associated with `key`. O(1). * * Requirements: * * - `key` must be in the map. */ function get(UintToAddressMap storage map, uint256 key) internal view returns (address) { return address(uint160(uint256(_get(map._inner, bytes32(key))))); } /** * @dev Same as {get}, with a custom error message when `key` is not in the map. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryGet}. */ function get(UintToAddressMap storage map, uint256 key, string memory errorMessage) internal view returns (address) { return address(uint160(uint256(_get(map._inner, bytes32(key), errorMessage)))); } } // File: @openzeppelin/contracts/utils/Strings.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev String operations. */ library Strings { /** * @dev Converts a `uint256` to its ASCII `string` 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); uint256 index = digits - 1; temp = value; while (temp != 0) { buffer[index--] = bytes1(uint8(48 + temp % 10)); temp /= 10; } return string(buffer); } } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol pragma solidity >=0.6.0 <0.8.0; /** * @title ERC721 Non-Fungible Token Standard basic implementation * @dev see https://eips.ethereum.org/EIPS/eip-721 */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable { using SafeMath for uint256; using Address for address; using EnumerableSet for EnumerableSet.UintSet; using EnumerableMap for EnumerableMap.UintToAddressMap; using Strings for uint256; // Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` // which can be also obtained as `IERC721Receiver(0).onERC721Received.selector` bytes4 private constant _ERC721_RECEIVED = 0x150b7a02; // Mapping from holder address to their (enumerable) set of owned tokens mapping (address => EnumerableSet.UintSet) private _holderTokens; // Enumerable mapping from token ids to their owners EnumerableMap.UintToAddressMap private _tokenOwners; // 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; // Token name string private _name; // Token symbol string private _symbol; // Optional mapping for token URIs mapping (uint256 => string) private _tokenURIs; // Base URI string private _baseURI; /* * bytes4(keccak256('balanceOf(address)')) == 0x70a08231 * bytes4(keccak256('ownerOf(uint256)')) == 0x6352211e * bytes4(keccak256('approve(address,uint256)')) == 0x095ea7b3 * bytes4(keccak256('getApproved(uint256)')) == 0x081812fc * bytes4(keccak256('setApprovalForAll(address,bool)')) == 0xa22cb465 * bytes4(keccak256('isApprovedForAll(address,address)')) == 0xe985e9c5 * bytes4(keccak256('transferFrom(address,address,uint256)')) == 0x23b872dd * bytes4(keccak256('safeTransferFrom(address,address,uint256)')) == 0x42842e0e * bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)')) == 0xb88d4fde * * => 0x70a08231 ^ 0x6352211e ^ 0x095ea7b3 ^ 0x081812fc ^ * 0xa22cb465 ^ 0xe985e9c5 ^ 0x23b872dd ^ 0x42842e0e ^ 0xb88d4fde == 0x80ac58cd */ bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd; /* * bytes4(keccak256('name()')) == 0x06fdde03 * bytes4(keccak256('symbol()')) == 0x95d89b41 * bytes4(keccak256('tokenURI(uint256)')) == 0xc87b56dd * * => 0x06fdde03 ^ 0x95d89b41 ^ 0xc87b56dd == 0x5b5e139f */ bytes4 private constant _INTERFACE_ID_ERC721_METADATA = 0x5b5e139f; /* * bytes4(keccak256('totalSupply()')) == 0x18160ddd * bytes4(keccak256('tokenOfOwnerByIndex(address,uint256)')) == 0x2f745c59 * bytes4(keccak256('tokenByIndex(uint256)')) == 0x4f6ccce7 * * => 0x18160ddd ^ 0x2f745c59 ^ 0x4f6ccce7 == 0x780e9d63 */ bytes4 private constant _INTERFACE_ID_ERC721_ENUMERABLE = 0x780e9d63; /** * @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_; // register the supported interfaces to conform to ERC721 via ERC165 _registerInterface(_INTERFACE_ID_ERC721); _registerInterface(_INTERFACE_ID_ERC721_METADATA); _registerInterface(_INTERFACE_ID_ERC721_ENUMERABLE); } /** * @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 _holderTokens[owner].length(); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { return _tokenOwners.get(tokenId, "ERC721: owner query for nonexistent token"); } /** * @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 _tokenURI = _tokenURIs[tokenId]; string memory base = baseURI(); // If there is no base URI, return the token URI. if (bytes(base).length == 0) { return _tokenURI; } // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked). if (bytes(_tokenURI).length > 0) { return string(abi.encodePacked(base, _tokenURI)); } // If there is a baseURI but no tokenURI, concatenate the tokenID to the baseURI. return string(abi.encodePacked(base, tokenId.toString())); } /** * @dev Returns the base URI set via {_setBaseURI}. This will be * automatically added as a prefix in {tokenURI} to each token's URI, or * to the token ID if no specific URI is set for that token ID. */ function baseURI() public view virtual returns (string memory) { return _baseURI; } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { return _holderTokens[owner].at(index); } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { // _tokenOwners are indexed by tokenIds, so .length() returns the number of tokenIds return _tokenOwners.length(); } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { (uint256 tokenId, ) = _tokenOwners.at(index); return tokenId; } /** * @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 || ERC721.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 _tokenOwners.contains(tokenId); } /** * @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 || ERC721.isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: d* * - `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); _holderTokens[to].add(tokenId); _tokenOwners.set(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); // internal owner _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); // Clear metadata (if any) if (bytes(_tokenURIs[tokenId]).length != 0) { delete _tokenURIs[tokenId]; } _holderTokens[owner].remove(tokenId); _tokenOwners.remove(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"); // internal owner require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _holderTokens[from].remove(tokenId); _holderTokens[to].add(tokenId); _tokenOwners.set(tokenId, to); emit Transfer(from, to, tokenId); } /** * @dev Sets `_tokenURI` as the tokenURI of `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual { require(_exists(tokenId), "ERC721Metadata: URI set of nonexistent token"); _tokenURIs[tokenId] = _tokenURI; } /** * @dev Internal function to set the base URI for all token IDs. It is * automatically added as a prefix to the value returned in {tokenURI}, * or to the token ID if {tokenURI} is empty. */ function _setBaseURI(string memory baseURI_) internal virtual { _baseURI = baseURI_; } /** * @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()) { return true; } bytes memory returndata = to.functionCall(abi.encodeWithSelector( IERC721Receiver(to).onERC721Received.selector, _msgSender(), from, tokenId, _data ), "ERC721: transfer to non ERC721Receiver implementer"); bytes4 retval = abi.decode(returndata, (bytes4)); return (retval == _ERC721_RECEIVED); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); // internal owner } /** * @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 { } } // File: @openzeppelin/contracts/access/Ownable.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), 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 { emit OwnershipTransferred(_owner, address(0)); _owner = 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"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // Wicked Willys Bloot Edition is a bloot inspired version of the Wicked Willys NFT project. Only 1kb, or 1024 of the Bloot Edition will be minted. // If you like the Bloot Edition, we suggest you checkout our core Wicked Willy project https://wickedwillysnft.com or get the team on https://twitter.com/wickedwillysnft pragma solidity ^0.7.0; pragma abicoder v2; contract WickedWillysBE is ERC721, PaymentSplitter, Ownable { using SafeMath for uint256; // Constants uint public constant maxTokenPurchase = 5; uint256 public constant MAX_TOKENS = 1024; // Variables uint256 public tokenPrice = 25000000000000000; // 0.025 ETH bool public saleIsActive = false; // Withdraw Addresses address[] private teamWallets = [ 0x214B56E7121aB36977F9B4920E04263d1FAabb8c, // 70 0x39010C2E22281629E9E7aC94f5c78dB38FDD8a7E // 30 ]; uint256[] private teamShares = [70,30]; // To be decided string public TOKEN_PROVENANCE = ""; // IPFS URL WILL BE ADDED WHEN TOKENS ARE ALL SOLD OUT string public LICENSE_TEXT = ""; // IT IS WHAT IT SAYS bool licenseLocked = false; // TEAM CAN'T EDIT THE LICENSE AFTER THIS GETS TRUE event licenseisLocked(string _licenseText); constructor() PaymentSplitter(teamWallets, teamShares) ERC721("Wicked Willys Bloot Edition", "BLOOTWILLYS") {} // Make sale Active/Inactive function flipSaleState() public onlyOwner { saleIsActive = !saleIsActive; } // Return Sale Active/Inactive function getSalesState() public view returns (bool){ return saleIsActive; } // Just in case ETH does something silly function setTokenPrice(uint256 newPrice) public onlyOwner { tokenPrice = newPrice; } function setProvenanceHash(string memory provenanceHash) public onlyOwner { TOKEN_PROVENANCE = provenanceHash; } function setBaseURI(string memory baseURI) public onlyOwner { _setBaseURI(baseURI); } function tokensOfOwner(address _owner) external view returns(uint256[] memory ) { uint256 tokenCount = balanceOf(_owner); if (tokenCount == 0) { // Return an empty array return new uint256[](0); } else { uint256[] memory result = new uint256[](tokenCount); uint256 index; for (index = 0; index < tokenCount; index++) { result[index] = tokenOfOwnerByIndex(_owner, index); } return result; } } // Returns the license for tokens function tokenLicense(uint _id) public view returns(string memory) { require(_id < totalSupply(), "Choose a token within range"); return LICENSE_TEXT; } // Change the license function changeLicense(string memory _license) public onlyOwner { require(licenseLocked == false, "The license is already locked"); LICENSE_TEXT = _license; } // Locks the license to prevent further changes function lockLicense() public onlyOwner { licenseLocked = true; emit licenseisLocked(LICENSE_TEXT); } function getBalance() public view onlyOwner returns (uint){ uint balance = address(this).balance; return balance; } function withdrawAll() public onlyOwner { uint balance = address(this).balance; msg.sender.transfer(balance); } // Withdraw balance to wallets per share allocation function withdrawShares() public onlyOwner { for (uint256 i = 0; i < teamWallets.length; i++) { address payable wallet = payable(teamWallets[i]); release(wallet); } } function mintToken(uint numberOfTokens) public payable { require(saleIsActive, "Sale must be active to mint Token"); require(numberOfTokens > 0 && numberOfTokens <= maxTokenPurchase, "Can only mint 3 tokens at a time"); require(totalSupply().add(numberOfTokens) <= MAX_TOKENS, "Purchase would exceed max supply of Tokens"); require(msg.value >= tokenPrice.mul(numberOfTokens), "Ether value sent is not correct"); for(uint i = 0; i < numberOfTokens; i++) { uint mintIndex = totalSupply(); if (totalSupply() < MAX_TOKENS) { _safeMint(msg.sender, mintIndex); } } } }
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":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"PayeeAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReleased","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"_licenseText","type":"string"}],"name":"licenseisLocked","type":"event"},{"inputs":[],"name":"LICENSE_TEXT","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOKEN_PROVENANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_license","type":"string"}],"name":"changeLicense","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSalesState","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"lockLicense","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxTokenPurchase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mintToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"payee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"provenanceHash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setTokenPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"shares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"tokenLicense","outputs":[{"internalType":"string","name":"","type":"string"}],"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":[],"name":"tokenPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawShares","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040526658d15e176280006010556000601160006101000a81548160ff021916908315150217905550604051806040016040528073214b56e7121ab36977f9b4920e04263d1faabb8c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020017339010c2e22281629e9e7ac94f5c78db38fdd8a7e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152506012906002620000d192919062000803565b506040518060400160405280604660ff168152602001601e60ff1681525060139060026200010192919062000892565b50604051806020016040528060008152506014908051906020019062000129929190620008e9565b50604051806020016040528060008152506015908051906020019062000151929190620008e9565b506000601660006101000a81548160ff0219169083151502179055503480156200017a57600080fd5b506012805480602002602001604051908101604052809291908181526020018280548015620001ff57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311620001b4575b505050505060138054806020026020016040519081016040528092919081815260200182805480156200025257602002820191906000526020600020905b8154815260200190600101908083116200023d575b50505050506040518060400160405280601b81526020017f5769636b65642057696c6c797320426c6f6f742045646974696f6e00000000008152506040518060400160405280600b81526020017f424c4f4f5457494c4c5953000000000000000000000000000000000000000000815250620002db6301ffc9a760e01b620004f460201b60201c565b8160069080519060200190620002f3929190620008e9565b5080600790805190602001906200030c929190620008e9565b50620003256380ac58cd60e01b620004f460201b60201c565b6200033d635b5e139f60e01b620004f460201b60201c565b6200035563780e9d6360e01b620004f460201b60201c565b505080518251146200039e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003959062000c30565b60405180910390fd5b6000825111620003e5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003dc9062000c74565b60405180910390fd5b60005b82518110156200043a576200042c8382815181106200040357fe5b60200260200101518383815181106200041857fe5b6020026020010151620005cc60201b60201c565b8080600101915050620003e8565b50505060006200044f620007fb60201b60201c565b905080600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35062000d07565b63ffffffff60e01b817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141562000560576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005579062000c0e565b60405180910390fd5b6001600080837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156200063f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006369062000bec565b60405180910390fd5b6000811162000685576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200067c9062000c96565b60405180910390fd5b6000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054146200070a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007019062000c52565b60405180910390fd5b600e829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600a5401600a819055507f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac8282604051620007ef92919062000bbf565b60405180910390a15050565b600033905090565b8280548282559060005260206000209081019282156200087f579160200282015b828111156200087e5782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509160200191906001019062000824565b5b5090506200088e919062000980565b5090565b828054828255906000526020600020908101928215620008d6579160200282015b82811115620008d5578251829060ff16905591602001919060010190620008b3565b5b509050620008e5919062000980565b5090565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826200092157600085556200096d565b82601f106200093c57805160ff19168380011785556200096d565b828001600101855582156200096d579182015b828111156200096c5782518255916020019190600101906200094f565b5b5090506200097c919062000980565b5090565b5b808211156200099b57600081600090555060010162000981565b5090565b620009aa8162000cc9565b82525050565b6000620009bf602c8362000cb8565b91507f5061796d656e7453706c69747465723a206163636f756e74206973207468652060008301527f7a65726f206164647265737300000000000000000000000000000000000000006020830152604082019050919050565b600062000a27601c8362000cb8565b91507f4552433136353a20696e76616c696420696e74657266616365206964000000006000830152602082019050919050565b600062000a6960328362000cb8565b91507f5061796d656e7453706c69747465723a2070617965657320616e64207368617260008301527f6573206c656e677468206d69736d6174636800000000000000000000000000006020830152604082019050919050565b600062000ad1602b8362000cb8565b91507f5061796d656e7453706c69747465723a206163636f756e7420616c726561647960008301527f20686173207368617265730000000000000000000000000000000000000000006020830152604082019050919050565b600062000b39601a8362000cb8565b91507f5061796d656e7453706c69747465723a206e6f207061796565730000000000006000830152602082019050919050565b600062000b7b601d8362000cb8565b91507f5061796d656e7453706c69747465723a207368617265732061726520300000006000830152602082019050919050565b62000bb98162000cfd565b82525050565b600060408201905062000bd660008301856200099f565b62000be5602083018462000bae565b9392505050565b6000602082019050818103600083015262000c0781620009b0565b9050919050565b6000602082019050818103600083015262000c298162000a18565b9050919050565b6000602082019050818103600083015262000c4b8162000a5a565b9050919050565b6000602082019050818103600083015262000c6d8162000ac2565b9050919050565b6000602082019050818103600083015262000c8f8162000b2a565b9050919050565b6000602082019050818103600083015262000cb18162000b6c565b9050919050565b600082825260208201905092915050565b600062000cd68262000cdd565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6151ba8062000d176000396000f3fe6080604052600436106102765760003560e01c80637ff9b5961161014f578063b88d4fde116100c1578063d9b137b21161007a578063d9b137b21461098e578063e33b7de3146109cb578063e985e9c5146109f6578063eb8d244414610a33578063f2fde38b14610a5e578063f47c84c514610a87576102bd565b8063b88d4fde1461088d578063bf4702fc146108b6578063bf8a944b146108cd578063c634d032146108f8578063c87b56dd14610914578063ce7c2ac214610951576102bd565b80638da5cb5b116101135780638da5cb5b1461077d57806395d89b41146107a85780639852595c146107d35780639c3e72bd14610810578063a22cb4651461083b578063b09904b514610864576102bd565b80637ff9b596146106aa5780638462151c146106d5578063853828b6146107125780638b83209b146107295780638d086da414610766576102bd565b806334918dfd116101e85780636352211e116101ac5780636352211e1461059a5780636a61e5fc146105d75780636c0360eb1461060057806370a082311461062b578063715018a6146106685780637f27405e1461067f576102bd565b806334918dfd146104c95780633a98ef39146104e057806342842e0e1461050b5780634f6ccce71461053457806355f804b314610571576102bd565b8063109695231161023a57806310969523146103bb57806312065fe0146103e457806318160ddd1461040f578063191655871461043a57806323b872dd146104635780632f745c591461048c576102bd565b806301ffc9a7146102c257806306fdde03146102ff578063081812fc1461032a578063095ea7b31461036757806309aa3dcf14610390576102bd565b366102bd577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be7706102a4610ab2565b346040516102b39291906149d3565b60405180910390a1005b600080fd5b3480156102ce57600080fd5b506102e960048036038101906102e49190613b5b565b610aba565b6040516102f69190614a1e565b60405180910390f35b34801561030b57600080fd5b50610314610b21565b6040516103219190614a39565b60405180910390f35b34801561033657600080fd5b50610351600480360381019061034c9190613bee565b610bc3565b60405161035e919061496c565b60405180910390f35b34801561037357600080fd5b5061038e60048036038101906103899190613b1f565b610c48565b005b34801561039c57600080fd5b506103a5610d60565b6040516103b29190614e5d565b60405180910390f35b3480156103c757600080fd5b506103e260048036038101906103dd9190613bad565b610d65565b005b3480156103f057600080fd5b506103f9610dfb565b6040516104069190614e5d565b60405180910390f35b34801561041b57600080fd5b50610424610e85565b6040516104319190614e5d565b60405180910390f35b34801561044657600080fd5b50610461600480360381019061045c91906139b4565b610e96565b005b34801561046f57600080fd5b5061048a60048036038101906104859190613a19565b6110cf565b005b34801561049857600080fd5b506104b360048036038101906104ae9190613b1f565b61112f565b6040516104c09190614e5d565b60405180910390f35b3480156104d557600080fd5b506104de61118a565b005b3480156104ec57600080fd5b506104f5611232565b6040516105029190614e5d565b60405180910390f35b34801561051757600080fd5b50610532600480360381019061052d9190613a19565b61123c565b005b34801561054057600080fd5b5061055b60048036038101906105569190613bee565b61125c565b6040516105689190614e5d565b60405180910390f35b34801561057d57600080fd5b5061059860048036038101906105939190613bad565b61127f565b005b3480156105a657600080fd5b506105c160048036038101906105bc9190613bee565b611307565b6040516105ce919061496c565b60405180910390f35b3480156105e357600080fd5b506105fe60048036038101906105f99190613bee565b61133e565b005b34801561060c57600080fd5b506106156113c4565b6040516106229190614a39565b60405180910390f35b34801561063757600080fd5b50610652600480360381019061064d919061398b565b611466565b60405161065f9190614e5d565b60405180910390f35b34801561067457600080fd5b5061067d611525565b005b34801561068b57600080fd5b50610694611662565b6040516106a19190614a1e565b60405180910390f35b3480156106b657600080fd5b506106bf611679565b6040516106cc9190614e5d565b60405180910390f35b3480156106e157600080fd5b506106fc60048036038101906106f7919061398b565b61167f565b60405161070991906149fc565b60405180910390f35b34801561071e57600080fd5b50610727611778565b005b34801561073557600080fd5b50610750600480360381019061074b9190613bee565b611843565b60405161075d919061496c565b60405180910390f35b34801561077257600080fd5b5061077b611884565b005b34801561078957600080fd5b50610792611966565b60405161079f919061496c565b60405180910390f35b3480156107b457600080fd5b506107bd611990565b6040516107ca9190614a39565b60405180910390f35b3480156107df57600080fd5b506107fa60048036038101906107f5919061398b565b611a32565b6040516108079190614e5d565b60405180910390f35b34801561081c57600080fd5b50610825611a7b565b6040516108329190614a39565b60405180910390f35b34801561084757600080fd5b50610862600480360381019061085d9190613ae3565b611b19565b005b34801561087057600080fd5b5061088b60048036038101906108869190613bad565b611c9a565b005b34801561089957600080fd5b506108b460048036038101906108af9190613a68565b611d86565b005b3480156108c257600080fd5b506108cb611de8565b005b3480156108d957600080fd5b506108e2611eb9565b6040516108ef9190614a39565b60405180910390f35b610912600480360381019061090d9190613bee565b611f57565b005b34801561092057600080fd5b5061093b60048036038101906109369190613bee565b6120f0565b6040516109489190614a39565b60405180910390f35b34801561095d57600080fd5b506109786004803603810190610973919061398b565b612273565b6040516109859190614e5d565b60405180910390f35b34801561099a57600080fd5b506109b560048036038101906109b09190613bee565b6122bc565b6040516109c29190614a39565b60405180910390f35b3480156109d757600080fd5b506109e06123a9565b6040516109ed9190614e5d565b60405180910390f35b348015610a0257600080fd5b50610a1d6004803603810190610a1891906139dd565b6123b3565b604051610a2a9190614a1e565b60405180910390f35b348015610a3f57600080fd5b50610a48612447565b604051610a559190614a1e565b60405180910390f35b348015610a6a57600080fd5b50610a856004803603810190610a80919061398b565b61245a565b005b348015610a9357600080fd5b50610a9c612606565b604051610aa99190614e5d565b60405180910390f35b600033905090565b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060068054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610bb95780601f10610b8e57610100808354040283529160200191610bb9565b820191906000526020600020905b815481529060010190602001808311610b9c57829003601f168201915b5050505050905090565b6000610bce8261260c565b610c0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0490614d5d565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c5382611307565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610cc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbb90614ddd565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ce3610ab2565b73ffffffffffffffffffffffffffffffffffffffff161480610d125750610d1181610d0c610ab2565b6123b3565b5b610d51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4890614c9d565b60405180910390fd5b610d5b8383612629565b505050565b600581565b610d6d610ab2565b73ffffffffffffffffffffffffffffffffffffffff16610d8b611966565b73ffffffffffffffffffffffffffffffffffffffff1614610de1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd890614d7d565b60405180910390fd5b8060149080519060200190610df7929190613792565b5050565b6000610e05610ab2565b73ffffffffffffffffffffffffffffffffffffffff16610e23611966565b73ffffffffffffffffffffffffffffffffffffffff1614610e79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7090614d7d565b60405180910390fd5b60004790508091505090565b6000610e9160026126e2565b905090565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411610f18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0f90614b7d565b60405180910390fd5b6000600b54470190506000600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600a54600c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054840281610faf57fe5b040390506000811415610ff7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fee90614c7d565b60405180910390fd5b80600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205401600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600b5401600b8190555061109183826126f7565b7fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b05683826040516110c29291906149d3565b60405180910390a1505050565b6110e06110da610ab2565b826127eb565b61111f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111690614e1d565b60405180910390fd5b61112a8383836128c9565b505050565b600061118282600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612ae090919063ffffffff16565b905092915050565b611192610ab2565b73ffffffffffffffffffffffffffffffffffffffff166111b0611966565b73ffffffffffffffffffffffffffffffffffffffff1614611206576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111fd90614d7d565b60405180910390fd5b601160009054906101000a900460ff1615601160006101000a81548160ff021916908315150217905550565b6000600a54905090565b61125783838360405180602001604052806000815250611d86565b505050565b600080611273836002612afa90919063ffffffff16565b50905080915050919050565b611287610ab2565b73ffffffffffffffffffffffffffffffffffffffff166112a5611966565b73ffffffffffffffffffffffffffffffffffffffff16146112fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f290614d7d565b60405180910390fd5b61130481612b26565b50565b60006113378260405180606001604052806029815260200161515c602991396002612b409092919063ffffffff16565b9050919050565b611346610ab2565b73ffffffffffffffffffffffffffffffffffffffff16611364611966565b73ffffffffffffffffffffffffffffffffffffffff16146113ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b190614d7d565b60405180910390fd5b8060108190555050565b606060098054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561145c5780601f106114315761010080835404028352916020019161145c565b820191906000526020600020905b81548152906001019060200180831161143f57829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ce90614cbd565b60405180910390fd5b61151e600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612b5f565b9050919050565b61152d610ab2565b73ffffffffffffffffffffffffffffffffffffffff1661154b611966565b73ffffffffffffffffffffffffffffffffffffffff16146115a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159890614d7d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000601160009054906101000a900460ff16905090565b60105481565b6060600061168c83611466565b905060008114156116e757600067ffffffffffffffff811180156116af57600080fd5b506040519080825280602002602001820160405280156116de5781602001602082028036833780820191505090505b50915050611773565b60008167ffffffffffffffff8111801561170057600080fd5b5060405190808252806020026020018201604052801561172f5781602001602082028036833780820191505090505b50905060005b8281101561176c57611747858261112f565b82828151811061175357fe5b6020026020010181815250508080600101915050611735565b8193505050505b919050565b611780610ab2565b73ffffffffffffffffffffffffffffffffffffffff1661179e611966565b73ffffffffffffffffffffffffffffffffffffffff16146117f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117eb90614d7d565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561183f573d6000803e3d6000fd5b5050565b6000600e828154811061185257fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b61188c610ab2565b73ffffffffffffffffffffffffffffffffffffffff166118aa611966565b73ffffffffffffffffffffffffffffffffffffffff1614611900576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f790614d7d565b60405180910390fd5b60005b6012805490508110156119635760006012828154811061191f57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905061195581610e96565b508080600101915050611903565b50565b6000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060078054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611a285780601f106119fd57610100808354040283529160200191611a28565b820191906000526020600020905b815481529060010190602001808311611a0b57829003601f168201915b5050505050905090565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60158054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611b115780601f10611ae657610100808354040283529160200191611b11565b820191906000526020600020905b815481529060010190602001808311611af457829003601f168201915b505050505081565b611b21610ab2565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8690614bbd565b60405180910390fd5b8060056000611b9c610ab2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611c49610ab2565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611c8e9190614a1e565b60405180910390a35050565b611ca2610ab2565b73ffffffffffffffffffffffffffffffffffffffff16611cc0611966565b73ffffffffffffffffffffffffffffffffffffffff1614611d16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0d90614d7d565b60405180910390fd5b60001515601660009054906101000a900460ff16151514611d6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6390614cdd565b60405180910390fd5b8060159080519060200190611d82929190613792565b5050565b611d97611d91610ab2565b836127eb565b611dd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dcd90614e1d565b60405180910390fd5b611de284848484612b74565b50505050565b611df0610ab2565b73ffffffffffffffffffffffffffffffffffffffff16611e0e611966565b73ffffffffffffffffffffffffffffffffffffffff1614611e64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5b90614d7d565b60405180910390fd5b6001601660006101000a81548160ff0219169083151502179055507f92423ccd40e13759d50d24569dcbaccb20ade47247f3cf3e3951a9f29d2048b06015604051611eaf9190614a5b565b60405180910390a1565b60148054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611f4f5780601f10611f2457610100808354040283529160200191611f4f565b820191906000526020600020905b815481529060010190602001808311611f3257829003601f168201915b505050505081565b601160009054906101000a900460ff16611fa6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9d90614b3d565b60405180910390fd5b600081118015611fb7575060058111155b611ff6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fed90614dfd565b60405180910390fd5b61040061201382612005610e85565b612bd090919063ffffffff16565b1115612054576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204b90614b5d565b60405180910390fd5b61206981601054612c2590919063ffffffff16565b3410156120ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a290614bdd565b60405180910390fd5b60005b818110156120ec5760006120c0610e85565b90506104006120cd610e85565b10156120de576120dd3382612c95565b5b5080806001019150506120ae565b5050565b60606120fb8261260c565b61213a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213190614dbd565b60405180910390fd5b6000600860008481526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156121e35780601f106121b8576101008083540402835291602001916121e3565b820191906000526020600020905b8154815290600101906020018083116121c657829003601f168201915b5050505050905060006121f46113c4565b905060008151141561220a57819250505061226e565b60008251111561223f578082604051602001612227929190614933565b6040516020818303038152906040529250505061226e565b8061224985612cb3565b60405160200161225a929190614933565b604051602081830303815290604052925050505b919050565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60606122c6610e85565b8210612307576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122fe90614a9d565b60405180910390fd5b60158054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561239d5780601f106123725761010080835404028352916020019161239d565b820191906000526020600020905b81548152906001019060200180831161238057829003601f168201915b50505050509050919050565b6000600b54905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b601160009054906101000a900460ff1681565b612462610ab2565b73ffffffffffffffffffffffffffffffffffffffff16612480611966565b73ffffffffffffffffffffffffffffffffffffffff16146124d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124cd90614d7d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612546576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253d90614add565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61040081565b6000612622826002612dfa90919063ffffffff16565b9050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661269c83611307565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006126f082600001612e14565b9050919050565b8047101561273a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161273190614c1d565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff168260405161276090614957565b60006040518083038185875af1925050503d806000811461279d576040519150601f19603f3d011682016040523d82523d6000602084013e6127a2565b606091505b50509050806127e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127dd90614bfd565b60405180910390fd5b505050565b60006127f68261260c565b612835576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161282c90614c5d565b60405180910390fd5b600061284083611307565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806128af57508373ffffffffffffffffffffffffffffffffffffffff1661289784610bc3565b73ffffffffffffffffffffffffffffffffffffffff16145b806128c057506128bf81856123b3565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166128e982611307565b73ffffffffffffffffffffffffffffffffffffffff161461293f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161293690614d9d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156129af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129a690614b9d565b60405180910390fd5b6129ba838383612e25565b6129c5600082612629565b612a1681600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612e2a90919063ffffffff16565b50612a6881600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612e4490919063ffffffff16565b50612a7f81836002612e5e9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000612aef8360000183612e93565b60001c905092915050565b600080600080612b0d8660000186612f00565b915091508160001c8160001c9350935050509250929050565b8060099080519060200190612b3c929190613792565b5050565b6000612b53846000018460001b84612f83565b60001c90509392505050565b6000612b6d82600001613014565b9050919050565b612b7f8484846128c9565b612b8b84848484613025565b612bca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bc190614abd565b60405180910390fd5b50505050565b600080828401905083811015612c1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c1290614b1d565b60405180910390fd5b8091505092915050565b600080831415612c385760009050612c8f565b6000828402905082848281612c4957fe5b0414612c8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c8190614d3d565b60405180910390fd5b809150505b92915050565b612caf828260405180602001604052806000815250613189565b5050565b60606000821415612cfb576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612df5565b600082905060005b60008214612d25578080600101915050600a8281612d1d57fe5b049150612d03565b60008167ffffffffffffffff81118015612d3e57600080fd5b506040519080825280601f01601f191660200182016040528015612d715781602001600182028036833780820191505090505b50905060006001830390508593505b60008414612ded57600a8481612d9257fe5b0660300160f81b82828060019003935081518110612dac57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8481612de557fe5b049350612d80565b819450505050505b919050565b6000612e0c836000018360001b6131e4565b905092915050565b600081600001805490509050919050565b505050565b6000612e3c836000018360001b613207565b905092915050565b6000612e56836000018360001b6132ef565b905092915050565b6000612e8a846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b61335f565b90509392505050565b600081836000018054905011612ede576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ed590614a7d565b60405180910390fd5b826000018281548110612eed57fe5b9060005260206000200154905092915050565b60008082846000018054905011612f4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f4390614cfd565b60405180910390fd5b6000846000018481548110612f5d57fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b60008084600101600085815260200190815260200160002054905060008114158390612fe5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fdc9190614a39565b60405180910390fd5b50846000016001820381548110612ff857fe5b9060005260206000209060020201600101549150509392505050565b600081600001805490509050919050565b60006130468473ffffffffffffffffffffffffffffffffffffffff1661343b565b6130535760019050613181565b600061311a63150b7a0260e01b613068610ab2565b88878760405160240161307e9493929190614987565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405180606001604052806032815260200161512a603291398773ffffffffffffffffffffffffffffffffffffffff1661344e9092919063ffffffff16565b90506000818060200190518101906131329190613b84565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614925050505b949350505050565b6131938383613466565b6131a06000848484613025565b6131df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131d690614abd565b60405180910390fd5b505050565b600080836001016000848152602001908152602001600020541415905092915050565b600080836001016000848152602001908152602001600020549050600081146132e3576000600182039050600060018660000180549050039050600086600001828154811061325257fe5b906000526020600020015490508087600001848154811061326f57fe5b90600052602060002001819055506001830187600101600083815260200190815260200160002081905550866000018054806132a757fe5b600190038181906000526020600020016000905590558660010160008781526020019081526020016000206000905560019450505050506132e9565b60009150505b92915050565b60006132fb83836135f4565b613354578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050613359565b600090505b92915050565b600080846001016000858152602001908152602001600020549050600081141561340657846000016040518060400160405280868152602001858152509080600181540180825580915050600190039060005260206000209060020201600090919091909150600082015181600001556020820151816001015550508460000180549050856001016000868152602001908152602001600020819055506001915050613434565b8285600001600183038154811061341957fe5b90600052602060002090600202016001018190555060009150505b9392505050565b600080823b905060008111915050919050565b606061345d8484600085613617565b90509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156134d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134cd90614d1d565b60405180910390fd5b6134df8161260c565b1561351f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161351690614afd565b60405180910390fd5b61352b60008383612e25565b61357c81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612e4490919063ffffffff16565b5061359381836002612e5e9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080836001016000848152602001908152602001600020541415905092915050565b60608247101561365c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161365390614c3d565b60405180910390fd5b6136658561343b565b6136a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161369b90614e3d565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516136cd919061491c565b60006040518083038185875af1925050503d806000811461370a576040519150601f19603f3d011682016040523d82523d6000602084013e61370f565b606091505b509150915061371f82828661372b565b92505050949350505050565b6060831561373b5782905061378b565b60008351111561374e5782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137829190614a39565b60405180910390fd5b9392505050565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826137c8576000855561380f565b82601f106137e157805160ff191683800117855561380f565b8280016001018555821561380f579182015b8281111561380e5782518255916020019190600101906137f3565b5b50905061381c9190613820565b5090565b5b80821115613839576000816000905550600101613821565b5090565b600061385061384b84614ea9565b614e78565b90508281526020810184848401111561386857600080fd5b613873848285615061565b509392505050565b600061388e61388984614ed9565b614e78565b9050828152602081018484840111156138a657600080fd5b6138b1848285615061565b509392505050565b6000813590506138c8816150b6565b92915050565b6000813590506138dd816150cd565b92915050565b6000813590506138f2816150e4565b92915050565b600081359050613907816150fb565b92915050565b60008151905061391c816150fb565b92915050565b600082601f83011261393357600080fd5b813561394384826020860161383d565b91505092915050565b600082601f83011261395d57600080fd5b813561396d84826020860161387b565b91505092915050565b60008135905061398581615112565b92915050565b60006020828403121561399d57600080fd5b60006139ab848285016138b9565b91505092915050565b6000602082840312156139c657600080fd5b60006139d4848285016138ce565b91505092915050565b600080604083850312156139f057600080fd5b60006139fe858286016138b9565b9250506020613a0f858286016138b9565b9150509250929050565b600080600060608486031215613a2e57600080fd5b6000613a3c868287016138b9565b9350506020613a4d868287016138b9565b9250506040613a5e86828701613976565b9150509250925092565b60008060008060808587031215613a7e57600080fd5b6000613a8c878288016138b9565b9450506020613a9d878288016138b9565b9350506040613aae87828801613976565b925050606085013567ffffffffffffffff811115613acb57600080fd5b613ad787828801613922565b91505092959194509250565b60008060408385031215613af657600080fd5b6000613b04858286016138b9565b9250506020613b15858286016138e3565b9150509250929050565b60008060408385031215613b3257600080fd5b6000613b40858286016138b9565b9250506020613b5185828601613976565b9150509250929050565b600060208284031215613b6d57600080fd5b6000613b7b848285016138f8565b91505092915050565b600060208284031215613b9657600080fd5b6000613ba48482850161390d565b91505092915050565b600060208284031215613bbf57600080fd5b600082013567ffffffffffffffff811115613bd957600080fd5b613be58482850161394c565b91505092915050565b600060208284031215613c0057600080fd5b6000613c0e84828501613976565b91505092915050565b6000613c2383836148fe565b60208301905092915050565b613c388161502b565b82525050565b613c4781614fb7565b82525050565b613c5681614fa5565b82525050565b6000613c6782614f2e565b613c718185614f5c565b9350613c7c83614f09565b8060005b83811015613cad578151613c948882613c17565b9750613c9f83614f4f565b925050600181019050613c80565b5085935050505092915050565b613cc381614fc9565b82525050565b6000613cd482614f39565b613cde8185614f6d565b9350613cee818560208601615070565b613cf7816150a5565b840191505092915050565b6000613d0d82614f39565b613d178185614f7e565b9350613d27818560208601615070565b80840191505092915050565b6000613d3e82614f44565b613d488185614f89565b9350613d58818560208601615070565b613d61816150a5565b840191505092915050565b6000613d7782614f44565b613d818185614f9a565b9350613d91818560208601615070565b80840191505092915050565b600081546001811660008114613dba5760018114613de057613e24565b607f6002830416613dcb8187614f89565b955060ff198316865260208601935050613e24565b60028204613dee8187614f89565b9550613df985614f19565b60005b82811015613e1b57815481890152600182019150602081019050613dfc565b80880195505050505b505092915050565b6000613e39602283614f89565b91507f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613e9f601b83614f89565b91507f43686f6f7365206120746f6b656e2077697468696e2072616e676500000000006000830152602082019050919050565b6000613edf603283614f89565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000613f45602683614f89565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613fab601c83614f89565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613feb601b83614f89565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b600061402b602183614f89565b91507f53616c65206d7573742062652061637469766520746f206d696e7420546f6b6560008301527f6e000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614091602a83614f89565b91507f507572636861736520776f756c6420657863656564206d617820737570706c7960008301527f206f6620546f6b656e73000000000000000000000000000000000000000000006020830152604082019050919050565b60006140f7602683614f89565b91507f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060008301527f73686172657300000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061415d602483614f89565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006141c3601983614f89565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000614203601f83614f89565b91507f45746865722076616c75652073656e74206973206e6f7420636f7272656374006000830152602082019050919050565b6000614243603a83614f89565b91507f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008301527f6563697069656e74206d617920686176652072657665727465640000000000006020830152604082019050919050565b60006142a9601d83614f89565b91507f416464726573733a20696e73756666696369656e742062616c616e63650000006000830152602082019050919050565b60006142e9602683614f89565b91507f416464726573733a20696e73756666696369656e742062616c616e636520666f60008301527f722063616c6c00000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061434f602c83614f89565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006143b5602b83614f89565b91507f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060008301527f647565207061796d656e740000000000000000000000000000000000000000006020830152604082019050919050565b600061441b603883614f89565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000614481602a83614f89565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006144e7601d83614f89565b91507f546865206c6963656e736520697320616c7265616479206c6f636b65640000006000830152602082019050919050565b6000614527602283614f89565b91507f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061458d602083614f89565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b60006145cd602183614f89565b91507f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008301527f77000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614633602c83614f89565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000614699602083614f89565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006146d9602983614f89565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061473f602f83614f89565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b60006147a5602183614f89565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061480b600083614f7e565b9150600082019050919050565b6000614825602083614f89565b91507f43616e206f6e6c79206d696e74203320746f6b656e7320617420612074696d656000830152602082019050919050565b6000614865603183614f89565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b60006148cb601d83614f89565b91507f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006000830152602082019050919050565b61490781615021565b82525050565b61491681615021565b82525050565b60006149288284613d02565b915081905092915050565b600061493f8285613d6c565b915061494b8284613d6c565b91508190509392505050565b6000614962826147fe565b9150819050919050565b60006020820190506149816000830184613c4d565b92915050565b600060808201905061499c6000830187613c3e565b6149a96020830186613c4d565b6149b6604083018561490d565b81810360608301526149c88184613cc9565b905095945050505050565b60006040820190506149e86000830185613c2f565b6149f5602083018461490d565b9392505050565b60006020820190508181036000830152614a168184613c5c565b905092915050565b6000602082019050614a336000830184613cba565b92915050565b60006020820190508181036000830152614a538184613d33565b905092915050565b60006020820190508181036000830152614a758184613d9d565b905092915050565b60006020820190508181036000830152614a9681613e2c565b9050919050565b60006020820190508181036000830152614ab681613e92565b9050919050565b60006020820190508181036000830152614ad681613ed2565b9050919050565b60006020820190508181036000830152614af681613f38565b9050919050565b60006020820190508181036000830152614b1681613f9e565b9050919050565b60006020820190508181036000830152614b3681613fde565b9050919050565b60006020820190508181036000830152614b568161401e565b9050919050565b60006020820190508181036000830152614b7681614084565b9050919050565b60006020820190508181036000830152614b96816140ea565b9050919050565b60006020820190508181036000830152614bb681614150565b9050919050565b60006020820190508181036000830152614bd6816141b6565b9050919050565b60006020820190508181036000830152614bf6816141f6565b9050919050565b60006020820190508181036000830152614c1681614236565b9050919050565b60006020820190508181036000830152614c368161429c565b9050919050565b60006020820190508181036000830152614c56816142dc565b9050919050565b60006020820190508181036000830152614c7681614342565b9050919050565b60006020820190508181036000830152614c96816143a8565b9050919050565b60006020820190508181036000830152614cb68161440e565b9050919050565b60006020820190508181036000830152614cd681614474565b9050919050565b60006020820190508181036000830152614cf6816144da565b9050919050565b60006020820190508181036000830152614d168161451a565b9050919050565b60006020820190508181036000830152614d3681614580565b9050919050565b60006020820190508181036000830152614d56816145c0565b9050919050565b60006020820190508181036000830152614d7681614626565b9050919050565b60006020820190508181036000830152614d968161468c565b9050919050565b60006020820190508181036000830152614db6816146cc565b9050919050565b60006020820190508181036000830152614dd681614732565b9050919050565b60006020820190508181036000830152614df681614798565b9050919050565b60006020820190508181036000830152614e1681614818565b9050919050565b60006020820190508181036000830152614e3681614858565b9050919050565b60006020820190508181036000830152614e56816148be565b9050919050565b6000602082019050614e72600083018461490d565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614e9f57614e9e6150a3565b5b8060405250919050565b600067ffffffffffffffff821115614ec457614ec36150a3565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614ef457614ef36150a3565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614fb082615001565b9050919050565b6000614fc282615001565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006150368261503d565b9050919050565b60006150488261504f565b9050919050565b600061505a82615001565b9050919050565b82818337600083830152505050565b60005b8381101561508e578082015181840152602081019050615073565b8381111561509d576000848401525b50505050565bfe5b6000601f19601f8301169050919050565b6150bf81614fa5565b81146150ca57600080fd5b50565b6150d681614fb7565b81146150e157600080fd5b50565b6150ed81614fc9565b81146150f857600080fd5b50565b61510481614fd5565b811461510f57600080fd5b50565b61511b81615021565b811461512657600080fd5b5056fe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea264697066735822122097c8555ed19253f517cd0c1cac3b7010201e253ab045673e56490560afb682a264736f6c63430007060033
Deployed Bytecode
0x6080604052600436106102765760003560e01c80637ff9b5961161014f578063b88d4fde116100c1578063d9b137b21161007a578063d9b137b21461098e578063e33b7de3146109cb578063e985e9c5146109f6578063eb8d244414610a33578063f2fde38b14610a5e578063f47c84c514610a87576102bd565b8063b88d4fde1461088d578063bf4702fc146108b6578063bf8a944b146108cd578063c634d032146108f8578063c87b56dd14610914578063ce7c2ac214610951576102bd565b80638da5cb5b116101135780638da5cb5b1461077d57806395d89b41146107a85780639852595c146107d35780639c3e72bd14610810578063a22cb4651461083b578063b09904b514610864576102bd565b80637ff9b596146106aa5780638462151c146106d5578063853828b6146107125780638b83209b146107295780638d086da414610766576102bd565b806334918dfd116101e85780636352211e116101ac5780636352211e1461059a5780636a61e5fc146105d75780636c0360eb1461060057806370a082311461062b578063715018a6146106685780637f27405e1461067f576102bd565b806334918dfd146104c95780633a98ef39146104e057806342842e0e1461050b5780634f6ccce71461053457806355f804b314610571576102bd565b8063109695231161023a57806310969523146103bb57806312065fe0146103e457806318160ddd1461040f578063191655871461043a57806323b872dd146104635780632f745c591461048c576102bd565b806301ffc9a7146102c257806306fdde03146102ff578063081812fc1461032a578063095ea7b31461036757806309aa3dcf14610390576102bd565b366102bd577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be7706102a4610ab2565b346040516102b39291906149d3565b60405180910390a1005b600080fd5b3480156102ce57600080fd5b506102e960048036038101906102e49190613b5b565b610aba565b6040516102f69190614a1e565b60405180910390f35b34801561030b57600080fd5b50610314610b21565b6040516103219190614a39565b60405180910390f35b34801561033657600080fd5b50610351600480360381019061034c9190613bee565b610bc3565b60405161035e919061496c565b60405180910390f35b34801561037357600080fd5b5061038e60048036038101906103899190613b1f565b610c48565b005b34801561039c57600080fd5b506103a5610d60565b6040516103b29190614e5d565b60405180910390f35b3480156103c757600080fd5b506103e260048036038101906103dd9190613bad565b610d65565b005b3480156103f057600080fd5b506103f9610dfb565b6040516104069190614e5d565b60405180910390f35b34801561041b57600080fd5b50610424610e85565b6040516104319190614e5d565b60405180910390f35b34801561044657600080fd5b50610461600480360381019061045c91906139b4565b610e96565b005b34801561046f57600080fd5b5061048a60048036038101906104859190613a19565b6110cf565b005b34801561049857600080fd5b506104b360048036038101906104ae9190613b1f565b61112f565b6040516104c09190614e5d565b60405180910390f35b3480156104d557600080fd5b506104de61118a565b005b3480156104ec57600080fd5b506104f5611232565b6040516105029190614e5d565b60405180910390f35b34801561051757600080fd5b50610532600480360381019061052d9190613a19565b61123c565b005b34801561054057600080fd5b5061055b60048036038101906105569190613bee565b61125c565b6040516105689190614e5d565b60405180910390f35b34801561057d57600080fd5b5061059860048036038101906105939190613bad565b61127f565b005b3480156105a657600080fd5b506105c160048036038101906105bc9190613bee565b611307565b6040516105ce919061496c565b60405180910390f35b3480156105e357600080fd5b506105fe60048036038101906105f99190613bee565b61133e565b005b34801561060c57600080fd5b506106156113c4565b6040516106229190614a39565b60405180910390f35b34801561063757600080fd5b50610652600480360381019061064d919061398b565b611466565b60405161065f9190614e5d565b60405180910390f35b34801561067457600080fd5b5061067d611525565b005b34801561068b57600080fd5b50610694611662565b6040516106a19190614a1e565b60405180910390f35b3480156106b657600080fd5b506106bf611679565b6040516106cc9190614e5d565b60405180910390f35b3480156106e157600080fd5b506106fc60048036038101906106f7919061398b565b61167f565b60405161070991906149fc565b60405180910390f35b34801561071e57600080fd5b50610727611778565b005b34801561073557600080fd5b50610750600480360381019061074b9190613bee565b611843565b60405161075d919061496c565b60405180910390f35b34801561077257600080fd5b5061077b611884565b005b34801561078957600080fd5b50610792611966565b60405161079f919061496c565b60405180910390f35b3480156107b457600080fd5b506107bd611990565b6040516107ca9190614a39565b60405180910390f35b3480156107df57600080fd5b506107fa60048036038101906107f5919061398b565b611a32565b6040516108079190614e5d565b60405180910390f35b34801561081c57600080fd5b50610825611a7b565b6040516108329190614a39565b60405180910390f35b34801561084757600080fd5b50610862600480360381019061085d9190613ae3565b611b19565b005b34801561087057600080fd5b5061088b60048036038101906108869190613bad565b611c9a565b005b34801561089957600080fd5b506108b460048036038101906108af9190613a68565b611d86565b005b3480156108c257600080fd5b506108cb611de8565b005b3480156108d957600080fd5b506108e2611eb9565b6040516108ef9190614a39565b60405180910390f35b610912600480360381019061090d9190613bee565b611f57565b005b34801561092057600080fd5b5061093b60048036038101906109369190613bee565b6120f0565b6040516109489190614a39565b60405180910390f35b34801561095d57600080fd5b506109786004803603810190610973919061398b565b612273565b6040516109859190614e5d565b60405180910390f35b34801561099a57600080fd5b506109b560048036038101906109b09190613bee565b6122bc565b6040516109c29190614a39565b60405180910390f35b3480156109d757600080fd5b506109e06123a9565b6040516109ed9190614e5d565b60405180910390f35b348015610a0257600080fd5b50610a1d6004803603810190610a1891906139dd565b6123b3565b604051610a2a9190614a1e565b60405180910390f35b348015610a3f57600080fd5b50610a48612447565b604051610a559190614a1e565b60405180910390f35b348015610a6a57600080fd5b50610a856004803603810190610a80919061398b565b61245a565b005b348015610a9357600080fd5b50610a9c612606565b604051610aa99190614e5d565b60405180910390f35b600033905090565b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060068054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610bb95780601f10610b8e57610100808354040283529160200191610bb9565b820191906000526020600020905b815481529060010190602001808311610b9c57829003601f168201915b5050505050905090565b6000610bce8261260c565b610c0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0490614d5d565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c5382611307565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610cc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbb90614ddd565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ce3610ab2565b73ffffffffffffffffffffffffffffffffffffffff161480610d125750610d1181610d0c610ab2565b6123b3565b5b610d51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4890614c9d565b60405180910390fd5b610d5b8383612629565b505050565b600581565b610d6d610ab2565b73ffffffffffffffffffffffffffffffffffffffff16610d8b611966565b73ffffffffffffffffffffffffffffffffffffffff1614610de1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd890614d7d565b60405180910390fd5b8060149080519060200190610df7929190613792565b5050565b6000610e05610ab2565b73ffffffffffffffffffffffffffffffffffffffff16610e23611966565b73ffffffffffffffffffffffffffffffffffffffff1614610e79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7090614d7d565b60405180910390fd5b60004790508091505090565b6000610e9160026126e2565b905090565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411610f18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0f90614b7d565b60405180910390fd5b6000600b54470190506000600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600a54600c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054840281610faf57fe5b040390506000811415610ff7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fee90614c7d565b60405180910390fd5b80600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205401600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600b5401600b8190555061109183826126f7565b7fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b05683826040516110c29291906149d3565b60405180910390a1505050565b6110e06110da610ab2565b826127eb565b61111f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111690614e1d565b60405180910390fd5b61112a8383836128c9565b505050565b600061118282600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612ae090919063ffffffff16565b905092915050565b611192610ab2565b73ffffffffffffffffffffffffffffffffffffffff166111b0611966565b73ffffffffffffffffffffffffffffffffffffffff1614611206576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111fd90614d7d565b60405180910390fd5b601160009054906101000a900460ff1615601160006101000a81548160ff021916908315150217905550565b6000600a54905090565b61125783838360405180602001604052806000815250611d86565b505050565b600080611273836002612afa90919063ffffffff16565b50905080915050919050565b611287610ab2565b73ffffffffffffffffffffffffffffffffffffffff166112a5611966565b73ffffffffffffffffffffffffffffffffffffffff16146112fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f290614d7d565b60405180910390fd5b61130481612b26565b50565b60006113378260405180606001604052806029815260200161515c602991396002612b409092919063ffffffff16565b9050919050565b611346610ab2565b73ffffffffffffffffffffffffffffffffffffffff16611364611966565b73ffffffffffffffffffffffffffffffffffffffff16146113ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b190614d7d565b60405180910390fd5b8060108190555050565b606060098054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561145c5780601f106114315761010080835404028352916020019161145c565b820191906000526020600020905b81548152906001019060200180831161143f57829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ce90614cbd565b60405180910390fd5b61151e600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612b5f565b9050919050565b61152d610ab2565b73ffffffffffffffffffffffffffffffffffffffff1661154b611966565b73ffffffffffffffffffffffffffffffffffffffff16146115a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159890614d7d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000601160009054906101000a900460ff16905090565b60105481565b6060600061168c83611466565b905060008114156116e757600067ffffffffffffffff811180156116af57600080fd5b506040519080825280602002602001820160405280156116de5781602001602082028036833780820191505090505b50915050611773565b60008167ffffffffffffffff8111801561170057600080fd5b5060405190808252806020026020018201604052801561172f5781602001602082028036833780820191505090505b50905060005b8281101561176c57611747858261112f565b82828151811061175357fe5b6020026020010181815250508080600101915050611735565b8193505050505b919050565b611780610ab2565b73ffffffffffffffffffffffffffffffffffffffff1661179e611966565b73ffffffffffffffffffffffffffffffffffffffff16146117f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117eb90614d7d565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561183f573d6000803e3d6000fd5b5050565b6000600e828154811061185257fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b61188c610ab2565b73ffffffffffffffffffffffffffffffffffffffff166118aa611966565b73ffffffffffffffffffffffffffffffffffffffff1614611900576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f790614d7d565b60405180910390fd5b60005b6012805490508110156119635760006012828154811061191f57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905061195581610e96565b508080600101915050611903565b50565b6000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060078054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611a285780601f106119fd57610100808354040283529160200191611a28565b820191906000526020600020905b815481529060010190602001808311611a0b57829003601f168201915b5050505050905090565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60158054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611b115780601f10611ae657610100808354040283529160200191611b11565b820191906000526020600020905b815481529060010190602001808311611af457829003601f168201915b505050505081565b611b21610ab2565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8690614bbd565b60405180910390fd5b8060056000611b9c610ab2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611c49610ab2565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611c8e9190614a1e565b60405180910390a35050565b611ca2610ab2565b73ffffffffffffffffffffffffffffffffffffffff16611cc0611966565b73ffffffffffffffffffffffffffffffffffffffff1614611d16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0d90614d7d565b60405180910390fd5b60001515601660009054906101000a900460ff16151514611d6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6390614cdd565b60405180910390fd5b8060159080519060200190611d82929190613792565b5050565b611d97611d91610ab2565b836127eb565b611dd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dcd90614e1d565b60405180910390fd5b611de284848484612b74565b50505050565b611df0610ab2565b73ffffffffffffffffffffffffffffffffffffffff16611e0e611966565b73ffffffffffffffffffffffffffffffffffffffff1614611e64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5b90614d7d565b60405180910390fd5b6001601660006101000a81548160ff0219169083151502179055507f92423ccd40e13759d50d24569dcbaccb20ade47247f3cf3e3951a9f29d2048b06015604051611eaf9190614a5b565b60405180910390a1565b60148054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611f4f5780601f10611f2457610100808354040283529160200191611f4f565b820191906000526020600020905b815481529060010190602001808311611f3257829003601f168201915b505050505081565b601160009054906101000a900460ff16611fa6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9d90614b3d565b60405180910390fd5b600081118015611fb7575060058111155b611ff6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fed90614dfd565b60405180910390fd5b61040061201382612005610e85565b612bd090919063ffffffff16565b1115612054576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204b90614b5d565b60405180910390fd5b61206981601054612c2590919063ffffffff16565b3410156120ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a290614bdd565b60405180910390fd5b60005b818110156120ec5760006120c0610e85565b90506104006120cd610e85565b10156120de576120dd3382612c95565b5b5080806001019150506120ae565b5050565b60606120fb8261260c565b61213a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213190614dbd565b60405180910390fd5b6000600860008481526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156121e35780601f106121b8576101008083540402835291602001916121e3565b820191906000526020600020905b8154815290600101906020018083116121c657829003601f168201915b5050505050905060006121f46113c4565b905060008151141561220a57819250505061226e565b60008251111561223f578082604051602001612227929190614933565b6040516020818303038152906040529250505061226e565b8061224985612cb3565b60405160200161225a929190614933565b604051602081830303815290604052925050505b919050565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60606122c6610e85565b8210612307576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122fe90614a9d565b60405180910390fd5b60158054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561239d5780601f106123725761010080835404028352916020019161239d565b820191906000526020600020905b81548152906001019060200180831161238057829003601f168201915b50505050509050919050565b6000600b54905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b601160009054906101000a900460ff1681565b612462610ab2565b73ffffffffffffffffffffffffffffffffffffffff16612480611966565b73ffffffffffffffffffffffffffffffffffffffff16146124d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124cd90614d7d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612546576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253d90614add565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61040081565b6000612622826002612dfa90919063ffffffff16565b9050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661269c83611307565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006126f082600001612e14565b9050919050565b8047101561273a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161273190614c1d565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff168260405161276090614957565b60006040518083038185875af1925050503d806000811461279d576040519150601f19603f3d011682016040523d82523d6000602084013e6127a2565b606091505b50509050806127e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127dd90614bfd565b60405180910390fd5b505050565b60006127f68261260c565b612835576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161282c90614c5d565b60405180910390fd5b600061284083611307565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806128af57508373ffffffffffffffffffffffffffffffffffffffff1661289784610bc3565b73ffffffffffffffffffffffffffffffffffffffff16145b806128c057506128bf81856123b3565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166128e982611307565b73ffffffffffffffffffffffffffffffffffffffff161461293f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161293690614d9d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156129af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129a690614b9d565b60405180910390fd5b6129ba838383612e25565b6129c5600082612629565b612a1681600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612e2a90919063ffffffff16565b50612a6881600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612e4490919063ffffffff16565b50612a7f81836002612e5e9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000612aef8360000183612e93565b60001c905092915050565b600080600080612b0d8660000186612f00565b915091508160001c8160001c9350935050509250929050565b8060099080519060200190612b3c929190613792565b5050565b6000612b53846000018460001b84612f83565b60001c90509392505050565b6000612b6d82600001613014565b9050919050565b612b7f8484846128c9565b612b8b84848484613025565b612bca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bc190614abd565b60405180910390fd5b50505050565b600080828401905083811015612c1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c1290614b1d565b60405180910390fd5b8091505092915050565b600080831415612c385760009050612c8f565b6000828402905082848281612c4957fe5b0414612c8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c8190614d3d565b60405180910390fd5b809150505b92915050565b612caf828260405180602001604052806000815250613189565b5050565b60606000821415612cfb576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612df5565b600082905060005b60008214612d25578080600101915050600a8281612d1d57fe5b049150612d03565b60008167ffffffffffffffff81118015612d3e57600080fd5b506040519080825280601f01601f191660200182016040528015612d715781602001600182028036833780820191505090505b50905060006001830390508593505b60008414612ded57600a8481612d9257fe5b0660300160f81b82828060019003935081518110612dac57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8481612de557fe5b049350612d80565b819450505050505b919050565b6000612e0c836000018360001b6131e4565b905092915050565b600081600001805490509050919050565b505050565b6000612e3c836000018360001b613207565b905092915050565b6000612e56836000018360001b6132ef565b905092915050565b6000612e8a846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b61335f565b90509392505050565b600081836000018054905011612ede576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ed590614a7d565b60405180910390fd5b826000018281548110612eed57fe5b9060005260206000200154905092915050565b60008082846000018054905011612f4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f4390614cfd565b60405180910390fd5b6000846000018481548110612f5d57fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b60008084600101600085815260200190815260200160002054905060008114158390612fe5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fdc9190614a39565b60405180910390fd5b50846000016001820381548110612ff857fe5b9060005260206000209060020201600101549150509392505050565b600081600001805490509050919050565b60006130468473ffffffffffffffffffffffffffffffffffffffff1661343b565b6130535760019050613181565b600061311a63150b7a0260e01b613068610ab2565b88878760405160240161307e9493929190614987565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405180606001604052806032815260200161512a603291398773ffffffffffffffffffffffffffffffffffffffff1661344e9092919063ffffffff16565b90506000818060200190518101906131329190613b84565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614925050505b949350505050565b6131938383613466565b6131a06000848484613025565b6131df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131d690614abd565b60405180910390fd5b505050565b600080836001016000848152602001908152602001600020541415905092915050565b600080836001016000848152602001908152602001600020549050600081146132e3576000600182039050600060018660000180549050039050600086600001828154811061325257fe5b906000526020600020015490508087600001848154811061326f57fe5b90600052602060002001819055506001830187600101600083815260200190815260200160002081905550866000018054806132a757fe5b600190038181906000526020600020016000905590558660010160008781526020019081526020016000206000905560019450505050506132e9565b60009150505b92915050565b60006132fb83836135f4565b613354578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050613359565b600090505b92915050565b600080846001016000858152602001908152602001600020549050600081141561340657846000016040518060400160405280868152602001858152509080600181540180825580915050600190039060005260206000209060020201600090919091909150600082015181600001556020820151816001015550508460000180549050856001016000868152602001908152602001600020819055506001915050613434565b8285600001600183038154811061341957fe5b90600052602060002090600202016001018190555060009150505b9392505050565b600080823b905060008111915050919050565b606061345d8484600085613617565b90509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156134d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134cd90614d1d565b60405180910390fd5b6134df8161260c565b1561351f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161351690614afd565b60405180910390fd5b61352b60008383612e25565b61357c81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612e4490919063ffffffff16565b5061359381836002612e5e9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080836001016000848152602001908152602001600020541415905092915050565b60608247101561365c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161365390614c3d565b60405180910390fd5b6136658561343b565b6136a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161369b90614e3d565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516136cd919061491c565b60006040518083038185875af1925050503d806000811461370a576040519150601f19603f3d011682016040523d82523d6000602084013e61370f565b606091505b509150915061371f82828661372b565b92505050949350505050565b6060831561373b5782905061378b565b60008351111561374e5782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137829190614a39565b60405180910390fd5b9392505050565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826137c8576000855561380f565b82601f106137e157805160ff191683800117855561380f565b8280016001018555821561380f579182015b8281111561380e5782518255916020019190600101906137f3565b5b50905061381c9190613820565b5090565b5b80821115613839576000816000905550600101613821565b5090565b600061385061384b84614ea9565b614e78565b90508281526020810184848401111561386857600080fd5b613873848285615061565b509392505050565b600061388e61388984614ed9565b614e78565b9050828152602081018484840111156138a657600080fd5b6138b1848285615061565b509392505050565b6000813590506138c8816150b6565b92915050565b6000813590506138dd816150cd565b92915050565b6000813590506138f2816150e4565b92915050565b600081359050613907816150fb565b92915050565b60008151905061391c816150fb565b92915050565b600082601f83011261393357600080fd5b813561394384826020860161383d565b91505092915050565b600082601f83011261395d57600080fd5b813561396d84826020860161387b565b91505092915050565b60008135905061398581615112565b92915050565b60006020828403121561399d57600080fd5b60006139ab848285016138b9565b91505092915050565b6000602082840312156139c657600080fd5b60006139d4848285016138ce565b91505092915050565b600080604083850312156139f057600080fd5b60006139fe858286016138b9565b9250506020613a0f858286016138b9565b9150509250929050565b600080600060608486031215613a2e57600080fd5b6000613a3c868287016138b9565b9350506020613a4d868287016138b9565b9250506040613a5e86828701613976565b9150509250925092565b60008060008060808587031215613a7e57600080fd5b6000613a8c878288016138b9565b9450506020613a9d878288016138b9565b9350506040613aae87828801613976565b925050606085013567ffffffffffffffff811115613acb57600080fd5b613ad787828801613922565b91505092959194509250565b60008060408385031215613af657600080fd5b6000613b04858286016138b9565b9250506020613b15858286016138e3565b9150509250929050565b60008060408385031215613b3257600080fd5b6000613b40858286016138b9565b9250506020613b5185828601613976565b9150509250929050565b600060208284031215613b6d57600080fd5b6000613b7b848285016138f8565b91505092915050565b600060208284031215613b9657600080fd5b6000613ba48482850161390d565b91505092915050565b600060208284031215613bbf57600080fd5b600082013567ffffffffffffffff811115613bd957600080fd5b613be58482850161394c565b91505092915050565b600060208284031215613c0057600080fd5b6000613c0e84828501613976565b91505092915050565b6000613c2383836148fe565b60208301905092915050565b613c388161502b565b82525050565b613c4781614fb7565b82525050565b613c5681614fa5565b82525050565b6000613c6782614f2e565b613c718185614f5c565b9350613c7c83614f09565b8060005b83811015613cad578151613c948882613c17565b9750613c9f83614f4f565b925050600181019050613c80565b5085935050505092915050565b613cc381614fc9565b82525050565b6000613cd482614f39565b613cde8185614f6d565b9350613cee818560208601615070565b613cf7816150a5565b840191505092915050565b6000613d0d82614f39565b613d178185614f7e565b9350613d27818560208601615070565b80840191505092915050565b6000613d3e82614f44565b613d488185614f89565b9350613d58818560208601615070565b613d61816150a5565b840191505092915050565b6000613d7782614f44565b613d818185614f9a565b9350613d91818560208601615070565b80840191505092915050565b600081546001811660008114613dba5760018114613de057613e24565b607f6002830416613dcb8187614f89565b955060ff198316865260208601935050613e24565b60028204613dee8187614f89565b9550613df985614f19565b60005b82811015613e1b57815481890152600182019150602081019050613dfc565b80880195505050505b505092915050565b6000613e39602283614f89565b91507f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613e9f601b83614f89565b91507f43686f6f7365206120746f6b656e2077697468696e2072616e676500000000006000830152602082019050919050565b6000613edf603283614f89565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000613f45602683614f89565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613fab601c83614f89565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613feb601b83614f89565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b600061402b602183614f89565b91507f53616c65206d7573742062652061637469766520746f206d696e7420546f6b6560008301527f6e000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614091602a83614f89565b91507f507572636861736520776f756c6420657863656564206d617820737570706c7960008301527f206f6620546f6b656e73000000000000000000000000000000000000000000006020830152604082019050919050565b60006140f7602683614f89565b91507f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060008301527f73686172657300000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061415d602483614f89565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006141c3601983614f89565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000614203601f83614f89565b91507f45746865722076616c75652073656e74206973206e6f7420636f7272656374006000830152602082019050919050565b6000614243603a83614f89565b91507f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008301527f6563697069656e74206d617920686176652072657665727465640000000000006020830152604082019050919050565b60006142a9601d83614f89565b91507f416464726573733a20696e73756666696369656e742062616c616e63650000006000830152602082019050919050565b60006142e9602683614f89565b91507f416464726573733a20696e73756666696369656e742062616c616e636520666f60008301527f722063616c6c00000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061434f602c83614f89565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006143b5602b83614f89565b91507f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060008301527f647565207061796d656e740000000000000000000000000000000000000000006020830152604082019050919050565b600061441b603883614f89565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000614481602a83614f89565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006144e7601d83614f89565b91507f546865206c6963656e736520697320616c7265616479206c6f636b65640000006000830152602082019050919050565b6000614527602283614f89565b91507f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061458d602083614f89565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b60006145cd602183614f89565b91507f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008301527f77000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614633602c83614f89565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000614699602083614f89565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006146d9602983614f89565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061473f602f83614f89565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b60006147a5602183614f89565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061480b600083614f7e565b9150600082019050919050565b6000614825602083614f89565b91507f43616e206f6e6c79206d696e74203320746f6b656e7320617420612074696d656000830152602082019050919050565b6000614865603183614f89565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b60006148cb601d83614f89565b91507f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006000830152602082019050919050565b61490781615021565b82525050565b61491681615021565b82525050565b60006149288284613d02565b915081905092915050565b600061493f8285613d6c565b915061494b8284613d6c565b91508190509392505050565b6000614962826147fe565b9150819050919050565b60006020820190506149816000830184613c4d565b92915050565b600060808201905061499c6000830187613c3e565b6149a96020830186613c4d565b6149b6604083018561490d565b81810360608301526149c88184613cc9565b905095945050505050565b60006040820190506149e86000830185613c2f565b6149f5602083018461490d565b9392505050565b60006020820190508181036000830152614a168184613c5c565b905092915050565b6000602082019050614a336000830184613cba565b92915050565b60006020820190508181036000830152614a538184613d33565b905092915050565b60006020820190508181036000830152614a758184613d9d565b905092915050565b60006020820190508181036000830152614a9681613e2c565b9050919050565b60006020820190508181036000830152614ab681613e92565b9050919050565b60006020820190508181036000830152614ad681613ed2565b9050919050565b60006020820190508181036000830152614af681613f38565b9050919050565b60006020820190508181036000830152614b1681613f9e565b9050919050565b60006020820190508181036000830152614b3681613fde565b9050919050565b60006020820190508181036000830152614b568161401e565b9050919050565b60006020820190508181036000830152614b7681614084565b9050919050565b60006020820190508181036000830152614b96816140ea565b9050919050565b60006020820190508181036000830152614bb681614150565b9050919050565b60006020820190508181036000830152614bd6816141b6565b9050919050565b60006020820190508181036000830152614bf6816141f6565b9050919050565b60006020820190508181036000830152614c1681614236565b9050919050565b60006020820190508181036000830152614c368161429c565b9050919050565b60006020820190508181036000830152614c56816142dc565b9050919050565b60006020820190508181036000830152614c7681614342565b9050919050565b60006020820190508181036000830152614c96816143a8565b9050919050565b60006020820190508181036000830152614cb68161440e565b9050919050565b60006020820190508181036000830152614cd681614474565b9050919050565b60006020820190508181036000830152614cf6816144da565b9050919050565b60006020820190508181036000830152614d168161451a565b9050919050565b60006020820190508181036000830152614d3681614580565b9050919050565b60006020820190508181036000830152614d56816145c0565b9050919050565b60006020820190508181036000830152614d7681614626565b9050919050565b60006020820190508181036000830152614d968161468c565b9050919050565b60006020820190508181036000830152614db6816146cc565b9050919050565b60006020820190508181036000830152614dd681614732565b9050919050565b60006020820190508181036000830152614df681614798565b9050919050565b60006020820190508181036000830152614e1681614818565b9050919050565b60006020820190508181036000830152614e3681614858565b9050919050565b60006020820190508181036000830152614e56816148be565b9050919050565b6000602082019050614e72600083018461490d565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614e9f57614e9e6150a3565b5b8060405250919050565b600067ffffffffffffffff821115614ec457614ec36150a3565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614ef457614ef36150a3565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614fb082615001565b9050919050565b6000614fc282615001565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006150368261503d565b9050919050565b60006150488261504f565b9050919050565b600061505a82615001565b9050919050565b82818337600083830152505050565b60005b8381101561508e578082015181840152602081019050615073565b8381111561509d576000848401525b50505050565bfe5b6000601f19601f8301169050919050565b6150bf81614fa5565b81146150ca57600080fd5b50565b6150d681614fb7565b81146150e157600080fd5b50565b6150ed81614fc9565b81146150f857600080fd5b50565b61510481614fd5565b811461510f57600080fd5b50565b61511b81615021565b811461512657600080fd5b5056fe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea264697066735822122097c8555ed19253f517cd0c1cac3b7010201e253ab045673e56490560afb682a264736f6c63430007060033
Deployed Bytecode Sourcemap
72404:4161:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21232:40;21248:12;:10;:12::i;:::-;21262:9;21232:40;;;;;;;:::i;:::-;;;;;;;;72404:4161;;;;;10288:150;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56774:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59560:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59090:404;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72530:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73872:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75298:138;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58568:211;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22438:611;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60450:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58330:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73490:89;;;;;;;;;;;;;:::i;:::-;;21363:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60826:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58856:172;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74006:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56530:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73766:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58149:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56247:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71476:148;;;;;;;;;;;;;:::i;:::-;;73623:89;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72646:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74117:540;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75444:134;;;;;;;;;;;;;:::i;:::-;;22138:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75643:215;;;;;;;;;;;;;:::i;:::-;;70825:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56943:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21938:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73112:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59853:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74922:181;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61048:285;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75165:125;;;;;;;;;;;;;:::i;:::-;;73015:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75870:686;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57118:792;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21734:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74708:175;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21548:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60219:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72711:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71779:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72578:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;729:106;782:15;817:10;810:17;;729:106;:::o;10288:150::-;10373:4;10397:20;:33;10418:11;10397:33;;;;;;;;;;;;;;;;;;;;;;;;;;;10390:40;;10288:150;;;:::o;56774:100::-;56828:13;56861:5;56854:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56774:100;:::o;59560:221::-;59636:7;59664:16;59672:7;59664;:16::i;:::-;59656:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;59749:15;:24;59765:7;59749:24;;;;;;;;;;;;;;;;;;;;;59742:31;;59560:221;;;:::o;59090:404::-;59171:13;59187:23;59202:7;59187:14;:23::i;:::-;59171:39;;59235:5;59229:11;;:2;:11;;;;59221:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;59315:5;59299:21;;:12;:10;:12::i;:::-;:21;;;:69;;;;59324:44;59348:5;59355:12;:10;:12::i;:::-;59324:23;:44::i;:::-;59299:69;59291:161;;;;;;;;;;;;:::i;:::-;;;;;;;;;59465:21;59474:2;59478:7;59465:8;:21::i;:::-;59090:404;;;:::o;72530:41::-;72570:1;72530:41;:::o;73872:126::-;71056:12;:10;:12::i;:::-;71045:23;;:7;:5;:7::i;:::-;:23;;;71037:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;73976:14:::1;73957:16;:33;;;;;;;;;;;;:::i;:::-;;73872:126:::0;:::o;75298:138::-;75351:4;71056:12;:10;:12::i;:::-;71045:23;;:7;:5;:7::i;:::-;:23;;;71037:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;75367:12:::1;75382:21;75367:36;;75421:7;75414:14;;;75298:138:::0;:::o;58568:211::-;58629:7;58750:21;:12;:19;:21::i;:::-;58743:28;;58568:211;:::o;22438:611::-;22533:1;22514:7;:16;22522:7;22514:16;;;;;;;;;;;;;;;;:20;22506:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;22590:21;22638:14;;22614:21;:38;22590:62;;22663:15;22731:9;:18;22741:7;22731:18;;;;;;;;;;;;;;;;22716:12;;22697:7;:16;22705:7;22697:16;;;;;;;;;;;;;;;;22681:13;:32;:47;;;;;;:68;22663:86;;22781:1;22770:7;:12;;22762:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;22885:7;22864:9;:18;22874:7;22864:18;;;;;;;;;;;;;;;;:28;22843:9;:18;22853:7;22843:18;;;;;;;;;;;;;;;:49;;;;22937:7;22920:14;;:24;22903:14;:41;;;;22957:35;22975:7;22984;22957:17;:35::i;:::-;23008:33;23024:7;23033;23008:33;;;;;;;:::i;:::-;;;;;;;;22438:611;;;:::o;60450:305::-;60611:41;60630:12;:10;:12::i;:::-;60644:7;60611:18;:41::i;:::-;60603:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;60719:28;60729:4;60735:2;60739:7;60719:9;:28::i;:::-;60450:305;;;:::o;58330:162::-;58427:7;58454:30;58478:5;58454:13;:20;58468:5;58454:20;;;;;;;;;;;;;;;:23;;:30;;;;:::i;:::-;58447:37;;58330:162;;;;:::o;73490:89::-;71056:12;:10;:12::i;:::-;71045:23;;:7;:5;:7::i;:::-;:23;;;71037:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;73559:12:::1;;;;;;;;;;;73558:13;73543:12;;:28;;;;;;;;;;;;;;;;;;73490:89::o:0;21363:91::-;21407:7;21434:12;;21427:19;;21363:91;:::o;60826:151::-;60930:39;60947:4;60953:2;60957:7;60930:39;;;;;;;;;;;;:16;:39::i;:::-;60826:151;;;:::o;58856:172::-;58931:7;58952:15;58973:22;58989:5;58973:12;:15;;:22;;;;:::i;:::-;58951:44;;;59013:7;59006:14;;;58856:172;;;:::o;74006:99::-;71056:12;:10;:12::i;:::-;71045:23;;:7;:5;:7::i;:::-;:23;;;71037:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;74077:20:::1;74089:7;74077:11;:20::i;:::-;74006:99:::0;:::o;56530:177::-;56602:7;56629:70;56646:7;56629:70;;;;;;;;;;;;;;;;;:12;:16;;:70;;;;;:::i;:::-;56622:77;;56530:177;;;:::o;73766:98::-;71056:12;:10;:12::i;:::-;71045:23;;:7;:5;:7::i;:::-;:23;;;71037:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;73848:8:::1;73835:10;:21;;;;73766:98:::0;:::o;58149:97::-;58197:13;58230:8;58223:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58149:97;:::o;56247:221::-;56319:7;56364:1;56347:19;;:5;:19;;;;56339:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;56431:29;:13;:20;56445:5;56431:20;;;;;;;;;;;;;;;:27;:29::i;:::-;56424:36;;56247:221;;;:::o;71476:148::-;71056:12;:10;:12::i;:::-;71045:23;;:7;:5;:7::i;:::-;:23;;;71037:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;71583:1:::1;71546:40;;71567:6;;;;;;;;;;;71546:40;;;;;;;;;;;;71614:1;71597:6;;:19;;;;;;;;;;;;;;;;;;71476:148::o:0;73623:89::-;73669:4;73692:12;;;;;;;;;;;73685:19;;73623:89;:::o;72646:45::-;;;;:::o;74117:540::-;74178:16;74208:18;74229:17;74239:6;74229:9;:17::i;:::-;74208:38;;74275:1;74261:10;:15;74257:393;;;74352:1;74338:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74331:23;;;;;74257:393;74387:23;74427:10;74413:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74387:51;;74453:13;74481:130;74505:10;74497:5;:18;74481:130;;;74561:34;74581:6;74589:5;74561:19;:34::i;:::-;74545:6;74552:5;74545:13;;;;;;;;;;;;;:50;;;;;74517:7;;;;;;;74481:130;;;74632:6;74625:13;;;;;74117:540;;;;:::o;75444:134::-;71056:12;:10;:12::i;:::-;71045:23;;:7;:5;:7::i;:::-;:23;;;71037:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;75495:12:::1;75510:21;75495:36;;75542:10;:19;;:28;75562:7;75542:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;71116:1;75444:134::o:0;22138:100::-;22189:7;22216;22224:5;22216:14;;;;;;;;;;;;;;;;;;;;;;;;;22209:21;;22138:100;;;:::o;75643:215::-;71056:12;:10;:12::i;:::-;71045:23;;:7;:5;:7::i;:::-;:23;;;71037:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;75702:9:::1;75697:154;75721:11;:18;;;;75717:1;:22;75697:154;;;75761:22;75794:11;75806:1;75794:14;;;;;;;;;;;;;;;;;;;;;;;;;75761:48;;75824:15;75832:6;75824:7;:15::i;:::-;75697:154;75741:3;;;;;;;75697:154;;;;75643:215::o:0;70825:87::-;70871:7;70898:6;;;;;;;;;;;70891:13;;70825:87;:::o;56943:104::-;56999:13;57032:7;57025:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56943:104;:::o;21938:109::-;21994:7;22021:9;:18;22031:7;22021:18;;;;;;;;;;;;;;;;22014:25;;21938:109;;;:::o;73112:31::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;59853:295::-;59968:12;:10;:12::i;:::-;59956:24;;:8;:24;;;;59948:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;60068:8;60023:18;:32;60042:12;:10;:12::i;:::-;60023:32;;;;;;;;;;;;;;;:42;60056:8;60023:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;60121:8;60092:48;;60107:12;:10;:12::i;:::-;60092:48;;;60131:8;60092:48;;;;;;:::i;:::-;;;;;;;;59853:295;;:::o;74922:181::-;71056:12;:10;:12::i;:::-;71045:23;;:7;:5;:7::i;:::-;:23;;;71037:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;75022:5:::1;75005:22;;:13;;;;;;;;;;;:22;;;74997:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;75087:8;75072:12;:23;;;;;;;;;;;;:::i;:::-;;74922:181:::0;:::o;61048:285::-;61180:41;61199:12;:10;:12::i;:::-;61213:7;61180:18;:41::i;:::-;61172:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;61286:39;61300:4;61306:2;61310:7;61319:5;61286:13;:39::i;:::-;61048:285;;;;:::o;75165:125::-;71056:12;:10;:12::i;:::-;71045:23;;:7;:5;:7::i;:::-;:23;;;71037:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;75233:4:::1;75216:13;;:21;;;;;;;;;;;;;;;;;;75253:29;75269:12;75253:29;;;;;;:::i;:::-;;;;;;;;75165:125::o:0;73015:35::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;75870:686::-;75944:12;;;;;;;;;;;75936:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;76030:1;76013:14;:18;:56;;;;;72570:1;76035:14;:34;;76013:56;76005:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;72615:4;76125:33;76143:14;76125:13;:11;:13::i;:::-;:17;;:33;;;;:::i;:::-;:47;;76117:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;76251:30;76266:14;76251:10;;:14;;:30;;;;:::i;:::-;76238:9;:43;;76230:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;76342:6;76338:211;76358:14;76354:1;:18;76338:211;;;76394:14;76411:13;:11;:13::i;:::-;76394:30;;72615:4;76443:13;:11;:13::i;:::-;:26;76439:99;;;76490:32;76500:10;76512:9;76490;:32::i;:::-;76439:99;76338:211;76374:3;;;;;;;76338:211;;;;75870:686;:::o;57118:792::-;57191:13;57225:16;57233:7;57225;:16::i;:::-;57217:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;57306:23;57332:10;:19;57343:7;57332:19;;;;;;;;;;;57306:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57362:18;57383:9;:7;:9::i;:::-;57362:30;;57490:1;57474:4;57468:18;:23;57464:72;;;57515:9;57508:16;;;;;;57464:72;57666:1;57646:9;57640:23;:27;57636:108;;;57715:4;57721:9;57698:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57684:48;;;;;;57636:108;57876:4;57882:18;:7;:16;:18::i;:::-;57859:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57845:57;;;;57118:792;;;;:::o;21734:105::-;21788:7;21815;:16;21823:7;21815:16;;;;;;;;;;;;;;;;21808:23;;21734:105;;;:::o;74708:175::-;74760:13;74800;:11;:13::i;:::-;74794:3;:19;74786:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;74863:12;74856:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74708:175;;;:::o;21548:95::-;21594:7;21621:14;;21614:21;;21548:95;:::o;60219:164::-;60316:4;60340:18;:25;60359:5;60340:25;;;;;;;;;;;;;;;:35;60366:8;60340:35;;;;;;;;;;;;;;;;;;;;;;;;;60333:42;;60219:164;;;;:::o;72711:32::-;;;;;;;;;;;;;:::o;71779:244::-;71056:12;:10;:12::i;:::-;71045:23;;:7;:5;:7::i;:::-;:23;;;71037:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;71888:1:::1;71868:22;;:8;:22;;;;71860:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;71978:8;71949:38;;71970:6;;;;;;;;;;;71949:38;;;;;;;;;;;;72007:8;71998:6;;:17;;;;;;;;;;;;;;;;;;71779:244:::0;:::o;72578:41::-;72615:4;72578:41;:::o;62800:127::-;62865:4;62889:30;62911:7;62889:12;:21;;:30;;;;:::i;:::-;62882:37;;62800:127;;;:::o;68818:192::-;68920:2;68893:15;:24;68909:7;68893:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;68976:7;68972:2;68938:46;;68947:23;68962:7;68947:14;:23::i;:::-;68938:46;;;;;;;;;;;;68818:192;;:::o;49539:123::-;49608:7;49635:19;49643:3;:10;;49635:7;:19::i;:::-;49628:26;;49539:123;;;:::o;25856:397::-;25971:6;25946:21;:31;;25938:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26103:12;26121:9;:14;;26144:6;26121:35;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26102:54;;;26175:7;26167:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;25856:397;;;:::o;63094:355::-;63187:4;63212:16;63220:7;63212;:16::i;:::-;63204:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;63288:13;63304:23;63319:7;63304:14;:23::i;:::-;63288:39;;63357:5;63346:16;;:7;:16;;;:51;;;;63390:7;63366:31;;:20;63378:7;63366:11;:20::i;:::-;:31;;;63346:51;:94;;;;63401:39;63425:5;63432:7;63401:23;:39::i;:::-;63346:94;63338:103;;;63094:355;;;;:::o;66230:599::-;66355:4;66328:31;;:23;66343:7;66328:14;:23::i;:::-;:31;;;66320:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;66456:1;66442:16;;:2;:16;;;;66434:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;66512:39;66533:4;66539:2;66543:7;66512:20;:39::i;:::-;66616:29;66633:1;66637:7;66616:8;:29::i;:::-;66658:35;66685:7;66658:13;:19;66672:4;66658:19;;;;;;;;;;;;;;;:26;;:35;;;;:::i;:::-;;66704:30;66726:7;66704:13;:17;66718:2;66704:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;66747:29;66764:7;66773:2;66747:12;:16;;:29;;;;;:::i;:::-;;66813:7;66809:2;66794:27;;66803:4;66794:27;;;;;;;;;;;;66230:599;;;:::o;41330:137::-;41401:7;41436:22;41440:3;:10;;41452:5;41436:3;:22::i;:::-;41428:31;;41421:38;;41330:137;;;;:::o;50001:236::-;50081:7;50090;50111:11;50124:13;50141:22;50145:3;:10;;50157:5;50141:3;:22::i;:::-;50110:53;;;;50190:3;50182:12;;50220:5;50212:14;;50174:55;;;;;;50001:236;;;;;:::o;67430:100::-;67514:8;67503;:19;;;;;;;;;;;;:::i;:::-;;67430:100;:::o;51287:213::-;51394:7;51445:44;51450:3;:10;;51470:3;51462:12;;51476;51445:4;:44::i;:::-;51437:53;;51414:78;;51287:213;;;;;:::o;40872:114::-;40932:7;40959:19;40967:3;:10;;40959:7;:19::i;:::-;40952:26;;40872:114;;;:::o;62215:272::-;62329:28;62339:4;62345:2;62349:7;62329:9;:28::i;:::-;62376:48;62399:4;62405:2;62409:7;62418:5;62376:22;:48::i;:::-;62368:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;62215:272;;;;:::o;13850:179::-;13908:7;13928:9;13944:1;13940;:5;13928:17;;13969:1;13964;:6;;13956:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;14020:1;14013:8;;;13850:179;;;;:::o;14729:220::-;14787:7;14816:1;14811;:6;14807:20;;;14826:1;14819:8;;;;14807:20;14838:9;14854:1;14850;:5;14838:17;;14883:1;14878;14874;:5;;;;;;:10;14866:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;14940:1;14933:8;;;14729:220;;;;;:::o;63792:110::-;63868:26;63878:2;63882:7;63868:26;;;;;;;;;;;;:9;:26::i;:::-;63792:110;;:::o;51751:746::-;51807:13;52037:1;52028:5;:10;52024:53;;;52055:10;;;;;;;;;;;;;;;;;;;;;52024:53;52087:12;52102:5;52087:20;;52118:14;52143:78;52158:1;52150:4;:9;52143:78;;52176:8;;;;;;;52207:2;52199:10;;;;;;;;;52143:78;;;52231:19;52263:6;52253:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52231:39;;52281:13;52306:1;52297:6;:10;52281:26;;52325:5;52318:12;;52341:117;52356:1;52348:4;:9;52341:117;;52417:2;52410:4;:9;;;;;;52405:2;:14;52392:29;;52374:6;52381:7;;;;;;;52374:15;;;;;;;;;;;:47;;;;;;;;;;;52444:2;52436:10;;;;;;;;;52341:117;;;52482:6;52468:21;;;;;;51751:746;;;;:::o;49300:151::-;49384:4;49408:35;49418:3;:10;;49438:3;49430:12;;49408:9;:35::i;:::-;49401:42;;49300:151;;;;:::o;46118:110::-;46174:7;46201:3;:12;;:19;;;;46194:26;;46118:110;;;:::o;69623:93::-;;;;:::o;40417:137::-;40487:4;40511:35;40519:3;:10;;40539:5;40531:14;;40511:7;:35::i;:::-;40504:42;;40417:137;;;;:::o;40110:131::-;40177:4;40201:32;40206:3;:10;;40226:5;40218:14;;40201:4;:32::i;:::-;40194:39;;40110:131;;;;:::o;48723:185::-;48812:4;48836:64;48841:3;:10;;48861:3;48853:12;;48891:5;48875:23;;48867:32;;48836:4;:64::i;:::-;48829:71;;48723:185;;;;;:::o;36368:204::-;36435:7;36484:5;36463:3;:11;;:18;;;;:26;36455:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;36546:3;:11;;36558:5;36546:18;;;;;;;;;;;;;;;;36539:25;;36368:204;;;;:::o;46583:279::-;46650:7;46659;46709:5;46687:3;:12;;:19;;;;:27;46679:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;46766:22;46791:3;:12;;46804:5;46791:19;;;;;;;;;;;;;;;;;;46766:44;;46829:5;:10;;;46841:5;:12;;;46821:33;;;;;46583:279;;;;;:::o;48080:319::-;48174:7;48194:16;48213:3;:12;;:17;48226:3;48213:17;;;;;;;;;;;;48194:36;;48261:1;48249:8;:13;;48264:12;48241:36;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;48331:3;:12;;48355:1;48344:8;:12;48331:26;;;;;;;;;;;;;;;;;;:33;;;48324:40;;;48080:319;;;;;:::o;35915:109::-;35971:7;35998:3;:11;;:18;;;;35991:25;;35915:109;;;:::o;68095:604::-;68216:4;68243:15;:2;:13;;;:15::i;:::-;68238:60;;68282:4;68275:11;;;;68238:60;68308:23;68334:252;68387:45;;;68447:12;:10;:12::i;:::-;68474:4;68493:7;68515:5;68350:181;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68334:252;;;;;;;;;;;;;;;;;:2;:15;;;;:252;;;;;:::i;:::-;68308:278;;68597:13;68624:10;68613:32;;;;;;;;;;;;:::i;:::-;68597:48;;53251:10;68674:16;;68664:26;;;:6;:26;;;;68656:35;;;;68095:604;;;;;;;:::o;64129:250::-;64225:18;64231:2;64235:7;64225:5;:18::i;:::-;64262:54;64293:1;64297:2;64301:7;64310:5;64262:22;:54::i;:::-;64254:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;64129:250;;;:::o;45898:125::-;45969:4;46014:1;45993:3;:12;;:17;46006:3;45993:17;;;;;;;;;;;;:22;;45986:29;;45898:125;;;;:::o;34070:1544::-;34136:4;34254:18;34275:3;:12;;:19;34288:5;34275:19;;;;;;;;;;;;34254:40;;34325:1;34311:10;:15;34307:1300;;34673:21;34710:1;34697:10;:14;34673:38;;34726:17;34767:1;34746:3;:11;;:18;;;;:22;34726:42;;35013:17;35033:3;:11;;35045:9;35033:22;;;;;;;;;;;;;;;;35013:42;;35179:9;35150:3;:11;;35162:13;35150:26;;;;;;;;;;;;;;;:38;;;;35298:1;35282:13;:17;35256:3;:12;;:23;35269:9;35256:23;;;;;;;;;;;:43;;;;35408:3;:11;;:17;;;;;;;;;;;;;;;;;;;;;;;;35503:3;:12;;:19;35516:5;35503:19;;;;;;;;;;;35496:26;;;35546:4;35539:11;;;;;;;;34307:1300;35590:5;35583:12;;;34070:1544;;;;;:::o;33480:414::-;33543:4;33565:21;33575:3;33580:5;33565:9;:21::i;:::-;33560:327;;33603:3;:11;;33620:5;33603:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33786:3;:11;;:18;;;;33764:3;:12;;:19;33777:5;33764:19;;;;;;;;;;;:40;;;;33826:4;33819:11;;;;33560:327;33870:5;33863:12;;33480:414;;;;;:::o;43398:692::-;43474:4;43590:16;43609:3;:12;;:17;43622:3;43609:17;;;;;;;;;;;;43590:36;;43655:1;43643:8;:13;43639:444;;;43710:3;:12;;43728:38;;;;;;;;43745:3;43728:38;;;;43758:5;43728:38;;;43710:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43925:3;:12;;:19;;;;43905:3;:12;;:17;43918:3;43905:17;;;;;;;;;;;:39;;;;43966:4;43959:11;;;;;43639:444;44039:5;44003:3;:12;;44027:1;44016:8;:12;44003:26;;;;;;;;;;;;;;;;;;:33;;:41;;;;44066:5;44059:12;;;43398:692;;;;;;:::o;24499:422::-;24559:4;24767:12;24878:7;24866:20;24858:28;;24912:1;24905:4;:8;24898:15;;;24499:422;;;:::o;27417:195::-;27520:12;27552:52;27574:6;27582:4;27588:1;27591:12;27552:21;:52::i;:::-;27545:59;;27417:195;;;;;:::o;64715:404::-;64809:1;64795:16;;:2;:16;;;;64787:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;64868:16;64876:7;64868;:16::i;:::-;64867:17;64859:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;64930:45;64959:1;64963:2;64967:7;64930:20;:45::i;:::-;64988:30;65010:7;64988:13;:17;65002:2;64988:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;65031:29;65048:7;65057:2;65031:12;:16;;:29;;;;;:::i;:::-;;65103:7;65099:2;65078:33;;65095:1;65078:33;;;;;;;;;;;;64715:404;;:::o;35700:129::-;35773:4;35820:1;35797:3;:12;;:19;35810:5;35797:19;;;;;;;;;;;;:24;;35790:31;;35700:129;;;;:::o;28469:530::-;28596:12;28654:5;28629:21;:30;;28621:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;28721:18;28732:6;28721:10;:18::i;:::-;28713:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;28847:12;28861:23;28888:6;:11;;28908:5;28916:4;28888:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28846:75;;;;28939:52;28957:7;28966:10;28978:12;28939:17;:52::i;:::-;28932:59;;;;28469:530;;;;;;:::o;31009:742::-;31124:12;31153:7;31149:595;;;31184:10;31177:17;;;;31149:595;31318:1;31298:10;:17;:21;31294:439;;;31561:10;31555:17;31622:15;31609:10;31605:2;31601:19;31594:44;31509:148;31704:12;31697:20;;;;;;;;;;;:::i;:::-;;;;;;;;31009:742;;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:342:1:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:344::-;;458:65;473:49;515:6;473:49;:::i;:::-;458:65;:::i;:::-;449:74;;546:6;539:5;532:21;584:4;577:5;573:16;622:3;613:6;608:3;604:16;601:25;598:2;;;639:1;636;629:12;598:2;652:41;686:6;681:3;676;652:41;:::i;:::-;439:260;;;;;;:::o;705:139::-;;789:6;776:20;767:29;;805:33;832:5;805:33;:::i;:::-;757:87;;;;:::o;850:155::-;;942:6;929:20;920:29;;958:41;993:5;958:41;:::i;:::-;910:95;;;;:::o;1011:133::-;;1092:6;1079:20;1070:29;;1108:30;1132:5;1108:30;:::i;:::-;1060:84;;;;:::o;1150:137::-;;1233:6;1220:20;1211:29;;1249:32;1275:5;1249:32;:::i;:::-;1201:86;;;;:::o;1293:141::-;;1380:6;1374:13;1365:22;;1396:32;1422:5;1396:32;:::i;:::-;1355:79;;;;:::o;1453:271::-;;1557:3;1550:4;1542:6;1538:17;1534:27;1524:2;;1575:1;1572;1565:12;1524:2;1615:6;1602:20;1640:78;1714:3;1706:6;1699:4;1691:6;1687:17;1640:78;:::i;:::-;1631:87;;1514:210;;;;;:::o;1744:273::-;;1849:3;1842:4;1834:6;1830:17;1826:27;1816:2;;1867:1;1864;1857:12;1816:2;1907:6;1894:20;1932:79;2007:3;1999:6;1992:4;1984:6;1980:17;1932:79;:::i;:::-;1923:88;;1806:211;;;;;:::o;2023:139::-;;2107:6;2094:20;2085:29;;2123:33;2150:5;2123:33;:::i;:::-;2075:87;;;;:::o;2168:262::-;;2276:2;2264:9;2255:7;2251:23;2247:32;2244:2;;;2292:1;2289;2282:12;2244:2;2335:1;2360:53;2405:7;2396:6;2385:9;2381:22;2360:53;:::i;:::-;2350:63;;2306:117;2234:196;;;;:::o;2436:278::-;;2552:2;2540:9;2531:7;2527:23;2523:32;2520:2;;;2568:1;2565;2558:12;2520:2;2611:1;2636:61;2689:7;2680:6;2669:9;2665:22;2636:61;:::i;:::-;2626:71;;2582:125;2510:204;;;;:::o;2720:407::-;;;2845:2;2833:9;2824:7;2820:23;2816:32;2813:2;;;2861:1;2858;2851:12;2813:2;2904:1;2929:53;2974:7;2965:6;2954:9;2950:22;2929:53;:::i;:::-;2919:63;;2875:117;3031:2;3057:53;3102:7;3093:6;3082:9;3078:22;3057:53;:::i;:::-;3047:63;;3002:118;2803:324;;;;;:::o;3133:552::-;;;;3275:2;3263:9;3254:7;3250:23;3246:32;3243:2;;;3291:1;3288;3281:12;3243:2;3334:1;3359:53;3404:7;3395:6;3384:9;3380:22;3359:53;:::i;:::-;3349:63;;3305:117;3461:2;3487:53;3532:7;3523:6;3512:9;3508:22;3487:53;:::i;:::-;3477:63;;3432:118;3589:2;3615:53;3660:7;3651:6;3640:9;3636:22;3615:53;:::i;:::-;3605:63;;3560:118;3233:452;;;;;:::o;3691:809::-;;;;;3859:3;3847:9;3838:7;3834:23;3830:33;3827:2;;;3876:1;3873;3866:12;3827:2;3919:1;3944:53;3989:7;3980:6;3969:9;3965:22;3944:53;:::i;:::-;3934:63;;3890:117;4046:2;4072:53;4117:7;4108:6;4097:9;4093:22;4072:53;:::i;:::-;4062:63;;4017:118;4174:2;4200:53;4245:7;4236:6;4225:9;4221:22;4200:53;:::i;:::-;4190:63;;4145:118;4330:2;4319:9;4315:18;4302:32;4361:18;4353:6;4350:30;4347:2;;;4393:1;4390;4383:12;4347:2;4421:62;4475:7;4466:6;4455:9;4451:22;4421:62;:::i;:::-;4411:72;;4273:220;3817:683;;;;;;;:::o;4506:401::-;;;4628:2;4616:9;4607:7;4603:23;4599:32;4596:2;;;4644:1;4641;4634:12;4596:2;4687:1;4712:53;4757:7;4748:6;4737:9;4733:22;4712:53;:::i;:::-;4702:63;;4658:117;4814:2;4840:50;4882:7;4873:6;4862:9;4858:22;4840:50;:::i;:::-;4830:60;;4785:115;4586:321;;;;;:::o;4913:407::-;;;5038:2;5026:9;5017:7;5013:23;5009:32;5006:2;;;5054:1;5051;5044:12;5006:2;5097:1;5122:53;5167:7;5158:6;5147:9;5143:22;5122:53;:::i;:::-;5112:63;;5068:117;5224:2;5250:53;5295:7;5286:6;5275:9;5271:22;5250:53;:::i;:::-;5240:63;;5195:118;4996:324;;;;;:::o;5326:260::-;;5433:2;5421:9;5412:7;5408:23;5404:32;5401:2;;;5449:1;5446;5439:12;5401:2;5492:1;5517:52;5561:7;5552:6;5541:9;5537:22;5517:52;:::i;:::-;5507:62;;5463:116;5391:195;;;;:::o;5592:282::-;;5710:2;5698:9;5689:7;5685:23;5681:32;5678:2;;;5726:1;5723;5716:12;5678:2;5769:1;5794:63;5849:7;5840:6;5829:9;5825:22;5794:63;:::i;:::-;5784:73;;5740:127;5668:206;;;;:::o;5880:375::-;;5998:2;5986:9;5977:7;5973:23;5969:32;5966:2;;;6014:1;6011;6004:12;5966:2;6085:1;6074:9;6070:17;6057:31;6115:18;6107:6;6104:30;6101:2;;;6147:1;6144;6137:12;6101:2;6175:63;6230:7;6221:6;6210:9;6206:22;6175:63;:::i;:::-;6165:73;;6028:220;5956:299;;;;:::o;6261:262::-;;6369:2;6357:9;6348:7;6344:23;6340:32;6337:2;;;6385:1;6382;6375:12;6337:2;6428:1;6453:53;6498:7;6489:6;6478:9;6474:22;6453:53;:::i;:::-;6443:63;;6399:117;6327:196;;;;:::o;6529:179::-;;6619:46;6661:3;6653:6;6619:46;:::i;:::-;6697:4;6692:3;6688:14;6674:28;;6609:99;;;;:::o;6714:147::-;6809:45;6848:5;6809:45;:::i;:::-;6804:3;6797:58;6787:74;;:::o;6867:142::-;6970:32;6996:5;6970:32;:::i;:::-;6965:3;6958:45;6948:61;;:::o;7015:118::-;7102:24;7120:5;7102:24;:::i;:::-;7097:3;7090:37;7080:53;;:::o;7169:732::-;;7317:54;7365:5;7317:54;:::i;:::-;7387:86;7466:6;7461:3;7387:86;:::i;:::-;7380:93;;7497:56;7547:5;7497:56;:::i;:::-;7576:7;7607:1;7592:284;7617:6;7614:1;7611:13;7592:284;;;7693:6;7687:13;7720:63;7779:3;7764:13;7720:63;:::i;:::-;7713:70;;7806:60;7859:6;7806:60;:::i;:::-;7796:70;;7652:224;7639:1;7636;7632:9;7627:14;;7592:284;;;7596:14;7892:3;7885:10;;7293:608;;;;;;;:::o;7907:109::-;7988:21;8003:5;7988:21;:::i;:::-;7983:3;7976:34;7966:50;;:::o;8022:360::-;;8136:38;8168:5;8136:38;:::i;:::-;8190:70;8253:6;8248:3;8190:70;:::i;:::-;8183:77;;8269:52;8314:6;8309:3;8302:4;8295:5;8291:16;8269:52;:::i;:::-;8346:29;8368:6;8346:29;:::i;:::-;8341:3;8337:39;8330:46;;8112:270;;;;;:::o;8388:373::-;;8520:38;8552:5;8520:38;:::i;:::-;8574:88;8655:6;8650:3;8574:88;:::i;:::-;8567:95;;8671:52;8716:6;8711:3;8704:4;8697:5;8693:16;8671:52;:::i;:::-;8748:6;8743:3;8739:16;8732:23;;8496:265;;;;;:::o;8767:364::-;;8883:39;8916:5;8883:39;:::i;:::-;8938:71;9002:6;8997:3;8938:71;:::i;:::-;8931:78;;9018:52;9063:6;9058:3;9051:4;9044:5;9040:16;9018:52;:::i;:::-;9095:29;9117:6;9095:29;:::i;:::-;9090:3;9086:39;9079:46;;8859:272;;;;;:::o;9137:377::-;;9271:39;9304:5;9271:39;:::i;:::-;9326:89;9408:6;9403:3;9326:89;:::i;:::-;9319:96;;9424:52;9469:6;9464:3;9457:4;9450:5;9446:16;9424:52;:::i;:::-;9501:6;9496:3;9492:16;9485:23;;9247:267;;;;;:::o;9544:937::-;;9666:5;9660:12;9703:1;9692:9;9688:17;9719:1;9714:281;;;;10009:1;10004:471;;;;9681:794;;9714:281;9804:4;9800:1;9789:9;9785:17;9781:28;9829:71;9893:6;9888:3;9829:71;:::i;:::-;9822:78;;9944:4;9940:9;9929;9925:25;9920:3;9913:38;9980:4;9975:3;9971:14;9964:21;;9721:274;9714:281;;10004:471;10085:1;10074:9;10070:17;10107:71;10171:6;10166:3;10107:71;:::i;:::-;10100:78;;10206:38;10238:5;10206:38;:::i;:::-;10266:1;10280:154;10294:6;10291:1;10288:13;10280:154;;;10368:7;10362:14;10358:1;10353:3;10349:11;10342:35;10418:1;10409:7;10405:15;10394:26;;10316:4;10313:1;10309:12;10304:17;;10280:154;;;10463:1;10458:3;10454:11;10447:18;;10011:464;;;9681:794;;9633:848;;;;;:::o;10487:366::-;;10650:67;10714:2;10709:3;10650:67;:::i;:::-;10643:74;;10747:34;10743:1;10738:3;10734:11;10727:55;10813:4;10808:2;10803:3;10799:12;10792:26;10844:2;10839:3;10835:12;10828:19;;10633:220;;;:::o;10859:325::-;;11022:67;11086:2;11081:3;11022:67;:::i;:::-;11015:74;;11119:29;11115:1;11110:3;11106:11;11099:50;11175:2;11170:3;11166:12;11159:19;;11005:179;;;:::o;11190:382::-;;11353:67;11417:2;11412:3;11353:67;:::i;:::-;11346:74;;11450:34;11446:1;11441:3;11437:11;11430:55;11516:20;11511:2;11506:3;11502:12;11495:42;11563:2;11558:3;11554:12;11547:19;;11336:236;;;:::o;11578:370::-;;11741:67;11805:2;11800:3;11741:67;:::i;:::-;11734:74;;11838:34;11834:1;11829:3;11825:11;11818:55;11904:8;11899:2;11894:3;11890:12;11883:30;11939:2;11934:3;11930:12;11923:19;;11724:224;;;:::o;11954:326::-;;12117:67;12181:2;12176:3;12117:67;:::i;:::-;12110:74;;12214:30;12210:1;12205:3;12201:11;12194:51;12271:2;12266:3;12262:12;12255:19;;12100:180;;;:::o;12286:325::-;;12449:67;12513:2;12508:3;12449:67;:::i;:::-;12442:74;;12546:29;12542:1;12537:3;12533:11;12526:50;12602:2;12597:3;12593:12;12586:19;;12432:179;;;:::o;12617:365::-;;12780:67;12844:2;12839:3;12780:67;:::i;:::-;12773:74;;12877:34;12873:1;12868:3;12864:11;12857:55;12943:3;12938:2;12933:3;12929:12;12922:25;12973:2;12968:3;12964:12;12957:19;;12763:219;;;:::o;12988:374::-;;13151:67;13215:2;13210:3;13151:67;:::i;:::-;13144:74;;13248:34;13244:1;13239:3;13235:11;13228:55;13314:12;13309:2;13304:3;13300:12;13293:34;13353:2;13348:3;13344:12;13337:19;;13134:228;;;:::o;13368:370::-;;13531:67;13595:2;13590:3;13531:67;:::i;:::-;13524:74;;13628:34;13624:1;13619:3;13615:11;13608:55;13694:8;13689:2;13684:3;13680:12;13673:30;13729:2;13724:3;13720:12;13713:19;;13514:224;;;:::o;13744:368::-;;13907:67;13971:2;13966:3;13907:67;:::i;:::-;13900:74;;14004:34;14000:1;13995:3;13991:11;13984:55;14070:6;14065:2;14060:3;14056:12;14049:28;14103:2;14098:3;14094:12;14087:19;;13890:222;;;:::o;14118:323::-;;14281:67;14345:2;14340:3;14281:67;:::i;:::-;14274:74;;14378:27;14374:1;14369:3;14365:11;14358:48;14432:2;14427:3;14423:12;14416:19;;14264:177;;;:::o;14447:329::-;;14610:67;14674:2;14669:3;14610:67;:::i;:::-;14603:74;;14707:33;14703:1;14698:3;14694:11;14687:54;14767:2;14762:3;14758:12;14751:19;;14593:183;;;:::o;14782:390::-;;14945:67;15009:2;15004:3;14945:67;:::i;:::-;14938:74;;15042:34;15038:1;15033:3;15029:11;15022:55;15108:28;15103:2;15098:3;15094:12;15087:50;15163:2;15158:3;15154:12;15147:19;;14928:244;;;:::o;15178:327::-;;15341:67;15405:2;15400:3;15341:67;:::i;:::-;15334:74;;15438:31;15434:1;15429:3;15425:11;15418:52;15496:2;15491:3;15487:12;15480:19;;15324:181;;;:::o;15511:370::-;;15674:67;15738:2;15733:3;15674:67;:::i;:::-;15667:74;;15771:34;15767:1;15762:3;15758:11;15751:55;15837:8;15832:2;15827:3;15823:12;15816:30;15872:2;15867:3;15863:12;15856:19;;15657:224;;;:::o;15887:376::-;;16050:67;16114:2;16109:3;16050:67;:::i;:::-;16043:74;;16147:34;16143:1;16138:3;16134:11;16127:55;16213:14;16208:2;16203:3;16199:12;16192:36;16254:2;16249:3;16245:12;16238:19;;16033:230;;;:::o;16269:375::-;;16432:67;16496:2;16491:3;16432:67;:::i;:::-;16425:74;;16529:34;16525:1;16520:3;16516:11;16509:55;16595:13;16590:2;16585:3;16581:12;16574:35;16635:2;16630:3;16626:12;16619:19;;16415:229;;;:::o;16650:388::-;;16813:67;16877:2;16872:3;16813:67;:::i;:::-;16806:74;;16910:34;16906:1;16901:3;16897:11;16890:55;16976:26;16971:2;16966:3;16962:12;16955:48;17029:2;17024:3;17020:12;17013:19;;16796:242;;;:::o;17044:374::-;;17207:67;17271:2;17266:3;17207:67;:::i;:::-;17200:74;;17304:34;17300:1;17295:3;17291:11;17284:55;17370:12;17365:2;17360:3;17356:12;17349:34;17409:2;17404:3;17400:12;17393:19;;17190:228;;;:::o;17424:327::-;;17587:67;17651:2;17646:3;17587:67;:::i;:::-;17580:74;;17684:31;17680:1;17675:3;17671:11;17664:52;17742:2;17737:3;17733:12;17726:19;;17570:181;;;:::o;17757:366::-;;17920:67;17984:2;17979:3;17920:67;:::i;:::-;17913:74;;18017:34;18013:1;18008:3;18004:11;17997:55;18083:4;18078:2;18073:3;18069:12;18062:26;18114:2;18109:3;18105:12;18098:19;;17903:220;;;:::o;18129:330::-;;18292:67;18356:2;18351:3;18292:67;:::i;:::-;18285:74;;18389:34;18385:1;18380:3;18376:11;18369:55;18450:2;18445:3;18441:12;18434:19;;18275:184;;;:::o;18465:365::-;;18628:67;18692:2;18687:3;18628:67;:::i;:::-;18621:74;;18725:34;18721:1;18716:3;18712:11;18705:55;18791:3;18786:2;18781:3;18777:12;18770:25;18821:2;18816:3;18812:12;18805:19;;18611:219;;;:::o;18836:376::-;;18999:67;19063:2;19058:3;18999:67;:::i;:::-;18992:74;;19096:34;19092:1;19087:3;19083:11;19076:55;19162:14;19157:2;19152:3;19148:12;19141:36;19203:2;19198:3;19194:12;19187:19;;18982:230;;;:::o;19218:330::-;;19381:67;19445:2;19440:3;19381:67;:::i;:::-;19374:74;;19478:34;19474:1;19469:3;19465:11;19458:55;19539:2;19534:3;19530:12;19523:19;;19364:184;;;:::o;19554:373::-;;19717:67;19781:2;19776:3;19717:67;:::i;:::-;19710:74;;19814:34;19810:1;19805:3;19801:11;19794:55;19880:11;19875:2;19870:3;19866:12;19859:33;19918:2;19913:3;19909:12;19902:19;;19700:227;;;:::o;19933:379::-;;20096:67;20160:2;20155:3;20096:67;:::i;:::-;20089:74;;20193:34;20189:1;20184:3;20180:11;20173:55;20259:17;20254:2;20249:3;20245:12;20238:39;20303:2;20298:3;20294:12;20287:19;;20079:233;;;:::o;20318:365::-;;20481:67;20545:2;20540:3;20481:67;:::i;:::-;20474:74;;20578:34;20574:1;20569:3;20565:11;20558:55;20644:3;20639:2;20634:3;20630:12;20623:25;20674:2;20669:3;20665:12;20658:19;;20464:219;;;:::o;20689:297::-;;20869:83;20950:1;20945:3;20869:83;:::i;:::-;20862:90;;20978:1;20973:3;20969:11;20962:18;;20852:134;;;:::o;20992:330::-;;21155:67;21219:2;21214:3;21155:67;:::i;:::-;21148:74;;21252:34;21248:1;21243:3;21239:11;21232:55;21313:2;21308:3;21304:12;21297:19;;21138:184;;;:::o;21328:381::-;;21491:67;21555:2;21550:3;21491:67;:::i;:::-;21484:74;;21588:34;21584:1;21579:3;21575:11;21568:55;21654:19;21649:2;21644:3;21640:12;21633:41;21700:2;21695:3;21691:12;21684:19;;21474:235;;;:::o;21715:327::-;;21878:67;21942:2;21937:3;21878:67;:::i;:::-;21871:74;;21975:31;21971:1;21966:3;21962:11;21955:52;22033:2;22028:3;22024:12;22017:19;;21861:181;;;:::o;22048:108::-;22125:24;22143:5;22125:24;:::i;:::-;22120:3;22113:37;22103:53;;:::o;22162:118::-;22249:24;22267:5;22249:24;:::i;:::-;22244:3;22237:37;22227:53;;:::o;22286:271::-;;22438:93;22527:3;22518:6;22438:93;:::i;:::-;22431:100;;22548:3;22541:10;;22420:137;;;;:::o;22563:435::-;;22765:95;22856:3;22847:6;22765:95;:::i;:::-;22758:102;;22877:95;22968:3;22959:6;22877:95;:::i;:::-;22870:102;;22989:3;22982:10;;22747:251;;;;;:::o;23004:379::-;;23210:147;23353:3;23210:147;:::i;:::-;23203:154;;23374:3;23367:10;;23192:191;;;:::o;23389:222::-;;23520:2;23509:9;23505:18;23497:26;;23533:71;23601:1;23590:9;23586:17;23577:6;23533:71;:::i;:::-;23487:124;;;;:::o;23617:672::-;;23866:3;23855:9;23851:19;23843:27;;23880:87;23964:1;23953:9;23949:17;23940:6;23880:87;:::i;:::-;23977:72;24045:2;24034:9;24030:18;24021:6;23977:72;:::i;:::-;24059;24127:2;24116:9;24112:18;24103:6;24059:72;:::i;:::-;24178:9;24172:4;24168:20;24163:2;24152:9;24148:18;24141:48;24206:76;24277:4;24268:6;24206:76;:::i;:::-;24198:84;;23833:456;;;;;;;:::o;24295:348::-;;24462:2;24451:9;24447:18;24439:26;;24475:79;24551:1;24540:9;24536:17;24527:6;24475:79;:::i;:::-;24564:72;24632:2;24621:9;24617:18;24608:6;24564:72;:::i;:::-;24429:214;;;;;:::o;24649:373::-;;24830:2;24819:9;24815:18;24807:26;;24879:9;24873:4;24869:20;24865:1;24854:9;24850:17;24843:47;24907:108;25010:4;25001:6;24907:108;:::i;:::-;24899:116;;24797:225;;;;:::o;25028:210::-;;25153:2;25142:9;25138:18;25130:26;;25166:65;25228:1;25217:9;25213:17;25204:6;25166:65;:::i;:::-;25120:118;;;;:::o;25244:313::-;;25395:2;25384:9;25380:18;25372:26;;25444:9;25438:4;25434:20;25430:1;25419:9;25415:17;25408:47;25472:78;25545:4;25536:6;25472:78;:::i;:::-;25464:86;;25362:195;;;;:::o;25563:307::-;;25711:2;25700:9;25696:18;25688:26;;25760:9;25754:4;25750:20;25746:1;25735:9;25731:17;25724:47;25788:75;25858:4;25849:6;25788:75;:::i;:::-;25780:83;;25678:192;;;;:::o;25876:419::-;;26080:2;26069:9;26065:18;26057:26;;26129:9;26123:4;26119:20;26115:1;26104:9;26100:17;26093:47;26157:131;26283:4;26157:131;:::i;:::-;26149:139;;26047:248;;;:::o;26301:419::-;;26505:2;26494:9;26490:18;26482:26;;26554:9;26548:4;26544:20;26540:1;26529:9;26525:17;26518:47;26582:131;26708:4;26582:131;:::i;:::-;26574:139;;26472:248;;;:::o;26726:419::-;;26930:2;26919:9;26915:18;26907:26;;26979:9;26973:4;26969:20;26965:1;26954:9;26950:17;26943:47;27007:131;27133:4;27007:131;:::i;:::-;26999:139;;26897:248;;;:::o;27151:419::-;;27355:2;27344:9;27340:18;27332:26;;27404:9;27398:4;27394:20;27390:1;27379:9;27375:17;27368:47;27432:131;27558:4;27432:131;:::i;:::-;27424:139;;27322:248;;;:::o;27576:419::-;;27780:2;27769:9;27765:18;27757:26;;27829:9;27823:4;27819:20;27815:1;27804:9;27800:17;27793:47;27857:131;27983:4;27857:131;:::i;:::-;27849:139;;27747:248;;;:::o;28001:419::-;;28205:2;28194:9;28190:18;28182:26;;28254:9;28248:4;28244:20;28240:1;28229:9;28225:17;28218:47;28282:131;28408:4;28282:131;:::i;:::-;28274:139;;28172:248;;;:::o;28426:419::-;;28630:2;28619:9;28615:18;28607:26;;28679:9;28673:4;28669:20;28665:1;28654:9;28650:17;28643:47;28707:131;28833:4;28707:131;:::i;:::-;28699:139;;28597:248;;;:::o;28851:419::-;;29055:2;29044:9;29040:18;29032:26;;29104:9;29098:4;29094:20;29090:1;29079:9;29075:17;29068:47;29132:131;29258:4;29132:131;:::i;:::-;29124:139;;29022:248;;;:::o;29276:419::-;;29480:2;29469:9;29465:18;29457:26;;29529:9;29523:4;29519:20;29515:1;29504:9;29500:17;29493:47;29557:131;29683:4;29557:131;:::i;:::-;29549:139;;29447:248;;;:::o;29701:419::-;;29905:2;29894:9;29890:18;29882:26;;29954:9;29948:4;29944:20;29940:1;29929:9;29925:17;29918:47;29982:131;30108:4;29982:131;:::i;:::-;29974:139;;29872:248;;;:::o;30126:419::-;;30330:2;30319:9;30315:18;30307:26;;30379:9;30373:4;30369:20;30365:1;30354:9;30350:17;30343:47;30407:131;30533:4;30407:131;:::i;:::-;30399:139;;30297:248;;;:::o;30551:419::-;;30755:2;30744:9;30740:18;30732:26;;30804:9;30798:4;30794:20;30790:1;30779:9;30775:17;30768:47;30832:131;30958:4;30832:131;:::i;:::-;30824:139;;30722:248;;;:::o;30976:419::-;;31180:2;31169:9;31165:18;31157:26;;31229:9;31223:4;31219:20;31215:1;31204:9;31200:17;31193:47;31257:131;31383:4;31257:131;:::i;:::-;31249:139;;31147:248;;;:::o;31401:419::-;;31605:2;31594:9;31590:18;31582:26;;31654:9;31648:4;31644:20;31640:1;31629:9;31625:17;31618:47;31682:131;31808:4;31682:131;:::i;:::-;31674:139;;31572:248;;;:::o;31826:419::-;;32030:2;32019:9;32015:18;32007:26;;32079:9;32073:4;32069:20;32065:1;32054:9;32050:17;32043:47;32107:131;32233:4;32107:131;:::i;:::-;32099:139;;31997:248;;;:::o;32251:419::-;;32455:2;32444:9;32440:18;32432:26;;32504:9;32498:4;32494:20;32490:1;32479:9;32475:17;32468:47;32532:131;32658:4;32532:131;:::i;:::-;32524:139;;32422:248;;;:::o;32676:419::-;;32880:2;32869:9;32865:18;32857:26;;32929:9;32923:4;32919:20;32915:1;32904:9;32900:17;32893:47;32957:131;33083:4;32957:131;:::i;:::-;32949:139;;32847:248;;;:::o;33101:419::-;;33305:2;33294:9;33290:18;33282:26;;33354:9;33348:4;33344:20;33340:1;33329:9;33325:17;33318:47;33382:131;33508:4;33382:131;:::i;:::-;33374:139;;33272:248;;;:::o;33526:419::-;;33730:2;33719:9;33715:18;33707:26;;33779:9;33773:4;33769:20;33765:1;33754:9;33750:17;33743:47;33807:131;33933:4;33807:131;:::i;:::-;33799:139;;33697:248;;;:::o;33951:419::-;;34155:2;34144:9;34140:18;34132:26;;34204:9;34198:4;34194:20;34190:1;34179:9;34175:17;34168:47;34232:131;34358:4;34232:131;:::i;:::-;34224:139;;34122:248;;;:::o;34376:419::-;;34580:2;34569:9;34565:18;34557:26;;34629:9;34623:4;34619:20;34615:1;34604:9;34600:17;34593:47;34657:131;34783:4;34657:131;:::i;:::-;34649:139;;34547:248;;;:::o;34801:419::-;;35005:2;34994:9;34990:18;34982:26;;35054:9;35048:4;35044:20;35040:1;35029:9;35025:17;35018:47;35082:131;35208:4;35082:131;:::i;:::-;35074:139;;34972:248;;;:::o;35226:419::-;;35430:2;35419:9;35415:18;35407:26;;35479:9;35473:4;35469:20;35465:1;35454:9;35450:17;35443:47;35507:131;35633:4;35507:131;:::i;:::-;35499:139;;35397:248;;;:::o;35651:419::-;;35855:2;35844:9;35840:18;35832:26;;35904:9;35898:4;35894:20;35890:1;35879:9;35875:17;35868:47;35932:131;36058:4;35932:131;:::i;:::-;35924:139;;35822:248;;;:::o;36076:419::-;;36280:2;36269:9;36265:18;36257:26;;36329:9;36323:4;36319:20;36315:1;36304:9;36300:17;36293:47;36357:131;36483:4;36357:131;:::i;:::-;36349:139;;36247:248;;;:::o;36501:419::-;;36705:2;36694:9;36690:18;36682:26;;36754:9;36748:4;36744:20;36740:1;36729:9;36725:17;36718:47;36782:131;36908:4;36782:131;:::i;:::-;36774:139;;36672:248;;;:::o;36926:419::-;;37130:2;37119:9;37115:18;37107:26;;37179:9;37173:4;37169:20;37165:1;37154:9;37150:17;37143:47;37207:131;37333:4;37207:131;:::i;:::-;37199:139;;37097:248;;;:::o;37351:419::-;;37555:2;37544:9;37540:18;37532:26;;37604:9;37598:4;37594:20;37590:1;37579:9;37575:17;37568:47;37632:131;37758:4;37632:131;:::i;:::-;37624:139;;37522:248;;;:::o;37776:419::-;;37980:2;37969:9;37965:18;37957:26;;38029:9;38023:4;38019:20;38015:1;38004:9;38000:17;37993:47;38057:131;38183:4;38057:131;:::i;:::-;38049:139;;37947:248;;;:::o;38201:419::-;;38405:2;38394:9;38390:18;38382:26;;38454:9;38448:4;38444:20;38440:1;38429:9;38425:17;38418:47;38482:131;38608:4;38482:131;:::i;:::-;38474:139;;38372:248;;;:::o;38626:419::-;;38830:2;38819:9;38815:18;38807:26;;38879:9;38873:4;38869:20;38865:1;38854:9;38850:17;38843:47;38907:131;39033:4;38907:131;:::i;:::-;38899:139;;38797:248;;;:::o;39051:222::-;;39182:2;39171:9;39167:18;39159:26;;39195:71;39263:1;39252:9;39248:17;39239:6;39195:71;:::i;:::-;39149:124;;;;:::o;39279:278::-;;39345:2;39339:9;39329:19;;39387:4;39379:6;39375:17;39494:6;39482:10;39479:22;39458:18;39446:10;39443:34;39440:62;39437:2;;;39505:13;;:::i;:::-;39437:2;39540:10;39536:2;39529:22;39319:238;;;;:::o;39563:326::-;;39714:18;39706:6;39703:30;39700:2;;;39736:13;;:::i;:::-;39700:2;39816:4;39812:9;39805:4;39797:6;39793:17;39789:33;39781:41;;39877:4;39871;39867:15;39859:23;;39629:260;;;:::o;39895:327::-;;40047:18;40039:6;40036:30;40033:2;;;40069:13;;:::i;:::-;40033:2;40149:4;40145:9;40138:4;40130:6;40126:17;40122:33;40114:41;;40210:4;40204;40200:15;40192:23;;39962:260;;;:::o;40228:132::-;;40318:3;40310:11;;40348:4;40343:3;40339:14;40331:22;;40300:60;;;:::o;40366:141::-;;40438:3;40430:11;;40461:3;40458:1;40451:14;40495:4;40492:1;40482:18;40474:26;;40420:87;;;:::o;40513:114::-;;40614:5;40608:12;40598:22;;40587:40;;;:::o;40633:98::-;;40718:5;40712:12;40702:22;;40691:40;;;:::o;40737:99::-;;40823:5;40817:12;40807:22;;40796:40;;;:::o;40842:113::-;;40944:4;40939:3;40935:14;40927:22;;40917:38;;;:::o;40961:184::-;;41094:6;41089:3;41082:19;41134:4;41129:3;41125:14;41110:29;;41072:73;;;;:::o;41151:168::-;;41268:6;41263:3;41256:19;41308:4;41303:3;41299:14;41284:29;;41246:73;;;;:::o;41325:147::-;;41463:3;41448:18;;41438:34;;;;:::o;41478:169::-;;41596:6;41591:3;41584:19;41636:4;41631:3;41627:14;41612:29;;41574:73;;;;:::o;41653:148::-;;41792:3;41777:18;;41767:34;;;;:::o;41807:96::-;;41873:24;41891:5;41873:24;:::i;:::-;41862:35;;41852:51;;;:::o;41909:104::-;;41983:24;42001:5;41983:24;:::i;:::-;41972:35;;41962:51;;;:::o;42019:90::-;;42096:5;42089:13;42082:21;42071:32;;42061:48;;;:::o;42115:149::-;;42191:66;42184:5;42180:78;42169:89;;42159:105;;;:::o;42270:126::-;;42347:42;42340:5;42336:54;42325:65;;42315:81;;;:::o;42402:77::-;;42468:5;42457:16;;42447:32;;;:::o;42485:134::-;;42576:37;42607:5;42576:37;:::i;:::-;42563:50;;42553:66;;;:::o;42625:126::-;;42708:37;42739:5;42708:37;:::i;:::-;42695:50;;42685:66;;;:::o;42757:113::-;;42840:24;42858:5;42840:24;:::i;:::-;42827:37;;42817:53;;;:::o;42876:154::-;42960:6;42955:3;42950;42937:30;43022:1;43013:6;43008:3;43004:16;42997:27;42927:103;;;:::o;43036:307::-;43104:1;43114:113;43128:6;43125:1;43122:13;43114:113;;;43213:1;43208:3;43204:11;43198:18;43194:1;43189:3;43185:11;43178:39;43150:2;43147:1;43143:10;43138:15;;43114:113;;;43245:6;43242:1;43239:13;43236:2;;;43325:1;43316:6;43311:3;43307:16;43300:27;43236:2;43085:258;;;;:::o;43349:48::-;43382:9;43403:102;;43495:2;43491:7;43486:2;43479:5;43475:14;43471:28;43461:38;;43451:54;;;:::o;43511:122::-;43584:24;43602:5;43584:24;:::i;:::-;43577:5;43574:35;43564:2;;43623:1;43620;43613:12;43564:2;43554:79;:::o;43639:138::-;43720:32;43746:5;43720:32;:::i;:::-;43713:5;43710:43;43700:2;;43767:1;43764;43757:12;43700:2;43690:87;:::o;43783:116::-;43853:21;43868:5;43853:21;:::i;:::-;43846:5;43843:32;43833:2;;43889:1;43886;43879:12;43833:2;43823:76;:::o;43905:120::-;43977:23;43994:5;43977:23;:::i;:::-;43970:5;43967:34;43957:2;;44015:1;44012;44005:12;43957:2;43947:78;:::o;44031:122::-;44104:24;44122:5;44104:24;:::i;:::-;44097:5;44094:35;44084:2;;44143:1;44140;44133:12;44084:2;44074:79;:::o
Swarm Source
ipfs://97c8555ed19253f517cd0c1cac3b7010201e253ab045673e56490560afb682a2
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.