Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
NFT
Overview
Max Total Supply
1,111 WL
Holders
654
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 WLLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Wavelength
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-11-25 */ // File: @chainlink/contracts/src/v0.8/VRFRequestIDBase.sol pragma solidity ^0.8.0; contract VRFRequestIDBase { /** * @notice returns the seed which is actually input to the VRF coordinator * * @dev To prevent repetition of VRF output due to repetition of the * @dev user-supplied seed, that seed is combined in a hash with the * @dev user-specific nonce, and the address of the consuming contract. The * @dev risk of repetition is mostly mitigated by inclusion of a blockhash in * @dev the final seed, but the nonce does protect against repetition in * @dev requests which are included in a single block. * * @param _userSeed VRF seed input provided by user * @param _requester Address of the requesting contract * @param _nonce User-specific nonce at the time of the request */ function makeVRFInputSeed( bytes32 _keyHash, uint256 _userSeed, address _requester, uint256 _nonce ) internal pure returns ( uint256 ) { return uint256(keccak256(abi.encode(_keyHash, _userSeed, _requester, _nonce))); } /** * @notice Returns the id for this request * @param _keyHash The serviceAgreement ID to be used for this request * @param _vRFInputSeed The seed to be passed directly to the VRF * @return The id for this request * * @dev Note that _vRFInputSeed is not the seed passed by the consuming * @dev contract, but the one generated by makeVRFInputSeed */ function makeRequestId( bytes32 _keyHash, uint256 _vRFInputSeed ) internal pure returns ( bytes32 ) { return keccak256(abi.encodePacked(_keyHash, _vRFInputSeed)); } } // File: @chainlink/contracts/src/v0.8/interfaces/LinkTokenInterface.sol pragma solidity ^0.8.0; interface LinkTokenInterface { function allowance( address owner, address spender ) external view returns ( uint256 remaining ); function approve( address spender, uint256 value ) external returns ( bool success ); function balanceOf( address owner ) external view returns ( uint256 balance ); function decimals() external view returns ( uint8 decimalPlaces ); function decreaseApproval( address spender, uint256 addedValue ) external returns ( bool success ); function increaseApproval( address spender, uint256 subtractedValue ) external; function name() external view returns ( string memory tokenName ); function symbol() external view returns ( string memory tokenSymbol ); function totalSupply() external view returns ( uint256 totalTokensIssued ); function transfer( address to, uint256 value ) external returns ( bool success ); function transferAndCall( address to, uint256 value, bytes calldata data ) external returns ( bool success ); function transferFrom( address from, address to, uint256 value ) external returns ( bool success ); } // File: @chainlink/contracts/src/v0.8/VRFConsumerBase.sol pragma solidity ^0.8.0; /** **************************************************************************** * @notice Interface for contracts using VRF randomness * ***************************************************************************** * @dev PURPOSE * * @dev Reggie the Random Oracle (not his real job) wants to provide randomness * @dev to Vera the verifier in such a way that Vera can be sure he's not * @dev making his output up to suit himself. Reggie provides Vera a public key * @dev to which he knows the secret key. Each time Vera provides a seed to * @dev Reggie, he gives back a value which is computed completely * @dev deterministically from the seed and the secret key. * * @dev Reggie provides a proof by which Vera can verify that the output was * @dev correctly computed once Reggie tells it to her, but without that proof, * @dev the output is indistinguishable to her from a uniform random sample * @dev from the output space. * * @dev The purpose of this contract is to make it easy for unrelated contracts * @dev to talk to Vera the verifier about the work Reggie is doing, to provide * @dev simple access to a verifiable source of randomness. * ***************************************************************************** * @dev USAGE * * @dev Calling contracts must inherit from VRFConsumerBase, and can * @dev initialize VRFConsumerBase's attributes in their constructor as * @dev shown: * * @dev contract VRFConsumer { * @dev constuctor(<other arguments>, address _vrfCoordinator, address _link) * @dev VRFConsumerBase(_vrfCoordinator, _link) public { * @dev <initialization with other arguments goes here> * @dev } * @dev } * * @dev The oracle will have given you an ID for the VRF keypair they have * @dev committed to (let's call it keyHash), and have told you the minimum LINK * @dev price for VRF service. Make sure your contract has sufficient LINK, and * @dev call requestRandomness(keyHash, fee, seed), where seed is the input you * @dev want to generate randomness from. * * @dev Once the VRFCoordinator has received and validated the oracle's response * @dev to your request, it will call your contract's fulfillRandomness method. * * @dev The randomness argument to fulfillRandomness is the actual random value * @dev generated from your seed. * * @dev The requestId argument is generated from the keyHash and the seed by * @dev makeRequestId(keyHash, seed). If your contract could have concurrent * @dev requests open, you can use the requestId to track which seed is * @dev associated with which randomness. See VRFRequestIDBase.sol for more * @dev details. (See "SECURITY CONSIDERATIONS" for principles to keep in mind, * @dev if your contract could have multiple requests in flight simultaneously.) * * @dev Colliding `requestId`s are cryptographically impossible as long as seeds * @dev differ. (Which is critical to making unpredictable randomness! See the * @dev next section.) * * ***************************************************************************** * @dev SECURITY CONSIDERATIONS * * @dev A method with the ability to call your fulfillRandomness method directly * @dev could spoof a VRF response with any random value, so it's critical that * @dev it cannot be directly called by anything other than this base contract * @dev (specifically, by the VRFConsumerBase.rawFulfillRandomness method). * * @dev For your users to trust that your contract's random behavior is free * @dev from malicious interference, it's best if you can write it so that all * @dev behaviors implied by a VRF response are executed *during* your * @dev fulfillRandomness method. If your contract must store the response (or * @dev anything derived from it) and use it later, you must ensure that any * @dev user-significant behavior which depends on that stored value cannot be * @dev manipulated by a subsequent VRF request. * * @dev Similarly, both miners and the VRF oracle itself have some influence * @dev over the order in which VRF responses appear on the blockchain, so if * @dev your contract could have multiple VRF requests in flight simultaneously, * @dev you must ensure that the order in which the VRF responses arrive cannot * @dev be used to manipulate your contract's user-significant behavior. * * @dev Since the ultimate input to the VRF is mixed with the block hash of the * @dev block in which the request is made, user-provided seeds have no impact * @dev on its economic security properties. They are only included for API * @dev compatability with previous versions of this contract. * * @dev Since the block hash of the block which contains the requestRandomness * @dev call is mixed into the input to the VRF *last*, a sufficiently powerful * @dev miner could, in principle, fork the blockchain to evict the block * @dev containing the request, forcing the request to be included in a * @dev different block with a different hash, and therefore a different input * @dev to the VRF. However, such an attack would incur a substantial economic * @dev cost. This cost scales with the number of blocks the VRF oracle waits * @dev until it calls responds to a request. */ abstract contract VRFConsumerBase is VRFRequestIDBase { /** * @notice fulfillRandomness handles the VRF response. Your contract must * @notice implement it. See "SECURITY CONSIDERATIONS" above for important * @notice principles to keep in mind when implementing your fulfillRandomness * @notice method. * * @dev VRFConsumerBase expects its subcontracts to have a method with this * @dev signature, and will call it once it has verified the proof * @dev associated with the randomness. (It is triggered via a call to * @dev rawFulfillRandomness, below.) * * @param requestId The Id initially returned by requestRandomness * @param randomness the VRF output */ function fulfillRandomness( bytes32 requestId, uint256 randomness ) internal virtual; /** * @dev In order to keep backwards compatibility we have kept the user * seed field around. We remove the use of it because given that the blockhash * enters later, it overrides whatever randomness the used seed provides. * Given that it adds no security, and can easily lead to misunderstandings, * we have removed it from usage and can now provide a simpler API. */ uint256 constant private USER_SEED_PLACEHOLDER = 0; /** * @notice requestRandomness initiates a request for VRF output given _seed * * @dev The fulfillRandomness method receives the output, once it's provided * @dev by the Oracle, and verified by the vrfCoordinator. * * @dev The _keyHash must already be registered with the VRFCoordinator, and * @dev the _fee must exceed the fee specified during registration of the * @dev _keyHash. * * @dev The _seed parameter is vestigial, and is kept only for API * @dev compatibility with older versions. It can't *hurt* to mix in some of * @dev your own randomness, here, but it's not necessary because the VRF * @dev oracle will mix the hash of the block containing your request into the * @dev VRF seed it ultimately uses. * * @param _keyHash ID of public key against which randomness is generated * @param _fee The amount of LINK to send with the request * * @return requestId unique ID for this request * * @dev The returned requestId can be used to distinguish responses to * @dev concurrent requests. It is passed as the first argument to * @dev fulfillRandomness. */ function requestRandomness( bytes32 _keyHash, uint256 _fee ) internal returns ( bytes32 requestId ) { LINK.transferAndCall(vrfCoordinator, _fee, abi.encode(_keyHash, USER_SEED_PLACEHOLDER)); // This is the seed passed to VRFCoordinator. The oracle will mix this with // the hash of the block containing this request to obtain the seed/input // which is finally passed to the VRF cryptographic machinery. uint256 vRFSeed = makeVRFInputSeed(_keyHash, USER_SEED_PLACEHOLDER, address(this), nonces[_keyHash]); // nonces[_keyHash] must stay in sync with // VRFCoordinator.nonces[_keyHash][this], which was incremented by the above // successful LINK.transferAndCall (in VRFCoordinator.randomnessRequest). // This provides protection against the user repeating their input seed, // which would result in a predictable/duplicate output, if multiple such // requests appeared in the same block. nonces[_keyHash] = nonces[_keyHash] + 1; return makeRequestId(_keyHash, vRFSeed); } LinkTokenInterface immutable internal LINK; address immutable private vrfCoordinator; // Nonces for each VRF key from which randomness has been requested. // // Must stay in sync with VRFCoordinator[_keyHash][this] mapping(bytes32 /* keyHash */ => uint256 /* nonce */) private nonces; /** * @param _vrfCoordinator address of VRFCoordinator contract * @param _link address of LINK token contract * * @dev https://docs.chain.link/docs/link-token-contracts */ constructor( address _vrfCoordinator, address _link ) { vrfCoordinator = _vrfCoordinator; LINK = LinkTokenInterface(_link); } // rawFulfillRandomness is called by VRFCoordinator when it receives a valid VRF // proof. rawFulfillRandomness then calls fulfillRandomness, after validating // the origin of the call function rawFulfillRandomness( bytes32 requestId, uint256 randomness ) external { require(msg.sender == vrfCoordinator, "Only VRFCoordinator can fulfill"); fulfillRandomness(requestId, randomness); } } // File: @openzeppelin/contracts/utils/math/SafeMath.sol pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler * now has built in overflow checking. */ 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) { unchecked { 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) { unchecked { 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) { unchecked { // 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) { unchecked { 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) { unchecked { 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) { return a + b; } /** * @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) { 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) { return a * b; } /** * @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. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { 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) { 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) { unchecked { 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. * * 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) { unchecked { 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) { unchecked { require(b > 0, errorMessage); return a % b; } } } // File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Trees proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = keccak256(abi.encodePacked(computedHash, proofElement)); } else { // Hash(current element of the proof + current computed hash) computedHash = keccak256(abi.encodePacked(proofElement, computedHash)); } } // Check if the computed hash (root) is equal to the provided root return computedHash == root; } } // File: @openzeppelin/contracts/utils/Counters.sol pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File: @openzeppelin/contracts/utils/Strings.sol pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/Context.sol pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/security/Pausable.sol pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // File: @openzeppelin/contracts/access/Ownable.sol pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Address.sol pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol pragma solidity ^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: IWavelength.sol pragma solidity ^0.8.4; interface IWavelength is IERC721Enumerable { function mint(uint8 windowIndex, uint8 amount, bytes32[] calldata merkleProof) payable external; function unpause() external; function pause() external; function setBaseURI(string memory _baseTokenURI) external; function editRedemptionWindow(uint8 _windowID, bytes32 _merkleRoot, bool _open, uint8 _maxPerWallet,uint256 _pricePerToken) external; } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Burnable.sol pragma solidity ^0.8.0; /** * @title ERC721 Burnable Token * @dev ERC721 Token that can be irreversibly burned (destroyed). */ abstract contract ERC721Burnable is Context, ERC721 { /** * @dev Burns `tokenId`. See {ERC721-_burn}. * * Requirements: * * - The caller must own `tokenId` or be an approved operator. */ function burn(uint256 tokenId) public virtual { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved"); _burn(tokenId); } } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Pausable.sol pragma solidity ^0.8.0; /** * @dev ERC721 token with pausable token transfers, minting and burning. * * Useful for scenarios such as preventing trades until the end of an evaluation * period, or having an emergency switch for freezing all token transfers in the * event of a large bug. */ abstract contract ERC721Pausable is ERC721, Pausable { /** * @dev See {ERC721-_beforeTokenTransfer}. * * Requirements: * * - the contract must not be paused. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); require(!paused(), "ERC721Pausable: token transfer while paused"); } } // File: Wavelength.sol pragma solidity ^0.8.4; /* * @title ERC721 token for Wavelength * * @author original logic by Niftydude, extended by @bitcoinski, extended again by @georgefatlion */ contract Wavelength is IWavelength, ERC721Enumerable, ERC721Pausable, ERC721Burnable, Ownable, VRFConsumerBase { using Strings for uint256; using SafeMath for uint256; using Counters for Counters.Counter; Counters.Counter private generalCounter; uint public constant MAX_MINT = 1111; // VRF stuff address public VRFCoordinator; address public LinkToken; bytes32 internal keyHash; uint256 public baseSeed; struct RedemptionWindow { bool open; uint8 maxRedeemPerWallet; bytes32 merkleRoot; uint256 pricePerToken; } mapping(uint8 => RedemptionWindow) public redemptionWindows; // links string private baseTokenURI; string public _contractURI; string public _sourceURI; event Minted(address indexed account, string tokens); /** * @notice Constructor to create Wavelength contract * * @param _name the token name * @param _symbol the token symbol * @param _maxRedeemPerWallet the max mint per redemption by index * @param _merkleRoots the merkle root for redemption window by index * @param _prices the prices for each redemption window by index * @param _baseTokenURI the respective base URI * @param _contractMetaDataURI the respective contract meta data URI * @param _VRFCoordinator the address of the vrf coordinator * @param _LinkToken link token * @param _keyHash chainlink keyhash */ constructor ( string memory _name, string memory _symbol, uint8[] memory _maxRedeemPerWallet, bytes32[] memory _merkleRoots, uint256[] memory _prices, string memory _baseTokenURI, string memory _contractMetaDataURI, address _VRFCoordinator, address _LinkToken, bytes32 _keyHash ) VRFConsumerBase(_VRFCoordinator, _LinkToken) ERC721(_name, _symbol) { // vrf stuff VRFCoordinator = _VRFCoordinator; LinkToken = _LinkToken; // erc721 stuff baseTokenURI = _baseTokenURI; _contractURI = _contractMetaDataURI; keyHash = _keyHash; // set up the different redeption windows. 0 - collectors, 1 - first 100, 2 - next 200, 3 - wl, 4 - public. for(uint8 i = 0; i < _prices.length; i++) { redemptionWindows[i].open = false; redemptionWindows[i].maxRedeemPerWallet = _maxRedeemPerWallet[i]; redemptionWindows[i].merkleRoot = _merkleRoots[i]; redemptionWindows[i].pricePerToken = _prices[i]; } } /** * @notice Pause redeems until unpause is called. this pauses the whole contract. */ function pause() external override onlyOwner { _pause(); } /** * @notice Unpause redeems until pause is called. this unpauses the whole contract. */ function unpause() external override onlyOwner { _unpause(); } /** * @notice edit a redemption window. only writes value if it is different. * * @param _windowID the index of the claim window to set. * @param _merkleRoot the window merkleRoot. * @param _open the window open state. * @param _maxPerWallet the window maximum per wallet. * @param _pricePerToken the window price per token. */ function editRedemptionWindow( uint8 _windowID, bytes32 _merkleRoot, bool _open, uint8 _maxPerWallet, uint256 _pricePerToken ) external override onlyOwner { if(redemptionWindows[_windowID].open != _open) { redemptionWindows[_windowID].open = _open; } if(redemptionWindows[_windowID].maxRedeemPerWallet != _maxPerWallet) { redemptionWindows[_windowID].maxRedeemPerWallet = _maxPerWallet; } if(redemptionWindows[_windowID].merkleRoot != _merkleRoot) { redemptionWindows[_windowID].merkleRoot = _merkleRoot; } if(redemptionWindows[_windowID].pricePerToken != _pricePerToken) { redemptionWindows[_windowID].pricePerToken = _pricePerToken; } } /** * @notice Widthdraw Ether from contract. * * @param _to the address to send to * @param _amount the amount to withdraw */ function withdrawEther(address payable _to, uint256 _amount) public onlyOwner { _to.transfer(_amount); } /** * @notice Mint a wavelength. * * @param windowIndex the index of the claim window to use. * @param amount the amount of tokens to mint * @param merkleProof the hash proving they are on the list for a given window. only applies to windows 0, 1 and 2. */ function mint(uint8 windowIndex, uint8 amount, bytes32[] calldata merkleProof) external payable override{ // checks require(redemptionWindows[windowIndex].open, "Redeem: window is not open"); require(amount > 0, "Redeem: amount cannot be zero"); // check value of transaction is high enough. // if window index is 0 and they have no tokens, 1 mint is free. if (windowIndex == 0 && balanceOf(msg.sender) == 0) { require(msg.value >= price(amount-1, windowIndex), "Value below price"); } else { require(msg.value >= price(amount, windowIndex), "Value below price"); } // check if there are enough tokens left for them to mint. require(generalCounter.current() + amount <= MAX_MINT, "Max limit"); // limit number that can be claimed for given window. require(balanceOf(msg.sender) + amount <= redemptionWindows[windowIndex].maxRedeemPerWallet, "Too many"); // check the merkle proof require(verifyMerkleProof(merkleProof, redemptionWindows[windowIndex].merkleRoot),"Invalid proof"); string memory tokens = ""; for(uint256 j = 0; j < amount; j++) { _safeMint(msg.sender, generalCounter.current()); tokens = string(abi.encodePacked(tokens, generalCounter.current().toString(), ",")); generalCounter.increment(); } emit Minted(msg.sender, tokens); } /** * @notice Verify the merkle proof for a given root. * * @param proof vrf keyhash value * @param root vrf keyhash value */ function verifyMerkleProof(bytes32[] memory proof, bytes32 root) public view returns (bool) { bytes32 leaf = keccak256(abi.encodePacked(msg.sender)); return MerkleProof.verify(proof, root, leaf); } /** * @notice assign the returned chainlink vrf random number to baseSeed variable. * * @param requestId the id of the request - unused. * @param randomness the random number from chainlink vrf. */ function fulfillRandomness(bytes32 requestId, uint256 randomness) internal override { baseSeed = randomness; } /** * @notice Get the transaction price for a given number of tokens and redemption window. * * @param _amount the number of tokens * @param _windowIndex the ID of the window to check. */ function price(uint8 _amount, uint8 _windowIndex) public view returns (uint256) { return redemptionWindows[_windowIndex].pricePerToken.mul(_amount); } function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721, ERC721Enumerable) returns (bool) { return super.supportsInterface(interfaceId); } /** * @notice Change the base URI for returning metadata * * @param _baseTokenURI the respective base URI */ function setBaseURI(string memory _baseTokenURI) external override onlyOwner { baseTokenURI = _baseTokenURI; } /** * @notice Return the baseTokenURI */ function _baseURI() internal view override returns (string memory) { return baseTokenURI; } function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual override(ERC721, ERC721Enumerable, ERC721Pausable) { super._beforeTokenTransfer(from, to, tokenId); } /** * @notice Change the base URI for returning metadata * * @param uri the uri of the processing source code */ function setSourceURI(string memory uri) external onlyOwner{ _sourceURI = uri; } function setContractURI(string memory uri) external onlyOwner{ _contractURI = uri; } function contractURI() public view returns (string memory) { return _contractURI; } /** * @notice Call chainlink to get a random number to use as the base for the random seeds. * */ function plantSeed(uint256 fee) public onlyOwner returns (bytes32 requestId) { require(LINK.balanceOf(address(this)) >= fee, "Not enough LINK"); return requestRandomness(keyHash, fee); } /** * @notice Get the random seed for a given token, expanded from the baseSeed from Chainlink VRF. * * @param tokenId the token id */ function getSeed(uint256 tokenId) public view returns (uint256) { require(totalSupply()>tokenId, "Token Not Found"); if (baseSeed == 0){ return 0; } else{ return uint256(keccak256(abi.encode(baseSeed, tokenId))) % 2000000000; } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8[]","name":"_maxRedeemPerWallet","type":"uint8[]"},{"internalType":"bytes32[]","name":"_merkleRoots","type":"bytes32[]"},{"internalType":"uint256[]","name":"_prices","type":"uint256[]"},{"internalType":"string","name":"_baseTokenURI","type":"string"},{"internalType":"string","name":"_contractMetaDataURI","type":"string"},{"internalType":"address","name":"_VRFCoordinator","type":"address"},{"internalType":"address","name":"_LinkToken","type":"address"},{"internalType":"bytes32","name":"_keyHash","type":"bytes32"}],"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":"account","type":"address"},{"indexed":false,"internalType":"string","name":"tokens","type":"string"}],"name":"Minted","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"}],"name":"Paused","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":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"LinkToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VRFCoordinator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_sourceURI","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":"baseSeed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_windowID","type":"uint8"},{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"},{"internalType":"bool","name":"_open","type":"bool"},{"internalType":"uint8","name":"_maxPerWallet","type":"uint8"},{"internalType":"uint256","name":"_pricePerToken","type":"uint256"}],"name":"editRedemptionWindow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getSeed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"windowIndex","type":"uint8"},{"internalType":"uint8","name":"amount","type":"uint8"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"plantSeed","outputs":[{"internalType":"bytes32","name":"requestId","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_amount","type":"uint8"},{"internalType":"uint8","name":"_windowIndex","type":"uint8"}],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"requestId","type":"bytes32"},{"internalType":"uint256","name":"randomness","type":"uint256"}],"name":"rawFulfillRandomness","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"}],"name":"redemptionWindows","outputs":[{"internalType":"bool","name":"open","type":"bool"},{"internalType":"uint8","name":"maxRedeemPerWallet","type":"uint8"},{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"},{"internalType":"uint256","name":"pricePerToken","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseTokenURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setSourceURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"bytes32","name":"root","type":"bytes32"}],"name":"verifyMerkleProof","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawEther","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60c06040523480156200001157600080fd5b5060405162006a1d38038062006a1d83398181016040528101906200003791906200077a565b82828b8b816000908051906020019062000053929190620003e6565b5080600190805190602001906200006c929190620003e6565b5050506000600a60006101000a81548160ff021916908315150217905550620000aa6200009e6200031860201b60201c565b6200032060201b60201c565b8173ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1660601b815250508073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b81525050505082600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508460129080519060200190620001b4929190620003e6565b508360139080519060200190620001cd929190620003e6565b5080600f8190555060005b86518160ff16101562000307576000601160008360ff1660ff16815260200190815260200160002060000160006101000a81548160ff021916908315150217905550888160ff168151811062000233576200023262000bb9565b5b6020026020010151601160008360ff1660ff16815260200190815260200160002060000160016101000a81548160ff021916908360ff160217905550878160ff168151811062000288576200028762000bb9565b5b6020026020010151601160008360ff1660ff16815260200190815260200160002060010181905550868160ff1681518110620002c957620002c862000bb9565b5b6020026020010151601160008360ff1660ff168152602001908152602001600020600201819055508080620002fe9062000b2c565b915050620001d8565b505050505050505050505062000ca9565b600033905090565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620003f49062000ac0565b90600052602060002090601f01602090048101928262000418576000855562000464565b82601f106200043357805160ff191683800117855562000464565b8280016001018555821562000464579182015b828111156200046357825182559160200191906001019062000446565b5b50905062000473919062000477565b5090565b5b808211156200049257600081600090555060010162000478565b5090565b6000620004ad620004a78462000972565b62000949565b90508083825260208201905082856020860282011115620004d357620004d262000c1c565b5b60005b85811015620005075781620004ec888262000702565b845260208401935060208301925050600181019050620004d6565b5050509392505050565b6000620005286200052284620009a1565b62000949565b905080838252602082019050828560208602820111156200054e576200054d62000c1c565b5b60005b858110156200058257816200056788826200074c565b84526020840193506020830192505060018101905062000551565b5050509392505050565b6000620005a36200059d84620009d0565b62000949565b90508083825260208201905082856020860282011115620005c957620005c862000c1c565b5b60005b85811015620005fd5781620005e2888262000763565b845260208401935060208301925050600181019050620005cc565b5050509392505050565b60006200061e6200061884620009ff565b62000949565b9050828152602081018484840111156200063d576200063c62000c21565b5b6200064a84828562000a8a565b509392505050565b600081519050620006638162000c41565b92915050565b600082601f83011262000681576200068062000c17565b5b81516200069384826020860162000496565b91505092915050565b600082601f830112620006b457620006b362000c17565b5b8151620006c684826020860162000511565b91505092915050565b600082601f830112620006e757620006e662000c17565b5b8151620006f98482602086016200058c565b91505092915050565b600081519050620007138162000c5b565b92915050565b600082601f83011262000731576200073062000c17565b5b81516200074384826020860162000607565b91505092915050565b6000815190506200075d8162000c75565b92915050565b600081519050620007748162000c8f565b92915050565b6000806000806000806000806000806101408b8d031215620007a157620007a062000c2b565b5b60008b015167ffffffffffffffff811115620007c257620007c162000c26565b5b620007d08d828e0162000719565b9a505060208b015167ffffffffffffffff811115620007f457620007f362000c26565b5b620008028d828e0162000719565b99505060408b015167ffffffffffffffff81111562000826576200082562000c26565b5b620008348d828e01620006cf565b98505060608b015167ffffffffffffffff81111562000858576200085762000c26565b5b620008668d828e0162000669565b97505060808b015167ffffffffffffffff8111156200088a576200088962000c26565b5b620008988d828e016200069c565b96505060a08b015167ffffffffffffffff811115620008bc57620008bb62000c26565b5b620008ca8d828e0162000719565b95505060c08b015167ffffffffffffffff811115620008ee57620008ed62000c26565b5b620008fc8d828e0162000719565b94505060e06200090f8d828e0162000652565b935050610100620009238d828e0162000652565b925050610120620009378d828e0162000702565b9150509295989b9194979a5092959850565b60006200095562000968565b905062000963828262000af6565b919050565b6000604051905090565b600067ffffffffffffffff82111562000990576200098f62000be8565b5b602082029050602081019050919050565b600067ffffffffffffffff821115620009bf57620009be62000be8565b5b602082029050602081019050919050565b600067ffffffffffffffff821115620009ee57620009ed62000be8565b5b602082029050602081019050919050565b600067ffffffffffffffff82111562000a1d5762000a1c62000be8565b5b62000a288262000c30565b9050602081019050919050565b600062000a428262000a53565b9050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b8381101562000aaa57808201518184015260208101905062000a8d565b8381111562000aba576000848401525b50505050565b6000600282049050600182168062000ad957607f821691505b6020821081141562000af05762000aef62000b8a565b5b50919050565b62000b018262000c30565b810181811067ffffffffffffffff8211171562000b235762000b2262000be8565b5b80604052505050565b600062000b398262000a7d565b915060ff82141562000b505762000b4f62000b5b565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b62000c4c8162000a35565b811462000c5857600080fd5b50565b62000c668162000a49565b811462000c7257600080fd5b50565b62000c808162000a73565b811462000c8c57600080fd5b50565b62000c9a8162000a7d565b811462000ca657600080fd5b50565b60805160601c60a05160601c615d3a62000ce3600039600081816116ea0152612cf7015260008181611a1e0152612cbb0152615d3a6000f3fe6080604052600436106102515760003560e01c80636352211e11610139578063b1297e56116100b6578063e0d4ea371161007a578063e0d4ea37146108c8578063e8595c5314610905578063e8a3d48514610930578063e985e9c51461095b578063f0292a0314610998578063f2fde38b146109c357610251565b8063b1297e56146107de578063b88d4fde1461081b578063b91ca62214610844578063c0e7274014610860578063c87b56dd1461088b57610251565b8063938e3d7b116100fd578063938e3d7b1461070d57806394985ddd1461073657806395d89b411461075f5780639e8ed6f71461078a578063a22cb465146107b557610251565b80636352211e1461063a57806370a0823114610677578063715018a6146106b45780638456cb59146106cb5780638da5cb5b146106e257610251565b80633f4ba83a116101d25780634f8e2fdf116101965780634f8e2fdf14610515578063522f68151461054057806355f804b3146105695780635c975abb146105925780635eac1378146105bd5780635f044052146105fd57610251565b80633f4ba83a1461043257806342842e0e1461044957806342966c68146104725780634a1da5411461049b5780634f6ccce7146104d857610251565b806320d0900f1161021957806320d0900f1461034f57806323b872dd1461037857806324198517146103a15780632f745c59146103ca57806333b608631461040757610251565b806301ffc9a71461025657806306fdde0314610293578063081812fc146102be578063095ea7b3146102fb57806318160ddd14610324575b600080fd5b34801561026257600080fd5b5061027d600480360381019061027891906140d4565b6109ec565b60405161028a9190614a2b565b60405180910390f35b34801561029f57600080fd5b506102a86109fe565b6040516102b59190614b14565b60405180910390f35b3480156102ca57600080fd5b506102e560048036038101906102e09190614177565b610a90565b6040516102f29190614986565b60405180910390f35b34801561030757600080fd5b50610322600480360381019061031d9190613fcb565b610b15565b005b34801561033057600080fd5b50610339610c2d565b6040516103469190614f16565b60405180910390f35b34801561035b57600080fd5b50610376600480360381019061037191906141fe565b610c3a565b005b34801561038457600080fd5b5061039f600480360381019061039a9190613eb5565b610e1c565b005b3480156103ad57600080fd5b506103c860048036038101906103c3919061412e565b610e7c565b005b3480156103d657600080fd5b506103f160048036038101906103ec9190613fcb565b610f12565b6040516103fe9190614f16565b60405180910390f35b34801561041357600080fd5b5061041c610fb7565b6040516104299190614986565b60405180910390f35b34801561043e57600080fd5b50610447610fdd565b005b34801561045557600080fd5b50610470600480360381019061046b9190613eb5565b611063565b005b34801561047e57600080fd5b5061049960048036038101906104949190614177565b611083565b005b3480156104a757600080fd5b506104c260048036038101906104bd9190614279565b6110df565b6040516104cf9190614f16565b60405180910390f35b3480156104e457600080fd5b506104ff60048036038101906104fa9190614177565b61111b565b60405161050c9190614f16565b60405180910390f35b34801561052157600080fd5b5061052a61118c565b6040516105379190614986565b60405180910390f35b34801561054c57600080fd5b5061056760048036038101906105629190613e35565b6111b2565b005b34801561057557600080fd5b50610590600480360381019061058b919061412e565b611279565b005b34801561059e57600080fd5b506105a761130f565b6040516105b49190614a2b565b60405180910390f35b3480156105c957600080fd5b506105e460048036038101906105df91906141d1565b611326565b6040516105f49493929190614a46565b60405180910390f35b34801561060957600080fd5b50610624600480360381019061061f919061400b565b611370565b6040516106319190614a2b565b60405180910390f35b34801561064657600080fd5b50610661600480360381019061065c9190614177565b6113b0565b60405161066e9190614986565b60405180910390f35b34801561068357600080fd5b5061069e60048036038101906106999190613e08565b611462565b6040516106ab9190614f16565b60405180910390f35b3480156106c057600080fd5b506106c961151a565b005b3480156106d757600080fd5b506106e06115a2565b005b3480156106ee57600080fd5b506106f7611628565b6040516107049190614986565b60405180910390f35b34801561071957600080fd5b50610734600480360381019061072f919061412e565b611652565b005b34801561074257600080fd5b5061075d60048036038101906107589190614094565b6116e8565b005b34801561076b57600080fd5b50610774611784565b6040516107819190614b14565b60405180910390f35b34801561079657600080fd5b5061079f611816565b6040516107ac9190614f16565b60405180910390f35b3480156107c157600080fd5b506107dc60048036038101906107d79190613f8b565b61181c565b005b3480156107ea57600080fd5b5061080560048036038101906108009190614177565b61199d565b6040516108129190614a8b565b60405180910390f35b34801561082757600080fd5b50610842600480360381019061083d9190613f08565b611b19565b005b61085e600480360381019061085991906142b9565b611b7b565b005b34801561086c57600080fd5b50610875611f58565b6040516108829190614b14565b60405180910390f35b34801561089757600080fd5b506108b260048036038101906108ad9190614177565b611fe6565b6040516108bf9190614b14565b60405180910390f35b3480156108d457600080fd5b506108ef60048036038101906108ea9190614177565b61208d565b6040516108fc9190614f16565b60405180910390f35b34801561091157600080fd5b5061091a612131565b6040516109279190614b14565b60405180910390f35b34801561093c57600080fd5b506109456121bf565b6040516109529190614b14565b60405180910390f35b34801561096757600080fd5b50610982600480360381019061097d9190613e75565b612251565b60405161098f9190614a2b565b60405180910390f35b3480156109a457600080fd5b506109ad6122e5565b6040516109ba9190614f16565b60405180910390f35b3480156109cf57600080fd5b506109ea60048036038101906109e59190613e08565b6122eb565b005b60006109f7826123e3565b9050919050565b606060008054610a0d90615278565b80601f0160208091040260200160405190810160405280929190818152602001828054610a3990615278565b8015610a865780601f10610a5b57610100808354040283529160200191610a86565b820191906000526020600020905b815481529060010190602001808311610a6957829003601f168201915b5050505050905090565b6000610a9b8261245d565b610ada576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad190614d76565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b20826113b0565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8890614e56565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bb06124c9565b73ffffffffffffffffffffffffffffffffffffffff161480610bdf5750610bde81610bd96124c9565b612251565b5b610c1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1590614cd6565b60405180910390fd5b610c2883836124d1565b505050565b6000600880549050905090565b610c426124c9565b73ffffffffffffffffffffffffffffffffffffffff16610c60611628565b73ffffffffffffffffffffffffffffffffffffffff1614610cb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cad90614db6565b60405180910390fd5b821515601160008760ff1660ff16815260200190815260200160002060000160009054906101000a900460ff16151514610d1f5782601160008760ff1660ff16815260200190815260200160002060000160006101000a81548160ff0219169083151502179055505b8160ff16601160008760ff1660ff16815260200190815260200160002060000160019054906101000a900460ff1660ff1614610d8b5781601160008760ff1660ff16815260200190815260200160002060000160016101000a81548160ff021916908360ff1602179055505b83601160008760ff1660ff1681526020019081526020016000206001015414610dd05783601160008760ff1660ff168152602001908152602001600020600101819055505b80601160008760ff1660ff1681526020019081526020016000206002015414610e155780601160008760ff1660ff168152602001908152602001600020600201819055505b5050505050565b610e2d610e276124c9565b8261258a565b610e6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6390614e96565b60405180910390fd5b610e77838383612668565b505050565b610e846124c9565b73ffffffffffffffffffffffffffffffffffffffff16610ea2611628565b73ffffffffffffffffffffffffffffffffffffffff1614610ef8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eef90614db6565b60405180910390fd5b8060149080519060200190610f0e929190613abf565b5050565b6000610f1d83611462565b8210610f5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5590614b76565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610fe56124c9565b73ffffffffffffffffffffffffffffffffffffffff16611003611628565b73ffffffffffffffffffffffffffffffffffffffff1614611059576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105090614db6565b60405180910390fd5b6110616128c4565b565b61107e83838360405180602001604052806000815250611b19565b505050565b61109461108e6124c9565b8261258a565b6110d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ca90614ef6565b60405180910390fd5b6110dc81612966565b50565b60006111138360ff16601160008560ff1660ff16815260200190815260200160002060020154612a7790919063ffffffff16565b905092915050565b6000611125610c2d565b8210611166576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115d90614eb6565b60405180910390fd5b6008828154811061117a57611179615449565b5b90600052602060002001549050919050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6111ba6124c9565b73ffffffffffffffffffffffffffffffffffffffff166111d8611628565b73ffffffffffffffffffffffffffffffffffffffff161461122e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122590614db6565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611274573d6000803e3d6000fd5b505050565b6112816124c9565b73ffffffffffffffffffffffffffffffffffffffff1661129f611628565b73ffffffffffffffffffffffffffffffffffffffff16146112f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ec90614db6565b60405180910390fd5b806012908051906020019061130b929190613abf565b5050565b6000600a60009054906101000a900460ff16905090565b60116020528060005260406000206000915090508060000160009054906101000a900460ff16908060000160019054906101000a900460ff16908060010154908060020154905084565b6000803360405160200161138491906148c0565b6040516020818303038152906040528051906020012090506113a7848483612a8d565b91505092915050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611459576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145090614d16565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ca90614cf6565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6115226124c9565b73ffffffffffffffffffffffffffffffffffffffff16611540611628565b73ffffffffffffffffffffffffffffffffffffffff1614611596576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158d90614db6565b60405180910390fd5b6115a06000612b43565b565b6115aa6124c9565b73ffffffffffffffffffffffffffffffffffffffff166115c8611628565b73ffffffffffffffffffffffffffffffffffffffff161461161e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161590614db6565b60405180910390fd5b611626612c09565b565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61165a6124c9565b73ffffffffffffffffffffffffffffffffffffffff16611678611628565b73ffffffffffffffffffffffffffffffffffffffff16146116ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c590614db6565b60405180910390fd5b80601390805190602001906116e4929190613abf565b5050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176d90614e16565b60405180910390fd5b6117808282612cac565b5050565b60606001805461179390615278565b80601f01602080910402602001604051908101604052809291908181526020018280546117bf90615278565b801561180c5780601f106117e15761010080835404028352916020019161180c565b820191906000526020600020905b8154815290600101906020018083116117ef57829003601f168201915b5050505050905090565b60105481565b6118246124c9565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611892576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188990614c16565b60405180910390fd5b806005600061189f6124c9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661194c6124c9565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516119919190614a2b565b60405180910390a35050565b60006119a76124c9565b73ffffffffffffffffffffffffffffffffffffffff166119c5611628565b73ffffffffffffffffffffffffffffffffffffffff1614611a1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1290614db6565b60405180910390fd5b817f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611a759190614986565b60206040518083038186803b158015611a8d57600080fd5b505afa158015611aa1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ac591906141a4565b1015611b06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611afd90614cb6565b60405180910390fd5b611b12600f5483612cb7565b9050919050565b611b2a611b246124c9565b8361258a565b611b69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6090614e96565b60405180910390fd5b611b7584848484612e19565b50505050565b601160008560ff1660ff16815260200190815260200160002060000160009054906101000a900460ff16611be4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bdb90614c36565b60405180910390fd5b60008360ff1611611c2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2190614e76565b60405180910390fd5b60008460ff16148015611c4557506000611c4333611462565b145b15611ca757611c60600184611c5a9190615165565b856110df565b341015611ca2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9990614e36565b60405180910390fd5b611cf4565b611cb183856110df565b341015611cf3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cea90614e36565b60405180910390fd5b5b6104578360ff16611d05600c612e75565b611d0f9190615050565b1115611d50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4790614c56565b60405180910390fd5b601160008560ff1660ff16815260200190815260200160002060000160019054906101000a900460ff1660ff168360ff16611d8a33611462565b611d949190615050565b1115611dd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dcc90614d96565b60405180910390fd5b611e3c828280806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050601160008760ff1660ff16815260200190815260200160002060010154611370565b611e7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7290614ed6565b60405180910390fd5b600060405180602001604052806000815250905060005b8460ff16811015611f0257611eb033611eab600c612e75565b612e83565b81611ec3611ebe600c612e75565b612ea1565b604051602001611ed4929190614957565b6040516020818303038152906040529150611eef600c613002565b8080611efa906152db565b915050611e92565b503373ffffffffffffffffffffffffffffffffffffffff167f0c1b180fbb60448c5491c5ddc7c3a923854214b9ff70f90a7821333338971f9282604051611f499190614b14565b60405180910390a25050505050565b60138054611f6590615278565b80601f0160208091040260200160405190810160405280929190818152602001828054611f9190615278565b8015611fde5780601f10611fb357610100808354040283529160200191611fde565b820191906000526020600020905b815481529060010190602001808311611fc157829003601f168201915b505050505081565b6060611ff18261245d565b612030576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202790614df6565b60405180910390fd5b600061203a613018565b9050600081511161205a5760405180602001604052806000815250612085565b8061206484612ea1565b604051602001612075929190614933565b6040516020818303038152906040525b915050919050565b600081612098610c2d565b116120d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120cf90614d36565b60405180910390fd5b600060105414156120ec576000905061212c565b637735940060105483604051602001612106929190614f31565b6040516020818303038152906040528051906020012060001c612129919061535c565b90505b919050565b6014805461213e90615278565b80601f016020809104026020016040519081016040528092919081815260200182805461216a90615278565b80156121b75780601f1061218c576101008083540402835291602001916121b7565b820191906000526020600020905b81548152906001019060200180831161219a57829003601f168201915b505050505081565b6060601380546121ce90615278565b80601f01602080910402602001604051908101604052809291908181526020018280546121fa90615278565b80156122475780601f1061221c57610100808354040283529160200191612247565b820191906000526020600020905b81548152906001019060200180831161222a57829003601f168201915b5050505050905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61045781565b6122f36124c9565b73ffffffffffffffffffffffffffffffffffffffff16612311611628565b73ffffffffffffffffffffffffffffffffffffffff1614612367576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235e90614db6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156123d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ce90614bb6565b60405180910390fd5b6123e081612b43565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806124565750612455826130aa565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612544836113b0565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006125958261245d565b6125d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125cb90614c76565b60405180910390fd5b60006125df836113b0565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061264e57508373ffffffffffffffffffffffffffffffffffffffff1661263684610a90565b73ffffffffffffffffffffffffffffffffffffffff16145b8061265f575061265e8185612251565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612688826113b0565b73ffffffffffffffffffffffffffffffffffffffff16146126de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126d590614dd6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561274e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161274590614bf6565b60405180910390fd5b61275983838361318c565b6127646000826124d1565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127b49190615131565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461280b9190615050565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6128cc61130f565b61290b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161290290614b56565b60405180910390fd5b6000600a60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa61294f6124c9565b60405161295c9190614986565b60405180910390a1565b6000612971826113b0565b905061297f8160008461318c565b61298a6000836124d1565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129da9190615131565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60008183612a8591906150d7565b905092915050565b60008082905060005b8551811015612b35576000868281518110612ab457612ab3615449565b5b60200260200101519050808311612af5578281604051602001612ad89291906148db565b604051602081830303815290604052805190602001209250612b21565b8083604051602001612b089291906148db565b6040516020818303038152906040528051906020012092505b508080612b2d906152db565b915050612a96565b508381149150509392505050565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612c1161130f565b15612c51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c4890614c96565b60405180910390fd5b6001600a60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612c956124c9565b604051612ca29190614986565b60405180910390a1565b806010819055505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16634000aea07f000000000000000000000000000000000000000000000000000000000000000084866000604051602001612d2b929190614aa6565b6040516020818303038152906040526040518463ffffffff1660e01b8152600401612d58939291906149ed565b602060405180830381600087803b158015612d7257600080fd5b505af1158015612d86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612daa9190614067565b506000612dcd84600030600b60008981526020019081526020016000205461319c565b90506001600b600086815260200190815260200160002054612def9190615050565b600b600086815260200190815260200160002081905550612e1084826131d8565b91505092915050565b612e24848484612668565b612e308484848461320b565b612e6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e6690614b96565b60405180910390fd5b50505050565b600081600001549050919050565b612e9d8282604051806020016040528060008152506133a2565b5050565b60606000821415612ee9576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612ffd565b600082905060005b60008214612f1b578080612f04906152db565b915050600a82612f1491906150a6565b9150612ef1565b60008167ffffffffffffffff811115612f3757612f36615478565b5b6040519080825280601f01601f191660200182016040528015612f695781602001600182028036833780820191505090505b5090505b60008514612ff657600182612f829190615131565b9150600a85612f91919061535c565b6030612f9d9190615050565b60f81b818381518110612fb357612fb2615449565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612fef91906150a6565b9450612f6d565b8093505050505b919050565b6001816000016000828254019250508190555050565b60606012805461302790615278565b80601f016020809104026020016040519081016040528092919081815260200182805461305390615278565b80156130a05780601f10613075576101008083540402835291602001916130a0565b820191906000526020600020905b81548152906001019060200180831161308357829003601f168201915b5050505050905090565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061317557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806131855750613184826133fd565b5b9050919050565b613197838383613467565b505050565b6000848484846040516020016131b59493929190614acf565b6040516020818303038152906040528051906020012060001c9050949350505050565b600082826040516020016131ed929190614907565b60405160208183030381529060405280519060200120905092915050565b600061322c8473ffffffffffffffffffffffffffffffffffffffff166134bf565b15613395578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026132556124c9565b8786866040518563ffffffff1660e01b815260040161327794939291906149a1565b602060405180830381600087803b15801561329157600080fd5b505af19250505080156132c257506040513d601f19601f820116820180604052508101906132bf9190614101565b60015b613345573d80600081146132f2576040519150601f19603f3d011682016040523d82523d6000602084013e6132f7565b606091505b5060008151141561333d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161333490614b96565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061339a565b600190505b949350505050565b6133ac83836134d2565b6133b9600084848461320b565b6133f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133ef90614b96565b60405180910390fd5b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6134728383836136a0565b61347a61130f565b156134ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134b190614b36565b60405180910390fd5b505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613542576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161353990614d56565b60405180910390fd5b61354b8161245d565b1561358b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161358290614bd6565b60405180910390fd5b6135976000838361318c565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546135e79190615050565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6136ab8383836137b4565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156136ee576136e9816137b9565b61372d565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461372c5761372b8382613802565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156137705761376b8161396f565b6137af565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146137ae576137ad8282613a40565b5b5b505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161380f84611462565b6138199190615131565b90506000600760008481526020019081526020016000205490508181146138fe576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506139839190615131565b90506000600960008481526020019081526020016000205490506000600883815481106139b3576139b2615449565b5b9060005260206000200154905080600883815481106139d5576139d4615449565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613a2457613a2361541a565b5b6001900381819060005260206000200160009055905550505050565b6000613a4b83611462565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b828054613acb90615278565b90600052602060002090601f016020900481019282613aed5760008555613b34565b82601f10613b0657805160ff1916838001178555613b34565b82800160010185558215613b34579182015b82811115613b33578251825591602001919060010190613b18565b5b509050613b419190613b45565b5090565b5b80821115613b5e576000816000905550600101613b46565b5090565b6000613b75613b7084614f7f565b614f5a565b90508083825260208201905082856020860282011115613b9857613b976154b1565b5b60005b85811015613bc85781613bae8882613d2e565b845260208401935060208301925050600181019050613b9b565b5050509392505050565b6000613be5613be084614fab565b614f5a565b905082815260208101848484011115613c0157613c006154b6565b5b613c0c848285615236565b509392505050565b6000613c27613c2284614fdc565b614f5a565b905082815260208101848484011115613c4357613c426154b6565b5b613c4e848285615236565b509392505050565b600081359050613c6581615c63565b92915050565b600081359050613c7a81615c7a565b92915050565b60008083601f840112613c9657613c956154ac565b5b8235905067ffffffffffffffff811115613cb357613cb26154a7565b5b602083019150836020820283011115613ccf57613cce6154b1565b5b9250929050565b600082601f830112613ceb57613cea6154ac565b5b8135613cfb848260208601613b62565b91505092915050565b600081359050613d1381615c91565b92915050565b600081519050613d2881615c91565b92915050565b600081359050613d3d81615ca8565b92915050565b600081359050613d5281615cbf565b92915050565b600081519050613d6781615cbf565b92915050565b600082601f830112613d8257613d816154ac565b5b8135613d92848260208601613bd2565b91505092915050565b600082601f830112613db057613daf6154ac565b5b8135613dc0848260208601613c14565b91505092915050565b600081359050613dd881615cd6565b92915050565b600081519050613ded81615cd6565b92915050565b600081359050613e0281615ced565b92915050565b600060208284031215613e1e57613e1d6154c0565b5b6000613e2c84828501613c56565b91505092915050565b60008060408385031215613e4c57613e4b6154c0565b5b6000613e5a85828601613c6b565b9250506020613e6b85828601613dc9565b9150509250929050565b60008060408385031215613e8c57613e8b6154c0565b5b6000613e9a85828601613c56565b9250506020613eab85828601613c56565b9150509250929050565b600080600060608486031215613ece57613ecd6154c0565b5b6000613edc86828701613c56565b9350506020613eed86828701613c56565b9250506040613efe86828701613dc9565b9150509250925092565b60008060008060808587031215613f2257613f216154c0565b5b6000613f3087828801613c56565b9450506020613f4187828801613c56565b9350506040613f5287828801613dc9565b925050606085013567ffffffffffffffff811115613f7357613f726154bb565b5b613f7f87828801613d6d565b91505092959194509250565b60008060408385031215613fa257613fa16154c0565b5b6000613fb085828601613c56565b9250506020613fc185828601613d04565b9150509250929050565b60008060408385031215613fe257613fe16154c0565b5b6000613ff085828601613c56565b925050602061400185828601613dc9565b9150509250929050565b60008060408385031215614022576140216154c0565b5b600083013567ffffffffffffffff8111156140405761403f6154bb565b5b61404c85828601613cd6565b925050602061405d85828601613d2e565b9150509250929050565b60006020828403121561407d5761407c6154c0565b5b600061408b84828501613d19565b91505092915050565b600080604083850312156140ab576140aa6154c0565b5b60006140b985828601613d2e565b92505060206140ca85828601613dc9565b9150509250929050565b6000602082840312156140ea576140e96154c0565b5b60006140f884828501613d43565b91505092915050565b600060208284031215614117576141166154c0565b5b600061412584828501613d58565b91505092915050565b600060208284031215614144576141436154c0565b5b600082013567ffffffffffffffff811115614162576141616154bb565b5b61416e84828501613d9b565b91505092915050565b60006020828403121561418d5761418c6154c0565b5b600061419b84828501613dc9565b91505092915050565b6000602082840312156141ba576141b96154c0565b5b60006141c884828501613dde565b91505092915050565b6000602082840312156141e7576141e66154c0565b5b60006141f584828501613df3565b91505092915050565b600080600080600060a0868803121561421a576142196154c0565b5b600061422888828901613df3565b955050602061423988828901613d2e565b945050604061424a88828901613d04565b935050606061425b88828901613df3565b925050608061426c88828901613dc9565b9150509295509295909350565b600080604083850312156142905761428f6154c0565b5b600061429e85828601613df3565b92505060206142af85828601613df3565b9150509250929050565b600080600080606085870312156142d3576142d26154c0565b5b60006142e187828801613df3565b94505060206142f287828801613df3565b935050604085013567ffffffffffffffff811115614313576143126154bb565b5b61431f87828801613c80565b925092505092959194509250565b61433681615199565b82525050565b61434d61434882615199565b615324565b82525050565b61435c816151bd565b82525050565b61436b816151c9565b82525050565b61438261437d826151c9565b615336565b82525050565b60006143938261500d565b61439d8185615023565b93506143ad818560208601615245565b6143b6816154c5565b840191505092915050565b60006143cc82615018565b6143d68185615034565b93506143e6818560208601615245565b6143ef816154c5565b840191505092915050565b600061440582615018565b61440f8185615045565b935061441f818560208601615245565b80840191505092915050565b6000614438602b83615034565b9150614443826154e3565b604082019050919050565b600061445b601483615034565b915061446682615532565b602082019050919050565b600061447e602b83615034565b91506144898261555b565b604082019050919050565b60006144a1603283615034565b91506144ac826155aa565b604082019050919050565b60006144c4602683615034565b91506144cf826155f9565b604082019050919050565b60006144e7601c83615034565b91506144f282615648565b602082019050919050565b600061450a600183615045565b915061451582615671565b600182019050919050565b600061452d602483615034565b91506145388261569a565b604082019050919050565b6000614550601983615034565b915061455b826156e9565b602082019050919050565b6000614573601a83615034565b915061457e82615712565b602082019050919050565b6000614596600983615034565b91506145a18261573b565b602082019050919050565b60006145b9602c83615034565b91506145c482615764565b604082019050919050565b60006145dc601083615034565b91506145e7826157b3565b602082019050919050565b60006145ff600f83615034565b915061460a826157dc565b602082019050919050565b6000614622603883615034565b915061462d82615805565b604082019050919050565b6000614645602a83615034565b915061465082615854565b604082019050919050565b6000614668602983615034565b9150614673826158a3565b604082019050919050565b600061468b600f83615034565b9150614696826158f2565b602082019050919050565b60006146ae602083615034565b91506146b98261591b565b602082019050919050565b60006146d1602c83615034565b91506146dc82615944565b604082019050919050565b60006146f4600883615034565b91506146ff82615993565b602082019050919050565b6000614717602083615034565b9150614722826159bc565b602082019050919050565b600061473a602983615034565b9150614745826159e5565b604082019050919050565b600061475d602f83615034565b915061476882615a34565b604082019050919050565b6000614780601f83615034565b915061478b82615a83565b602082019050919050565b60006147a3601183615034565b91506147ae82615aac565b602082019050919050565b60006147c6602183615034565b91506147d182615ad5565b604082019050919050565b60006147e9601d83615034565b91506147f482615b24565b602082019050919050565b600061480c603183615034565b915061481782615b4d565b604082019050919050565b600061482f602c83615034565b915061483a82615b9c565b604082019050919050565b6000614852600d83615034565b915061485d82615beb565b602082019050919050565b6000614875603083615034565b915061488082615c14565b604082019050919050565b6148948161521f565b82525050565b6148ab6148a68261521f565b615352565b82525050565b6148ba81615229565b82525050565b60006148cc828461433c565b60148201915081905092915050565b60006148e78285614371565b6020820191506148f78284614371565b6020820191508190509392505050565b60006149138285614371565b602082019150614923828461489a565b6020820191508190509392505050565b600061493f82856143fa565b915061494b82846143fa565b91508190509392505050565b600061496382856143fa565b915061496f82846143fa565b915061497a826144fd565b91508190509392505050565b600060208201905061499b600083018461432d565b92915050565b60006080820190506149b6600083018761432d565b6149c3602083018661432d565b6149d0604083018561488b565b81810360608301526149e28184614388565b905095945050505050565b6000606082019050614a02600083018661432d565b614a0f602083018561488b565b8181036040830152614a218184614388565b9050949350505050565b6000602082019050614a406000830184614353565b92915050565b6000608082019050614a5b6000830187614353565b614a6860208301866148b1565b614a756040830185614362565b614a82606083018461488b565b95945050505050565b6000602082019050614aa06000830184614362565b92915050565b6000604082019050614abb6000830185614362565b614ac8602083018461488b565b9392505050565b6000608082019050614ae46000830187614362565b614af1602083018661488b565b614afe604083018561432d565b614b0b606083018461488b565b95945050505050565b60006020820190508181036000830152614b2e81846143c1565b905092915050565b60006020820190508181036000830152614b4f8161442b565b9050919050565b60006020820190508181036000830152614b6f8161444e565b9050919050565b60006020820190508181036000830152614b8f81614471565b9050919050565b60006020820190508181036000830152614baf81614494565b9050919050565b60006020820190508181036000830152614bcf816144b7565b9050919050565b60006020820190508181036000830152614bef816144da565b9050919050565b60006020820190508181036000830152614c0f81614520565b9050919050565b60006020820190508181036000830152614c2f81614543565b9050919050565b60006020820190508181036000830152614c4f81614566565b9050919050565b60006020820190508181036000830152614c6f81614589565b9050919050565b60006020820190508181036000830152614c8f816145ac565b9050919050565b60006020820190508181036000830152614caf816145cf565b9050919050565b60006020820190508181036000830152614ccf816145f2565b9050919050565b60006020820190508181036000830152614cef81614615565b9050919050565b60006020820190508181036000830152614d0f81614638565b9050919050565b60006020820190508181036000830152614d2f8161465b565b9050919050565b60006020820190508181036000830152614d4f8161467e565b9050919050565b60006020820190508181036000830152614d6f816146a1565b9050919050565b60006020820190508181036000830152614d8f816146c4565b9050919050565b60006020820190508181036000830152614daf816146e7565b9050919050565b60006020820190508181036000830152614dcf8161470a565b9050919050565b60006020820190508181036000830152614def8161472d565b9050919050565b60006020820190508181036000830152614e0f81614750565b9050919050565b60006020820190508181036000830152614e2f81614773565b9050919050565b60006020820190508181036000830152614e4f81614796565b9050919050565b60006020820190508181036000830152614e6f816147b9565b9050919050565b60006020820190508181036000830152614e8f816147dc565b9050919050565b60006020820190508181036000830152614eaf816147ff565b9050919050565b60006020820190508181036000830152614ecf81614822565b9050919050565b60006020820190508181036000830152614eef81614845565b9050919050565b60006020820190508181036000830152614f0f81614868565b9050919050565b6000602082019050614f2b600083018461488b565b92915050565b6000604082019050614f46600083018561488b565b614f53602083018461488b565b9392505050565b6000614f64614f75565b9050614f7082826152aa565b919050565b6000604051905090565b600067ffffffffffffffff821115614f9a57614f99615478565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614fc657614fc5615478565b5b614fcf826154c5565b9050602081019050919050565b600067ffffffffffffffff821115614ff757614ff6615478565b5b615000826154c5565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061505b8261521f565b91506150668361521f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561509b5761509a61538d565b5b828201905092915050565b60006150b18261521f565b91506150bc8361521f565b9250826150cc576150cb6153bc565b5b828204905092915050565b60006150e28261521f565b91506150ed8361521f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156151265761512561538d565b5b828202905092915050565b600061513c8261521f565b91506151478361521f565b92508282101561515a5761515961538d565b5b828203905092915050565b600061517082615229565b915061517b83615229565b92508282101561518e5761518d61538d565b5b828203905092915050565b60006151a4826151ff565b9050919050565b60006151b6826151ff565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015615263578082015181840152602081019050615248565b83811115615272576000848401525b50505050565b6000600282049050600182168061529057607f821691505b602082108114156152a4576152a36153eb565b5b50919050565b6152b3826154c5565b810181811067ffffffffffffffff821117156152d2576152d1615478565b5b80604052505050565b60006152e68261521f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156153195761531861538d565b5b600182019050919050565b600061532f82615340565b9050919050565b6000819050919050565b600061534b826154d6565b9050919050565b6000819050919050565b60006153678261521f565b91506153728361521f565b925082615382576153816153bc565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4552433732315061757361626c653a20746f6b656e207472616e73666572207760008201527f68696c6520706175736564000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f2c00000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f52656465656d3a2077696e646f77206973206e6f74206f70656e000000000000600082015250565b7f4d6178206c696d69740000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4e6f7420656e6f756768204c494e4b0000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f546f6b656e204e6f7420466f756e640000000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f546f6f206d616e79000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4f6e6c7920565246436f6f7264696e61746f722063616e2066756c66696c6c00600082015250565b7f56616c75652062656c6f77207072696365000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f52656465656d3a20616d6f756e742063616e6e6f74206265207a65726f000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f496e76616c69642070726f6f6600000000000000000000000000000000000000600082015250565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b615c6c81615199565b8114615c7757600080fd5b50565b615c83816151ab565b8114615c8e57600080fd5b50565b615c9a816151bd565b8114615ca557600080fd5b50565b615cb1816151c9565b8114615cbc57600080fd5b50565b615cc8816151d3565b8114615cd357600080fd5b50565b615cdf8161521f565b8114615cea57600080fd5b50565b615cf681615229565b8114615d0157600080fd5b5056fea264697066735822122046b1ba31fbd2b2fbb37b09ef5961fecce9841c1b7552bacc029475f6bbac255d64736f6c634300080700330000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000001c00000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000420000000000000000000000000f0d54349addcf704f77ae15b96510dea15cb7952000000000000000000000000514910771af9ca656af840dff83e8264ecf986caaa77729d3466ca35ae8d28b3bbac7cc36a5031efdc430821c02bc31a238af445000000000000000000000000000000000000000000000000000000000000000a576176656c656e677468000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002574c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000589f3e4a0c95991077e7efe429f0352bc19f8bb251d0256ddd2c94bede16eb4569c7ac34dd9c8380d4dc0bed49bdb8fbba354a19a9088370869ea90513e6d192c485a5f2f27d6d6755110bd308edda7118fbcba62507b7758617256f8a535de7b1e0fa23b9aeab82ec0dd34d09000e75c6fd16dccda9c8d2694ecd4f190213f451e0fa23b9aeab82ec0dd34d09000e75c6fd16dccda9c8d2694ecd4f190213f450000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000016345785d8a0000000000000000000000000000000000000000000000000000016345785d8a0000000000000000000000000000000000000000000000000000016345785d8a000000000000000000000000000000000000000000000000000001bc16d674ec80000000000000000000000000000000000000000000000000000214e8348c4f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005068747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d586d6365747046704750516853686a573859313966506273796e354b507768364378776f393448477672744d00000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106102515760003560e01c80636352211e11610139578063b1297e56116100b6578063e0d4ea371161007a578063e0d4ea37146108c8578063e8595c5314610905578063e8a3d48514610930578063e985e9c51461095b578063f0292a0314610998578063f2fde38b146109c357610251565b8063b1297e56146107de578063b88d4fde1461081b578063b91ca62214610844578063c0e7274014610860578063c87b56dd1461088b57610251565b8063938e3d7b116100fd578063938e3d7b1461070d57806394985ddd1461073657806395d89b411461075f5780639e8ed6f71461078a578063a22cb465146107b557610251565b80636352211e1461063a57806370a0823114610677578063715018a6146106b45780638456cb59146106cb5780638da5cb5b146106e257610251565b80633f4ba83a116101d25780634f8e2fdf116101965780634f8e2fdf14610515578063522f68151461054057806355f804b3146105695780635c975abb146105925780635eac1378146105bd5780635f044052146105fd57610251565b80633f4ba83a1461043257806342842e0e1461044957806342966c68146104725780634a1da5411461049b5780634f6ccce7146104d857610251565b806320d0900f1161021957806320d0900f1461034f57806323b872dd1461037857806324198517146103a15780632f745c59146103ca57806333b608631461040757610251565b806301ffc9a71461025657806306fdde0314610293578063081812fc146102be578063095ea7b3146102fb57806318160ddd14610324575b600080fd5b34801561026257600080fd5b5061027d600480360381019061027891906140d4565b6109ec565b60405161028a9190614a2b565b60405180910390f35b34801561029f57600080fd5b506102a86109fe565b6040516102b59190614b14565b60405180910390f35b3480156102ca57600080fd5b506102e560048036038101906102e09190614177565b610a90565b6040516102f29190614986565b60405180910390f35b34801561030757600080fd5b50610322600480360381019061031d9190613fcb565b610b15565b005b34801561033057600080fd5b50610339610c2d565b6040516103469190614f16565b60405180910390f35b34801561035b57600080fd5b50610376600480360381019061037191906141fe565b610c3a565b005b34801561038457600080fd5b5061039f600480360381019061039a9190613eb5565b610e1c565b005b3480156103ad57600080fd5b506103c860048036038101906103c3919061412e565b610e7c565b005b3480156103d657600080fd5b506103f160048036038101906103ec9190613fcb565b610f12565b6040516103fe9190614f16565b60405180910390f35b34801561041357600080fd5b5061041c610fb7565b6040516104299190614986565b60405180910390f35b34801561043e57600080fd5b50610447610fdd565b005b34801561045557600080fd5b50610470600480360381019061046b9190613eb5565b611063565b005b34801561047e57600080fd5b5061049960048036038101906104949190614177565b611083565b005b3480156104a757600080fd5b506104c260048036038101906104bd9190614279565b6110df565b6040516104cf9190614f16565b60405180910390f35b3480156104e457600080fd5b506104ff60048036038101906104fa9190614177565b61111b565b60405161050c9190614f16565b60405180910390f35b34801561052157600080fd5b5061052a61118c565b6040516105379190614986565b60405180910390f35b34801561054c57600080fd5b5061056760048036038101906105629190613e35565b6111b2565b005b34801561057557600080fd5b50610590600480360381019061058b919061412e565b611279565b005b34801561059e57600080fd5b506105a761130f565b6040516105b49190614a2b565b60405180910390f35b3480156105c957600080fd5b506105e460048036038101906105df91906141d1565b611326565b6040516105f49493929190614a46565b60405180910390f35b34801561060957600080fd5b50610624600480360381019061061f919061400b565b611370565b6040516106319190614a2b565b60405180910390f35b34801561064657600080fd5b50610661600480360381019061065c9190614177565b6113b0565b60405161066e9190614986565b60405180910390f35b34801561068357600080fd5b5061069e60048036038101906106999190613e08565b611462565b6040516106ab9190614f16565b60405180910390f35b3480156106c057600080fd5b506106c961151a565b005b3480156106d757600080fd5b506106e06115a2565b005b3480156106ee57600080fd5b506106f7611628565b6040516107049190614986565b60405180910390f35b34801561071957600080fd5b50610734600480360381019061072f919061412e565b611652565b005b34801561074257600080fd5b5061075d60048036038101906107589190614094565b6116e8565b005b34801561076b57600080fd5b50610774611784565b6040516107819190614b14565b60405180910390f35b34801561079657600080fd5b5061079f611816565b6040516107ac9190614f16565b60405180910390f35b3480156107c157600080fd5b506107dc60048036038101906107d79190613f8b565b61181c565b005b3480156107ea57600080fd5b5061080560048036038101906108009190614177565b61199d565b6040516108129190614a8b565b60405180910390f35b34801561082757600080fd5b50610842600480360381019061083d9190613f08565b611b19565b005b61085e600480360381019061085991906142b9565b611b7b565b005b34801561086c57600080fd5b50610875611f58565b6040516108829190614b14565b60405180910390f35b34801561089757600080fd5b506108b260048036038101906108ad9190614177565b611fe6565b6040516108bf9190614b14565b60405180910390f35b3480156108d457600080fd5b506108ef60048036038101906108ea9190614177565b61208d565b6040516108fc9190614f16565b60405180910390f35b34801561091157600080fd5b5061091a612131565b6040516109279190614b14565b60405180910390f35b34801561093c57600080fd5b506109456121bf565b6040516109529190614b14565b60405180910390f35b34801561096757600080fd5b50610982600480360381019061097d9190613e75565b612251565b60405161098f9190614a2b565b60405180910390f35b3480156109a457600080fd5b506109ad6122e5565b6040516109ba9190614f16565b60405180910390f35b3480156109cf57600080fd5b506109ea60048036038101906109e59190613e08565b6122eb565b005b60006109f7826123e3565b9050919050565b606060008054610a0d90615278565b80601f0160208091040260200160405190810160405280929190818152602001828054610a3990615278565b8015610a865780601f10610a5b57610100808354040283529160200191610a86565b820191906000526020600020905b815481529060010190602001808311610a6957829003601f168201915b5050505050905090565b6000610a9b8261245d565b610ada576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad190614d76565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b20826113b0565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8890614e56565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bb06124c9565b73ffffffffffffffffffffffffffffffffffffffff161480610bdf5750610bde81610bd96124c9565b612251565b5b610c1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1590614cd6565b60405180910390fd5b610c2883836124d1565b505050565b6000600880549050905090565b610c426124c9565b73ffffffffffffffffffffffffffffffffffffffff16610c60611628565b73ffffffffffffffffffffffffffffffffffffffff1614610cb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cad90614db6565b60405180910390fd5b821515601160008760ff1660ff16815260200190815260200160002060000160009054906101000a900460ff16151514610d1f5782601160008760ff1660ff16815260200190815260200160002060000160006101000a81548160ff0219169083151502179055505b8160ff16601160008760ff1660ff16815260200190815260200160002060000160019054906101000a900460ff1660ff1614610d8b5781601160008760ff1660ff16815260200190815260200160002060000160016101000a81548160ff021916908360ff1602179055505b83601160008760ff1660ff1681526020019081526020016000206001015414610dd05783601160008760ff1660ff168152602001908152602001600020600101819055505b80601160008760ff1660ff1681526020019081526020016000206002015414610e155780601160008760ff1660ff168152602001908152602001600020600201819055505b5050505050565b610e2d610e276124c9565b8261258a565b610e6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6390614e96565b60405180910390fd5b610e77838383612668565b505050565b610e846124c9565b73ffffffffffffffffffffffffffffffffffffffff16610ea2611628565b73ffffffffffffffffffffffffffffffffffffffff1614610ef8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eef90614db6565b60405180910390fd5b8060149080519060200190610f0e929190613abf565b5050565b6000610f1d83611462565b8210610f5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5590614b76565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610fe56124c9565b73ffffffffffffffffffffffffffffffffffffffff16611003611628565b73ffffffffffffffffffffffffffffffffffffffff1614611059576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105090614db6565b60405180910390fd5b6110616128c4565b565b61107e83838360405180602001604052806000815250611b19565b505050565b61109461108e6124c9565b8261258a565b6110d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ca90614ef6565b60405180910390fd5b6110dc81612966565b50565b60006111138360ff16601160008560ff1660ff16815260200190815260200160002060020154612a7790919063ffffffff16565b905092915050565b6000611125610c2d565b8210611166576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115d90614eb6565b60405180910390fd5b6008828154811061117a57611179615449565b5b90600052602060002001549050919050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6111ba6124c9565b73ffffffffffffffffffffffffffffffffffffffff166111d8611628565b73ffffffffffffffffffffffffffffffffffffffff161461122e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122590614db6565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611274573d6000803e3d6000fd5b505050565b6112816124c9565b73ffffffffffffffffffffffffffffffffffffffff1661129f611628565b73ffffffffffffffffffffffffffffffffffffffff16146112f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ec90614db6565b60405180910390fd5b806012908051906020019061130b929190613abf565b5050565b6000600a60009054906101000a900460ff16905090565b60116020528060005260406000206000915090508060000160009054906101000a900460ff16908060000160019054906101000a900460ff16908060010154908060020154905084565b6000803360405160200161138491906148c0565b6040516020818303038152906040528051906020012090506113a7848483612a8d565b91505092915050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611459576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145090614d16565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ca90614cf6565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6115226124c9565b73ffffffffffffffffffffffffffffffffffffffff16611540611628565b73ffffffffffffffffffffffffffffffffffffffff1614611596576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158d90614db6565b60405180910390fd5b6115a06000612b43565b565b6115aa6124c9565b73ffffffffffffffffffffffffffffffffffffffff166115c8611628565b73ffffffffffffffffffffffffffffffffffffffff161461161e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161590614db6565b60405180910390fd5b611626612c09565b565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61165a6124c9565b73ffffffffffffffffffffffffffffffffffffffff16611678611628565b73ffffffffffffffffffffffffffffffffffffffff16146116ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c590614db6565b60405180910390fd5b80601390805190602001906116e4929190613abf565b5050565b7f000000000000000000000000f0d54349addcf704f77ae15b96510dea15cb795273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176d90614e16565b60405180910390fd5b6117808282612cac565b5050565b60606001805461179390615278565b80601f01602080910402602001604051908101604052809291908181526020018280546117bf90615278565b801561180c5780601f106117e15761010080835404028352916020019161180c565b820191906000526020600020905b8154815290600101906020018083116117ef57829003601f168201915b5050505050905090565b60105481565b6118246124c9565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611892576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188990614c16565b60405180910390fd5b806005600061189f6124c9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661194c6124c9565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516119919190614a2b565b60405180910390a35050565b60006119a76124c9565b73ffffffffffffffffffffffffffffffffffffffff166119c5611628565b73ffffffffffffffffffffffffffffffffffffffff1614611a1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1290614db6565b60405180910390fd5b817f000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611a759190614986565b60206040518083038186803b158015611a8d57600080fd5b505afa158015611aa1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ac591906141a4565b1015611b06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611afd90614cb6565b60405180910390fd5b611b12600f5483612cb7565b9050919050565b611b2a611b246124c9565b8361258a565b611b69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6090614e96565b60405180910390fd5b611b7584848484612e19565b50505050565b601160008560ff1660ff16815260200190815260200160002060000160009054906101000a900460ff16611be4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bdb90614c36565b60405180910390fd5b60008360ff1611611c2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2190614e76565b60405180910390fd5b60008460ff16148015611c4557506000611c4333611462565b145b15611ca757611c60600184611c5a9190615165565b856110df565b341015611ca2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9990614e36565b60405180910390fd5b611cf4565b611cb183856110df565b341015611cf3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cea90614e36565b60405180910390fd5b5b6104578360ff16611d05600c612e75565b611d0f9190615050565b1115611d50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4790614c56565b60405180910390fd5b601160008560ff1660ff16815260200190815260200160002060000160019054906101000a900460ff1660ff168360ff16611d8a33611462565b611d949190615050565b1115611dd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dcc90614d96565b60405180910390fd5b611e3c828280806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050601160008760ff1660ff16815260200190815260200160002060010154611370565b611e7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7290614ed6565b60405180910390fd5b600060405180602001604052806000815250905060005b8460ff16811015611f0257611eb033611eab600c612e75565b612e83565b81611ec3611ebe600c612e75565b612ea1565b604051602001611ed4929190614957565b6040516020818303038152906040529150611eef600c613002565b8080611efa906152db565b915050611e92565b503373ffffffffffffffffffffffffffffffffffffffff167f0c1b180fbb60448c5491c5ddc7c3a923854214b9ff70f90a7821333338971f9282604051611f499190614b14565b60405180910390a25050505050565b60138054611f6590615278565b80601f0160208091040260200160405190810160405280929190818152602001828054611f9190615278565b8015611fde5780601f10611fb357610100808354040283529160200191611fde565b820191906000526020600020905b815481529060010190602001808311611fc157829003601f168201915b505050505081565b6060611ff18261245d565b612030576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202790614df6565b60405180910390fd5b600061203a613018565b9050600081511161205a5760405180602001604052806000815250612085565b8061206484612ea1565b604051602001612075929190614933565b6040516020818303038152906040525b915050919050565b600081612098610c2d565b116120d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120cf90614d36565b60405180910390fd5b600060105414156120ec576000905061212c565b637735940060105483604051602001612106929190614f31565b6040516020818303038152906040528051906020012060001c612129919061535c565b90505b919050565b6014805461213e90615278565b80601f016020809104026020016040519081016040528092919081815260200182805461216a90615278565b80156121b75780601f1061218c576101008083540402835291602001916121b7565b820191906000526020600020905b81548152906001019060200180831161219a57829003601f168201915b505050505081565b6060601380546121ce90615278565b80601f01602080910402602001604051908101604052809291908181526020018280546121fa90615278565b80156122475780601f1061221c57610100808354040283529160200191612247565b820191906000526020600020905b81548152906001019060200180831161222a57829003601f168201915b5050505050905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61045781565b6122f36124c9565b73ffffffffffffffffffffffffffffffffffffffff16612311611628565b73ffffffffffffffffffffffffffffffffffffffff1614612367576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235e90614db6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156123d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ce90614bb6565b60405180910390fd5b6123e081612b43565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806124565750612455826130aa565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612544836113b0565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006125958261245d565b6125d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125cb90614c76565b60405180910390fd5b60006125df836113b0565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061264e57508373ffffffffffffffffffffffffffffffffffffffff1661263684610a90565b73ffffffffffffffffffffffffffffffffffffffff16145b8061265f575061265e8185612251565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612688826113b0565b73ffffffffffffffffffffffffffffffffffffffff16146126de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126d590614dd6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561274e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161274590614bf6565b60405180910390fd5b61275983838361318c565b6127646000826124d1565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127b49190615131565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461280b9190615050565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6128cc61130f565b61290b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161290290614b56565b60405180910390fd5b6000600a60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa61294f6124c9565b60405161295c9190614986565b60405180910390a1565b6000612971826113b0565b905061297f8160008461318c565b61298a6000836124d1565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129da9190615131565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60008183612a8591906150d7565b905092915050565b60008082905060005b8551811015612b35576000868281518110612ab457612ab3615449565b5b60200260200101519050808311612af5578281604051602001612ad89291906148db565b604051602081830303815290604052805190602001209250612b21565b8083604051602001612b089291906148db565b6040516020818303038152906040528051906020012092505b508080612b2d906152db565b915050612a96565b508381149150509392505050565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612c1161130f565b15612c51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c4890614c96565b60405180910390fd5b6001600a60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612c956124c9565b604051612ca29190614986565b60405180910390a1565b806010819055505050565b60007f000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca73ffffffffffffffffffffffffffffffffffffffff16634000aea07f000000000000000000000000f0d54349addcf704f77ae15b96510dea15cb795284866000604051602001612d2b929190614aa6565b6040516020818303038152906040526040518463ffffffff1660e01b8152600401612d58939291906149ed565b602060405180830381600087803b158015612d7257600080fd5b505af1158015612d86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612daa9190614067565b506000612dcd84600030600b60008981526020019081526020016000205461319c565b90506001600b600086815260200190815260200160002054612def9190615050565b600b600086815260200190815260200160002081905550612e1084826131d8565b91505092915050565b612e24848484612668565b612e308484848461320b565b612e6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e6690614b96565b60405180910390fd5b50505050565b600081600001549050919050565b612e9d8282604051806020016040528060008152506133a2565b5050565b60606000821415612ee9576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612ffd565b600082905060005b60008214612f1b578080612f04906152db565b915050600a82612f1491906150a6565b9150612ef1565b60008167ffffffffffffffff811115612f3757612f36615478565b5b6040519080825280601f01601f191660200182016040528015612f695781602001600182028036833780820191505090505b5090505b60008514612ff657600182612f829190615131565b9150600a85612f91919061535c565b6030612f9d9190615050565b60f81b818381518110612fb357612fb2615449565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612fef91906150a6565b9450612f6d565b8093505050505b919050565b6001816000016000828254019250508190555050565b60606012805461302790615278565b80601f016020809104026020016040519081016040528092919081815260200182805461305390615278565b80156130a05780601f10613075576101008083540402835291602001916130a0565b820191906000526020600020905b81548152906001019060200180831161308357829003601f168201915b5050505050905090565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061317557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806131855750613184826133fd565b5b9050919050565b613197838383613467565b505050565b6000848484846040516020016131b59493929190614acf565b6040516020818303038152906040528051906020012060001c9050949350505050565b600082826040516020016131ed929190614907565b60405160208183030381529060405280519060200120905092915050565b600061322c8473ffffffffffffffffffffffffffffffffffffffff166134bf565b15613395578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026132556124c9565b8786866040518563ffffffff1660e01b815260040161327794939291906149a1565b602060405180830381600087803b15801561329157600080fd5b505af19250505080156132c257506040513d601f19601f820116820180604052508101906132bf9190614101565b60015b613345573d80600081146132f2576040519150601f19603f3d011682016040523d82523d6000602084013e6132f7565b606091505b5060008151141561333d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161333490614b96565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061339a565b600190505b949350505050565b6133ac83836134d2565b6133b9600084848461320b565b6133f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133ef90614b96565b60405180910390fd5b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6134728383836136a0565b61347a61130f565b156134ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134b190614b36565b60405180910390fd5b505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613542576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161353990614d56565b60405180910390fd5b61354b8161245d565b1561358b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161358290614bd6565b60405180910390fd5b6135976000838361318c565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546135e79190615050565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6136ab8383836137b4565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156136ee576136e9816137b9565b61372d565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461372c5761372b8382613802565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156137705761376b8161396f565b6137af565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146137ae576137ad8282613a40565b5b5b505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161380f84611462565b6138199190615131565b90506000600760008481526020019081526020016000205490508181146138fe576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506139839190615131565b90506000600960008481526020019081526020016000205490506000600883815481106139b3576139b2615449565b5b9060005260206000200154905080600883815481106139d5576139d4615449565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613a2457613a2361541a565b5b6001900381819060005260206000200160009055905550505050565b6000613a4b83611462565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b828054613acb90615278565b90600052602060002090601f016020900481019282613aed5760008555613b34565b82601f10613b0657805160ff1916838001178555613b34565b82800160010185558215613b34579182015b82811115613b33578251825591602001919060010190613b18565b5b509050613b419190613b45565b5090565b5b80821115613b5e576000816000905550600101613b46565b5090565b6000613b75613b7084614f7f565b614f5a565b90508083825260208201905082856020860282011115613b9857613b976154b1565b5b60005b85811015613bc85781613bae8882613d2e565b845260208401935060208301925050600181019050613b9b565b5050509392505050565b6000613be5613be084614fab565b614f5a565b905082815260208101848484011115613c0157613c006154b6565b5b613c0c848285615236565b509392505050565b6000613c27613c2284614fdc565b614f5a565b905082815260208101848484011115613c4357613c426154b6565b5b613c4e848285615236565b509392505050565b600081359050613c6581615c63565b92915050565b600081359050613c7a81615c7a565b92915050565b60008083601f840112613c9657613c956154ac565b5b8235905067ffffffffffffffff811115613cb357613cb26154a7565b5b602083019150836020820283011115613ccf57613cce6154b1565b5b9250929050565b600082601f830112613ceb57613cea6154ac565b5b8135613cfb848260208601613b62565b91505092915050565b600081359050613d1381615c91565b92915050565b600081519050613d2881615c91565b92915050565b600081359050613d3d81615ca8565b92915050565b600081359050613d5281615cbf565b92915050565b600081519050613d6781615cbf565b92915050565b600082601f830112613d8257613d816154ac565b5b8135613d92848260208601613bd2565b91505092915050565b600082601f830112613db057613daf6154ac565b5b8135613dc0848260208601613c14565b91505092915050565b600081359050613dd881615cd6565b92915050565b600081519050613ded81615cd6565b92915050565b600081359050613e0281615ced565b92915050565b600060208284031215613e1e57613e1d6154c0565b5b6000613e2c84828501613c56565b91505092915050565b60008060408385031215613e4c57613e4b6154c0565b5b6000613e5a85828601613c6b565b9250506020613e6b85828601613dc9565b9150509250929050565b60008060408385031215613e8c57613e8b6154c0565b5b6000613e9a85828601613c56565b9250506020613eab85828601613c56565b9150509250929050565b600080600060608486031215613ece57613ecd6154c0565b5b6000613edc86828701613c56565b9350506020613eed86828701613c56565b9250506040613efe86828701613dc9565b9150509250925092565b60008060008060808587031215613f2257613f216154c0565b5b6000613f3087828801613c56565b9450506020613f4187828801613c56565b9350506040613f5287828801613dc9565b925050606085013567ffffffffffffffff811115613f7357613f726154bb565b5b613f7f87828801613d6d565b91505092959194509250565b60008060408385031215613fa257613fa16154c0565b5b6000613fb085828601613c56565b9250506020613fc185828601613d04565b9150509250929050565b60008060408385031215613fe257613fe16154c0565b5b6000613ff085828601613c56565b925050602061400185828601613dc9565b9150509250929050565b60008060408385031215614022576140216154c0565b5b600083013567ffffffffffffffff8111156140405761403f6154bb565b5b61404c85828601613cd6565b925050602061405d85828601613d2e565b9150509250929050565b60006020828403121561407d5761407c6154c0565b5b600061408b84828501613d19565b91505092915050565b600080604083850312156140ab576140aa6154c0565b5b60006140b985828601613d2e565b92505060206140ca85828601613dc9565b9150509250929050565b6000602082840312156140ea576140e96154c0565b5b60006140f884828501613d43565b91505092915050565b600060208284031215614117576141166154c0565b5b600061412584828501613d58565b91505092915050565b600060208284031215614144576141436154c0565b5b600082013567ffffffffffffffff811115614162576141616154bb565b5b61416e84828501613d9b565b91505092915050565b60006020828403121561418d5761418c6154c0565b5b600061419b84828501613dc9565b91505092915050565b6000602082840312156141ba576141b96154c0565b5b60006141c884828501613dde565b91505092915050565b6000602082840312156141e7576141e66154c0565b5b60006141f584828501613df3565b91505092915050565b600080600080600060a0868803121561421a576142196154c0565b5b600061422888828901613df3565b955050602061423988828901613d2e565b945050604061424a88828901613d04565b935050606061425b88828901613df3565b925050608061426c88828901613dc9565b9150509295509295909350565b600080604083850312156142905761428f6154c0565b5b600061429e85828601613df3565b92505060206142af85828601613df3565b9150509250929050565b600080600080606085870312156142d3576142d26154c0565b5b60006142e187828801613df3565b94505060206142f287828801613df3565b935050604085013567ffffffffffffffff811115614313576143126154bb565b5b61431f87828801613c80565b925092505092959194509250565b61433681615199565b82525050565b61434d61434882615199565b615324565b82525050565b61435c816151bd565b82525050565b61436b816151c9565b82525050565b61438261437d826151c9565b615336565b82525050565b60006143938261500d565b61439d8185615023565b93506143ad818560208601615245565b6143b6816154c5565b840191505092915050565b60006143cc82615018565b6143d68185615034565b93506143e6818560208601615245565b6143ef816154c5565b840191505092915050565b600061440582615018565b61440f8185615045565b935061441f818560208601615245565b80840191505092915050565b6000614438602b83615034565b9150614443826154e3565b604082019050919050565b600061445b601483615034565b915061446682615532565b602082019050919050565b600061447e602b83615034565b91506144898261555b565b604082019050919050565b60006144a1603283615034565b91506144ac826155aa565b604082019050919050565b60006144c4602683615034565b91506144cf826155f9565b604082019050919050565b60006144e7601c83615034565b91506144f282615648565b602082019050919050565b600061450a600183615045565b915061451582615671565b600182019050919050565b600061452d602483615034565b91506145388261569a565b604082019050919050565b6000614550601983615034565b915061455b826156e9565b602082019050919050565b6000614573601a83615034565b915061457e82615712565b602082019050919050565b6000614596600983615034565b91506145a18261573b565b602082019050919050565b60006145b9602c83615034565b91506145c482615764565b604082019050919050565b60006145dc601083615034565b91506145e7826157b3565b602082019050919050565b60006145ff600f83615034565b915061460a826157dc565b602082019050919050565b6000614622603883615034565b915061462d82615805565b604082019050919050565b6000614645602a83615034565b915061465082615854565b604082019050919050565b6000614668602983615034565b9150614673826158a3565b604082019050919050565b600061468b600f83615034565b9150614696826158f2565b602082019050919050565b60006146ae602083615034565b91506146b98261591b565b602082019050919050565b60006146d1602c83615034565b91506146dc82615944565b604082019050919050565b60006146f4600883615034565b91506146ff82615993565b602082019050919050565b6000614717602083615034565b9150614722826159bc565b602082019050919050565b600061473a602983615034565b9150614745826159e5565b604082019050919050565b600061475d602f83615034565b915061476882615a34565b604082019050919050565b6000614780601f83615034565b915061478b82615a83565b602082019050919050565b60006147a3601183615034565b91506147ae82615aac565b602082019050919050565b60006147c6602183615034565b91506147d182615ad5565b604082019050919050565b60006147e9601d83615034565b91506147f482615b24565b602082019050919050565b600061480c603183615034565b915061481782615b4d565b604082019050919050565b600061482f602c83615034565b915061483a82615b9c565b604082019050919050565b6000614852600d83615034565b915061485d82615beb565b602082019050919050565b6000614875603083615034565b915061488082615c14565b604082019050919050565b6148948161521f565b82525050565b6148ab6148a68261521f565b615352565b82525050565b6148ba81615229565b82525050565b60006148cc828461433c565b60148201915081905092915050565b60006148e78285614371565b6020820191506148f78284614371565b6020820191508190509392505050565b60006149138285614371565b602082019150614923828461489a565b6020820191508190509392505050565b600061493f82856143fa565b915061494b82846143fa565b91508190509392505050565b600061496382856143fa565b915061496f82846143fa565b915061497a826144fd565b91508190509392505050565b600060208201905061499b600083018461432d565b92915050565b60006080820190506149b6600083018761432d565b6149c3602083018661432d565b6149d0604083018561488b565b81810360608301526149e28184614388565b905095945050505050565b6000606082019050614a02600083018661432d565b614a0f602083018561488b565b8181036040830152614a218184614388565b9050949350505050565b6000602082019050614a406000830184614353565b92915050565b6000608082019050614a5b6000830187614353565b614a6860208301866148b1565b614a756040830185614362565b614a82606083018461488b565b95945050505050565b6000602082019050614aa06000830184614362565b92915050565b6000604082019050614abb6000830185614362565b614ac8602083018461488b565b9392505050565b6000608082019050614ae46000830187614362565b614af1602083018661488b565b614afe604083018561432d565b614b0b606083018461488b565b95945050505050565b60006020820190508181036000830152614b2e81846143c1565b905092915050565b60006020820190508181036000830152614b4f8161442b565b9050919050565b60006020820190508181036000830152614b6f8161444e565b9050919050565b60006020820190508181036000830152614b8f81614471565b9050919050565b60006020820190508181036000830152614baf81614494565b9050919050565b60006020820190508181036000830152614bcf816144b7565b9050919050565b60006020820190508181036000830152614bef816144da565b9050919050565b60006020820190508181036000830152614c0f81614520565b9050919050565b60006020820190508181036000830152614c2f81614543565b9050919050565b60006020820190508181036000830152614c4f81614566565b9050919050565b60006020820190508181036000830152614c6f81614589565b9050919050565b60006020820190508181036000830152614c8f816145ac565b9050919050565b60006020820190508181036000830152614caf816145cf565b9050919050565b60006020820190508181036000830152614ccf816145f2565b9050919050565b60006020820190508181036000830152614cef81614615565b9050919050565b60006020820190508181036000830152614d0f81614638565b9050919050565b60006020820190508181036000830152614d2f8161465b565b9050919050565b60006020820190508181036000830152614d4f8161467e565b9050919050565b60006020820190508181036000830152614d6f816146a1565b9050919050565b60006020820190508181036000830152614d8f816146c4565b9050919050565b60006020820190508181036000830152614daf816146e7565b9050919050565b60006020820190508181036000830152614dcf8161470a565b9050919050565b60006020820190508181036000830152614def8161472d565b9050919050565b60006020820190508181036000830152614e0f81614750565b9050919050565b60006020820190508181036000830152614e2f81614773565b9050919050565b60006020820190508181036000830152614e4f81614796565b9050919050565b60006020820190508181036000830152614e6f816147b9565b9050919050565b60006020820190508181036000830152614e8f816147dc565b9050919050565b60006020820190508181036000830152614eaf816147ff565b9050919050565b60006020820190508181036000830152614ecf81614822565b9050919050565b60006020820190508181036000830152614eef81614845565b9050919050565b60006020820190508181036000830152614f0f81614868565b9050919050565b6000602082019050614f2b600083018461488b565b92915050565b6000604082019050614f46600083018561488b565b614f53602083018461488b565b9392505050565b6000614f64614f75565b9050614f7082826152aa565b919050565b6000604051905090565b600067ffffffffffffffff821115614f9a57614f99615478565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614fc657614fc5615478565b5b614fcf826154c5565b9050602081019050919050565b600067ffffffffffffffff821115614ff757614ff6615478565b5b615000826154c5565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061505b8261521f565b91506150668361521f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561509b5761509a61538d565b5b828201905092915050565b60006150b18261521f565b91506150bc8361521f565b9250826150cc576150cb6153bc565b5b828204905092915050565b60006150e28261521f565b91506150ed8361521f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156151265761512561538d565b5b828202905092915050565b600061513c8261521f565b91506151478361521f565b92508282101561515a5761515961538d565b5b828203905092915050565b600061517082615229565b915061517b83615229565b92508282101561518e5761518d61538d565b5b828203905092915050565b60006151a4826151ff565b9050919050565b60006151b6826151ff565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015615263578082015181840152602081019050615248565b83811115615272576000848401525b50505050565b6000600282049050600182168061529057607f821691505b602082108114156152a4576152a36153eb565b5b50919050565b6152b3826154c5565b810181811067ffffffffffffffff821117156152d2576152d1615478565b5b80604052505050565b60006152e68261521f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156153195761531861538d565b5b600182019050919050565b600061532f82615340565b9050919050565b6000819050919050565b600061534b826154d6565b9050919050565b6000819050919050565b60006153678261521f565b91506153728361521f565b925082615382576153816153bc565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4552433732315061757361626c653a20746f6b656e207472616e73666572207760008201527f68696c6520706175736564000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f2c00000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f52656465656d3a2077696e646f77206973206e6f74206f70656e000000000000600082015250565b7f4d6178206c696d69740000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4e6f7420656e6f756768204c494e4b0000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f546f6b656e204e6f7420466f756e640000000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f546f6f206d616e79000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4f6e6c7920565246436f6f7264696e61746f722063616e2066756c66696c6c00600082015250565b7f56616c75652062656c6f77207072696365000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f52656465656d3a20616d6f756e742063616e6e6f74206265207a65726f000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f496e76616c69642070726f6f6600000000000000000000000000000000000000600082015250565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b615c6c81615199565b8114615c7757600080fd5b50565b615c83816151ab565b8114615c8e57600080fd5b50565b615c9a816151bd565b8114615ca557600080fd5b50565b615cb1816151c9565b8114615cbc57600080fd5b50565b615cc8816151d3565b8114615cd357600080fd5b50565b615cdf8161521f565b8114615cea57600080fd5b50565b615cf681615229565b8114615d0157600080fd5b5056fea264697066735822122046b1ba31fbd2b2fbb37b09ef5961fecce9841c1b7552bacc029475f6bbac255d64736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000001c00000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000420000000000000000000000000f0d54349addcf704f77ae15b96510dea15cb7952000000000000000000000000514910771af9ca656af840dff83e8264ecf986caaa77729d3466ca35ae8d28b3bbac7cc36a5031efdc430821c02bc31a238af445000000000000000000000000000000000000000000000000000000000000000a576176656c656e677468000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002574c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000589f3e4a0c95991077e7efe429f0352bc19f8bb251d0256ddd2c94bede16eb4569c7ac34dd9c8380d4dc0bed49bdb8fbba354a19a9088370869ea90513e6d192c485a5f2f27d6d6755110bd308edda7118fbcba62507b7758617256f8a535de7b1e0fa23b9aeab82ec0dd34d09000e75c6fd16dccda9c8d2694ecd4f190213f451e0fa23b9aeab82ec0dd34d09000e75c6fd16dccda9c8d2694ecd4f190213f450000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000016345785d8a0000000000000000000000000000000000000000000000000000016345785d8a0000000000000000000000000000000000000000000000000000016345785d8a000000000000000000000000000000000000000000000000000001bc16d674ec80000000000000000000000000000000000000000000000000000214e8348c4f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005068747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d586d6365747046704750516853686a573859313966506273796e354b507768364378776f393448477672744d00000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _name (string): Wavelength
Arg [1] : _symbol (string): WL
Arg [2] : _maxRedeemPerWallet (uint8[]): 16,2,1,1,1
Arg [3] : _merkleRoots (bytes32[]): System.Byte[],System.Byte[],System.Byte[],System.Byte[],System.Byte[]
Arg [4] : _prices (uint256[]): 100000000000000000,100000000000000000,100000000000000000,125000000000000000,150000000000000000
Arg [5] : _baseTokenURI (string):
Arg [6] : _contractMetaDataURI (string): https://gateway.pinata.cloud/ipfs/QmXmcetpFpGPQhShjW8Y19fPbsyn5KPwh6Cxwo94HGvrtM
Arg [7] : _VRFCoordinator (address): 0xf0d54349aDdcf704F77AE15b96510dEA15cb7952
Arg [8] : _LinkToken (address): 0x514910771AF9Ca656af840dff83E8264EcF986CA
Arg [9] : _keyHash (bytes32): 0xaa77729d3466ca35ae8d28b3bbac7cc36a5031efdc430821c02bc31a238af445
-----Encoded View---------------
37 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000180
Arg [2] : 00000000000000000000000000000000000000000000000000000000000001c0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000280
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000340
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000400
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000420
Arg [7] : 000000000000000000000000f0d54349addcf704f77ae15b96510dea15cb7952
Arg [8] : 000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca
Arg [9] : aa77729d3466ca35ae8d28b3bbac7cc36a5031efdc430821c02bc31a238af445
Arg [10] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [11] : 576176656c656e67746800000000000000000000000000000000000000000000
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [13] : 574c000000000000000000000000000000000000000000000000000000000000
Arg [14] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [15] : 0000000000000000000000000000000000000000000000000000000000000010
Arg [16] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [17] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [18] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [19] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [20] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [21] : 89f3e4a0c95991077e7efe429f0352bc19f8bb251d0256ddd2c94bede16eb456
Arg [22] : 9c7ac34dd9c8380d4dc0bed49bdb8fbba354a19a9088370869ea90513e6d192c
Arg [23] : 485a5f2f27d6d6755110bd308edda7118fbcba62507b7758617256f8a535de7b
Arg [24] : 1e0fa23b9aeab82ec0dd34d09000e75c6fd16dccda9c8d2694ecd4f190213f45
Arg [25] : 1e0fa23b9aeab82ec0dd34d09000e75c6fd16dccda9c8d2694ecd4f190213f45
Arg [26] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [27] : 000000000000000000000000000000000000000000000000016345785d8a0000
Arg [28] : 000000000000000000000000000000000000000000000000016345785d8a0000
Arg [29] : 000000000000000000000000000000000000000000000000016345785d8a0000
Arg [30] : 00000000000000000000000000000000000000000000000001bc16d674ec8000
Arg [31] : 0000000000000000000000000000000000000000000000000214e8348c4f0000
Arg [32] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [33] : 0000000000000000000000000000000000000000000000000000000000000050
Arg [34] : 68747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066
Arg [35] : 732f516d586d6365747046704750516853686a573859313966506273796e354b
Arg [36] : 507768364378776f393448477672744d00000000000000000000000000000000
Deployed Bytecode Sourcemap
71231:9757:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78851:188;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51015:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52574:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52097:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63763:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74662:854;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53464:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;79853:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63431:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71568:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74201:76;;;;;;;;;;;;;:::i;:::-;;53874:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69728:245;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;78679:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63953:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71604:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75688:123;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;79184:128;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27398:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71856:59;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;77827:254;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50709:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50439:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30233:94;;;;;;;;;;;;;:::i;:::-;;74015:72;;;;;;;;;;;;;:::i;:::-;;29582:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;79957:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13134:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51184:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71666:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52867:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80293:209;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54130:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76112:1541;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71972:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51359:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80673:312;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72005:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80063:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53233:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71505:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30482:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;78851:188;78971:4;78995:36;79019:11;78995:23;:36::i;:::-;78988:43;;78851:188;;;:::o;51015:100::-;51069:13;51102:5;51095:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51015:100;:::o;52574:221::-;52650:7;52678:16;52686:7;52678;:16::i;:::-;52670:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;52763:15;:24;52779:7;52763:24;;;;;;;;;;;;;;;;;;;;;52756:31;;52574:221;;;:::o;52097:411::-;52178:13;52194:23;52209:7;52194:14;:23::i;:::-;52178:39;;52242:5;52236:11;;:2;:11;;;;52228:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;52336:5;52320:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;52345:37;52362:5;52369:12;:10;:12::i;:::-;52345:16;:37::i;:::-;52320:62;52298:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;52479:21;52488:2;52492:7;52479:8;:21::i;:::-;52167:341;52097:411;;:::o;63763:113::-;63824:7;63851:10;:17;;;;63844:24;;63763:113;:::o;74662:854::-;29813:12;:10;:12::i;:::-;29802:23;;:7;:5;:7::i;:::-;:23;;;29794:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;74919:5:::1;74882:42;;:17;:28;74900:9;74882:28;;;;;;;;;;;;;;;:33;;;;;;;;;;;;:42;;;74879:124;;74986:5;74950:17;:28;74968:9;74950:28;;;;;;;;;;;;;;;:33;;;:41;;;;;;;;;;;;;;;;;;74879:124;75067:13;75016:64;;:17;:28;75034:9;75016:28;;;;;;;;;;;;;;;:47;;;;;;;;;;;;:64;;;75013:168;;75156:13;75106:17;:28;75124:9;75106:28;;;;;;;;;;;;;;;:47;;;:63;;;;;;;;;;;;;;;;;;75013:168;75237:11;75194:17;:28;75212:9;75194:28;;;;;;;;;;;;;;;:39;;;:54;75191:148;;75316:11;75274:17;:28;75292:9;75274:28;;;;;;;;;;;;;;;:39;;:53;;;;75191:148;75398:14;75352:17;:28;75370:9;75352:28;;;;;;;;;;;;;;;:42;;;:60;75349:160;;75483:14;75438:17;:28;75456:9;75438:28;;;;;;;;;;;;;;;:42;;:59;;;;75349:160;74662:854:::0;;;;;:::o;53464:339::-;53659:41;53678:12;:10;:12::i;:::-;53692:7;53659:18;:41::i;:::-;53651:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;53767:28;53777:4;53783:2;53787:7;53767:9;:28::i;:::-;53464:339;;;:::o;79853:94::-;29813:12;:10;:12::i;:::-;29802:23;;:7;:5;:7::i;:::-;:23;;;29794:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;79936:3:::1;79923:10;:16;;;;;;;;;;;;:::i;:::-;;79853:94:::0;:::o;63431:256::-;63528:7;63564:23;63581:5;63564:16;:23::i;:::-;63556:5;:31;63548:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;63653:12;:19;63666:5;63653:19;;;;;;;;;;;;;;;:26;63673:5;63653:26;;;;;;;;;;;;63646:33;;63431:256;;;;:::o;71568:29::-;;;;;;;;;;;;;:::o;74201:76::-;29813:12;:10;:12::i;:::-;29802:23;;:7;:5;:7::i;:::-;:23;;;29794:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;74259:10:::1;:8;:10::i;:::-;74201:76::o:0;53874:185::-;54012:39;54029:4;54035:2;54039:7;54012:39;;;;;;;;;;;;:16;:39::i;:::-;53874:185;;;:::o;69728:245::-;69846:41;69865:12;:10;:12::i;:::-;69879:7;69846:18;:41::i;:::-;69838:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;69951:14;69957:7;69951:5;:14::i;:::-;69728:245;:::o;78679:164::-;78750:7;78777:58;78827:7;78777:58;;:17;:31;78795:12;78777:31;;;;;;;;;;;;;;;:45;;;:49;;:58;;;;:::i;:::-;78770:65;;78679:164;;;;:::o;63953:233::-;64028:7;64064:30;:28;:30::i;:::-;64056:5;:38;64048:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;64161:10;64172:5;64161:17;;;;;;;;:::i;:::-;;;;;;;;;;64154:24;;63953:233;;;:::o;71604:24::-;;;;;;;;;;;;;:::o;75688:123::-;29813:12;:10;:12::i;:::-;29802:23;;:7;:5;:7::i;:::-;:23;;;29794:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;75782:3:::1;:12;;:21;75795:7;75782:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;75688:123:::0;;:::o;79184:128::-;29813:12;:10;:12::i;:::-;29802:23;;:7;:5;:7::i;:::-;:23;;;29794:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;79287:13:::1;79272:12;:28;;;;;;;;;;;;:::i;:::-;;79184:128:::0;:::o;27398:86::-;27445:4;27469:7;;;;;;;;;;;27462:14;;27398:86;:::o;71856:59::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;77827:254::-;77940:4;77964:12;78006:10;77989:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;77979:39;;;;;;77964:54;;78036:37;78055:5;78062:4;78068;78036:18;:37::i;:::-;78029:44;;;77827:254;;;;:::o;50709:239::-;50781:7;50801:13;50817:7;:16;50825:7;50817:16;;;;;;;;;;;;;;;;;;;;;50801:32;;50869:1;50852:19;;:5;:19;;;;50844:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;50935:5;50928:12;;;50709:239;;;:::o;50439:208::-;50511:7;50556:1;50539:19;;:5;:19;;;;50531:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;50623:9;:16;50633:5;50623:16;;;;;;;;;;;;;;;;50616:23;;50439:208;;;:::o;30233:94::-;29813:12;:10;:12::i;:::-;29802:23;;:7;:5;:7::i;:::-;:23;;;29794:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;30298:21:::1;30316:1;30298:9;:21::i;:::-;30233:94::o:0;74015:72::-;29813:12;:10;:12::i;:::-;29802:23;;:7;:5;:7::i;:::-;:23;;;29794:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;74071:8:::1;:6;:8::i;:::-;74015:72::o:0;29582:87::-;29628:7;29655:6;;;;;;;;;;;29648:13;;29582:87;:::o;79957:98::-;29813:12;:10;:12::i;:::-;29802:23;;:7;:5;:7::i;:::-;:23;;;29794:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;80044:3:::1;80029:12;:18;;;;;;;;;;;;:::i;:::-;;79957:98:::0;:::o;13134:233::-;13264:14;13250:28;;:10;:28;;;13242:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;13321:40;13339:9;13350:10;13321:17;:40::i;:::-;13134:233;;:::o;51184:104::-;51240:13;51273:7;51266:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51184:104;:::o;71666:23::-;;;;:::o;52867:295::-;52982:12;:10;:12::i;:::-;52970:24;;:8;:24;;;;52962:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;53082:8;53037:18;:32;53056:12;:10;:12::i;:::-;53037:32;;;;;;;;;;;;;;;:42;53070:8;53037:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;53135:8;53106:48;;53121:12;:10;:12::i;:::-;53106:48;;;53145:8;53106:48;;;;;;:::i;:::-;;;;;;;;52867:295;;:::o;80293:209::-;80351:17;29813:12;:10;:12::i;:::-;29802:23;;:7;:5;:7::i;:::-;:23;;;29794:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;80422:3:::1;80389:4;:14;;;80412:4;80389:29;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:36;;80381:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;80463:31;80481:7;;80490:3;80463:17;:31::i;:::-;80456:38;;80293:209:::0;;;:::o;54130:328::-;54305:41;54324:12;:10;:12::i;:::-;54338:7;54305:18;:41::i;:::-;54297:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;54411:39;54425:4;54431:2;54435:7;54444:5;54411:13;:39::i;:::-;54130:328;;;;:::o;76112:1541::-;76256:17;:30;76274:11;76256:30;;;;;;;;;;;;;;;:35;;;;;;;;;;;;76248:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;76350:1;76341:6;:10;;;76333:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;76548:1;76533:11;:16;;;:46;;;;;76578:1;76553:21;76563:10;76553:9;:21::i;:::-;:26;76533:46;76529:279;;;76626:28;76639:1;76632:6;:8;;;;:::i;:::-;76642:11;76626:5;:28::i;:::-;76613:9;:41;;76605:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;76529:279;;;76748:26;76754:6;76762:11;76748:5;:26::i;:::-;76735:9;:39;;76727:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;76529:279;71537:4;76924:6;76897:33;;:24;:14;:22;:24::i;:::-;:33;;;;:::i;:::-;:45;;76889:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;77076:17;:30;77094:11;77076:30;;;;;;;;;;;;;;;:49;;;;;;;;;;;;77041:84;;77065:6;77041:30;;:21;77051:10;77041:9;:21::i;:::-;:30;;;;:::i;:::-;:84;;77033:105;;;;;;;;;;;;:::i;:::-;;;;;;;;;77194:73;77212:11;;77194:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77225:17;:30;77243:11;77225:30;;;;;;;;;;;;;;;:41;;;77194:17;:73::i;:::-;77186:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;77307:20;:25;;;;;;;;;;;;;;77349:9;77345:259;77368:6;77364:10;;:1;:10;77345:259;;;77396:47;77406:10;77418:24;:14;:22;:24::i;:::-;77396:9;:47::i;:::-;77501:6;77509:35;:24;:14;:22;:24::i;:::-;:33;:35::i;:::-;77484:66;;;;;;;;;:::i;:::-;;;;;;;;;;;;;77468:83;;77566:26;:14;:24;:26::i;:::-;77376:3;;;;;:::i;:::-;;;;77345:259;;;;77626:10;77619:26;;;77638:6;77619:26;;;;;;:::i;:::-;;;;;;;;76216:1437;76112:1541;;;;:::o;71972:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;51359:334::-;51432:13;51466:16;51474:7;51466;:16::i;:::-;51458:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;51547:21;51571:10;:8;:10::i;:::-;51547:34;;51623:1;51605:7;51599:21;:25;:86;;;;;;;;;;;;;;;;;51651:7;51660:18;:7;:16;:18::i;:::-;51634:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51599:86;51592:93;;;51359:334;;;:::o;80673:312::-;80728:7;80775;80761:13;:11;:13::i;:::-;:21;80753:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;80831:1;80819:8;;:13;80815:163;;;80855:1;80848:8;;;;80815:163;80956:10;80933:8;;80943:7;80922:29;;;;;;;;;:::i;:::-;;;;;;;;;;;;;80912:40;;;;;;80904:49;;:62;;;;:::i;:::-;80897:69;;80673:312;;;;:::o;72005:24::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;80063:97::-;80107:13;80140:12;80133:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;80063:97;:::o;53233:164::-;53330:4;53354:18;:25;53373:5;53354:25;;;;;;;;;;;;;;;:35;53380:8;53354:35;;;;;;;;;;;;;;;;;;;;;;;;;53347:42;;53233:164;;;;:::o;71505:36::-;71537:4;71505:36;:::o;30482:192::-;29813:12;:10;:12::i;:::-;29802:23;;:7;:5;:7::i;:::-;:23;;;29794:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;30591:1:::1;30571:22;;:8;:22;;;;30563:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30647:19;30657:8;30647:9;:19::i;:::-;30482:192:::0;:::o;63123:224::-;63225:4;63264:35;63249:50;;;:11;:50;;;;:90;;;;63303:36;63327:11;63303:23;:36::i;:::-;63249:90;63242:97;;63123:224;;;:::o;55968:127::-;56033:4;56085:1;56057:30;;:7;:16;56065:7;56057:16;;;;;;;;;;;;;;;;;;;;;:30;;;;56050:37;;55968:127;;;:::o;26110:98::-;26163:7;26190:10;26183:17;;26110:98;:::o;59950:174::-;60052:2;60025:15;:24;60041:7;60025:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;60108:7;60104:2;60070:46;;60079:23;60094:7;60079:14;:23::i;:::-;60070:46;;;;;;;;;;;;59950:174;;:::o;56262:348::-;56355:4;56380:16;56388:7;56380;:16::i;:::-;56372:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;56456:13;56472:23;56487:7;56472:14;:23::i;:::-;56456:39;;56525:5;56514:16;;:7;:16;;;:51;;;;56558:7;56534:31;;:20;56546:7;56534:11;:20::i;:::-;:31;;;56514:51;:87;;;;56569:32;56586:5;56593:7;56569:16;:32::i;:::-;56514:87;56506:96;;;56262:348;;;;:::o;59254:578::-;59413:4;59386:31;;:23;59401:7;59386:14;:23::i;:::-;:31;;;59378:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;59496:1;59482:16;;:2;:16;;;;59474:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;59552:39;59573:4;59579:2;59583:7;59552:20;:39::i;:::-;59656:29;59673:1;59677:7;59656:8;:29::i;:::-;59717:1;59698:9;:15;59708:4;59698:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;59746:1;59729:9;:13;59739:2;59729:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;59777:2;59758:7;:16;59766:7;59758:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;59816:7;59812:2;59797:27;;59806:4;59797:27;;;;;;;;;;;;59254:578;;;:::o;28457:120::-;28001:8;:6;:8::i;:::-;27993:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;28526:5:::1;28516:7;;:15;;;;;;;;;;;;;;;;;;28547:22;28556:12;:10;:12::i;:::-;28547:22;;;;;;:::i;:::-;;;;;;;;28457:120::o:0;58557:360::-;58617:13;58633:23;58648:7;58633:14;:23::i;:::-;58617:39;;58669:48;58690:5;58705:1;58709:7;58669:20;:48::i;:::-;58758:29;58775:1;58779:7;58758:8;:29::i;:::-;58820:1;58800:9;:16;58810:5;58800:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;58839:7;:16;58847:7;58839:16;;;;;;;;;;;;58832:23;;;;;;;;;;;58901:7;58897:1;58873:36;;58882:5;58873:36;;;;;;;;;;;;58606:311;58557:360;:::o;16904:98::-;16962:7;16993:1;16989;:5;;;;:::i;:::-;16982:12;;16904:98;;;;:::o;21168:830::-;21293:4;21310:20;21333:4;21310:27;;21355:9;21350:525;21374:5;:12;21370:1;:16;21350:525;;;21408:20;21431:5;21437:1;21431:8;;;;;;;;:::i;:::-;;;;;;;;21408:31;;21476:12;21460;:28;21456:408;;21630:12;21644;21613:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;21603:55;;;;;;21588:70;;21456:408;;;21820:12;21834;21803:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;21793:55;;;;;;21778:70;;21456:408;21393:482;21388:3;;;;;:::i;:::-;;;;21350:525;;;;21986:4;21970:12;:20;21963:27;;;21168:830;;;;;:::o;30682:173::-;30738:16;30757:6;;;;;;;;;;;30738:25;;30783:8;30774:6;;:17;;;;;;;;;;;;;;;;;;30838:8;30807:40;;30828:8;30807:40;;;;;;;;;;;;30727:128;30682:173;:::o;28198:118::-;27724:8;:6;:8::i;:::-;27723:9;27715:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;28268:4:::1;28258:7;;:14;;;;;;;;;;;;;;;;;;28288:20;28295:12;:10;:12::i;:::-;28288:20;;;;;;:::i;:::-;;;;;;;;28198:118::o:0;78326:124::-;78432:10;78421:8;:21;;;;78326:124;;:::o;11198:1077::-;11308:17;11343:4;:20;;;11364:14;11380:4;11397:8;10028:1;11386:43;;;;;;;;;:::i;:::-;;;;;;;;;;;;;11343:87;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;11665:15;11684:82;11701:8;10028:1;11742:4;11749:6;:16;11756:8;11749:16;;;;;;;;;;;;11684;:82::i;:::-;11665:101;;12222:1;12203:6;:16;12210:8;12203:16;;;;;;;;;;;;:20;;;;:::i;:::-;12184:6;:16;12191:8;12184:16;;;;;;;;;;;:39;;;;12237:32;12251:8;12261:7;12237:13;:32::i;:::-;12230:39;;;11198:1077;;;;:::o;55340:315::-;55497:28;55507:4;55513:2;55517:7;55497:9;:28::i;:::-;55544:48;55567:4;55573:2;55577:7;55586:5;55544:22;:48::i;:::-;55536:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;55340:315;;;;:::o;22822:114::-;22887:7;22914;:14;;;22907:21;;22822:114;;;:::o;56952:110::-;57028:26;57038:2;57042:7;57028:26;;;;;;;;;;;;:9;:26::i;:::-;56952:110;;:::o;23726:723::-;23782:13;24012:1;24003:5;:10;23999:53;;;24030:10;;;;;;;;;;;;;;;;;;;;;23999:53;24062:12;24077:5;24062:20;;24093:14;24118:78;24133:1;24125:4;:9;24118:78;;24151:8;;;;;:::i;:::-;;;;24182:2;24174:10;;;;;:::i;:::-;;;24118:78;;;24206:19;24238:6;24228:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24206:39;;24256:154;24272:1;24263:5;:10;24256:154;;24300:1;24290:11;;;;;:::i;:::-;;;24367:2;24359:5;:10;;;;:::i;:::-;24346:2;:24;;;;:::i;:::-;24333:39;;24316:6;24323;24316:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;24396:2;24387:11;;;;;:::i;:::-;;;24256:154;;;24434:6;24420:21;;;;;23726:723;;;;:::o;22944:127::-;23051:1;23033:7;:14;;;:19;;;;;;;;;;;22944:127;:::o;79379:109::-;79431:13;79468:12;79461:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79379:109;:::o;50070:305::-;50172:4;50224:25;50209:40;;;:11;:40;;;;:105;;;;50281:33;50266:48;;;:11;:48;;;;50209:105;:158;;;;50331:36;50355:11;50331:23;:36::i;:::-;50209:158;50189:178;;50070:305;;;:::o;79500:205::-;79652:45;79679:4;79685:2;79689:7;79652:26;:45::i;:::-;79500:205;;;:::o;848:279::-;1018:7;1079:8;1089:9;1100:10;1112:6;1068:51;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1058:62;;;;;;1050:71;;1043:78;;848:279;;;;;;:::o;1518:215::-;1643:7;1702:8;1712:13;1685:41;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1675:52;;;;;;1668:59;;1518:215;;;;:::o;60689:799::-;60844:4;60865:15;:2;:13;;;:15::i;:::-;60861:620;;;60917:2;60901:36;;;60938:12;:10;:12::i;:::-;60952:4;60958:7;60967:5;60901:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;60897:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61160:1;61143:6;:13;:18;61139:272;;;61186:60;;;;;;;;;;:::i;:::-;;;;;;;;61139:272;61361:6;61355:13;61346:6;61342:2;61338:15;61331:38;60897:529;61034:41;;;61024:51;;;:6;:51;;;;61017:58;;;;;60861:620;61465:4;61458:11;;60689:799;;;;;;;:::o;57289:321::-;57419:18;57425:2;57429:7;57419:5;:18::i;:::-;57470:54;57501:1;57505:2;57509:7;57518:5;57470:22;:54::i;:::-;57448:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;57289:321;;;:::o;41568:157::-;41653:4;41692:25;41677:40;;;:11;:40;;;;41670:47;;41568:157;;;:::o;70579:275::-;70723:45;70750:4;70756:2;70760:7;70723:26;:45::i;:::-;70790:8;:6;:8::i;:::-;70789:9;70781:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;70579:275;;;:::o;31628:387::-;31688:4;31896:12;31963:7;31951:20;31943:28;;32006:1;31999:4;:8;31992:15;;;31628:387;;;:::o;57946:382::-;58040:1;58026:16;;:2;:16;;;;58018:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;58099:16;58107:7;58099;:16::i;:::-;58098:17;58090:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;58161:45;58190:1;58194:2;58198:7;58161:20;:45::i;:::-;58236:1;58219:9;:13;58229:2;58219:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;58267:2;58248:7;:16;58256:7;58248:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;58312:7;58308:2;58287:33;;58304:1;58287:33;;;;;;;;;;;;57946:382;;:::o;64799:589::-;64943:45;64970:4;64976:2;64980:7;64943:26;:45::i;:::-;65021:1;65005:18;;:4;:18;;;65001:187;;;65040:40;65072:7;65040:31;:40::i;:::-;65001:187;;;65110:2;65102:10;;:4;:10;;;65098:90;;65129:47;65162:4;65168:7;65129:32;:47::i;:::-;65098:90;65001:187;65216:1;65202:16;;:2;:16;;;65198:183;;;65235:45;65272:7;65235:36;:45::i;:::-;65198:183;;;65308:4;65302:10;;:2;:10;;;65298:83;;65329:40;65357:2;65361:7;65329:27;:40::i;:::-;65298:83;65198:183;64799:589;;;:::o;62060:126::-;;;;:::o;66111:164::-;66215:10;:17;;;;66188:15;:24;66204:7;66188:24;;;;;;;;;;;:44;;;;66243:10;66259:7;66243:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66111:164;:::o;66902:988::-;67168:22;67218:1;67193:22;67210:4;67193:16;:22::i;:::-;:26;;;;:::i;:::-;67168:51;;67230:18;67251:17;:26;67269:7;67251:26;;;;;;;;;;;;67230:47;;67398:14;67384:10;:28;67380:328;;67429:19;67451:12;:18;67464:4;67451:18;;;;;;;;;;;;;;;:34;67470:14;67451:34;;;;;;;;;;;;67429:56;;67535:11;67502:12;:18;67515:4;67502:18;;;;;;;;;;;;;;;:30;67521:10;67502:30;;;;;;;;;;;:44;;;;67652:10;67619:17;:30;67637:11;67619:30;;;;;;;;;;;:43;;;;67414:294;67380:328;67804:17;:26;67822:7;67804:26;;;;;;;;;;;67797:33;;;67848:12;:18;67861:4;67848:18;;;;;;;;;;;;;;;:34;67867:14;67848:34;;;;;;;;;;;67841:41;;;66983:907;;66902:988;;:::o;68185:1079::-;68438:22;68483:1;68463:10;:17;;;;:21;;;;:::i;:::-;68438:46;;68495:18;68516:15;:24;68532:7;68516:24;;;;;;;;;;;;68495:45;;68867:19;68889:10;68900:14;68889:26;;;;;;;;:::i;:::-;;;;;;;;;;68867:48;;68953:11;68928:10;68939;68928:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;69064:10;69033:15;:28;69049:11;69033:28;;;;;;;;;;;:41;;;;69205:15;:24;69221:7;69205:24;;;;;;;;;;;69198:31;;;69240:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;68256:1008;;;68185:1079;:::o;65689:221::-;65774:14;65791:20;65808:2;65791:16;:20::i;:::-;65774:37;;65849:7;65822:12;:16;65835:2;65822:16;;;;;;;;;;;;;;;:24;65839:6;65822:24;;;;;;;;;;;:34;;;;65896:6;65867:17;:26;65885:7;65867:26;;;;;;;;;;;:35;;;;65763:147;65689:221;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;752:410::-;829:5;854:65;870:48;911:6;870:48;:::i;:::-;854:65;:::i;:::-;845:74;;942:6;935:5;928:21;980:4;973:5;969:16;1018:3;1009:6;1004:3;1000:16;997:25;994:112;;;1025:79;;:::i;:::-;994:112;1115:41;1149:6;1144:3;1139;1115:41;:::i;:::-;835:327;752:410;;;;;:::o;1168:412::-;1246:5;1271:66;1287:49;1329:6;1287:49;:::i;:::-;1271:66;:::i;:::-;1262:75;;1360:6;1353:5;1346:21;1398:4;1391:5;1387:16;1436:3;1427:6;1422:3;1418:16;1415:25;1412:112;;;1443:79;;:::i;:::-;1412:112;1533:41;1567:6;1562:3;1557;1533:41;:::i;:::-;1252:328;1168:412;;;;;:::o;1586:139::-;1632:5;1670:6;1657:20;1648:29;;1686:33;1713:5;1686:33;:::i;:::-;1586:139;;;;:::o;1731:155::-;1785:5;1823:6;1810:20;1801:29;;1839:41;1874:5;1839:41;:::i;:::-;1731:155;;;;:::o;1909:568::-;1982:8;1992:6;2042:3;2035:4;2027:6;2023:17;2019:27;2009:122;;2050:79;;:::i;:::-;2009:122;2163:6;2150:20;2140:30;;2193:18;2185:6;2182:30;2179:117;;;2215:79;;:::i;:::-;2179:117;2329:4;2321:6;2317:17;2305:29;;2383:3;2375:4;2367:6;2363:17;2353:8;2349:32;2346:41;2343:128;;;2390:79;;:::i;:::-;2343:128;1909:568;;;;;:::o;2500:370::-;2571:5;2620:3;2613:4;2605:6;2601:17;2597:27;2587:122;;2628:79;;:::i;:::-;2587:122;2745:6;2732:20;2770:94;2860:3;2852:6;2845:4;2837:6;2833:17;2770:94;:::i;:::-;2761:103;;2577:293;2500:370;;;;:::o;2876:133::-;2919:5;2957:6;2944:20;2935:29;;2973:30;2997:5;2973:30;:::i;:::-;2876:133;;;;:::o;3015:137::-;3069:5;3100:6;3094:13;3085:22;;3116:30;3140:5;3116:30;:::i;:::-;3015:137;;;;:::o;3158:139::-;3204:5;3242:6;3229:20;3220:29;;3258:33;3285:5;3258:33;:::i;:::-;3158:139;;;;:::o;3303:137::-;3348:5;3386:6;3373:20;3364:29;;3402:32;3428:5;3402:32;:::i;:::-;3303:137;;;;:::o;3446:141::-;3502:5;3533:6;3527:13;3518:22;;3549:32;3575:5;3549:32;:::i;:::-;3446:141;;;;:::o;3606:338::-;3661:5;3710:3;3703:4;3695:6;3691:17;3687:27;3677:122;;3718:79;;:::i;:::-;3677:122;3835:6;3822:20;3860:78;3934:3;3926:6;3919:4;3911:6;3907:17;3860:78;:::i;:::-;3851:87;;3667:277;3606:338;;;;:::o;3964:340::-;4020:5;4069:3;4062:4;4054:6;4050:17;4046:27;4036:122;;4077:79;;:::i;:::-;4036:122;4194:6;4181:20;4219:79;4294:3;4286:6;4279:4;4271:6;4267:17;4219:79;:::i;:::-;4210:88;;4026:278;3964:340;;;;:::o;4310:139::-;4356:5;4394:6;4381:20;4372:29;;4410:33;4437:5;4410:33;:::i;:::-;4310:139;;;;:::o;4455:143::-;4512:5;4543:6;4537:13;4528:22;;4559:33;4586:5;4559:33;:::i;:::-;4455:143;;;;:::o;4604:135::-;4648:5;4686:6;4673:20;4664:29;;4702:31;4727:5;4702:31;:::i;:::-;4604:135;;;;:::o;4745:329::-;4804:6;4853:2;4841:9;4832:7;4828:23;4824:32;4821:119;;;4859:79;;:::i;:::-;4821:119;4979:1;5004:53;5049:7;5040:6;5029:9;5025:22;5004:53;:::i;:::-;4994:63;;4950:117;4745:329;;;;:::o;5080:490::-;5156:6;5164;5213:2;5201:9;5192:7;5188:23;5184:32;5181:119;;;5219:79;;:::i;:::-;5181:119;5339:1;5364:61;5417:7;5408:6;5397:9;5393:22;5364:61;:::i;:::-;5354:71;;5310:125;5474:2;5500:53;5545:7;5536:6;5525:9;5521:22;5500:53;:::i;:::-;5490:63;;5445:118;5080:490;;;;;:::o;5576:474::-;5644:6;5652;5701:2;5689:9;5680:7;5676:23;5672:32;5669:119;;;5707:79;;:::i;:::-;5669:119;5827:1;5852:53;5897:7;5888:6;5877:9;5873:22;5852:53;:::i;:::-;5842:63;;5798:117;5954:2;5980:53;6025:7;6016:6;6005:9;6001:22;5980:53;:::i;:::-;5970:63;;5925:118;5576:474;;;;;:::o;6056:619::-;6133:6;6141;6149;6198:2;6186:9;6177:7;6173:23;6169:32;6166:119;;;6204:79;;:::i;:::-;6166:119;6324:1;6349:53;6394:7;6385:6;6374:9;6370:22;6349:53;:::i;:::-;6339:63;;6295:117;6451:2;6477:53;6522:7;6513:6;6502:9;6498:22;6477:53;:::i;:::-;6467:63;;6422:118;6579:2;6605:53;6650:7;6641:6;6630:9;6626:22;6605:53;:::i;:::-;6595:63;;6550:118;6056:619;;;;;:::o;6681:943::-;6776:6;6784;6792;6800;6849:3;6837:9;6828:7;6824:23;6820:33;6817:120;;;6856:79;;:::i;:::-;6817:120;6976:1;7001:53;7046:7;7037:6;7026:9;7022:22;7001:53;:::i;:::-;6991:63;;6947:117;7103:2;7129:53;7174:7;7165:6;7154:9;7150:22;7129:53;:::i;:::-;7119:63;;7074:118;7231:2;7257:53;7302:7;7293:6;7282:9;7278:22;7257:53;:::i;:::-;7247:63;;7202:118;7387:2;7376:9;7372:18;7359:32;7418:18;7410:6;7407:30;7404:117;;;7440:79;;:::i;:::-;7404:117;7545:62;7599:7;7590:6;7579:9;7575:22;7545:62;:::i;:::-;7535:72;;7330:287;6681:943;;;;;;;:::o;7630:468::-;7695:6;7703;7752:2;7740:9;7731:7;7727:23;7723:32;7720:119;;;7758:79;;:::i;:::-;7720:119;7878:1;7903:53;7948:7;7939:6;7928:9;7924:22;7903:53;:::i;:::-;7893:63;;7849:117;8005:2;8031:50;8073:7;8064:6;8053:9;8049:22;8031:50;:::i;:::-;8021:60;;7976:115;7630:468;;;;;:::o;8104:474::-;8172:6;8180;8229:2;8217:9;8208:7;8204:23;8200:32;8197:119;;;8235:79;;:::i;:::-;8197:119;8355:1;8380:53;8425:7;8416:6;8405:9;8401:22;8380:53;:::i;:::-;8370:63;;8326:117;8482:2;8508:53;8553:7;8544:6;8533:9;8529:22;8508:53;:::i;:::-;8498:63;;8453:118;8104:474;;;;;:::o;8584:684::-;8677:6;8685;8734:2;8722:9;8713:7;8709:23;8705:32;8702:119;;;8740:79;;:::i;:::-;8702:119;8888:1;8877:9;8873:17;8860:31;8918:18;8910:6;8907:30;8904:117;;;8940:79;;:::i;:::-;8904:117;9045:78;9115:7;9106:6;9095:9;9091:22;9045:78;:::i;:::-;9035:88;;8831:302;9172:2;9198:53;9243:7;9234:6;9223:9;9219:22;9198:53;:::i;:::-;9188:63;;9143:118;8584:684;;;;;:::o;9274:345::-;9341:6;9390:2;9378:9;9369:7;9365:23;9361:32;9358:119;;;9396:79;;:::i;:::-;9358:119;9516:1;9541:61;9594:7;9585:6;9574:9;9570:22;9541:61;:::i;:::-;9531:71;;9487:125;9274:345;;;;:::o;9625:474::-;9693:6;9701;9750:2;9738:9;9729:7;9725:23;9721:32;9718:119;;;9756:79;;:::i;:::-;9718:119;9876:1;9901:53;9946:7;9937:6;9926:9;9922:22;9901:53;:::i;:::-;9891:63;;9847:117;10003:2;10029:53;10074:7;10065:6;10054:9;10050:22;10029:53;:::i;:::-;10019:63;;9974:118;9625:474;;;;;:::o;10105:327::-;10163:6;10212:2;10200:9;10191:7;10187:23;10183:32;10180:119;;;10218:79;;:::i;:::-;10180:119;10338:1;10363:52;10407:7;10398:6;10387:9;10383:22;10363:52;:::i;:::-;10353:62;;10309:116;10105:327;;;;:::o;10438:349::-;10507:6;10556:2;10544:9;10535:7;10531:23;10527:32;10524:119;;;10562:79;;:::i;:::-;10524:119;10682:1;10707:63;10762:7;10753:6;10742:9;10738:22;10707:63;:::i;:::-;10697:73;;10653:127;10438:349;;;;:::o;10793:509::-;10862:6;10911:2;10899:9;10890:7;10886:23;10882:32;10879:119;;;10917:79;;:::i;:::-;10879:119;11065:1;11054:9;11050:17;11037:31;11095:18;11087:6;11084:30;11081:117;;;11117:79;;:::i;:::-;11081:117;11222:63;11277:7;11268:6;11257:9;11253:22;11222:63;:::i;:::-;11212:73;;11008:287;10793:509;;;;:::o;11308:329::-;11367:6;11416:2;11404:9;11395:7;11391:23;11387:32;11384:119;;;11422:79;;:::i;:::-;11384:119;11542:1;11567:53;11612:7;11603:6;11592:9;11588:22;11567:53;:::i;:::-;11557:63;;11513:117;11308:329;;;;:::o;11643:351::-;11713:6;11762:2;11750:9;11741:7;11737:23;11733:32;11730:119;;;11768:79;;:::i;:::-;11730:119;11888:1;11913:64;11969:7;11960:6;11949:9;11945:22;11913:64;:::i;:::-;11903:74;;11859:128;11643:351;;;;:::o;12000:325::-;12057:6;12106:2;12094:9;12085:7;12081:23;12077:32;12074:119;;;12112:79;;:::i;:::-;12074:119;12232:1;12257:51;12300:7;12291:6;12280:9;12276:22;12257:51;:::i;:::-;12247:61;;12203:115;12000:325;;;;:::o;12331:897::-;12419:6;12427;12435;12443;12451;12500:3;12488:9;12479:7;12475:23;12471:33;12468:120;;;12507:79;;:::i;:::-;12468:120;12627:1;12652:51;12695:7;12686:6;12675:9;12671:22;12652:51;:::i;:::-;12642:61;;12598:115;12752:2;12778:53;12823:7;12814:6;12803:9;12799:22;12778:53;:::i;:::-;12768:63;;12723:118;12880:2;12906:50;12948:7;12939:6;12928:9;12924:22;12906:50;:::i;:::-;12896:60;;12851:115;13005:2;13031:51;13074:7;13065:6;13054:9;13050:22;13031:51;:::i;:::-;13021:61;;12976:116;13131:3;13158:53;13203:7;13194:6;13183:9;13179:22;13158:53;:::i;:::-;13148:63;;13102:119;12331:897;;;;;;;;:::o;13234:466::-;13298:6;13306;13355:2;13343:9;13334:7;13330:23;13326:32;13323:119;;;13361:79;;:::i;:::-;13323:119;13481:1;13506:51;13549:7;13540:6;13529:9;13525:22;13506:51;:::i;:::-;13496:61;;13452:115;13606:2;13632:51;13675:7;13666:6;13655:9;13651:22;13632:51;:::i;:::-;13622:61;;13577:116;13234:466;;;;;:::o;13706:841::-;13806:6;13814;13822;13830;13879:2;13867:9;13858:7;13854:23;13850:32;13847:119;;;13885:79;;:::i;:::-;13847:119;14005:1;14030:51;14073:7;14064:6;14053:9;14049:22;14030:51;:::i;:::-;14020:61;;13976:115;14130:2;14156:51;14199:7;14190:6;14179:9;14175:22;14156:51;:::i;:::-;14146:61;;14101:116;14284:2;14273:9;14269:18;14256:32;14315:18;14307:6;14304:30;14301:117;;;14337:79;;:::i;:::-;14301:117;14450:80;14522:7;14513:6;14502:9;14498:22;14450:80;:::i;:::-;14432:98;;;;14227:313;13706:841;;;;;;;:::o;14553:118::-;14640:24;14658:5;14640:24;:::i;:::-;14635:3;14628:37;14553:118;;:::o;14677:157::-;14782:45;14802:24;14820:5;14802:24;:::i;:::-;14782:45;:::i;:::-;14777:3;14770:58;14677:157;;:::o;14840:109::-;14921:21;14936:5;14921:21;:::i;:::-;14916:3;14909:34;14840:109;;:::o;14955:118::-;15042:24;15060:5;15042:24;:::i;:::-;15037:3;15030:37;14955:118;;:::o;15079:157::-;15184:45;15204:24;15222:5;15204:24;:::i;:::-;15184:45;:::i;:::-;15179:3;15172:58;15079:157;;:::o;15242:360::-;15328:3;15356:38;15388:5;15356:38;:::i;:::-;15410:70;15473:6;15468:3;15410:70;:::i;:::-;15403:77;;15489:52;15534:6;15529:3;15522:4;15515:5;15511:16;15489:52;:::i;:::-;15566:29;15588:6;15566:29;:::i;:::-;15561:3;15557:39;15550:46;;15332:270;15242:360;;;;:::o;15608:364::-;15696:3;15724:39;15757:5;15724:39;:::i;:::-;15779:71;15843:6;15838:3;15779:71;:::i;:::-;15772:78;;15859:52;15904:6;15899:3;15892:4;15885:5;15881:16;15859:52;:::i;:::-;15936:29;15958:6;15936:29;:::i;:::-;15931:3;15927:39;15920:46;;15700:272;15608:364;;;;:::o;15978:377::-;16084:3;16112:39;16145:5;16112:39;:::i;:::-;16167:89;16249:6;16244:3;16167:89;:::i;:::-;16160:96;;16265:52;16310:6;16305:3;16298:4;16291:5;16287:16;16265:52;:::i;:::-;16342:6;16337:3;16333:16;16326:23;;16088:267;15978:377;;;;:::o;16361:366::-;16503:3;16524:67;16588:2;16583:3;16524:67;:::i;:::-;16517:74;;16600:93;16689:3;16600:93;:::i;:::-;16718:2;16713:3;16709:12;16702:19;;16361:366;;;:::o;16733:::-;16875:3;16896:67;16960:2;16955:3;16896:67;:::i;:::-;16889:74;;16972:93;17061:3;16972:93;:::i;:::-;17090:2;17085:3;17081:12;17074:19;;16733:366;;;:::o;17105:::-;17247:3;17268:67;17332:2;17327:3;17268:67;:::i;:::-;17261:74;;17344:93;17433:3;17344:93;:::i;:::-;17462:2;17457:3;17453:12;17446:19;;17105:366;;;:::o;17477:::-;17619:3;17640:67;17704:2;17699:3;17640:67;:::i;:::-;17633:74;;17716:93;17805:3;17716:93;:::i;:::-;17834:2;17829:3;17825:12;17818:19;;17477:366;;;:::o;17849:::-;17991:3;18012:67;18076:2;18071:3;18012:67;:::i;:::-;18005:74;;18088:93;18177:3;18088:93;:::i;:::-;18206:2;18201:3;18197:12;18190:19;;17849:366;;;:::o;18221:::-;18363:3;18384:67;18448:2;18443:3;18384:67;:::i;:::-;18377:74;;18460:93;18549:3;18460:93;:::i;:::-;18578:2;18573:3;18569:12;18562:19;;18221:366;;;:::o;18593:400::-;18753:3;18774:84;18856:1;18851:3;18774:84;:::i;:::-;18767:91;;18867:93;18956:3;18867:93;:::i;:::-;18985:1;18980:3;18976:11;18969:18;;18593:400;;;:::o;18999:366::-;19141:3;19162:67;19226:2;19221:3;19162:67;:::i;:::-;19155:74;;19238:93;19327:3;19238:93;:::i;:::-;19356:2;19351:3;19347:12;19340:19;;18999:366;;;:::o;19371:::-;19513:3;19534:67;19598:2;19593:3;19534:67;:::i;:::-;19527:74;;19610:93;19699:3;19610:93;:::i;:::-;19728:2;19723:3;19719:12;19712:19;;19371:366;;;:::o;19743:::-;19885:3;19906:67;19970:2;19965:3;19906:67;:::i;:::-;19899:74;;19982:93;20071:3;19982:93;:::i;:::-;20100:2;20095:3;20091:12;20084:19;;19743:366;;;:::o;20115:365::-;20257:3;20278:66;20342:1;20337:3;20278:66;:::i;:::-;20271:73;;20353:93;20442:3;20353:93;:::i;:::-;20471:2;20466:3;20462:12;20455:19;;20115:365;;;:::o;20486:366::-;20628:3;20649:67;20713:2;20708:3;20649:67;:::i;:::-;20642:74;;20725:93;20814:3;20725:93;:::i;:::-;20843:2;20838:3;20834:12;20827:19;;20486:366;;;:::o;20858:::-;21000:3;21021:67;21085:2;21080:3;21021:67;:::i;:::-;21014:74;;21097:93;21186:3;21097:93;:::i;:::-;21215:2;21210:3;21206:12;21199:19;;20858:366;;;:::o;21230:::-;21372:3;21393:67;21457:2;21452:3;21393:67;:::i;:::-;21386:74;;21469:93;21558:3;21469:93;:::i;:::-;21587:2;21582:3;21578:12;21571:19;;21230:366;;;:::o;21602:::-;21744:3;21765:67;21829:2;21824:3;21765:67;:::i;:::-;21758:74;;21841:93;21930:3;21841:93;:::i;:::-;21959:2;21954:3;21950:12;21943:19;;21602:366;;;:::o;21974:::-;22116:3;22137:67;22201:2;22196:3;22137:67;:::i;:::-;22130:74;;22213:93;22302:3;22213:93;:::i;:::-;22331:2;22326:3;22322:12;22315:19;;21974:366;;;:::o;22346:::-;22488:3;22509:67;22573:2;22568:3;22509:67;:::i;:::-;22502:74;;22585:93;22674:3;22585:93;:::i;:::-;22703:2;22698:3;22694:12;22687:19;;22346:366;;;:::o;22718:::-;22860:3;22881:67;22945:2;22940:3;22881:67;:::i;:::-;22874:74;;22957:93;23046:3;22957:93;:::i;:::-;23075:2;23070:3;23066:12;23059:19;;22718:366;;;:::o;23090:::-;23232:3;23253:67;23317:2;23312:3;23253:67;:::i;:::-;23246:74;;23329:93;23418:3;23329:93;:::i;:::-;23447:2;23442:3;23438:12;23431:19;;23090:366;;;:::o;23462:::-;23604:3;23625:67;23689:2;23684:3;23625:67;:::i;:::-;23618:74;;23701:93;23790:3;23701:93;:::i;:::-;23819:2;23814:3;23810:12;23803:19;;23462:366;;;:::o;23834:365::-;23976:3;23997:66;24061:1;24056:3;23997:66;:::i;:::-;23990:73;;24072:93;24161:3;24072:93;:::i;:::-;24190:2;24185:3;24181:12;24174:19;;23834:365;;;:::o;24205:366::-;24347:3;24368:67;24432:2;24427:3;24368:67;:::i;:::-;24361:74;;24444:93;24533:3;24444:93;:::i;:::-;24562:2;24557:3;24553:12;24546:19;;24205:366;;;:::o;24577:::-;24719:3;24740:67;24804:2;24799:3;24740:67;:::i;:::-;24733:74;;24816:93;24905:3;24816:93;:::i;:::-;24934:2;24929:3;24925:12;24918:19;;24577:366;;;:::o;24949:::-;25091:3;25112:67;25176:2;25171:3;25112:67;:::i;:::-;25105:74;;25188:93;25277:3;25188:93;:::i;:::-;25306:2;25301:3;25297:12;25290:19;;24949:366;;;:::o;25321:::-;25463:3;25484:67;25548:2;25543:3;25484:67;:::i;:::-;25477:74;;25560:93;25649:3;25560:93;:::i;:::-;25678:2;25673:3;25669:12;25662:19;;25321:366;;;:::o;25693:::-;25835:3;25856:67;25920:2;25915:3;25856:67;:::i;:::-;25849:74;;25932:93;26021:3;25932:93;:::i;:::-;26050:2;26045:3;26041:12;26034:19;;25693:366;;;:::o;26065:::-;26207:3;26228:67;26292:2;26287:3;26228:67;:::i;:::-;26221:74;;26304:93;26393:3;26304:93;:::i;:::-;26422:2;26417:3;26413:12;26406:19;;26065:366;;;:::o;26437:::-;26579:3;26600:67;26664:2;26659:3;26600:67;:::i;:::-;26593:74;;26676:93;26765:3;26676:93;:::i;:::-;26794:2;26789:3;26785:12;26778:19;;26437:366;;;:::o;26809:::-;26951:3;26972:67;27036:2;27031:3;26972:67;:::i;:::-;26965:74;;27048:93;27137:3;27048:93;:::i;:::-;27166:2;27161:3;27157:12;27150:19;;26809:366;;;:::o;27181:::-;27323:3;27344:67;27408:2;27403:3;27344:67;:::i;:::-;27337:74;;27420:93;27509:3;27420:93;:::i;:::-;27538:2;27533:3;27529:12;27522:19;;27181:366;;;:::o;27553:::-;27695:3;27716:67;27780:2;27775:3;27716:67;:::i;:::-;27709:74;;27792:93;27881:3;27792:93;:::i;:::-;27910:2;27905:3;27901:12;27894:19;;27553:366;;;:::o;27925:::-;28067:3;28088:67;28152:2;28147:3;28088:67;:::i;:::-;28081:74;;28164:93;28253:3;28164:93;:::i;:::-;28282:2;28277:3;28273:12;28266:19;;27925:366;;;:::o;28297:118::-;28384:24;28402:5;28384:24;:::i;:::-;28379:3;28372:37;28297:118;;:::o;28421:157::-;28526:45;28546:24;28564:5;28546:24;:::i;:::-;28526:45;:::i;:::-;28521:3;28514:58;28421:157;;:::o;28584:112::-;28667:22;28683:5;28667:22;:::i;:::-;28662:3;28655:35;28584:112;;:::o;28702:256::-;28814:3;28829:75;28900:3;28891:6;28829:75;:::i;:::-;28929:2;28924:3;28920:12;28913:19;;28949:3;28942:10;;28702:256;;;;:::o;28964:397::-;29104:3;29119:75;29190:3;29181:6;29119:75;:::i;:::-;29219:2;29214:3;29210:12;29203:19;;29232:75;29303:3;29294:6;29232:75;:::i;:::-;29332:2;29327:3;29323:12;29316:19;;29352:3;29345:10;;28964:397;;;;;:::o;29367:::-;29507:3;29522:75;29593:3;29584:6;29522:75;:::i;:::-;29622:2;29617:3;29613:12;29606:19;;29635:75;29706:3;29697:6;29635:75;:::i;:::-;29735:2;29730:3;29726:12;29719:19;;29755:3;29748:10;;29367:397;;;;;:::o;29770:435::-;29950:3;29972:95;30063:3;30054:6;29972:95;:::i;:::-;29965:102;;30084:95;30175:3;30166:6;30084:95;:::i;:::-;30077:102;;30196:3;30189:10;;29770:435;;;;;:::o;30211:701::-;30492:3;30514:95;30605:3;30596:6;30514:95;:::i;:::-;30507:102;;30626:95;30717:3;30708:6;30626:95;:::i;:::-;30619:102;;30738:148;30882:3;30738:148;:::i;:::-;30731:155;;30903:3;30896:10;;30211:701;;;;;:::o;30918:222::-;31011:4;31049:2;31038:9;31034:18;31026:26;;31062:71;31130:1;31119:9;31115:17;31106:6;31062:71;:::i;:::-;30918:222;;;;:::o;31146:640::-;31341:4;31379:3;31368:9;31364:19;31356:27;;31393:71;31461:1;31450:9;31446:17;31437:6;31393:71;:::i;:::-;31474:72;31542:2;31531:9;31527:18;31518:6;31474:72;:::i;:::-;31556;31624:2;31613:9;31609:18;31600:6;31556:72;:::i;:::-;31675:9;31669:4;31665:20;31660:2;31649:9;31645:18;31638:48;31703:76;31774:4;31765:6;31703:76;:::i;:::-;31695:84;;31146:640;;;;;;;:::o;31792:529::-;31959:4;31997:2;31986:9;31982:18;31974:26;;32010:71;32078:1;32067:9;32063:17;32054:6;32010:71;:::i;:::-;32091:72;32159:2;32148:9;32144:18;32135:6;32091:72;:::i;:::-;32210:9;32204:4;32200:20;32195:2;32184:9;32180:18;32173:48;32238:76;32309:4;32300:6;32238:76;:::i;:::-;32230:84;;31792:529;;;;;;:::o;32327:210::-;32414:4;32452:2;32441:9;32437:18;32429:26;;32465:65;32527:1;32516:9;32512:17;32503:6;32465:65;:::i;:::-;32327:210;;;;:::o;32543:533::-;32710:4;32748:3;32737:9;32733:19;32725:27;;32762:65;32824:1;32813:9;32809:17;32800:6;32762:65;:::i;:::-;32837:68;32901:2;32890:9;32886:18;32877:6;32837:68;:::i;:::-;32915:72;32983:2;32972:9;32968:18;32959:6;32915:72;:::i;:::-;32997;33065:2;33054:9;33050:18;33041:6;32997:72;:::i;:::-;32543:533;;;;;;;:::o;33082:222::-;33175:4;33213:2;33202:9;33198:18;33190:26;;33226:71;33294:1;33283:9;33279:17;33270:6;33226:71;:::i;:::-;33082:222;;;;:::o;33310:332::-;33431:4;33469:2;33458:9;33454:18;33446:26;;33482:71;33550:1;33539:9;33535:17;33526:6;33482:71;:::i;:::-;33563:72;33631:2;33620:9;33616:18;33607:6;33563:72;:::i;:::-;33310:332;;;;;:::o;33648:553::-;33825:4;33863:3;33852:9;33848:19;33840:27;;33877:71;33945:1;33934:9;33930:17;33921:6;33877:71;:::i;:::-;33958:72;34026:2;34015:9;34011:18;34002:6;33958:72;:::i;:::-;34040;34108:2;34097:9;34093:18;34084:6;34040:72;:::i;:::-;34122;34190:2;34179:9;34175:18;34166:6;34122:72;:::i;:::-;33648:553;;;;;;;:::o;34207:313::-;34320:4;34358:2;34347:9;34343:18;34335:26;;34407:9;34401:4;34397:20;34393:1;34382:9;34378:17;34371:47;34435:78;34508:4;34499:6;34435:78;:::i;:::-;34427:86;;34207:313;;;;:::o;34526:419::-;34692:4;34730:2;34719:9;34715:18;34707:26;;34779:9;34773:4;34769:20;34765:1;34754:9;34750:17;34743:47;34807:131;34933:4;34807:131;:::i;:::-;34799:139;;34526:419;;;:::o;34951:::-;35117:4;35155:2;35144:9;35140:18;35132:26;;35204:9;35198:4;35194:20;35190:1;35179:9;35175:17;35168:47;35232:131;35358:4;35232:131;:::i;:::-;35224:139;;34951:419;;;:::o;35376:::-;35542:4;35580:2;35569:9;35565:18;35557:26;;35629:9;35623:4;35619:20;35615:1;35604:9;35600:17;35593:47;35657:131;35783:4;35657:131;:::i;:::-;35649:139;;35376:419;;;:::o;35801:::-;35967:4;36005:2;35994:9;35990:18;35982:26;;36054:9;36048:4;36044:20;36040:1;36029:9;36025:17;36018:47;36082:131;36208:4;36082:131;:::i;:::-;36074:139;;35801:419;;;:::o;36226:::-;36392:4;36430:2;36419:9;36415:18;36407:26;;36479:9;36473:4;36469:20;36465:1;36454:9;36450:17;36443:47;36507:131;36633:4;36507:131;:::i;:::-;36499:139;;36226:419;;;:::o;36651:::-;36817:4;36855:2;36844:9;36840:18;36832:26;;36904:9;36898:4;36894:20;36890:1;36879:9;36875:17;36868:47;36932:131;37058:4;36932:131;:::i;:::-;36924:139;;36651:419;;;:::o;37076:::-;37242:4;37280:2;37269:9;37265:18;37257:26;;37329:9;37323:4;37319:20;37315:1;37304:9;37300:17;37293:47;37357:131;37483:4;37357:131;:::i;:::-;37349:139;;37076:419;;;:::o;37501:::-;37667:4;37705:2;37694:9;37690:18;37682:26;;37754:9;37748:4;37744:20;37740:1;37729:9;37725:17;37718:47;37782:131;37908:4;37782:131;:::i;:::-;37774:139;;37501:419;;;:::o;37926:::-;38092:4;38130:2;38119:9;38115:18;38107:26;;38179:9;38173:4;38169:20;38165:1;38154:9;38150:17;38143:47;38207:131;38333:4;38207:131;:::i;:::-;38199:139;;37926:419;;;:::o;38351:::-;38517:4;38555:2;38544:9;38540:18;38532:26;;38604:9;38598:4;38594:20;38590:1;38579:9;38575:17;38568:47;38632:131;38758:4;38632:131;:::i;:::-;38624:139;;38351:419;;;:::o;38776:::-;38942:4;38980:2;38969:9;38965:18;38957:26;;39029:9;39023:4;39019:20;39015:1;39004:9;39000:17;38993:47;39057:131;39183:4;39057:131;:::i;:::-;39049:139;;38776:419;;;:::o;39201:::-;39367:4;39405:2;39394:9;39390:18;39382:26;;39454:9;39448:4;39444:20;39440:1;39429:9;39425:17;39418:47;39482:131;39608:4;39482:131;:::i;:::-;39474:139;;39201:419;;;:::o;39626:::-;39792:4;39830:2;39819:9;39815:18;39807:26;;39879:9;39873:4;39869:20;39865:1;39854:9;39850:17;39843:47;39907:131;40033:4;39907:131;:::i;:::-;39899:139;;39626:419;;;:::o;40051:::-;40217:4;40255:2;40244:9;40240:18;40232:26;;40304:9;40298:4;40294:20;40290:1;40279:9;40275:17;40268:47;40332:131;40458:4;40332:131;:::i;:::-;40324:139;;40051:419;;;:::o;40476:::-;40642:4;40680:2;40669:9;40665:18;40657:26;;40729:9;40723:4;40719:20;40715:1;40704:9;40700:17;40693:47;40757:131;40883:4;40757:131;:::i;:::-;40749:139;;40476:419;;;:::o;40901:::-;41067:4;41105:2;41094:9;41090:18;41082:26;;41154:9;41148:4;41144:20;41140:1;41129:9;41125:17;41118:47;41182:131;41308:4;41182:131;:::i;:::-;41174:139;;40901:419;;;:::o;41326:::-;41492:4;41530:2;41519:9;41515:18;41507:26;;41579:9;41573:4;41569:20;41565:1;41554:9;41550:17;41543:47;41607:131;41733:4;41607:131;:::i;:::-;41599:139;;41326:419;;;:::o;41751:::-;41917:4;41955:2;41944:9;41940:18;41932:26;;42004:9;41998:4;41994:20;41990:1;41979:9;41975:17;41968:47;42032:131;42158:4;42032:131;:::i;:::-;42024:139;;41751:419;;;:::o;42176:::-;42342:4;42380:2;42369:9;42365:18;42357:26;;42429:9;42423:4;42419:20;42415:1;42404:9;42400:17;42393:47;42457:131;42583:4;42457:131;:::i;:::-;42449:139;;42176:419;;;:::o;42601:::-;42767:4;42805:2;42794:9;42790:18;42782:26;;42854:9;42848:4;42844:20;42840:1;42829:9;42825:17;42818:47;42882:131;43008:4;42882:131;:::i;:::-;42874:139;;42601:419;;;:::o;43026:::-;43192:4;43230:2;43219:9;43215:18;43207:26;;43279:9;43273:4;43269:20;43265:1;43254:9;43250:17;43243:47;43307:131;43433:4;43307:131;:::i;:::-;43299:139;;43026:419;;;:::o;43451:::-;43617:4;43655:2;43644:9;43640:18;43632:26;;43704:9;43698:4;43694:20;43690:1;43679:9;43675:17;43668:47;43732:131;43858:4;43732:131;:::i;:::-;43724:139;;43451:419;;;:::o;43876:::-;44042:4;44080:2;44069:9;44065:18;44057:26;;44129:9;44123:4;44119:20;44115:1;44104:9;44100:17;44093:47;44157:131;44283:4;44157:131;:::i;:::-;44149:139;;43876:419;;;:::o;44301:::-;44467:4;44505:2;44494:9;44490:18;44482:26;;44554:9;44548:4;44544:20;44540:1;44529:9;44525:17;44518:47;44582:131;44708:4;44582:131;:::i;:::-;44574:139;;44301:419;;;:::o;44726:::-;44892:4;44930:2;44919:9;44915:18;44907:26;;44979:9;44973:4;44969:20;44965:1;44954:9;44950:17;44943:47;45007:131;45133:4;45007:131;:::i;:::-;44999:139;;44726:419;;;:::o;45151:::-;45317:4;45355:2;45344:9;45340:18;45332:26;;45404:9;45398:4;45394:20;45390:1;45379:9;45375:17;45368:47;45432:131;45558:4;45432:131;:::i;:::-;45424:139;;45151:419;;;:::o;45576:::-;45742:4;45780:2;45769:9;45765:18;45757:26;;45829:9;45823:4;45819:20;45815:1;45804:9;45800:17;45793:47;45857:131;45983:4;45857:131;:::i;:::-;45849:139;;45576:419;;;:::o;46001:::-;46167:4;46205:2;46194:9;46190:18;46182:26;;46254:9;46248:4;46244:20;46240:1;46229:9;46225:17;46218:47;46282:131;46408:4;46282:131;:::i;:::-;46274:139;;46001:419;;;:::o;46426:::-;46592:4;46630:2;46619:9;46615:18;46607:26;;46679:9;46673:4;46669:20;46665:1;46654:9;46650:17;46643:47;46707:131;46833:4;46707:131;:::i;:::-;46699:139;;46426:419;;;:::o;46851:::-;47017:4;47055:2;47044:9;47040:18;47032:26;;47104:9;47098:4;47094:20;47090:1;47079:9;47075:17;47068:47;47132:131;47258:4;47132:131;:::i;:::-;47124:139;;46851:419;;;:::o;47276:::-;47442:4;47480:2;47469:9;47465:18;47457:26;;47529:9;47523:4;47519:20;47515:1;47504:9;47500:17;47493:47;47557:131;47683:4;47557:131;:::i;:::-;47549:139;;47276:419;;;:::o;47701:222::-;47794:4;47832:2;47821:9;47817:18;47809:26;;47845:71;47913:1;47902:9;47898:17;47889:6;47845:71;:::i;:::-;47701:222;;;;:::o;47929:332::-;48050:4;48088:2;48077:9;48073:18;48065:26;;48101:71;48169:1;48158:9;48154:17;48145:6;48101:71;:::i;:::-;48182:72;48250:2;48239:9;48235:18;48226:6;48182:72;:::i;:::-;47929:332;;;;;:::o;48267:129::-;48301:6;48328:20;;:::i;:::-;48318:30;;48357:33;48385:4;48377:6;48357:33;:::i;:::-;48267:129;;;:::o;48402:75::-;48435:6;48468:2;48462:9;48452:19;;48402:75;:::o;48483:311::-;48560:4;48650:18;48642:6;48639:30;48636:56;;;48672:18;;:::i;:::-;48636:56;48722:4;48714:6;48710:17;48702:25;;48782:4;48776;48772:15;48764:23;;48483:311;;;:::o;48800:307::-;48861:4;48951:18;48943:6;48940:30;48937:56;;;48973:18;;:::i;:::-;48937:56;49011:29;49033:6;49011:29;:::i;:::-;49003:37;;49095:4;49089;49085:15;49077:23;;48800:307;;;:::o;49113:308::-;49175:4;49265:18;49257:6;49254:30;49251:56;;;49287:18;;:::i;:::-;49251:56;49325:29;49347:6;49325:29;:::i;:::-;49317:37;;49409:4;49403;49399:15;49391:23;;49113:308;;;:::o;49427:98::-;49478:6;49512:5;49506:12;49496:22;;49427:98;;;:::o;49531:99::-;49583:6;49617:5;49611:12;49601:22;;49531:99;;;:::o;49636:168::-;49719:11;49753:6;49748:3;49741:19;49793:4;49788:3;49784:14;49769:29;;49636:168;;;;:::o;49810:169::-;49894:11;49928:6;49923:3;49916:19;49968:4;49963:3;49959:14;49944:29;;49810:169;;;;:::o;49985:148::-;50087:11;50124:3;50109:18;;49985:148;;;;:::o;50139:305::-;50179:3;50198:20;50216:1;50198:20;:::i;:::-;50193:25;;50232:20;50250:1;50232:20;:::i;:::-;50227:25;;50386:1;50318:66;50314:74;50311:1;50308:81;50305:107;;;50392:18;;:::i;:::-;50305:107;50436:1;50433;50429:9;50422:16;;50139:305;;;;:::o;50450:185::-;50490:1;50507:20;50525:1;50507:20;:::i;:::-;50502:25;;50541:20;50559:1;50541:20;:::i;:::-;50536:25;;50580:1;50570:35;;50585:18;;:::i;:::-;50570:35;50627:1;50624;50620:9;50615:14;;50450:185;;;;:::o;50641:348::-;50681:7;50704:20;50722:1;50704:20;:::i;:::-;50699:25;;50738:20;50756:1;50738:20;:::i;:::-;50733:25;;50926:1;50858:66;50854:74;50851:1;50848:81;50843:1;50836:9;50829:17;50825:105;50822:131;;;50933:18;;:::i;:::-;50822:131;50981:1;50978;50974:9;50963:20;;50641:348;;;;:::o;50995:191::-;51035:4;51055:20;51073:1;51055:20;:::i;:::-;51050:25;;51089:20;51107:1;51089:20;:::i;:::-;51084:25;;51128:1;51125;51122:8;51119:34;;;51133:18;;:::i;:::-;51119:34;51178:1;51175;51171:9;51163:17;;50995:191;;;;:::o;51192:185::-;51230:4;51250:18;51266:1;51250:18;:::i;:::-;51245:23;;51282:18;51298:1;51282:18;:::i;:::-;51277:23;;51319:1;51316;51313:8;51310:34;;;51324:18;;:::i;:::-;51310:34;51369:1;51366;51362:9;51354:17;;51192:185;;;;:::o;51383:96::-;51420:7;51449:24;51467:5;51449:24;:::i;:::-;51438:35;;51383:96;;;:::o;51485:104::-;51530:7;51559:24;51577:5;51559:24;:::i;:::-;51548:35;;51485:104;;;:::o;51595:90::-;51629:7;51672:5;51665:13;51658:21;51647:32;;51595:90;;;:::o;51691:77::-;51728:7;51757:5;51746:16;;51691:77;;;:::o;51774:149::-;51810:7;51850:66;51843:5;51839:78;51828:89;;51774:149;;;:::o;51929:126::-;51966:7;52006:42;51999:5;51995:54;51984:65;;51929:126;;;:::o;52061:77::-;52098:7;52127:5;52116:16;;52061:77;;;:::o;52144:86::-;52179:7;52219:4;52212:5;52208:16;52197:27;;52144:86;;;:::o;52236:154::-;52320:6;52315:3;52310;52297:30;52382:1;52373:6;52368:3;52364:16;52357:27;52236:154;;;:::o;52396:307::-;52464:1;52474:113;52488:6;52485:1;52482:13;52474:113;;;52573:1;52568:3;52564:11;52558:18;52554:1;52549:3;52545:11;52538:39;52510:2;52507:1;52503:10;52498:15;;52474:113;;;52605:6;52602:1;52599:13;52596:101;;;52685:1;52676:6;52671:3;52667:16;52660:27;52596:101;52445:258;52396:307;;;:::o;52709:320::-;52753:6;52790:1;52784:4;52780:12;52770:22;;52837:1;52831:4;52827:12;52858:18;52848:81;;52914:4;52906:6;52902:17;52892:27;;52848:81;52976:2;52968:6;52965:14;52945:18;52942:38;52939:84;;;52995:18;;:::i;:::-;52939:84;52760:269;52709:320;;;:::o;53035:281::-;53118:27;53140:4;53118:27;:::i;:::-;53110:6;53106:40;53248:6;53236:10;53233:22;53212:18;53200:10;53197:34;53194:62;53191:88;;;53259:18;;:::i;:::-;53191:88;53299:10;53295:2;53288:22;53078:238;53035:281;;:::o;53322:233::-;53361:3;53384:24;53402:5;53384:24;:::i;:::-;53375:33;;53430:66;53423:5;53420:77;53417:103;;;53500:18;;:::i;:::-;53417:103;53547:1;53540:5;53536:13;53529:20;;53322:233;;;:::o;53561:100::-;53600:7;53629:26;53649:5;53629:26;:::i;:::-;53618:37;;53561:100;;;:::o;53667:79::-;53706:7;53735:5;53724:16;;53667:79;;;:::o;53752:94::-;53791:7;53820:20;53834:5;53820:20;:::i;:::-;53809:31;;53752:94;;;:::o;53852:79::-;53891:7;53920:5;53909:16;;53852:79;;;:::o;53937:176::-;53969:1;53986:20;54004:1;53986:20;:::i;:::-;53981:25;;54020:20;54038:1;54020:20;:::i;:::-;54015:25;;54059:1;54049:35;;54064:18;;:::i;:::-;54049:35;54105:1;54102;54098:9;54093:14;;53937:176;;;;:::o;54119:180::-;54167:77;54164:1;54157:88;54264:4;54261:1;54254:15;54288:4;54285:1;54278:15;54305:180;54353:77;54350:1;54343:88;54450:4;54447:1;54440:15;54474:4;54471:1;54464:15;54491:180;54539:77;54536:1;54529:88;54636:4;54633:1;54626:15;54660:4;54657:1;54650:15;54677:180;54725:77;54722:1;54715:88;54822:4;54819:1;54812:15;54846:4;54843:1;54836:15;54863:180;54911:77;54908:1;54901:88;55008:4;55005:1;54998:15;55032:4;55029:1;55022:15;55049:180;55097:77;55094:1;55087:88;55194:4;55191:1;55184:15;55218:4;55215:1;55208:15;55235:117;55344:1;55341;55334:12;55358:117;55467:1;55464;55457:12;55481:117;55590:1;55587;55580:12;55604:117;55713:1;55710;55703:12;55727:117;55836:1;55833;55826:12;55850:117;55959:1;55956;55949:12;55973:102;56014:6;56065:2;56061:7;56056:2;56049:5;56045:14;56041:28;56031:38;;55973:102;;;:::o;56081:94::-;56114:8;56162:5;56158:2;56154:14;56133:35;;56081:94;;;:::o;56181:230::-;56321:34;56317:1;56309:6;56305:14;56298:58;56390:13;56385:2;56377:6;56373:15;56366:38;56181:230;:::o;56417:170::-;56557:22;56553:1;56545:6;56541:14;56534:46;56417:170;:::o;56593:230::-;56733:34;56729:1;56721:6;56717:14;56710:58;56802:13;56797:2;56789:6;56785:15;56778:38;56593:230;:::o;56829:237::-;56969:34;56965:1;56957:6;56953:14;56946:58;57038:20;57033:2;57025:6;57021:15;57014:45;56829:237;:::o;57072:225::-;57212:34;57208:1;57200:6;57196:14;57189:58;57281:8;57276:2;57268:6;57264:15;57257:33;57072:225;:::o;57303:178::-;57443:30;57439:1;57431:6;57427:14;57420:54;57303:178;:::o;57487:151::-;57627:3;57623:1;57615:6;57611:14;57604:27;57487:151;:::o;57644:223::-;57784:34;57780:1;57772:6;57768:14;57761:58;57853:6;57848:2;57840:6;57836:15;57829:31;57644:223;:::o;57873:175::-;58013:27;58009:1;58001:6;57997:14;57990:51;57873:175;:::o;58054:176::-;58194:28;58190:1;58182:6;58178:14;58171:52;58054:176;:::o;58236:159::-;58376:11;58372:1;58364:6;58360:14;58353:35;58236:159;:::o;58401:231::-;58541:34;58537:1;58529:6;58525:14;58518:58;58610:14;58605:2;58597:6;58593:15;58586:39;58401:231;:::o;58638:166::-;58778:18;58774:1;58766:6;58762:14;58755:42;58638:166;:::o;58810:165::-;58950:17;58946:1;58938:6;58934:14;58927:41;58810:165;:::o;58981:243::-;59121:34;59117:1;59109:6;59105:14;59098:58;59190:26;59185:2;59177:6;59173:15;59166:51;58981:243;:::o;59230:229::-;59370:34;59366:1;59358:6;59354:14;59347:58;59439:12;59434:2;59426:6;59422:15;59415:37;59230:229;:::o;59465:228::-;59605:34;59601:1;59593:6;59589:14;59582:58;59674:11;59669:2;59661:6;59657:15;59650:36;59465:228;:::o;59699:165::-;59839:17;59835:1;59827:6;59823:14;59816:41;59699:165;:::o;59870:182::-;60010:34;60006:1;59998:6;59994:14;59987:58;59870:182;:::o;60058:231::-;60198:34;60194:1;60186:6;60182:14;60175:58;60267:14;60262:2;60254:6;60250:15;60243:39;60058:231;:::o;60295:158::-;60435:10;60431:1;60423:6;60419:14;60412:34;60295:158;:::o;60459:182::-;60599:34;60595:1;60587:6;60583:14;60576:58;60459:182;:::o;60647:228::-;60787:34;60783:1;60775:6;60771:14;60764:58;60856:11;60851:2;60843:6;60839:15;60832:36;60647:228;:::o;60881:234::-;61021:34;61017:1;61009:6;61005:14;60998:58;61090:17;61085:2;61077:6;61073:15;61066:42;60881:234;:::o;61121:181::-;61261:33;61257:1;61249:6;61245:14;61238:57;61121:181;:::o;61308:167::-;61448:19;61444:1;61436:6;61432:14;61425:43;61308:167;:::o;61481:220::-;61621:34;61617:1;61609:6;61605:14;61598:58;61690:3;61685:2;61677:6;61673:15;61666:28;61481:220;:::o;61707:179::-;61847:31;61843:1;61835:6;61831:14;61824:55;61707:179;:::o;61892:236::-;62032:34;62028:1;62020:6;62016:14;62009:58;62101:19;62096:2;62088:6;62084:15;62077:44;61892:236;:::o;62134:231::-;62274:34;62270:1;62262:6;62258:14;62251:58;62343:14;62338:2;62330:6;62326:15;62319:39;62134:231;:::o;62371:163::-;62511:15;62507:1;62499:6;62495:14;62488:39;62371:163;:::o;62540:235::-;62680:34;62676:1;62668:6;62664:14;62657:58;62749:18;62744:2;62736:6;62732:15;62725:43;62540:235;:::o;62781:122::-;62854:24;62872:5;62854:24;:::i;:::-;62847:5;62844:35;62834:63;;62893:1;62890;62883:12;62834:63;62781:122;:::o;62909:138::-;62990:32;63016:5;62990:32;:::i;:::-;62983:5;62980:43;62970:71;;63037:1;63034;63027:12;62970:71;62909:138;:::o;63053:116::-;63123:21;63138:5;63123:21;:::i;:::-;63116:5;63113:32;63103:60;;63159:1;63156;63149:12;63103:60;63053:116;:::o;63175:122::-;63248:24;63266:5;63248:24;:::i;:::-;63241:5;63238:35;63228:63;;63287:1;63284;63277:12;63228:63;63175:122;:::o;63303:120::-;63375:23;63392:5;63375:23;:::i;:::-;63368:5;63365:34;63355:62;;63413:1;63410;63403:12;63355:62;63303:120;:::o;63429:122::-;63502:24;63520:5;63502:24;:::i;:::-;63495:5;63492:35;63482:63;;63541:1;63538;63531:12;63482:63;63429:122;:::o;63557:118::-;63628:22;63644:5;63628:22;:::i;:::-;63621:5;63618:33;63608:61;;63665:1;63662;63655:12;63608:61;63557:118;:::o
Swarm Source
ipfs://46b1ba31fbd2b2fbb37b09ef5961fecce9841c1b7552bacc029475f6bbac255d
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.