Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60806040 | 12910747 | 1081 days ago | IN | Create: NFTXv12Migration | 0 ETH | 0.23439446 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
NFTXv12Migration
Compiler Version
v0.6.8+commit.0bbfe453
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-07-27 */ // Sources flattened with hardhat v2.4.3 https://hardhat.org // File contracts/solidity/contracts-v1/Context.sol // SPDX-License-Identifier: MIT pragma solidity 0.6.8; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File contracts/solidity/contracts-v1/Initializable.sol pragma solidity >=0.4.24 <0.7.0; /** * @title Initializable * * @dev Helper contract to support initializer functions. To use it, replace * the constructor with a function that has the `initializer` modifier. * WARNING: Unlike constructors, initializer functions must be manually * invoked. This applies both to deploying an Initializable contract, as well * as extending an Initializable contract via inheritance. * WARNING: When used with inheritance, manual care must be taken to not invoke * a parent initializer twice, or ensure that all initializers are idempotent, * because this is not dealt with automatically as with constructors. */ contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private initializing; /** * @dev Modifier to use in the initializer function of a contract. */ modifier initializer() { require( initializing || isConstructor() || !initialized, "Contract instance has already been initialized" ); bool isTopLevelCall = !initializing; if (isTopLevelCall) { initializing = true; initialized = true; } _; if (isTopLevelCall) { initializing = false; } } /// @dev Returns true if and only if the function is running in the constructor function isConstructor() private view returns (bool) { // extcodesize checks the size of the code stored in an address, and // address returns the current address. Since the code is still not // deployed when running a constructor, any checks on its code size will // yield zero, making it an effective way to detect if a contract is // under construction or not. address self = address(this); uint256 cs; assembly { cs := extcodesize(self) } return cs == 0; } // Reserved storage space to allow for layout changes in the future. uint256[50] private ______gap; } // File contracts/solidity/contracts-v1/Ownable.sol pragma solidity 0.6.8; /** * @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. */ contract Ownable is Context, Initializable { address private _owner; event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function initOwnable() internal virtual initializer { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require( newOwner != address(0), "Ownable: new owner is the zero address" ); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File contracts/solidity/contracts-v1/SafeMath.sol pragma solidity 0.6.8; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @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) { // 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 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts 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) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts 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 mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message 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, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File contracts/solidity/contracts-v1/Pausable.sol pragma solidity 0.6.8; contract Pausable is Ownable { mapping(uint256 => bool) isPaused; // 0 : createVault // 1 : mint // 2 : redeem // 3 : mintAndRedeem // 4 : migrateV1Tokens function onlyOwnerIfPaused(uint256 pauserId) public view virtual { require(!isPaused[pauserId] || msg.sender == owner(), "Paused"); } function setPaused(uint256 pauserId, bool _isPaused) public virtual onlyOwner { isPaused[pauserId] = _isPaused; } } // File contracts/solidity/contracts-v1/IERC20.sol pragma solidity 0.6.8; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval( address indexed owner, address indexed spender, uint256 value ); } // File contracts/solidity/contracts-v1/IXToken.sol pragma solidity 0.6.8; interface IXToken is IERC20 { function owner() external returns (address); function burn(uint256 amount) external; function burnFrom(address account, uint256 amount) external; function mint(address to, uint256 amount) external; function changeName(string calldata name) external; function changeSymbol(string calldata symbol) external; function setVaultAddress(address vaultAddress) external; function transferOwnership(address newOwner) external; } // File contracts/solidity/contracts-v1/IERC165.sol pragma solidity ^0.6.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 contracts/solidity/contracts-v1/IERC721.sol pragma solidity ^0.6.2; /** * @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 contracts/solidity/contracts-v1/ReentrancyGuard.sol pragma solidity 0.6.8; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ contract ReentrancyGuard is Initializable { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the revault on every call to nonReentrant will be lower in // amount. Since revaults are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full revault coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; function initReentrancyGuard() internal { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a revault is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File contracts/solidity/contracts-v1/IERC721Receiver.sol pragma solidity ^0.6.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 contracts/solidity/contracts-v1/ERC721Holder.sol pragma solidity ^0.6.0; /** * @dev Implementation of the {IERC721Receiver} interface. * * Accepts all token transfers. * Make sure the contract is able to use its token with {IERC721-safeTransferFrom}, {IERC721-approve} or {IERC721-setApprovalForAll}. */ contract ERC721Holder is IERC721Receiver { /** * @dev See {IERC721Receiver-onERC721Received}. * * Always returns `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address, address, uint256, bytes memory ) public virtual override returns (bytes4) { return this.onERC721Received.selector; } } // File contracts/solidity/contracts-v1/EnumerableSet.sol pragma solidity 0.6.8; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.0.0, only sets of type `address` (`AddressSet`) and `uint256` * (`UintSet`) are supported. */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement. bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { require( set._values.length > index, "EnumerableSet: index out of bounds" ); return set._values[index]; } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(value))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(value))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(value))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint256(_at(set._inner, index))); } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } } // File contracts/solidity/contracts-v1/IXStore.sol pragma solidity 0.6.8; interface IXStore { struct FeeParams { uint256 ethBase; uint256 ethStep; } struct BountyParams { uint256 ethMax; uint256 length; } struct Vault { address xTokenAddress; address nftAddress; address manager; IXToken xToken; IERC721 nft; EnumerableSet.UintSet holdings; EnumerableSet.UintSet reserves; mapping(uint256 => address) requester; mapping(uint256 => bool) isEligible; mapping(uint256 => bool) shouldReserve; bool allowMintRequests; bool flipEligOnRedeem; bool negateEligibility; bool isFinalized; bool isClosed; FeeParams mintFees; FeeParams burnFees; FeeParams dualFees; BountyParams supplierBounty; uint256 ethBalance; uint256 tokenBalance; bool isD2Vault; address d2AssetAddress; IERC20 d2Asset; uint256 d2Holdings; } function isExtension(address addr) external view returns (bool); function randNonce() external view returns (uint256); function vaultsLength() external view returns (uint256); function xTokenAddress(uint256 vaultId) external view returns (address); function nftAddress(uint256 vaultId) external view returns (address); function manager(uint256 vaultId) external view returns (address); function xToken(uint256 vaultId) external view returns (IXToken); function nft(uint256 vaultId) external view returns (IERC721); function holdingsLength(uint256 vaultId) external view returns (uint256); function holdingsContains(uint256 vaultId, uint256 elem) external view returns (bool); function holdingsAt(uint256 vaultId, uint256 index) external view returns (uint256); function reservesLength(uint256 vaultId) external view returns (uint256); function reservesContains(uint256 vaultId, uint256 elem) external view returns (bool); function reservesAt(uint256 vaultId, uint256 index) external view returns (uint256); function requester(uint256 vaultId, uint256 id) external view returns (address); function isEligible(uint256 vaultId, uint256 id) external view returns (bool); function shouldReserve(uint256 vaultId, uint256 id) external view returns (bool); function allowMintRequests(uint256 vaultId) external view returns (bool); function flipEligOnRedeem(uint256 vaultId) external view returns (bool); function negateEligibility(uint256 vaultId) external view returns (bool); function isFinalized(uint256 vaultId) external view returns (bool); function isClosed(uint256 vaultId) external view returns (bool); function mintFees(uint256 vaultId) external view returns (uint256, uint256); function burnFees(uint256 vaultId) external view returns (uint256, uint256); function dualFees(uint256 vaultId) external view returns (uint256, uint256); function supplierBounty(uint256 vaultId) external view returns (uint256, uint256); function ethBalance(uint256 vaultId) external view returns (uint256); function tokenBalance(uint256 vaultId) external view returns (uint256); function isD2Vault(uint256 vaultId) external view returns (bool); function d2AssetAddress(uint256 vaultId) external view returns (address); function d2Asset(uint256 vaultId) external view returns (IERC20); function d2Holdings(uint256 vaultId) external view returns (uint256); function setXTokenAddress(uint256 vaultId, address _xTokenAddress) external; function setNftAddress(uint256 vaultId, address _assetAddress) external; function setManager(uint256 vaultId, address _manager) external; function setXToken(uint256 vaultId) external; function setNft(uint256 vaultId) external; function holdingsAdd(uint256 vaultId, uint256 elem) external; function holdingsRemove(uint256 vaultId, uint256 elem) external; function reservesAdd(uint256 vaultId, uint256 elem) external; function reservesRemove(uint256 vaultId, uint256 elem) external; function setRequester(uint256 vaultId, uint256 id, address _requester) external; function setIsEligible(uint256 vaultId, uint256 id, bool _bool) external; function setShouldReserve(uint256 vaultId, uint256 id, bool _shouldReserve) external; function setAllowMintRequests(uint256 vaultId, bool isAllowed) external; function setFlipEligOnRedeem(uint256 vaultId, bool flipElig) external; function setNegateEligibility(uint256 vaultId, bool negateElig) external; function setIsFinalized(uint256 vaultId, bool _isFinalized) external; function setIsClosed(uint256 vaultId, bool _isClosed) external; function setMintFees(uint256 vaultId, uint256 ethBase, uint256 ethStep) external; function setBurnFees(uint256 vaultId, uint256 ethBase, uint256 ethStep) external; function setDualFees(uint256 vaultId, uint256 ethBase, uint256 ethStep) external; function setSupplierBounty(uint256 vaultId, uint256 ethMax, uint256 length) external; function setEthBalance(uint256 vaultId, uint256 _ethBalance) external; function setTokenBalance(uint256 vaultId, uint256 _tokenBalance) external; function setIsD2Vault(uint256 vaultId, bool _isD2Vault) external; function setD2AssetAddress(uint256 vaultId, address _assetAddress) external; function setD2Asset(uint256 vaultId) external; function setD2Holdings(uint256 vaultId, uint256 _d2Holdings) external; //////////////////////////////////////////////////////////// function setIsExtension(address addr, bool _isExtension) external; function setRandNonce(uint256 _randNonce) external; function addNewVault() external returns (uint256); } // File contracts/solidity/contracts-v1/Address.sol pragma solidity 0.6.8; /** * @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 in extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive vaults via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require( address(this).balance >= amount, "Address: insufficient balance" ); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{value: amount}(""); require( success, "Address: unable to send value, recipient may have reverted" ); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return _functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue( target, data, value, "Address: low-level call with value failed" ); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require( address(this).balance >= value, "Address: insufficient balance for call" ); return _functionCallWithValue(target, data, value, errorMessage); } function _functionCallWithValue( address target, bytes memory data, uint256 weiValue, string memory errorMessage ) private returns (bytes memory) { require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{value: weiValue}( data ); if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File contracts/solidity/contracts-v1/SafeERC20.sol pragma solidity 0.6.8; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn( token, abi.encodeWithSelector(token.transfer.selector, to, value) ); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn( token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value) ); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn( token, abi.encodeWithSelector(token.approve.selector, spender, value) ); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add( value ); _callOptionalReturn( token, abi.encodeWithSelector( token.approve.selector, spender, newAllowance ) ); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub( value, "SafeERC20: decreased allowance below zero" ); _callOptionalReturn( token, abi.encodeWithSelector( token.approve.selector, spender, newAllowance ) ); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall( data, "SafeERC20: low-level call failed" ); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require( abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed" ); } } } interface IXTokenFactory { function createXToken(string calldata name, string calldata symbol) external returns (address); event NewXToken(address _xTokenAddress); } interface IERC1155 is IERC165 { event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); event TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values); event ApprovalForAll(address indexed account, address indexed operator, bool approved); event URI(string value, uint256 indexed id); function balanceOf(address account, uint256 id) external view returns (uint256); function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory); function setApprovalForAll(address operator, bool approved) external; function isApprovedForAll(address account, address operator) external view returns (bool); function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes calldata data) external; function safeBatchTransferFrom(address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data) external; } interface IERC1155Receiver is IERC165 { function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns(bytes4); function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns(bytes4); } interface KittyCore { function transfer(address _to, uint256 _tokenId) external; } interface KittyCoreAlt { function transferFrom( address _from, address _to, uint256 _tokenId ) external; } pragma solidity 0.6.8; contract NFTX is Pausable, ReentrancyGuard, ERC721Holder, IERC1155Receiver { using SafeMath for uint256; using SafeERC20 for IERC20; event NewVault(uint256 indexed vaultId, address sender); event Mint( uint256 indexed vaultId, uint256[] nftIds, uint256 d2Amount, address sender ); event Redeem( uint256 indexed vaultId, uint256[] nftIds, uint256 d2Amount, address sender ); event MintRequested( uint256 indexed vaultId, uint256[] nftIds, address sender ); IXStore public store; mapping(uint256 => bool) public isVault1155; mapping(uint256 => uint256) public rangeStart; mapping(uint256 => uint256) public rangeEnd; function initialize(address storeAddress) public initializer { initOwnable(); initReentrancyGuard(); store = IXStore(storeAddress); } /* function onlyManager(uint256 vaultId) internal view { } */ function onlyPrivileged(uint256 vaultId) internal view { if (store.isFinalized(vaultId)) { require(msg.sender == owner(), "Not owner"); } else { require(msg.sender == store.manager(vaultId), "Not manager"); } } function onERC1155Received( address, address, uint256, uint256, bytes memory ) public virtual override returns (bytes4) { return this.onERC1155Received.selector; } function onERC1155BatchReceived( address, address, uint256[] memory, uint256[] memory, bytes memory ) public virtual override returns (bytes4) { return this.onERC1155BatchReceived.selector; } function supportsInterface(bytes4 interfaceId) external override view returns (bool) {} function isEligible(uint256 vaultId, uint256 nftId) public view virtual returns (bool) { if (rangeEnd[vaultId] > 0) { if (nftId >= rangeStart[vaultId] && nftId <= rangeEnd[vaultId]) { return true; } } return store.negateEligibility(vaultId) ? !store.isEligible(vaultId, nftId) : store.isEligible(vaultId, nftId); } function vaultSize(uint256 vaultId) public view virtual returns (uint256) { return store.isD2Vault(vaultId) ? store.d2Holdings(vaultId) : store.holdingsLength(vaultId); // Updated here to fix length bug. } function _getPseudoRand(uint256 modulus) internal virtual returns (uint256) { store.setRandNonce(store.randNonce().add(1)); return uint256( keccak256(abi.encodePacked(now, msg.sender, store.randNonce())) ) % modulus; } function createVault( string memory name, string memory symbol, address _assetAddress, bool _isD2Vault ) public virtual nonReentrant returns (uint256) { onlyOwnerIfPaused(0); IXTokenFactory xTokenFactory = IXTokenFactory( 0xE7ac17cE2550f3a0B4fE3616515975eb093CEfea ); address xTokenAddress = xTokenFactory.createXToken(name, symbol); uint256 vaultId = store.addNewVault(); store.setXTokenAddress(vaultId, xTokenAddress); store.setXToken(vaultId); if (!_isD2Vault) { store.setNftAddress(vaultId, _assetAddress); store.setNft(vaultId); store.setNegateEligibility(vaultId, true); } else { store.setD2AssetAddress(vaultId, _assetAddress); store.setD2Asset(vaultId); store.setIsD2Vault(vaultId, true); } store.setManager(vaultId, msg.sender); emit NewVault(vaultId, msg.sender); return vaultId; } // function depositETH(uint256 vaultId) public payable virtual { // store.setEthBalance(vaultId, store.ethBalance(vaultId).add(msg.value)); // } // function requestMint(uint256 vaultId, uint256[] memory nftIds) // public // payable // virtual // nonReentrant // { // onlyOwnerIfPaused(1); // require(store.allowMintRequests(vaultId), "1"); // for (uint256 i = 0; i < nftIds.length; i = i.add(1)) { // if (vaultId > 6 && vaultId < 10) { // KittyCoreAlt kittyCoreAlt = // KittyCoreAlt(store.nftAddress(vaultId)); // kittyCoreAlt.transferFrom(msg.sender, address(this), nftIds[i]); // } else { // store.nft(vaultId).safeTransferFrom( // msg.sender, // address(this), // nftIds[i] // ); // } // store.setRequester(vaultId, nftIds[i], msg.sender); // } // emit MintRequested(vaultId, nftIds, msg.sender); // } function revokeMintRequests(uint256 vaultId, uint256[] memory nftIds) public virtual nonReentrant { for (uint256 i = 0; i < nftIds.length; i = i.add(1)) { require( store.requester(vaultId, nftIds[i]) == msg.sender, "Not requester" ); store.setRequester(vaultId, nftIds[i], address(0)); if (vaultId > 6 && vaultId < 10) { KittyCore kittyCore = KittyCore(store.nftAddress(vaultId)); kittyCore.transfer(msg.sender, nftIds[i]); } else { store.nft(vaultId).safeTransferFrom( address(this), msg.sender, nftIds[i] ); } } } function approveMintRequest(uint256 vaultId, uint256[] memory nftIds) public virtual { onlyPrivileged(vaultId); for (uint256 i = 0; i < nftIds.length; i = i.add(1)) { address requester = store.requester(vaultId, nftIds[i]); require(requester != address(0), "No request"); require( store.nft(vaultId).ownerOf(nftIds[i]) == address(this), "Not owner" ); store.setRequester(vaultId, nftIds[i], address(0)); store.setIsEligible(vaultId, nftIds[i], true); store.holdingsAdd(vaultId, nftIds[i]); store.xToken(vaultId).mint(requester, 10**18); } } function _mint(uint256 vaultId, uint256[] memory nftIds, bool isDualOp) internal virtual { for (uint256 i = 0; i < nftIds.length; i = i.add(1)) { uint256 nftId = nftIds[i]; require(isEligible(vaultId, nftId), "1"); if (isVault1155[vaultId]) { IERC1155 nft = IERC1155(store.nftAddress(vaultId)); nft.safeTransferFrom(msg.sender, address(this), nftId, 1, ""); } else { require( store.nft(vaultId).ownerOf(nftId) != address(this), "2" ); store.nft(vaultId).transferFrom(msg.sender, address(this), nftId); require( store.nft(vaultId).ownerOf(nftId) == address(this), "3" ); } store.holdingsAdd(vaultId, nftId); } store.xToken(vaultId).mint(msg.sender, nftIds.length.mul(10**18)); } function _mintD2(uint256 vaultId, uint256 amount) internal virtual { store.d2Asset(vaultId).safeTransferFrom( msg.sender, address(this), amount.mul(1000) ); store.xToken(vaultId).mint(msg.sender, amount); store.setD2Holdings( vaultId, store.d2Holdings(vaultId).add(amount.mul(1000)) ); } function _redeem(uint256 vaultId, uint256 numNFTs, bool isDualOp) internal virtual { for (uint256 i = 0; i < numNFTs; i = i.add(1)) { uint256[] memory nftIds = new uint256[](1); uint256 rand = _getPseudoRand(store.holdingsLength(vaultId)); nftIds[0] = store.holdingsAt(vaultId, rand); _redeemHelper(vaultId, nftIds, isDualOp); emit Redeem(vaultId, nftIds, 0, msg.sender); } } function _redeemD2(uint256 vaultId, uint256 amount) internal virtual { store.xToken(vaultId).burnFrom(msg.sender, amount); store.d2Asset(vaultId).safeTransfer(msg.sender, amount.mul(1000)); store.setD2Holdings( vaultId, store.d2Holdings(vaultId).sub(amount.mul(1000)) ); } function _redeemHelper( uint256 vaultId, uint256[] memory nftIds, bool isDualOp ) internal virtual { store.xToken(vaultId).burnFrom(msg.sender, nftIds.length.mul(10**18)); for (uint256 i = 0; i < nftIds.length; i = i.add(1)) { uint256 nftId = nftIds[i]; require(store.holdingsContains(vaultId, nftId), "1"); if (store.holdingsContains(vaultId, nftId)) { store.holdingsRemove(vaultId, nftId); } if (store.flipEligOnRedeem(vaultId)) { bool isElig = store.isEligible(vaultId, nftId); store.setIsEligible(vaultId, nftId, !isElig); } if (isVault1155[vaultId]) { IERC1155 nft = IERC1155(store.nftAddress(vaultId)); nft.safeTransferFrom(address(this), msg.sender, nftId, 1, ""); } else if (vaultId > 6 && vaultId < 10) { KittyCore kittyCore = KittyCore(store.nftAddress(vaultId)); kittyCore.transfer(msg.sender, nftId); } else { store.nft(vaultId).safeTransferFrom( address(this), msg.sender, nftId ); } } } function mint(uint256 vaultId, uint256[] memory nftIds, uint256 d2Amount) public payable virtual nonReentrant { onlyOwnerIfPaused(1); if (store.isD2Vault(vaultId)) { _mintD2(vaultId, d2Amount); } else { _mint(vaultId, nftIds, false); } emit Mint(vaultId, nftIds, d2Amount, msg.sender); } function redeem(uint256 vaultId, uint256 amount) public payable virtual nonReentrant { onlyOwnerIfPaused(2); if (!store.isD2Vault(vaultId)) { _redeem(vaultId, amount, false); } else { _redeemD2(vaultId, amount); } } function setIsEligible( uint256 vaultId, uint256[] memory nftIds, bool _boolean ) public virtual { onlyPrivileged(vaultId); for (uint256 i = 0; i < nftIds.length; i = i.add(1)) { store.setIsEligible(vaultId, nftIds[i], _boolean); } } function setNegateEligibility(uint256 vaultId, bool shouldNegate) public virtual { onlyPrivileged(vaultId); require( store .holdingsLength(vaultId) .add(store.d2Holdings(vaultId)) == 0, "1" ); store.setNegateEligibility(vaultId, shouldNegate); } function setIs1155( uint256 vaultId, bool _boolean ) public virtual { onlyPrivileged(vaultId); isVault1155[vaultId] = _boolean; } // function setAllowMintRequests(uint256 vaultId, bool isAllowed) // public // virtual // { // onlyPrivileged(vaultId); // store.setAllowMintRequests(vaultId, isAllowed); // } function setFlipEligOnRedeem(uint256 vaultId, bool flipElig) public virtual { onlyPrivileged(vaultId); store.setFlipEligOnRedeem(vaultId, flipElig); } function setManager(uint256 vaultId, address newManager) public virtual { onlyPrivileged(vaultId); store.setManager(vaultId, newManager); } function finalizeVault(uint256 vaultId) public virtual { onlyPrivileged(vaultId); if (!store.isFinalized(vaultId)) { store.setIsFinalized(vaultId, true); } } function closeVault(uint256 vaultId) public virtual { onlyPrivileged(vaultId); if (!store.isFinalized(vaultId)) { store.setIsFinalized(vaultId, true); } store.setIsClosed(vaultId, true); } } interface INFTXVaultFactory { // Read functions. function numVaults() external view returns (uint256); function zapContract() external view returns (address); function feeDistributor() external view returns (address); function eligibilityManager() external view returns (address); function vault(uint256 vaultId) external view returns (address); function vaultsForAsset(address asset) external view returns (address[] memory); } interface INFTXVault { function assetAddress() external returns (address); function vaultFactory() external returns (address); function eligibilityStorage() external returns (address); function is1155() external returns (bool); function allowAllItems() external returns (bool); function vaultId() external returns (uint256); function mintFee() external returns (uint256); function randomRedeemFee() external returns (uint256); function targetRedeemFee() external returns (uint256); function mint( uint256[] calldata tokenIds, uint256[] calldata amounts /* ignored for ERC721 vaults */ ) external returns (uint256); function redeem(uint256 amount, uint256[] calldata specificIds) external returns (uint256[] memory); } interface WrappedPunks { function burn(uint256 punkIndex) external; } contract NFTXv12Migration is NFTX { // v1 ID -> v2 Vault mapping(uint256 => address) public migrationPair; mapping(uint256 => bool) public isFullyMigrated; function migrateVaultToV2(uint256 v1VaultId, uint256 v2VaultId, uint256 count) external onlyOwner { // Safeguards. if (v1VaultId == 3) { revert("Migration not allowed"); } uint256 totalHoldings = store.holdingsLength(v1VaultId); require(totalHoldings > 0, "Empty vault"); require(count != 0, "Count cannot be 0"); if (count > totalHoldings) { count = totalHoldings; } // Make sure we're not overriding an existing migration. address v2Vault = INFTXVaultFactory(0xBE86f647b167567525cCAAfcd6f881F1Ee558216).vault(v2VaultId); address v2Addr = migrationPair[v1VaultId]; require(v2Addr == address(0) || v2Addr == v2Vault, "Cannot overwrite migration pair"); // Approveand migrate the assets. address assetAddr = INFTXVault(v2Vault).assetAddress(); uint256[] memory ids = new uint256[](count); uint256[] memory amounts = new uint256[](count); for (uint256 i = 0; i < count; i++) { uint256 tokenId = store.holdingsAt(v1VaultId, i); ids[i] = tokenId; amounts[i] = 1; approveERC721(assetAddr, v2Vault, tokenId); } for (uint256 i = 0; i < ids.length; i++) { store.holdingsRemove(v1VaultId, ids[i]); } uint256 v2BalBefore = IERC20(v2Vault).balanceOf(address(this)); INFTXVault(v2Vault).mint(ids, amounts); // Ensure we got the right amount back. uint256 v2BalAfter = IERC20(v2Vault).balanceOf(address(this)); require(v2BalAfter-v2BalBefore == count * 10**18, "Received less than expected v2"); migrationPair[v1VaultId] = v2Vault; if (store.holdingsLength(v1VaultId) == 0) { isFullyMigrated[v1VaultId] = true; } } function targetRedeem(uint256 v1VaultId, uint256[] calldata specificIds) external onlyOwner { _redeemHelper(v1VaultId, specificIds, false); emit Redeem(v1VaultId, specificIds, 0, msg.sender); } function targetWithdraw(uint256 v1VaultId, uint256[] calldata specificIds) external onlyOwner { for (uint256 i = 0; i < specificIds.length; i = i.add(1)) { uint256 nftId = specificIds[i]; require(store.holdingsContains(v1VaultId, nftId), "1"); if (store.holdingsContains(v1VaultId, nftId)) { store.holdingsRemove(v1VaultId, nftId); } if (v1VaultId > 6 && v1VaultId < 10) { KittyCore kittyCore = KittyCore(store.nftAddress(v1VaultId)); kittyCore.transfer(msg.sender, nftId); } else { store.nft(v1VaultId).safeTransferFrom( address(this), msg.sender, nftId ); } } } function forceMigrationComplete(uint256 v1VaultId) external onlyOwner { isFullyMigrated[v1VaultId] = true; } function migrateV1Tokens(uint256 v1VaultId) external { onlyOwnerIfPaused(4); require(isFullyMigrated[v1VaultId], "This vault has not been migrated"); IXToken xToken = store.xToken(v1VaultId); uint256 bal = xToken.balanceOf(msg.sender); require(bal > 0, "0"); xToken.burnFrom(msg.sender, bal); IERC20 v2Token = IERC20(migrationPair[v1VaultId]); v2Token.transfer(msg.sender, bal); } function approveERC721(address assetAddr, address to, uint256 tokenId) internal virtual { address kitties = 0x06012c8cf97BEaD5deAe237070F9587f8E7A266d; address punks = 0xb47e3cd837dDF8e4c57F05d70Ab865de6e193BBB; // unwrap punks bytes memory data; if (assetAddr == kitties) { // Cryptokitties. data = abi.encodeWithSignature("approve(address,uint256)", to, tokenId); } else if (assetAddr == punks) { // Burn the wrapped punk. WrappedPunks(0xb7F7F6C52F2e2fdb1963Eab30438024864c313F6).burn(tokenId); // CryptoPunks. data = abi.encodeWithSignature("offerPunkForSaleToAddress(uint256,uint256,address)", tokenId, 0, to); } else { if (IERC721(assetAddr).isApprovedForAll(address(this), to)) { return; } // Default. data = abi.encodeWithSignature("setApprovalForAll(address,bool)", to, true); } (bool success, bytes memory resultData) = address(assetAddr).call(data); require(success, string(resultData)); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"vaultId","type":"uint256"},{"indexed":false,"internalType":"uint256[]","name":"nftIds","type":"uint256[]"},{"indexed":false,"internalType":"uint256","name":"d2Amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"sender","type":"address"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"vaultId","type":"uint256"},{"indexed":false,"internalType":"uint256[]","name":"nftIds","type":"uint256[]"},{"indexed":false,"internalType":"address","name":"sender","type":"address"}],"name":"MintRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"vaultId","type":"uint256"},{"indexed":false,"internalType":"address","name":"sender","type":"address"}],"name":"NewVault","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"vaultId","type":"uint256"},{"indexed":false,"internalType":"uint256[]","name":"nftIds","type":"uint256[]"},{"indexed":false,"internalType":"uint256","name":"d2Amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"sender","type":"address"}],"name":"Redeem","type":"event"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"},{"internalType":"uint256[]","name":"nftIds","type":"uint256[]"}],"name":"approveMintRequest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"}],"name":"closeVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"address","name":"_assetAddress","type":"address"},{"internalType":"bool","name":"_isD2Vault","type":"bool"}],"name":"createVault","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"}],"name":"finalizeVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"v1VaultId","type":"uint256"}],"name":"forceMigrationComplete","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"storeAddress","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"},{"internalType":"uint256","name":"nftId","type":"uint256"}],"name":"isEligible","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"isFullyMigrated","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"isVault1155","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"v1VaultId","type":"uint256"}],"name":"migrateV1Tokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"v1VaultId","type":"uint256"},{"internalType":"uint256","name":"v2VaultId","type":"uint256"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"migrateVaultToV2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"migrationPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"},{"internalType":"uint256[]","name":"nftIds","type":"uint256[]"},{"internalType":"uint256","name":"d2Amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pauserId","type":"uint256"}],"name":"onlyOwnerIfPaused","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rangeEnd","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rangeStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"redeem","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"},{"internalType":"uint256[]","name":"nftIds","type":"uint256[]"}],"name":"revokeMintRequests","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"},{"internalType":"bool","name":"flipElig","type":"bool"}],"name":"setFlipEligOnRedeem","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"},{"internalType":"bool","name":"_boolean","type":"bool"}],"name":"setIs1155","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"},{"internalType":"uint256[]","name":"nftIds","type":"uint256[]"},{"internalType":"bool","name":"_boolean","type":"bool"}],"name":"setIsEligible","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"},{"internalType":"address","name":"newManager","type":"address"}],"name":"setManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"},{"internalType":"bool","name":"shouldNegate","type":"bool"}],"name":"setNegateEligibility","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pauserId","type":"uint256"},{"internalType":"bool","name":"_isPaused","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"store","outputs":[{"internalType":"contract IXStore","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"v1VaultId","type":"uint256"},{"internalType":"uint256[]","name":"specificIds","type":"uint256[]"}],"name":"targetRedeem","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"v1VaultId","type":"uint256"},{"internalType":"uint256[]","name":"specificIds","type":"uint256[]"}],"name":"targetWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"}],"name":"vaultSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50615f6c80620000216000396000f3fe6080604052600436106102045760003560e01c806383e8d7e311610118578063daff97b5116100a0578063f09e82e21161006f578063f09e82e214610cb5578063f23a6e6114610ce5578063f2fde38b14610dbb578063f52e30a214610dee578063fabeaafd14610e7057610204565b8063daff97b514610c05578063db90bf3414610c37578063de54565e14610c61578063e161e0f114610c8b57610204565b8063a820f248116100e7578063a820f24814610806578063bc197c8114610888578063bd6978e614610a56578063c4d66de814610a8c578063d2fc990714610abf57610204565b806383e8d7e3146106d75780638da5cb5b14610709578063975057e71461073a578063a4ebfede1461074f57610204565b80632e644db11161019b578063715018a61161016a578063715018a61461058e57806378079411146105a35780637c77b616146105d55780637cbc2373146105ff57806383e4c5391461062257610204565b80632e644db1146104e657806331f669d514610510578063360c32881461053a57806364d715a31461056457610204565b8063150b7a02116101d7578063150b7a02146103635780631753ec88146104515780632911c27d1461047b5780632ad5f0a1146104b457610204565b806301ffc9a714610209578063065e8c06146102515780630daa2a4b1461027d57806313b0cc39146102b9575b600080fd5b34801561021557600080fd5b5061023d6004803603602081101561022c57600080fd5b50356001600160e01b031916610f25565b604080519115158252519081900360200190f35b34801561025d57600080fd5b5061027b6004803603602081101561027457600080fd5b5035610f2b565b005b34801561028957600080fd5b506102a7600480360360208110156102a057600080fd5b5035611020565b60408051918252519081900360200190f35b61027b600480360360608110156102cf57600080fd5b81359190810190604081016020820135600160201b8111156102f057600080fd5b82018360208201111561030257600080fd5b803590602001918460208302840111600160201b8311171561032357600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505091359250611032915050565b34801561036f57600080fd5b506104346004803603608081101561038657600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b8111156103c057600080fd5b8201836020820111156103d257600080fd5b803590602001918460018302840111600160201b831117156103f357600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506111c1945050505050565b604080516001600160e01b03199092168252519081900360200190f35b34801561045d57600080fd5b5061023d6004803603602081101561047457600080fd5b50356111d2565b34801561048757600080fd5b5061027b6004803603604081101561049e57600080fd5b50803590602001356001600160a01b03166111e7565b3480156104c057600080fd5b5061027b600480360360408110156104d757600080fd5b50803590602001351515611261565b3480156104f257600080fd5b506102a76004803603602081101561050957600080fd5b50356113f2565b34801561051c57600080fd5b506102a76004803603602081101561053357600080fd5b5035611404565b34801561054657600080fd5b5061027b6004803603602081101561055d57600080fd5b503561157c565b34801561057057600080fd5b5061023d6004803603602081101561058757600080fd5b50356116c2565b34801561059a57600080fd5b5061027b6116d7565b3480156105af57600080fd5b5061027b600480360360408110156105c657600080fd5b50803590602001351515611779565b3480156105e157600080fd5b5061027b600480360360208110156105f857600080fd5b50356117a2565b61027b6004803603604081101561061557600080fd5b5080359060200135611812565b34801561062e57600080fd5b5061027b6004803603604081101561064557600080fd5b81359190810190604081016020820135600160201b81111561066657600080fd5b82018360208201111561067857600080fd5b803590602001918460208302840111600160201b8311171561069957600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611908945050505050565b3480156106e357600080fd5b5061027b600480360360408110156106fa57600080fd5b50803590602001351515611d48565b34801561071557600080fd5b5061071e611da6565b604080516001600160a01b039092168252519081900360200190f35b34801561074657600080fd5b5061071e611db5565b34801561075b57600080fd5b5061027b6004803603606081101561077257600080fd5b81359190810190604081016020820135600160201b81111561079357600080fd5b8201836020820111156107a557600080fd5b803590602001918460208302840111600160201b831117156107c657600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505050503515159050611dc4565b34801561081257600080fd5b5061027b6004803603604081101561082957600080fd5b81359190810190604081016020820135600160201b81111561084a57600080fd5b82018360208201111561085c57600080fd5b803590602001918460208302840111600160201b8311171561087d57600080fd5b509092509050611e88565b34801561089457600080fd5b50610434600480360360a08110156108ab57600080fd5b6001600160a01b038235811692602081013590911691810190606081016040820135600160201b8111156108de57600080fd5b8201836020820111156108f057600080fd5b803590602001918460208302840111600160201b8311171561091157600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561096057600080fd5b82018360208201111561097257600080fd5b803590602001918460208302840111600160201b8311171561099357600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156109e257600080fd5b8201836020820111156109f457600080fd5b803590602001918460018302840111600160201b83111715610a1557600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506122a5945050505050565b348015610a6257600080fd5b5061027b60048036036060811015610a7957600080fd5b50803590602081013590604001356122b6565b348015610a9857600080fd5b5061027b60048036036020811015610aaf57600080fd5b50356001600160a01b0316612b12565b348015610acb57600080fd5b506102a760048036036080811015610ae257600080fd5b810190602081018135600160201b811115610afc57600080fd5b820183602082011115610b0e57600080fd5b803590602001918460018302840111600160201b83111715610b2f57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b811115610b8157600080fd5b820183602082011115610b9357600080fd5b803590602001918460018302840111600160201b83111715610bb457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550506001600160a01b0383351693505050602001351515612be0565b348015610c1157600080fd5b5061027b60048036036040811015610c2857600080fd5b50803590602001351515613207565b348015610c4357600080fd5b5061071e60048036036020811015610c5a57600080fd5b503561327f565b348015610c6d57600080fd5b5061027b60048036036020811015610c8457600080fd5b503561329a565b348015610c9757600080fd5b5061027b60048036036020811015610cae57600080fd5b5035613520565b348015610cc157600080fd5b5061023d60048036036040811015610cd857600080fd5b5080359060200135613593565b348015610cf157600080fd5b50610434600480360360a0811015610d0857600080fd5b6001600160a01b03823581169260208101359091169160408201359160608101359181019060a081016080820135600160201b811115610d4757600080fd5b820183602082011115610d5957600080fd5b803590602001918460018302840111600160201b83111715610d7a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550613768945050505050565b348015610dc757600080fd5b5061027b60048036036020811015610dde57600080fd5b50356001600160a01b0316613779565b348015610dfa57600080fd5b5061027b60048036036040811015610e1157600080fd5b81359190810190604081016020820135600160201b811115610e3257600080fd5b820183602082011115610e4457600080fd5b803590602001918460208302840111600160201b83111715610e6557600080fd5b509092509050613872565b348015610e7c57600080fd5b5061027b60048036036040811015610e9357600080fd5b81359190810190604081016020820135600160201b811115610eb457600080fd5b820183602082011115610ec657600080fd5b803590602001918460208302840111600160201b83111715610ee757600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550613993945050505050565b50600090565b610f3481613e85565b603654604080516333727c4d60e01b81526004810184905290516001600160a01b03909216916333727c4d91602480820192602092909190829003018186803b158015610f8057600080fd5b505afa158015610f94573d6000803e3d6000fd5b505050506040513d6020811015610faa57600080fd5b505161101d5760365460408051638991342b60e01b8152600481018490526001602482015290516001600160a01b0390921691638991342b9160448082019260009290919082900301818387803b15801561100457600080fd5b505af1158015611018573d6000803e3d6000fd5b505050505b50565b60396020526000908152604090205481565b60026035541415611078576040805162461bcd60e51b815260206004820152601f6024820152600080516020615e58833981519152604482015290519081900360640190fd5b600260355561108760016117a2565b60365460408051632650a9bb60e11b81526004810186905290516001600160a01b0390921691634ca1537691602480820192602092909190829003018186803b1580156110d357600080fd5b505afa1580156110e7573d6000803e3d6000fd5b505050506040513d60208110156110fd57600080fd5b5051156111135761110e8382614022565b61111f565b61111f8383600061425a565b827f1870fef12063ecb25738cfa99e018fc7ed7c3073cf1e6d58554470cac39ecf448383336040518080602001848152602001836001600160a01b03166001600160a01b03168152602001828103825285818151815260200191508051906020019060200280838360005b838110156111a257818101518382015260200161118a565b5050505090500194505050505060405180910390a25050600160355550565b630a85bd0160e11b5b949350505050565b603b6020526000908152604090205460ff1681565b6111f082613e85565b60365460408051632911c27d60e01b8152600481018590526001600160a01b03848116602483015291519190921691632911c27d91604480830192600092919082900301818387803b15801561124557600080fd5b505af1158015611259573d6000803e3d6000fd5b505050505050565b61126a82613e85565b60365460408051632de8d14760e11b8152600481018590529051611367926001600160a01b031691635bd1a28e916024808301926020929190829003018186803b1580156112b757600080fd5b505afa1580156112cb573d6000803e3d6000fd5b505050506040513d60208110156112e157600080fd5b50516036546040805163e94dbf8960e01b81526004810187905290516001600160a01b039092169163e94dbf8991602480820192602092909190829003018186803b15801561132f57600080fd5b505afa158015611343573d6000803e3d6000fd5b505050506040513d602081101561135957600080fd5b50519063ffffffff6148b016565b1561139d576040805162461bcd60e51b81526020600482015260016024820152603160f81b604482015290519081900360640190fd5b60365460408051632ad5f0a160e01b815260048101859052831515602482015290516001600160a01b0390921691632ad5f0a19160448082019260009290919082900301818387803b15801561124557600080fd5b60386020526000908152604090205481565b60365460408051632650a9bb60e11b81526004810184905290516000926001600160a01b031691634ca15376916024808301926020929190829003018186803b15801561145057600080fd5b505afa158015611464573d6000803e3d6000fd5b505050506040513d602081101561147a57600080fd5b50516114fd576036546040805163e94dbf8960e01b81526004810185905290516001600160a01b039092169163e94dbf8991602480820192602092909190829003018186803b1580156114cc57600080fd5b505afa1580156114e0573d6000803e3d6000fd5b505050506040513d60208110156114f657600080fd5b5051611576565b60365460408051632de8d14760e11b81526004810185905290516001600160a01b0390921691635bd1a28e91602480820192602092909190829003018186803b15801561154957600080fd5b505afa15801561155d573d6000803e3d6000fd5b505050506040513d602081101561157357600080fd5b50515b92915050565b61158581613e85565b603654604080516333727c4d60e01b81526004810184905290516001600160a01b03909216916333727c4d91602480820192602092909190829003018186803b1580156115d157600080fd5b505afa1580156115e5573d6000803e3d6000fd5b505050506040513d60208110156115fb57600080fd5b505161166e5760365460408051638991342b60e01b8152600481018490526001602482015290516001600160a01b0390921691638991342b9160448082019260009290919082900301818387803b15801561165557600080fd5b505af1158015611669573d6000803e3d6000fd5b505050505b6036546040805163be2cbc4f60e01b8152600481018490526001602482015290516001600160a01b039092169163be2cbc4f9160448082019260009290919082900301818387803b15801561100457600080fd5b60376020526000908152604090205460ff1681565b6116df61490a565b6033546001600160a01b0390811691161461172f576040805162461bcd60e51b81526020600482018190526024820152600080516020615ebf833981519152604482015290519081900360640190fd5b6033546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603380546001600160a01b0319169055565b61178282613e85565b600091825260376020526040909120805460ff1916911515919091179055565b60008181526034602052604090205460ff1615806117d857506117c3611da6565b6001600160a01b0316336001600160a01b0316145b61101d576040805162461bcd60e51b815260206004820152600660248201526514185d5cd95960d21b604482015290519081900360640190fd5b60026035541415611858576040805162461bcd60e51b815260206004820152601f6024820152600080516020615e58833981519152604482015290519081900360640190fd5b60026035819055611868906117a2565b60365460408051632650a9bb60e11b81526004810185905290516001600160a01b0390921691634ca1537691602480820192602092909190829003018186803b1580156118b457600080fd5b505afa1580156118c8573d6000803e3d6000fd5b505050506040513d60208110156118de57600080fd5b50516118f5576118f08282600061490e565b6118ff565b6118ff8282614b17565b50506001603555565b6002603554141561194e576040805162461bcd60e51b815260206004820152601f6024820152600080516020615e58833981519152604482015290519081900360640190fd5b600260355560005b8151811015611d3e57603654825133916001600160a01b031690635770f64090869086908690811061198457fe5b60200260200101516040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b1580156119c757600080fd5b505afa1580156119db573d6000803e3d6000fd5b505050506040513d60208110156119f157600080fd5b50516001600160a01b031614611a3e576040805162461bcd60e51b815260206004820152600d60248201526c2737ba103932b8bab2b9ba32b960991b604482015290519081900360640190fd5b60365482516001600160a01b0390911690637f10d314908590859085908110611a6357fe5b602002602001015160006040518463ffffffff1660e01b815260040180848152602001838152602001826001600160a01b03166001600160a01b031681526020019350505050600060405180830381600087803b158015611ac357600080fd5b505af1158015611ad7573d6000803e3d6000fd5b50505050600683118015611aeb5750600a83105b15611c015760365460408051633e23eea360e21b81526004810186905290516000926001600160a01b03169163f88fba8c916024808301926020929190829003018186803b158015611b3c57600080fd5b505afa158015611b50573d6000803e3d6000fd5b505050506040513d6020811015611b6657600080fd5b505183519091506001600160a01b0382169063a9059cbb903390869086908110611b8c57fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015611be357600080fd5b505af1158015611bf7573d6000803e3d6000fd5b5050505050611d26565b60365460408051639d0214cb60e01b81526004810186905290516001600160a01b0390921691639d0214cb91602480820192602092909190829003018186803b158015611c4d57600080fd5b505afa158015611c61573d6000803e3d6000fd5b505050506040513d6020811015611c7757600080fd5b505182516001600160a01b03909116906342842e0e9030903390869086908110611c9d57fe5b60200260200101516040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b031681526020018281526020019350505050600060405180830381600087803b158015611d0d57600080fd5b505af1158015611d21573d6000803e3d6000fd5b505050505b611d3781600163ffffffff6148b016565b9050611956565b5050600160355550565b611d5182613e85565b603654604080516383e8d7e360e01b815260048101859052831515602482015290516001600160a01b03909216916383e8d7e39160448082019260009290919082900301818387803b15801561124557600080fd5b6033546001600160a01b031690565b6036546001600160a01b031681565b611dcd83613e85565b60005b8251811015611e825760365483516001600160a01b0390911690639989f93a908690869085908110611dfe57fe5b6020026020010151856040518463ffffffff1660e01b815260040180848152602001838152602001821515151581526020019350505050600060405180830381600087803b158015611e4f57600080fd5b505af1158015611e63573d6000803e3d6000fd5b50505050611e7b6001826148b090919063ffffffff16565b9050611dd0565b50505050565b611e9061490a565b6033546001600160a01b03908116911614611ee0576040805162461bcd60e51b81526020600482018190526024820152600080516020615ebf833981519152604482015290519081900360640190fd5b60005b81811015611e82576000838383818110611ef957fe5b60365460408051637cb251d560e01b8152600481018b9052602093840295909501356024860181905290519095506001600160a01b0390911693637cb251d593506044808201939291829003018186803b158015611f5657600080fd5b505afa158015611f6a573d6000803e3d6000fd5b505050506040513d6020811015611f8057600080fd5b5051611fb7576040805162461bcd60e51b81526020600482015260016024820152603160f81b604482015290519081900360640190fd5b60365460408051637cb251d560e01b8152600481018890526024810184905290516001600160a01b0390921691637cb251d591604480820192602092909190829003018186803b15801561200a57600080fd5b505afa15801561201e573d6000803e3d6000fd5b505050506040513d602081101561203457600080fd5b5051156120a85760365460408051630f3e56c960e01b8152600481018890526024810184905290516001600160a01b0390921691630f3e56c99160448082019260009290919082900301818387803b15801561208f57600080fd5b505af11580156120a3573d6000803e3d6000fd5b505050505b6006851180156120b85750600a85105b156121a55760365460408051633e23eea360e21b81526004810188905290516000926001600160a01b03169163f88fba8c916024808301926020929190829003018186803b15801561210957600080fd5b505afa15801561211d573d6000803e3d6000fd5b505050506040513d602081101561213357600080fd5b50516040805163a9059cbb60e01b81523360048201526024810185905290519192506001600160a01b0383169163a9059cbb9160448082019260009290919082900301818387803b15801561218757600080fd5b505af115801561219b573d6000803e3d6000fd5b505050505061228c565b60365460408051639d0214cb60e01b81526004810188905290516001600160a01b0390921691639d0214cb91602480820192602092909190829003018186803b1580156121f157600080fd5b505afa158015612205573d6000803e3d6000fd5b505050506040513d602081101561221b57600080fd5b505160408051632142170760e11b81523060048201523360248201526044810184905290516001600160a01b03909216916342842e0e9160648082019260009290919082900301818387803b15801561227357600080fd5b505af1158015612287573d6000803e3d6000fd5b505050505b5061229e81600163ffffffff6148b016565b9050611ee3565b63bc197c8160e01b95945050505050565b6122be61490a565b6033546001600160a01b0390811691161461230e576040805162461bcd60e51b81526020600482018190526024820152600080516020615ebf833981519152604482015290519081900360640190fd5b826003141561235c576040805162461bcd60e51b8152602060048201526015602482015274135a59dc985d1a5bdb881b9bdd08185b1b1bddd959605a1b604482015290519081900360640190fd5b6036546040805163e94dbf8960e01b81526004810186905290516000926001600160a01b03169163e94dbf89916024808301926020929190829003018186803b1580156123a857600080fd5b505afa1580156123bc573d6000803e3d6000fd5b505050506040513d60208110156123d257600080fd5b5051905080612416576040805162461bcd60e51b815260206004820152600b60248201526a115b5c1d1e481d985d5b1d60aa1b604482015290519081900360640190fd5b8161245c576040805162461bcd60e51b81526020600482015260116024820152700436f756e742063616e6e6f74206265203607c1b604482015290519081900360640190fd5b80821115612468578091505b600073be86f647b167567525ccaafcd6f881f1ee5582166001600160a01b03166381a36fb6856040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156124c257600080fd5b505afa1580156124d6573d6000803e3d6000fd5b505050506040513d60208110156124ec57600080fd5b50516000868152603a60205260409020549091506001600160a01b03168015806125275750816001600160a01b0316816001600160a01b0316145b612578576040805162461bcd60e51b815260206004820152601f60248201527f43616e6e6f74206f7665727772697465206d6967726174696f6e207061697200604482015290519081900360640190fd5b6000826001600160a01b0316631ba46cfd6040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156125b557600080fd5b505af11580156125c9573d6000803e3d6000fd5b505050506040513d60208110156125df57600080fd5b5051905060608567ffffffffffffffff811180156125fc57600080fd5b50604051908082528060200260200182016040528015612626578160200160208202803683370190505b50905060608667ffffffffffffffff8111801561264257600080fd5b5060405190808252806020026020018201604052801561266c578160200160208202803683370190505b50905060005b87811015612746576036546040805163645058b360e01b8152600481018d90526024810184905290516000926001600160a01b03169163645058b3916044808301926020929190829003018186803b1580156126cd57600080fd5b505afa1580156126e1573d6000803e3d6000fd5b505050506040513d60208110156126f757600080fd5b50518451909150819085908490811061270c57fe5b602002602001018181525050600183838151811061272657fe5b60200260200101818152505061273d858883614d49565b50600101612672565b5060005b82518110156127e15760365483516001600160a01b0390911690630f3e56c9908c9086908590811061277857fe5b60200260200101516040518363ffffffff1660e01b81526004018083815260200182815260200192505050600060405180830381600087803b1580156127bd57600080fd5b505af11580156127d1573d6000803e3d6000fd5b50506001909201915061274a9050565b50604080516370a0823160e01b815230600482015290516000916001600160a01b038816916370a0823191602480820192602092909190829003018186803b15801561282c57600080fd5b505afa158015612840573d6000803e3d6000fd5b505050506040513d602081101561285657600080fd5b505160408051630f57464360e21b8152600481019182528551604482015285519293506001600160a01b03891692633d5d190c9287928792829160248101916064909101906020878101910280838360005b838110156128c05781810151838201526020016128a8565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156128ff5781810151838201526020016128e7565b50505050905001945050505050602060405180830381600087803b15801561292657600080fd5b505af115801561293a573d6000803e3d6000fd5b505050506040513d602081101561295057600080fd5b5050604080516370a0823160e01b815230600482015290516000916001600160a01b038916916370a0823191602480820192602092909190829003018186803b15801561299c57600080fd5b505afa1580156129b0573d6000803e3d6000fd5b505050506040513d60208110156129c657600080fd5b50519050818103670de0b6b3a76400008a0214612a2a576040805162461bcd60e51b815260206004820152601e60248201527f5265636569766564206c657373207468616e2065787065637465642076320000604482015290519081900360640190fd5b86603a60008d815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b03160217905550603660009054906101000a90046001600160a01b03166001600160a01b031663e94dbf898c6040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015612abb57600080fd5b505afa158015612acf573d6000803e3d6000fd5b505050506040513d6020811015612ae557600080fd5b5051612b055760008b8152603b60205260409020805460ff191660011790555b5050505050505050505050565b600054610100900460ff1680612b2b5750612b2b6150cd565b80612b39575060005460ff16155b612b745760405162461bcd60e51b815260040180806020018281038252602e815260200180615edf602e913960400191505060405180910390fd5b600054610100900460ff16158015612b9f576000805460ff1961ff0019909116610100171660011790555b612ba76150d3565b612baf6151cc565b603680546001600160a01b0319166001600160a01b0384161790558015612bdc576000805461ff00191690555b5050565b600060026035541415612c28576040805162461bcd60e51b815260206004820152601f6024820152600080516020615e58833981519152604482015290519081900360640190fd5b6002603555612c3760006117a2565b60408051633734cd1760e21b81526004810191825286516044820152865173e7ac17ce2550f3a0b4fe3616515975eb093cefea92600092849263dcd3345c928b928b928291602481019160649091019060208701908083838d5b83811015612ca9578181015183820152602001612c91565b50505050905090810190601f168015612cd65780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b83811015612d09578181015183820152602001612cf1565b50505050905090810190601f168015612d365780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b158015612d5757600080fd5b505af1158015612d6b573d6000803e3d6000fd5b505050506040513d6020811015612d8157600080fd5b50516036546040805163d80ce5e960e01b815290519293506000926001600160a01b039092169163d80ce5e99160048082019260209290919082900301818787803b158015612dcf57600080fd5b505af1158015612de3573d6000803e3d6000fd5b505050506040513d6020811015612df957600080fd5b505160365460408051631567925f60e01b8152600481018490526001600160a01b0386811660248301529151939450911691631567925f9160448082019260009290919082900301818387803b158015612e5257600080fd5b505af1158015612e66573d6000803e3d6000fd5b5050603654604080516301f6bbdf60e31b81526004810186905290516001600160a01b039092169350630fb5def8925060248082019260009290919082900301818387803b158015612eb757600080fd5b505af1158015612ecb573d6000803e3d6000fd5b50505050846130175760365460408051632250a27360e21b8152600481018490526001600160a01b0389811660248301529151919092169163894289cc91604480830192600092919082900301818387803b158015612f2957600080fd5b505af1158015612f3d573d6000803e3d6000fd5b505060365460408051630116c32b60e31b81526004810186905290516001600160a01b0390921693506308b61958925060248082019260009290919082900301818387803b158015612f8e57600080fd5b505af1158015612fa2573d6000803e3d6000fd5b505060365460408051632ad5f0a160e01b8152600481018690526001602482015290516001600160a01b039092169350632ad5f0a1925060448082019260009290919082900301818387803b158015612ffa57600080fd5b505af115801561300e573d6000803e3d6000fd5b50505050613156565b60365460408051636102815d60e01b8152600481018490526001600160a01b03898116602483015291519190921691636102815d91604480830192600092919082900301818387803b15801561306c57600080fd5b505af1158015613080573d6000803e3d6000fd5b505060365460408051638e3f545f60e01b81526004810186905290516001600160a01b039092169350638e3f545f925060248082019260009290919082900301818387803b1580156130d157600080fd5b505af11580156130e5573d6000803e3d6000fd5b5050603654604080516388779e5d60e01b8152600481018690526001602482015290516001600160a01b0390921693506388779e5d925060448082019260009290919082900301818387803b15801561313d57600080fd5b505af1158015613151573d6000803e3d6000fd5b505050505b60365460408051632911c27d60e01b81526004810184905233602482015290516001600160a01b0390921691632911c27d9160448082019260009290919082900301818387803b1580156131a957600080fd5b505af11580156131bd573d6000803e3d6000fd5b50506040805133815290518493507fc117b81c381b8c8066e461527733c2f11b87ebf36631b006cb5a74e3c0388b1392509081900360200190a26001603555979650505050505050565b61320f61490a565b6033546001600160a01b0390811691161461325f576040805162461bcd60e51b81526020600482018190526024820152600080516020615ebf833981519152604482015290519081900360640190fd5b600091825260346020526040909120805460ff1916911515919091179055565b603a602052600090815260409020546001600160a01b031681565b6132a460046117a2565b6000818152603b602052604090205460ff16613307576040805162461bcd60e51b815260206004820181905260248201527f54686973207661756c7420686173206e6f74206265656e206d69677261746564604482015290519081900360640190fd5b60365460408051631d1cae2360e31b81526004810184905290516000926001600160a01b03169163e8e57118916024808301926020929190829003018186803b15801561335357600080fd5b505afa158015613367573d6000803e3d6000fd5b505050506040513d602081101561337d57600080fd5b5051604080516370a0823160e01b815233600482015290519192506000916001600160a01b038416916370a08231916024808301926020929190829003018186803b1580156133cb57600080fd5b505afa1580156133df573d6000803e3d6000fd5b505050506040513d60208110156133f557600080fd5b505190508061342f576040805162461bcd60e51b81526020600482015260016024820152600360fc1b604482015290519081900360640190fd5b6040805163079cc67960e41b81523360048201526024810183905290516001600160a01b038416916379cc679091604480830192600092919082900301818387803b15801561347d57600080fd5b505af1158015613491573d6000803e3d6000fd5b5050506000848152603a6020908152604080832054815163a9059cbb60e01b81523360048201526024810187905291516001600160a01b039091169450849363a9059cbb93604480850194919392918390030190829087803b1580156134f657600080fd5b505af115801561350a573d6000803e3d6000fd5b505050506040513d602081101561125957600080fd5b61352861490a565b6033546001600160a01b03908116911614613578576040805162461bcd60e51b81526020600482018190526024820152600080516020615ebf833981519152604482015290519081900360640190fd5b6000908152603b60205260409020805460ff19166001179055565b600082815260396020526040812054156135e05760008381526038602052604090205482108015906135d357506000838152603960205260409020548211155b156135e057506001611576565b6036546040805163ec475a1f60e01b81526004810186905290516001600160a01b039092169163ec475a1f91602480820192602092909190829003018186803b15801561362c57600080fd5b505afa158015613640573d6000803e3d6000fd5b505050506040513d602081101561365657600080fd5b50516136e0576036546040805163784f417160e11b8152600481018690526024810185905290516001600160a01b039092169163f09e82e291604480820192602092909190829003018186803b1580156136af57600080fd5b505afa1580156136c3573d6000803e3d6000fd5b505050506040513d60208110156136d957600080fd5b5051613761565b6036546040805163784f417160e11b8152600481018690526024810185905290516001600160a01b039092169163f09e82e291604480820192602092909190829003018186803b15801561373357600080fd5b505afa158015613747573d6000803e3d6000fd5b505050506040513d602081101561375d57600080fd5b5051155b9392505050565b63f23a6e6160e01b95945050505050565b61378161490a565b6033546001600160a01b039081169116146137d1576040805162461bcd60e51b81526020600482018190526024820152600080516020615ebf833981519152604482015290519081900360640190fd5b6001600160a01b0381166138165760405162461bcd60e51b8152600401808060200182810382526026815260200180615e786026913960400191505060405180910390fd5b6033546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603380546001600160a01b0319166001600160a01b0392909216919091179055565b61387a61490a565b6033546001600160a01b039081169116146138ca576040805162461bcd60e51b81526020600482018190526024820152600080516020615ebf833981519152604482015290519081900360640190fd5b61390783838380806020026020016040519081016040528093929190818152602001838360200280828437600092018290525092506151d3915050565b827f8dd603fb9fd7fdd0be7a7c282962e1ac7c6d82e51fc34bd602ec1b83cf2dc93c83836000336040518080602001848152602001836001600160a01b03166001600160a01b031681526020018281038252868682818152602001925060200280828437600083820152604051601f909101601f191690920182900397509095505050505050a2505050565b61399c82613e85565b60005b8151811015613e805760365482516000916001600160a01b031690635770f6409086908690869081106139ce57fe5b60200260200101516040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b158015613a1157600080fd5b505afa158015613a25573d6000803e3d6000fd5b505050506040513d6020811015613a3b57600080fd5b505190506001600160a01b038116613a87576040805162461bcd60e51b815260206004820152600a602482015269139bc81c995c5d595cdd60b21b604482015290519081900360640190fd5b60365460408051639d0214cb60e01b815260048101879052905130926001600160a01b031691639d0214cb916024808301926020929190829003018186803b158015613ad257600080fd5b505afa158015613ae6573d6000803e3d6000fd5b505050506040513d6020811015613afc57600080fd5b505184516001600160a01b0390911690636352211e90869086908110613b1e57fe5b60200260200101516040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015613b5a57600080fd5b505afa158015613b6e573d6000803e3d6000fd5b505050506040513d6020811015613b8457600080fd5b50516001600160a01b031614613bcd576040805162461bcd60e51b81526020600482015260096024820152682737ba1037bbb732b960b91b604482015290519081900360640190fd5b60365483516001600160a01b0390911690637f10d314908690869086908110613bf257fe5b602002602001015160006040518463ffffffff1660e01b815260040180848152602001838152602001826001600160a01b03166001600160a01b031681526020019350505050600060405180830381600087803b158015613c5257600080fd5b505af1158015613c66573d6000803e3d6000fd5b505060365485516001600160a01b039091169250639989f93a91508690869086908110613c8f57fe5b602002602001015160016040518463ffffffff1660e01b815260040180848152602001838152602001821515151581526020019350505050600060405180830381600087803b158015613ce157600080fd5b505af1158015613cf5573d6000803e3d6000fd5b505060365485516001600160a01b039091169250634cef646591508690869086908110613d1e57fe5b60200260200101516040518363ffffffff1660e01b81526004018083815260200182815260200192505050600060405180830381600087803b158015613d6357600080fd5b505af1158015613d77573d6000803e3d6000fd5b505060365460408051631d1cae2360e31b81526004810189905290516001600160a01b03909216935063e8e571189250602480820192602092909190829003018186803b158015613dc757600080fd5b505afa158015613ddb573d6000803e3d6000fd5b505050506040513d6020811015613df157600080fd5b5051604080516340c10f1960e01b81526001600160a01b038481166004830152670de0b6b3a76400006024830152915191909216916340c10f1991604480830192600092919082900301818387803b158015613e4c57600080fd5b505af1158015613e60573d6000803e3d6000fd5b5050505050613e796001826148b090919063ffffffff16565b905061399f565b505050565b603654604080516333727c4d60e01b81526004810184905290516001600160a01b03909216916333727c4d91602480820192602092909190829003018186803b158015613ed157600080fd5b505afa158015613ee5573d6000803e3d6000fd5b505050506040513d6020811015613efb57600080fd5b505115613f6057613f0a611da6565b6001600160a01b0316336001600160a01b031614613f5b576040805162461bcd60e51b81526020600482015260096024820152682737ba1037bbb732b960b91b604482015290519081900360640190fd5b61101d565b60365460408051635298145760e01b81526004810184905290516001600160a01b0390921691635298145791602480820192602092909190829003018186803b158015613fac57600080fd5b505afa158015613fc0573d6000803e3d6000fd5b505050506040513d6020811015613fd657600080fd5b50516001600160a01b0316331461101d576040805162461bcd60e51b815260206004820152600b60248201526a2737ba1036b0b730b3b2b960a91b604482015290519081900360640190fd5b6140c83330614039846103e863ffffffff61591516565b603654604080516305bb848560e01b81526004810189905290516001600160a01b03909216916305bb848591602480820192602092909190829003018186803b15801561408557600080fd5b505afa158015614099573d6000803e3d6000fd5b505050506040513d60208110156140af57600080fd5b50516001600160a01b031692919063ffffffff61596e16565b60365460408051631d1cae2360e31b81526004810185905290516001600160a01b039092169163e8e5711891602480820192602092909190829003018186803b15801561411457600080fd5b505afa158015614128573d6000803e3d6000fd5b505050506040513d602081101561413e57600080fd5b5051604080516340c10f1960e01b81523360048201526024810184905290516001600160a01b03909216916340c10f199160448082019260009290919082900301818387803b15801561419057600080fd5b505af11580156141a4573d6000803e3d6000fd5b50506036546001600160a01b03169150632ef30ad090508361421d6141d1856103e863ffffffff61591516565b60365460408051632de8d14760e11b8152600481018a905290516001600160a01b0390921691635bd1a28e91602480820192602092909190829003018186803b15801561132f57600080fd5b6040518363ffffffff1660e01b81526004018083815260200182815260200192505050600060405180830381600087803b15801561124557600080fd5b60005b825181101561479d57600083828151811061427457fe5b602002602001015190506142888582613593565b6142bd576040805162461bcd60e51b81526020600482015260016024820152603160f81b604482015290519081900360640190fd5b60008581526037602052604090205460ff16156143d65760365460408051633e23eea360e21b81526004810188905290516000926001600160a01b03169163f88fba8c916024808301926020929190829003018186803b15801561432057600080fd5b505afa158015614334573d6000803e3d6000fd5b505050506040513d602081101561434a57600080fd5b505160408051637921219560e11b8152336004820152306024820152604481018590526001606482015260a06084820152600060a4820181905291519293506001600160a01b0384169263f242432a9260e48084019391929182900301818387803b1580156143b857600080fd5b505af11580156143cc573d6000803e3d6000fd5b5050505050614715565b60365460408051639d0214cb60e01b815260048101889052905130926001600160a01b031691639d0214cb916024808301926020929190829003018186803b15801561442157600080fd5b505afa158015614435573d6000803e3d6000fd5b505050506040513d602081101561444b57600080fd5b5051604080516331a9108f60e11b81526004810185905290516001600160a01b0390921691636352211e91602480820192602092909190829003018186803b15801561449657600080fd5b505afa1580156144aa573d6000803e3d6000fd5b505050506040513d60208110156144c057600080fd5b50516001600160a01b03161415614502576040805162461bcd60e51b81526020600482015260016024820152601960f91b604482015290519081900360640190fd5b60365460408051639d0214cb60e01b81526004810188905290516001600160a01b0390921691639d0214cb91602480820192602092909190829003018186803b15801561454e57600080fd5b505afa158015614562573d6000803e3d6000fd5b505050506040513d602081101561457857600080fd5b5051604080516323b872dd60e01b81523360048201523060248201526044810184905290516001600160a01b03909216916323b872dd9160648082019260009290919082900301818387803b1580156145d057600080fd5b505af11580156145e4573d6000803e3d6000fd5b505060365460408051639d0214cb60e01b8152600481018a905290513094506001600160a01b039092169250639d0214cb916024808301926020929190829003018186803b15801561463557600080fd5b505afa158015614649573d6000803e3d6000fd5b505050506040513d602081101561465f57600080fd5b5051604080516331a9108f60e11b81526004810185905290516001600160a01b0390921691636352211e91602480820192602092909190829003018186803b1580156146aa57600080fd5b505afa1580156146be573d6000803e3d6000fd5b505050506040513d60208110156146d457600080fd5b50516001600160a01b031614614715576040805162461bcd60e51b81526020600482015260016024820152603360f81b604482015290519081900360640190fd5b60365460408051634cef646560e01b8152600481018890526024810184905290516001600160a01b0390921691634cef64659160448082019260009290919082900301818387803b15801561476957600080fd5b505af115801561477d573d6000803e3d6000fd5b50505050506147966001826148b090919063ffffffff16565b905061425d565b5060365460408051631d1cae2360e31b81526004810186905290516001600160a01b039092169163e8e5711891602480820192602092909190829003018186803b1580156147ea57600080fd5b505afa1580156147fe573d6000803e3d6000fd5b505050506040513d602081101561481457600080fd5b505182516001600160a01b03909116906340c10f1990339061484490670de0b6b3a764000063ffffffff61591516565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050600060405180830381600087803b15801561489357600080fd5b505af11580156148a7573d6000803e3d6000fd5b50505050505050565b600082820183811015613761576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b3390565b60005b82811015611e825760408051600180825281830190925260609160208083019080368337019050506036546040805163e94dbf8960e01b81526004810189905290519293506000926149bd926001600160a01b03169163e94dbf89916024808301926020929190829003018186803b15801561498c57600080fd5b505afa1580156149a0573d6000803e3d6000fd5b505050506040513d60208110156149b657600080fd5b50516159c8565b6036546040805163645058b360e01b8152600481018a90526024810184905290519293506001600160a01b039091169163645058b391604480820192602092909190829003018186803b158015614a1357600080fd5b505afa158015614a27573d6000803e3d6000fd5b505050506040513d6020811015614a3d57600080fd5b505182518390600090614a4c57fe5b602002602001018181525050614a638683866151d3565b857f8dd603fb9fd7fdd0be7a7c282962e1ac7c6d82e51fc34bd602ec1b83cf2dc93c836000336040518080602001848152602001836001600160a01b03166001600160a01b03168152602001828103825285818151815260200191508051906020019060200280838360005b83811015614ae7578181015183820152602001614acf565b5050505090500194505050505060405180910390a250614b10905081600163ffffffff6148b016565b9050614911565b60365460408051631d1cae2360e31b81526004810185905290516001600160a01b039092169163e8e5711891602480820192602092909190829003018186803b158015614b6357600080fd5b505afa158015614b77573d6000803e3d6000fd5b505050506040513d6020811015614b8d57600080fd5b50516040805163079cc67960e41b81523360048201526024810184905290516001600160a01b03909216916379cc67909160448082019260009290919082900301818387803b158015614bdf57600080fd5b505af1158015614bf3573d6000803e3d6000fd5b50505050614c9e33614c106103e88461591590919063ffffffff16565b603654604080516305bb848560e01b81526004810188905290516001600160a01b03909216916305bb848591602480820192602092909190829003018186803b158015614c5c57600080fd5b505afa158015614c70573d6000803e3d6000fd5b505050506040513d6020811015614c8657600080fd5b50516001600160a01b0316919063ffffffff615b3b16565b6036546001600160a01b0316632ef30ad08361421d614cc5856103e863ffffffff61591516565b60365460408051632de8d14760e11b8152600481018a905290516001600160a01b0390921691635bd1a28e91602480820192602092909190829003018186803b158015614d1157600080fd5b505afa158015614d25573d6000803e3d6000fd5b505050506040513d6020811015614d3b57600080fd5b50519063ffffffff615b8d16565b7306012c8cf97bead5deae237070f9587f8e7a266d73b47e3cd837ddf8e4c57f05d70ab865de6e193bbb60606001600160a01b038616831415614dd35750604080516001600160a01b038616602482015260448082018690528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052614f8d565b816001600160a01b0316866001600160a01b03161415614eb85773b7f7f6c52f2e2fdb1963eab30438024864c313f66001600160a01b03166342966c68856040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015614e4757600080fd5b505af1158015614e5b573d6000803e3d6000fd5b50506040805160248101889052600060448201526001600160a01b0389166064808301919091528251808303909101815260849091019091526020810180516001600160e01b031663bf31196f60e01b1790529250614f8d915050565b6040805163e985e9c560e01b81523060048201526001600160a01b03878116602483015291519188169163e985e9c591604480820192602092909190829003018186803b158015614f0857600080fd5b505afa158015614f1c573d6000803e3d6000fd5b505050506040513d6020811015614f3257600080fd5b505115614f4157505050613e80565b50604080516001600160a01b038616602482015260016044808301919091528251808303909101815260649091019091526020810180516001600160e01b031663a22cb46560e01b1790525b60006060876001600160a01b0316836040518082805190602001908083835b60208310614fcb5780518252601f199092019160209182019101614fac565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461502d576040519150601f19603f3d011682016040523d82523d6000602084013e615032565b606091505b50915091508181906150c25760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561508757818101518382015260200161506f565b50505050905090810190601f1680156150b45780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050505050505050565b303b1590565b600054610100900460ff16806150ec57506150ec6150cd565b806150fa575060005460ff16155b6151355760405162461bcd60e51b815260040180806020018281038252602e815260200180615edf602e913960400191505060405180910390fd5b600054610100900460ff16158015615160576000805460ff1961ff0019909116610100171660011790555b600061516a61490a565b603380546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350801561101d576000805461ff001916905550565b6001603555565b60365460408051631d1cae2360e31b81526004810186905290516001600160a01b039092169163e8e5711891602480820192602092909190829003018186803b15801561521f57600080fd5b505afa158015615233573d6000803e3d6000fd5b505050506040513d602081101561524957600080fd5b505182516001600160a01b03909116906379cc679090339061527990670de0b6b3a764000063ffffffff61591516565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050600060405180830381600087803b1580156152c857600080fd5b505af11580156152dc573d6000803e3d6000fd5b506000925050505b8251811015611e825760008382815181106152fb57fe5b60209081029190910181015160365460408051637cb251d560e01b8152600481018a90526024810184905290519294506001600160a01b0390911692637cb251d592604480840193829003018186803b15801561535757600080fd5b505afa15801561536b573d6000803e3d6000fd5b505050506040513d602081101561538157600080fd5b50516153b8576040805162461bcd60e51b81526020600482015260016024820152603160f81b604482015290519081900360640190fd5b60365460408051637cb251d560e01b8152600481018890526024810184905290516001600160a01b0390921691637cb251d591604480820192602092909190829003018186803b15801561540b57600080fd5b505afa15801561541f573d6000803e3d6000fd5b505050506040513d602081101561543557600080fd5b5051156154a95760365460408051630f3e56c960e01b8152600481018890526024810184905290516001600160a01b0390921691630f3e56c99160448082019260009290919082900301818387803b15801561549057600080fd5b505af11580156154a4573d6000803e3d6000fd5b505050505b603654604080516348e1181560e11b81526004810188905290516001600160a01b03909216916391c2302a91602480820192602092909190829003018186803b1580156154f557600080fd5b505afa158015615509573d6000803e3d6000fd5b505050506040513d602081101561551f57600080fd5b50511561561d576036546040805163784f417160e11b8152600481018890526024810184905290516000926001600160a01b03169163f09e82e2916044808301926020929190829003018186803b15801561557957600080fd5b505afa15801561558d573d6000803e3d6000fd5b505050506040513d60208110156155a357600080fd5b505160365460408051634cc4fc9d60e11b8152600481018a9052602481018690528315604482015290519293506001600160a01b0390911691639989f93a9160648082019260009290919082900301818387803b15801561560357600080fd5b505af1158015615617573d6000803e3d6000fd5b50505050505b60008581526037602052604090205460ff16156157365760365460408051633e23eea360e21b81526004810188905290516000926001600160a01b03169163f88fba8c916024808301926020929190829003018186803b15801561568057600080fd5b505afa158015615694573d6000803e3d6000fd5b505050506040513d60208110156156aa57600080fd5b505160408051637921219560e11b8152306004820152336024820152604481018590526001606482015260a06084820152600060a4820181905291519293506001600160a01b0384169263f242432a9260e48084019391929182900301818387803b15801561571857600080fd5b505af115801561572c573d6000803e3d6000fd5b50505050506158fc565b6006851180156157465750600a85105b156158155760365460408051633e23eea360e21b81526004810188905290516000926001600160a01b03169163f88fba8c916024808301926020929190829003018186803b15801561579757600080fd5b505afa1580156157ab573d6000803e3d6000fd5b505050506040513d60208110156157c157600080fd5b50516040805163a9059cbb60e01b81523360048201526024810185905290519192506001600160a01b0383169163a9059cbb9160448082019260009290919082900301818387803b15801561571857600080fd5b60365460408051639d0214cb60e01b81526004810188905290516001600160a01b0390921691639d0214cb91602480820192602092909190829003018186803b15801561586157600080fd5b505afa158015615875573d6000803e3d6000fd5b505050506040513d602081101561588b57600080fd5b505160408051632142170760e11b81523060048201523360248201526044810184905290516001600160a01b03909216916342842e0e9160648082019260009290919082900301818387803b1580156158e357600080fd5b505af11580156158f7573d6000803e3d6000fd5b505050505b5061590e81600163ffffffff6148b016565b90506152e4565b60008261592457506000611576565b8282028284828161593157fe5b04146137615760405162461bcd60e51b8152600401808060200182810382526021815260200180615e9e6021913960400191505060405180910390fd5b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052611e82908590615bcf565b603654604080516330f009ab60e11b815290516000926001600160a01b03169163b7d0442391615a1c9160019185916361e01356916004808301926020929190829003018186803b15801561132f57600080fd5b6040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015615a5257600080fd5b505af1158015615a66573d6000803e3d6000fd5b50505050814233603660009054906101000a90046001600160a01b03166001600160a01b03166361e013566040518163ffffffff1660e01b815260040160206040518083038186803b158015615abb57600080fd5b505afa158015615acf573d6000803e3d6000fd5b505050506040513d6020811015615ae557600080fd5b50516040805160208082019590955260609390931b6bffffffffffffffffffffffff191683820152605480840192909252805180840390920182526074909201909152805191012081615b3457fe5b0692915050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052613e80908490615bcf565b600061376183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250615c80565b6060615c24826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316615cda9092919063ffffffff16565b805190915015613e8057808060200190516020811015615c4357600080fd5b5051613e805760405162461bcd60e51b815260040180806020018281038252602a815260200180615f0d602a913960400191505060405180910390fd5b60008184841115615cd25760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561508757818101518382015260200161506f565b505050900390565b60606111ca84846000856060615cef85615e51565b615d40576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b60208310615d7f5780518252601f199092019160209182019101615d60565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114615de1576040519150601f19603f3d011682016040523d82523d6000602084013e615de6565b606091505b50915091508115615dfa5791506111ca9050565b805115615e0a5780518082602001fd5b60405162461bcd60e51b815260206004820181815286516024840152865187939192839260440191908501908083836000831561508757818101518382015260200161506f565b3b15159056fe5265656e7472616e637947756172643a207265656e7472616e742063616c6c004f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a65645361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220cf1fa9f898f3eefb9518484a91bcfde2cc39d787c7e87327007c3a8d546ed73a64736f6c63430006080033
Deployed Bytecode
0x6080604052600436106102045760003560e01c806383e8d7e311610118578063daff97b5116100a0578063f09e82e21161006f578063f09e82e214610cb5578063f23a6e6114610ce5578063f2fde38b14610dbb578063f52e30a214610dee578063fabeaafd14610e7057610204565b8063daff97b514610c05578063db90bf3414610c37578063de54565e14610c61578063e161e0f114610c8b57610204565b8063a820f248116100e7578063a820f24814610806578063bc197c8114610888578063bd6978e614610a56578063c4d66de814610a8c578063d2fc990714610abf57610204565b806383e8d7e3146106d75780638da5cb5b14610709578063975057e71461073a578063a4ebfede1461074f57610204565b80632e644db11161019b578063715018a61161016a578063715018a61461058e57806378079411146105a35780637c77b616146105d55780637cbc2373146105ff57806383e4c5391461062257610204565b80632e644db1146104e657806331f669d514610510578063360c32881461053a57806364d715a31461056457610204565b8063150b7a02116101d7578063150b7a02146103635780631753ec88146104515780632911c27d1461047b5780632ad5f0a1146104b457610204565b806301ffc9a714610209578063065e8c06146102515780630daa2a4b1461027d57806313b0cc39146102b9575b600080fd5b34801561021557600080fd5b5061023d6004803603602081101561022c57600080fd5b50356001600160e01b031916610f25565b604080519115158252519081900360200190f35b34801561025d57600080fd5b5061027b6004803603602081101561027457600080fd5b5035610f2b565b005b34801561028957600080fd5b506102a7600480360360208110156102a057600080fd5b5035611020565b60408051918252519081900360200190f35b61027b600480360360608110156102cf57600080fd5b81359190810190604081016020820135600160201b8111156102f057600080fd5b82018360208201111561030257600080fd5b803590602001918460208302840111600160201b8311171561032357600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505091359250611032915050565b34801561036f57600080fd5b506104346004803603608081101561038657600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b8111156103c057600080fd5b8201836020820111156103d257600080fd5b803590602001918460018302840111600160201b831117156103f357600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506111c1945050505050565b604080516001600160e01b03199092168252519081900360200190f35b34801561045d57600080fd5b5061023d6004803603602081101561047457600080fd5b50356111d2565b34801561048757600080fd5b5061027b6004803603604081101561049e57600080fd5b50803590602001356001600160a01b03166111e7565b3480156104c057600080fd5b5061027b600480360360408110156104d757600080fd5b50803590602001351515611261565b3480156104f257600080fd5b506102a76004803603602081101561050957600080fd5b50356113f2565b34801561051c57600080fd5b506102a76004803603602081101561053357600080fd5b5035611404565b34801561054657600080fd5b5061027b6004803603602081101561055d57600080fd5b503561157c565b34801561057057600080fd5b5061023d6004803603602081101561058757600080fd5b50356116c2565b34801561059a57600080fd5b5061027b6116d7565b3480156105af57600080fd5b5061027b600480360360408110156105c657600080fd5b50803590602001351515611779565b3480156105e157600080fd5b5061027b600480360360208110156105f857600080fd5b50356117a2565b61027b6004803603604081101561061557600080fd5b5080359060200135611812565b34801561062e57600080fd5b5061027b6004803603604081101561064557600080fd5b81359190810190604081016020820135600160201b81111561066657600080fd5b82018360208201111561067857600080fd5b803590602001918460208302840111600160201b8311171561069957600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611908945050505050565b3480156106e357600080fd5b5061027b600480360360408110156106fa57600080fd5b50803590602001351515611d48565b34801561071557600080fd5b5061071e611da6565b604080516001600160a01b039092168252519081900360200190f35b34801561074657600080fd5b5061071e611db5565b34801561075b57600080fd5b5061027b6004803603606081101561077257600080fd5b81359190810190604081016020820135600160201b81111561079357600080fd5b8201836020820111156107a557600080fd5b803590602001918460208302840111600160201b831117156107c657600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505050503515159050611dc4565b34801561081257600080fd5b5061027b6004803603604081101561082957600080fd5b81359190810190604081016020820135600160201b81111561084a57600080fd5b82018360208201111561085c57600080fd5b803590602001918460208302840111600160201b8311171561087d57600080fd5b509092509050611e88565b34801561089457600080fd5b50610434600480360360a08110156108ab57600080fd5b6001600160a01b038235811692602081013590911691810190606081016040820135600160201b8111156108de57600080fd5b8201836020820111156108f057600080fd5b803590602001918460208302840111600160201b8311171561091157600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561096057600080fd5b82018360208201111561097257600080fd5b803590602001918460208302840111600160201b8311171561099357600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156109e257600080fd5b8201836020820111156109f457600080fd5b803590602001918460018302840111600160201b83111715610a1557600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506122a5945050505050565b348015610a6257600080fd5b5061027b60048036036060811015610a7957600080fd5b50803590602081013590604001356122b6565b348015610a9857600080fd5b5061027b60048036036020811015610aaf57600080fd5b50356001600160a01b0316612b12565b348015610acb57600080fd5b506102a760048036036080811015610ae257600080fd5b810190602081018135600160201b811115610afc57600080fd5b820183602082011115610b0e57600080fd5b803590602001918460018302840111600160201b83111715610b2f57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b811115610b8157600080fd5b820183602082011115610b9357600080fd5b803590602001918460018302840111600160201b83111715610bb457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550506001600160a01b0383351693505050602001351515612be0565b348015610c1157600080fd5b5061027b60048036036040811015610c2857600080fd5b50803590602001351515613207565b348015610c4357600080fd5b5061071e60048036036020811015610c5a57600080fd5b503561327f565b348015610c6d57600080fd5b5061027b60048036036020811015610c8457600080fd5b503561329a565b348015610c9757600080fd5b5061027b60048036036020811015610cae57600080fd5b5035613520565b348015610cc157600080fd5b5061023d60048036036040811015610cd857600080fd5b5080359060200135613593565b348015610cf157600080fd5b50610434600480360360a0811015610d0857600080fd5b6001600160a01b03823581169260208101359091169160408201359160608101359181019060a081016080820135600160201b811115610d4757600080fd5b820183602082011115610d5957600080fd5b803590602001918460018302840111600160201b83111715610d7a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550613768945050505050565b348015610dc757600080fd5b5061027b60048036036020811015610dde57600080fd5b50356001600160a01b0316613779565b348015610dfa57600080fd5b5061027b60048036036040811015610e1157600080fd5b81359190810190604081016020820135600160201b811115610e3257600080fd5b820183602082011115610e4457600080fd5b803590602001918460208302840111600160201b83111715610e6557600080fd5b509092509050613872565b348015610e7c57600080fd5b5061027b60048036036040811015610e9357600080fd5b81359190810190604081016020820135600160201b811115610eb457600080fd5b820183602082011115610ec657600080fd5b803590602001918460208302840111600160201b83111715610ee757600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550613993945050505050565b50600090565b610f3481613e85565b603654604080516333727c4d60e01b81526004810184905290516001600160a01b03909216916333727c4d91602480820192602092909190829003018186803b158015610f8057600080fd5b505afa158015610f94573d6000803e3d6000fd5b505050506040513d6020811015610faa57600080fd5b505161101d5760365460408051638991342b60e01b8152600481018490526001602482015290516001600160a01b0390921691638991342b9160448082019260009290919082900301818387803b15801561100457600080fd5b505af1158015611018573d6000803e3d6000fd5b505050505b50565b60396020526000908152604090205481565b60026035541415611078576040805162461bcd60e51b815260206004820152601f6024820152600080516020615e58833981519152604482015290519081900360640190fd5b600260355561108760016117a2565b60365460408051632650a9bb60e11b81526004810186905290516001600160a01b0390921691634ca1537691602480820192602092909190829003018186803b1580156110d357600080fd5b505afa1580156110e7573d6000803e3d6000fd5b505050506040513d60208110156110fd57600080fd5b5051156111135761110e8382614022565b61111f565b61111f8383600061425a565b827f1870fef12063ecb25738cfa99e018fc7ed7c3073cf1e6d58554470cac39ecf448383336040518080602001848152602001836001600160a01b03166001600160a01b03168152602001828103825285818151815260200191508051906020019060200280838360005b838110156111a257818101518382015260200161118a565b5050505090500194505050505060405180910390a25050600160355550565b630a85bd0160e11b5b949350505050565b603b6020526000908152604090205460ff1681565b6111f082613e85565b60365460408051632911c27d60e01b8152600481018590526001600160a01b03848116602483015291519190921691632911c27d91604480830192600092919082900301818387803b15801561124557600080fd5b505af1158015611259573d6000803e3d6000fd5b505050505050565b61126a82613e85565b60365460408051632de8d14760e11b8152600481018590529051611367926001600160a01b031691635bd1a28e916024808301926020929190829003018186803b1580156112b757600080fd5b505afa1580156112cb573d6000803e3d6000fd5b505050506040513d60208110156112e157600080fd5b50516036546040805163e94dbf8960e01b81526004810187905290516001600160a01b039092169163e94dbf8991602480820192602092909190829003018186803b15801561132f57600080fd5b505afa158015611343573d6000803e3d6000fd5b505050506040513d602081101561135957600080fd5b50519063ffffffff6148b016565b1561139d576040805162461bcd60e51b81526020600482015260016024820152603160f81b604482015290519081900360640190fd5b60365460408051632ad5f0a160e01b815260048101859052831515602482015290516001600160a01b0390921691632ad5f0a19160448082019260009290919082900301818387803b15801561124557600080fd5b60386020526000908152604090205481565b60365460408051632650a9bb60e11b81526004810184905290516000926001600160a01b031691634ca15376916024808301926020929190829003018186803b15801561145057600080fd5b505afa158015611464573d6000803e3d6000fd5b505050506040513d602081101561147a57600080fd5b50516114fd576036546040805163e94dbf8960e01b81526004810185905290516001600160a01b039092169163e94dbf8991602480820192602092909190829003018186803b1580156114cc57600080fd5b505afa1580156114e0573d6000803e3d6000fd5b505050506040513d60208110156114f657600080fd5b5051611576565b60365460408051632de8d14760e11b81526004810185905290516001600160a01b0390921691635bd1a28e91602480820192602092909190829003018186803b15801561154957600080fd5b505afa15801561155d573d6000803e3d6000fd5b505050506040513d602081101561157357600080fd5b50515b92915050565b61158581613e85565b603654604080516333727c4d60e01b81526004810184905290516001600160a01b03909216916333727c4d91602480820192602092909190829003018186803b1580156115d157600080fd5b505afa1580156115e5573d6000803e3d6000fd5b505050506040513d60208110156115fb57600080fd5b505161166e5760365460408051638991342b60e01b8152600481018490526001602482015290516001600160a01b0390921691638991342b9160448082019260009290919082900301818387803b15801561165557600080fd5b505af1158015611669573d6000803e3d6000fd5b505050505b6036546040805163be2cbc4f60e01b8152600481018490526001602482015290516001600160a01b039092169163be2cbc4f9160448082019260009290919082900301818387803b15801561100457600080fd5b60376020526000908152604090205460ff1681565b6116df61490a565b6033546001600160a01b0390811691161461172f576040805162461bcd60e51b81526020600482018190526024820152600080516020615ebf833981519152604482015290519081900360640190fd5b6033546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603380546001600160a01b0319169055565b61178282613e85565b600091825260376020526040909120805460ff1916911515919091179055565b60008181526034602052604090205460ff1615806117d857506117c3611da6565b6001600160a01b0316336001600160a01b0316145b61101d576040805162461bcd60e51b815260206004820152600660248201526514185d5cd95960d21b604482015290519081900360640190fd5b60026035541415611858576040805162461bcd60e51b815260206004820152601f6024820152600080516020615e58833981519152604482015290519081900360640190fd5b60026035819055611868906117a2565b60365460408051632650a9bb60e11b81526004810185905290516001600160a01b0390921691634ca1537691602480820192602092909190829003018186803b1580156118b457600080fd5b505afa1580156118c8573d6000803e3d6000fd5b505050506040513d60208110156118de57600080fd5b50516118f5576118f08282600061490e565b6118ff565b6118ff8282614b17565b50506001603555565b6002603554141561194e576040805162461bcd60e51b815260206004820152601f6024820152600080516020615e58833981519152604482015290519081900360640190fd5b600260355560005b8151811015611d3e57603654825133916001600160a01b031690635770f64090869086908690811061198457fe5b60200260200101516040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b1580156119c757600080fd5b505afa1580156119db573d6000803e3d6000fd5b505050506040513d60208110156119f157600080fd5b50516001600160a01b031614611a3e576040805162461bcd60e51b815260206004820152600d60248201526c2737ba103932b8bab2b9ba32b960991b604482015290519081900360640190fd5b60365482516001600160a01b0390911690637f10d314908590859085908110611a6357fe5b602002602001015160006040518463ffffffff1660e01b815260040180848152602001838152602001826001600160a01b03166001600160a01b031681526020019350505050600060405180830381600087803b158015611ac357600080fd5b505af1158015611ad7573d6000803e3d6000fd5b50505050600683118015611aeb5750600a83105b15611c015760365460408051633e23eea360e21b81526004810186905290516000926001600160a01b03169163f88fba8c916024808301926020929190829003018186803b158015611b3c57600080fd5b505afa158015611b50573d6000803e3d6000fd5b505050506040513d6020811015611b6657600080fd5b505183519091506001600160a01b0382169063a9059cbb903390869086908110611b8c57fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015611be357600080fd5b505af1158015611bf7573d6000803e3d6000fd5b5050505050611d26565b60365460408051639d0214cb60e01b81526004810186905290516001600160a01b0390921691639d0214cb91602480820192602092909190829003018186803b158015611c4d57600080fd5b505afa158015611c61573d6000803e3d6000fd5b505050506040513d6020811015611c7757600080fd5b505182516001600160a01b03909116906342842e0e9030903390869086908110611c9d57fe5b60200260200101516040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b031681526020018281526020019350505050600060405180830381600087803b158015611d0d57600080fd5b505af1158015611d21573d6000803e3d6000fd5b505050505b611d3781600163ffffffff6148b016565b9050611956565b5050600160355550565b611d5182613e85565b603654604080516383e8d7e360e01b815260048101859052831515602482015290516001600160a01b03909216916383e8d7e39160448082019260009290919082900301818387803b15801561124557600080fd5b6033546001600160a01b031690565b6036546001600160a01b031681565b611dcd83613e85565b60005b8251811015611e825760365483516001600160a01b0390911690639989f93a908690869085908110611dfe57fe5b6020026020010151856040518463ffffffff1660e01b815260040180848152602001838152602001821515151581526020019350505050600060405180830381600087803b158015611e4f57600080fd5b505af1158015611e63573d6000803e3d6000fd5b50505050611e7b6001826148b090919063ffffffff16565b9050611dd0565b50505050565b611e9061490a565b6033546001600160a01b03908116911614611ee0576040805162461bcd60e51b81526020600482018190526024820152600080516020615ebf833981519152604482015290519081900360640190fd5b60005b81811015611e82576000838383818110611ef957fe5b60365460408051637cb251d560e01b8152600481018b9052602093840295909501356024860181905290519095506001600160a01b0390911693637cb251d593506044808201939291829003018186803b158015611f5657600080fd5b505afa158015611f6a573d6000803e3d6000fd5b505050506040513d6020811015611f8057600080fd5b5051611fb7576040805162461bcd60e51b81526020600482015260016024820152603160f81b604482015290519081900360640190fd5b60365460408051637cb251d560e01b8152600481018890526024810184905290516001600160a01b0390921691637cb251d591604480820192602092909190829003018186803b15801561200a57600080fd5b505afa15801561201e573d6000803e3d6000fd5b505050506040513d602081101561203457600080fd5b5051156120a85760365460408051630f3e56c960e01b8152600481018890526024810184905290516001600160a01b0390921691630f3e56c99160448082019260009290919082900301818387803b15801561208f57600080fd5b505af11580156120a3573d6000803e3d6000fd5b505050505b6006851180156120b85750600a85105b156121a55760365460408051633e23eea360e21b81526004810188905290516000926001600160a01b03169163f88fba8c916024808301926020929190829003018186803b15801561210957600080fd5b505afa15801561211d573d6000803e3d6000fd5b505050506040513d602081101561213357600080fd5b50516040805163a9059cbb60e01b81523360048201526024810185905290519192506001600160a01b0383169163a9059cbb9160448082019260009290919082900301818387803b15801561218757600080fd5b505af115801561219b573d6000803e3d6000fd5b505050505061228c565b60365460408051639d0214cb60e01b81526004810188905290516001600160a01b0390921691639d0214cb91602480820192602092909190829003018186803b1580156121f157600080fd5b505afa158015612205573d6000803e3d6000fd5b505050506040513d602081101561221b57600080fd5b505160408051632142170760e11b81523060048201523360248201526044810184905290516001600160a01b03909216916342842e0e9160648082019260009290919082900301818387803b15801561227357600080fd5b505af1158015612287573d6000803e3d6000fd5b505050505b5061229e81600163ffffffff6148b016565b9050611ee3565b63bc197c8160e01b95945050505050565b6122be61490a565b6033546001600160a01b0390811691161461230e576040805162461bcd60e51b81526020600482018190526024820152600080516020615ebf833981519152604482015290519081900360640190fd5b826003141561235c576040805162461bcd60e51b8152602060048201526015602482015274135a59dc985d1a5bdb881b9bdd08185b1b1bddd959605a1b604482015290519081900360640190fd5b6036546040805163e94dbf8960e01b81526004810186905290516000926001600160a01b03169163e94dbf89916024808301926020929190829003018186803b1580156123a857600080fd5b505afa1580156123bc573d6000803e3d6000fd5b505050506040513d60208110156123d257600080fd5b5051905080612416576040805162461bcd60e51b815260206004820152600b60248201526a115b5c1d1e481d985d5b1d60aa1b604482015290519081900360640190fd5b8161245c576040805162461bcd60e51b81526020600482015260116024820152700436f756e742063616e6e6f74206265203607c1b604482015290519081900360640190fd5b80821115612468578091505b600073be86f647b167567525ccaafcd6f881f1ee5582166001600160a01b03166381a36fb6856040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156124c257600080fd5b505afa1580156124d6573d6000803e3d6000fd5b505050506040513d60208110156124ec57600080fd5b50516000868152603a60205260409020549091506001600160a01b03168015806125275750816001600160a01b0316816001600160a01b0316145b612578576040805162461bcd60e51b815260206004820152601f60248201527f43616e6e6f74206f7665727772697465206d6967726174696f6e207061697200604482015290519081900360640190fd5b6000826001600160a01b0316631ba46cfd6040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156125b557600080fd5b505af11580156125c9573d6000803e3d6000fd5b505050506040513d60208110156125df57600080fd5b5051905060608567ffffffffffffffff811180156125fc57600080fd5b50604051908082528060200260200182016040528015612626578160200160208202803683370190505b50905060608667ffffffffffffffff8111801561264257600080fd5b5060405190808252806020026020018201604052801561266c578160200160208202803683370190505b50905060005b87811015612746576036546040805163645058b360e01b8152600481018d90526024810184905290516000926001600160a01b03169163645058b3916044808301926020929190829003018186803b1580156126cd57600080fd5b505afa1580156126e1573d6000803e3d6000fd5b505050506040513d60208110156126f757600080fd5b50518451909150819085908490811061270c57fe5b602002602001018181525050600183838151811061272657fe5b60200260200101818152505061273d858883614d49565b50600101612672565b5060005b82518110156127e15760365483516001600160a01b0390911690630f3e56c9908c9086908590811061277857fe5b60200260200101516040518363ffffffff1660e01b81526004018083815260200182815260200192505050600060405180830381600087803b1580156127bd57600080fd5b505af11580156127d1573d6000803e3d6000fd5b50506001909201915061274a9050565b50604080516370a0823160e01b815230600482015290516000916001600160a01b038816916370a0823191602480820192602092909190829003018186803b15801561282c57600080fd5b505afa158015612840573d6000803e3d6000fd5b505050506040513d602081101561285657600080fd5b505160408051630f57464360e21b8152600481019182528551604482015285519293506001600160a01b03891692633d5d190c9287928792829160248101916064909101906020878101910280838360005b838110156128c05781810151838201526020016128a8565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156128ff5781810151838201526020016128e7565b50505050905001945050505050602060405180830381600087803b15801561292657600080fd5b505af115801561293a573d6000803e3d6000fd5b505050506040513d602081101561295057600080fd5b5050604080516370a0823160e01b815230600482015290516000916001600160a01b038916916370a0823191602480820192602092909190829003018186803b15801561299c57600080fd5b505afa1580156129b0573d6000803e3d6000fd5b505050506040513d60208110156129c657600080fd5b50519050818103670de0b6b3a76400008a0214612a2a576040805162461bcd60e51b815260206004820152601e60248201527f5265636569766564206c657373207468616e2065787065637465642076320000604482015290519081900360640190fd5b86603a60008d815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b03160217905550603660009054906101000a90046001600160a01b03166001600160a01b031663e94dbf898c6040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015612abb57600080fd5b505afa158015612acf573d6000803e3d6000fd5b505050506040513d6020811015612ae557600080fd5b5051612b055760008b8152603b60205260409020805460ff191660011790555b5050505050505050505050565b600054610100900460ff1680612b2b5750612b2b6150cd565b80612b39575060005460ff16155b612b745760405162461bcd60e51b815260040180806020018281038252602e815260200180615edf602e913960400191505060405180910390fd5b600054610100900460ff16158015612b9f576000805460ff1961ff0019909116610100171660011790555b612ba76150d3565b612baf6151cc565b603680546001600160a01b0319166001600160a01b0384161790558015612bdc576000805461ff00191690555b5050565b600060026035541415612c28576040805162461bcd60e51b815260206004820152601f6024820152600080516020615e58833981519152604482015290519081900360640190fd5b6002603555612c3760006117a2565b60408051633734cd1760e21b81526004810191825286516044820152865173e7ac17ce2550f3a0b4fe3616515975eb093cefea92600092849263dcd3345c928b928b928291602481019160649091019060208701908083838d5b83811015612ca9578181015183820152602001612c91565b50505050905090810190601f168015612cd65780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b83811015612d09578181015183820152602001612cf1565b50505050905090810190601f168015612d365780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b158015612d5757600080fd5b505af1158015612d6b573d6000803e3d6000fd5b505050506040513d6020811015612d8157600080fd5b50516036546040805163d80ce5e960e01b815290519293506000926001600160a01b039092169163d80ce5e99160048082019260209290919082900301818787803b158015612dcf57600080fd5b505af1158015612de3573d6000803e3d6000fd5b505050506040513d6020811015612df957600080fd5b505160365460408051631567925f60e01b8152600481018490526001600160a01b0386811660248301529151939450911691631567925f9160448082019260009290919082900301818387803b158015612e5257600080fd5b505af1158015612e66573d6000803e3d6000fd5b5050603654604080516301f6bbdf60e31b81526004810186905290516001600160a01b039092169350630fb5def8925060248082019260009290919082900301818387803b158015612eb757600080fd5b505af1158015612ecb573d6000803e3d6000fd5b50505050846130175760365460408051632250a27360e21b8152600481018490526001600160a01b0389811660248301529151919092169163894289cc91604480830192600092919082900301818387803b158015612f2957600080fd5b505af1158015612f3d573d6000803e3d6000fd5b505060365460408051630116c32b60e31b81526004810186905290516001600160a01b0390921693506308b61958925060248082019260009290919082900301818387803b158015612f8e57600080fd5b505af1158015612fa2573d6000803e3d6000fd5b505060365460408051632ad5f0a160e01b8152600481018690526001602482015290516001600160a01b039092169350632ad5f0a1925060448082019260009290919082900301818387803b158015612ffa57600080fd5b505af115801561300e573d6000803e3d6000fd5b50505050613156565b60365460408051636102815d60e01b8152600481018490526001600160a01b03898116602483015291519190921691636102815d91604480830192600092919082900301818387803b15801561306c57600080fd5b505af1158015613080573d6000803e3d6000fd5b505060365460408051638e3f545f60e01b81526004810186905290516001600160a01b039092169350638e3f545f925060248082019260009290919082900301818387803b1580156130d157600080fd5b505af11580156130e5573d6000803e3d6000fd5b5050603654604080516388779e5d60e01b8152600481018690526001602482015290516001600160a01b0390921693506388779e5d925060448082019260009290919082900301818387803b15801561313d57600080fd5b505af1158015613151573d6000803e3d6000fd5b505050505b60365460408051632911c27d60e01b81526004810184905233602482015290516001600160a01b0390921691632911c27d9160448082019260009290919082900301818387803b1580156131a957600080fd5b505af11580156131bd573d6000803e3d6000fd5b50506040805133815290518493507fc117b81c381b8c8066e461527733c2f11b87ebf36631b006cb5a74e3c0388b1392509081900360200190a26001603555979650505050505050565b61320f61490a565b6033546001600160a01b0390811691161461325f576040805162461bcd60e51b81526020600482018190526024820152600080516020615ebf833981519152604482015290519081900360640190fd5b600091825260346020526040909120805460ff1916911515919091179055565b603a602052600090815260409020546001600160a01b031681565b6132a460046117a2565b6000818152603b602052604090205460ff16613307576040805162461bcd60e51b815260206004820181905260248201527f54686973207661756c7420686173206e6f74206265656e206d69677261746564604482015290519081900360640190fd5b60365460408051631d1cae2360e31b81526004810184905290516000926001600160a01b03169163e8e57118916024808301926020929190829003018186803b15801561335357600080fd5b505afa158015613367573d6000803e3d6000fd5b505050506040513d602081101561337d57600080fd5b5051604080516370a0823160e01b815233600482015290519192506000916001600160a01b038416916370a08231916024808301926020929190829003018186803b1580156133cb57600080fd5b505afa1580156133df573d6000803e3d6000fd5b505050506040513d60208110156133f557600080fd5b505190508061342f576040805162461bcd60e51b81526020600482015260016024820152600360fc1b604482015290519081900360640190fd5b6040805163079cc67960e41b81523360048201526024810183905290516001600160a01b038416916379cc679091604480830192600092919082900301818387803b15801561347d57600080fd5b505af1158015613491573d6000803e3d6000fd5b5050506000848152603a6020908152604080832054815163a9059cbb60e01b81523360048201526024810187905291516001600160a01b039091169450849363a9059cbb93604480850194919392918390030190829087803b1580156134f657600080fd5b505af115801561350a573d6000803e3d6000fd5b505050506040513d602081101561125957600080fd5b61352861490a565b6033546001600160a01b03908116911614613578576040805162461bcd60e51b81526020600482018190526024820152600080516020615ebf833981519152604482015290519081900360640190fd5b6000908152603b60205260409020805460ff19166001179055565b600082815260396020526040812054156135e05760008381526038602052604090205482108015906135d357506000838152603960205260409020548211155b156135e057506001611576565b6036546040805163ec475a1f60e01b81526004810186905290516001600160a01b039092169163ec475a1f91602480820192602092909190829003018186803b15801561362c57600080fd5b505afa158015613640573d6000803e3d6000fd5b505050506040513d602081101561365657600080fd5b50516136e0576036546040805163784f417160e11b8152600481018690526024810185905290516001600160a01b039092169163f09e82e291604480820192602092909190829003018186803b1580156136af57600080fd5b505afa1580156136c3573d6000803e3d6000fd5b505050506040513d60208110156136d957600080fd5b5051613761565b6036546040805163784f417160e11b8152600481018690526024810185905290516001600160a01b039092169163f09e82e291604480820192602092909190829003018186803b15801561373357600080fd5b505afa158015613747573d6000803e3d6000fd5b505050506040513d602081101561375d57600080fd5b5051155b9392505050565b63f23a6e6160e01b95945050505050565b61378161490a565b6033546001600160a01b039081169116146137d1576040805162461bcd60e51b81526020600482018190526024820152600080516020615ebf833981519152604482015290519081900360640190fd5b6001600160a01b0381166138165760405162461bcd60e51b8152600401808060200182810382526026815260200180615e786026913960400191505060405180910390fd5b6033546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603380546001600160a01b0319166001600160a01b0392909216919091179055565b61387a61490a565b6033546001600160a01b039081169116146138ca576040805162461bcd60e51b81526020600482018190526024820152600080516020615ebf833981519152604482015290519081900360640190fd5b61390783838380806020026020016040519081016040528093929190818152602001838360200280828437600092018290525092506151d3915050565b827f8dd603fb9fd7fdd0be7a7c282962e1ac7c6d82e51fc34bd602ec1b83cf2dc93c83836000336040518080602001848152602001836001600160a01b03166001600160a01b031681526020018281038252868682818152602001925060200280828437600083820152604051601f909101601f191690920182900397509095505050505050a2505050565b61399c82613e85565b60005b8151811015613e805760365482516000916001600160a01b031690635770f6409086908690869081106139ce57fe5b60200260200101516040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b158015613a1157600080fd5b505afa158015613a25573d6000803e3d6000fd5b505050506040513d6020811015613a3b57600080fd5b505190506001600160a01b038116613a87576040805162461bcd60e51b815260206004820152600a602482015269139bc81c995c5d595cdd60b21b604482015290519081900360640190fd5b60365460408051639d0214cb60e01b815260048101879052905130926001600160a01b031691639d0214cb916024808301926020929190829003018186803b158015613ad257600080fd5b505afa158015613ae6573d6000803e3d6000fd5b505050506040513d6020811015613afc57600080fd5b505184516001600160a01b0390911690636352211e90869086908110613b1e57fe5b60200260200101516040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015613b5a57600080fd5b505afa158015613b6e573d6000803e3d6000fd5b505050506040513d6020811015613b8457600080fd5b50516001600160a01b031614613bcd576040805162461bcd60e51b81526020600482015260096024820152682737ba1037bbb732b960b91b604482015290519081900360640190fd5b60365483516001600160a01b0390911690637f10d314908690869086908110613bf257fe5b602002602001015160006040518463ffffffff1660e01b815260040180848152602001838152602001826001600160a01b03166001600160a01b031681526020019350505050600060405180830381600087803b158015613c5257600080fd5b505af1158015613c66573d6000803e3d6000fd5b505060365485516001600160a01b039091169250639989f93a91508690869086908110613c8f57fe5b602002602001015160016040518463ffffffff1660e01b815260040180848152602001838152602001821515151581526020019350505050600060405180830381600087803b158015613ce157600080fd5b505af1158015613cf5573d6000803e3d6000fd5b505060365485516001600160a01b039091169250634cef646591508690869086908110613d1e57fe5b60200260200101516040518363ffffffff1660e01b81526004018083815260200182815260200192505050600060405180830381600087803b158015613d6357600080fd5b505af1158015613d77573d6000803e3d6000fd5b505060365460408051631d1cae2360e31b81526004810189905290516001600160a01b03909216935063e8e571189250602480820192602092909190829003018186803b158015613dc757600080fd5b505afa158015613ddb573d6000803e3d6000fd5b505050506040513d6020811015613df157600080fd5b5051604080516340c10f1960e01b81526001600160a01b038481166004830152670de0b6b3a76400006024830152915191909216916340c10f1991604480830192600092919082900301818387803b158015613e4c57600080fd5b505af1158015613e60573d6000803e3d6000fd5b5050505050613e796001826148b090919063ffffffff16565b905061399f565b505050565b603654604080516333727c4d60e01b81526004810184905290516001600160a01b03909216916333727c4d91602480820192602092909190829003018186803b158015613ed157600080fd5b505afa158015613ee5573d6000803e3d6000fd5b505050506040513d6020811015613efb57600080fd5b505115613f6057613f0a611da6565b6001600160a01b0316336001600160a01b031614613f5b576040805162461bcd60e51b81526020600482015260096024820152682737ba1037bbb732b960b91b604482015290519081900360640190fd5b61101d565b60365460408051635298145760e01b81526004810184905290516001600160a01b0390921691635298145791602480820192602092909190829003018186803b158015613fac57600080fd5b505afa158015613fc0573d6000803e3d6000fd5b505050506040513d6020811015613fd657600080fd5b50516001600160a01b0316331461101d576040805162461bcd60e51b815260206004820152600b60248201526a2737ba1036b0b730b3b2b960a91b604482015290519081900360640190fd5b6140c83330614039846103e863ffffffff61591516565b603654604080516305bb848560e01b81526004810189905290516001600160a01b03909216916305bb848591602480820192602092909190829003018186803b15801561408557600080fd5b505afa158015614099573d6000803e3d6000fd5b505050506040513d60208110156140af57600080fd5b50516001600160a01b031692919063ffffffff61596e16565b60365460408051631d1cae2360e31b81526004810185905290516001600160a01b039092169163e8e5711891602480820192602092909190829003018186803b15801561411457600080fd5b505afa158015614128573d6000803e3d6000fd5b505050506040513d602081101561413e57600080fd5b5051604080516340c10f1960e01b81523360048201526024810184905290516001600160a01b03909216916340c10f199160448082019260009290919082900301818387803b15801561419057600080fd5b505af11580156141a4573d6000803e3d6000fd5b50506036546001600160a01b03169150632ef30ad090508361421d6141d1856103e863ffffffff61591516565b60365460408051632de8d14760e11b8152600481018a905290516001600160a01b0390921691635bd1a28e91602480820192602092909190829003018186803b15801561132f57600080fd5b6040518363ffffffff1660e01b81526004018083815260200182815260200192505050600060405180830381600087803b15801561124557600080fd5b60005b825181101561479d57600083828151811061427457fe5b602002602001015190506142888582613593565b6142bd576040805162461bcd60e51b81526020600482015260016024820152603160f81b604482015290519081900360640190fd5b60008581526037602052604090205460ff16156143d65760365460408051633e23eea360e21b81526004810188905290516000926001600160a01b03169163f88fba8c916024808301926020929190829003018186803b15801561432057600080fd5b505afa158015614334573d6000803e3d6000fd5b505050506040513d602081101561434a57600080fd5b505160408051637921219560e11b8152336004820152306024820152604481018590526001606482015260a06084820152600060a4820181905291519293506001600160a01b0384169263f242432a9260e48084019391929182900301818387803b1580156143b857600080fd5b505af11580156143cc573d6000803e3d6000fd5b5050505050614715565b60365460408051639d0214cb60e01b815260048101889052905130926001600160a01b031691639d0214cb916024808301926020929190829003018186803b15801561442157600080fd5b505afa158015614435573d6000803e3d6000fd5b505050506040513d602081101561444b57600080fd5b5051604080516331a9108f60e11b81526004810185905290516001600160a01b0390921691636352211e91602480820192602092909190829003018186803b15801561449657600080fd5b505afa1580156144aa573d6000803e3d6000fd5b505050506040513d60208110156144c057600080fd5b50516001600160a01b03161415614502576040805162461bcd60e51b81526020600482015260016024820152601960f91b604482015290519081900360640190fd5b60365460408051639d0214cb60e01b81526004810188905290516001600160a01b0390921691639d0214cb91602480820192602092909190829003018186803b15801561454e57600080fd5b505afa158015614562573d6000803e3d6000fd5b505050506040513d602081101561457857600080fd5b5051604080516323b872dd60e01b81523360048201523060248201526044810184905290516001600160a01b03909216916323b872dd9160648082019260009290919082900301818387803b1580156145d057600080fd5b505af11580156145e4573d6000803e3d6000fd5b505060365460408051639d0214cb60e01b8152600481018a905290513094506001600160a01b039092169250639d0214cb916024808301926020929190829003018186803b15801561463557600080fd5b505afa158015614649573d6000803e3d6000fd5b505050506040513d602081101561465f57600080fd5b5051604080516331a9108f60e11b81526004810185905290516001600160a01b0390921691636352211e91602480820192602092909190829003018186803b1580156146aa57600080fd5b505afa1580156146be573d6000803e3d6000fd5b505050506040513d60208110156146d457600080fd5b50516001600160a01b031614614715576040805162461bcd60e51b81526020600482015260016024820152603360f81b604482015290519081900360640190fd5b60365460408051634cef646560e01b8152600481018890526024810184905290516001600160a01b0390921691634cef64659160448082019260009290919082900301818387803b15801561476957600080fd5b505af115801561477d573d6000803e3d6000fd5b50505050506147966001826148b090919063ffffffff16565b905061425d565b5060365460408051631d1cae2360e31b81526004810186905290516001600160a01b039092169163e8e5711891602480820192602092909190829003018186803b1580156147ea57600080fd5b505afa1580156147fe573d6000803e3d6000fd5b505050506040513d602081101561481457600080fd5b505182516001600160a01b03909116906340c10f1990339061484490670de0b6b3a764000063ffffffff61591516565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050600060405180830381600087803b15801561489357600080fd5b505af11580156148a7573d6000803e3d6000fd5b50505050505050565b600082820183811015613761576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b3390565b60005b82811015611e825760408051600180825281830190925260609160208083019080368337019050506036546040805163e94dbf8960e01b81526004810189905290519293506000926149bd926001600160a01b03169163e94dbf89916024808301926020929190829003018186803b15801561498c57600080fd5b505afa1580156149a0573d6000803e3d6000fd5b505050506040513d60208110156149b657600080fd5b50516159c8565b6036546040805163645058b360e01b8152600481018a90526024810184905290519293506001600160a01b039091169163645058b391604480820192602092909190829003018186803b158015614a1357600080fd5b505afa158015614a27573d6000803e3d6000fd5b505050506040513d6020811015614a3d57600080fd5b505182518390600090614a4c57fe5b602002602001018181525050614a638683866151d3565b857f8dd603fb9fd7fdd0be7a7c282962e1ac7c6d82e51fc34bd602ec1b83cf2dc93c836000336040518080602001848152602001836001600160a01b03166001600160a01b03168152602001828103825285818151815260200191508051906020019060200280838360005b83811015614ae7578181015183820152602001614acf565b5050505090500194505050505060405180910390a250614b10905081600163ffffffff6148b016565b9050614911565b60365460408051631d1cae2360e31b81526004810185905290516001600160a01b039092169163e8e5711891602480820192602092909190829003018186803b158015614b6357600080fd5b505afa158015614b77573d6000803e3d6000fd5b505050506040513d6020811015614b8d57600080fd5b50516040805163079cc67960e41b81523360048201526024810184905290516001600160a01b03909216916379cc67909160448082019260009290919082900301818387803b158015614bdf57600080fd5b505af1158015614bf3573d6000803e3d6000fd5b50505050614c9e33614c106103e88461591590919063ffffffff16565b603654604080516305bb848560e01b81526004810188905290516001600160a01b03909216916305bb848591602480820192602092909190829003018186803b158015614c5c57600080fd5b505afa158015614c70573d6000803e3d6000fd5b505050506040513d6020811015614c8657600080fd5b50516001600160a01b0316919063ffffffff615b3b16565b6036546001600160a01b0316632ef30ad08361421d614cc5856103e863ffffffff61591516565b60365460408051632de8d14760e11b8152600481018a905290516001600160a01b0390921691635bd1a28e91602480820192602092909190829003018186803b158015614d1157600080fd5b505afa158015614d25573d6000803e3d6000fd5b505050506040513d6020811015614d3b57600080fd5b50519063ffffffff615b8d16565b7306012c8cf97bead5deae237070f9587f8e7a266d73b47e3cd837ddf8e4c57f05d70ab865de6e193bbb60606001600160a01b038616831415614dd35750604080516001600160a01b038616602482015260448082018690528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052614f8d565b816001600160a01b0316866001600160a01b03161415614eb85773b7f7f6c52f2e2fdb1963eab30438024864c313f66001600160a01b03166342966c68856040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015614e4757600080fd5b505af1158015614e5b573d6000803e3d6000fd5b50506040805160248101889052600060448201526001600160a01b0389166064808301919091528251808303909101815260849091019091526020810180516001600160e01b031663bf31196f60e01b1790529250614f8d915050565b6040805163e985e9c560e01b81523060048201526001600160a01b03878116602483015291519188169163e985e9c591604480820192602092909190829003018186803b158015614f0857600080fd5b505afa158015614f1c573d6000803e3d6000fd5b505050506040513d6020811015614f3257600080fd5b505115614f4157505050613e80565b50604080516001600160a01b038616602482015260016044808301919091528251808303909101815260649091019091526020810180516001600160e01b031663a22cb46560e01b1790525b60006060876001600160a01b0316836040518082805190602001908083835b60208310614fcb5780518252601f199092019160209182019101614fac565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461502d576040519150601f19603f3d011682016040523d82523d6000602084013e615032565b606091505b50915091508181906150c25760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561508757818101518382015260200161506f565b50505050905090810190601f1680156150b45780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050505050505050565b303b1590565b600054610100900460ff16806150ec57506150ec6150cd565b806150fa575060005460ff16155b6151355760405162461bcd60e51b815260040180806020018281038252602e815260200180615edf602e913960400191505060405180910390fd5b600054610100900460ff16158015615160576000805460ff1961ff0019909116610100171660011790555b600061516a61490a565b603380546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350801561101d576000805461ff001916905550565b6001603555565b60365460408051631d1cae2360e31b81526004810186905290516001600160a01b039092169163e8e5711891602480820192602092909190829003018186803b15801561521f57600080fd5b505afa158015615233573d6000803e3d6000fd5b505050506040513d602081101561524957600080fd5b505182516001600160a01b03909116906379cc679090339061527990670de0b6b3a764000063ffffffff61591516565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050600060405180830381600087803b1580156152c857600080fd5b505af11580156152dc573d6000803e3d6000fd5b506000925050505b8251811015611e825760008382815181106152fb57fe5b60209081029190910181015160365460408051637cb251d560e01b8152600481018a90526024810184905290519294506001600160a01b0390911692637cb251d592604480840193829003018186803b15801561535757600080fd5b505afa15801561536b573d6000803e3d6000fd5b505050506040513d602081101561538157600080fd5b50516153b8576040805162461bcd60e51b81526020600482015260016024820152603160f81b604482015290519081900360640190fd5b60365460408051637cb251d560e01b8152600481018890526024810184905290516001600160a01b0390921691637cb251d591604480820192602092909190829003018186803b15801561540b57600080fd5b505afa15801561541f573d6000803e3d6000fd5b505050506040513d602081101561543557600080fd5b5051156154a95760365460408051630f3e56c960e01b8152600481018890526024810184905290516001600160a01b0390921691630f3e56c99160448082019260009290919082900301818387803b15801561549057600080fd5b505af11580156154a4573d6000803e3d6000fd5b505050505b603654604080516348e1181560e11b81526004810188905290516001600160a01b03909216916391c2302a91602480820192602092909190829003018186803b1580156154f557600080fd5b505afa158015615509573d6000803e3d6000fd5b505050506040513d602081101561551f57600080fd5b50511561561d576036546040805163784f417160e11b8152600481018890526024810184905290516000926001600160a01b03169163f09e82e2916044808301926020929190829003018186803b15801561557957600080fd5b505afa15801561558d573d6000803e3d6000fd5b505050506040513d60208110156155a357600080fd5b505160365460408051634cc4fc9d60e11b8152600481018a9052602481018690528315604482015290519293506001600160a01b0390911691639989f93a9160648082019260009290919082900301818387803b15801561560357600080fd5b505af1158015615617573d6000803e3d6000fd5b50505050505b60008581526037602052604090205460ff16156157365760365460408051633e23eea360e21b81526004810188905290516000926001600160a01b03169163f88fba8c916024808301926020929190829003018186803b15801561568057600080fd5b505afa158015615694573d6000803e3d6000fd5b505050506040513d60208110156156aa57600080fd5b505160408051637921219560e11b8152306004820152336024820152604481018590526001606482015260a06084820152600060a4820181905291519293506001600160a01b0384169263f242432a9260e48084019391929182900301818387803b15801561571857600080fd5b505af115801561572c573d6000803e3d6000fd5b50505050506158fc565b6006851180156157465750600a85105b156158155760365460408051633e23eea360e21b81526004810188905290516000926001600160a01b03169163f88fba8c916024808301926020929190829003018186803b15801561579757600080fd5b505afa1580156157ab573d6000803e3d6000fd5b505050506040513d60208110156157c157600080fd5b50516040805163a9059cbb60e01b81523360048201526024810185905290519192506001600160a01b0383169163a9059cbb9160448082019260009290919082900301818387803b15801561571857600080fd5b60365460408051639d0214cb60e01b81526004810188905290516001600160a01b0390921691639d0214cb91602480820192602092909190829003018186803b15801561586157600080fd5b505afa158015615875573d6000803e3d6000fd5b505050506040513d602081101561588b57600080fd5b505160408051632142170760e11b81523060048201523360248201526044810184905290516001600160a01b03909216916342842e0e9160648082019260009290919082900301818387803b1580156158e357600080fd5b505af11580156158f7573d6000803e3d6000fd5b505050505b5061590e81600163ffffffff6148b016565b90506152e4565b60008261592457506000611576565b8282028284828161593157fe5b04146137615760405162461bcd60e51b8152600401808060200182810382526021815260200180615e9e6021913960400191505060405180910390fd5b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052611e82908590615bcf565b603654604080516330f009ab60e11b815290516000926001600160a01b03169163b7d0442391615a1c9160019185916361e01356916004808301926020929190829003018186803b15801561132f57600080fd5b6040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015615a5257600080fd5b505af1158015615a66573d6000803e3d6000fd5b50505050814233603660009054906101000a90046001600160a01b03166001600160a01b03166361e013566040518163ffffffff1660e01b815260040160206040518083038186803b158015615abb57600080fd5b505afa158015615acf573d6000803e3d6000fd5b505050506040513d6020811015615ae557600080fd5b50516040805160208082019590955260609390931b6bffffffffffffffffffffffff191683820152605480840192909252805180840390920182526074909201909152805191012081615b3457fe5b0692915050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052613e80908490615bcf565b600061376183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250615c80565b6060615c24826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316615cda9092919063ffffffff16565b805190915015613e8057808060200190516020811015615c4357600080fd5b5051613e805760405162461bcd60e51b815260040180806020018281038252602a815260200180615f0d602a913960400191505060405180910390fd5b60008184841115615cd25760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561508757818101518382015260200161506f565b505050900390565b60606111ca84846000856060615cef85615e51565b615d40576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b60208310615d7f5780518252601f199092019160209182019101615d60565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114615de1576040519150601f19603f3d011682016040523d82523d6000602084013e615de6565b606091505b50915091508115615dfa5791506111ca9050565b805115615e0a5780518082602001fd5b60405162461bcd60e51b815260206004820181815286516024840152865187939192839260440191908501908083836000831561508757818101518382015260200161506f565b3b15159056fe5265656e7472616e637947756172643a207265656e7472616e742063616c6c004f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a65645361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220cf1fa9f898f3eefb9518484a91bcfde2cc39d787c7e87327007c3a8d546ed73a64736f6c63430006080033
Deployed Bytecode Sourcemap
67578:4852:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;9;2:12;54856:128:0;;5:9:-1;2:2;;;27:1;24;17:12;2:2;54856:128:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;54856:128:0;-1:-1:-1;;;;;;54856:128:0;;:::i;:::-;;;;;;;;;;;;;;;;;;65760:202;;5:9:-1;2:2;;;27:1;24;17:12;2:2;65760:202:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;65760:202:0;;:::i;:::-;;53773:43;;5:9:-1;2:2;;;27:1;24;17:12;2:2;53773:43:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;53773:43:0;;:::i;:::-;;;;;;;;;;;;;;;;63511:404;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;63511:404:0;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;63511:404:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;63511:404:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;63511:404:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;63511:404:0;;-1:-1:-1;;63511:404:0;;;-1:-1:-1;63511:404:0;;-1:-1:-1;;63511:404:0:i;25366:207::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;25366:207:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;25366:207:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;25366:207:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;25366:207:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;25366:207:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;25366:207:0;;-1:-1:-1;25366:207:0;;-1:-1:-1;;;;;25366:207:0:i;:::-;;;;-1:-1:-1;;;;;;25366:207:0;;;;;;;;;;;;;;67702:47;;5:9:-1;2:2;;;27:1;24;17:12;2:2;67702:47:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;67702:47:0;;:::i;65590:162::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;65590:162:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;65590:162:0;;;;;;-1:-1:-1;;;;;65590:162:0;;:::i;64576:386::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;64576:386:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;64576:386:0;;;;;;;;;:::i;53721:45::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;53721:45:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;53721:45:0;;:::i;55477:283::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;55477:283:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;55477:283:0;;:::i;65970:242::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;65970:242:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;65970:242:0;;:::i;53669:43::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;53669:43:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;53669:43:0;;:::i;5191:148::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;5191:148:0;;;:::i;64974:175::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;64974:175:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;64974:175:0;;;;;;;;;:::i;11548:147::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;11548:147:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;11548:147:0;;:::i;63923:323::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;63923:323:0;;;;;;;:::i;58286:813::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;58286:813:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;58286:813:0;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;58286:813:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;58286:813:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;58286:813:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;58286:813:0;;-1:-1:-1;58286:813:0;;-1:-1:-1;;;;;58286:813:0:i;65386:196::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;65386:196:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;65386:196:0;;;;;;;;;:::i;4549:79::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;4549:79:0;;;:::i;:::-;;;;-1:-1:-1;;;;;4549:79:0;;;;;;;;;;;;;;53640:20;;5:9:-1;2:2;;;27:1;24;17:12;2:2;53640:20:0;;;:::i;64258:310::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;64258:310:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;64258:310:0;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;64258:310:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;64258:310:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;64258:310:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;64258:310:0;;-1:-1:-1;;;;64258:310:0;;;;-1:-1:-1;64258:310:0;:::i;69858:825::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;69858:825:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;69858:825:0;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;69858:825:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;69858:825:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;69858:825:0;;-1:-1:-1;69858:825:0;-1:-1:-1;69858:825:0;:::i;54593:255::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;54593:255:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;54593:255:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;54593:255:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;54593:255:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;54593:255:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;54593:255:0;;;;;;;;-1:-1:-1;54593:255:0;;-1:-1:-1;;;;;11:28;;8:2;;;52:1;49;42:12;8:2;54593:255:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;54593:255:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;54593:255:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;54593:255:0;;;;;;;;-1:-1:-1;54593:255:0;;-1:-1:-1;;;;;11:28;;8:2;;;52:1;49;42:12;8:2;54593:255:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;54593:255:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;54593:255:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;54593:255:0;;-1:-1:-1;54593:255:0;;-1:-1:-1;;;;;54593:255:0:i;67758:1868::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;67758:1868:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;67758:1868:0;;;;;;;;;;;;:::i;53825:165::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;53825:165:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;53825:165:0;-1:-1:-1;;;;;53825:165:0;;:::i;56105:1045::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;56105:1045:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;56105:1045:0;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;56105:1045:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;56105:1045:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;56105:1045:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;56105:1045:0;;;;;;;;-1:-1:-1;56105:1045:0;;-1:-1:-1;;;;;11:28;;8:2;;;52:1;49;42:12;8:2;56105:1045:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;56105:1045:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;56105:1045:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;56105:1045:0;;-1:-1:-1;;;;;;;56105:1045:0;;;;-1:-1:-1;;;56105:1045:0;;;;;;:::i;11703:159::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;11703:159:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;11703:159:0;;;;;;;;;:::i;67647:48::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;67647:48:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;67647:48:0;;:::i;70821:457::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;70821:457:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;70821:457:0;;:::i;70691:122::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;70691:122:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;70691:122:0;;:::i;54992:477::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;54992:477:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;54992:477:0;;;;;;;:::i;54358:227::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;54358:227:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;54358:227:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;54358:227:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;54358:227:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;54358:227:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;54358:227:0;;-1:-1:-1;54358:227:0;;-1:-1:-1;;;;;54358:227:0:i;5494:281::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;5494:281:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;5494:281:0;-1:-1:-1;;;;;5494:281:0;;:::i;69634:216::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;69634:216:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;69634:216:0;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;69634:216:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;69634:216:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;69634:216:0;;-1:-1:-1;69634:216:0;-1:-1:-1;69634:216:0;:::i;59107:733::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;59107:733:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;59107:733:0;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;59107:733:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;59107:733:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;59107:733:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;59107:733:0;;-1:-1:-1;59107:733:0;;-1:-1:-1;;;;;59107:733:0:i;54856:128::-;-1:-1:-1;54971:4:0;;54856:128::o;65760:202::-;65826:23;65841:7;65826:14;:23::i;:::-;65865:5;;:26;;;-1:-1:-1;;;65865:26:0;;;;;;;;;;-1:-1:-1;;;;;65865:5:0;;;;:17;;:26;;;;;;;;;;;;;;;:5;:26;;;2:2:-1;;;;27:1;24;17:12;2:2;65865:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;65865:26:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;65865:26:0;65860:95;;65908:5;;:35;;;-1:-1:-1;;;65908:35:0;;;;;;;;:5;:35;;;;;;-1:-1:-1;;;;;65908:5:0;;;;:20;;:35;;;;;:5;;:35;;;;;;;;:5;;:35;;;2:2:-1;;;;27:1;24;17:12;2:2;65908:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;65908:35:0;;;;65860:95;65760:202;:::o;53773:43::-;;;;;;;;;;;;;:::o;63511:404::-;22906:1;23528:7;;:19;;23520:63;;;;;-1:-1:-1;;;23520:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;23520:63:0;;;;;;;;;;;;;;;22906:1;23661:7;:18;63673:20:::1;63691:1;63673:17;:20::i;:::-;63708:5;::::0;:24:::1;::::0;;-1:-1:-1;;;63708:24:0;;::::1;::::0;::::1;::::0;;;;;-1:-1:-1;;;;;63708:5:0;;::::1;::::0;:15:::1;::::0;:24;;;;;::::1;::::0;;;;;;;;;:5;:24;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;63708:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;63708:24:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;63708:24:0;63704:145:::1;;;63749:26;63757:7;63766:8;63749:7;:26::i;:::-;63704:145;;;63808:29;63814:7;63823:6;63831:5;63808;:29::i;:::-;63869:7;63864:43;63878:6;63886:8;63896:10;63864:43;;;;;;;;;;;;-1:-1:-1::0;;;;;63864:43:0::1;-1:-1:-1::0;;;;;63864:43:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11:::0;;::::1;84:18:::0;71:11;;::::1;64:39:::0;52:2:::1;45:10;8:100;;;12:14;63864:43:0;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;22862:1:0;23841:7;:22;-1:-1:-1;63511:404:0:o;25366:207::-;-1:-1:-1;;;25366:207:0;;;;;;;:::o;67702:47::-;;;;;;;;;;;;;;;:::o;65590:162::-;65673:23;65688:7;65673:14;:23::i;:::-;65707:5;;:37;;;-1:-1:-1;;;65707:37:0;;;;;;;;-1:-1:-1;;;;;65707:37:0;;;;;;;;;:5;;;;;:16;;:37;;;;;:5;;:37;;;;;;;:5;;:37;;;2:2:-1;;;;27:1;24;17:12;2:2;65707:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;65707:37:0;;;;65590:162;;:::o;64576:386::-;64691:23;64706:7;64691:14;:23::i;:::-;64817:5;;:25;;;-1:-1:-1;;;64817:25:0;;;;;;;;;;64747:96;;-1:-1:-1;;;;;64817:5:0;;:16;;:25;;;;;;;;;;;;;;:5;:25;;;2:2:-1;;;;27:1;24;17:12;2:2;64817:25:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;64817:25:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;64817:25:0;64747:5;;:47;;;-1:-1:-1;;;64747:47:0;;;;;;;;;;-1:-1:-1;;;;;64747:5:0;;;;:38;;:47;;;;;64817:25;;64747:47;;;;;;;;:5;:47;;;2:2:-1;;;;27:1;24;17:12;2:2;64747:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;64747:47:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;64747:47:0;;:96;:69;:96;:::i;:::-;:118;64725:169;;;;;-1:-1:-1;;;64725:169:0;;;;;;;;;;;;-1:-1:-1;;;64725:169:0;;;;;;;;;;;;;;;64905:5;;:49;;;-1:-1:-1;;;64905:49:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;64905:5:0;;;;:26;;:49;;;;;:5;;:49;;;;;;;;:5;;:49;;;2:2:-1;;;;27:1;24;17:12;53721:45:0;;;;;;;;;;;;;:::o;55477:283::-;55582:5;;:24;;;-1:-1:-1;;;55582:24:0;;;;;;;;;;55542:7;;-1:-1:-1;;;;;55582:5:0;;:15;;:24;;;;;;;;;;;;;;:5;:24;;;2:2:-1;;;;27:1;24;17:12;2:2;55582:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;55582:24:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;55582:24:0;:118;;55671:5;;:29;;;-1:-1:-1;;;55671:29:0;;;;;;;;;;-1:-1:-1;;;;;55671:5:0;;;;:20;;:29;;;;;;;;;;;;;;;:5;:29;;;2:2:-1;;;;27:1;24;17:12;2:2;55671:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;55671:29:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;55671:29:0;55582:118;;;55626:5;;:25;;;-1:-1:-1;;;55626:25:0;;;;;;;;;;-1:-1:-1;;;;;55626:5:0;;;;:16;;:25;;;;;;;;;;;;;;;:5;:25;;;2:2:-1;;;;27:1;24;17:12;2:2;55626:25:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;55626:25:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;55626:25:0;55582:118;55562:138;55477:283;-1:-1:-1;;55477:283:0:o;65970:242::-;66033:23;66048:7;66033:14;:23::i;:::-;66072:5;;:26;;;-1:-1:-1;;;66072:26:0;;;;;;;;;;-1:-1:-1;;;;;66072:5:0;;;;:17;;:26;;;;;;;;;;;;;;;:5;:26;;;2:2:-1;;;;27:1;24;17:12;2:2;66072:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;66072:26:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;66072:26:0;66067:95;;66115:5;;:35;;;-1:-1:-1;;;66115:35:0;;;;;;;;:5;:35;;;;;;-1:-1:-1;;;;;66115:5:0;;;;:20;;:35;;;;;:5;;:35;;;;;;;;:5;;:35;;;2:2:-1;;;;27:1;24;17:12;2:2;66115:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;66115:35:0;;;;66067:95;66172:5;;:32;;;-1:-1:-1;;;66172:32:0;;;;;;;;:5;:32;;;;;;-1:-1:-1;;;;;66172:5:0;;;;:17;;:32;;;;;:5;;:32;;;;;;;;:5;;:32;;;2:2:-1;;;;27:1;24;17:12;53669:43:0;;;;;;;;;;;;;;;:::o;5191:148::-;4771:12;:10;:12::i;:::-;4761:6;;-1:-1:-1;;;;;4761:6:0;;;:22;;;4753:67;;;;;-1:-1:-1;;;4753:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4753:67:0;;;;;;;;;;;;;;;5282:6:::1;::::0;5261:40:::1;::::0;5298:1:::1;::::0;-1:-1:-1;;;;;5282:6:0::1;::::0;5261:40:::1;::::0;5298:1;;5261:40:::1;5312:6;:19:::0;;-1:-1:-1;;;;;;5312:19:0::1;::::0;;5191:148::o;64974:175::-;65076:23;65091:7;65076:14;:23::i;:::-;65110:20;;;;:11;:20;;;;;;:31;;-1:-1:-1;;65110:31:0;;;;;;;;;;64974:175::o;11548:147::-;11633:18;;;;:8;:18;;;;;;;;11632:19;;:44;;;11669:7;:5;:7::i;:::-;-1:-1:-1;;;;;11655:21:0;:10;-1:-1:-1;;;;;11655:21:0;;11632:44;11624:63;;;;;-1:-1:-1;;;11624:63:0;;;;;;;;;;;;-1:-1:-1;;;11624:63:0;;;;;;;;;;;;;;63923:323;22906:1;23528:7;;:19;;23520:63;;;;;-1:-1:-1;;;23520:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;23520:63:0;;;;;;;;;;;;;;;22906:1;23661:7;:18;;;64060:20:::1;::::0;:17:::1;:20::i;:::-;64096:5;::::0;:24:::1;::::0;;-1:-1:-1;;;64096:24:0;;::::1;::::0;::::1;::::0;;;;;-1:-1:-1;;;;;64096:5:0;;::::1;::::0;:15:::1;::::0;:24;;;;;::::1;::::0;;;;;;;;;:5;:24;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;64096:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;64096:24:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;64096:24:0;64091:148:::1;;64137:31;64145:7;64154:6;64162:5;64137:7;:31::i;:::-;64091:148;;;64201:26;64211:7;64220:6;64201:9;:26::i;:::-;-1:-1:-1::0;;22862:1:0;23841:7;:22;63923:323::o;58286:813::-;22906:1;23528:7;;:19;;23520:63;;;;;-1:-1:-1;;;23520:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;23520:63:0;;;;;;;;;;;;;;;22906:1;23661:7;:18;58432:9:::1;58427:665;58451:6;:13;58447:1;:17;58427:665;;;58521:5;::::0;58546:9;;58560:10:::1;::::0;-1:-1:-1;;;;;58521:5:0::1;::::0;:15:::1;::::0;58537:7;;58546:6;;58553:1;;58546:9;::::1;;;;;;;;;;;58521:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;58521:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;58521:35:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;58521:35:0;-1:-1:-1;;;;;58521:49:0::1;;58495:124;;;::::0;;-1:-1:-1;;;58495:124:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;58495:124:0;;;;;;;;;;;;;::::1;;58634:5;::::0;58662:9;;-1:-1:-1;;;;;58634:5:0;;::::1;::::0;:18:::1;::::0;58653:7;;58662:6;;58669:1;;58662:9;::::1;;;;;;;;;;;58681:1;58634:50;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;58634:50:0::1;-1:-1:-1::0;;;;;58634:50:0::1;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;58634:50:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;58634:50:0;;;;58713:1;58703:7;:11;:27;;;;;58728:2;58718:7;:12;58703:27;58699:382;;;58783:5;::::0;:25:::1;::::0;;-1:-1:-1;;;58783:25:0;;::::1;::::0;::::1;::::0;;;;;58751:19:::1;::::0;-1:-1:-1;;;;;58783:5:0::1;::::0;:16:::1;::::0;:25;;;;;::::1;::::0;;;;;;;;:5;:25;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;58783:25:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;58783:25:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;58783:25:0;58859:9;;58783:25;;-1:-1:-1;;;;;;58828:18:0;::::1;::::0;::::1;::::0;58847:10:::1;::::0;58859:6;;58866:1;;58859:9;::::1;;;;;;;;;;;58828:41;;;;;;;;;;;;;-1:-1:-1::0;;;;;58828:41:0::1;-1:-1:-1::0;;;;;58828:41:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;58828:41:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;58828:41:0;;;;58699:382;;;;58910:5;::::0;:18:::1;::::0;;-1:-1:-1;;;58910:18:0;;::::1;::::0;::::1;::::0;;;;;-1:-1:-1;;;;;58910:5:0;;::::1;::::0;:9:::1;::::0;:18;;;;;::::1;::::0;;;;;;;;;:5;:18;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;58910:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;58910:18:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;58910:18:0;59037:9;;-1:-1:-1;;;;;58910:35:0;;::::1;::::0;::::1;::::0;58976:4:::1;::::0;59004:10:::1;::::0;59037:6;;59044:1;;59037:9;::::1;;;;;;;;;;;58910:155;;;;;;;;;;;;;-1:-1:-1::0;;;;;58910:155:0::1;-1:-1:-1::0;;;;;58910:155:0::1;;;;;;-1:-1:-1::0;;;;;58910:155:0::1;-1:-1:-1::0;;;;;58910:155:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;58910:155:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;58910:155:0;;;;58699:382;58470:8;:1:::0;58476::::1;58470:8;:5;:8;:::i;:::-;58466:12;;58427:665;;;-1:-1:-1::0;;22862:1:0;23841:7;:22;-1:-1:-1;58286:813:0:o;65386:196::-;65496:23;65511:7;65496:14;:23::i;:::-;65530:5;;:44;;;-1:-1:-1;;;65530:44:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;65530:5:0;;;;:25;;:44;;;;;:5;;:44;;;;;;;;:5;;:44;;;2:2:-1;;;;27:1;24;17:12;4549:79:0;4614:6;;-1:-1:-1;;;;;4614:6:0;4549:79;:::o;53640:20::-;;;-1:-1:-1;;;;;53640:20:0;;:::o;64258:310::-;64398:23;64413:7;64398:14;:23::i;:::-;64437:9;64432:129;64456:6;:13;64452:1;:17;64432:129;;;64500:5;;64529:9;;-1:-1:-1;;;;;64500:5:0;;;;:19;;64520:7;;64529:6;;64536:1;;64529:9;;;;;;;;;;;;64540:8;64500:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;64500:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;64500:49:0;;;;64475:8;64481:1;64475;:5;;:8;;;;:::i;:::-;64471:12;;64432:129;;;;64258:310;;;:::o;69858:825::-;4771:12;:10;:12::i;:::-;4761:6;;-1:-1:-1;;;;;4761:6:0;;;:22;;;4753:67;;;;;-1:-1:-1;;;4753:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4753:67:0;;;;;;;;;;;;;;;69968:9:::1;69963:713;69983:22:::0;;::::1;69963:713;;;70036:13;70052:11;;70064:1;70052:14;;;;;;;70089:5;::::0;:40:::1;::::0;;-1:-1:-1;;;70089:40:0;;::::1;::::0;::::1;::::0;;;70052:14:::1;::::0;;::::1;::::0;;;::::1;;70089:40:::0;;;;;;;;70052:14;;-1:-1:-1;;;;;;70089:5:0;;::::1;::::0;:22:::1;::::0;-1:-1:-1;70089:40:0;;;;;70052:14;70089:40;;;;;;:5;:40;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;70089:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;70089:40:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;70089:40:0;70081:54:::1;;;::::0;;-1:-1:-1;;;70081:54:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;70081:54:0;;;;;;;;;;;;;::::1;;70154:5;::::0;:40:::1;::::0;;-1:-1:-1;;;70154:40:0;;::::1;::::0;::::1;::::0;;;;;;;;;;;-1:-1:-1;;;;;70154:5:0;;::::1;::::0;:22:::1;::::0;:40;;;;;::::1;::::0;;;;;;;;;:5;:40;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;70154:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;70154:40:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;70154:40:0;70150:119:::1;;;70215:5;::::0;:38:::1;::::0;;-1:-1:-1;;;70215:38:0;;::::1;::::0;::::1;::::0;;;;;;;;;;;-1:-1:-1;;;;;70215:5:0;;::::1;::::0;:20:::1;::::0;:38;;;;;:5:::1;::::0;:38;;;;;;;;:5;;:38;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;70215:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;70215:38:0;;;;70150:119;70299:1;70287:9;:13;:31;;;;;70316:2;70304:9;:14;70287:31;70283:382;;;70371:5;::::0;:27:::1;::::0;;-1:-1:-1;;;70371:27:0;;::::1;::::0;::::1;::::0;;;;;70339:19:::1;::::0;-1:-1:-1;;;;;70371:5:0::1;::::0;:16:::1;::::0;:27;;;;;::::1;::::0;;;;;;;;:5;:27;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;70371:27:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;70371:27:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;70371:27:0;70418:37:::1;::::0;;-1:-1:-1;;;70418:37:0;;70437:10:::1;70418:37;::::0;::::1;::::0;;;;;;;;;70371:27;;-1:-1:-1;;;;;;70418:18:0;::::1;::::0;::::1;::::0;:37;;;;;-1:-1:-1;;70418:37:0;;;;;;;;-1:-1:-1;70418:18:0;:37;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;70418:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;70418:37:0;;;;70283:382;;;;70496:5;::::0;:20:::1;::::0;;-1:-1:-1;;;70496:20:0;;::::1;::::0;::::1;::::0;;;;;-1:-1:-1;;;;;70496:5:0;;::::1;::::0;:9:::1;::::0;:20;;;;;::::1;::::0;;;;;;;;;:5;:20;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;70496:20:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;70496:20:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;70496:20:0;:153:::1;::::0;;-1:-1:-1;;;70496:153:0;;70564:4:::1;70496:153;::::0;::::1;::::0;70592:10:::1;70496:153:::0;;;;;;;;;;;;-1:-1:-1;;;;;70496:37:0;;::::1;::::0;::::1;::::0;:153;;;;;-1:-1:-1;;70496:153:0;;;;;;;;-1:-1:-1;70496:37:0;:153;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;70496:153:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;70496:153:0;;;;70283:382;-1:-1:-1::0;70011:8:0::1;:1:::0;70017::::1;70011:8;:5;:8;:::i;:::-;70007:12;;69963:713;;54593:255:::0;-1:-1:-1;;;54593:255:0;;;;;;;:::o;67758:1868::-;4771:12;:10;:12::i;:::-;4761:6;;-1:-1:-1;;;;;4761:6:0;;;:22;;;4753:67;;;;;-1:-1:-1;;;4753:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4753:67:0;;;;;;;;;;;;;;;67895:9:::1;67908:1;67895:14;67891:78;;;67926:31;::::0;;-1:-1:-1;;;67926:31:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;67926:31:0;;;;;;;;;;;;;::::1;67891:78;68003:5;::::0;:31:::1;::::0;;-1:-1:-1;;;68003:31:0;;::::1;::::0;::::1;::::0;;;;;67979:21:::1;::::0;-1:-1:-1;;;;;68003:5:0::1;::::0;:20:::1;::::0;:31;;;;;::::1;::::0;;;;;;;;:5;:31;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;68003:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;68003:31:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;68003:31:0;;-1:-1:-1;68053:17:0;68045:41:::1;;;::::0;;-1:-1:-1;;;68045:41:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;68045:41:0;;;;;;;;;;;;;::::1;;68105:10:::0;68097:40:::1;;;::::0;;-1:-1:-1;;;68097:40:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;68097:40:0;;;;;;;;;;;;;::::1;;68160:13;68152:5;:21;68148:75;;;68198:13;68190:21;;68148:75;68301:15;68337:42;-1:-1:-1::0;;;;;68319:67:0::1;;68387:9;68319:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;68319:78:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;68319:78:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;68319:78:0;68408:14:::1;68425:24:::0;;;:13:::1;68319:78;68425:24:::0;;;;;68319:78;;-1:-1:-1;;;;;;68425:24:0::1;68468:20:::0;;;:41:::1;;;68502:7;-1:-1:-1::0;;;;;68492:17:0::1;:6;-1:-1:-1::0;;;;;68492:17:0::1;;68468:41;68460:85;;;::::0;;-1:-1:-1;;;68460:85:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;68601:17;68632:7;-1:-1:-1::0;;;;;68621:32:0::1;;:34;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;68621:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;68621:34:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;68621:34:0;;-1:-1:-1;68666:20:0::1;68703:5:::0;68689:20:::1;::::0;::::1;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;68689:20:0;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;::::0;-1:-1;68689:20:0::1;;68666:43;;68720:24;68761:5;68747:20;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;68747:20:0;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;::::0;-1:-1;68747:20:0::1;-1:-1:-1::0;68720:47:0;-1:-1:-1;68783:9:0::1;68778:228;68802:5;68798:1;:9;68778:228;;;68847:5;::::0;:30:::1;::::0;;-1:-1:-1;;;68847:30:0;;::::1;::::0;::::1;::::0;;;;;;;;;;;68829:15:::1;::::0;-1:-1:-1;;;;;68847:5:0::1;::::0;:16:::1;::::0;:30;;;;;::::1;::::0;;;;;;;;:5;:30;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;68847:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;68847:30:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;68847:30:0;68892:6;;68847:30;;-1:-1:-1;68847:30:0;;68892:3;;68896:1;;68892:6;::::1;;;;;;;;;;:16;;;::::0;::::1;68936:1;68923:7;68931:1;68923:10;;;;;;;;;;;;;:14;;;::::0;::::1;68952:42;68966:9;68977:7;68986;68952:13;:42::i;:::-;-1:-1:-1::0;68809:3:0::1;;68778:228;;;-1:-1:-1::0;69021:9:0::1;69016:107;69040:3;:10;69036:1;:14;69016:107;;;69072:5;::::0;69104:6;;-1:-1:-1;;;;;69072:5:0;;::::1;::::0;:20:::1;::::0;69093:9;;69104:3;;69108:1;;69104:6;::::1;;;;;;;;;;;69072:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;69072:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;-1:-1:::0;;69052:3:0::1;::::0;;::::1;::::0;-1:-1:-1;69016:107:0::1;::::0;-1:-1:-1;69016:107:0::1;;-1:-1:-1::0;69155:40:0::1;::::0;;-1:-1:-1;;;69155:40:0;;69189:4:::1;69155:40;::::0;::::1;::::0;;;69133:19:::1;::::0;-1:-1:-1;;;;;69155:25:0;::::1;::::0;::::1;::::0;:40;;;;;::::1;::::0;;;;;;;;;:25;:40;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;69155:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;69155:40:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;69155:40:0;69206:38:::1;::::0;;-1:-1:-1;;;69206:38:0;;::::1;::::0;::::1;::::0;;;;;;;;;;;69155:40;;-1:-1:-1;;;;;;69206:24:0;::::1;::::0;::::1;::::0;69231:3;;69236:7;;69206:38;;;;;;;;;;;69155:40:::1;69206:38:::0;;::::1;::::0;::::1;::::0;;;;8:100:-1::1;33:3;30:1;27:10;8:100;;;90:11:::0;;::::1;84:18:::0;71:11;;::::1;64:39:::0;52:2:::1;45:10;8:100;;;12:14;69206:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11:::0;;::::1;84:18:::0;71:11;;::::1;64:39:::0;52:2:::1;45:10;8:100;;;12:14;69206:38:0;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;69206:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;69206:38:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;;69327:40:0::1;::::0;;-1:-1:-1;;;69327:40:0;;69361:4:::1;69327:40;::::0;::::1;::::0;;;69306:18:::1;::::0;-1:-1:-1;;;;;69327:25:0;::::1;::::0;::::1;::::0;:40;;;;;69206:38:::1;::::0;69327:40;;;;;;;;:25;:40;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;69327:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;69327:40:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;69327:40:0;;-1:-1:-1;69386:22:0;;::::1;69420:6;69412:14:::0;::::1;69386:40;69378:83;;;::::0;;-1:-1:-1;;;69378:83:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;69499:7;69472:13;:24;69486:9;69472:24;;;;;;;;;;;;:34;;;;;-1:-1:-1::0;;;;;69472:34:0::1;;;;;-1:-1:-1::0;;;;;69472:34:0::1;;;;;;69521:5;;;;;;;;;-1:-1:-1::0;;;;;69521:5:0::1;-1:-1:-1::0;;;;;69521:20:0::1;;69542:9;69521:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;69521:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;69521:31:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;69521:31:0;69517:102:::1;;69574:26;::::0;;;:15:::1;:26;::::0;;;;:33;;-1:-1:-1;;69574:33:0::1;69603:4;69574:33;::::0;;69517:102:::1;4831:1;;;;;;;;67758:1868:::0;;;:::o;53825:165::-;2225:12;;;;;;;;:31;;;2241:15;:13;:15::i;:::-;2225:47;;;-1:-1:-1;2261:11:0;;;;2260:12;2225:47;2203:143;;;;-1:-1:-1;;;2203:143:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2359:19;2382:12;;;;;;2381:13;2405:99;;;;2440:12;:19;;-1:-1:-1;;;;2440:19:0;;;;;2474:18;2455:4;2474:18;;;2405:99;53897:13:::1;:11;:13::i;:::-;53921:21;:19;:21::i;:::-;53953:5;:29:::0;;-1:-1:-1;;;;;;53953:29:0::1;-1:-1:-1::0;;;;;53953:29:0;::::1;;::::0;;2530:67;;;;2580:5;2565:20;;-1:-1:-1;;2565:20:0;;;2530:67;53825:165;;:::o;56105:1045::-;56288:7;22906:1;23528:7;;:19;;23520:63;;;;;-1:-1:-1;;;23520:63:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;23520:63:0;;;;;;;;;;;;;;;22906:1;23661:7;:18;56308:20:::1;56326:1;56308:17;:20::i;:::-;56487:40;::::0;;-1:-1:-1;;;56487:40:0;;::::1;::::0;::::1;::::0;;;;;;;;;;;56399:42:::1;::::0;56339:28:::1;::::0;56399:42;;56487:26:::1;::::0;56514:4;;56520:6;;56487:40;;;;;;;;;;;::::1;::::0;::::1;::::0;;;;56339:28;8:100:-1::1;33:3;30:1;27:10;8:100;;;90:11:::0;;::::1;84:18:::0;71:11;;::::1;64:39:::0;52:2:::1;45:10;8:100;;;12:14;56487:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;56487:40:0;;::::1;::::0;;;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;23:1:-1::1;8:100;33:3;30:1;27:10;8:100;;;90:11:::0;;::::1;84:18:::0;71:11;;::::1;64:39:::0;52:2:::1;45:10;8:100;;;12:14;56487:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;56487:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;56487:40:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;56487:40:0;56556:5:::1;::::0;:19:::1;::::0;;-1:-1:-1;;;56556:19:0;;;;56487:40;;-1:-1:-1;56538:15:0::1;::::0;-1:-1:-1;;;;;56556:5:0;;::::1;::::0;:17:::1;::::0;:19:::1;::::0;;::::1;::::0;56487:40:::1;::::0;56556:19;;;;;;;;56538:15;56556:5;:19;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;56556:19:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;56556:19:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;56556:19:0;56586:5:::1;::::0;:46:::1;::::0;;-1:-1:-1;;;56586:46:0;;::::1;::::0;::::1;::::0;;;-1:-1:-1;;;;;56586:46:0;;::::1;::::0;;;;;;56556:19;;-1:-1:-1;56586:5:0;::::1;::::0;:22:::1;::::0;:46;;;;;:5:::1;::::0;:46;;;;;;;;:5;;:46;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;56586:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;-1:-1:::0;;56643:5:0::1;::::0;:24:::1;::::0;;-1:-1:-1;;;56643:24:0;;::::1;::::0;::::1;::::0;;;;;-1:-1:-1;;;;;56643:5:0;;::::1;::::0;-1:-1:-1;56643:15:0::1;::::0;-1:-1:-1;56643:24:0;;;;;:5:::1;::::0;:24;;;;;;;;:5;;:24;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;56643:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;56643:24:0;;;;56683:10;56678:347;;56710:5;::::0;:43:::1;::::0;;-1:-1:-1;;;56710:43:0;;::::1;::::0;::::1;::::0;;;-1:-1:-1;;;;;56710:43:0;;::::1;::::0;;;;;;:5;;;::::1;::::0;:19:::1;::::0;:43;;;;;:5:::1;::::0;:43;;;;;;;:5;;:43;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;56710:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;-1:-1:::0;;56768:5:0::1;::::0;:21:::1;::::0;;-1:-1:-1;;;56768:21:0;;::::1;::::0;::::1;::::0;;;;;-1:-1:-1;;;;;56768:5:0;;::::1;::::0;-1:-1:-1;56768:12:0::1;::::0;-1:-1:-1;56768:21:0;;;;;:5:::1;::::0;:21;;;;;;;;:5;;:21;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;56768:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;-1:-1:::0;;56804:5:0::1;::::0;:41:::1;::::0;;-1:-1:-1;;;56804:41:0;;::::1;::::0;::::1;::::0;;;:5;:41;;;;;;-1:-1:-1;;;;;56804:5:0;;::::1;::::0;-1:-1:-1;56804:26:0::1;::::0;-1:-1:-1;56804:41:0;;;;;:5:::1;::::0;:41;;;;;;;;:5;;:41;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;56804:41:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;56804:41:0;;;;56678:347;;;56878:5;::::0;:47:::1;::::0;;-1:-1:-1;;;56878:47:0;;::::1;::::0;::::1;::::0;;;-1:-1:-1;;;;;56878:47:0;;::::1;::::0;;;;;;:5;;;::::1;::::0;:23:::1;::::0;:47;;;;;:5:::1;::::0;:47;;;;;;;:5;;:47;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;56878:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;-1:-1:::0;;56940:5:0::1;::::0;:25:::1;::::0;;-1:-1:-1;;;56940:25:0;;::::1;::::0;::::1;::::0;;;;;-1:-1:-1;;;;;56940:5:0;;::::1;::::0;-1:-1:-1;56940:16:0::1;::::0;-1:-1:-1;56940:25:0;;;;;:5:::1;::::0;:25;;;;;;;;:5;;:25;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;56940:25:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;-1:-1:::0;;56980:5:0::1;::::0;:33:::1;::::0;;-1:-1:-1;;;56980:33:0;;::::1;::::0;::::1;::::0;;;:5;:33;;;;;;-1:-1:-1;;;;;56980:5:0;;::::1;::::0;-1:-1:-1;56980:18:0::1;::::0;-1:-1:-1;56980:33:0;;;;;:5:::1;::::0;:33;;;;;;;;:5;;:33;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;56980:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;56980:33:0;;;;56678:347;57035:5;::::0;:37:::1;::::0;;-1:-1:-1;;;57035:37:0;;::::1;::::0;::::1;::::0;;;57061:10:::1;57035:37:::0;;;;;;-1:-1:-1;;;;;57035:5:0;;::::1;::::0;:16:::1;::::0;:37;;;;;:5:::1;::::0;:37;;;;;;;;:5;;:37;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;57035:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;-1:-1:::0;;57088:29:0::1;::::0;;57106:10:::1;57088:29:::0;;;;57097:7;;-1:-1:-1;57088:29:0::1;::::0;-1:-1:-1;57088:29:0;;;;::::1;::::0;;::::1;22862:1:::0;23841:7;:22;57135:7;56105:1045;-1:-1:-1;;;;;;;56105:1045:0:o;11703:159::-;4771:12;:10;:12::i;:::-;4761:6;;-1:-1:-1;;;;;4761:6:0;;;:22;;;4753:67;;;;;-1:-1:-1;;;4753:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4753:67:0;;;;;;;;;;;;;;;11824:18:::1;::::0;;;:8:::1;:18;::::0;;;;;:30;;-1:-1:-1;;11824:30:0::1;::::0;::::1;;::::0;;;::::1;::::0;;11703:159::o;67647:48::-;;;;;;;;;;;;-1:-1:-1;;;;;67647:48:0;;:::o;70821:457::-;70885:20;70903:1;70885:17;:20::i;:::-;70924:26;;;;:15;:26;;;;;;;;70916:71;;;;;-1:-1:-1;;;70916:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71015:5;;:23;;;-1:-1:-1;;;71015:23:0;;;;;;;;;;70998:14;;-1:-1:-1;;;;;71015:5:0;;:12;;:23;;;;;;;;;;;;;;:5;:23;;;2:2:-1;;;;27:1;24;17:12;2:2;71015:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;71015:23:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;71015:23:0;71063:28;;;-1:-1:-1;;;71063:28:0;;71080:10;71063:28;;;;;;71015:23;;-1:-1:-1;71049:11:0;;-1:-1:-1;;;;;71063:16:0;;;;;:28;;;;;71015:23;;71063:28;;;;;;;:16;:28;;;2:2:-1;;;;27:1;24;17:12;2:2;71063:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;71063:28:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;71063:28:0;;-1:-1:-1;71110:7:0;71102:21;;;;;-1:-1:-1;;;71102:21:0;;;;;;;;;;;;-1:-1:-1;;;71102:21:0;;;;;;;;;;;;;;;71134:32;;;-1:-1:-1;;;71134:32:0;;71150:10;71134:32;;;;;;;;;;;;-1:-1:-1;;;;;71134:15:0;;;;;:32;;;;;-1:-1:-1;;71134:32:0;;;;;;;-1:-1:-1;71134:15:0;:32;;;2:2:-1;;;;27:1;24;17:12;2:2;71134:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;;71177:14:0;71201:24;;;:13;:24;;;;;;;;;71237:33;;-1:-1:-1;;;71237:33:0;;71254:10;71237:33;;;;;;;;;;;;-1:-1:-1;;;;;71201:24:0;;;;-1:-1:-1;71201:24:0;;71237:16;;:33;;;;;71201:24;;71237:33;;;;;;;;;71201:24;71237:33;;;2:2:-1;;;;27:1;24;17:12;2:2;71237:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;71237:33:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;70691:122:0;4771:12;:10;:12::i;:::-;4761:6;;-1:-1:-1;;;;;4761:6:0;;;:22;;;4753:67;;;;;-1:-1:-1;;;4753:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4753:67:0;;;;;;;;;;;;;;;70772:26:::1;::::0;;;:15:::1;:26;::::0;;;;:33;;-1:-1:-1;;70772:33:0::1;70801:4;70772:33;::::0;;70691:122::o;54992:477::-;55109:4;55135:17;;;:8;:17;;;;;;:21;55131:163;;55186:19;;;;:10;:19;;;;;;55177:28;;;;;:58;;-1:-1:-1;55218:17:0;;;;:8;:17;;;;;;55209:26;;;55177:58;55173:110;;;-1:-1:-1;55263:4:0;55256:11;;55173:110;55324:5;;:32;;;-1:-1:-1;;;55324:32:0;;;;;;;;;;-1:-1:-1;;;;;55324:5:0;;;;:23;;:32;;;;;;;;;;;;;;;:5;:32;;;2:2:-1;;;;27:1;24;17:12;2:2;55324:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;55324:32:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;55324:32:0;:137;;55429:5;;:32;;;-1:-1:-1;;;55429:32:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;55429:5:0;;;;:16;;:32;;;;;;;;;;;;;;;:5;:32;;;2:2:-1;;;;27:1;24;17:12;2:2;55429:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;55429:32:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;55429:32:0;55324:137;;;55377:5;;:32;;;-1:-1:-1;;;55377:32:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;55377:5:0;;;;:16;;:32;;;;;;;;;;;;;;;:5;:32;;;2:2:-1;;;;27:1;24;17:12;2:2;55377:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;55377:32:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;55377:32:0;55376:33;55324:137;55304:157;54992:477;-1:-1:-1;;;54992:477:0:o;54358:227::-;-1:-1:-1;;;54358:227:0;;;;;;;:::o;5494:281::-;4771:12;:10;:12::i;:::-;4761:6;;-1:-1:-1;;;;;4761:6:0;;;:22;;;4753:67;;;;;-1:-1:-1;;;4753:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4753:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;5597:22:0;::::1;5575:110;;;;-1:-1:-1::0;;;5575:110:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5722:6;::::0;5701:38:::1;::::0;-1:-1:-1;;;;;5701:38:0;;::::1;::::0;5722:6:::1;::::0;5701:38:::1;::::0;5722:6:::1;::::0;5701:38:::1;5750:6;:17:::0;;-1:-1:-1;;;;;;5750:17:0::1;-1:-1:-1::0;;;;;5750:17:0;;;::::1;::::0;;;::::1;::::0;;5494:281::o;69634:216::-;4771:12;:10;:12::i;:::-;4761:6;;-1:-1:-1;;;;;4761:6:0;;;:22;;;4753:67;;;;;-1:-1:-1;;;4753:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4753:67:0;;;;;;;;;;;;;;;69737:44:::1;69751:9;69762:11;;69737:44;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;-1:-1;99:1;-1:-1;69737:13:0::1;::::0;-1:-1:-1;;69737:44:0:i:1;:::-;69804:9;69797:45;69815:11;;69828:1;69831:10;69797:45;;;;;;;;;;;;-1:-1:-1::0;;;;;69797:45:0::1;-1:-1:-1::0;;;;;69797:45:0::1;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;;::::1;74:27:::0;69797:45:0::1;::::0;137:4:-1::1;117:14:::0;;::::1;-1:-1:::0;;113:30:::1;157:16:::0;;::::1;69797:45:0::0;;::::1;::::0;-1:-1:-1;69797:45:0;;-1:-1:-1;;;;;;69797:45:0::1;69634:216:::0;;;:::o;59107:733::-;59226:23;59241:7;59226:14;:23::i;:::-;59265:9;59260:573;59284:6;:13;59280:1;:17;59260:573;;;59348:5;;59373:9;;59328:17;;-1:-1:-1;;;;;59348:5:0;;:15;;59364:7;;59373:6;;59380:1;;59373:9;;;;;;;;;;;;59348:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;59348:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;59348:35:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;59348:35:0;;-1:-1:-1;;;;;;59406:23:0;;59398:46;;;;;-1:-1:-1;;;59398:46:0;;;;;;;;;;;;-1:-1:-1;;;59398:46:0;;;;;;;;;;;;;;;59485:5;;:18;;;-1:-1:-1;;;59485:18:0;;;;;;;;;;59534:4;;-1:-1:-1;;;;;59485:5:0;;:9;;:18;;;;;;;;;;;;;;:5;:18;;;2:2:-1;;;;27:1;24;17:12;2:2;59485:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;59485:18:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;59485:18:0;59512:9;;-1:-1:-1;;;;;59485:26:0;;;;;;59512:6;;59519:1;;59512:9;;;;;;;;;;;;59485:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;59485:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;59485:37:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;59485:37:0;-1:-1:-1;;;;;59485:54:0;;59459:125;;;;;-1:-1:-1;;;59459:125:0;;;;;;;;;;;;-1:-1:-1;;;59459:125:0;;;;;;;;;;;;;;;59599:5;;59627:9;;-1:-1:-1;;;;;59599:5:0;;;;:18;;59618:7;;59627:6;;59634:1;;59627:9;;;;;;;;;;;;59646:1;59599:50;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;59599:50:0;-1:-1:-1;;;;;59599:50:0;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;59599:50:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;59664:5:0;;59693:9;;-1:-1:-1;;;;;59664:5:0;;;;-1:-1:-1;59664:19:0;;-1:-1:-1;59684:7:0;;59693:6;;59700:1;;59693:9;;;;;;;;;;;;59704:4;59664:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;59664:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;59724:5:0;;59751:9;;-1:-1:-1;;;;;59724:5:0;;;;-1:-1:-1;59724:17:0;;-1:-1:-1;59742:7:0;;59751:6;;59758:1;;59751:9;;;;;;;;;;;;59724:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;59724:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;59776:5:0;;:21;;;-1:-1:-1;;;59776:21:0;;;;;;;;;;-1:-1:-1;;;;;59776:5:0;;;;-1:-1:-1;59776:12:0;;-1:-1:-1;59776:21:0;;;;;;;;;;;;;;;:5;:21;;;2:2:-1;;;;27:1;24;17:12;2:2;59776:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;59776:21:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;59776:21:0;:45;;;-1:-1:-1;;;59776:45:0;;-1:-1:-1;;;;;59776:45:0;;;;;;;59814:6;59776:45;;;;;;:26;;;;;;;:45;;;;;-1:-1:-1;;59776:45:0;;;;;;;-1:-1:-1;59776:26:0;:45;;;2:2:-1;;;;27:1;24;17:12;2:2;59776:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;59776:45:0;;;;59260:573;59303:8;59309:1;59303;:5;;:8;;;;:::i;:::-;59299:12;;59260:573;;;;59107:733;;:::o;54082:268::-;54152:5;;:26;;;-1:-1:-1;;;54152:26:0;;;;;;;;;;-1:-1:-1;;;;;54152:5:0;;;;:17;;:26;;;;;;;;;;;;;;;:5;:26;;;2:2:-1;;;;27:1;24;17:12;2:2;54152:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;54152:26:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;54152:26:0;54148:195;;;54217:7;:5;:7::i;:::-;-1:-1:-1;;;;;54203:21:0;:10;-1:-1:-1;;;;;54203:21:0;;54195:43;;;;;-1:-1:-1;;;54195:43:0;;;;;;;;;;;;-1:-1:-1;;;54195:43:0;;;;;;;;;;;;;;;54148:195;;;54293:5;;:22;;;-1:-1:-1;;;54293:22:0;;;;;;;;;;-1:-1:-1;;;;;54293:5:0;;;;:13;;:22;;;;;;;;;;;;;;;:5;:22;;;2:2:-1;;;;27:1;24;17:12;2:2;54293:22:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;54293:22:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;54293:22:0;-1:-1:-1;;;;;54279:36:0;:10;:36;54271:60;;;;;-1:-1:-1;;;54271:60:0;;;;;;;;;;;;-1:-1:-1;;;54271:60:0;;;;;;;;;;;;;;60896:425;60997:134;61051:10;61084:4;61104:16;:6;61115:4;61104:16;:10;:16;:::i;:::-;60997:5;;:22;;;-1:-1:-1;;;60997:22:0;;;;;;;;;;-1:-1:-1;;;;;60997:5:0;;;;:13;;:22;;;;;;;;;;;;;;;:5;:22;;;2:2:-1;;;;27:1;24;17:12;2:2;60997:22:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;60997:22:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;60997:22:0;-1:-1:-1;;;;;60997:39:0;;:134;;;:39;:134;:::i;:::-;61142:5;;:21;;;-1:-1:-1;;;61142:21:0;;;;;;;;;;-1:-1:-1;;;;;61142:5:0;;;;:12;;:21;;;;;;;;;;;;;;;:5;:21;;;2:2:-1;;;;27:1;24;17:12;2:2;61142:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;61142:21:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;61142:21:0;:46;;;-1:-1:-1;;;61142:46:0;;61169:10;61142:46;;;;;;;;;;;;-1:-1:-1;;;;;61142:26:0;;;;;;:46;;;;;-1:-1:-1;;61142:46:0;;;;;;;;-1:-1:-1;61142:26:0;:46;;;2:2:-1;;;;27:1;24;17:12;2:2;61142:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;61199:5:0;;-1:-1:-1;;;;;61199:5:0;;-1:-1:-1;61199:19:0;;-1:-1:-1;61233:7:0;61255:47;61285:16;:6;61296:4;61285:16;:10;:16;:::i;:::-;61255:5;;:25;;;-1:-1:-1;;;61255:25:0;;;;;;;;;;-1:-1:-1;;;;;61255:5:0;;;;:16;;:25;;;;;;;;;;;;;;;:5;:25;;;2:2:-1;;;;27:1;24;17:12;61255:47:0;61199:114;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;59847:1041:0;59975:9;59970:835;59994:6;:13;59990:1;:17;59970:835;;;60038:13;60054:6;60061:1;60054:9;;;;;;;;;;;;;;60038:25;;60086:26;60097:7;60106:5;60086:10;:26::i;:::-;60078:40;;;;;-1:-1:-1;;;60078:40:0;;;;;;;;;;;;-1:-1:-1;;;60078:40:0;;;;;;;;;;;;;;;60151:20;;;;:11;:20;;;;;;;;60147:585;;;60216:5;;:25;;;-1:-1:-1;;;60216:25:0;;;;;;;;;;60192:12;;-1:-1:-1;;;;;60216:5:0;;:16;;:25;;;;;;;;;;;;;;:5;:25;;;2:2:-1;;;;27:1;24;17:12;2:2;60216:25:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;60216:25:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;60216:25:0;60261:61;;;-1:-1:-1;;;60261:61:0;;60282:10;60261:61;;;;60302:4;60261:61;;;;;;;;;;60316:1;60261:61;;;;;;;;;-1:-1:-1;60261:61:0;;;;;;;;60216:25;;-1:-1:-1;;;;;;60261:20:0;;;;;:61;;;;;-1:-1:-1;;60261:61:0;;;;;;-1:-1:-1;60261:20:0;:61;;;2:2:-1;;;;27:1;24;17:12;2:2;60261:61:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;60261:61:0;;;;60147:585;;;;60393:5;;:18;;;-1:-1:-1;;;60393:18:0;;;;;;;;;;60438:4;;-1:-1:-1;;;;;60393:5:0;;:9;;:18;;;;;;;;;;;;;;:5;:18;;;2:2:-1;;;;27:1;24;17:12;2:2;60393:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;60393:18:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;60393:18:0;:33;;;-1:-1:-1;;;60393:33:0;;;;;;;;;;-1:-1:-1;;;;;60393:26:0;;;;;;:33;;;;;:18;;:33;;;;;;;;:26;:33;;;2:2:-1;;;;27:1;24;17:12;2:2;60393:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;60393:33:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;60393:33:0;-1:-1:-1;;;;;60393:50:0;;;60363:125;;;;;-1:-1:-1;;;60363:125:0;;;;;;;;;;;;-1:-1:-1;;;60363:125:0;;;;;;;;;;;;;;;60507:5;;:18;;;-1:-1:-1;;;60507:18:0;;;;;;;;;;-1:-1:-1;;;;;60507:5:0;;;;:9;;:18;;;;;;;;;;;;;;;:5;:18;;;2:2:-1;;;;27:1;24;17:12;2:2;60507:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;60507:18:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;60507:18:0;:65;;;-1:-1:-1;;;60507:65:0;;60539:10;60507:65;;;;60559:4;60507:65;;;;;;;;;;;;-1:-1:-1;;;;;60507:31:0;;;;;;:65;;;;;-1:-1:-1;;60507:65:0;;;;;;;;-1:-1:-1;60507:31:0;:65;;;2:2:-1;;;;27:1;24;17:12;2:2;60507:65:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;60621:5:0;;:18;;;-1:-1:-1;;;60621:18:0;;;;;;;;;;60666:4;;-1:-1:-1;;;;;;60621:5:0;;;;-1:-1:-1;60621:9:0;;:18;;;;;;;;;;;;;;:5;:18;;;2:2:-1;;;;27:1;24;17:12;2:2;60621:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;60621:18:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;60621:18:0;:33;;;-1:-1:-1;;;60621:33:0;;;;;;;;;;-1:-1:-1;;;;;60621:26:0;;;;;;:33;;;;;:18;;:33;;;;;;;;:26;:33;;;2:2:-1;;;;27:1;24;17:12;2:2;60621:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;60621:33:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;60621:33:0;-1:-1:-1;;;;;60621:50:0;;60591:125;;;;;-1:-1:-1;;;60591:125:0;;;;;;;;;;;;-1:-1:-1;;;60591:125:0;;;;;;;;;;;;;;;60760:5;;:33;;;-1:-1:-1;;;60760:33:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;60760:5:0;;;;:17;;:33;;;;;:5;;:33;;;;;;;;:5;;:33;;;2:2:-1;;;;27:1;24;17:12;2:2;60760:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;60760:33:0;;;;59970:835;60013:8;60019:1;60013;:5;;:8;;;;:::i;:::-;60009:12;;59970:835;;;-1:-1:-1;60815:5:0;;:21;;;-1:-1:-1;;;60815:21:0;;;;;;;;;;-1:-1:-1;;;;;60815:5:0;;;;:12;;:21;;;;;;;;;;;;;;;:5;:21;;;2:2:-1;;;;27:1;24;17:12;2:2;60815:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;60815:21:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;60815:21:0;60854:13;;-1:-1:-1;;;;;60815:26:0;;;;;;60842:10;;60854:25;;60872:6;60854:25;:17;:25;:::i;:::-;60815:65;;;;;;;;;;;;;-1:-1:-1;;;;;60815:65:0;-1:-1:-1;;;;;60815:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;60815:65:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;60815:65:0;;;;59847:1041;;;:::o;6710:181::-;6768:7;6800:5;;;6824:6;;;;6816:46;;;;;-1:-1:-1;;;6816:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;723:106;811:10;723:106;:::o;61329:486::-;61451:9;61446:362;61470:7;61466:1;:11;61446:362;;;61534:16;;;61548:1;61534:16;;;;;;;;;61508:23;;61534:16;;;;;;109:14:-1;61534:16:0;88:42:-1;144:17;;-1:-1;;61595:5:0;;:29;;;-1:-1:-1;;;61595:29:0;;;;;;;;;;61508:42;;-1:-1:-1;61565:12:0;;61580:45;;-1:-1:-1;;;;;61595:5:0;;:20;;:29;;;;;;;;;;;;;;:5;:29;;;2:2:-1;;;;27:1;24;17:12;2:2;61595:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;61595:29:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;61595:29:0;61580:14;:45::i;:::-;61652:5;;:31;;;-1:-1:-1;;;61652:31:0;;;;;;;;;;;;;;;;61565:60;;-1:-1:-1;;;;;;61652:5:0;;;;:16;;:31;;;;;;;;;;;;;;;:5;:31;;;2:2:-1;;;;27:1;24;17:12;2:2;61652:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;61652:31:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;61652:31:0;61640:9;;:6;;61647:1;;61640:9;;;;;;;;;:43;;;;;61698:40;61712:7;61721:6;61729:8;61698:13;:40::i;:::-;61765:7;61758:38;61774:6;61782:1;61785:10;61758:38;;;;;;;;;;;;-1:-1:-1;;;;;61758:38:0;-1:-1:-1;;;;;61758:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;61758:38:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;61483:8:0;;-1:-1:-1;61483:1:0;61489;61483:8;:5;:8;:::i;:::-;61479:12;;61446:362;;61823;61926:5;;:21;;;-1:-1:-1;;;61926:21:0;;;;;;;;;;-1:-1:-1;;;;;61926:5:0;;;;:12;;:21;;;;;;;;;;;;;;;:5;:21;;;2:2:-1;;;;27:1;24;17:12;2:2;61926:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;61926:21:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;61926:21:0;:50;;;-1:-1:-1;;;61926:50:0;;61957:10;61926:50;;;;;;;;;;;;-1:-1:-1;;;;;61926:30:0;;;;;;:50;;;;;-1:-1:-1;;61926:50:0;;;;;;;;-1:-1:-1;61926:30:0;:50;;;2:2:-1;;;;27:1;24;17:12;2:2;61926:50:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;61926:50:0;;;;61987:65;62023:10;62035:16;62046:4;62035:6;:10;;:16;;;;:::i;:::-;61987:5;;:22;;;-1:-1:-1;;;61987:22:0;;;;;;;;;;-1:-1:-1;;;;;61987:5:0;;;;:13;;:22;;;;;;;;;;;;;;;:5;:22;;;2:2:-1;;;;27:1;24;17:12;2:2;61987:22:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;61987:22:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;61987:22:0;-1:-1:-1;;;;;61987:35:0;;:65;;:35;:65;:::i;:::-;62063:5;;-1:-1:-1;;;;;62063:5:0;:19;62097:7;62119:47;62149:16;:6;62160:4;62149:16;:10;:16;:::i;:::-;62119:5;;:25;;;-1:-1:-1;;;62119:25:0;;;;;;;;;;-1:-1:-1;;;;;62119:5:0;;;;:16;;:25;;;;;;;;;;;;;;;:5;:25;;;2:2:-1;;;;27:1;24;17:12;2:2;62119:25:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;62119:25:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;62119:25:0;;:47;:29;:47;:::i;71286:1141::-;71403:42;71472;71550:17;-1:-1:-1;;;;;71582:20:0;;;;71578:713;;;-1:-1:-1;71657:64:0;;;-1:-1:-1;;;;;71657:64:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;71657:64:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;71578:713:0;;;71756:5;-1:-1:-1;;;;;71743:18:0;:9;-1:-1:-1;;;;;71743:18:0;;71739:552;;;71830:42;-1:-1:-1;;;;;71817:61:0;;71879:7;71817:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;71817:70:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;71938:93:0;;;;;;;;;72025:1;71938:93;;;;-1:-1:-1;;;;;71938:93:0;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;71938:93:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;71938:93:0;-1:-1:-1;71739:552:0;;-1:-1:-1;;71739:552:0;;72068:54;;;-1:-1:-1;;;72068:54:0;;72112:4;72068:54;;;;-1:-1:-1;;;;;72068:54:0;;;;;;;;;:35;;;;;;:54;;;;;;;;;;;;;;;:35;:54;;;2:2:-1;;;;27:1;24;17:12;2:2;72068:54:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;72068:54:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;72068:54:0;72064:101;;;72143:7;;;;;72064:101;-1:-1:-1;72211:68:0;;;-1:-1:-1;;;;;72211:68:0;;;;;;72274:4;72211:68;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;72211:68:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;71739:552:0;72302:12;72316:23;72351:9;-1:-1:-1;;;;;72343:23:0;72367:4;72343:29;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;72343:29:0;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;72301:71:0;;;;72391:7;72407:10;72383:36;;;;;-1:-1:-1;;;72383:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;72383:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71286:1141;;;;;;;;:::o;2697:568::-;3138:4;3205:17;3250:7;2697:568;:::o;4277:191::-;2225:12;;;;;;;;:31;;;2241:15;:13;:15::i;:::-;2225:47;;;-1:-1:-1;2261:11:0;;;;2260:12;2225:47;2203:143;;;;-1:-1:-1;;;2203:143:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2359:19;2382:12;;;;;;2381:13;2405:99;;;;2440:12;:19;;-1:-1:-1;;;;2440:19:0;;;;;2474:18;2455:4;2474:18;;;2405:99;4340:17:::1;4360:12;:10;:12::i;:::-;4383:6;:18:::0;;-1:-1:-1;;;;;;4383:18:0::1;-1:-1:-1::0;;;;;4383:18:0;::::1;::::0;;::::1;::::0;;;4417:43:::1;::::0;4383:18;;-1:-1:-1;4383:18:0;-1:-1:-1;;4417:43:0::1;::::0;-1:-1:-1;;4417:43:0::1;2516:1;2534:14:::0;2530:67;;;2580:5;2565:20;;-1:-1:-1;;2565:20:0;;;4277:191;:::o;22948:81::-;22862:1;22999:7;:22;22948:81::o;62193:1310::-;62335:5;;:21;;;-1:-1:-1;;;62335:21:0;;;;;;;;;;-1:-1:-1;;;;;62335:5:0;;;;:12;;:21;;;;;;;;;;;;;;;:5;:21;;;2:2:-1;;;;27:1;24;17:12;2:2;62335:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;62335:21:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;62335:21:0;62378:13;;-1:-1:-1;;;;;62335:30:0;;;;;;62366:10;;62378:25;;62396:6;62378:25;:17;:25;:::i;:::-;62335:69;;;;;;;;;;;;;-1:-1:-1;;;;;62335:69:0;-1:-1:-1;;;;;62335:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;62335:69:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;62420:9:0;;-1:-1:-1;;;62415:1081:0;62439:6;:13;62435:1;:17;62415:1081;;;62483:13;62499:6;62506:1;62499:9;;;;;;;;;;;;;;;;;;;62531:5;;:38;;;-1:-1:-1;;;62531:38:0;;;;;;;;;;;;;;;;62499:9;;-1:-1:-1;;;;;;62531:5:0;;;;:22;;:38;;;;;;;;;;:5;:38;;;2:2:-1;;;;27:1;24;17:12;2:2;62531:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;62531:38:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;62531:38:0;62523:52;;;;;-1:-1:-1;;;62523:52:0;;;;;;;;;;;;-1:-1:-1;;;62523:52:0;;;;;;;;;;;;;;;62594:5;;:38;;;-1:-1:-1;;;62594:38:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;62594:5:0;;;;:22;;:38;;;;;;;;;;;;;;;:5;:38;;;2:2:-1;;;;27:1;24;17:12;2:2;62594:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;62594:38:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;62594:38:0;62590:115;;;62653:5;;:36;;;-1:-1:-1;;;62653:36:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;62653:5:0;;;;:20;;:36;;;;;:5;;:36;;;;;;;;:5;;:36;;;2:2:-1;;;;27:1;24;17:12;2:2;62653:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;62653:36:0;;;;62590:115;62723:5;;:31;;;-1:-1:-1;;;62723:31:0;;;;;;;;;;-1:-1:-1;;;;;62723:5:0;;;;:22;;:31;;;;;;;;;;;;;;;:5;:31;;;2:2:-1;;;;27:1;24;17:12;2:2;62723:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;62723:31:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;62723:31:0;62719:181;;;62789:5;;:32;;;-1:-1:-1;;;62789:32:0;;;;;;;;;;;;;;;;62775:11;;-1:-1:-1;;;;;62789:5:0;;:16;;:32;;;;;;;;;;;;;;:5;:32;;;2:2:-1;;;;27:1;24;17:12;2:2;62789:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;62789:32:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;62789:32:0;62840:5;;:44;;;-1:-1:-1;;;62840:44:0;;;;;;;;;;;;;;62876:7;;62840:44;;;;;;62789:32;;-1:-1:-1;;;;;;62840:5:0;;;;:19;;:44;;;;;:5;;:44;;;;;;;;:5;;:44;;;2:2:-1;;;;27:1;24;17:12;2:2;62840:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;62840:44:0;;;;62719:181;;62918:20;;;;:11;:20;;;;;;;;62914:571;;;62983:5;;:25;;;-1:-1:-1;;;62983:25:0;;;;;;;;;;62959:12;;-1:-1:-1;;;;;62983:5:0;;:16;;:25;;;;;;;;;;;;;;:5;:25;;;2:2:-1;;;;27:1;24;17:12;2:2;62983:25:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;62983:25:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;62983:25:0;63028:61;;;-1:-1:-1;;;63028:61:0;;63057:4;63028:61;;;;63064:10;63028:61;;;;;;;;;;63083:1;63028:61;;;;;;;;;-1:-1:-1;63028:61:0;;;;;;;;62983:25;;-1:-1:-1;;;;;;63028:20:0;;;;;:61;;;;;-1:-1:-1;;63028:61:0;;;;;;-1:-1:-1;63028:20:0;:61;;;2:2:-1;;;;27:1;24;17:12;2:2;63028:61:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;63028:61:0;;;;62914:571;;;;63125:1;63115:7;:11;:27;;;;;63140:2;63130:7;:12;63115:27;63111:374;;;63195:5;;:25;;;-1:-1:-1;;;63195:25:0;;;;;;;;;;63163:19;;-1:-1:-1;;;;;63195:5:0;;:16;;:25;;;;;;;;;;;;;;:5;:25;;;2:2:-1;;;;27:1;24;17:12;2:2;63195:25:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;63195:25:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;63195:25:0;63240:37;;;-1:-1:-1;;;63240:37:0;;63259:10;63240:37;;;;;;;;;;;;63195:25;;-1:-1:-1;;;;;;63240:18:0;;;;;:37;;;;;-1:-1:-1;;63240:37:0;;;;;;;;-1:-1:-1;63240:18:0;:37;;;2:2:-1;;;;27:1;24;17:12;63111:374:0;63318:5;;:18;;;-1:-1:-1;;;63318:18:0;;;;;;;;;;-1:-1:-1;;;;;63318:5:0;;;;:9;;:18;;;;;;;;;;;;;;;:5;:18;;;2:2:-1;;;;27:1;24;17:12;2:2;63318:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;63318:18:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;63318:18:0;:151;;;-1:-1:-1;;;63318:151:0;;63384:4;63318:151;;;;63412:10;63318:151;;;;;;;;;;;;-1:-1:-1;;;;;63318:35:0;;;;;;:151;;;;;-1:-1:-1;;63318:151:0;;;;;;;;-1:-1:-1;63318:35:0;:151;;;2:2:-1;;;;27:1;24;17:12;2:2;63318:151:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;63318:151:0;;;;63111:374;-1:-1:-1;62458:8:0;:1;62464;62458:8;:5;:8;:::i;:::-;62454:12;;62415:1081;;8096:471;8154:7;8399:6;8395:47;;-1:-1:-1;8429:1:0;8422:8;;8395:47;8466:5;;;8470:1;8466;:5;:1;8490:5;;;;;:10;8482:56;;;;-1:-1:-1;;;8482:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47597:285;47795:68;;;-1:-1:-1;;;;;47795:68:0;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;47795:68:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;47741:133:0;;47775:5;;47741:19;:133::i;55768:329::-;55887:5;;55906:17;;;-1:-1:-1;;;55906:17:0;;;;55862:7;;-1:-1:-1;;;;;55887:5:0;;:18;;55906:24;;55887:5;;;;55906:15;;:17;;;;;;;;;;;;;;55887:5;55906:17;;;2:2:-1;;;;27:1;24;17:12;55906:24:0;55887:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;55887:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;55887:44:0;;;;56082:7;56015:3;56020:10;56032:5;;;;;;;;;-1:-1:-1;;;;;56032:5:0;-1:-1:-1;;;;;56032:15:0;;:17;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;56032:17:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56032:17:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;56032:17:0;55998:52;;;56032:17;55998:52;;;;;;;;;;;;-1:-1:-1;;55998:52:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;55998:52:0;;;;;;;55988:63;;;;;55962:127;;;;;;;55768:329;-1:-1:-1;;55768:329:0:o;47375:214::-;47512:58;;;-1:-1:-1;;;;;47512:58:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;47512:58:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;47458:123:0;;47492:5;;47458:19;:123::i;7174:136::-;7232:7;7259:43;7263:1;7266;7259:43;;;;;;;;;;;;;;;;;:3;:43::i;50157:860::-;50581:23;50607:106;50649:4;50607:106;;;;;;;;;;;;;;;;;50615:5;-1:-1:-1;;;;;50607:27:0;;;:106;;;;;:::i;:::-;50728:17;;50581:132;;-1:-1:-1;50728:21:0;50724:286;;50901:10;50890:30;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;50890:30:0;50864:134;;;;-1:-1:-1;;;50864:134:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7613:224;7726:7;7767:12;7759:6;;;;7751:29;;;;-1:-1:-1;;;7751:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;7751:29:0;-1:-1:-1;;;7803:5:0;;;7613:224::o;44051:230::-;44188:12;44220:53;44243:6;44251:4;44257:1;44260:12;45845;45878:18;45889:6;45878:10;:18::i;:::-;45870:60;;;;;-1:-1:-1;;;45870:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;46004:12;46018:23;46045:6;-1:-1:-1;;;;;46045:11:0;46064:8;46088:4;46045:58;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;46045:58:0;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;46003:100:0;;;;46118:7;46114:595;;;46149:10;-1:-1:-1;46142:17:0;;-1:-1:-1;46142:17:0;46114:595;46263:17;;:21;46259:439;;46526:10;46520:17;46587:15;46574:10;46570:2;46566:19;46559:44;46474:148;46662:20;;-1:-1:-1;;;46662:20:0;;;;;;;;;;;;;;;;;46669:12;;46662:20;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;41013:444:0;41393:20;41441:8;;;41013:444::o
Swarm Source
ipfs://cf1fa9f898f3eefb9518484a91bcfde2cc39d787c7e87327007c3a8d546ed73a
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.