Feature Tip: Add private address tag to any address under My Name Tag !
Overview
TokenID
1140414594515114468802072032663029938490...
Total Transfers
-
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Similar Match Source Code This contract matches the deployed Bytecode of the Source Code for Contract 0x419aa1B7...BF6bD4308 The constructor portion of the code might be different and could alter the actual behaviour of the contract
Contract Name:
TokenMinter
Compiler Version
v0.5.16+commit.9c3226ce
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-02-25 */ /** Source code of Opium Protocol Web https://opium.network Telegram https://t.me/opium_network Twitter https://twitter.com/opium_network */ // File: LICENSE /** The software and documentation available in this repository (the "Software") is protected by copyright law and accessible pursuant to the license set forth below. Copyright © 2020 Blockeys BV. All rights reserved. Permission is hereby granted, free of charge, to any person or organization obtaining the Software (the “Licensee”) to privately study, review, and analyze the Software. Licensee shall not use the Software for any other purpose. Licensee shall not modify, transfer, assign, share, or sub-license the Software or any derivative works of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ // File: openzeppelin-solidity/contracts/token/ERC721/IERC721Receiver.sol pragma solidity ^0.5.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ contract IERC721Receiver { /** * @notice Handle the receipt of an NFT * @dev The ERC721 smart contract calls this function on the recipient * after a {IERC721-safeTransferFrom}. This function MUST return the function selector, * otherwise the caller will revert the transaction. The selector to be * returned can be obtained as `this.onERC721Received.selector`. This * function MAY throw to revert and reject the transfer. * Note: the ERC721 contract address is always the message sender. * @param operator The address which called `safeTransferFrom` function * @param from The address which previously owned the token * @param tokenId The NFT identifier which is being transferred * @param data Additional data with no specified format * @return bytes4 `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` */ function onERC721Received(address operator, address from, uint256 tokenId, bytes memory data) public returns (bytes4); } // File: openzeppelin-solidity/contracts/math/SafeMath.sol pragma solidity ^0.5.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, 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. * * _Available since v2.4.0._ */ 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. * * _Available since v2.4.0._ */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 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. * * _Available since v2.4.0._ */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File: erc721o/contracts/Libs/UintArray.sol pragma solidity ^0.5.4; library UintArray { function indexOf(uint256[] memory A, uint256 a) internal pure returns (uint256, bool) { uint256 length = A.length; for (uint256 i = 0; i < length; i++) { if (A[i] == a) { return (i, true); } } return (0, false); } function contains(uint256[] memory A, uint256 a) internal pure returns (bool) { (, bool isIn) = indexOf(A, a); return isIn; } function difference(uint256[] memory A, uint256[] memory B) internal pure returns (uint256[] memory, uint256[] memory) { uint256 length = A.length; bool[] memory includeMap = new bool[](length); uint256 count = 0; // First count the new length because can't push for in-memory arrays for (uint256 i = 0; i < length; i++) { uint256 e = A[i]; if (!contains(B, e)) { includeMap[i] = true; count++; } } uint256[] memory newUints = new uint256[](count); uint256[] memory newUintsIdxs = new uint256[](count); uint256 j = 0; for (uint256 i = 0; i < length; i++) { if (includeMap[i]) { newUints[j] = A[i]; newUintsIdxs[j] = i; j++; } } return (newUints, newUintsIdxs); } function intersect(uint256[] memory A, uint256[] memory B) internal pure returns (uint256[] memory, uint256[] memory, uint256[] memory) { uint256 length = A.length; bool[] memory includeMap = new bool[](length); uint256 newLength = 0; for (uint256 i = 0; i < length; i++) { if (contains(B, A[i])) { includeMap[i] = true; newLength++; } } uint256[] memory newUints = new uint256[](newLength); uint256[] memory newUintsAIdxs = new uint256[](newLength); uint256[] memory newUintsBIdxs = new uint256[](newLength); uint256 j = 0; for (uint256 i = 0; i < length; i++) { if (includeMap[i]) { newUints[j] = A[i]; newUintsAIdxs[j] = i; (newUintsBIdxs[j], ) = indexOf(B, A[i]); j++; } } return (newUints, newUintsAIdxs, newUintsBIdxs); } function isUnique(uint256[] memory A) internal pure returns (bool) { uint256 length = A.length; for (uint256 i = 0; i < length; i++) { (uint256 idx, bool isIn) = indexOf(A, A[i]); if (isIn && idx < i) { return false; } } return true; } } // File: openzeppelin-solidity/contracts/utils/Address.sol pragma solidity ^0.5.5; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * This test is non-exhaustive, and there may be false-negatives: during the * execution of a contract's constructor, its address will be reported as * not containing 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. */ 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. // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != 0x0 && codehash != accountHash); } /** * @dev Converts an `address` into `address payable`. Note that this is * simply a type cast: the actual underlying value is not changed. * * _Available since v2.4.0._ */ function toPayable(address account) internal pure returns (address payable) { return address(uint160(account)); } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. * * _Available since v2.4.0._ */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-call-value (bool success, ) = recipient.call.value(amount)(""); require(success, "Address: unable to send value, recipient may have reverted"); } } // File: openzeppelin-solidity/contracts/utils/ReentrancyGuard.sol pragma solidity ^0.5.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. */ contract ReentrancyGuard { // counter to allow mutex lock with only one SSTORE operation uint256 private _guardCounter; constructor () internal { // The counter starts at one to prevent changing it from zero to a non-zero // value, which is a more expensive operation. _guardCounter = 1; } /** * @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() { _guardCounter += 1; uint256 localCounter = _guardCounter; _; require(localCounter == _guardCounter, "ReentrancyGuard: reentrant call"); } } // File: openzeppelin-solidity/contracts/introspection/IERC165.sol pragma solidity ^0.5.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: openzeppelin-solidity/contracts/introspection/ERC165.sol pragma solidity ^0.5.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts may inherit from this and call {_registerInterface} to declare * their support of an interface. */ contract ERC165 is IERC165 { /* * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7 */ bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7; /** * @dev Mapping of interface ids to whether or not it's supported. */ mapping(bytes4 => bool) private _supportedInterfaces; constructor () internal { // Derived contracts need only register support for their own interfaces, // we register support for ERC165 itself here _registerInterface(_INTERFACE_ID_ERC165); } /** * @dev See {IERC165-supportsInterface}. * * Time complexity O(1), guaranteed to always use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool) { return _supportedInterfaces[interfaceId]; } /** * @dev Registers the contract as an implementer of the interface defined by * `interfaceId`. Support of the actual ERC165 interface is automatic and * registering its interface id is not required. * * See {IERC165-supportsInterface}. * * Requirements: * * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`). */ function _registerInterface(bytes4 interfaceId) internal { require(interfaceId != 0xffffffff, "ERC165: invalid interface id"); _supportedInterfaces[interfaceId] = true; } } // File: openzeppelin-solidity/contracts/token/ERC721/IERC721.sol pragma solidity ^0.5.0; /** * @dev Required interface of an ERC721 compliant contract. */ contract IERC721 is IERC165 { event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of NFTs in `owner`'s account. */ function balanceOf(address owner) public view returns (uint256 balance); /** * @dev Returns the owner of the NFT specified by `tokenId`. */ function ownerOf(uint256 tokenId) public view returns (address owner); /** * @dev Transfers a specific NFT (`tokenId`) from one account (`from`) to * another (`to`). * * * * Requirements: * - `from`, `to` cannot be zero. * - `tokenId` must be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this * NFT by either {approve} or {setApprovalForAll}. */ function safeTransferFrom(address from, address to, uint256 tokenId) public; /** * @dev Transfers a specific NFT (`tokenId`) from one account (`from`) to * another (`to`). * * Requirements: * - If the caller is not `from`, it must be approved to move this NFT by * either {approve} or {setApprovalForAll}. */ function transferFrom(address from, address to, uint256 tokenId) public; function approve(address to, uint256 tokenId) public; function getApproved(uint256 tokenId) public view returns (address operator); function setApprovalForAll(address operator, bool _approved) public; function isApprovedForAll(address owner, address operator) public view returns (bool); function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public; } // File: erc721o/contracts/Interfaces/IERC721O.sol pragma solidity ^0.5.4; contract IERC721O { // Token description function name() external view returns (string memory); function symbol() external view returns (string memory); function totalSupply() public view returns (uint256); function exists(uint256 _tokenId) public view returns (bool); function implementsERC721() public pure returns (bool); function tokenByIndex(uint256 _index) public view returns (uint256); function tokenOfOwnerByIndex(address _owner, uint256 _index) public view returns (uint256 _tokenId); function tokenURI(uint256 _tokenId) public view returns (string memory tokenUri); function getApproved(uint256 _tokenId) public view returns (address); function implementsERC721O() public pure returns (bool); function ownerOf(uint256 _tokenId) public view returns (address _owner); function balanceOf(address owner) public view returns (uint256); function balanceOf(address _owner, uint256 _tokenId) public view returns (uint256); function tokensOwned(address _owner) public view returns (uint256[] memory, uint256[] memory); // Non-Fungible Safe Transfer From function safeTransferFrom(address _from, address _to, uint256 _tokenId) public; function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes memory _data) public; // Non-Fungible Unsafe Transfer From function transferFrom(address _from, address _to, uint256 _tokenId) public; // Fungible Unsafe Transfer function transfer(address _to, uint256 _tokenId, uint256 _quantity) public; // Fungible Unsafe Transfer From function transferFrom(address _from, address _to, uint256 _tokenId, uint256 _quantity) public; // Fungible Safe Transfer From function safeTransferFrom(address _from, address _to, uint256 _tokenId, uint256 _amount) public; function safeTransferFrom(address _from, address _to, uint256 _tokenId, uint256 _amount, bytes memory _data) public; // Fungible Safe Batch Transfer From function safeBatchTransferFrom(address _from, address _to, uint256[] memory _tokenIds, uint256[] memory _amounts) public; function safeBatchTransferFrom(address _from, address _to, uint256[] memory _tokenIds, uint256[] memory _amounts, bytes memory _data) public; // Fungible Unsafe Batch Transfer From function batchTransferFrom(address _from, address _to, uint256[] memory _tokenIds, uint256[] memory _amounts) public; // Approvals function setApprovalForAll(address _operator, bool _approved) public; function approve(address _to, uint256 _tokenId) public; function getApproved(uint256 _tokenId, address _tokenOwner) public view returns (address); function isApprovedForAll(address _owner, address _operator) public view returns (bool isOperator); function isApprovedOrOwner(address _spender, address _owner, uint256 _tokenId) public view returns (bool); function permit(address _holder, address _spender, uint256 _nonce, uint256 _expiry, bool _allowed, bytes calldata _signature) external; // Composable function compose(uint256[] memory _tokenIds, uint256[] memory _tokenRatio, uint256 _quantity) public; function decompose(uint256 _portfolioId, uint256[] memory _tokenIds, uint256[] memory _tokenRatio, uint256 _quantity) public; function recompose(uint256 _portfolioId, uint256[] memory _initialTokenIds, uint256[] memory _initialTokenRatio, uint256[] memory _finalTokenIds, uint256[] memory _finalTokenRatio, uint256 _quantity) public; // Required Events event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); event TransferWithQuantity(address indexed from, address indexed to, uint256 indexed tokenId, uint256 quantity); event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved); event BatchTransfer(address indexed from, address indexed to, uint256[] tokenTypes, uint256[] amounts); event Composition(uint256 portfolioId, uint256[] tokenIds, uint256[] tokenRatio); } // File: erc721o/contracts/Interfaces/IERC721OReceiver.sol pragma solidity ^0.5.4; /** * @title ERC721O token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721O contracts. */ contract IERC721OReceiver { /** * @dev Magic value to be returned upon successful reception of an amount of ERC721O tokens * ERC721O_RECEIVED = `bytes4(keccak256("onERC721OReceived(address,address,uint256,uint256,bytes)"))` = 0xf891ffe0 * ERC721O_BATCH_RECEIVED = `bytes4(keccak256("onERC721OBatchReceived(address,address,uint256[],uint256[],bytes)"))` = 0xd0e17c0b */ bytes4 constant internal ERC721O_RECEIVED = 0xf891ffe0; bytes4 constant internal ERC721O_BATCH_RECEIVED = 0xd0e17c0b; function onERC721OReceived( address _operator, address _from, uint256 tokenId, uint256 amount, bytes memory data ) public returns(bytes4); function onERC721OBatchReceived( address _operator, address _from, uint256[] memory _types, uint256[] memory _amounts, bytes memory _data ) public returns (bytes4); } // File: erc721o/contracts/Libs/ObjectsLib.sol pragma solidity ^0.5.4; library ObjectLib { // Libraries using SafeMath for uint256; enum Operations { ADD, SUB, REPLACE } // Constants regarding bin or chunk sizes for balance packing uint256 constant TYPES_BITS_SIZE = 32; // Max size of each object uint256 constant TYPES_PER_UINT256 = 256 / TYPES_BITS_SIZE; // Number of types per uint256 // // Objects and Tokens Functions // /** * @dev Return the bin number and index within that bin where ID is * @param _tokenId Object type * @return (Bin number, ID's index within that bin) */ function getTokenBinIndex(uint256 _tokenId) internal pure returns (uint256 bin, uint256 index) { bin = _tokenId * TYPES_BITS_SIZE / 256; index = _tokenId % TYPES_PER_UINT256; return (bin, index); } /** * @dev update the balance of a type provided in _binBalances * @param _binBalances Uint256 containing the balances of objects * @param _index Index of the object in the provided bin * @param _amount Value to update the type balance * @param _operation Which operation to conduct : * Operations.REPLACE : Replace type balance with _amount * Operations.ADD : ADD _amount to type balance * Operations.SUB : Substract _amount from type balance */ function updateTokenBalance( uint256 _binBalances, uint256 _index, uint256 _amount, Operations _operation) internal pure returns (uint256 newBinBalance) { uint256 objectBalance; if (_operation == Operations.ADD) { objectBalance = getValueInBin(_binBalances, _index); newBinBalance = writeValueInBin(_binBalances, _index, objectBalance.add(_amount)); } else if (_operation == Operations.SUB) { objectBalance = getValueInBin(_binBalances, _index); newBinBalance = writeValueInBin(_binBalances, _index, objectBalance.sub(_amount)); } else if (_operation == Operations.REPLACE) { newBinBalance = writeValueInBin(_binBalances, _index, _amount); } else { revert("Invalid operation"); // Bad operation } return newBinBalance; } /* * @dev return value in _binValue at position _index * @param _binValue uint256 containing the balances of TYPES_PER_UINT256 types * @param _index index at which to retrieve value * @return Value at given _index in _bin */ function getValueInBin(uint256 _binValue, uint256 _index) internal pure returns (uint256) { // Mask to retrieve data for a given binData uint256 mask = (uint256(1) << TYPES_BITS_SIZE) - 1; // Shift amount uint256 rightShift = 256 - TYPES_BITS_SIZE * (_index + 1); return (_binValue >> rightShift) & mask; } /** * @dev return the updated _binValue after writing _amount at _index * @param _binValue uint256 containing the balances of TYPES_PER_UINT256 types * @param _index Index at which to retrieve value * @param _amount Value to store at _index in _bin * @return Value at given _index in _bin */ function writeValueInBin(uint256 _binValue, uint256 _index, uint256 _amount) internal pure returns (uint256) { require(_amount < 2**TYPES_BITS_SIZE, "Amount to write in bin is too large"); // Mask to retrieve data for a given binData uint256 mask = (uint256(1) << TYPES_BITS_SIZE) - 1; // Shift amount uint256 leftShift = 256 - TYPES_BITS_SIZE * (_index + 1); return (_binValue & ~(mask << leftShift) ) | (_amount << leftShift); } } // File: erc721o/contracts/ERC721OBase.sol pragma solidity ^0.5.4; contract ERC721OBase is IERC721O, ERC165, IERC721 { // Libraries using ObjectLib for ObjectLib.Operations; using ObjectLib for uint256; // Array with all tokenIds uint256[] internal allTokens; // Packed balances mapping(address => mapping(uint256 => uint256)) internal packedTokenBalance; // Operators mapping(address => mapping(address => bool)) internal operators; // Keeps aprovals for tokens from owner to approved address // tokenApprovals[tokenId][owner] = approved mapping (uint256 => mapping (address => address)) internal tokenApprovals; // Token Id state mapping(uint256 => uint256) internal tokenTypes; uint256 constant internal INVALID = 0; uint256 constant internal POSITION = 1; uint256 constant internal PORTFOLIO = 2; // Interface constants bytes4 internal constant INTERFACE_ID_ERC721O = 0x12345678; // EIP712 constants bytes32 public DOMAIN_SEPARATOR; bytes32 public PERMIT_TYPEHASH; // mapping holds nonces for approval permissions // nonces[holder] => nonce mapping (address => uint) public nonces; modifier isOperatorOrOwner(address _from) { require((msg.sender == _from) || operators[_from][msg.sender], "msg.sender is neither _from nor operator"); _; } constructor() public { _registerInterface(INTERFACE_ID_ERC721O); // Calculate EIP712 constants DOMAIN_SEPARATOR = keccak256(abi.encode( keccak256("EIP712Domain(string name,string version,address verifyingContract)"), keccak256(bytes("ERC721o")), keccak256(bytes("1")), address(this) )); PERMIT_TYPEHASH = keccak256("Permit(address holder,address spender,uint256 nonce,uint256 expiry,bool allowed)"); } function implementsERC721O() public pure returns (bool) { return true; } /** * @dev Returns whether the specified token exists * @param _tokenId uint256 ID of the token to query the existence of * @return whether the token exists */ function exists(uint256 _tokenId) public view returns (bool) { return tokenTypes[_tokenId] != INVALID; } /** * @dev return the _tokenId type' balance of _address * @param _address Address to query balance of * @param _tokenId type to query balance of * @return Amount of objects of a given type ID */ function balanceOf(address _address, uint256 _tokenId) public view returns (uint256) { (uint256 bin, uint256 index) = _tokenId.getTokenBinIndex(); return packedTokenBalance[_address][bin].getValueInBin(index); } /** * @dev Gets the total amount of tokens stored by the contract * @return uint256 representing the total amount of tokens */ function totalSupply() public view returns (uint256) { return allTokens.length; } /** * @dev Gets Iterate through the list of existing tokens and return the indexes * and balances of the tokens owner by the user * @param _owner The adddress we are checking * @return indexes The tokenIds * @return balances The balances of each token */ function tokensOwned(address _owner) public view returns (uint256[] memory indexes, uint256[] memory balances) { uint256 numTokens = totalSupply(); uint256[] memory tokenIndexes = new uint256[](numTokens); uint256[] memory tempTokens = new uint256[](numTokens); uint256 count; for (uint256 i = 0; i < numTokens; i++) { uint256 tokenId = allTokens[i]; if (balanceOf(_owner, tokenId) > 0) { tempTokens[count] = balanceOf(_owner, tokenId); tokenIndexes[count] = tokenId; count++; } } // copy over the data to a correct size array uint256[] memory _ownedTokens = new uint256[](count); uint256[] memory _ownedTokensIndexes = new uint256[](count); for (uint256 i = 0; i < count; i++) { _ownedTokens[i] = tempTokens[i]; _ownedTokensIndexes[i] = tokenIndexes[i]; } return (_ownedTokensIndexes, _ownedTokens); } /** * @dev Will set _operator operator status to true or false * @param _operator Address to changes operator status. * @param _approved _operator's new operator status (true or false) */ function setApprovalForAll(address _operator, bool _approved) public { // Update operator status operators[msg.sender][_operator] = _approved; emit ApprovalForAll(msg.sender, _operator, _approved); } /// @notice Approve for all by signature function permit(address _holder, address _spender, uint256 _nonce, uint256 _expiry, bool _allowed, bytes calldata _signature) external { // Calculate hash bytes32 digest = keccak256(abi.encodePacked( "\x19\x01", DOMAIN_SEPARATOR, keccak256(abi.encode( PERMIT_TYPEHASH, _holder, _spender, _nonce, _expiry, _allowed )) )); // Divide the signature in r, s and v variables // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. // solium-disable-next-line security/no-inline-assembly bytes32 r; bytes32 s; uint8 v; bytes memory signature = _signature; assembly { r := mload(add(signature, 32)) s := mload(add(signature, 64)) v := byte(0, mload(add(signature, 96))) } // Version of signature should be 27 or 28, but 0 and 1 are also possible versions if (v < 27) { v += 27; } address recoveredAddress; // If the version is correct return the signer address if (v != 27 && v != 28) { recoveredAddress = address(0); } else { // solium-disable-next-line arg-overflow recoveredAddress = ecrecover(digest, v, r, s); } require(_holder != address(0), "Holder can't be zero address"); require(_holder == recoveredAddress, "Signer address is invalid"); require(_expiry == 0 || now <= _expiry, "Permission expired"); require(_nonce == nonces[_holder]++, "Nonce is invalid"); // Update operator status operators[_holder][_spender] = _allowed; emit ApprovalForAll(_holder, _spender, _allowed); } /** * @dev Approves another address to transfer the given token ID * The zero address indicates there is no approved address. * There can only be one approved address per token at a given time. * Can only be called by the token owner or an approved operator. * @param _to address to be approved for the given token ID * @param _tokenId uint256 ID of the token to be approved */ function approve(address _to, uint256 _tokenId) public { require(_to != msg.sender, "Can't approve to yourself"); tokenApprovals[_tokenId][msg.sender] = _to; emit Approval(msg.sender, _to, _tokenId); } /** * @dev Gets the approved address for a token ID, or zero if no address set * @param _tokenId uint256 ID of the token to query the approval of * @return address currently approved for the given token ID */ function getApproved(uint256 _tokenId, address _tokenOwner) public view returns (address) { return tokenApprovals[_tokenId][_tokenOwner]; } /** * @dev Function that verifies whether _operator is an authorized operator of _tokenHolder. * @param _operator The address of the operator to query status of * @param _owner Address of the tokenHolder * @return A uint256 specifying the amount of tokens still available for the spender. */ function isApprovedForAll(address _owner, address _operator) public view returns (bool isOperator) { return operators[_owner][_operator]; } function isApprovedOrOwner( address _spender, address _owner, uint256 _tokenId ) public view returns (bool) { return ( _spender == _owner || getApproved(_tokenId, _owner) == _spender || isApprovedForAll(_owner, _spender) ); } function _updateTokenBalance( address _from, uint256 _tokenId, uint256 _amount, ObjectLib.Operations op ) internal { (uint256 bin, uint256 index) = _tokenId.getTokenBinIndex(); packedTokenBalance[_from][bin] = packedTokenBalance[_from][bin].updateTokenBalance( index, _amount, op ); } } // File: erc721o/contracts/ERC721OTransferable.sol pragma solidity ^0.5.4; contract ERC721OTransferable is ERC721OBase, ReentrancyGuard { // Libraries using Address for address; // safeTransfer constants bytes4 internal constant ERC721O_RECEIVED = 0xf891ffe0; bytes4 internal constant ERC721O_BATCH_RECEIVED = 0xd0e17c0b; function batchTransferFrom(address _from, address _to, uint256[] memory _tokenIds, uint256[] memory _amounts) public { // Batch Transfering _batchTransferFrom(_from, _to, _tokenIds, _amounts); } /** * @dev transfer objects from different tokenIds to specified address * @param _from The address to BatchTransfer objects from. * @param _to The address to batchTransfer objects to. * @param _tokenIds Array of tokenIds to update balance of * @param _amounts Array of amount of object per type to be transferred. * @param _data Data to pass to onERC721OReceived() function if recipient is contract * Note: Arrays should be sorted so that all tokenIds in a same bin are adjacent (more efficient). */ function safeBatchTransferFrom( address _from, address _to, uint256[] memory _tokenIds, uint256[] memory _amounts, bytes memory _data ) public nonReentrant { // Batch Transfering _batchTransferFrom(_from, _to, _tokenIds, _amounts); // Pass data if recipient is contract if (_to.isContract()) { bytes4 retval = IERC721OReceiver(_to).onERC721OBatchReceived( msg.sender, _from, _tokenIds, _amounts, _data ); require(retval == ERC721O_BATCH_RECEIVED); } } function safeBatchTransferFrom( address _from, address _to, uint256[] memory _tokenIds, uint256[] memory _amounts ) public { safeBatchTransferFrom(_from, _to, _tokenIds, _amounts, ""); } function transfer(address _to, uint256 _tokenId, uint256 _amount) public { _transferFrom(msg.sender, _to, _tokenId, _amount); } function transferFrom(address _from, address _to, uint256 _tokenId, uint256 _amount) public { _transferFrom(_from, _to, _tokenId, _amount); } function safeTransferFrom(address _from, address _to, uint256 _tokenId, uint256 _amount) public { safeTransferFrom(_from, _to, _tokenId, _amount, ""); } function safeTransferFrom(address _from, address _to, uint256 _tokenId, uint256 _amount, bytes memory _data) public nonReentrant { _transferFrom(_from, _to, _tokenId, _amount); require( _checkAndCallSafeTransfer(_from, _to, _tokenId, _amount, _data), "Sent to a contract which is not an ERC721O receiver" ); } /** * @dev transfer objects from different tokenIds to specified address * @param _from The address to BatchTransfer objects from. * @param _to The address to batchTransfer objects to. * @param _tokenIds Array of tokenIds to update balance of * @param _amounts Array of amount of object per type to be transferred. * Note: Arrays should be sorted so that all tokenIds in a same bin are adjacent (more efficient). */ function _batchTransferFrom( address _from, address _to, uint256[] memory _tokenIds, uint256[] memory _amounts ) internal isOperatorOrOwner(_from) { // Requirements require(_tokenIds.length == _amounts.length, "Inconsistent array length between args"); require(_to != address(0), "Invalid to address"); // Number of transfers to execute uint256 nTransfer = _tokenIds.length; // Don't do useless calculations if (_from == _to) { for (uint256 i = 0; i < nTransfer; i++) { emit Transfer(_from, _to, _tokenIds[i]); emit TransferWithQuantity(_from, _to, _tokenIds[i], _amounts[i]); } return; } for (uint256 i = 0; i < nTransfer; i++) { require(_amounts[i] <= balanceOf(_from, _tokenIds[i]), "Quantity greater than from balance"); _updateTokenBalance(_from, _tokenIds[i], _amounts[i], ObjectLib.Operations.SUB); _updateTokenBalance(_to, _tokenIds[i], _amounts[i], ObjectLib.Operations.ADD); emit Transfer(_from, _to, _tokenIds[i]); emit TransferWithQuantity(_from, _to, _tokenIds[i], _amounts[i]); } // Emit batchTransfer event emit BatchTransfer(_from, _to, _tokenIds, _amounts); } function _transferFrom(address _from, address _to, uint256 _tokenId, uint256 _amount) internal { require(isApprovedOrOwner(msg.sender, _from, _tokenId), "Not approved"); require(_amount <= balanceOf(_from, _tokenId), "Quantity greater than from balance"); require(_to != address(0), "Invalid to address"); _updateTokenBalance(_from, _tokenId, _amount, ObjectLib.Operations.SUB); _updateTokenBalance(_to, _tokenId, _amount, ObjectLib.Operations.ADD); emit Transfer(_from, _to, _tokenId); emit TransferWithQuantity(_from, _to, _tokenId, _amount); } function _checkAndCallSafeTransfer( address _from, address _to, uint256 _tokenId, uint256 _amount, bytes memory _data ) internal returns (bool) { if (!_to.isContract()) { return true; } bytes4 retval = IERC721OReceiver(_to).onERC721OReceived(msg.sender, _from, _tokenId, _amount, _data); return(retval == ERC721O_RECEIVED); } } // File: erc721o/contracts/Libs/LibPosition.sol pragma solidity ^0.5.4; library LibPosition { function getLongTokenId(bytes32 _hash) public pure returns (uint256 tokenId) { tokenId = uint256(keccak256(abi.encodePacked(_hash, "LONG"))); } function getShortTokenId(bytes32 _hash) public pure returns (uint256 tokenId) { tokenId = uint256(keccak256(abi.encodePacked(_hash, "SHORT"))); } } // File: erc721o/contracts/ERC721OMintable.sol pragma solidity ^0.5.4; contract ERC721OMintable is ERC721OTransferable { // Libraries using LibPosition for bytes32; // Internal functions function _mint(uint256 _tokenId, address _to, uint256 _supply) internal { // If the token doesn't exist, add it to the tokens array if (!exists(_tokenId)) { tokenTypes[_tokenId] = POSITION; allTokens.push(_tokenId); } _updateTokenBalance(_to, _tokenId, _supply, ObjectLib.Operations.ADD); emit Transfer(address(0), _to, _tokenId); emit TransferWithQuantity(address(0), _to, _tokenId, _supply); } function _burn(address _tokenOwner, uint256 _tokenId, uint256 _quantity) internal { uint256 ownerBalance = balanceOf(_tokenOwner, _tokenId); require(ownerBalance >= _quantity, "TOKEN_MINTER:NOT_ENOUGH_POSITIONS"); _updateTokenBalance(_tokenOwner, _tokenId, _quantity, ObjectLib.Operations.SUB); emit Transfer(_tokenOwner, address(0), _tokenId); emit TransferWithQuantity(_tokenOwner, address(0), _tokenId, _quantity); } function _mint(address _buyer, address _seller, bytes32 _derivativeHash, uint256 _quantity) internal { _mintLong(_buyer, _derivativeHash, _quantity); _mintShort(_seller, _derivativeHash, _quantity); } function _mintLong(address _buyer, bytes32 _derivativeHash, uint256 _quantity) internal { uint256 longTokenId = _derivativeHash.getLongTokenId(); _mint(longTokenId, _buyer, _quantity); } function _mintShort(address _seller, bytes32 _derivativeHash, uint256 _quantity) internal { uint256 shortTokenId = _derivativeHash.getShortTokenId(); _mint(shortTokenId, _seller, _quantity); } function _registerPortfolio(uint256 _portfolioId, uint256[] memory _tokenIds, uint256[] memory _tokenRatio) internal { if (!exists(_portfolioId)) { tokenTypes[_portfolioId] = PORTFOLIO; emit Composition(_portfolioId, _tokenIds, _tokenRatio); } } } // File: erc721o/contracts/ERC721OComposable.sol pragma solidity ^0.5.4; contract ERC721OComposable is ERC721OMintable { // Libraries using UintArray for uint256[]; using SafeMath for uint256; function compose(uint256[] memory _tokenIds, uint256[] memory _tokenRatio, uint256 _quantity) public { require(_tokenIds.length == _tokenRatio.length, "TOKEN_MINTER:TOKEN_IDS_AND_RATIO_LENGTH_DOES_NOT_MATCH"); require(_quantity > 0, "TOKEN_MINTER:WRONG_QUANTITY"); require(_tokenIds.length > 0, "TOKEN_MINTER:WRONG_QUANTITY"); require(_tokenIds.isUnique(), "TOKEN_MINTER:TOKEN_IDS_NOT_UNIQUE"); for (uint256 i = 0; i < _tokenIds.length; i++) { _burn(msg.sender, _tokenIds[i], _tokenRatio[i].mul(_quantity)); } uint256 portfolioId = uint256(keccak256(abi.encodePacked( _tokenIds, _tokenRatio ))); _registerPortfolio(portfolioId, _tokenIds, _tokenRatio); _mint(portfolioId, msg.sender, _quantity); } function decompose(uint256 _portfolioId, uint256[] memory _tokenIds, uint256[] memory _tokenRatio, uint256 _quantity) public { require(_tokenIds.length == _tokenRatio.length, "TOKEN_MINTER:TOKEN_IDS_AND_RATIO_LENGTH_DOES_NOT_MATCH"); require(_quantity > 0, "TOKEN_MINTER:WRONG_QUANTITY"); require(_tokenIds.length > 0, "TOKEN_MINTER:WRONG_QUANTITY"); require(_tokenIds.isUnique(), "TOKEN_MINTER:TOKEN_IDS_NOT_UNIQUE"); uint256 portfolioId = uint256(keccak256(abi.encodePacked( _tokenIds, _tokenRatio ))); require(portfolioId == _portfolioId, "TOKEN_MINTER:WRONG_PORTFOLIO_ID"); _burn(msg.sender, _portfolioId, _quantity); for (uint256 i = 0; i < _tokenIds.length; i++) { _mint(_tokenIds[i], msg.sender, _tokenRatio[i].mul(_quantity)); } } function recompose( uint256 _portfolioId, uint256[] memory _initialTokenIds, uint256[] memory _initialTokenRatio, uint256[] memory _finalTokenIds, uint256[] memory _finalTokenRatio, uint256 _quantity ) public { require(_initialTokenIds.length == _initialTokenRatio.length, "TOKEN_MINTER:INITIAL_TOKEN_IDS_AND_RATIO_LENGTH_DOES_NOT_MATCH"); require(_finalTokenIds.length == _finalTokenRatio.length, "TOKEN_MINTER:FINAL_TOKEN_IDS_AND_RATIO_LENGTH_DOES_NOT_MATCH"); require(_quantity > 0, "TOKEN_MINTER:WRONG_QUANTITY"); require(_initialTokenIds.length > 0, "TOKEN_MINTER:WRONG_QUANTITY"); require(_finalTokenIds.length > 0, "TOKEN_MINTER:WRONG_QUANTITY"); require(_initialTokenIds.isUnique(), "TOKEN_MINTER:TOKEN_IDS_NOT_UNIQUE"); require(_finalTokenIds.isUnique(), "TOKEN_MINTER:TOKEN_IDS_NOT_UNIQUE"); uint256 oldPortfolioId = uint256(keccak256(abi.encodePacked( _initialTokenIds, _initialTokenRatio ))); require(oldPortfolioId == _portfolioId, "TOKEN_MINTER:WRONG_PORTFOLIO_ID"); _burn(msg.sender, _portfolioId, _quantity); _removedIds(_initialTokenIds, _initialTokenRatio, _finalTokenIds, _finalTokenRatio, _quantity); _addedIds(_initialTokenIds, _initialTokenRatio, _finalTokenIds, _finalTokenRatio, _quantity); _keptIds(_initialTokenIds, _initialTokenRatio, _finalTokenIds, _finalTokenRatio, _quantity); uint256 newPortfolioId = uint256(keccak256(abi.encodePacked( _finalTokenIds, _finalTokenRatio ))); _registerPortfolio(newPortfolioId, _finalTokenIds, _finalTokenRatio); _mint(newPortfolioId, msg.sender, _quantity); } function _removedIds( uint256[] memory _initialTokenIds, uint256[] memory _initialTokenRatio, uint256[] memory _finalTokenIds, uint256[] memory _finalTokenRatio, uint256 _quantity ) private { (uint256[] memory removedIds, uint256[] memory removedIdsIdxs) = _initialTokenIds.difference(_finalTokenIds); for (uint256 i = 0; i < removedIds.length; i++) { uint256 index = removedIdsIdxs[i]; _mint(_initialTokenIds[index], msg.sender, _initialTokenRatio[index].mul(_quantity)); } _finalTokenRatio; } function _addedIds( uint256[] memory _initialTokenIds, uint256[] memory _initialTokenRatio, uint256[] memory _finalTokenIds, uint256[] memory _finalTokenRatio, uint256 _quantity ) private { (uint256[] memory addedIds, uint256[] memory addedIdsIdxs) = _finalTokenIds.difference(_initialTokenIds); for (uint256 i = 0; i < addedIds.length; i++) { uint256 index = addedIdsIdxs[i]; _burn(msg.sender, _finalTokenIds[index], _finalTokenRatio[index].mul(_quantity)); } _initialTokenRatio; } function _keptIds( uint256[] memory _initialTokenIds, uint256[] memory _initialTokenRatio, uint256[] memory _finalTokenIds, uint256[] memory _finalTokenRatio, uint256 _quantity ) private { (uint256[] memory keptIds, uint256[] memory keptInitialIdxs, uint256[] memory keptFinalIdxs) = _initialTokenIds.intersect(_finalTokenIds); for (uint256 i = 0; i < keptIds.length; i++) { uint256 initialIndex = keptInitialIdxs[i]; uint256 finalIndex = keptFinalIdxs[i]; if (_initialTokenRatio[initialIndex] > _finalTokenRatio[finalIndex]) { uint256 diff = _initialTokenRatio[initialIndex] - _finalTokenRatio[finalIndex]; _mint(_initialTokenIds[initialIndex], msg.sender, diff.mul(_quantity)); } else if (_initialTokenRatio[initialIndex] < _finalTokenRatio[finalIndex]) { uint256 diff = _finalTokenRatio[finalIndex] - _initialTokenRatio[initialIndex]; _burn(msg.sender, _initialTokenIds[initialIndex], diff.mul(_quantity)); } } } } // File: erc721o/contracts/Libs/UintsLib.sol pragma solidity ^0.5.4; library UintsLib { function uint2str(uint _i) internal pure returns (string memory _uintAsString) { if (_i == 0) { return "0"; } uint j = _i; uint len; while (j != 0) { len++; j /= 10; } bytes memory bstr = new bytes(len); uint k = len - 1; while (_i != 0) { bstr[k--] = byte(uint8(48 + _i % 10)); _i /= 10; } return string(bstr); } } // File: erc721o/contracts/ERC721OBackwardCompatible.sol pragma solidity ^0.5.4; contract ERC721OBackwardCompatible is ERC721OComposable { using UintsLib for uint256; // Interface constants bytes4 internal constant INTERFACE_ID_ERC721 = 0x80ac58cd; bytes4 internal constant INTERFACE_ID_ERC721_ENUMERABLE = 0x780e9d63; bytes4 internal constant INTERFACE_ID_ERC721_METADATA = 0x5b5e139f; // Reciever constants bytes4 internal constant ERC721_RECEIVED = 0x150b7a02; // Metadata URI string internal baseTokenURI; constructor(string memory _baseTokenURI) public ERC721OBase() { baseTokenURI = _baseTokenURI; _registerInterface(INTERFACE_ID_ERC721); _registerInterface(INTERFACE_ID_ERC721_ENUMERABLE); _registerInterface(INTERFACE_ID_ERC721_METADATA); } // ERC721 compatibility function implementsERC721() public pure returns (bool) { return true; } /** * @dev Gets the owner of a given NFT * @param _tokenId uint256 representing the unique token identifier * @return address the owner of the token */ function ownerOf(uint256 _tokenId) public view returns (address) { if (exists(_tokenId)) { return address(this); } return address(0); } /** * @dev Gets the number of tokens owned by the address we are checking * @param _owner The adddress we are checking * @return balance The unique amount of tokens owned */ function balanceOf(address _owner) public view returns (uint256 balance) { (, uint256[] memory tokens) = tokensOwned(_owner); return tokens.length; } // ERC721 - Enumerable compatibility /** * @dev Gets the token ID at a given index of all the tokens in this contract * Reverts if the index is greater or equal to the total number of tokens * @param _index uint256 representing the index to be accessed of the tokens list * @return uint256 token ID at the given index of the tokens list */ function tokenByIndex(uint256 _index) public view returns (uint256) { require(_index < totalSupply()); return allTokens[_index]; } function tokenOfOwnerByIndex(address _owner, uint256 _index) public view returns (uint256 _tokenId) { (, uint256[] memory tokens) = tokensOwned(_owner); require(_index < tokens.length); return tokens[_index]; } // ERC721 - Metadata compatibility function tokenURI(uint256 _tokenId) public view returns (string memory tokenUri) { require(exists(_tokenId), "Token doesn't exist"); return string(abi.encodePacked( baseTokenURI, _tokenId.uint2str(), ".json" )); } /** * @dev Gets the approved address for a token ID, or zero if no address set * @param _tokenId uint256 ID of the token to query the approval of * @return address currently approved for the given token ID */ function getApproved(uint256 _tokenId) public view returns (address) { if (exists(_tokenId)) { return address(this); } return address(0); } function safeTransferFrom(address _from, address _to, uint256 _tokenId) public { safeTransferFrom(_from, _to, _tokenId, ""); } function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes memory _data) public nonReentrant { _transferFrom(_from, _to, _tokenId, 1); require( _checkAndCallSafeTransfer(_from, _to, _tokenId, _data), "Sent to a contract which is not an ERC721 receiver" ); } function transferFrom(address _from, address _to, uint256 _tokenId) public { _transferFrom(_from, _to, _tokenId, 1); } /** * @dev Internal function to invoke `onERC721Received` on a target address * The call is not executed if the target address is not a contract * @param _from address representing the previous owner of the given token ID * @param _to target address that will receive the tokens * @param _tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return whether the call correctly returned the expected magic value */ function _checkAndCallSafeTransfer( address _from, address _to, uint256 _tokenId, bytes memory _data ) internal returns (bool) { if (!_to.isContract()) { return true; } bytes4 retval = IERC721Receiver(_to).onERC721Received( msg.sender, _from, _tokenId, _data ); return (retval == ERC721_RECEIVED); } } // File: contracts/Errors/RegistryErrors.sol pragma solidity 0.5.16; contract RegistryErrors { string constant internal ERROR_REGISTRY_ONLY_INITIALIZER = "REGISTRY:ONLY_INITIALIZER"; string constant internal ERROR_REGISTRY_ONLY_OPIUM_ADDRESS_ALLOWED = "REGISTRY:ONLY_OPIUM_ADDRESS_ALLOWED"; string constant internal ERROR_REGISTRY_CANT_BE_ZERO_ADDRESS = "REGISTRY:CANT_BE_ZERO_ADDRESS"; string constant internal ERROR_REGISTRY_ALREADY_SET = "REGISTRY:ALREADY_SET"; } // File: contracts/Registry.sol pragma solidity 0.5.16; /// @title Opium.Registry contract keeps addresses of deployed Opium contracts set to allow them route and communicate to each other contract Registry is RegistryErrors { // Address of Opium.TokenMinter contract address private minter; // Address of Opium.Core contract address private core; // Address of Opium.OracleAggregator contract address private oracleAggregator; // Address of Opium.SyntheticAggregator contract address private syntheticAggregator; // Address of Opium.TokenSpender contract address private tokenSpender; // Address of Opium commission receiver address private opiumAddress; // Address of Opium contract set deployer address public initializer; /// @notice This modifier restricts access to functions, which could be called only by initializer modifier onlyInitializer() { require(msg.sender == initializer, ERROR_REGISTRY_ONLY_INITIALIZER); _; } /// @notice Sets initializer constructor() public { initializer = msg.sender; } // SETTERS /// @notice Sets Opium.TokenMinter, Opium.Core, Opium.OracleAggregator, Opium.SyntheticAggregator, Opium.TokenSpender, Opium commission receiver addresses and allows to do it only once /// @param _minter address Address of Opium.TokenMinter /// @param _core address Address of Opium.Core /// @param _oracleAggregator address Address of Opium.OracleAggregator /// @param _syntheticAggregator address Address of Opium.SyntheticAggregator /// @param _tokenSpender address Address of Opium.TokenSpender /// @param _opiumAddress address Address of Opium commission receiver function init( address _minter, address _core, address _oracleAggregator, address _syntheticAggregator, address _tokenSpender, address _opiumAddress ) external onlyInitializer { require( minter == address(0) && core == address(0) && oracleAggregator == address(0) && syntheticAggregator == address(0) && tokenSpender == address(0) && opiumAddress == address(0), ERROR_REGISTRY_ALREADY_SET ); require( _minter != address(0) && _core != address(0) && _oracleAggregator != address(0) && _syntheticAggregator != address(0) && _tokenSpender != address(0) && _opiumAddress != address(0), ERROR_REGISTRY_CANT_BE_ZERO_ADDRESS ); minter = _minter; core = _core; oracleAggregator = _oracleAggregator; syntheticAggregator = _syntheticAggregator; tokenSpender = _tokenSpender; opiumAddress = _opiumAddress; } /// @notice Allows opium commission receiver address to change itself /// @param _opiumAddress address New opium commission receiver address function changeOpiumAddress(address _opiumAddress) external { require(opiumAddress == msg.sender, ERROR_REGISTRY_ONLY_OPIUM_ADDRESS_ALLOWED); require(_opiumAddress != address(0), ERROR_REGISTRY_CANT_BE_ZERO_ADDRESS); opiumAddress = _opiumAddress; } // GETTERS /// @notice Returns address of Opium.TokenMinter /// @param result address Address of Opium.TokenMinter function getMinter() external view returns (address result) { return minter; } /// @notice Returns address of Opium.Core /// @param result address Address of Opium.Core function getCore() external view returns (address result) { return core; } /// @notice Returns address of Opium.OracleAggregator /// @param result address Address of Opium.OracleAggregator function getOracleAggregator() external view returns (address result) { return oracleAggregator; } /// @notice Returns address of Opium.SyntheticAggregator /// @param result address Address of Opium.SyntheticAggregator function getSyntheticAggregator() external view returns (address result) { return syntheticAggregator; } /// @notice Returns address of Opium.TokenSpender /// @param result address Address of Opium.TokenSpender function getTokenSpender() external view returns (address result) { return tokenSpender; } /// @notice Returns address of Opium commission receiver /// @param result address Address of Opium commission receiver function getOpiumAddress() external view returns (address result) { return opiumAddress; } } // File: contracts/Errors/UsingRegistryErrors.sol pragma solidity 0.5.16; contract UsingRegistryErrors { string constant internal ERROR_USING_REGISTRY_ONLY_CORE_ALLOWED = "USING_REGISTRY:ONLY_CORE_ALLOWED"; } // File: contracts/Lib/UsingRegistry.sol pragma solidity 0.5.16; /// @title Opium.Lib.UsingRegistry contract should be inherited by contracts, that are going to use Opium.Registry contract UsingRegistry is UsingRegistryErrors { // Emitted when registry instance is set event RegistrySet(address registry); // Instance of Opium.Registry contract Registry internal registry; /// @notice This modifier restricts access to functions, which could be called only by Opium.Core modifier onlyCore() { require(msg.sender == registry.getCore(), ERROR_USING_REGISTRY_ONLY_CORE_ALLOWED); _; } /// @notice Defines registry instance and emits appropriate event constructor(address _registry) public { registry = Registry(_registry); emit RegistrySet(_registry); } /// @notice Getter for registry variable /// @return address Address of registry set in current contract function getRegistry() external view returns (address) { return address(registry); } } // File: contracts/TokenMinter.sol pragma solidity 0.5.16; /// @title Opium.TokenMinter contract implements ERC721O token standard for minting, burning and transferring position tokens contract TokenMinter is ERC721OBackwardCompatible, UsingRegistry { /// @notice Calls constructors of super-contracts /// @param _baseTokenURI string URI for token explorers /// @param _registry address Address of Opium.registry constructor(string memory _baseTokenURI, address _registry) public ERC721OBackwardCompatible(_baseTokenURI) UsingRegistry(_registry) {} /// @notice Mints LONG and SHORT position tokens /// @param _buyer address Address of LONG position receiver /// @param _seller address Address of SHORT position receiver /// @param _derivativeHash bytes32 Hash of derivative (ticker) of position /// @param _quantity uint256 Quantity of positions to mint function mint(address _buyer, address _seller, bytes32 _derivativeHash, uint256 _quantity) external onlyCore { _mint(_buyer, _seller, _derivativeHash, _quantity); } /// @notice Mints only LONG position tokens for "pooled" derivatives /// @param _buyer address Address of LONG position receiver /// @param _derivativeHash bytes32 Hash of derivative (ticker) of position /// @param _quantity uint256 Quantity of positions to mint function mint(address _buyer, bytes32 _derivativeHash, uint256 _quantity) external onlyCore { _mintLong(_buyer, _derivativeHash, _quantity); } /// @notice Burns position tokens /// @param _tokenOwner address Address of tokens owner /// @param _tokenId uint256 tokenId of positions to burn /// @param _quantity uint256 Quantity of positions to burn function burn(address _tokenOwner, uint256 _tokenId, uint256 _quantity) external onlyCore { _burn(_tokenOwner, _tokenId, _quantity); } /// @notice ERC721 interface compatible function for position token name retrieving /// @return Returns name of token function name() external view returns (string memory) { return "Opium Network Position Token"; } /// @notice ERC721 interface compatible function for position token symbol retrieving /// @return Returns symbol of token function symbol() external view returns (string memory) { return "ONP"; } /// VIEW FUNCTIONS /// @notice Checks whether _spender is approved to spend tokens on _owners behalf or owner itself /// @param _spender address Address of spender /// @param _owner address Address of owner /// @param _tokenId address tokenId of interest /// @return Returns whether _spender is approved to spend tokens function isApprovedOrOwner( address _spender, address _owner, uint256 _tokenId ) public view returns (bool) { return ( _spender == _owner || getApproved(_tokenId, _owner) == _spender || isApprovedForAll(_owner, _spender) || isOpiumSpender(_spender) ); } /// @notice Checks whether _spender is Opium.TokenSpender /// @return Returns whether _spender is Opium.TokenSpender function isOpiumSpender(address _spender) public view returns (bool) { return _spender == registry.getTokenSpender(); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_baseTokenURI","type":"string"},{"internalType":"address","name":"_registry","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"tokenTypes","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"BatchTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"portfolioId","type":"uint256"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"tokenRatio","type":"uint256[]"}],"name":"Composition","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"registry","type":"address"}],"name":"RegistrySet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"TransferWithQuantity","type":"event"},{"constant":true,"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"batchTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_tokenOwner","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"burn","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"_tokenRatio","type":"uint256[]"},{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"compose","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_portfolioId","type":"uint256"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"_tokenRatio","type":"uint256[]"},{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"decompose","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"_tokenOwner","type":"address"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getRegistry","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"implementsERC721","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"implementsERC721O","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"isOperator","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"isApprovedOrOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_spender","type":"address"}],"name":"isOpiumSpender","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_buyer","type":"address"},{"internalType":"address","name":"_seller","type":"address"},{"internalType":"bytes32","name":"_derivativeHash","type":"bytes32"},{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"mint","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_buyer","type":"address"},{"internalType":"bytes32","name":"_derivativeHash","type":"bytes32"},{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"mint","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_holder","type":"address"},{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_nonce","type":"uint256"},{"internalType":"uint256","name":"_expiry","type":"uint256"},{"internalType":"bool","name":"_allowed","type":"bool"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"permit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_portfolioId","type":"uint256"},{"internalType":"uint256[]","name":"_initialTokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"_initialTokenRatio","type":"uint256[]"},{"internalType":"uint256[]","name":"_finalTokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"_finalTokenRatio","type":"uint256[]"},{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"recompose","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"safeBatchTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"tokenUri","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOwned","outputs":[{"internalType":"uint256[]","name":"indexes","type":"uint256[]"},{"internalType":"uint256[]","name":"balances","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"transfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162004a6338038062004a63833981810160405260408110156200003757600080fd5b81019080805160405193929190846401000000008211156200005857600080fd5b9083019060208201858111156200006e57600080fd5b82516401000000008111828201881017156200008957600080fd5b82525081516020918201929091019080838360005b83811015620000b85781810151838201526020016200009e565b50505050905090810190601f168015620000e65780820380516001836020036101000a031916815260200191505b50604052602001519150819050826200010f6301ffc9a760e01b6001600160e01b03620002cf16565b6200012a6302468acf60e31b6001600160e01b03620002cf16565b604051806042620049d1823960408051918290036042018220828201825260078352664552433732316f60c81b6020938401528151808301835260018152603160f81b908401528151808401919091527fe2e27f86dca355ac92ad62b9c84ff21cbd0c850d0a1d93695bcf66a63a10a2a1818301527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152306080808301919091528251808303909101815260a0909101918290528051920191909120600655905080605062004a13823960405190819003605001902060075550600160095580516200022290600a90602084019062000354565b506200023e6380ac58cd60e01b6001600160e01b03620002cf16565b6200025963780e9d6360e01b6001600160e01b03620002cf16565b62000274635b5e139f60e01b6001600160e01b03620002cf16565b50600b80546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f27fe5f0c1c3b1ed427cc63d0f05759ffdecf9aec9e18d31ef366fc8a6cb5dc3b9181900360200190a1505050620003f9565b6001600160e01b031980821614156200032f576040805162461bcd60e51b815260206004820152601c60248201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604482015290519081900360640190fd5b6001600160e01b0319166000908152602081905260409020805460ff19166001179055565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200039757805160ff1916838001178555620003c7565b82800160010185558215620003c7579182015b82811115620003c7578251825591602001919060010190620003aa565b50620003d5929150620003d9565b5090565b620003f691905b80821115620003d55760008155600101620003e0565b90565b6145c880620004096000396000f3fe608060405234801561001057600080fd5b506004361061025d5760003560e01c80635ab1bd5311610146578063a22cb465116100c3578063dd10f33811610087578063dd10f3381461102d578063e985e9c514611059578063f242432a14611087578063f5298aca14611150578063fba0ee6414611182578063fe99049a146112be5761025d565b8063a22cb46514610dc0578063b88d4fde14610dee578063c3e6d64014610eb2578063c87b56dd14610fde578063c89dcfce14610ffb5761025d565b80638049f3de1161010a5780638049f3de14610bbb5780638348500d14610c5757806387bffc4e1461065d57806395d89b4114610d7c578063a0ecdb3f14610d845761025d565b80635ab1bd5314610b315780636352211e1461035857806370a0823114610b3957806372982cd214610b5f5780637ecebe0014610b955761025d565b806317fad7fc116101df5780632f745c59116101a35780632f745c5914610a8557806330adf81f14610ab15780633644e51514610ab957806342842e0e14610ac15780634f558e7914610af75780634f6ccce714610b145761025d565b806317fad7fc1461068b57806318160ddd146107c757806321cda790146107cf57806323b872dd1461088e5780632eb2c2d6146108c45761025d565b8063095ea7b311610226578063095ea7b3146103c55780630b2d3bf1146103f15780630febdd49146106215780631051db341461065d57806312042d32146106655761025d565b8062fdd58e1461026257806301ffc9a7146102a057806306fdde03146102db578063081812fc14610358578063095bcdb614610391575b600080fd5b61028e6004803603604081101561027857600080fd5b506001600160a01b0381351690602001356112fa565b60408051918252519081900360200190f35b6102c7600480360360208110156102b657600080fd5b50356001600160e01b03191661134c565b604080519115158252519081900360200190f35b6102e361136f565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561031d578181015183820152602001610305565b50505050905090810190601f16801561034a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103756004803603602081101561036e57600080fd5b50356113a6565b604080516001600160a01b039092168252519081900360200190f35b6103c3600480360360608110156103a757600080fd5b506001600160a01b0381351690602081013590604001356113c5565b005b6103c3600480360360408110156103db57600080fd5b506001600160a01b0381351690602001356113d6565b6103c3600480360360c081101561040757600080fd5b81359190810190604081016020820135600160201b81111561042857600080fd5b82018360208201111561043a57600080fd5b803590602001918460208302840111600160201b8311171561045b57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156104aa57600080fd5b8201836020820111156104bc57600080fd5b803590602001918460208302840111600160201b831117156104dd57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561052c57600080fd5b82018360208201111561053e57600080fd5b803590602001918460208302840111600160201b8311171561055f57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156105ae57600080fd5b8201836020820111156105c057600080fd5b803590602001918460208302840111600160201b831117156105e157600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505091359250611498915050565b6103c36004803603608081101561063757600080fd5b506001600160a01b03813581169160208101359091169060408101359060600135611825565b6102c7611847565b6102c76004803603602081101561067b57600080fd5b50356001600160a01b031661184c565b6103c3600480360360808110156106a157600080fd5b6001600160a01b038235811692602081013590911691810190606081016040820135600160201b8111156106d457600080fd5b8201836020820111156106e657600080fd5b803590602001918460208302840111600160201b8311171561070757600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561075657600080fd5b82018360208201111561076857600080fd5b803590602001918460208302840111600160201b8311171561078957600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506118d2945050505050565b61028e6118de565b6107f5600480360360208110156107e557600080fd5b50356001600160a01b03166118e4565b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b83811015610839578181015183820152602001610821565b50505050905001838103825284818151815260200191508051906020019060200280838360005b83811015610878578181015183820152602001610860565b5050505090500194505050505060405180910390f35b6103c3600480360360608110156108a457600080fd5b506001600160a01b03813581169160208101359091169060400135611aac565b6103c3600480360360a08110156108da57600080fd5b6001600160a01b038235811692602081013590911691810190606081016040820135600160201b81111561090d57600080fd5b82018360208201111561091f57600080fd5b803590602001918460208302840111600160201b8311171561094057600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561098f57600080fd5b8201836020820111156109a157600080fd5b803590602001918460208302840111600160201b831117156109c257600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610a1157600080fd5b820183602082011115610a2357600080fd5b803590602001918460018302840111600160201b83111715610a4457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611ab9945050505050565b61028e60048036036040811015610a9b57600080fd5b506001600160a01b038135169060200135611cfc565b61028e611d36565b61028e611d3c565b6103c360048036036060811015610ad757600080fd5b506001600160a01b03813581169160208101359091169060400135611d42565b6102c760048036036020811015610b0d57600080fd5b5035611d5d565b61028e60048036036020811015610b2a57600080fd5b5035611d71565b610375611da5565b61028e60048036036020811015610b4f57600080fd5b50356001600160a01b0316611db4565b6102c760048036036060811015610b7557600080fd5b506001600160a01b03813581169160208101359091169060400135611dca565b61028e60048036036020811015610bab57600080fd5b50356001600160a01b0316611e2d565b6103c3600480360360c0811015610bd157600080fd5b6001600160a01b03823581169260208101359091169160408201359160608101359160808201351515919081019060c0810160a0820135600160201b811115610c1957600080fd5b820183602082011115610c2b57600080fd5b803590602001918460018302840111600160201b83111715610c4c57600080fd5b509092509050611e3f565b6103c360048036036060811015610c6d57600080fd5b810190602081018135600160201b811115610c8757600080fd5b820183602082011115610c9957600080fd5b803590602001918460208302840111600160201b83111715610cba57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610d0957600080fd5b820183602082011115610d1b57600080fd5b803590602001918460208302840111600160201b83111715610d3c57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505091359250612201915050565b6102e3612404565b6103c360048036036080811015610d9a57600080fd5b506001600160a01b03813581169160208101359091169060408101359060600135612421565b6103c360048036036040811015610dd657600080fd5b506001600160a01b0381351690602001351515612570565b6103c360048036036080811015610e0457600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b811115610e3e57600080fd5b820183602082011115610e5057600080fd5b803590602001918460018302840111600160201b83111715610e7157600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506125de945050505050565b6103c360048036036080811015610ec857600080fd5b81359190810190604081016020820135600160201b811115610ee957600080fd5b820183602082011115610efb57600080fd5b803590602001918460208302840111600160201b83111715610f1c57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610f6b57600080fd5b820183602082011115610f7d57600080fd5b803590602001918460208302840111600160201b83111715610f9e57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550509135925061269e915050565b6102e360048036036020811015610ff457600080fd5b50356128d3565b6103c36004803603606081101561101157600080fd5b506001600160a01b038135169060208101359060400135612a04565b6103756004803603604081101561104357600080fd5b50803590602001356001600160a01b0316612b15565b6102c76004803603604081101561106f57600080fd5b506001600160a01b0381358116916020013516612b3e565b6103c3600480360360a081101561109d57600080fd5b6001600160a01b03823581169260208101359091169160408201359160608101359181019060a081016080820135600160201b8111156110dc57600080fd5b8201836020820111156110ee57600080fd5b803590602001918460018302840111600160201b8311171561110f57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550612b6c945050505050565b6103c36004803603606081101561116657600080fd5b506001600160a01b038135169060208101359060400135612bcb565b6103c36004803603608081101561119857600080fd5b6001600160a01b038235811692602081013590911691810190606081016040820135600160201b8111156111cb57600080fd5b8201836020820111156111dd57600080fd5b803590602001918460208302840111600160201b831117156111fe57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561124d57600080fd5b82018360208201111561125f57600080fd5b803590602001918460208302840111600160201b8311171561128057600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550612cdc945050505050565b6103c3600480360360808110156112d457600080fd5b506001600160a01b03813581169160208101359091169060408101359060600135612cf8565b600080600061130884612d04565b6001600160a01b03871660009081526002602090815260408083208584529091529020549193509150611341908263ffffffff612d1516565b925050505b92915050565b6001600160e01b0319811660009081526020819052604090205460ff165b919050565b60408051808201909152601c81527f4f7069756d204e6574776f726b20506f736974696f6e20546f6b656e00000000602082015290565b60006113b182611d5d565b156113bd57503061136a565b506000919050565b6113d133848484612d2f565b505050565b6001600160a01b038216331415611434576040805162461bcd60e51b815260206004820152601960248201527f43616e277420617070726f766520746f20796f757273656c6600000000000000604482015290519081900360640190fd5b600081815260046020908152604080832033808552925280832080546001600160a01b0319166001600160a01b038716908117909155905184939192917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a45050565b83518551146114d85760405162461bcd60e51b815260040180806020018281038252603e81526020018061436f603e913960400191505060405180910390fd5b81518351146115185760405162461bcd60e51b815260040180806020018281038252603c8152602001806144cd603c913960400191505060405180910390fd5b6000811161155b576040805162461bcd60e51b815260206004820152601b6024820152600080516020614329833981519152604482015290519081900360640190fd5b600085511161159f576040805162461bcd60e51b815260206004820152601b6024820152600080516020614329833981519152604482015290519081900360640190fd5b60008351116115e3576040805162461bcd60e51b815260206004820152601b6024820152600080516020614329833981519152604482015290519081900360640190fd5b6115ec85612e9b565b6116275760405162461bcd60e51b81526004018080602001828103825260218152602001806145296021913960400191505060405180910390fd5b61163083612e9b565b61166b5760405162461bcd60e51b81526004018080602001828103825260218152602001806145296021913960400191505060405180910390fd5b6000858560405160200180838051906020019060200280838360005b8381101561169f578181015183820152602001611687565b50505050905001828051906020019060200280838360005b838110156116cf5781810151838201526020016116b7565b50505050905001925050506040516020818303038152906040528051906020012060001c9050868114611749576040805162461bcd60e51b815260206004820152601f60248201527f544f4b454e5f4d494e5445523a57524f4e475f504f5254464f4c494f5f494400604482015290519081900360640190fd5b611754338884612f00565b6117618686868686612fb8565b61176e8686868686613025565b61177b8686868686613092565b6000848460405160200180838051906020019060200280838360005b838110156117af578181015183820152602001611797565b50505050905001828051906020019060200280838360005b838110156117df5781810151838201526020016117c7565b50505050905001925050506040516020818303038152906040528051906020012060001c9050611810818686613212565b61181b813385613300565b5050505050505050565b6118418484848460405180602001604052806000815250612b6c565b50505050565b600190565b600b546040805163beb5bd8160e01b815290516000926001600160a01b03169163beb5bd81916004808301926020929190829003018186803b15801561189157600080fd5b505afa1580156118a5573d6000803e3d6000fd5b505050506040513d60208110156118bb57600080fd5b50516001600160a01b038381169116149050919050565b611841848484846133ba565b60015490565b60608060006118f16118de565b905060608160405190808252806020026020018201604052801561191f578160200160208202803883390190505b50905060608260405190808252806020026020018201604052801561194e578160200160208202803883390190505b5090506000805b848110156119d55760006001828154811061196c57fe5b9060005260206000200154905060006119858a836112fa565b11156119cc5761199589826112fa565b8484815181106119a157fe5b602002602001018181525050808584815181106119ba57fe5b60209081029190910101526001909201915b50600101611955565b50606081604051908082528060200260200182016040528015611a02578160200160208202803883390190505b509050606082604051908082528060200260200182016040528015611a31578160200160208202803883390190505b50905060005b83811015611a9e57848181518110611a4b57fe5b6020026020010151838281518110611a5f57fe5b602002602001018181525050858181518110611a7757fe5b6020026020010151828281518110611a8b57fe5b6020908102919091010152600101611a37565b509650945050505050915091565b6113d18383836001612d2f565b6009805460010190819055611ad0868686866133ba565b611ae2856001600160a01b03166137f3565b15611c9e576000856001600160a01b031663d0e17c0b33898888886040518663ffffffff1660e01b815260040180866001600160a01b03166001600160a01b03168152602001856001600160a01b03166001600160a01b03168152602001806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b83811015611b84578181015183820152602001611b6c565b50505050905001848103835286818151815260200191508051906020019060200280838360005b83811015611bc3578181015183820152602001611bab565b50505050905001848103825285818151815260200191508051906020019080838360005b83811015611bff578181015183820152602001611be7565b50505050905090810190601f168015611c2c5780820380516001836020036101000a031916815260200191505b5098505050505050505050602060405180830381600087803b158015611c5157600080fd5b505af1158015611c65573d6000803e3d6000fd5b505050506040513d6020811015611c7b57600080fd5b505190506001600160e01b0319811663d0e17c0b60e01b14611c9c57600080fd5b505b6009548114611cf4576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b505050505050565b60006060611d09846118e4565b91505080518310611d1957600080fd5b808381518110611d2557fe5b602002602001015191505092915050565b60075481565b60065481565b6113d1838383604051806020016040528060008152506125de565b600090815260056020526040902054151590565b6000611d7b6118de565b8210611d8657600080fd5b60018281548110611d9357fe5b90600052602060002001549050919050565b600b546001600160a01b031690565b60006060611dc1836118e4565b51949350505050565b6000826001600160a01b0316846001600160a01b03161480611e065750836001600160a01b0316611dfb8385612b15565b6001600160a01b0316145b80611e165750611e168385612b3e565b80611e255750611e258461184c565b949350505050565b60086020526000908152604090205481565b600654600754604080516020808201939093526001600160a01b03808c16828401528a16606080830191909152608082018a905260a0820189905287151560c0808401919091528351808403909101815260e08301845280519085012061190160f01b61010084015261010283019590955261012280830195909552825180830390950185526101428201808452855195850195909520610162601f880186900490950283018501909352858552919360009384938493909291899189918291018382808284376000920182905250602085015160408601516060870151919a509850901a95509293505050601b8310159050611f3d57601b820191505b60008260ff16601b14158015611f5757508260ff16601c14155b15611f6457506000611fc8565b6040805160008152602080820180845289905260ff8616828401526060820188905260808201879052915160019260a0808401939192601f1981019281900390910190855afa158015611fbb573d6000803e3d6000fd5b5050506020604051035190505b6001600160a01b038d16612023576040805162461bcd60e51b815260206004820152601c60248201527f486f6c6465722063616e2774206265207a65726f206164647265737300000000604482015290519081900360640190fd5b806001600160a01b03168d6001600160a01b031614612089576040805162461bcd60e51b815260206004820152601960248201527f5369676e6572206164647265737320697320696e76616c696400000000000000604482015290519081900360640190fd5b8915806120965750894211155b6120dc576040805162461bcd60e51b815260206004820152601260248201527114195c9b5a5cdcda5bdb88195e1c1a5c995960721b604482015290519081900360640190fd5b6001600160a01b038d1660009081526008602052604090208054600181019091558b14612143576040805162461bcd60e51b815260206004820152601060248201526f139bdb98d9481a5cc81a5b9d985b1a5960821b604482015290519081900360640190fd5b88600360008f6001600160a01b03166001600160a01b0316815260200190815260200160002060008e6001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff0219169083151502179055508b6001600160a01b03168d6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318b604051808215151515815260200191505060405180910390a350505050505050505050505050565b81518351146122415760405162461bcd60e51b81526004018080602001828103825260368152602001806143f06036913960400191505060405180910390fd5b60008111612284576040805162461bcd60e51b815260206004820152601b6024820152600080516020614329833981519152604482015290519081900360640190fd5b60008351116122c8576040805162461bcd60e51b815260206004820152601b6024820152600080516020614329833981519152604482015290519081900360640190fd5b6122d183612e9b565b61230c5760405162461bcd60e51b81526004018080602001828103825260218152602001806145296021913960400191505060405180910390fd5b60005b83518110156123635761235b3385838151811061232857fe5b60200260200101516123568587868151811061234057fe5b602002602001015161382a90919063ffffffff16565b612f00565b60010161230f565b506000838360405160200180838051906020019060200280838360005b83811015612398578181015183820152602001612380565b50505050905001828051906020019060200280838360005b838110156123c85781810151838201526020016123b0565b50505050905001925050506040516020818303038152906040528051906020012060001c90506123f9818585613212565b611841813384613300565b60408051808201909152600381526204f4e560ec1b602082015290565b600b60009054906101000a90046001600160a01b03166001600160a01b031663da4fbe526040518163ffffffff1660e01b815260040160206040518083038186803b15801561246f57600080fd5b505afa158015612483573d6000803e3d6000fd5b505050506040513d602081101561249957600080fd5b50516040805180820190915260208082527f5553494e475f52454749535452593a4f4e4c595f434f52455f414c4c4f57454490820152906001600160a01b031633146125635760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612528578181015183820152602001612510565b50505050905090810190601f1680156125555780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506118418484848461388a565b3360008181526003602090815260408083206001600160a01b03871680855290835292819020805460ff1916861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b600980546001908101918290556125fa90869086908690612d2f565b612606858585856138a0565b6126415760405162461bcd60e51b81526004018080602001828103825260328152602001806144596032913960400191505060405180910390fd5b6009548114612697576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b5050505050565b81518351146126de5760405162461bcd60e51b81526004018080602001828103825260368152602001806143f06036913960400191505060405180910390fd5b60008111612721576040805162461bcd60e51b815260206004820152601b6024820152600080516020614329833981519152604482015290519081900360640190fd5b6000835111612765576040805162461bcd60e51b815260206004820152601b6024820152600080516020614329833981519152604482015290519081900360640190fd5b61276e83612e9b565b6127a95760405162461bcd60e51b81526004018080602001828103825260218152602001806145296021913960400191505060405180910390fd5b6000838360405160200180838051906020019060200280838360005b838110156127dd5781810151838201526020016127c5565b50505050905001828051906020019060200280838360005b8381101561280d5781810151838201526020016127f5565b50505050905001925050506040516020818303038152906040528051906020012060001c9050848114612887576040805162461bcd60e51b815260206004820152601f60248201527f544f4b454e5f4d494e5445523a57524f4e475f504f5254464f4c494f5f494400604482015290519081900360640190fd5b612892338684612f00565b60005b8451811015611cf4576128cb8582815181106128ad57fe5b6020026020010151336128c68688868151811061234057fe5b613300565b600101612895565b60606128de82611d5d565b612925576040805162461bcd60e51b8152602060048201526013602482015272151bdad95b88191bd95cdb89dd08195e1a5cdd606a1b604482015290519081900360640190fd5b600a612930836139d3565b604051602001808380546001816001161561010002031660029004801561298e5780601f1061296c57610100808354040283529182019161298e565b820191906000526020600020905b81548152906001019060200180831161297a575b5050825160208401908083835b602083106129ba5780518252601f19909201916020918201910161299b565b5181516020939093036101000a600019018019909116921691909117905264173539b7b760d91b92019182525060408051808303601a190181526005909201905295945050505050565b600b60009054906101000a90046001600160a01b03166001600160a01b031663da4fbe526040518163ffffffff1660e01b815260040160206040518083038186803b158015612a5257600080fd5b505afa158015612a66573d6000803e3d6000fd5b505050506040513d6020811015612a7c57600080fd5b50516040805180820190915260208082527f5553494e475f52454749535452593a4f4e4c595f434f52455f414c4c4f57454490820152906001600160a01b03163314612b095760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315612528578181015183820152602001612510565b506113d1838383613a94565b60009182526004602090815260408084206001600160a01b039384168552909152909120541690565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205460ff1690565b6009805460010190819055612b8386868686612d2f565b612b908686868686613b20565b611c9e5760405162461bcd60e51b81526004018080602001828103825260338152602001806144266033913960400191505060405180910390fd5b600b60009054906101000a90046001600160a01b03166001600160a01b031663da4fbe526040518163ffffffff1660e01b815260040160206040518083038186803b158015612c1957600080fd5b505afa158015612c2d573d6000803e3d6000fd5b505050506040513d6020811015612c4357600080fd5b50516040805180820190915260208082527f5553494e475f52454749535452593a4f4e4c595f434f52455f414c4c4f57454490820152906001600160a01b03163314612cd05760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315612528578181015183820152602001612510565b506113d1838383612f00565b6118418484848460405180602001604052806000815250611ab9565b61184184848484612d2f565b610100602082020491600790911690565b600181016020026101000382901c63ffffffff1692915050565b612d3a338584611dca565b612d7a576040805162461bcd60e51b815260206004820152600c60248201526b139bdd08185c1c1c9bdd995960a21b604482015290519081900360640190fd5b612d8484836112fa565b811115612dc25760405162461bcd60e51b81526004018080602001828103825260228152602001806145726022913960400191505060405180910390fd5b6001600160a01b038316612e12576040805162461bcd60e51b8152602060048201526012602482015271496e76616c696420746f206164647265737360701b604482015290519081900360640190fd5b612e1f8483836001613c7a565b612e2c8383836000613c7a565b81836001600160a01b0316856001600160a01b031660008051602061450983398151915260405160405180910390a481836001600160a01b0316856001600160a01b03166000805160206143ad833981519152846040518082815260200191505060405180910390a450505050565b8051600090815b81811015612ef657600080612eca86878581518110612ebd57fe5b6020026020010151613cf1565b91509150808015612eda57508282105b15612eec57600094505050505061136a565b5050600101612ea2565b5060019392505050565b6000612f0c84846112fa565b905081811015612f4d5760405162461bcd60e51b81526004018080602001828103825260218152602001806144ac6021913960400191505060405180910390fd5b612f5a8484846001613c7a565b60405183906000906001600160a01b03871690600080516020614509833981519152908390a460408051838152905184916000916001600160a01b038816916000805160206143ad833981519152919081900360200190a450505050565b606080612fcb878663ffffffff613d4316565b909250905060005b825181101561181b576000828281518110612fea57fe5b6020026020010151905061301c89828151811061300357fe5b6020026020010151336128c6888c868151811061234057fe5b50600101612fd3565b606080613038858863ffffffff613d4316565b909250905060005b825181101561181b57600082828151811061305757fe5b602002602001015190506130893388838151811061307157fe5b6020026020010151612356888a868151811061234057fe5b50600101613040565b606080806130a6888763ffffffff613ec216565b9194509250905060005b83518110156132075760008382815181106130c757fe5b6020026020010151905060008383815181106130df57fe5b602002602001015190508781815181106130f557fe5b60200260200101518a838151811061310957fe5b6020026020010151111561317557600088828151811061312557fe5b60200260200101518b848151811061313957fe5b602002602001015103905061316f8c848151811061315357fe5b6020026020010151336128c68b8561382a90919063ffffffff16565b506131fd565b87818151811061318157fe5b60200260200101518a838151811061319557fe5b602002602001015110156131fd5760008a83815181106131b157fe5b60200260200101518983815181106131c557fe5b60200260200101510390506131fb338d85815181106131e057fe5b60200260200101516123568b8561382a90919063ffffffff16565b505b50506001016130b0565b505050505050505050565b61321b83611d5d565b6113d157600260056000858152602001908152602001600020819055507f942e21426178d7f44f5fc38ad086c24504b41d256a2f125368d8e097de99fd8c838383604051808481526020018060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156132a657818101518382015260200161328e565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156132e55781810151838201526020016132cd565b505050509050019550505050505060405180910390a1505050565b61330983611d5d565b6133505760008381526005602052604081206001908190558054808201825591527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6018390555b61335d8284836000613c7a565b60405183906001600160a01b03841690600090600080516020614509833981519152908290a460408051828152905184916001600160a01b038516916000916000805160206143ad833981519152919081900360200190a4505050565b83336001600160a01b03821614806133f557506001600160a01b038116600090815260036020908152604080832033845290915290205460ff165b6134305760405162461bcd60e51b815260040180806020018281038252602881526020018061454a6028913960400191505060405180910390fd5b81518351146134705760405162461bcd60e51b81526004018080602001828103825260268152602001806143496026913960400191505060405180910390fd5b6001600160a01b0384166134c0576040805162461bcd60e51b8152602060048201526012602482015271496e76616c696420746f206164647265737360701b604482015290519081900360640190fd5b82516001600160a01b0386811690861614156135925760005b8181101561358b578481815181106134ed57fe5b6020026020010151866001600160a01b0316886001600160a01b031660008051602061450983398151915260405160405180910390a484818151811061352f57fe5b6020026020010151866001600160a01b0316886001600160a01b03166000805160206143ad83398151915287858151811061356657fe5b60200260200101516040518082815260200191505060405180910390a46001016134d9565b5050612697565b60005b8181101561371b576135ba878683815181106135ad57fe5b60200260200101516112fa565b8482815181106135c657fe5b6020026020010151111561360b5760405162461bcd60e51b81526004018080602001828103825260228152602001806145726022913960400191505060405180910390fd5b61363e8786838151811061361b57fe5b602002602001015186848151811061362f57fe5b60200260200101516001613c7a565b6136718686838151811061364e57fe5b602002602001015186848151811061366257fe5b60200260200101516000613c7a565b84818151811061367d57fe5b6020026020010151866001600160a01b0316886001600160a01b031660008051602061450983398151915260405160405180910390a48481815181106136bf57fe5b6020026020010151866001600160a01b0316886001600160a01b03166000805160206143ad8339815191528785815181106136f657fe5b60200260200101516040518082815260200191505060405180910390a4600101613595565b50846001600160a01b0316866001600160a01b03167ff59807b2c31ca3ba212e90599175c120c556422950bac5be656274483e8581df8686604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561379757818101518382015260200161377f565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156137d65781810151838201526020016137be565b5050505090500194505050505060405180910390a3505050505050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708115801590611e255750141592915050565b60008261383957506000611346565b8282028284828161384657fe5b04146138835760405162461bcd60e51b815260040180806020018281038252602181526020018061448b6021913960400191505060405180910390fd5b9392505050565b613895848383613a94565b611841838383614098565b60006138b4846001600160a01b03166137f3565b6138c057506001611e25565b604051630a85bd0160e11b815233600482018181526001600160a01b03888116602485015260448401879052608060648501908152865160848601528651600095928a169463150b7a029490938c938b938b939260a4019060208501908083838e5b8381101561393a578181015183820152602001613922565b50505050905090810190601f1680156139675780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b15801561398957600080fd5b505af115801561399d573d6000803e3d6000fd5b505050506040513d60208110156139b357600080fd5b50516001600160e01b031916630a85bd0160e11b14915050949350505050565b6060816139f857506040805180820190915260018152600360fc1b602082015261136a565b8160005b8115613a1057600101600a820491506139fc565b6060816040519080825280601f01601f191660200182016040528015613a3d576020820181803883390190505b50905060001982015b8515613a8b57600a860660300160f81b82828060019003935081518110613a6957fe5b60200101906001600160f81b031916908160001a905350600a86049550613a46565b50949350505050565b6000827356c54b408c44b12f6c9219c9c73fcda4e783fc2063a085725990916040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015613ae757600080fd5b505af4158015613afb573d6000803e3d6000fd5b505050506040513d6020811015613b1157600080fd5b50519050611841818584613300565b6000613b34856001600160a01b03166137f3565b613b4057506001613c71565b6000856001600160a01b031663f891ffe033898888886040518663ffffffff1660e01b815260040180866001600160a01b03166001600160a01b03168152602001856001600160a01b03166001600160a01b0316815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015613bde578181015183820152602001613bc6565b50505050905090810190601f168015613c0b5780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600087803b158015613c2e57600080fd5b505af1158015613c42573d6000803e3d6000fd5b505050506040513d6020811015613c5857600080fd5b50516001600160e01b0319166307c48fff60e51b149150505b95945050505050565b600080613c8685612d04565b6001600160a01b03881660009081526002602090815260408083208584529091529020549193509150613cc19082868663ffffffff6140eb16565b6001600160a01b039096166000908152600260209081526040808320948352939052919091209490945550505050565b81516000908190815b81811015613d325784868281518110613d0f57fe5b60200260200101511415613d2a57925060019150613d3c9050565b600101613cfa565b5060009250829150505b9250929050565b606080600084519050606081604051908082528060200260200182016040528015613d78578160200160208202803883390190505b5090506000805b83811015613ddb576000888281518110613d9557fe5b60200260200101519050613da988826141c3565b613dd2576001848381518110613dbb57fe5b911515602092830291909101909101526001909201915b50600101613d7f565b50606081604051908082528060200260200182016040528015613e08578160200160208202803883390190505b509050606082604051908082528060200260200182016040528015613e37578160200160208202803883390190505b5090506000805b86811015613eb257858181518110613e5257fe5b602002602001015115613eaa578a8181518110613e6b57fe5b6020026020010151848381518110613e7f57fe5b60200260200101818152505080838381518110613e9857fe5b60209081029190910101526001909101905b600101613e3e565b5091999098509650505050505050565b6060806060600085519050606081604051908082528060200260200182016040528015613ef9578160200160208202803883390190505b5090506000805b83811015613f5757613f25888a8381518110613f1857fe5b60200260200101516141c3565b15613f4f576001838281518110613f3857fe5b911515602092830291909101909101526001909101905b600101613f00565b50606081604051908082528060200260200182016040528015613f84578160200160208202803883390190505b509050606082604051908082528060200260200182016040528015613fb3578160200160208202803883390190505b509050606083604051908082528060200260200182016040528015613fe2578160200160208202803883390190505b5090506000805b8781101561408657868181518110613ffd57fe5b60200260200101511561407e578c818151811061401657fe5b602002602001015185838151811061402a57fe5b6020026020010181815250508084838151811061404357fe5b60200260200101818152505061405f8c8e8381518110612ebd57fe5b5083838151811061406c57fe5b60209081029190910101526001909101905b600101613fe9565b50929b919a5098509650505050505050565b6000827356c54b408c44b12f6c9219c9c73fcda4e783fc20635b667cf990916040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015613ae757600080fd5b600080808360028111156140fb57fe5b141561412e5761410b8686612d15565b90506141278686614122848863ffffffff6141d016565b61422a565b9150613a8b565b600183600281111561413c57fe5b14156141635761414c8686612d15565b90506141278686614122848863ffffffff61429116565b600283600281111561417157fe5b14156141825761412786868661422a565b6040805162461bcd60e51b815260206004820152601160248201527024b73b30b634b21037b832b930ba34b7b760791b604482015290519081900360640190fd5b6000806113418484613cf1565b600082820183811015613883576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6000600160201b821061426e5760405162461bcd60e51b81526004018080602001828103825260238152602001806143cd6023913960400191505060405180910390fd5b5063ffffffff600183016020026101000390811b1984169082901b179392505050565b600061388383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250600081848411156143205760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315612528578181015183820152602001612510565b50505090039056fe544f4b454e5f4d494e5445523a57524f4e475f5155414e544954590000000000496e636f6e73697374656e74206172726179206c656e677468206265747765656e2061726773544f4b454e5f4d494e5445523a494e495449414c5f544f4b454e5f4944535f414e445f524154494f5f4c454e4754485f444f45535f4e4f545f4d415443482114851a3e2a54429989f46c1ab0743e37ded205d9bbdfd85635aed5bd595a06416d6f756e7420746f20777269746520696e2062696e20697320746f6f206c61726765544f4b454e5f4d494e5445523a544f4b454e5f4944535f414e445f524154494f5f4c454e4754485f444f45535f4e4f545f4d4154434853656e7420746f206120636f6e7472616374207768696368206973206e6f7420616e204552433732314f20726563656976657253656e7420746f206120636f6e7472616374207768696368206973206e6f7420616e20455243373231207265636569766572536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77544f4b454e5f4d494e5445523a4e4f545f454e4f5547485f504f534954494f4e53544f4b454e5f4d494e5445523a46494e414c5f544f4b454e5f4944535f414e445f524154494f5f4c454e4754485f444f45535f4e4f545f4d41544348ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef544f4b454e5f4d494e5445523a544f4b454e5f4944535f4e4f545f554e495155456d73672e73656e646572206973206e656974686572205f66726f6d206e6f72206f70657261746f725175616e746974792067726561746572207468616e2066726f6d2062616c616e6365a265627a7a723158206a1940fe777b8e63309c21dd7e676ea6257c61bdc096c85c9b740ba169001d6764736f6c63430005100032454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c6164647265737320766572696679696e67436f6e7472616374295065726d6974286164647265737320686f6c6465722c61646472657373207370656e6465722c75696e74323536206e6f6e63652c75696e74323536206578706972792c626f6f6c20616c6c6f7765642900000000000000000000000000000000000000000000000000000000000000400000000000000000000000001cad268f540aa7e5c606b203e8443562332a3a35000000000000000000000000000000000000000000000000000000000000002768747470733a2f2f6578706c6f7265722e6f7069756d2e6e6574776f726b2f6572633732316f2f00000000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061025d5760003560e01c80635ab1bd5311610146578063a22cb465116100c3578063dd10f33811610087578063dd10f3381461102d578063e985e9c514611059578063f242432a14611087578063f5298aca14611150578063fba0ee6414611182578063fe99049a146112be5761025d565b8063a22cb46514610dc0578063b88d4fde14610dee578063c3e6d64014610eb2578063c87b56dd14610fde578063c89dcfce14610ffb5761025d565b80638049f3de1161010a5780638049f3de14610bbb5780638348500d14610c5757806387bffc4e1461065d57806395d89b4114610d7c578063a0ecdb3f14610d845761025d565b80635ab1bd5314610b315780636352211e1461035857806370a0823114610b3957806372982cd214610b5f5780637ecebe0014610b955761025d565b806317fad7fc116101df5780632f745c59116101a35780632f745c5914610a8557806330adf81f14610ab15780633644e51514610ab957806342842e0e14610ac15780634f558e7914610af75780634f6ccce714610b145761025d565b806317fad7fc1461068b57806318160ddd146107c757806321cda790146107cf57806323b872dd1461088e5780632eb2c2d6146108c45761025d565b8063095ea7b311610226578063095ea7b3146103c55780630b2d3bf1146103f15780630febdd49146106215780631051db341461065d57806312042d32146106655761025d565b8062fdd58e1461026257806301ffc9a7146102a057806306fdde03146102db578063081812fc14610358578063095bcdb614610391575b600080fd5b61028e6004803603604081101561027857600080fd5b506001600160a01b0381351690602001356112fa565b60408051918252519081900360200190f35b6102c7600480360360208110156102b657600080fd5b50356001600160e01b03191661134c565b604080519115158252519081900360200190f35b6102e361136f565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561031d578181015183820152602001610305565b50505050905090810190601f16801561034a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103756004803603602081101561036e57600080fd5b50356113a6565b604080516001600160a01b039092168252519081900360200190f35b6103c3600480360360608110156103a757600080fd5b506001600160a01b0381351690602081013590604001356113c5565b005b6103c3600480360360408110156103db57600080fd5b506001600160a01b0381351690602001356113d6565b6103c3600480360360c081101561040757600080fd5b81359190810190604081016020820135600160201b81111561042857600080fd5b82018360208201111561043a57600080fd5b803590602001918460208302840111600160201b8311171561045b57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156104aa57600080fd5b8201836020820111156104bc57600080fd5b803590602001918460208302840111600160201b831117156104dd57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561052c57600080fd5b82018360208201111561053e57600080fd5b803590602001918460208302840111600160201b8311171561055f57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156105ae57600080fd5b8201836020820111156105c057600080fd5b803590602001918460208302840111600160201b831117156105e157600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505091359250611498915050565b6103c36004803603608081101561063757600080fd5b506001600160a01b03813581169160208101359091169060408101359060600135611825565b6102c7611847565b6102c76004803603602081101561067b57600080fd5b50356001600160a01b031661184c565b6103c3600480360360808110156106a157600080fd5b6001600160a01b038235811692602081013590911691810190606081016040820135600160201b8111156106d457600080fd5b8201836020820111156106e657600080fd5b803590602001918460208302840111600160201b8311171561070757600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561075657600080fd5b82018360208201111561076857600080fd5b803590602001918460208302840111600160201b8311171561078957600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506118d2945050505050565b61028e6118de565b6107f5600480360360208110156107e557600080fd5b50356001600160a01b03166118e4565b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b83811015610839578181015183820152602001610821565b50505050905001838103825284818151815260200191508051906020019060200280838360005b83811015610878578181015183820152602001610860565b5050505090500194505050505060405180910390f35b6103c3600480360360608110156108a457600080fd5b506001600160a01b03813581169160208101359091169060400135611aac565b6103c3600480360360a08110156108da57600080fd5b6001600160a01b038235811692602081013590911691810190606081016040820135600160201b81111561090d57600080fd5b82018360208201111561091f57600080fd5b803590602001918460208302840111600160201b8311171561094057600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561098f57600080fd5b8201836020820111156109a157600080fd5b803590602001918460208302840111600160201b831117156109c257600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610a1157600080fd5b820183602082011115610a2357600080fd5b803590602001918460018302840111600160201b83111715610a4457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611ab9945050505050565b61028e60048036036040811015610a9b57600080fd5b506001600160a01b038135169060200135611cfc565b61028e611d36565b61028e611d3c565b6103c360048036036060811015610ad757600080fd5b506001600160a01b03813581169160208101359091169060400135611d42565b6102c760048036036020811015610b0d57600080fd5b5035611d5d565b61028e60048036036020811015610b2a57600080fd5b5035611d71565b610375611da5565b61028e60048036036020811015610b4f57600080fd5b50356001600160a01b0316611db4565b6102c760048036036060811015610b7557600080fd5b506001600160a01b03813581169160208101359091169060400135611dca565b61028e60048036036020811015610bab57600080fd5b50356001600160a01b0316611e2d565b6103c3600480360360c0811015610bd157600080fd5b6001600160a01b03823581169260208101359091169160408201359160608101359160808201351515919081019060c0810160a0820135600160201b811115610c1957600080fd5b820183602082011115610c2b57600080fd5b803590602001918460018302840111600160201b83111715610c4c57600080fd5b509092509050611e3f565b6103c360048036036060811015610c6d57600080fd5b810190602081018135600160201b811115610c8757600080fd5b820183602082011115610c9957600080fd5b803590602001918460208302840111600160201b83111715610cba57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610d0957600080fd5b820183602082011115610d1b57600080fd5b803590602001918460208302840111600160201b83111715610d3c57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505091359250612201915050565b6102e3612404565b6103c360048036036080811015610d9a57600080fd5b506001600160a01b03813581169160208101359091169060408101359060600135612421565b6103c360048036036040811015610dd657600080fd5b506001600160a01b0381351690602001351515612570565b6103c360048036036080811015610e0457600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b811115610e3e57600080fd5b820183602082011115610e5057600080fd5b803590602001918460018302840111600160201b83111715610e7157600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506125de945050505050565b6103c360048036036080811015610ec857600080fd5b81359190810190604081016020820135600160201b811115610ee957600080fd5b820183602082011115610efb57600080fd5b803590602001918460208302840111600160201b83111715610f1c57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610f6b57600080fd5b820183602082011115610f7d57600080fd5b803590602001918460208302840111600160201b83111715610f9e57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550509135925061269e915050565b6102e360048036036020811015610ff457600080fd5b50356128d3565b6103c36004803603606081101561101157600080fd5b506001600160a01b038135169060208101359060400135612a04565b6103756004803603604081101561104357600080fd5b50803590602001356001600160a01b0316612b15565b6102c76004803603604081101561106f57600080fd5b506001600160a01b0381358116916020013516612b3e565b6103c3600480360360a081101561109d57600080fd5b6001600160a01b03823581169260208101359091169160408201359160608101359181019060a081016080820135600160201b8111156110dc57600080fd5b8201836020820111156110ee57600080fd5b803590602001918460018302840111600160201b8311171561110f57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550612b6c945050505050565b6103c36004803603606081101561116657600080fd5b506001600160a01b038135169060208101359060400135612bcb565b6103c36004803603608081101561119857600080fd5b6001600160a01b038235811692602081013590911691810190606081016040820135600160201b8111156111cb57600080fd5b8201836020820111156111dd57600080fd5b803590602001918460208302840111600160201b831117156111fe57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561124d57600080fd5b82018360208201111561125f57600080fd5b803590602001918460208302840111600160201b8311171561128057600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550612cdc945050505050565b6103c3600480360360808110156112d457600080fd5b506001600160a01b03813581169160208101359091169060408101359060600135612cf8565b600080600061130884612d04565b6001600160a01b03871660009081526002602090815260408083208584529091529020549193509150611341908263ffffffff612d1516565b925050505b92915050565b6001600160e01b0319811660009081526020819052604090205460ff165b919050565b60408051808201909152601c81527f4f7069756d204e6574776f726b20506f736974696f6e20546f6b656e00000000602082015290565b60006113b182611d5d565b156113bd57503061136a565b506000919050565b6113d133848484612d2f565b505050565b6001600160a01b038216331415611434576040805162461bcd60e51b815260206004820152601960248201527f43616e277420617070726f766520746f20796f757273656c6600000000000000604482015290519081900360640190fd5b600081815260046020908152604080832033808552925280832080546001600160a01b0319166001600160a01b038716908117909155905184939192917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a45050565b83518551146114d85760405162461bcd60e51b815260040180806020018281038252603e81526020018061436f603e913960400191505060405180910390fd5b81518351146115185760405162461bcd60e51b815260040180806020018281038252603c8152602001806144cd603c913960400191505060405180910390fd5b6000811161155b576040805162461bcd60e51b815260206004820152601b6024820152600080516020614329833981519152604482015290519081900360640190fd5b600085511161159f576040805162461bcd60e51b815260206004820152601b6024820152600080516020614329833981519152604482015290519081900360640190fd5b60008351116115e3576040805162461bcd60e51b815260206004820152601b6024820152600080516020614329833981519152604482015290519081900360640190fd5b6115ec85612e9b565b6116275760405162461bcd60e51b81526004018080602001828103825260218152602001806145296021913960400191505060405180910390fd5b61163083612e9b565b61166b5760405162461bcd60e51b81526004018080602001828103825260218152602001806145296021913960400191505060405180910390fd5b6000858560405160200180838051906020019060200280838360005b8381101561169f578181015183820152602001611687565b50505050905001828051906020019060200280838360005b838110156116cf5781810151838201526020016116b7565b50505050905001925050506040516020818303038152906040528051906020012060001c9050868114611749576040805162461bcd60e51b815260206004820152601f60248201527f544f4b454e5f4d494e5445523a57524f4e475f504f5254464f4c494f5f494400604482015290519081900360640190fd5b611754338884612f00565b6117618686868686612fb8565b61176e8686868686613025565b61177b8686868686613092565b6000848460405160200180838051906020019060200280838360005b838110156117af578181015183820152602001611797565b50505050905001828051906020019060200280838360005b838110156117df5781810151838201526020016117c7565b50505050905001925050506040516020818303038152906040528051906020012060001c9050611810818686613212565b61181b813385613300565b5050505050505050565b6118418484848460405180602001604052806000815250612b6c565b50505050565b600190565b600b546040805163beb5bd8160e01b815290516000926001600160a01b03169163beb5bd81916004808301926020929190829003018186803b15801561189157600080fd5b505afa1580156118a5573d6000803e3d6000fd5b505050506040513d60208110156118bb57600080fd5b50516001600160a01b038381169116149050919050565b611841848484846133ba565b60015490565b60608060006118f16118de565b905060608160405190808252806020026020018201604052801561191f578160200160208202803883390190505b50905060608260405190808252806020026020018201604052801561194e578160200160208202803883390190505b5090506000805b848110156119d55760006001828154811061196c57fe5b9060005260206000200154905060006119858a836112fa565b11156119cc5761199589826112fa565b8484815181106119a157fe5b602002602001018181525050808584815181106119ba57fe5b60209081029190910101526001909201915b50600101611955565b50606081604051908082528060200260200182016040528015611a02578160200160208202803883390190505b509050606082604051908082528060200260200182016040528015611a31578160200160208202803883390190505b50905060005b83811015611a9e57848181518110611a4b57fe5b6020026020010151838281518110611a5f57fe5b602002602001018181525050858181518110611a7757fe5b6020026020010151828281518110611a8b57fe5b6020908102919091010152600101611a37565b509650945050505050915091565b6113d18383836001612d2f565b6009805460010190819055611ad0868686866133ba565b611ae2856001600160a01b03166137f3565b15611c9e576000856001600160a01b031663d0e17c0b33898888886040518663ffffffff1660e01b815260040180866001600160a01b03166001600160a01b03168152602001856001600160a01b03166001600160a01b03168152602001806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b83811015611b84578181015183820152602001611b6c565b50505050905001848103835286818151815260200191508051906020019060200280838360005b83811015611bc3578181015183820152602001611bab565b50505050905001848103825285818151815260200191508051906020019080838360005b83811015611bff578181015183820152602001611be7565b50505050905090810190601f168015611c2c5780820380516001836020036101000a031916815260200191505b5098505050505050505050602060405180830381600087803b158015611c5157600080fd5b505af1158015611c65573d6000803e3d6000fd5b505050506040513d6020811015611c7b57600080fd5b505190506001600160e01b0319811663d0e17c0b60e01b14611c9c57600080fd5b505b6009548114611cf4576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b505050505050565b60006060611d09846118e4565b91505080518310611d1957600080fd5b808381518110611d2557fe5b602002602001015191505092915050565b60075481565b60065481565b6113d1838383604051806020016040528060008152506125de565b600090815260056020526040902054151590565b6000611d7b6118de565b8210611d8657600080fd5b60018281548110611d9357fe5b90600052602060002001549050919050565b600b546001600160a01b031690565b60006060611dc1836118e4565b51949350505050565b6000826001600160a01b0316846001600160a01b03161480611e065750836001600160a01b0316611dfb8385612b15565b6001600160a01b0316145b80611e165750611e168385612b3e565b80611e255750611e258461184c565b949350505050565b60086020526000908152604090205481565b600654600754604080516020808201939093526001600160a01b03808c16828401528a16606080830191909152608082018a905260a0820189905287151560c0808401919091528351808403909101815260e08301845280519085012061190160f01b61010084015261010283019590955261012280830195909552825180830390950185526101428201808452855195850195909520610162601f880186900490950283018501909352858552919360009384938493909291899189918291018382808284376000920182905250602085015160408601516060870151919a509850901a95509293505050601b8310159050611f3d57601b820191505b60008260ff16601b14158015611f5757508260ff16601c14155b15611f6457506000611fc8565b6040805160008152602080820180845289905260ff8616828401526060820188905260808201879052915160019260a0808401939192601f1981019281900390910190855afa158015611fbb573d6000803e3d6000fd5b5050506020604051035190505b6001600160a01b038d16612023576040805162461bcd60e51b815260206004820152601c60248201527f486f6c6465722063616e2774206265207a65726f206164647265737300000000604482015290519081900360640190fd5b806001600160a01b03168d6001600160a01b031614612089576040805162461bcd60e51b815260206004820152601960248201527f5369676e6572206164647265737320697320696e76616c696400000000000000604482015290519081900360640190fd5b8915806120965750894211155b6120dc576040805162461bcd60e51b815260206004820152601260248201527114195c9b5a5cdcda5bdb88195e1c1a5c995960721b604482015290519081900360640190fd5b6001600160a01b038d1660009081526008602052604090208054600181019091558b14612143576040805162461bcd60e51b815260206004820152601060248201526f139bdb98d9481a5cc81a5b9d985b1a5960821b604482015290519081900360640190fd5b88600360008f6001600160a01b03166001600160a01b0316815260200190815260200160002060008e6001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff0219169083151502179055508b6001600160a01b03168d6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318b604051808215151515815260200191505060405180910390a350505050505050505050505050565b81518351146122415760405162461bcd60e51b81526004018080602001828103825260368152602001806143f06036913960400191505060405180910390fd5b60008111612284576040805162461bcd60e51b815260206004820152601b6024820152600080516020614329833981519152604482015290519081900360640190fd5b60008351116122c8576040805162461bcd60e51b815260206004820152601b6024820152600080516020614329833981519152604482015290519081900360640190fd5b6122d183612e9b565b61230c5760405162461bcd60e51b81526004018080602001828103825260218152602001806145296021913960400191505060405180910390fd5b60005b83518110156123635761235b3385838151811061232857fe5b60200260200101516123568587868151811061234057fe5b602002602001015161382a90919063ffffffff16565b612f00565b60010161230f565b506000838360405160200180838051906020019060200280838360005b83811015612398578181015183820152602001612380565b50505050905001828051906020019060200280838360005b838110156123c85781810151838201526020016123b0565b50505050905001925050506040516020818303038152906040528051906020012060001c90506123f9818585613212565b611841813384613300565b60408051808201909152600381526204f4e560ec1b602082015290565b600b60009054906101000a90046001600160a01b03166001600160a01b031663da4fbe526040518163ffffffff1660e01b815260040160206040518083038186803b15801561246f57600080fd5b505afa158015612483573d6000803e3d6000fd5b505050506040513d602081101561249957600080fd5b50516040805180820190915260208082527f5553494e475f52454749535452593a4f4e4c595f434f52455f414c4c4f57454490820152906001600160a01b031633146125635760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612528578181015183820152602001612510565b50505050905090810190601f1680156125555780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506118418484848461388a565b3360008181526003602090815260408083206001600160a01b03871680855290835292819020805460ff1916861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b600980546001908101918290556125fa90869086908690612d2f565b612606858585856138a0565b6126415760405162461bcd60e51b81526004018080602001828103825260328152602001806144596032913960400191505060405180910390fd5b6009548114612697576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b5050505050565b81518351146126de5760405162461bcd60e51b81526004018080602001828103825260368152602001806143f06036913960400191505060405180910390fd5b60008111612721576040805162461bcd60e51b815260206004820152601b6024820152600080516020614329833981519152604482015290519081900360640190fd5b6000835111612765576040805162461bcd60e51b815260206004820152601b6024820152600080516020614329833981519152604482015290519081900360640190fd5b61276e83612e9b565b6127a95760405162461bcd60e51b81526004018080602001828103825260218152602001806145296021913960400191505060405180910390fd5b6000838360405160200180838051906020019060200280838360005b838110156127dd5781810151838201526020016127c5565b50505050905001828051906020019060200280838360005b8381101561280d5781810151838201526020016127f5565b50505050905001925050506040516020818303038152906040528051906020012060001c9050848114612887576040805162461bcd60e51b815260206004820152601f60248201527f544f4b454e5f4d494e5445523a57524f4e475f504f5254464f4c494f5f494400604482015290519081900360640190fd5b612892338684612f00565b60005b8451811015611cf4576128cb8582815181106128ad57fe5b6020026020010151336128c68688868151811061234057fe5b613300565b600101612895565b60606128de82611d5d565b612925576040805162461bcd60e51b8152602060048201526013602482015272151bdad95b88191bd95cdb89dd08195e1a5cdd606a1b604482015290519081900360640190fd5b600a612930836139d3565b604051602001808380546001816001161561010002031660029004801561298e5780601f1061296c57610100808354040283529182019161298e565b820191906000526020600020905b81548152906001019060200180831161297a575b5050825160208401908083835b602083106129ba5780518252601f19909201916020918201910161299b565b5181516020939093036101000a600019018019909116921691909117905264173539b7b760d91b92019182525060408051808303601a190181526005909201905295945050505050565b600b60009054906101000a90046001600160a01b03166001600160a01b031663da4fbe526040518163ffffffff1660e01b815260040160206040518083038186803b158015612a5257600080fd5b505afa158015612a66573d6000803e3d6000fd5b505050506040513d6020811015612a7c57600080fd5b50516040805180820190915260208082527f5553494e475f52454749535452593a4f4e4c595f434f52455f414c4c4f57454490820152906001600160a01b03163314612b095760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315612528578181015183820152602001612510565b506113d1838383613a94565b60009182526004602090815260408084206001600160a01b039384168552909152909120541690565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205460ff1690565b6009805460010190819055612b8386868686612d2f565b612b908686868686613b20565b611c9e5760405162461bcd60e51b81526004018080602001828103825260338152602001806144266033913960400191505060405180910390fd5b600b60009054906101000a90046001600160a01b03166001600160a01b031663da4fbe526040518163ffffffff1660e01b815260040160206040518083038186803b158015612c1957600080fd5b505afa158015612c2d573d6000803e3d6000fd5b505050506040513d6020811015612c4357600080fd5b50516040805180820190915260208082527f5553494e475f52454749535452593a4f4e4c595f434f52455f414c4c4f57454490820152906001600160a01b03163314612cd05760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315612528578181015183820152602001612510565b506113d1838383612f00565b6118418484848460405180602001604052806000815250611ab9565b61184184848484612d2f565b610100602082020491600790911690565b600181016020026101000382901c63ffffffff1692915050565b612d3a338584611dca565b612d7a576040805162461bcd60e51b815260206004820152600c60248201526b139bdd08185c1c1c9bdd995960a21b604482015290519081900360640190fd5b612d8484836112fa565b811115612dc25760405162461bcd60e51b81526004018080602001828103825260228152602001806145726022913960400191505060405180910390fd5b6001600160a01b038316612e12576040805162461bcd60e51b8152602060048201526012602482015271496e76616c696420746f206164647265737360701b604482015290519081900360640190fd5b612e1f8483836001613c7a565b612e2c8383836000613c7a565b81836001600160a01b0316856001600160a01b031660008051602061450983398151915260405160405180910390a481836001600160a01b0316856001600160a01b03166000805160206143ad833981519152846040518082815260200191505060405180910390a450505050565b8051600090815b81811015612ef657600080612eca86878581518110612ebd57fe5b6020026020010151613cf1565b91509150808015612eda57508282105b15612eec57600094505050505061136a565b5050600101612ea2565b5060019392505050565b6000612f0c84846112fa565b905081811015612f4d5760405162461bcd60e51b81526004018080602001828103825260218152602001806144ac6021913960400191505060405180910390fd5b612f5a8484846001613c7a565b60405183906000906001600160a01b03871690600080516020614509833981519152908390a460408051838152905184916000916001600160a01b038816916000805160206143ad833981519152919081900360200190a450505050565b606080612fcb878663ffffffff613d4316565b909250905060005b825181101561181b576000828281518110612fea57fe5b6020026020010151905061301c89828151811061300357fe5b6020026020010151336128c6888c868151811061234057fe5b50600101612fd3565b606080613038858863ffffffff613d4316565b909250905060005b825181101561181b57600082828151811061305757fe5b602002602001015190506130893388838151811061307157fe5b6020026020010151612356888a868151811061234057fe5b50600101613040565b606080806130a6888763ffffffff613ec216565b9194509250905060005b83518110156132075760008382815181106130c757fe5b6020026020010151905060008383815181106130df57fe5b602002602001015190508781815181106130f557fe5b60200260200101518a838151811061310957fe5b6020026020010151111561317557600088828151811061312557fe5b60200260200101518b848151811061313957fe5b602002602001015103905061316f8c848151811061315357fe5b6020026020010151336128c68b8561382a90919063ffffffff16565b506131fd565b87818151811061318157fe5b60200260200101518a838151811061319557fe5b602002602001015110156131fd5760008a83815181106131b157fe5b60200260200101518983815181106131c557fe5b60200260200101510390506131fb338d85815181106131e057fe5b60200260200101516123568b8561382a90919063ffffffff16565b505b50506001016130b0565b505050505050505050565b61321b83611d5d565b6113d157600260056000858152602001908152602001600020819055507f942e21426178d7f44f5fc38ad086c24504b41d256a2f125368d8e097de99fd8c838383604051808481526020018060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156132a657818101518382015260200161328e565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156132e55781810151838201526020016132cd565b505050509050019550505050505060405180910390a1505050565b61330983611d5d565b6133505760008381526005602052604081206001908190558054808201825591527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6018390555b61335d8284836000613c7a565b60405183906001600160a01b03841690600090600080516020614509833981519152908290a460408051828152905184916001600160a01b038516916000916000805160206143ad833981519152919081900360200190a4505050565b83336001600160a01b03821614806133f557506001600160a01b038116600090815260036020908152604080832033845290915290205460ff165b6134305760405162461bcd60e51b815260040180806020018281038252602881526020018061454a6028913960400191505060405180910390fd5b81518351146134705760405162461bcd60e51b81526004018080602001828103825260268152602001806143496026913960400191505060405180910390fd5b6001600160a01b0384166134c0576040805162461bcd60e51b8152602060048201526012602482015271496e76616c696420746f206164647265737360701b604482015290519081900360640190fd5b82516001600160a01b0386811690861614156135925760005b8181101561358b578481815181106134ed57fe5b6020026020010151866001600160a01b0316886001600160a01b031660008051602061450983398151915260405160405180910390a484818151811061352f57fe5b6020026020010151866001600160a01b0316886001600160a01b03166000805160206143ad83398151915287858151811061356657fe5b60200260200101516040518082815260200191505060405180910390a46001016134d9565b5050612697565b60005b8181101561371b576135ba878683815181106135ad57fe5b60200260200101516112fa565b8482815181106135c657fe5b6020026020010151111561360b5760405162461bcd60e51b81526004018080602001828103825260228152602001806145726022913960400191505060405180910390fd5b61363e8786838151811061361b57fe5b602002602001015186848151811061362f57fe5b60200260200101516001613c7a565b6136718686838151811061364e57fe5b602002602001015186848151811061366257fe5b60200260200101516000613c7a565b84818151811061367d57fe5b6020026020010151866001600160a01b0316886001600160a01b031660008051602061450983398151915260405160405180910390a48481815181106136bf57fe5b6020026020010151866001600160a01b0316886001600160a01b03166000805160206143ad8339815191528785815181106136f657fe5b60200260200101516040518082815260200191505060405180910390a4600101613595565b50846001600160a01b0316866001600160a01b03167ff59807b2c31ca3ba212e90599175c120c556422950bac5be656274483e8581df8686604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561379757818101518382015260200161377f565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156137d65781810151838201526020016137be565b5050505090500194505050505060405180910390a3505050505050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708115801590611e255750141592915050565b60008261383957506000611346565b8282028284828161384657fe5b04146138835760405162461bcd60e51b815260040180806020018281038252602181526020018061448b6021913960400191505060405180910390fd5b9392505050565b613895848383613a94565b611841838383614098565b60006138b4846001600160a01b03166137f3565b6138c057506001611e25565b604051630a85bd0160e11b815233600482018181526001600160a01b03888116602485015260448401879052608060648501908152865160848601528651600095928a169463150b7a029490938c938b938b939260a4019060208501908083838e5b8381101561393a578181015183820152602001613922565b50505050905090810190601f1680156139675780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b15801561398957600080fd5b505af115801561399d573d6000803e3d6000fd5b505050506040513d60208110156139b357600080fd5b50516001600160e01b031916630a85bd0160e11b14915050949350505050565b6060816139f857506040805180820190915260018152600360fc1b602082015261136a565b8160005b8115613a1057600101600a820491506139fc565b6060816040519080825280601f01601f191660200182016040528015613a3d576020820181803883390190505b50905060001982015b8515613a8b57600a860660300160f81b82828060019003935081518110613a6957fe5b60200101906001600160f81b031916908160001a905350600a86049550613a46565b50949350505050565b6000827356c54b408c44b12f6c9219c9c73fcda4e783fc2063a085725990916040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015613ae757600080fd5b505af4158015613afb573d6000803e3d6000fd5b505050506040513d6020811015613b1157600080fd5b50519050611841818584613300565b6000613b34856001600160a01b03166137f3565b613b4057506001613c71565b6000856001600160a01b031663f891ffe033898888886040518663ffffffff1660e01b815260040180866001600160a01b03166001600160a01b03168152602001856001600160a01b03166001600160a01b0316815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015613bde578181015183820152602001613bc6565b50505050905090810190601f168015613c0b5780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600087803b158015613c2e57600080fd5b505af1158015613c42573d6000803e3d6000fd5b505050506040513d6020811015613c5857600080fd5b50516001600160e01b0319166307c48fff60e51b149150505b95945050505050565b600080613c8685612d04565b6001600160a01b03881660009081526002602090815260408083208584529091529020549193509150613cc19082868663ffffffff6140eb16565b6001600160a01b039096166000908152600260209081526040808320948352939052919091209490945550505050565b81516000908190815b81811015613d325784868281518110613d0f57fe5b60200260200101511415613d2a57925060019150613d3c9050565b600101613cfa565b5060009250829150505b9250929050565b606080600084519050606081604051908082528060200260200182016040528015613d78578160200160208202803883390190505b5090506000805b83811015613ddb576000888281518110613d9557fe5b60200260200101519050613da988826141c3565b613dd2576001848381518110613dbb57fe5b911515602092830291909101909101526001909201915b50600101613d7f565b50606081604051908082528060200260200182016040528015613e08578160200160208202803883390190505b509050606082604051908082528060200260200182016040528015613e37578160200160208202803883390190505b5090506000805b86811015613eb257858181518110613e5257fe5b602002602001015115613eaa578a8181518110613e6b57fe5b6020026020010151848381518110613e7f57fe5b60200260200101818152505080838381518110613e9857fe5b60209081029190910101526001909101905b600101613e3e565b5091999098509650505050505050565b6060806060600085519050606081604051908082528060200260200182016040528015613ef9578160200160208202803883390190505b5090506000805b83811015613f5757613f25888a8381518110613f1857fe5b60200260200101516141c3565b15613f4f576001838281518110613f3857fe5b911515602092830291909101909101526001909101905b600101613f00565b50606081604051908082528060200260200182016040528015613f84578160200160208202803883390190505b509050606082604051908082528060200260200182016040528015613fb3578160200160208202803883390190505b509050606083604051908082528060200260200182016040528015613fe2578160200160208202803883390190505b5090506000805b8781101561408657868181518110613ffd57fe5b60200260200101511561407e578c818151811061401657fe5b602002602001015185838151811061402a57fe5b6020026020010181815250508084838151811061404357fe5b60200260200101818152505061405f8c8e8381518110612ebd57fe5b5083838151811061406c57fe5b60209081029190910101526001909101905b600101613fe9565b50929b919a5098509650505050505050565b6000827356c54b408c44b12f6c9219c9c73fcda4e783fc20635b667cf990916040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015613ae757600080fd5b600080808360028111156140fb57fe5b141561412e5761410b8686612d15565b90506141278686614122848863ffffffff6141d016565b61422a565b9150613a8b565b600183600281111561413c57fe5b14156141635761414c8686612d15565b90506141278686614122848863ffffffff61429116565b600283600281111561417157fe5b14156141825761412786868661422a565b6040805162461bcd60e51b815260206004820152601160248201527024b73b30b634b21037b832b930ba34b7b760791b604482015290519081900360640190fd5b6000806113418484613cf1565b600082820183811015613883576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6000600160201b821061426e5760405162461bcd60e51b81526004018080602001828103825260238152602001806143cd6023913960400191505060405180910390fd5b5063ffffffff600183016020026101000390811b1984169082901b179392505050565b600061388383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250600081848411156143205760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315612528578181015183820152602001612510565b50505090039056fe544f4b454e5f4d494e5445523a57524f4e475f5155414e544954590000000000496e636f6e73697374656e74206172726179206c656e677468206265747765656e2061726773544f4b454e5f4d494e5445523a494e495449414c5f544f4b454e5f4944535f414e445f524154494f5f4c454e4754485f444f45535f4e4f545f4d415443482114851a3e2a54429989f46c1ab0743e37ded205d9bbdfd85635aed5bd595a06416d6f756e7420746f20777269746520696e2062696e20697320746f6f206c61726765544f4b454e5f4d494e5445523a544f4b454e5f4944535f414e445f524154494f5f4c454e4754485f444f45535f4e4f545f4d4154434853656e7420746f206120636f6e7472616374207768696368206973206e6f7420616e204552433732314f20726563656976657253656e7420746f206120636f6e7472616374207768696368206973206e6f7420616e20455243373231207265636569766572536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77544f4b454e5f4d494e5445523a4e4f545f454e4f5547485f504f534954494f4e53544f4b454e5f4d494e5445523a46494e414c5f544f4b454e5f4944535f414e445f524154494f5f4c454e4754485f444f45535f4e4f545f4d41544348ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef544f4b454e5f4d494e5445523a544f4b454e5f4944535f4e4f545f554e495155456d73672e73656e646572206973206e656974686572205f66726f6d206e6f72206f70657261746f725175616e746974792067726561746572207468616e2066726f6d2062616c616e6365a265627a7a723158206a1940fe777b8e63309c21dd7e676ea6257c61bdc096c85c9b740ba169001d6764736f6c63430005100032
Deployed Bytecode Sourcemap
62572:3175:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;62572:3175:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31135:224;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;31135:224:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;17113:135;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;17113:135:0;-1:-1:-1;;;;;;17113:135:0;;:::i;:::-;;;;;;;;;;;;;;;;;;64435:110;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;64435:110:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54154:166;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;54154:166:0;;:::i;:::-;;;;-1:-1:-1;;;;;54154:166:0;;;;;;;;;;;;;;39051:135;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;39051:135:0;;;;;;;;;;;;;:::i;:::-;;35473:219;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;35473:219:0;;;;;;;;:::i;46831:1692::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;46831:1692:0;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;46831:1692:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;46831:1692: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;46831:1692:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;46831:1692:0;;;;;;;;-1:-1:-1;46831:1692:0;;-1:-1:-1;;;;;5:28;;2:2;;;46:1;43;36:12;2:2;46831:1692:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;46831:1692: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;46831:1692:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;46831:1692:0;;;;;;;;-1:-1:-1;46831:1692:0;;-1:-1:-1;;;;;5:28;;2:2;;;46:1;43;36:12;2:2;46831:1692:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;46831:1692: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;46831:1692:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;46831:1692:0;;;;;;;;-1:-1:-1;46831:1692:0;;-1:-1:-1;;;;;5:28;;2:2;;;46:1;43;36:12;2:2;46831:1692:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;46831:1692: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;46831:1692:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;46831:1692:0;;-1:-1:-1;;46831:1692:0;;;-1:-1:-1;46831:1692:0;;-1:-1:-1;;46831:1692:0:i;39347:160::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;39347:160:0;;;;;;;;;;;;;;;;;;;;;;:::i;52088:79::-;;;:::i;65611:133::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;65611:133:0;-1:-1:-1;;;;;65611:133:0;;:::i;37525:207::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;37525:207:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;37525:207:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;37525:207: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;37525:207:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;37525:207:0;;;;;;;;-1:-1:-1;37525:207:0;;-1:-1:-1;;;;;5:28;;2:2;;;46:1;43;36:12;2:2;37525:207:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;37525:207: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;37525:207:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;37525:207:0;;-1:-1:-1;37525:207:0;;-1:-1:-1;;;;;37525:207:0:i;31507:89::-;;;:::i;31891:935::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;31891:935:0;-1:-1:-1;;;;;31891:935:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;31891:935: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;31891:935:0;;;;;;;;;;;;;;;;;;;54780:126;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;54780:126:0;;;;;;;;;;;;;;;;;:::i;38283:539::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;38283:539:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;38283:539:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;38283:539: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;38283:539:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;38283:539:0;;;;;;;;-1:-1:-1;38283:539:0;;-1:-1:-1;;;;;5:28;;2:2;;;46:1;43;36:12;2:2;38283:539:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;38283:539: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;38283:539:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;38283:539:0;;;;;;;;-1:-1:-1;38283:539:0;;-1:-1:-1;;;;;5:28;;2:2;;;46:1;43;36:12;2:2;38283:539:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;38283:539: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;38283:539:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;38283:539:0;;-1:-1:-1;38283:539:0;;-1:-1:-1;;;;;38283:539:0:i;53395:228::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;53395:228:0;;;;;;;;:::i;29724:30::-;;;:::i;29688:31::-;;;:::i;54326:134::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;54326:134:0;;;;;;;;;;;;;;;;;:::i;30798:112::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30798:112:0;;:::i;53246:143::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;53246:143:0;;:::i;62271:98::-;;;:::i;52712:162::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;52712:162:0;-1:-1:-1;;;;;52712:162:0;;:::i;65132:344::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;65132:344:0;;;;;;;;;;;;;;;;;:::i;29843:39::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29843:39:0;-1:-1:-1;;;;;29843:39:0;;:::i;33307:1751::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;33307:1751:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;33307:1751:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;33307:1751: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;-1:-1;33307:1751:0;;-1:-1:-1;33307:1751:0;-1:-1:-1;33307:1751:0;:::i;45224:777::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;45224:777:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;45224:777:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;45224:777: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;45224:777:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;45224:777:0;;;;;;;;-1:-1:-1;45224:777:0;;-1:-1:-1;;;;;5:28;;2:2;;;46:1;43;36:12;2:2;45224:777:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;45224:777: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;45224:777:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;45224:777:0;;-1:-1:-1;;45224:777:0;;;-1:-1:-1;45224:777:0;;-1:-1:-1;;45224:777:0:i;64685:87::-;;;:::i;63293:178::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;63293:178:0;;;;;;;;;;;;;;;;;;;;;;:::i;33040:217::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;33040:217:0;;;;;;;;;;:::i;54466:308::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;54466:308:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;54466:308:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;54466:308: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;54466:308:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;54466:308:0;;-1:-1:-1;54466:308:0;;-1:-1:-1;;;;;54466:308:0:i;46007:818::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;46007:818:0;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;46007:818:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;46007:818: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;46007:818:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;46007:818:0;;;;;;;;-1:-1:-1;46007:818:0;;-1:-1:-1;;;;;5:28;;2:2;;;46:1;43;36:12;2:2;46007:818:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;46007:818: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;46007:818:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;46007:818:0;;-1:-1:-1;;46007:818:0;;;-1:-1:-1;46007:818:0;;-1:-1:-1;;46007:818:0:i;53667:253::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;53667:253:0;;:::i;63762:156::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;63762:156:0;;;;;;;;;;;;;:::i;35926:147::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35926:147:0;;;;;;-1:-1:-1;;;;;35926:147:0;;:::i;36394:::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;36394:147:0;;;;;;;;;;:::i;39513:341::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;39513:341:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;39513:341:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;39513:341: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;39513:341:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;39513:341:0;;-1:-1:-1;39513:341:0;;-1:-1:-1;;;;;39513:341:0:i;64151:148::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;64151:148:0;;;;;;;;;;;;;:::i;38828:217::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;38828:217:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;38828:217:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;38828:217: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;38828:217:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;38828:217:0;;;;;;;;-1:-1:-1;38828:217:0;;-1:-1:-1;;;;;5:28;;2:2;;;46:1;43;36:12;2:2;38828:217:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;38828:217: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;38828:217:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;38828:217:0;;-1:-1:-1;38828:217:0;;-1:-1:-1;;;;;38828:217:0:i;39192:149::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;39192:149:0;;;;;;;;;;;;;;;;;;;;;;:::i;31135:224::-;31211:7;31228:11;31241:13;31258:27;:8;:25;:27::i;:::-;-1:-1:-1;;;;;31299:28:0;;;;;;:18;:28;;;;;;;;:33;;;;;;;;;31227:58;;-1:-1:-1;31227:58:0;-1:-1:-1;31299:54:0;;31227:58;31299:54;:47;:54;:::i;:::-;31292:61;;;;31135:224;;;;;:::o;17113:135::-;-1:-1:-1;;;;;;17207:33:0;;17183:4;17207:33;;;;;;;;;;;;;17113:135;;;;:::o;64435:110::-;64500:37;;;;;;;;;;;;;;;;;64435:110;:::o;54154:166::-;54214:7;54234:16;54241:8;54234:6;:16::i;:::-;54230:59;;;-1:-1:-1;54276:4:0;54261:20;;54230:59;-1:-1:-1;54312:1:0;54154:166;;;:::o;39051:135::-;39131:49;39145:10;39157:3;39162:8;39172:7;39131:13;:49::i;:::-;39051:135;;;:::o;35473:219::-;-1:-1:-1;;;;;35543:17:0;;35550:10;35543:17;;35535:55;;;;;-1:-1:-1;;;35535:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;35597:24;;;;:14;:24;;;;;;;;35622:10;35597:36;;;;;;;;:42;;-1:-1:-1;;;;;;35597:42:0;-1:-1:-1;;;;;35597:42:0;;;;;;;;35651:35;;35597:24;;:42;;35622:10;35651:35;;;35473:219;;:::o;46831:1692::-;47115:18;:25;47088:16;:23;:52;47080:127;;;;-1:-1:-1;;;47080:127:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47247:16;:23;47222:14;:21;:48;47214:121;;;;-1:-1:-1;;;47214:121:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47362:1;47350:9;:13;47342:53;;;;;-1:-1:-1;;;47342:53:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;47342:53:0;;;;;;;;;;;;;;;47436:1;47410:16;:23;:27;47402:67;;;;;-1:-1:-1;;;47402:67:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;47402:67:0;;;;;;;;;;;;;;;47508:1;47484:14;:21;:25;47476:65;;;;;-1:-1:-1;;;47476:65:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;47476:65:0;;;;;;;;;;;;;;;47556:27;:16;:25;:27::i;:::-;47548:73;;;;-1:-1:-1;;;47548:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47636:25;:14;:23;:25::i;:::-;47628:71;;;;-1:-1:-1;;;47628:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47708:22;47776:16;47801:18;47751:75;;;;;;;;;;;;;;;;;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;47751:75: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;47751:75:0;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;47751:75:0;;;47741:86;;;;;;47733:95;;47708:120;;47863:12;47845:14;:30;47837:74;;;;;-1:-1:-1;;;47837:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;47918:42;47924:10;47936:12;47950:9;47918:5;:42::i;:::-;47973:94;47985:16;48003:18;48023:14;48039:16;48057:9;47973:11;:94::i;:::-;48074:92;48084:16;48102:18;48122:14;48138:16;48156:9;48074;:92::i;:::-;48173:91;48182:16;48200:18;48220:14;48236:16;48254:9;48173:8;:91::i;:::-;48273:22;48341:14;48364:16;48316:71;;;;;;;;;;;;;;;;;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;48316:71: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;48316:71:0;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;48316:71:0;;;48306:82;;;;;;48298:91;;48273:116;;48398:68;48417:14;48433;48449:16;48398:18;:68::i;:::-;48473:44;48479:14;48495:10;48507:9;48473:5;:44::i;:::-;46831:1692;;;;;;;;:::o;39347:160::-;39450:51;39467:5;39474:3;39479:8;39489:7;39450:51;;;;;;;;;;;;:16;:51::i;:::-;39347:160;;;;:::o;52088:79::-;52157:4;52088:79;:::o;65611:133::-;65710:8;;:26;;;-1:-1:-1;;;65710:26:0;;;;65674:4;;-1:-1:-1;;;;;65710:8:0;;:24;;:26;;;;;;;;;;;;;;:8;:26;;;5:2:-1;;;;30:1;27;20:12;5:2;65710:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;65710:26:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;65710:26:0;-1:-1:-1;;;;;65698:38:0;;;;;;;-1:-1:-1;65611:133:0;;;:::o;37525:207::-;37675:51;37694:5;37701:3;37706:9;37717:8;37675:18;:51::i;31507:89::-;31574:9;:16;31507:89;:::o;31891:935::-;31949:24;31975:25;32009:17;32029:13;:11;:13::i;:::-;32009:33;;32049:29;32095:9;32081:24;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;32081:24:0;;32049:56;;32112:27;32156:9;32142:24;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;32142:24:0;-1:-1:-1;32112:54:0;-1:-1:-1;32175:13:0;;32195:256;32219:9;32215:1;:13;32195:256;;;32244:15;32262:9;32272:1;32262:12;;;;;;;;;;;;;;;;32244:30;;32316:1;32287:26;32297:6;32305:7;32287:9;:26::i;:::-;:30;32283:161;;;32350:26;32360:6;32368:7;32350:9;:26::i;:::-;32330:10;32341:5;32330:17;;;;;;;;;;;;;:46;;;;;32409:7;32387:12;32400:5;32387:19;;;;;;;;;;;;;;;;;:29;32427:7;;;;;32283:161;-1:-1:-1;32230:3:0;;32195:256;;;;32510:29;32556:5;32542:20;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;32542:20:0;;32510:52;;32569:36;32622:5;32608:20;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;32608:20:0;-1:-1:-1;32569:59:0;-1:-1:-1;32642:9:0;32637:133;32661:5;32657:1;:9;32637:133;;;32700:10;32711:1;32700:13;;;;;;;;;;;;;;32682:12;32695:1;32682:15;;;;;;;;;;;;;:31;;;;;32747:12;32760:1;32747:15;;;;;;;;;;;;;;32722:19;32742:1;32722:22;;;;;;;;;;;;;;;;;:40;32668:3;;32637:133;;;-1:-1:-1;32786:19:0;-1:-1:-1;32807:12:0;-1:-1:-1;;;;;31891:935:0;;;:::o;54780:126::-;54862:38;54876:5;54883:3;54888:8;54898:1;54862:13;:38::i;38283:539::-;15099:13;:18;;15116:1;15099:18;;;;;38500:51;38519:5;38526:3;38531:9;38542:8;38500:18;:51::i;:::-;38607:16;:3;-1:-1:-1;;;;;38607:14:0;;:16::i;:::-;38603:214;;;38634:13;38667:3;-1:-1:-1;;;;;38650:44:0;;38705:10;38717:5;38724:9;38735:8;38745:5;38650:109;;;;;;;;;;;;;-1:-1:-1;;;;;38650:109:0;-1:-1:-1;;;;;38650:109:0;;;;;;-1:-1:-1;;;;;38650:109:0;-1:-1:-1;;;;;38650:109: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;38650:109: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;38650:109: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;38650:109:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38650:109:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38650:109:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38650:109:0;;-1:-1:-1;;;;;;;38776:32:0;;-1:-1:-1;;;38776:32:0;38768:41;;;;;;38603:214;;15211:13;;15195:12;:29;15187:73;;;;;-1:-1:-1;;;15187:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;38283:539;;;;;;:::o;53395:228::-;53477:16;53505:23;53532:19;53544:6;53532:11;:19::i;:::-;53502:49;;;53575:6;:13;53566:6;:22;53558:31;;;;;;53603:6;53610;53603:14;;;;;;;;;;;;;;53596:21;;;53395:228;;;;:::o;29724:30::-;;;;:::o;29688:31::-;;;;:::o;54326:134::-;54412:42;54429:5;54436:3;54441:8;54412:42;;;;;;;;;;;;:16;:42::i;30798:112::-;30853:4;30873:20;;;:10;:20;;;;;;:31;;;30798:112::o;53246:143::-;53305:7;53338:13;:11;:13::i;:::-;53329:6;:22;53321:31;;;;;;53366:9;53376:6;53366:17;;;;;;;;;;;;;;;;53359:24;;53246:143;;;:::o;62271:98::-;62352:8;;-1:-1:-1;;;;;62352:8:0;62271:98;:::o;52712:162::-;52768:15;52795:23;52822:19;52834:6;52822:11;:19::i;:::-;52855:13;;52712:162;-1:-1:-1;;;;52712:162:0:o;65132:344::-;65266:4;65313:6;-1:-1:-1;;;;;65301:18:0;:8;-1:-1:-1;;;;;65301:18:0;;:72;;;;65365:8;-1:-1:-1;;;;;65332:41:0;:29;65344:8;65354:6;65332:11;:29::i;:::-;-1:-1:-1;;;;;65332:41:0;;65301:72;:119;;;;65386:34;65403:6;65411:8;65386:16;:34::i;:::-;65301:156;;;;65433:24;65448:8;65433:14;:24::i;:::-;65283:185;65132:344;-1:-1:-1;;;;65132:344:0:o;29843:39::-;;;;;;;;;;;;;:::o;33307:1751::-;33554:16;;33614:15;;33591:150;;;;;;;;;;;-1:-1:-1;;;;;33591:150:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;33591:150:0;;;;;33581:161;;;;;;-1:-1:-1;;;33506:243:0;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;33506:243:0;;;;;;33496:254;;;;;;;;;34038:35;;;;;;;;;;;;;;;;;;;;33496:254;;33472:14;;;;;;33591:150;;33506:243;34063:10;;;;;;34038:35;34063:10;;;;34038:35;1:33:-1;99:1;81:16;;74:27;;;-1:-1;34126:2:0;34111:18;;34105:25;34164:2;34149:18;;34143:25;34210:2;34195:18;;34189:25;34105;;-1:-1:-1;34143:25:0;-1:-1:-1;34181:34:0;;;-1:-1:-1;34038:35:0;;-1:-1:-1;;;34326:2:0;34322:6;;34318:36;;-1:-1:-1;34318:36:0;;34344:2;34339:7;;;;34318:36;34362:24;34459:1;:7;;34464:2;34459:7;;:18;;;;;34470:1;:7;;34475:2;34470:7;;34459:18;34455:186;;;-1:-1:-1;34515:1:0;34455:186;;;34607:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;34607:26:0;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34607:26:0;;;;;;;;34588:45;;34455:186;-1:-1:-1;;;;;34657:21:0;;34649:62;;;;;-1:-1:-1;;;34649:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;34737:16;-1:-1:-1;;;;;34726:27:0;:7;-1:-1:-1;;;;;34726:27:0;;34718:65;;;;;-1:-1:-1;;;34718:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;34798:12;;;:30;;;34821:7;34814:3;:14;;34798:30;34790:61;;;;;-1:-1:-1;;;34790:61:0;;;;;;;;;;;;-1:-1:-1;;;34790:61:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;34876:15:0;;;;;;:6;:15;;;;;:17;;;;;;;;34866:27;;34858:56;;;;;-1:-1:-1;;;34858:56:0;;;;;;;;;;;;-1:-1:-1;;;34858:56:0;;;;;;;;;;;;;;;34989:8;34958:9;:18;34968:7;-1:-1:-1;;;;;34958:18:0;-1:-1:-1;;;;;34958:18:0;;;;;;;;;;;;:28;34977:8;-1:-1:-1;;;;;34958:28:0;-1:-1:-1;;;;;34958:28:0;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;35033:8;-1:-1:-1;;;;;35009:43:0;35024:7;-1:-1:-1;;;;;35009:43:0;;35043:8;35009:43;;;;;;;;;;;;;;;;;;;;;;33307:1751;;;;;;;;;;;;;:::o;45224:777::-;45360:11;:18;45340:9;:16;:38;45332:105;;;;-1:-1:-1;;;45332:105:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45464:1;45452:9;:13;45444:53;;;;;-1:-1:-1;;;45444:53:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;45444:53:0;;;;;;;;;;;;;;;45531:1;45512:9;:16;:20;45504:60;;;;;-1:-1:-1;;;45504:60:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;45504:60:0;;;;;;;;;;;;;;;45579:20;:9;:18;:20::i;:::-;45571:66;;;;-1:-1:-1;;;45571:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45651:9;45646:126;45670:9;:16;45666:1;:20;45646:126;;;45702:62;45708:10;45720:9;45730:1;45720:12;;;;;;;;;;;;;;45734:29;45753:9;45734:11;45746:1;45734:14;;;;;;;;;;;;;;:18;;:29;;;;:::i;:::-;45702:5;:62::i;:::-;45688:3;;45646:126;;;;45780:19;45845:9;45863:11;45820:61;;;;;;;;;;;;;;;;;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;45820:61: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;45820:61:0;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;45820:61:0;;;45810:72;;;;;;45802:81;;45780:103;;45892:55;45911:11;45924:9;45935:11;45892:18;:55::i;:::-;45954:41;45960:11;45973:10;45985:9;45954:5;:41::i;64685:87::-;64752:12;;;;;;;;;;;;-1:-1:-1;;;64752:12:0;;;;64685:87;:::o;63293:178::-;61865:8;;;;;;;;;-1:-1:-1;;;;;61865:8:0;-1:-1:-1;;;;;61865:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;61865:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;61865:18:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;61865:18:0;61885:38;;;;;;;;;61865:18;61885:38;;;;;;;;;-1:-1:-1;;;;;61851:32:0;:10;:32;61843:81;;;;-1:-1:-1;;;61843:81: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;61843:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63413:50;63419:6;63427:7;63436:15;63453:9;63413:5;:50::i;33040:217::-;33157:10;33147:21;;;;:9;:21;;;;;;;;-1:-1:-1;;;;;33147:32:0;;;;;;;;;;;;:44;;-1:-1:-1;;33147:44:0;;;;;;;;;;33203:48;;;;;;;33147:32;;33157:10;33203:48;;;;;;;;;;;33040:217;;:::o;54466:308::-;15099:13;:18;;15116:1;15099:18;;;;;;;54585:38;;54599:5;;54606:3;;54611:8;;54585:13;:38::i;:::-;54646:54;54672:5;54679:3;54684:8;54694:5;54646:25;:54::i;:::-;54630:138;;;;-1:-1:-1;;;54630:138:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15211:13;;15195:12;:29;15187:73;;;;;-1:-1:-1;;;15187:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;54466:308;;;;;:::o;46007:818::-;46167:11;:18;46147:9;:16;:38;46139:105;;;;-1:-1:-1;;;46139:105:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46271:1;46259:9;:13;46251:53;;;;;-1:-1:-1;;;46251:53:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;46251:53:0;;;;;;;;;;;;;;;46338:1;46319:9;:16;:20;46311:60;;;;;-1:-1:-1;;;46311:60:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;46311:60:0;;;;;;;;;;;;;;;46386:20;:9;:18;:20::i;:::-;46378:66;;;;-1:-1:-1;;;46378:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46453:19;46518:9;46536:11;46493:61;;;;;;;;;;;;;;;;;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;46493:61: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;46493:61:0;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;46493:61:0;;;46483:72;;;;;;46475:81;;46453:103;;46588:12;46573:11;:27;46565:71;;;;;-1:-1:-1;;;46565:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;46643:42;46649:10;46661:12;46675:9;46643:5;:42::i;:::-;46699:9;46694:126;46718:9;:16;46714:1;:20;46694:126;;;46750:62;46756:9;46766:1;46756:12;;;;;;;;;;;;;;46770:10;46782:29;46801:9;46782:11;46794:1;46782:14;;;;;;;:29;46750:5;:62::i;:::-;46736:3;;46694:126;;53667:253;53724:22;53763:16;53770:8;53763:6;:16::i;:::-;53755:48;;;;;-1:-1:-1;;;53755:48:0;;;;;;;;;;;;-1:-1:-1;;;53755:48:0;;;;;;;;;;;;;;;53849:12;53871:19;:8;:17;:19::i;:::-;53824:89;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;53824:89:0;;;;;;;;;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;;;299:10;344;;263:2;259:12;;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;;;;365:33;;-1:-1;;;53824:89:0;;;;;-1:-1:-1;53824:89:0;;;26:21:-1;;;-1:-1;;22:32;6:49;;53824:89:0;;;;;;;;-1:-1:-1;;;;;53667:253:0:o;63762:156::-;61865:8;;;;;;;;;-1:-1:-1;;;;;61865:8:0;-1:-1:-1;;;;;61865:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;61865:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;61865:18:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;61865:18:0;61885:38;;;;;;;;;61865:18;61885:38;;;;;;;;;-1:-1:-1;;;;;61851:32:0;:10;:32;61843:81;;;;-1:-1:-1;;;61843:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;61843:81:0;;63865:45;63875:6;63883:15;63900:9;63865;:45::i;35926:147::-;36007:7;36030:24;;;:14;:24;;;;;;;;-1:-1:-1;;;;;36030:37:0;;;;;;;;;;;;;;35926:147::o;36394:::-;-1:-1:-1;;;;;36507:17:0;;;36476:15;36507:17;;;:9;:17;;;;;;;;:28;;;;;;;;;;;;;;;36394:147::o;39513:341::-;15099:13;:18;;15116:1;15099:18;;;;;39649:44;39663:5;39670:3;39675:8;39685:7;39649:13;:44::i;:::-;39716:63;39742:5;39749:3;39754:8;39764:7;39773:5;39716:25;:63::i;:::-;39700:148;;;;-1:-1:-1;;;39700:148:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64151;61865:8;;;;;;;;;-1:-1:-1;;;;;61865:8:0;-1:-1:-1;;;;;61865:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;61865:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;61865:18:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;61865:18:0;61885:38;;;;;;;;;61865:18;61885:38;;;;;;;;;-1:-1:-1;;;;;61851:32:0;:10;:32;61843:81;;;;-1:-1:-1;;;61843:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;61843:81:0;;64252:39;64258:11;64271:8;64281:9;64252:5;:39::i;38828:217::-;38981:58;39003:5;39010:3;39015:9;39026:8;38981:58;;;;;;;;;;;;:21;:58::i;39192:149::-;39291:44;39305:5;39312:3;39317:8;39327:7;39291:13;:44::i;25760:215::-;25897:3;25391:2;25868:26;;:32;;25915:28;;;;;25760:215::o;27556:338::-;27754:1;27831:10;;25391:2;27812:30;27806:3;:36;27857:23;;;27720:35;27856:32;27556:338;;;;:::o;41567:586::-;41677:46;41695:10;41707:5;41714:8;41677:17;:46::i;:::-;41669:71;;;;;-1:-1:-1;;;41669:71:0;;;;;;;;;;;;-1:-1:-1;;;41669:71:0;;;;;;;;;;;;;;;41766:26;41776:5;41783:8;41766:9;:26::i;:::-;41755:7;:37;;41747:84;;;;-1:-1:-1;;;41747:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;41846:17:0;;41838:48;;;;;-1:-1:-1;;;41838:48:0;;;;;;;;;;;;-1:-1:-1;;;41838:48:0;;;;;;;;;;;;;;;41895:71;41915:5;41922:8;41932:7;41941:24;41895:19;:71::i;:::-;41973:69;41993:3;41998:8;42008:7;42017:24;41973:19;:69::i;:::-;42075:8;42070:3;-1:-1:-1;;;;;42054:30:0;42063:5;-1:-1:-1;;;;;42054:30:0;-1:-1:-1;;;;;;;;;;;42054:30:0;;;;;;;;;42129:8;42124:3;-1:-1:-1;;;;;42096:51:0;42117:5;-1:-1:-1;;;;;42096:51:0;-1:-1:-1;;;;;;;;;;;42139:7:0;42096:51;;;;;;;;;;;;;;;;;;41567:586;;;;:::o;10255:294::-;10346:8;;10316:4;;;10363:161;10387:6;10383:1;:10;10363:161;;;10410:11;10423:9;10436:16;10444:1;10447;10449;10447:4;;;;;;;;;;;;;;10436:7;:16::i;:::-;10409:43;;;;10467:4;:15;;;;;10481:1;10475:3;:7;10467:15;10463:54;;;10502:5;10495:12;;;;;;;;10463:54;-1:-1:-1;;10395:3:0;;10363:161;;;-1:-1:-1;10539:4:0;;10255:294;-1:-1:-1;;;10255:294:0:o;43632:449::-;43721:20;43744:32;43754:11;43767:8;43744:9;:32::i;:::-;43721:55;;43807:9;43791:12;:25;;43783:71;;;;-1:-1:-1;;;43783:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43863:79;43883:11;43896:8;43906:9;43917:24;43863:19;:79::i;:::-;43954:43;;43988:8;;43984:1;;-1:-1:-1;;;;;43954:43:0;;;-1:-1:-1;;;;;;;;;;;43954:43:0;43984:1;;43954:43;44009:66;;;;;;;;44055:8;;44051:1;;-1:-1:-1;;;;;44009:66:0;;;-1:-1:-1;;;;;;;;;;;44009:66:0;;;;;;;;;43632:449;;;;:::o;48529:563::-;48755:27;;48819:43;:16;48847:14;48819:43;:27;:43;:::i;:::-;48754:108;;-1:-1:-1;48754:108:0;-1:-1:-1;48876:9:0;48871:191;48895:10;:17;48891:1;:21;48871:191;;;48928:13;48944:14;48959:1;48944:17;;;;;;;;;;;;;;48928:33;;48970:84;48976:16;48993:5;48976:23;;;;;;;;;;;;;;49001:10;49013:40;49043:9;49013:18;49032:5;49013:25;;;;;;;48970:84;-1:-1:-1;48914:3:0;;48871:191;;49098:561;49332:25;;49392:43;:14;49418:16;49392:43;:25;:43;:::i;:::-;49331:104;;-1:-1:-1;49331:104:0;-1:-1:-1;49449:9:0;49444:183;49468:8;:15;49464:1;:19;49444:183;;;49499:13;49515:12;49528:1;49515:15;;;;;;;;;;;;;;49499:31;;49539:80;49545:10;49557:14;49572:5;49557:21;;;;;;;;;;;;;;49580:38;49608:9;49580:16;49597:5;49580:23;;;;;;;49539:80;-1:-1:-1;49485:3:0;;49444:183;;49665:1046;49898:24;;;49992:42;:16;50019:14;49992:42;:26;:42;:::i;:::-;49897:137;;-1:-1:-1;49897:137:0;-1:-1:-1;49897:137:0;-1:-1:-1;50048:9:0;50043:663;50067:7;:14;50063:1;:18;50043:663;;;50097:20;50120:15;50136:1;50120:18;;;;;;;;;;;;;;50097:41;;50147:18;50168:13;50182:1;50168:16;;;;;;;;;;;;;;50147:37;;50234:16;50251:10;50234:28;;;;;;;;;;;;;;50199:18;50218:12;50199:32;;;;;;;;;;;;;;:63;50195:504;;;50275:12;50325:16;50342:10;50325:28;;;;;;;;;;;;;;50290:18;50309:12;50290:32;;;;;;;;;;;;;;:63;50275:78;;50364:70;50370:16;50387:12;50370:30;;;;;;;;;;;;;;50402:10;50414:19;50423:9;50414:4;:8;;:19;;;;:::i;50364:70::-;50195:504;;;;50489:16;50506:10;50489:28;;;;;;;;;;;;;;50454:18;50473:12;50454:32;;;;;;;;;;;;;;:63;50450:249;;;50530:12;50576:18;50595:12;50576:32;;;;;;;;;;;;;;50545:16;50562:10;50545:28;;;;;;;;;;;;;;:63;50530:78;;50619:70;50625:10;50637:16;50654:12;50637:30;;;;;;;;;;;;;;50669:19;50678:9;50669:4;:8;;:19;;;;:::i;50619:70::-;50450:249;;-1:-1:-1;;50083:3:0;;50043:663;;;;49665:1046;;;;;;;;:::o;44726:272::-;44855:20;44862:12;44855:6;:20::i;:::-;44850:143;;29566:1;44886:10;:24;44897:12;44886:24;;;;;;;;;;;:36;;;;44936:49;44948:12;44962:9;44973:11;44936:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;44936:49: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;44936:49:0;;;;;;;;;;;;;;;;;;;;44726:272;;;:::o;43182:444::-;43329:16;43336:8;43329:6;:16::i;:::-;43324:104;;43356:20;;;;:10;:20;;;;;29522:1;43356:31;;;;27:10:-1;;23:18;;;45:23;;43396:24:0;;;;;;;43324:104;43436:69;43456:3;43461:8;43471:7;43480:24;43436:19;:69::i;:::-;43517:35;;43543:8;;-1:-1:-1;;;;;43517:35:0;;;43534:1;;-1:-1:-1;;;;;;;;;;;43517:35:0;43534:1;;43517:35;43564:56;;;;;;;;43602:8;;-1:-1:-1;;;;;43564:56:0;;;43593:1;;-1:-1:-1;;;;;;;;;;;43564:56:0;;;;;;;;;43182:444;;;:::o;40315:1246::-;40478:5;29947:10;-1:-1:-1;;;;;29947:19:0;;;;29946:53;;-1:-1:-1;;;;;;29971:16:0;;;;;;:9;:16;;;;;;;;29988:10;29971:28;;;;;;;;;;29946:53;29938:106;;;;-1:-1:-1;;;29938:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40541:8;:15;40521:9;:16;:35;40513:86;;;;-1:-1:-1;;;40513:86:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;40614:17:0;;40606:48;;;;;-1:-1:-1;;;40606:48:0;;;;;;;;;;;;-1:-1:-1;;;40606:48:0;;;;;;;;;;;;;;;40722:16;;-1:-1:-1;;;;;40789:12:0;;;;;;;40785:224;;;40817:9;40812:175;40836:9;40832:1;:13;40812:175;;;40889:9;40899:1;40889:12;;;;;;;;;;;;;;40884:3;-1:-1:-1;;;;;40868:34:0;40877:5;-1:-1:-1;;;;;40868:34:0;-1:-1:-1;;;;;;;;;;;40868:34:0;;;;;;;;;40951:9;40961:1;40951:12;;;;;;;;;;;;;;40946:3;-1:-1:-1;;;;;40918:59:0;40939:5;-1:-1:-1;;;;;40918:59:0;-1:-1:-1;;;;;;;;;;;40965:8:0;40974:1;40965:11;;;;;;;;;;;;;;40918:59;;;;;;;;;;;;;;;;;;40847:3;;40812:175;;;;40995:7;;;40785:224;41022:9;41017:446;41041:9;41037:1;:13;41017:446;;;41089:30;41099:5;41106:9;41116:1;41106:12;;;;;;;;;;;;;;41089:9;:30::i;:::-;41074:8;41083:1;41074:11;;;;;;;;;;;;;;:45;;41066:92;;;;-1:-1:-1;;;41066:92:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41167:79;41187:5;41194:9;41204:1;41194:12;;;;;;;;;;;;;;41208:8;41217:1;41208:11;;;;;;;;;;;;;;41221:24;41167:19;:79::i;:::-;41255:77;41275:3;41280:9;41290:1;41280:12;;;;;;;;;;;;;;41294:8;41303:1;41294:11;;;;;;;;;;;;;;41307:24;41255:19;:77::i;:::-;41369:9;41379:1;41369:12;;;;;;;;;;;;;;41364:3;-1:-1:-1;;;;;41348:34:0;41357:5;-1:-1:-1;;;;;41348:34:0;-1:-1:-1;;;;;;;;;;;41348:34:0;;;;;;;;;41429:9;41439:1;41429:12;;;;;;;;;;;;;;41424:3;-1:-1:-1;;;;;41396:59:0;41417:5;-1:-1:-1;;;;;41396:59:0;-1:-1:-1;;;;;;;;;;;41443:8:0;41452:1;41443:11;;;;;;;;;;;;;;41396:59;;;;;;;;;;;;;;;;;;41052:3;;41017:446;;;;41530:3;-1:-1:-1;;;;;41509:46:0;41523:5;-1:-1:-1;;;;;41509:46:0;;41535:9;41546:8;41509:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;41509:46: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;41509:46:0;;;;;;;;;;;;;;;;;;;30051:1;40315:1246;;;;;:::o;11192:810::-;11252:4;11911:20;;11754:66;11951:15;;;;;:42;;-1:-1:-1;11970:23:0;;;11943:51;-1:-1:-1;;11192:810:0:o;4833:471::-;4891:7;5136:6;5132:47;;-1:-1:-1;5166:1:0;5159:8;;5132:47;5203:5;;;5207:1;5203;:5;:1;5227:5;;;;;:10;5219:56;;;;-1:-1:-1;;;5219:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5295:1;4833:471;-1:-1:-1;;;4833:471:0:o;44087:213::-;44195:45;44205:6;44213:15;44230:9;44195;:45::i;:::-;44247:47;44258:7;44267:15;44284:9;44247:10;:47::i;55423:366::-;55567:4;55585:16;:3;-1:-1:-1;;;;;55585:14:0;;:16::i;:::-;55580:51;;-1:-1:-1;55619:4:0;55612:11;;55580:51;55653:89;;-1:-1:-1;;;55653:89:0;;55701:10;55653:89;;;;;;-1:-1:-1;;;;;55653:89:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;55637:13;;55653:37;;;;;;55701:10;;55713:5;;55720:8;;55730:5;;55653:89;;;;;;;;;;;55637:13;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;55653:89:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;55653:89:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;55653:89:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;55653:89:0;-1:-1:-1;;;;;;55757:25:0;-1:-1:-1;;;55757:25:0;;-1:-1:-1;;55423:366:0;;;;;;:::o;50815:412::-;50865:27;50905:7;50901:40;;-1:-1:-1;50923:10:0;;;;;;;;;;;;-1:-1:-1;;;50923:10:0;;;;;;50901:40;50958:2;50949:6;50982:53;50989:6;;50982:53;;51006:5;;51025:2;51020:7;;;;50982:53;;;51043:17;51073:3;51063:14;;;;;;;;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;51063:14:0;87:34:-1;135:17;;-1:-1;51063:14:0;-1:-1:-1;51043:34:0;-1:-1:-1;;;51093:7:0;;51107:87;51114:7;;51107:87;;51165:2;51160;:7;51155:2;:12;51144:25;;51132:4;51137:3;;;;;;;51132:9;;;;;;;;;;;:37;-1:-1:-1;;;;;51132:37:0;;;;;;;;-1:-1:-1;51184:2:0;51178:8;;;;51107:87;;;-1:-1:-1;51216:4:0;50815:412;-1:-1:-1;;;;50815:412:0:o;44308:199::-;44403:19;44425:15;:30;;;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44425:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44425:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44425:32:0;;-1:-1:-1;44464:37:0;44425:32;44483:6;44491:9;44464:5;:37::i;42159:385::-;42325:4;42343:16;:3;-1:-1:-1;;;;;42343:14:0;;:16::i;:::-;42338:51;;-1:-1:-1;42377:4:0;42370:11;;42338:51;42397:13;42430:3;-1:-1:-1;;;;;42413:39:0;;42453:10;42465:5;42472:8;42482:7;42491:5;42413:84;;;;;;;;;;;;;-1:-1:-1;;;;;42413:84:0;-1:-1:-1;;;;;42413:84:0;;;;;;-1:-1:-1;;;;;42413:84:0;-1:-1:-1;;;;;42413:84: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;42413:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42413:84:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42413:84:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42413:84:0;-1:-1:-1;;;;;;42511:26:0;-1:-1:-1;;;42511:26:0;;-1:-1:-1;;42159:385:0;;;;;;;;:::o;36830:332::-;36976:11;36989:13;37006:27;:8;:25;:27::i;:::-;-1:-1:-1;;;;;37073:25:0;;;;;;:18;:25;;;;;;;;:30;;;;;;;;;36975:58;;-1:-1:-1;36975:58:0;-1:-1:-1;37073:83:0;;36975:58;37138:7;37147:2;37073:83;:49;:83;:::i;:::-;-1:-1:-1;;;;;37040:25:0;;;;;;;:18;:25;;;;;;;;:30;;;;;;;;;;:116;;;;-1:-1:-1;;;;36830:332:0:o;8157:259::-;8267:8;;8228:7;;;;;8282:105;8306:6;8302:1;:10;8282:105;;;8340:1;8332;8334;8332:4;;;;;;;;;;;;;;:9;8328:52;;;8362:1;-1:-1:-1;8365:4:0;;-1:-1:-1;8354:16:0;;-1:-1:-1;8354:16:0;8328:52;8314:3;;8282:105;;;-1:-1:-1;8401:1:0;;-1:-1:-1;8401:1:0;;-1:-1:-1;;8157:259:0;;;;;;:::o;8566:805::-;8649:16;8667;8692:14;8709:1;:8;8692:25;;8724:24;8762:6;8751:18;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;8751:18:0;-1:-1:-1;8724:45:0;-1:-1:-1;8776:13:0;;8875:158;8899:6;8895:1;:10;8875:158;;;8921:9;8933:1;8935;8933:4;;;;;;;;;;;;;;8921:16;;8951:14;8960:1;8963;8951:8;:14::i;:::-;8946:80;;8994:4;8978:10;8989:1;8978:13;;;;;;;;:20;;;:13;;;;;;;;;;;:20;9009:7;;;;;8946:80;-1:-1:-1;8907:3:0;;8875:158;;;;9039:25;9081:5;9067:20;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;9067:20:0;;9039:48;;9094:29;9140:5;9126:20;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;9126:20:0;-1:-1:-1;9094:52:0;-1:-1:-1;9153:9:0;;9173:155;9197:6;9193:1;:10;9173:155;;;9223:10;9234:1;9223:13;;;;;;;;;;;;;;9219:102;;;9263:1;9265;9263:4;;;;;;;;;;;;;;9249:8;9258:1;9249:11;;;;;;;;;;;;;:18;;;;;9296:1;9278:12;9291:1;9278:15;;;;;;;;;;;;;;;;;:19;9308:3;;;;;9219:102;9205:3;;9173:155;;;-1:-1:-1;9342:8:0;;9352:12;;-1:-1:-1;8566:805:0;-1:-1:-1;;;;;;;8566:805:0:o;9377:872::-;9459:16;9477;9495;9520:14;9537:1;:8;9520:25;;9552:24;9590:6;9579:18;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;9579:18:0;-1:-1:-1;9552:45:0;-1:-1:-1;9604:17:0;;9632:139;9656:6;9652:1;:10;9632:139;;;9682:17;9691:1;9694;9696;9694:4;;;;;;;;;;;;;;9682:8;:17::i;:::-;9678:86;;;9728:4;9712:10;9723:1;9712:13;;;;;;;;:20;;;:13;;;;;;;;;;;:20;9743:11;;;;;9678:86;9664:3;;9632:139;;;;9777:25;9819:9;9805:24;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;9805:24:0;;9777:52;;9836:30;9883:9;9869:24;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;9869:24:0;;9836:57;;9900:30;9947:9;9933:24;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;9933:24:0;-1:-1:-1;9900:57:0;-1:-1:-1;9964:9:0;;9984:206;10008:6;10004:1;:10;9984:206;;;10034:10;10045:1;10034:13;;;;;;;;;;;;;;10030:153;;;10074:1;10076;10074:4;;;;;;;;;;;;;;10060:8;10069:1;10060:11;;;;;;;;;;;;;:18;;;;;10108:1;10089:13;10103:1;10089:16;;;;;;;;;;;;;:20;;;;;10143:16;10151:1;10154;10156;10154:4;;;;;;;10143:16;10120:39;10121:13;10135:1;10121:16;;;;;;;;;;;;;;;;;10120:39;10170:3;;;;;10030:153;10016:3;;9984:206;;;-1:-1:-1;10204:8:0;;10214:13;;-1:-1:-1;10214:13:0;-1:-1:-1;9377:872:0;-1:-1:-1;;;;;;;9377:872:0:o;44515:205::-;44612:20;44635:15;:31;;;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;26480:825:0;26630:21;;;26695:10;:28;;;;;;;;;26691:580;;;26750:35;26764:12;26778:6;26750:13;:35::i;:::-;26734:51;-1:-1:-1;26810:65:0;26826:12;26840:6;26848:26;26734:51;26866:7;26848:26;:17;:26;:::i;:::-;26810:15;:65::i;:::-;26794:81;;26691:580;;;26907:14;26893:10;:28;;;;;;;;;26889:382;;;26948:35;26962:12;26976:6;26948:13;:35::i;:::-;26932:51;-1:-1:-1;27008:65:0;27024:12;27038:6;27046:26;26932:51;27064:7;27046:26;:17;:26;:::i;26889:382::-;27105:18;27091:10;:32;;;;;;;;;27087:184;;;27150:46;27166:12;27180:6;27188:7;27150:15;:46::i;27087:184::-;27219:27;;;-1:-1:-1;;;27219:27:0;;;;;;;;;;;;-1:-1:-1;;;27219:27:0;;;;;;;;;;;;;;8422:138;8494:4;8510:9;8523:13;8531:1;8534;8523:7;:13::i;3461:181::-;3519:7;3551:5;;;3575:6;;;;3567:46;;;;;-1:-1:-1;;;3567:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;28213:467;28313:7;-1:-1:-1;;;28337:28:0;;28329:76;;;;-1:-1:-1;;;28329:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28479:35:0;28513:1;28589:10;;25391:2;28570:30;28564:3;:36;28629:17;;;28627:20;28615:32;;28653:20;;;;28614:60;28213:467;;;;;:::o;3917:136::-;3975:7;4002:43;4006:1;4009;4002:43;;;;;;;;;;;;;;;;;4476:7;4512:12;4504:6;;;;4496:29;;;;-1:-1:-1;;;4496:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;4496:29:0;-1:-1:-1;;;4548:5:0;;;4390:192::o
Swarm Source
bzzr://6a1940fe777b8e63309c21dd7e676ea6257c61bdc096c85c9b740ba169001d67
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.