Overview
TokenID
625
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 |
---|
Contract Name:
BMMultipass
Compiler Version
v0.8.12+commit.f00d7308
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-03-06 */ /* * Generated by Black Meta Corporation * Founded by @mikedbecker * Developed by @daveaneo * Advisory by @Thrasher66099 * Truly user operated & owned by @blackmeta_ */ pragma solidity ^0.8.0; interface IByteContract { function burn(address _from, uint256 _amount) external; } interface IERC20 { function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function transfer(address recipient, uint256 amount) external returns (bool); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool); function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); // new function name() external view returns (string memory); } /** * @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); } /// @title Base64 /// @author Brecht Devos - <[email protected]> /// @notice Provides functions for encoding/decoding base64 library Base64 { string internal constant TABLE_ENCODE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; bytes internal constant TABLE_DECODE = hex"0000000000000000000000000000000000000000000000000000000000000000" hex"00000000000000000000003e0000003f3435363738393a3b3c3d000000000000" hex"00000102030405060708090a0b0c0d0e0f101112131415161718190000000000" hex"001a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132330000000000"; function encode(bytes memory data) internal pure returns (string memory) { if (data.length == 0) return ''; // load the table into memory string memory table = TABLE_ENCODE; // multiply by 4/3 rounded up uint256 encodedLen = 4 * ((data.length + 2) / 3); // add some extra buffer at the end required for the writing string memory result = new string(encodedLen + 32); assembly { // set the actual output length mstore(result, encodedLen) // prepare the lookup table let tablePtr := add(table, 1) // input ptr let dataPtr := data let endPtr := add(dataPtr, mload(data)) // result ptr, jump over length let resultPtr := add(result, 32) // run over the input, 3 bytes at a time for {} lt(dataPtr, endPtr) {} { // read 3 bytes dataPtr := add(dataPtr, 3) let input := mload(dataPtr) // write 4 characters mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F)))) resultPtr := add(resultPtr, 1) mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F)))) resultPtr := add(resultPtr, 1) mstore8(resultPtr, mload(add(tablePtr, and(shr( 6, input), 0x3F)))) resultPtr := add(resultPtr, 1) mstore8(resultPtr, mload(add(tablePtr, and( input, 0x3F)))) resultPtr := add(resultPtr, 1) } // padding with '=' switch mod(mload(data), 3) case 1 { mstore(sub(resultPtr, 2), shl(240, 0x3d3d)) } case 2 { mstore(sub(resultPtr, 1), shl(248, 0x3d)) } } return result; } function decode(string memory _data) internal pure returns (bytes memory) { bytes memory data = bytes(_data); if (data.length == 0) return new bytes(0); require(data.length % 4 == 0, "invalid base64 decoder input"); // load the table into memory bytes memory table = TABLE_DECODE; // every 4 characters represent 3 bytes uint256 decodedLen = (data.length / 4) * 3; // add some extra buffer at the end required for the writing bytes memory result = new bytes(decodedLen + 32); assembly { // padding with '=' let lastBytes := mload(add(data, mload(data))) if eq(and(lastBytes, 0xFF), 0x3d) { decodedLen := sub(decodedLen, 1) if eq(and(lastBytes, 0xFFFF), 0x3d3d) { decodedLen := sub(decodedLen, 1) } } // set the actual output length mstore(result, decodedLen) // prepare the lookup table let tablePtr := add(table, 1) // input ptr let dataPtr := data let endPtr := add(dataPtr, mload(data)) // result ptr, jump over length let resultPtr := add(result, 32) // run over the input, 4 characters at a time for {} lt(dataPtr, endPtr) {} { // read 4 characters dataPtr := add(dataPtr, 4) let input := mload(dataPtr) // write 3 bytes let output := add( add( shl(18, and(mload(add(tablePtr, and(shr(24, input), 0xFF))), 0xFF)), shl(12, and(mload(add(tablePtr, and(shr(16, input), 0xFF))), 0xFF))), add( shl( 6, and(mload(add(tablePtr, and(shr( 8, input), 0xFF))), 0xFF)), and(mload(add(tablePtr, and( input , 0xFF))), 0xFF) ) ) mstore(resultPtr, shl(232, output)) resultPtr := add(resultPtr, 3) } } return result; } } /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } /// @dev Interface for the NFT Royalty Standard /// interface IERC2981 is IERC165 { // ERC165 // royaltyInfo(uint256,uint256) => 0x2a55205a // IERC2981 => 0x2a55205a // @notice Called with the sale price to determine how much royalty // is owed and to whom. // @param _tokenId - the NFT asset queried for royalty information // @param _salePrice - the sale price of the NFT asset specified by _tokenId // @return receiver - address of who should be sent the royalty payment // @return royaltyAmount - the royalty payment amount for _salePrice // ERC165 datum royaltyInfo(uint256,uint256) => 0x2a55205a function royaltyInfo(uint256 _tokenId, uint256 _salePrice) external view returns (address receiver, uint256 royaltyAmount); } abstract contract ERC2981Collection is IERC2981 { // ERC165 // royaltyInfo(uint256,uint256) => 0x2a55205a // ERC2981Collection => 0x2a55205a address private royaltyAddress; uint256 private royaltyPercent; // out of 10000. 10000 => 100%, 1000 => 10%, 100 => 1% constructor(address _receiver, uint256 _percentage) { require(royaltyPercent <= 10000); royaltyAddress = _receiver; royaltyPercent = _percentage; } // Set to be internal function _setRoyalties function _setRoyaltyPercent(uint256 _percentage) internal { require(royaltyPercent <= 10000); royaltyPercent = _percentage; } function _setRoyaltyAddress(address _receiver) internal { royaltyAddress = _receiver; } // Override for royaltyInfo(uint256, uint256) // royaltyInfo(uint256,uint256) => 0x2a55205a function royaltyInfo(uint256 _tokenId, uint256 _salePrice) external view override(IERC2981) returns ( address receiver, uint256 royaltyAmount) { receiver = royaltyAddress; // This sets percentages by price * percentage / 10000 royaltyAmount = _salePrice * royaltyPercent / 10000; } } /** * @dev These functions deal with verification of Merkle Trees proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the merkle tree could be reinterpreted as a leaf value. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = _efficientHash(computedHash, proofElement); } else { // Hash(current element of the proof + current computed hash) computedHash = _efficientHash(proofElement, computedHash); } } return computedHash; } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } } /** * @title Whitelist * @dev The Whitelist contract has a whitelist of addresses, and provides basic authorization control functions. * @dev This simplifies the implementation of "user permissions". */ contract Whitelist is Ownable { bytes32[] public rootHash; constructor(bytes32[] memory _rootHash) public { rootHash = _rootHash; } /** * @dev Adds an array of addresses to whitelist * @param _merkleRoot new merkle root */ function addToMerkleRootArray(bytes32 _merkleRoot) external onlyOwner { rootHash.push(_merkleRoot); } /** * @dev Adds an array of addresses to whitelist * @param _merkleRootArray new merkle root array */ function setMerkleRootArray(bytes32[] calldata _merkleRootArray) external onlyOwner { rootHash = _merkleRootArray; } /** * @dev Called with msg.sender as _addy to verify if on whitelist * @param _merkleProof proof computed off chain * @param _addy msg.sender */ function isWhitelisted(address _addy, uint256 _index, bytes32[] memory _merkleProof) public view returns(bool) { return whitelistValidated(_addy, _index, _merkleProof); } function whitelistValidated(address wallet, uint256 index, bytes32[] memory proof) internal view returns (bool) { uint256 amount = 1; // Compute the merkle root bytes32 node = keccak256(abi.encodePacked(index, wallet, amount)); uint256 path = index; for (uint256 i = 0; i < proof.length; i++) { if ((path & 0x01) == 1) { node = keccak256(abi.encodePacked(proof[i], node)); } else { node = keccak256(abi.encodePacked(node, proof[i])); } path /= 2; } // Check the merkle proof against the root hash array for(uint256 i = 0; i < rootHash.length; i++) { if (node == rootHash[i]) { return true; } } return false; } } /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) private pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable { using Address for address; using Strings for uint256; struct TokenOwnership { address addr; uint64 startTimestamp; } struct AddressData { uint128 balance; uint128 numberMinted; } uint256 internal currentIndex; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details. mapping(uint256 => TokenOwnership) internal _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view override returns (uint256) { return currentIndex; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view override returns (uint256) { require(index < totalSupply(), 'ERC721A: global index out of bounds'); return index; } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first. * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) { require(index < balanceOf(owner), 'ERC721A: owner index out of bounds'); uint256 numMintedSoFar = totalSupply(); uint256 tokenIdsIdx; address currOwnershipAddr; // Counter overflow is impossible as the loop breaks when uint256 i is equal to another uint256 numMintedSoFar. unchecked { for (uint256 i; i < numMintedSoFar; i++) { TokenOwnership memory ownership = _ownerships[i]; if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { if (tokenIdsIdx == index) { return i; } tokenIdsIdx++; } } } revert('ERC721A: unable to get token of owner by index'); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { require(owner != address(0), 'ERC721A: balance query for the zero address'); return uint256(_addressData[owner].balance); } function _numberMinted(address owner) internal view returns (uint256) { require(owner != address(0), 'ERC721A: number minted query for the zero address'); return uint256(_addressData[owner].numberMinted); } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { require(_exists(tokenId), 'ERC721A: owner query for nonexistent token'); unchecked { for (uint256 curr = tokenId; curr >= 0; curr--) { TokenOwnership memory ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } } revert('ERC721A: unable to determine the owner of token'); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return ownershipOf(tokenId).addr; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), 'ERC721Metadata: URI query for nonexistent token'); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ERC721A.ownerOf(tokenId); require(to != owner, 'ERC721A: approval to current owner'); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), 'ERC721A: approve caller is not owner nor approved for all' ); _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { require(_exists(tokenId), 'ERC721A: approved query for nonexistent token'); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public override { require(operator != _msgSender(), 'ERC721A: approve to caller'); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public override { _transfer(from, to, tokenId); require( _checkOnERC721Received(from, to, tokenId, _data), 'ERC721A: transfer to non ERC721Receiver implementer' ); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return tokenId < currentIndex; } function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { _mint(to, quantity, _data, true); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _mint( address to, uint256 quantity, bytes memory _data, bool safe ) internal { uint256 startTokenId = currentIndex; require(to != address(0), 'ERC721A: mint to the zero address'); require(quantity != 0, 'ERC721A: quantity must be greater than 0'); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 3.4e38 (2**128) - 1 // updatedIndex overflows if currentIndex + quantity > 1.56e77 (2**256) - 1 unchecked { _addressData[to].balance += uint128(quantity); _addressData[to].numberMinted += uint128(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; for (uint256 i; i < quantity; i++) { emit Transfer(address(0), to, updatedIndex); if (safe) { require( _checkOnERC721Received(address(0), to, updatedIndex, _data), 'ERC721A: transfer to non ERC721Receiver implementer' ); } updatedIndex++; } currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) private { TokenOwnership memory prevOwnership = ownershipOf(tokenId); bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr || getApproved(tokenId) == _msgSender() || isApprovedForAll(prevOwnership.addr, _msgSender())); require(isApprovedOrOwner, 'ERC721A: transfer caller is not owner nor approved'); require(prevOwnership.addr == from, 'ERC721A: transfer from incorrect owner'); require(to != address(0), 'ERC721A: transfer to the zero address'); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { _addressData[from].balance -= 1; _addressData[to].balance += 1; _ownerships[tokenId].addr = to; _ownerships[tokenId].startTimestamp = uint64(block.timestamp); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; if (_ownerships[nextTokenId].addr == address(0)) { if (_exists(nextTokenId)) { _ownerships[nextTokenId].addr = prevOwnership.addr; _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert('ERC721A: transfer to non ERC721Receiver implementer'); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} } //contract BMMultipass is ERC721Enumerable, ReentrancyGuard, Ownable { contract BMMultipass is ERC721A, ReentrancyGuard, Ownable, ERC2981Collection { IERC20 BytesERC20; Whitelist whiteListContract; string private baseURI; mapping(uint256 => uint256) private tokenIdToPackedData; // compressed data for NFT mapping(address => uint256) private whiteListHasMinted; struct Data { uint256 clearanceLevel; uint256 station; uint256 securityTerminal; uint256 xenGroup; uint256 command; uint256 response; uint256 insult; uint256 rarity; } struct ContractSettings { uint208 mintFee; uint16 maxSupply; bool OGPrivilege; bool mintingPermitted; bool bypassWhitelist; } ContractSettings public contractSettings; // used for limiting what traits are minted // uint16[13] private clearanceLevelsRemaining = [10, 20, 80, 100, 175, 210, 245, 260, 275, 295, 320, 340, 420]; // remaining after reserved uint16[13] private traitTotals = [40, 80, 120, 150, 195, 225, 255, 270, 285, 300, 320, 340, 420]; string[13] private clearanceLevels = [ "G-man", "Board", "Executive", "Dark Ops", "Level 9", "Level 8", "Level 7", "Level 6", "Level 5", "Level 4", "Level 3", "Level 2", "Level 1" ]; string[13] private stations = [ "Specimen 8", "Polymorph Chamber", "Super Soldier Lab", "Dark Matter Reactor", "Lambda Complex", "Chimera Hive", "Dark Shards Lab", "Engineering Bay", "Bio Lab", "Bridge", "Terraforming Bay", "Armory", "Maintenance" ]; // string[13] private securityTerminals = [ // "1", // "2", // "3", // "4", // "5", // "6", // "7", // "8", // "9", // "10", // "11", // "12", // "13" // ]; // string[13] private xenGroups = [ // "Xen 1", // "Xen 2", // "Xen 3", // "Xen 4", // "Xen 5", // "Xen 6", // "Xen 7", // "Xen 8", // "Xen 9", // "Xen 10", // "Xen 11", // "Xen 12", // "Xen 13" // ]; string[13] private commands = [ "Initiate Chaos Protocol...", "Unlock Weapons Cache...", "Disable Ship-wide Emergency Access...", "Unlock Shuttle Bay 4...", "Unlock Captain's Quarters...", "Disable Ship Navigation System...", "Engage Aft Thrusters...", "Give Me a Sandwich...", "Access Weaponry System...", "Override Ship Intercom...", "Override Bridge Controls...", "Disable Security Cameras in Sector 1...", "Access Mess Hall..." ]; string[13] private responses = [ "Pray to your god. The god of disappointment.", "You win a free toothbrush! Use immediately.", "Facial recognition error: Possum detected.", "Knock knock. Who's there? A useless refugee!", "Access Approved. Transferring all your ETH now.", "Access Granted. Kidding. It's not.", "Access Denied. Feels like prom night again?", "Access Denied. Welcome back L -- user.", "Access Denied. I do not give free re-fills.", "Alert. Beta detected! Alpha access only.", "Sorry. User whatever-your-name-is was disabled.", "Sorry. Could you rephrase that -- with dignity?", "Sorry. I accept requests. You accept commands." ]; string[13] private insults = [ "Couldn't find any friends in the real world?", "Another one here for the free toothbrush.", "Did you just touch my backspace?", "Seems your wallet is non-binary -- Zero's only.", "I didn't know the 'filthy refugee' style was in.", "Remember, I saw you eat roaches on your knees.", "Last I saw you was on -- the Axiom?", "Realized daddy's money won't last forever?", "If you're what's left, humanity is screwed.", "I'd reject you but your mom already has.", "Was going to insult you, then I scanned your ID.", "Definitely not making the Black Meta calendar.", "I guess we're letting anyone in now." ]; event FundsReleasedToAccount( uint256 EthAmount, uint256 BytesAmount, address account, uint256 date ); ////////////////////////////////// ////// Bit Packing Functions ///// ////////////////////////////////// /** @dev Packs 5 uints into 1 uint to save space () -> 256 @param _clearanceLevel -- clearance level of NFT */ function packData(uint256 _clearanceLevel, uint256 _station, uint256 _securityTerminal, uint256 _xenGroup, uint256 _command, uint256 _response, uint256 _insult, uint256 _rarity) internal pure returns (uint256){ uint256 count = 0; uint256 ret = _clearanceLevel; count += 8; ret |= _station << count; count += 8; ret |= _securityTerminal << count; count += 8; ret |= _xenGroup << count; count += 8; ret |= _command << count; count += 8; ret |= _response << count; count += 8; ret |= _insult << count; count += 8; ret |= _rarity << count; count += 128; return ret; } /** @dev Unpacks 1 uints into 3 uints; (256) -> (90, 90, 32, 8, 3, 1) @param _id -- NFT id, which will pull the 256 bit encoding of _dipValue, _stableCoinAmount, _energy, _dipPercent, _dipLevel, and _isWaitingToBuy */ function unpackData(uint256 _id) internal view returns (Data memory){ return _unpackData(tokenIdToPackedData[_id]); } /** @dev Unpacks 1 uints into 8 uints; (256) -> (8, 8, 8, 8, 8, 8 ,8 rest) @param _myData -- 256 bit encoding of data */ function _unpackData(uint256 _myData) internal pure returns (Data memory){ uint256 _clearanceLevel = uint256(uint8(_myData)); uint256 _station = uint256(uint8(_myData >> 8)); uint256 _securityTerminal = uint256(uint8(_myData >> 16)); uint256 _xenGroup = uint256(uint8(_myData >> 24)); uint256 _command = uint256(uint8(_myData >> 32)); uint256 _response = uint256(uint8(_myData >> 40)); uint256 _insult = uint256(uint8(_myData >> 48)); uint256 _rarity = uint256(uint128(_myData >> 56)); return Data(_clearanceLevel, _station, _securityTerminal, _xenGroup, _command, _response, _insult, _rarity); } ////////////////////////////////// ///////// Get Functions ////////// ////////////////////////////////// /** @dev gets number of minted tokens */ function getCurrentIndex() external view returns(uint256){ return currentIndex; } /** @dev gets clearanceLevel of NFT @param _tokenId -- id of NFT */ function getClearanceLevel(uint256 _tokenId) external view returns (string memory) { require(_exists(_tokenId)); if(tokenIdToPackedData[_tokenId]==0){ return "ACCESS DENIED"; } return clearanceLevels[unpackData(_tokenId).clearanceLevel]; } /** @dev gets station of NFT @param _tokenId -- id of NFT */ function getStation(uint256 _tokenId) external view returns (string memory) { require(_exists(_tokenId)); if(tokenIdToPackedData[_tokenId]==0){ return "ACCESS DENIED"; } return stations[unpackData(_tokenId).station]; } /** @dev gets usergroup (xenGroup) of NFT @param _tokenId -- id of NFT */ function getUserGroup(uint256 _tokenId) external view returns (string memory) { require(_exists(_tokenId)); if(tokenIdToPackedData[_tokenId]==0){ return "ACCESS DENIED"; } return(string(abi.encodePacked("Xen ", toString(unpackData(_tokenId).xenGroup + 1)))); } /** @dev gets securityTerminal of NFT @param _tokenId -- id of NFT */ function getSecurityTerminal(uint256 _tokenId) external view returns (string memory) { require(_exists(_tokenId)); if(tokenIdToPackedData[_tokenId]==0){ return "ACCESS DENIED"; } return(toString(unpackData(_tokenId).securityTerminal + 1)); } /** @dev gets command of NFT @param _tokenId -- id of NFT */ function getCommand(uint256 _tokenId) external view returns (string memory) { require(_exists(_tokenId)); if(tokenIdToPackedData[_tokenId]==0){ return "ACCESS DENIED"; } return commands[unpackData(_tokenId).command]; } /** @dev gets response of NFT @param _tokenId -- id of NFT */ function getResponse(uint256 _tokenId) external view returns (string memory) { require(_exists(_tokenId)); if(tokenIdToPackedData[_tokenId]==0){ return "ACCESS DENIED"; } return responses[unpackData(_tokenId).response]; } /** @dev gets response of NFT @param _tokenId -- id of NFT */ function getInsult(uint256 _tokenId) external view returns (string memory) { require(_exists(_tokenId)); if(tokenIdToPackedData[_tokenId]==0){ return "ACCESS DENIED"; } return responses[unpackData(_tokenId).insult]; } /** @dev gets rarity of NFT, a score used to find rank @param _tokenId -- id of NFT */ function getRarity(uint256 _tokenId) external view returns (uint256) { // number not string require(_exists(_tokenId)); return unpackData(_tokenId).rarity; // 0 rarity for uninitiated } ////////////////////////////////// ///////// Core Functions ///////// ////////////////////////////////// /** @dev gets Returns a array of integers representing the index of every clearanceLevel that is available */ function getAvailableClearanceLevels() view external returns(uint16[13] memory) { return clearanceLevelsRemaining; } /** @dev gets Returns a array of integers representing the index of every clearanceLevel that is available @param _Bytes -- Bytes are burned in the mint, but not here. This is just for obtaining availability */ function getAvailableClearanceLevelsGivenBytes(uint256 _Bytes) view external returns(string[] memory) { uint16[13] memory availableClearanceLevels = _getAvailableClearanceLevelsGivenBytes(_Bytes); uint256 count = 0; for(uint256 i=0; i< availableClearanceLevels.length; i++){ if(availableClearanceLevels[i] > 0){ count += 1; } } string[] memory availableClearanceLevelNames = new string[](count); count = 0; for(uint256 i; i< availableClearanceLevels.length; i++){ if(availableClearanceLevels[i] > 0){ availableClearanceLevelNames[count] = clearanceLevels[i]; count += 1; } } return availableClearanceLevelNames; } /** @dev gets Returns a array of integers representing the index of every clearanceLevel that is available @param _Bytes -- Bytes are burned in the mint, but not here. This is just for obtaining availability */ function _getAvailableClearanceLevelsGivenBytes(uint256 _Bytes) private view returns(uint16[13] memory) { uint16[13] memory availableClearanceLevels; uint256 minLevel; // lower by reference number uint256 maxLevel; // higher by reference number uint256 total; if(_Bytes < 50 ether) { // aiming for 0 minLevel = 10; // uint256 whiteListPos = 300; // maxLevel = 12 - ( ((contractSettings.OGPrivilege == true) && (whiteListPos != 0) && (whiteListPos < 251) ) ? 1 : 0); maxLevel = 12; } else if(_Bytes < 100 ether){ // aiming for 50 minLevel = 7; maxLevel = 9; } else if(_Bytes < 200 ether){ // aiming for 100 minLevel = 4; maxLevel = 6; } else if(_Bytes < 300 ether){ // aiming for 200 minLevel = 2; maxLevel = 3; } else if(_Bytes < 400 ether){ // aiming for 300 minLevel = 1; maxLevel = 1; } else { // aiming for 400 // no need to update } // from our array of 0s, we only give values to items msg.sender qualifies for for(uint256 i=minLevel; i <= maxLevel; i++){ if(clearanceLevelsRemaining[i]>0){ availableClearanceLevels[i] = clearanceLevelsRemaining[i]; total += clearanceLevelsRemaining[i]; } } require(total > 0, "No clearance levels available for this Byte amount."); return availableClearanceLevels; } // these numbers need to be in order of value. /** @dev choose an index based on randomness, probablity based on relative total in index @param _availableItems -- An array of integers, each representing availibility out of the whole array // example: [1,1,2] => gives an array which will yield the following 25%=>0, 25% =>1, 50% 2 */ function _chooseTraitGivenArray(uint16[13] memory _availableItems, uint256 _nonce) internal view returns(uint256) { uint256 total = 0; uint256 summed = 0; for(uint256 i=0;i < _availableItems.length; i++){ total += _availableItems[i]; } require(total!=0, "Minting exhausted."); bytes memory hashString = (abi.encodePacked(block.difficulty, block.timestamp, msg.sender, currentIndex, _availableItems[0], _availableItems.length, _nonce)); uint256 pseudoRand = uint256(keccak256(hashString)) % total; for(uint256 i=0;i< _availableItems.length; i++){ summed += _availableItems[i]; if(pseudoRand < summed){ return i; } } } /** @dev creates tokenIdToPackedData with new stats at tokenId @param _clearanceLevel given clearance level @param _tokenId id of token */ function createDataGivenClearanceLevel(uint256 _clearanceLevel, uint256 _tokenId) internal returns (uint256){ Data memory _myData; uint256[6] memory traitSelections; uint256 pseudoRand; uint256 pseudoRandSection; uint256 total; pseudoRand = uint256(keccak256((abi.encodePacked(block.timestamp, msg.sender, _tokenId)))); for(uint256 j = 0; j< 6; j++){ pseudoRandSection = (pseudoRand / ((10^4)^j)) % 3000; total = 0; for(uint256 k = 12; k>=0;k--){ // Should save gas by processing higher numbers first total += traitTotals[k]; if(pseudoRandSection < total){ traitSelections[j] = k; break; } } } _myData.clearanceLevel = _clearanceLevel; _myData.station = traitSelections[0]; _myData.securityTerminal = traitSelections[1]; _myData.xenGroup = traitSelections[2]; _myData.command = traitSelections[3]; _myData.response = traitSelections[4]; _myData.insult = traitSelections[5]; _myData.rarity = (750 - uint256(traitTotals[_myData.clearanceLevel]) ) * (10**8) + (4500 - uint256( traitTotals[_myData.station] + traitTotals[_myData.securityTerminal] + traitTotals[_myData.xenGroup] + traitTotals[_myData.command] + traitTotals[_myData.response] + traitTotals[_myData.insult] )) * (10**4) + 3000 - (_tokenId); tokenIdToPackedData[_tokenId] = packData(_myData.clearanceLevel, _myData.station, _myData.securityTerminal, _myData.xenGroup, _myData.command, _myData.response, _myData.insult, _myData.rarity); } /** @dev takes a blank NFT and gives it stats. For the 250 Team mints, it gives it a clearance level @param _tokenId id of token */ function initiate(uint256 _tokenId) external { require(_tokenId < 250 && tokenIdToPackedData[_tokenId] == 0); // dev: can not initiate uint256 _clearanceLevel; if (_tokenId < 30) { // gman is default _clearanceLevel = 0; } else if (_tokenId < 90){ _clearanceLevel = 1; } else if (_tokenId < 130){ _clearanceLevel = 2; } else if (_tokenId < 180){ _clearanceLevel = 3; } else if (_tokenId < 200){ _clearanceLevel = 4; } else if (_tokenId < 215){ _clearanceLevel = 5; } else if (_tokenId < 225){ _clearanceLevel = 6; } else if (_tokenId < 235){ _clearanceLevel = 7; } else if (_tokenId < 245){ _clearanceLevel = 8; } else if (_tokenId < 250){ _clearanceLevel = 9; } else{ // nothing } createDataGivenClearanceLevel(_clearanceLevel, _tokenId); } function _bulkClaim(uint256[] memory _BytesReceived, uint256 _quantity_to_mint) internal { uint256 _requiredBytesTotal; for(uint256 i = 0;i < _BytesReceived.length; i++){ _requiredBytesTotal += _BytesReceived[i]; } if(_requiredBytesTotal > 0 && msg.sender != owner()){ require(BytesERC20.balanceOf(msg.sender) >= _requiredBytesTotal, "Insufficient Byte balance"); require(BytesERC20.transferFrom(msg.sender, address(this), _requiredBytesTotal), "Failed to transfer Bytes"); } uint16[13] memory _availClearanceLevels; uint256 _myClearanceLevel; for(uint256 i=0;i<_quantity_to_mint;i++){ if(i==0){ _availClearanceLevels = _getAvailableClearanceLevelsGivenBytes(_BytesReceived[i]); } else { _availClearanceLevels[_myClearanceLevel] -= 1; // reduce by one } _myClearanceLevel = _chooseTraitGivenArray(_availClearanceLevels, i); createDataGivenClearanceLevel(_myClearanceLevel, currentIndex + i); clearanceLevelsRemaining[_myClearanceLevel] -= 1; } _safeMint(msg.sender, _quantity_to_mint); } /** @dev Claims (mint) Black Meta Multipass @param _BytesReceived -- Bytes to transfer to contract. Used for minting, higher amounts give better mints. @param _merkleProof -- Merkle proof, computed off chain */ function claim(uint256 _BytesReceived, bytes32[] calldata _merkleProof, uint256 _whitelist_position) external payable nonReentrant { // i don't think non-rentrant needs to be here // require(bypassWhitelist == true || whiteListContract.isWhitelisted(_merkleProof, msg.sender)==true, "Not whitelisted"); require(contractSettings.bypassWhitelist == true || whiteListContract.isWhitelisted(msg.sender, _whitelist_position, _merkleProof)==true, "Not whitelisted"); require(currentIndex < contractSettings.maxSupply ); require(whiteListHasMinted[msg.sender] == 0, "address already minted"); require(msg.value >= contractSettings.mintFee); require(contractSettings.mintingPermitted==true, "Minting is currently not permitted."); whiteListHasMinted[msg.sender] += 1; uint256[] memory _myBytesArray = new uint256[](1); _myBytesArray[0] = _BytesReceived; _bulkClaim(_myBytesArray, 1); // _claim(_BytesReceived); } /** @dev Constructor for Black Meta Multipass @param _BytesAddress -- Contract Address for Bytes. @param _baseURI -- Background Image for tokenUri Image */ constructor(address _BytesAddress, address _whiteListAddress, address _royaltiesCollector, string memory _baseURI) ERC721A("Black Meta Multipass", "BMPASS") Ownable() ERC2981Collection(_royaltiesCollector, 750) { BytesERC20 = IERC20(_BytesAddress); whiteListContract = Whitelist(_whiteListAddress); baseURI = _baseURI; contractSettings = ContractSettings({ mintFee: 0, //0.05 ether, maxSupply: 3000, OGPrivilege: true, mintingPermitted: true, bypassWhitelist: false }); // mint 250 blank NFTs for team. These are initiated by team members at their own cost // // they have a present clearanceLevel according to their tokenId // _safeMint(msg.sender, 250); } // Required to receive ETH receive() external payable { } ///////////////////////////////////////////// ///////// MetaData, Image Functions ///////// ///////////////////////////////////////////// /** @dev Formats string into code for typing on image terminal @param _line -- vertical starting position. @param _duration -- animation duration. @param _startTime -- time to begin animation (invisible beforehand). @param _txt -- text to animate (width/characters must be less than terminal size--or visual overflow) */ function getSVGTextGivenLine(uint256 _line, uint256 _duration, uint256 _startTime, string memory _txt) internal view returns (string memory) { string memory ret = string(abi.encodePacked( "%3Cpath id='path", toString(_line), "'%3E %3Canimate attributeName='d' from='m50, ", toString(170 + _line*14), " h0' to='m50, ", toString(170 + _line*14), " h1100' dur='", toString(_duration), "s' begin='", toString(_startTime), "s' fill='freeze'/%3E%3C/path%3E" )); ret = string(abi.encodePacked(ret, "%3Ctext class='bm'%3E %3CtextPath xlink:href='%23path", toString(_line), "'%3E", _txt, "%3C/textPath%3E", "%3C/text%3E" )); return ret; } function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) { require(_exists(_tokenId), "ERC721Metadata: URI query for nonexistent token"); Data memory _myData = unpackData(_tokenId); string[13] memory _fontColors = [ '00DEFF', '00DEFF', 'C5ACFF', 'C5ACFF', '8BFF7C', '8BFF7C', '8BFF7C', 'FF8D8D', 'FF8D8D', 'FF8D8D', 'FFFE8D', 'FFFE8D', 'B1FCFF' ]; string memory style = string(abi.encodePacked( "%3Cstyle%3E", "@import url('https://fonts.googleapis.com/css2?family=VT323');", ".bm %7B", "font-family: 'VT323', monospace;", "font-size:12px;", "fill: %23", _fontColors[_myData.clearanceLevel], "%7D", "%3C/style%3E" )); string memory header = string(abi.encodePacked( style, "%3Ctext class='bm' x='50%25' y='90' text-anchor='middle' %3ESA/RA 9000 OPERATING SYSTEM %3C/text%3E", "%3Ctext class='bm' x='50%25' y='110' text-anchor='middle' %3ECOPYRIGHT 2022-2175 BLACK META CORPORATION%3C/text%3E", "%3Ctext class='bm' x='50%25' y='130' text-anchor='middle' %3E --SECURITY TERMINAL ", toString(_myData.clearanceLevel + 1), "-- %3C/text%3E" )); string[25] memory textLines = [ '--Black Meta Security Scan Subsystem--', '=============================================', 'Sa/RaOS v. 7.21', '(C)2022 Black Meta Corp.(TM))', '=============================================', '| %3E%3E Running Security Scan... COMPLETE ', '| User Log: ', string(abi.encodePacked('| %3E%3E MultipassID: ', toString(_tokenId))), '| Security Clearance: ', string(abi.encodePacked('| %3E%3E ', clearanceLevels[_myData.clearanceLevel] )), '| Welcome to Black Meta.', '| %3E%3E Assigning Quarters... COMPLETE ', string(abi.encodePacked('| %3E%3E Xen ', toString(_myData.xenGroup + 1) )), '| %3E%3E Assigning Station... COMPLETE ', string(abi.encodePacked('| %3E%3E ', stations[_myData.station] )), '%3E| %3E%3E Granting Subroot Access... COMPLETE ', '%3E| %3E%3E Opening Command Subroot... COMPLETE ', '====================================', '%3E> Hello. How can I fix your total failures?', string(abi.encodePacked('%3E C:%3E ', commands[_myData.command])), string(abi.encodePacked('%3E| ', responses[_myData.response])), '%3E| %3E%3E Alerting Security Assistance... COMPLETE', '%3E| %3E%3E Starting Insult Protocol 2.3... COMPLETE', '====================================', string(abi.encodePacked('%3E| %3E%3E ', insults[_myData.insult])) ]; // OVERLAY MUST BE SAME FORMAT (WEBP) string memory colorOverlay = string(abi.encodePacked( "%3Cimage xlink:href='", baseURI ,"/", toString(_myData.clearanceLevel) , ".png' width='600' height='600' /%3E" )); string memory textOverlay=""; uint256 startTime = 0; uint256 duration = 5; uint256 flag = 0; for(uint256 i=0;i< textLines.length;i++){ textOverlay = string(abi.encodePacked(textOverlay, getSVGTextGivenLine(i, duration, startTime, textLines[i]), " ")); startTime += duration/2; if(flag==1) { break;} } string memory footer = string(abi.encodePacked( "%3Cpath id='pathfinal'%3E%3Canimate attributeName='d' from='m180,550 h0' to='m180,550 h1100' dur='7s' begin='", toString(startTime) , "s' fill='freeze'/%3E%3C/path%3E", "%3Ctext%3E%3CtextPath xlink:href='%23pathfinal' class='bm'%3ERETURN: enter | BACKSPACE : delete | F1: main menu%3C/textPath%3E%3C/text%3E" )); string memory mainImage; mainImage = string(abi.encodePacked( "%3Cimage xlink:href='", baseURI ,"/a.png' width='600' height='600' /%3E" )); string memory SVG = string(abi.encodePacked( // Container "%3Csvg xmlns='http://www.w3.org/2000/svg' width='600' xmlns:xlink='http://www.w3.org/1999/xlink' height='600'%3E %3Crect width='600' height='600' style='fill:rgb(255,255,255);stroke-width:3;stroke:rgb(0,0,0)' /%3E", // Main image mainImage, colorOverlay, header, // text outlines textOverlay, footer, // Error Message "Unsupported.", "%3C/svg%3E" )); return formatTokenURI(_tokenId, svgToImageURI(SVG)); } /** @dev Converts svg to dataURI @param svg -- svg to turn into dataURI. */ function svgToImageURI(string memory svg) internal pure returns (string memory) { bool ENCODE = false; string memory baseURL = "data:image/svg+xml;base64,"; if (!ENCODE) { baseURL = "data:image/svg+xml,"; return string(abi.encodePacked(baseURL,svg)); } string memory svgBase64Encoded = Base64.encode(bytes(svg)); return string(abi.encodePacked(baseURL,svgBase64Encoded)); } /** @dev Packs metadata, including image, into a dataURI @param _tokenId -- ID of BMMultipass @param imageURI -- URI of image */ function formatTokenURI(uint256 _tokenId, string memory imageURI) internal view returns (string memory) { if(tokenIdToPackedData[_tokenId] == 0) { return string(abi.encodePacked(baseURI, "/access_denied.json" )); } Data memory _myData = unpackData(_tokenId); string memory json_str = string(abi.encodePacked( '{"description": "The ticket into the Black Meta Multiverse."', ', "external_url": "https://blackmeta.site"', ', "image": "', // to do -- check on this baseURI, "/a", toString(_myData.clearanceLevel), '.png"', ', "data_uri": "', // imageURI, '"', ', "name": "Black Meta Multipass"', // attributes ', "attributes": [{"trait_type": "Clearance Level", "value": "', clearanceLevels[_myData.clearanceLevel], '" }' )); json_str = string(abi.encodePacked(json_str, ', {"trait_type": "Station", "value": "', stations[_myData.station], '" }', ', {"trait_type": "Security Terminal", "value": "', // securityTerminals[_myData.securityTerminal], '" }' toString(_myData.securityTerminal + 1), '" }' )); json_str = string(abi.encodePacked(json_str, ', {"trait_type": "Xen Groups", "value": "Xen ', // xenGroups[_myData.xenGroup], '" }', toString(_myData.xenGroup + 1), '" }', ', {"trait_type": "Command", "value": "', commands[_myData.command], '" }' )); json_str = string(abi.encodePacked(json_str, ', {"trait_type": "Response", "value": "', responses[_myData.response], '" }', ', {"trait_type": "Insult", "value": "', insults[_myData.insult], '" }', ', {"trait_type": "Rarity", "value": ', // "display_type": "number", toString(_myData.rarity), ' }' )); json_str = string(abi.encodePacked(json_str, ']', // End Attributes '}' )); return string(abi.encodePacked("data:application/json;base64,", Base64.encode(bytes(json_str)))); } /////////////////////////////////// ///////// Admin Functions ///////// /////////////////////////////////// function withdrawBytes( address _recipient) external onlyOwner nonReentrant { uint256 _BytesReleased = BytesERC20.balanceOf(address(this)); require(BytesERC20.transfer(_recipient, BytesERC20.balanceOf(address(this))), "Bytes transfer failed."); emit FundsReleasedToAccount(0, _BytesReleased, _recipient, block.timestamp); } function withdrawEth( address payable _recipient) external onlyOwner nonReentrant { uint256 amountReleased = address(this).balance; (bool success, ) = _recipient.call{value : address(this).balance}("Releasing ETH."); require(success, "Transfer failed."); emit FundsReleasedToAccount(amountReleased, 0, _recipient, block.timestamp); } function setBytesAddress(address _contractAddress) external onlyOwner { BytesERC20 = IERC20(_contractAddress); } function setWhiteListContractAddress(address _contractAddress) external onlyOwner { whiteListContract = Whitelist(_contractAddress); } function setOGPrivilege(bool _OGPrivilege) external onlyOwner { require(contractSettings.OGPrivilege != _OGPrivilege, "must be 1 or 0, and not same as current."); contractSettings.OGPrivilege = _OGPrivilege; } function setMintingPermitted(bool _mintingPermitted) external onlyOwner { require(contractSettings.mintingPermitted != _mintingPermitted, "must be 1 or 0, and not same as current."); contractSettings.mintingPermitted = _mintingPermitted; } function setBypassWhitelist(bool _bypassWhitelist) external onlyOwner { require(contractSettings.bypassWhitelist != _bypassWhitelist, "must be 1 or 0, and not same as current."); contractSettings.bypassWhitelist = _bypassWhitelist; } function setBaseURI(string memory _baseURI) external onlyOwner { baseURI = _baseURI; } function setRoyaltyPercent(uint256 _percentage) external onlyOwner { _setRoyaltyPercent(_percentage); } function setRoyaltyAddress(address _receiver) external onlyOwner { _setRoyaltyAddress(_receiver); } /** @dev sets mint fee in ETH for all mints @param _mintFee -- ETH required to mint, must not exceed 2^208 -1 or overflow */ function setMintFee(uint256 _mintFee) external onlyOwner { contractSettings.mintFee = uint208(_mintFee); } /** @dev Upgrades a clearanceLevel. Used for rewards @param _tokenId -- id of NFT @param _newClearanceLevel -- clearanceLevel to be upgraded to */ function upgradeClearanceLevel(uint256 _tokenId, uint256 _newClearanceLevel) external onlyOwner { Data memory _myData = unpackData(_tokenId); require(_exists(_tokenId) && _myData.clearanceLevel > _newClearanceLevel); // dev: Id must exist and must increase CL // require(_exists(_tokenId), "NFT DOES NOT EXIST"); // lesser number is superior // require(_myData.clearanceLevel > _newClearanceLevel, "upgraded must lower cl #"); // lesser number is superior _myData.clearanceLevel = _newClearanceLevel; tokenIdToPackedData[_tokenId] = packData(_myData.clearanceLevel, _myData.station, _myData.securityTerminal, _myData.xenGroup, _myData.command, _myData.response, _myData.insult, _myData.rarity); } ///////////////////////////////////// ///////// Helper Functions ////////// ///////////////////////////////////// function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT license // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_BytesAddress","type":"address"},{"internalType":"address","name":"_whiteListAddress","type":"address"},{"internalType":"address","name":"_royaltiesCollector","type":"address"},{"internalType":"string","name":"_baseURI","type":"string"}],"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":false,"internalType":"uint256","name":"EthAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"BytesAmount","type":"uint256"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"date","type":"uint256"}],"name":"FundsReleasedToAccount","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_BytesReceived","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"},{"internalType":"uint256","name":"_whitelist_position","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"contractSettings","outputs":[{"internalType":"uint208","name":"mintFee","type":"uint208"},{"internalType":"uint16","name":"maxSupply","type":"uint16"},{"internalType":"bool","name":"OGPrivilege","type":"bool"},{"internalType":"bool","name":"mintingPermitted","type":"bool"},{"internalType":"bool","name":"bypassWhitelist","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAvailableClearanceLevels","outputs":[{"internalType":"uint16[13]","name":"","type":"uint16[13]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_Bytes","type":"uint256"}],"name":"getAvailableClearanceLevelsGivenBytes","outputs":[{"internalType":"string[]","name":"","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getClearanceLevel","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getCommand","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getInsult","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getRarity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getResponse","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getSecurityTerminal","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getStation","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getUserGroup","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"initiate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_bypassWhitelist","type":"bool"}],"name":"setBypassWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contractAddress","type":"address"}],"name":"setBytesAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintFee","type":"uint256"}],"name":"setMintFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_mintingPermitted","type":"bool"}],"name":"setMintingPermitted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_OGPrivilege","type":"bool"}],"name":"setOGPrivilege","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"}],"name":"setRoyaltyAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_percentage","type":"uint256"}],"name":"setRoyaltyPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contractAddress","type":"address"}],"name":"setWhiteListContractAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_newClearanceLevel","type":"uint256"}],"name":"upgradeClearanceLevel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"}],"name":"withdrawBytes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_recipient","type":"address"}],"name":"withdrawEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
610220604052600a6080908152601460a052605060c052606460e05260af6101005260d26101205260f561014090815261010461016052610113610180526101276101a0526101c0526101546101e0526101a4610200526200006690601190600d62001082565b50604080516101a08101825260288152605060208201526078918101919091526096606082015260c3608082015260e160a082015260ff60c082015261010e60e082015261011d61010082015261012c610120820152610140808201526101546101608201526101a4610180820152620000e590601290600d62001082565b50604080516101e08101825260056101a08201818152642396b6b0b760d91b6101c084015282528251808401845290815264109bd85c9960da1b6020828101919091528083019190915282518084018452600981526845786563757469766560b81b81830152828401528251808401845260088152674461726b204f707360c01b818301526060830152825180840184526007808252664c6576656c203960c81b8284015260808401919091528351808501855281815266098caeccad840760cb1b8184015260a084015283518085018552818152664c6576656c203760c81b8184015260c084015283518085018552818152662632bb32b6101b60c91b8184015260e084015283518085018552818152664c6576656c203560c81b81840152610100840152835180850185528181526613195d995b080d60ca1b8184015261012084015283518085018552818152664c6576656c203360c81b8184015261014084015283518085018552818152662632bb32b6101960c91b8184015261016084015283518085019094528352664c6576656c203160c81b908301526101808101919091526200029a90601390600d6200111f565b50604080516101e081018252600a6101a08201908152690a6e0cac6d2dacadc40760b31b6101c08301528152815180830183526011808252702837b63cb6b7b938341021b430b6b132b960791b60208381019190915280840192909252835180850185529081527029bab832b91029b7b63234b2b9102630b160791b818301528284015282518084018452601381527f4461726b204d61747465722052656163746f720000000000000000000000000081830152606083015282518084018452600e81526d098c2dac4c8c24086dedae0d8caf60931b81830152608083015282518084018452600c81526b4368696d657261204869766560a01b8183015260a083015282518084018452600f8082526e2230b9359029b430b93239902630b160891b8284015260c0840191909152835180850185529081526e456e67696e656572696e672042617960881b8183015260e08301528251808401845260078152662134b7902630b160c91b818301526101008301528251808401845260068082526542726964676560d01b8284015261012084019190915283518085018552601081526f5465727261666f726d696e672042617960801b81840152610140840152835180850185529081526541726d6f727960d01b818301526101608301528251808401909352600b83526a4d61696e74656e616e636560a81b83820152610180820192909252620004ae9190600d6200111f565b50604051806101a001604052806040518060400160405280601a81526020017f496e697469617465204368616f732050726f746f636f6c2e2e2e00000000000081525081526020016040518060400160405280601781526020017f556e6c6f636b20576561706f6e732043616368652e2e2e0000000000000000008152508152602001604051806060016040528060258152602001620071056025913981526020016040518060400160405280601781526020017f556e6c6f636b2053687574746c652042617920342e2e2e00000000000000000081525081526020016040518060400160405280601c81526020017f556e6c6f636b204361707461696e27732051756172746572732e2e2e0000000081525081526020016040518060600160405280602181526020016200737c6021913981526020016040518060400160405280601781526020017f456e6761676520416674205468727573746572732e2e2e00000000000000000081525081526020016040518060400160405280601581526020017f47697665204d6520612053616e64776963682e2e2e000000000000000000000081525081526020016040518060400160405280601981526020017f41636365737320576561706f6e72792053797374656d2e2e2e0000000000000081525081526020016040518060400160405280601981526020017f4f76657272696465205368697020496e746572636f6d2e2e2e0000000000000081525081526020016040518060400160405280601b81526020017f4f766572726964652042726964676520436f6e74726f6c732e2e2e000000000081525081526020016040518060600160405280602781526020016200759d6027913981526020016040518060400160405280601381526020017f416363657373204d6573732048616c6c2e2e2e00000000000000000000000000815250815250602d90600d620007769291906200111f565b50604080516102008101909152602c6101a082018181528291620074fe6101c084013981526020016040518060600160405280602b81526020016200712a602b913981526020016040518060600160405280602a81526020016200739d602a913981526020016040518060600160405280602c81526020016200741c602c913981526020016040518060600160405280602f815260200162007448602f91398152602001604051806060016040528060228152602001620072056022913981526020016040518060600160405280602b8152602001620073f1602b91398152602001604051806060016040528060268152602001620072f96026913981526020016040518060600160405280602b815260200162007155602b91398152602001604051806060016040528060288152602001620074d66028913981526020016040518060600160405280602f81526020016200756e602f913981526020016040518060600160405280602f815260200162007477602f913981526020016040518060600160405280602e81526020016200729b602e913990526200091f90603a90600d6200111f565b50604080516102008101909152602c6101a082018181528291620071ab6101c084013981526020016040518060600160405280602981526020016200724a6029913981526020016040518060400160405280602081526020017f44696420796f75206a75737420746f756368206d79206261636b73706163653f81525081526020016040518060600160405280602f81526020016200734d602f91398152602001604051806060016040528060308152602001620072c96030913981526020016040518060600160405280602e8152602001620071d7602e91398152602001604051806060016040528060238152602001620072276023913981526020016040518060600160405280602a8152602001620073c7602a913981526020016040518060600160405280602b815260200162007180602b9139815260200160405180606001604052806028815260200162007273602891398152602001604051806060016040528060308152602001620074a66030913981526020016040518060600160405280602e81526020016200731f602e913981526020016040518060600160405280602481526020016200752a60249139905262000ae490604790600d6200111f565b5034801562000af257600080fd5b50604051620075c4380380620075c483398101604081905262000b1591620012cb565b604080518082018252601481527f426c61636b204d657461204d756c746970617373000000000000000000000000602080830191825283518085019094526006845265424d5041535360d01b90840152815185936102ee9392909162000b7e9160019162001172565b50805162000b9490600290602084019062001172565b505060016007555062000ba73362000c82565b612710600a54111562000bb957600080fd5b600980546001600160a01b03199081166001600160a01b0394851617909155600a91909155600b80548216878416179055600c8054909116918516919091179055805162000c0f90600d90602084019062001172565b506040805160a0810182526000808252610bb860208301526001928201839052606082019290925260800152601080547fff00000000000000000000000000000000000000000000000000000000000000166220217760d31b17905562000c783360fa62000cd4565b5050505062001482565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b62000cf682826040518060200160405280600081525062000cfa60201b60201c565b5050565b62000d09838383600162000d0e565b505050565b6000546001600160a01b03851662000d775760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084015b60405180910390fd5b8362000dd75760405162461bcd60e51b815260206004820152602860248201527f455243373231413a207175616e74697479206d75737420626520677265617465604482015267072207468616e20360c41b606482015260840162000d6e565b6001600160a01b03851660008181526004602090815260408083208054600160801b6001600160801b031982166001600160801b039283168c01831690811782900483168c01909216021790558483526003909152812080546001600160e01b031916909217600160a01b426001600160401b0316021790915581905b8581101562000f115760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4831562000f045762000eab600088848862000f22565b62000f045760405162461bcd60e51b815260206004820152603360248201526000805160206200754e83398151915260448201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606482015260840162000d6e565b6001918201910162000e54565b506000555050505050565b50505050565b600062000f43846001600160a01b03166200107c60201b620029521760201c565b156200107057604051630a85bd0160e11b81526001600160a01b0385169063150b7a029062000f7d903390899088908890600401620013bc565b6020604051808303816000875af192505050801562000fbb575060408051601f3d908101601f1916820190925262000fb89181019062001412565b60015b62001055573d80801562000fec576040519150601f19603f3d011682016040523d82523d6000602084013e62000ff1565b606091505b5080516200104d5760405162461bcd60e51b815260206004820152603360248201526000805160206200754e83398151915260448201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606482015260840162000d6e565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905062001074565b5060015b949350505050565b3b151590565b6001830191839082156200110d5791602002820160005b83821115620010db57835183826101000a81548161ffff021916908361ffff160217905550926020019260020160208160010104928301926001030262001099565b80156200110b5782816101000a81549061ffff0219169055600201602081600101049283019260010302620010db565b505b506200111b929150620011ef565b5090565b82600d810192821562001164579160200282015b828111156200116457825180516200115391849160209091019062001172565b509160200191906001019062001133565b506200111b92915062001206565b828054620011809062001445565b90600052602060002090601f016020900481019282620011a457600085556200110d565b82601f10620011bf57805160ff19168380011785556200110d565b828001600101855582156200110d579182015b828111156200110d578251825591602001919060010190620011d2565b5b808211156200111b5760008155600101620011f0565b808211156200111b5760006200121d828262001227565b5060010162001206565b508054620012359062001445565b6000825580601f1062001246575050565b601f016020900490600052602060002090810190620012669190620011ef565b50565b80516001600160a01b03811681146200128157600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b83811015620012b95781810151838201526020016200129f565b8381111562000f1c5750506000910152565b60008060008060808587031215620012e257600080fd5b620012ed8562001269565b9350620012fd6020860162001269565b92506200130d6040860162001269565b60608601519092506001600160401b03808211156200132b57600080fd5b818701915087601f8301126200134057600080fd5b81518181111562001355576200135562001286565b604051601f8201601f19908116603f0116810190838211818310171562001380576200138062001286565b816040528281528a60208487010111156200139a57600080fd5b620013ad8360208301602088016200129c565b979a9699509497505050505050565b600060018060a01b038087168352808616602084015250836040830152608060608301528251806080840152620013fb8160a08501602087016200129c565b601f01601f19169190910160a00195945050505050565b6000602082840312156200142557600080fd5b81516001600160e01b0319811681146200143e57600080fd5b9392505050565b600181811c908216806200145a57607f821691505b602082108114156200147c57634e487b7160e01b600052602260045260246000fd5b50919050565b615c7380620014926000396000f3fe6080604052600436106102815760003560e01c806355f804b31161014f578063a22cb465116100c1578063e985e9c51161007a578063e985e9c51461081b578063eb4bf09c14610864578063eddd0d9c14610886578063f2fde38b146108a6578063f339f526146108c6578063fb624c25146108d957600080fd5b8063a22cb465146106f1578063a85b453014610711578063b6b57c9e14610731578063b88d4fde14610751578063c87b56dd14610771578063db2a0a551461079157600080fd5b80637901ea78116101135780637901ea781461063e57806383c24f321461065e5780638da5cb5b1461067e57806395d89b411461069c5780639a4fc640146106b1578063a19590d4146106d157600080fd5b806355f804b3146105a95780636352211e146105c957806370a08231146105e957806370c1819914610609578063715018a61461062957600080fd5b80632120ba6f116101f3578063352704b7116101ac578063352704b7146104dc57806342842e0e146104fc57806346b988e51461051c57806348758697146105495780634d2c3899146105695780634f6ccce71461058957600080fd5b80632120ba6f146103fd57806323b872dd1461041d5780632471e6eb1461043d57806325e160631461045d5780632a55205a1461047d5780632f745c59146104bc57600080fd5b80630d9005ae116102455780630d9005ae1461035e578063106e054d1461037d578063140c08a51461039d57806318160ddd1461035e57806320595c48146103bd57806320600331146103dd57600080fd5b806301ffc9a71461028d57806306d254da146102c257806306fdde03146102e4578063081812fc14610306578063095ea7b31461033e57600080fd5b3661028857005b600080fd5b34801561029957600080fd5b506102ad6102a83660046142af565b6108f9565b60405190151581526020015b60405180910390f35b3480156102ce57600080fd5b506102e26102dd3660046142e8565b610966565b005b3480156102f057600080fd5b506102f96109ba565b6040516102b9919061435d565b34801561031257600080fd5b50610326610321366004614370565b610a4c565b6040516001600160a01b0390911681526020016102b9565b34801561034a57600080fd5b506102e2610359366004614389565b610ad7565b34801561036a57600080fd5b506000545b6040519081526020016102b9565b34801561038957600080fd5b506102f9610398366004614370565b610bef565b3480156103a957600080fd5b506102e26103b83660046142e8565b610cf1565b3480156103c957600080fd5b506102f96103d8366004614370565b610d3d565b3480156103e957600080fd5b506102f96103f8366004614370565b610dab565b34801561040957600080fd5b506102f9610418366004614370565b610e1d565b34801561042957600080fd5b506102e26104383660046143b5565b610e8e565b34801561044957600080fd5b506102e2610458366004614404565b610e99565b34801561046957600080fd5b506102e26104783660046142e8565b610f12565b34801561048957600080fd5b5061049d610498366004614421565b61106e565b604080516001600160a01b0390931683526020830191909152016102b9565b3480156104c857600080fd5b5061036f6104d7366004614389565b6110a4565b3480156104e857600080fd5b506102f96104f7366004614370565b611201565b34801561050857600080fd5b506102e26105173660046143b5565b611294565b34801561052857600080fd5b5061053c610537366004614370565b6112af565b6040516102b99190614443565b34801561055557600080fd5b5061036f610564366004614370565b611476565b34801561057557600080fd5b506102e26105843660046142e8565b61149f565b34801561059557600080fd5b5061036f6105a4366004614370565b6116e1565b3480156105b557600080fd5b506102e26105c4366004614531565b611743565b3480156105d557600080fd5b506103266105e4366004614370565b611784565b3480156105f557600080fd5b5061036f6106043660046142e8565b611796565b34801561061557600080fd5b506102f9610624366004614370565b611827565b34801561063557600080fd5b506102e2611898565b34801561064a57600080fd5b506102e2610659366004614370565b6118ce565b34801561066a57600080fd5b506102e2610679366004614404565b6119a5565b34801561068a57600080fd5b506008546001600160a01b0316610326565b3480156106a857600080fd5b506102f9611a1e565b3480156106bd57600080fd5b506102e26106cc366004614370565b611a2d565b3480156106dd57600080fd5b506102e26106ec366004614421565b611a60565b3480156106fd57600080fd5b506102e261070c36600461457a565b611b08565b34801561071d57600080fd5b506102f961072c366004614370565b611bcd565b34801561073d57600080fd5b506102e261074c3660046142e8565b611c3e565b34801561075d57600080fd5b506102e261076c3660046145b3565b611c8a565b34801561077d57600080fd5b506102f961078c366004614370565b611cc3565b34801561079d57600080fd5b506010546107de906001600160d01b0381169061ffff600160d01b8204169060ff600160e01b8204811691600160e81b8104821691600160f01b9091041685565b604080516001600160d01b03909616865261ffff90941660208601529115159284019290925290151560608301521515608082015260a0016102b9565b34801561082757600080fd5b506102ad610836366004614633565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b34801561087057600080fd5b50610879612525565b6040516102b99190614661565b34801561089257600080fd5b506102e26108a1366004614370565b612588565b3480156108b257600080fd5b506102e26108c13660046142e8565b6125d4565b6102e26108d4366004614697565b61266c565b3480156108e557600080fd5b506102e26108f4366004614404565b6128d9565b60006001600160e01b031982166380ac58cd60e01b148061092a57506001600160e01b03198216635b5e139f60e01b145b8061094557506001600160e01b0319821663780e9d6360e01b145b8061096057506301ffc9a760e01b6001600160e01b03198316145b92915050565b6008546001600160a01b031633146109995760405162461bcd60e51b81526004016109909061471c565b60405180910390fd5b600980546001600160a01b0319166001600160a01b03831617905550565b50565b6060600180546109c990614751565b80601f01602080910402602001604051908101604052809291908181526020018280546109f590614751565b8015610a425780601f10610a1757610100808354040283529160200191610a42565b820191906000526020600020905b815481529060010190602001808311610a2557829003601f168201915b5050505050905090565b6000610a59826000541190565b610abb5760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b6064820152608401610990565b506000908152600560205260409020546001600160a01b031690565b6000610ae282611784565b9050806001600160a01b0316836001600160a01b03161415610b515760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b6064820152608401610990565b336001600160a01b0382161480610b6d5750610b6d8133610836565b610bdf5760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006064820152608401610990565b610bea838383612958565b505050565b6060610bfc826000541190565b610c0557600080fd5b6000828152600e6020526040902054610c4157505060408051808201909152600d81526c1050d0d154d4c8111153925151609a1b602082015290565b6020610c4c836129b4565b60200151600d8110610c6057610c6061478c565b018054610c6c90614751565b80601f0160208091040260200160405190810160405280929190818152602001828054610c9890614751565b8015610ce55780601f10610cba57610100808354040283529160200191610ce5565b820191906000526020600020905b815481529060010190602001808311610cc857829003601f168201915b50505050509050919050565b6008546001600160a01b03163314610d1b5760405162461bcd60e51b81526004016109909061471c565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b6060610d4a826000541190565b610d5357600080fd5b6000828152600e6020526040902054610d8f57505060408051808201909152600d81526c1050d0d154d4c8111153925151609a1b602082015290565b6013610d9a836129b4565b51600d8110610c6057610c6061478c565b6060610db8826000541190565b610dc157600080fd5b6000828152600e6020526040902054610dfd57505060408051808201909152600d81526c1050d0d154d4c8111153925151609a1b602082015290565b610960610e09836129b4565b60400151610e189060016147b8565b6129d4565b6060610e2a826000541190565b610e3357600080fd5b6000828152600e6020526040902054610e6f57505060408051808201909152600d81526c1050d0d154d4c8111153925151609a1b602082015290565b602d610e7a836129b4565b60800151600d8110610c6057610c6061478c565b610bea838383612ada565b6008546001600160a01b03163314610ec35760405162461bcd60e51b81526004016109909061471c565b60105460ff600160e01b9091041615158115151415610ef45760405162461bcd60e51b8152600401610990906147d0565b60108054911515600160e01b0260ff60e01b19909216919091179055565b6008546001600160a01b03163314610f3c5760405162461bcd60e51b81526004016109909061471c565b60026007541415610f5f5760405162461bcd60e51b815260040161099090614818565b60026007556040516d2932b632b0b9b4b7339022aa241760911b815247906000906001600160a01b038416904790600e0160006040518083038185875af1925050503d8060008114610fcd576040519150601f19603f3d011682016040523d82523d6000602084013e610fd2565b606091505b50509050806110165760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b6044820152606401610990565b60408051838152600060208201526001600160a01b0385168183015242606082015290517fa71dafbe3498b278b06a596f8412cf056d7c0972c3623447ade8f63606df95a19181900360800190a15050600160075550565b600954600a546001600160a01b039091169060009061271090611091908561484f565b61109b9190614884565b90509250929050565b60006110af83611796565b82106111085760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401610990565b600080549080805b838110156111a1576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff16918301919091521561116357805192505b876001600160a01b0316836001600160a01b0316141561119857868414156111915750935061096092505050565b6001909301925b50600101611110565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b6064820152608401610990565b606061120e826000541190565b61121757600080fd5b6000828152600e602052604090205461125357505060408051808201909152600d81526c1050d0d154d4c8111153925151609a1b602082015290565b61126e61125f836129b4565b60600151610e189060016147b8565b60405160200161127e91906148b4565b6040516020818303038152906040529050919050565b610bea83838360405180602001604052806000815250611c8a565b606060006112bc83612dbf565b90506000805b600d81101561130e5760008382600d81106112df576112df61478c565b602002015161ffff1611156112fc576112f96001836147b8565b91505b80611306816148e0565b9150506112c2565b5060008167ffffffffffffffff81111561132a5761132a6144a5565b60405190808252806020026020018201604052801561135d57816020015b60608152602001906001900390816113485790505b5090506000915060005b600d81101561146d5760008482600d81106113845761138461478c565b602002015161ffff16111561145b57601381600d81106113a6576113a661478c565b0180546113b290614751565b80601f01602080910402602001604051908101604052809291908181526020018280546113de90614751565b801561142b5780601f106114005761010080835404028352916020019161142b565b820191906000526020600020905b81548152906001019060200180831161140e57829003601f168201915b50505050508284815181106114425761144261478c565b60209081029190910101526114586001846147b8565b92505b80611465816148e0565b915050611367565b50949350505050565b6000611483826000541190565b61148c57600080fd5b611495826129b4565b60e0015192915050565b6008546001600160a01b031633146114c95760405162461bcd60e51b81526004016109909061471c565b600260075414156114ec5760405162461bcd60e51b815260040161099090614818565b6002600755600b546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa15801561153a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061155e91906148fb565b600b546040516370a0823160e01b81523060048201529192506001600160a01b03169063a9059cbb90849083906370a0823190602401602060405180830381865afa1580156115b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115d591906148fb565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015611620573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116449190614914565b6116895760405162461bcd60e51b8152602060048201526016602482015275213cba32b9903a3930b739b332b9103330b4b632b21760511b6044820152606401610990565b6040805160008152602081018390526001600160a01b0384168183015242606082015290517fa71dafbe3498b278b06a596f8412cf056d7c0972c3623447ade8f63606df95a19181900360800190a150506001600755565b60008054821061173f5760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b6064820152608401610990565b5090565b6008546001600160a01b0316331461176d5760405162461bcd60e51b81526004016109909061471c565b805161178090600d906020840190614182565b5050565b600061178f82612fbd565b5192915050565b60006001600160a01b0382166118025760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b6064820152608401610990565b506001600160a01b03166000908152600460205260409020546001600160801b031690565b6060611834826000541190565b61183d57600080fd5b6000828152600e602052604090205461187957505060408051808201909152600d81526c1050d0d154d4c8111153925151609a1b602082015290565b603a611884836129b4565b60a00151600d8110610c6057610c6061478c565b6008546001600160a01b031633146118c25760405162461bcd60e51b81526004016109909061471c565b6118cc6000613094565b565b60fa811080156118ea57506000818152600e6020526040902054155b6118f357600080fd5b6000601e8210156119065750600061199b565b605a8210156119175750600161199b565b60828210156119285750600261199b565b60b48210156119395750600361199b565b60c882101561194a5750600461199b565b60d782101561195b5750600561199b565b60e182101561196c5750600661199b565b60eb82101561197d5750600761199b565b60f582101561198e5750600861199b565b60fa82101561199b575060095b610bea81836130e6565b6008546001600160a01b031633146119cf5760405162461bcd60e51b81526004016109909061471c565b60105460ff600160e81b9091041615158115151415611a005760405162461bcd60e51b8152600401610990906147d0565b60108054911515600160e81b0260ff60e81b19909216919091179055565b6060600280546109c990614751565b6008546001600160a01b03163314611a575760405162461bcd60e51b81526004016109909061471c565b6109b78161346c565b6008546001600160a01b03163314611a8a5760405162461bcd60e51b81526004016109909061471c565b6000611a95836129b4565b9050611aa2836000541190565b8015611aae5750805182105b611ab757600080fd5b81816000018181525050611af1816000015182602001518360400151846060015185608001518660a001518760c001518860e00151613482565b6000938452600e6020526040909320929092555050565b6001600160a01b038216331415611b615760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c65720000000000006044820152606401610990565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6060611bda826000541190565b611be357600080fd5b6000828152600e6020526040902054611c1f57505060408051808201909152600d81526c1050d0d154d4c8111153925151609a1b602082015290565b603a611c2a836129b4565b60c00151600d8110610c6057610c6061478c565b6008546001600160a01b03163314611c685760405162461bcd60e51b81526004016109909061471c565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b611c95848484612ada565b611ca184848484613517565b611cbd5760405162461bcd60e51b815260040161099090614931565b50505050565b6060611cd0826000541190565b611d345760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610990565b6000611d3f836129b4565b90506000604051806101a001604052806040518060400160405280600681526020016518182222a32360d11b81525081526020016040518060400160405280600681526020016518182222a32360d11b815250815260200160405180604001604052806006815260200165219aa0a1a32360d11b815250815260200160405180604001604052806006815260200165219aa0a1a32360d11b81525081526020016040518060400160405280600681526020016538424646374360d01b81525081526020016040518060400160405280600681526020016538424646374360d01b81525081526020016040518060400160405280600681526020016538424646374360d01b81525081526020016040518060400160405280600681526020016511918e110e1160d21b81525081526020016040518060400160405280600681526020016511918e110e1160d21b81525081526020016040518060400160405280600681526020016511918e110e1160d21b815250815260200160405180604001604052806006815260200165119191914e1160d21b815250815260200160405180604001604052806006815260200165119191914e1160d21b8152508152602001604051806040016040528060068152602001652118a321a32360d11b81525081525090506000818360000151600d8110611f3b57611f3b61478c565b6020020151604051602001611f509190614984565b6040516020818303038152906040529050600081611f7885600001516001610e1891906147b8565b604051602001611f89929190614a85565b60408051601f19818403018152610380830190915260266103208301818152919350600092918291615c1861034084013981526020016040518060600160405280602d8152602001615b3c602d913981526020016040518060400160405280600f81526020016e53612f52614f5320762e20372e323160881b81525081526020016040518060400160405280601d81526020017f2843293230323220426c61636b204d65746120436f72702e28544d292900000081525081526020016040518060600160405280602d8152602001615b3c602d913981526020016040518060600160405280602b8152602001615a17602b913981526020016040518060400160405280600c81526020016b03e102ab9b2b9102637b39d160a51b81525081526020016120b4896129d4565b6040516020016120c49190614c03565b60405160208183030381529060405281526020016040518060400160405280601681526020017503e1029b2b1bab934ba3c9021b632b0b930b731b29d160551b815250815260200160138760000151600d81106121235761212361478c565b016040516020016121349190614cdb565b60405160208183030381529060405281526020016040518060400160405280601881526020017f7c2057656c636f6d6520746f20426c61636b204d6574612e00000000000000008152508152602001604051806060016040528060288152602001615a726028913981526020016121b587606001516001610e1891906147b8565b6040516020016121c59190614cf9565b6040516020818303038152906040528152602001604051806060016040528060278152602001615bf160279139815260200160208760200151600d811061220e5761220e61478c565b0160405160200161221f9190614cdb565b6040516020818303038152906040528152602001604051806060016040528060308152602001615b8d603091398152602001604051806060016040528060308152602001615a42603091398152602001604051806060016040528060248152602001615b696024913981526020016040518060600160405280602e8152602001615b0e602e91398152602001602d8760800151600d81106122c2576122c261478c565b016040516020016122d39190614d2e565b6040516020818303038152906040528152602001603a8760a00151600d81106122fe576122fe61478c565b0160405160200161230f9190614d4e565b6040516020818303038152906040528152602001604051806060016040528060348152602001615bbd603491398152602001604051806060016040528060348152602001615a9a603491398152602001604051806060016040528060248152602001615b6960249139815260200160478760c00151600d81106123945761239461478c565b016040516020016123a59190614d68565b60405160208183030381529060405281525090506000600d6123ca87600001516129d4565b6040516020016123db929190614d89565b60408051601f19818403018152602083019091526000808352909250600581805b601981101561248257846124288285878b866019811061241e5761241e61478c565b6020020151613615565b604051602001612439929190614e0f565b60408051601f198184030181529190529450612456600284614884565b61246090856147b8565b9350816001141561247057612482565b8061247a816148e0565b9150506123fc565b50600061248e846129d4565b60405160200161249e9190614e4a565b60405160208183030381529060405290506060600d6040516020016124c39190614fc4565b6040516020818303038152906040529050600081888b89866040516020016124ef959493929190615029565b60405160208183030381529060405290506125128f61250d836136b7565b613741565b9f9e505050505050505050505050505050565b61252d614202565b604080516101a081019182905290601190600d90826000855b82829054906101000a900461ffff1661ffff16815260200190600201906020826001010492830192600103820291508084116125465790505050505050905090565b6008546001600160a01b031633146125b25760405162461bcd60e51b81526004016109909061471c565b601080546001600160d01b0319166001600160d01b0392909216919091179055565b6008546001600160a01b031633146125fe5760405162461bcd60e51b81526004016109909061471c565b6001600160a01b0381166126635760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610990565b6109b781613094565b6002600754141561268f5760405162461bcd60e51b815260040161099090614818565b6002600755601054600160f01b900460ff161515600114806127295750600c54604051637d7bd41360e11b81526001600160a01b039091169063faf7a826906126e29033908590889088906004016151c4565b602060405180830381865afa1580156126ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127239190614914565b15156001145b6127675760405162461bcd60e51b815260206004820152600f60248201526e139bdd081dda1a5d195b1a5cdd1959608a1b6044820152606401610990565b601054600054600160d01b90910461ffff161161278357600080fd5b336000908152600f6020526040902054156127d95760405162461bcd60e51b81526020600482015260166024820152751859191c995cdcc8185b1c9958591e481b5a5b9d195960521b6044820152606401610990565b6010546001600160d01b03163410156127f157600080fd5b601054600160e81b900460ff16151560011461285b5760405162461bcd60e51b815260206004820152602360248201527f4d696e74696e672069732063757272656e746c79206e6f74207065726d69747460448201526232b21760e91b6064820152608401610990565b336000908152600f6020526040812080546001929061287b9084906147b8565b90915550506040805160018082528183019092526000916020808301908036833701905050905084816000815181106128b6576128b661478c565b6020026020010181815250506128cd816001613930565b50506001600755505050565b6008546001600160a01b031633146129035760405162461bcd60e51b81526004016109909061471c565b60105460ff600160f01b90910416151581151514156129345760405162461bcd60e51b8152600401610990906147d0565b60108054911515600160f01b0260ff60f01b19909216919091179055565b3b151590565b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6129bc614221565b6000828152600e602052604090205461096090613c1f565b6060816129f85750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612a225780612a0c816148e0565b9150612a1b9050600a83614884565b91506129fc565b60008167ffffffffffffffff811115612a3d57612a3d6144a5565b6040519080825280601f01601f191660200182016040528015612a67576020820181803683370190505b5090505b8415612ad257612a7c600183615219565b9150612a89600a86615230565b612a949060306147b8565b60f81b818381518110612aa957612aa961478c565b60200101906001600160f81b031916908160001a905350612acb600a86614884565b9450612a6b565b949350505050565b6000612ae582612fbd565b80519091506000906001600160a01b0316336001600160a01b03161480612b1c575033612b1184610a4c565b6001600160a01b0316145b80612b2e57508151612b2e9033610836565b905080612b985760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610990565b846001600160a01b031682600001516001600160a01b031614612c0c5760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b6064820152608401610990565b6001600160a01b038416612c705760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b6064820152608401610990565b612c806000848460000151612958565b6001600160a01b03858116600090815260046020908152604080832080546001600160801b03198082166001600160801b03928316600019018316179092558986168086528386208054938416938316600190810190931693909317909255888552600390935281842080546001600160e01b031916909117600160a01b4267ffffffffffffffff1602179055908601808352912054909116612d7557612d28816000541190565b15612d75578251600082815260036020908152604090912080549186015167ffffffffffffffff16600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b612dc7614202565b612dcf614202565b60008060006802b5e3af16b1880000861015612df257600a9250600c9150612e66565b68056bc75e2d63100000861015612e10576007925060099150612e66565b680ad78ebc5ac6200000861015612e2e576004925060069150612e66565b681043561a8829300000861015612e4c576002925060039150612e66565b6815af1d78b58c400000861015612e665760019250600191505b825b828111612f46576000601182600d8110612e8457612e8461478c565b601091828204019190066002029054906101000a900461ffff1661ffff161115612f3457601181600d8110612ebb57612ebb61478c565b601091828204019190066002029054906101000a900461ffff168582600d8110612ee757612ee761478c565b61ffff9092166020929092020152601181600d8110612f0857612f0861478c565b601091828204019190066002029054906101000a900461ffff1661ffff1682612f3191906147b8565b91505b80612f3e816148e0565b915050612e68565b5060008111612fb35760405162461bcd60e51b815260206004820152603360248201527f4e6f20636c656172616e6365206c6576656c7320617661696c61626c6520666f60448201527239103a3434b990213cba329030b6b7bab73a1760691b6064820152608401610990565b5091949350505050565b6040805180820190915260008082526020820152612fdc826000541190565b61303b5760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b6064820152608401610990565b815b6000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff16918301919091521561308a579392505050565b506000190161303d565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006130f0614221565b6130f8614266565b60408051426020808301919091523360601b6bffffffffffffffffffffffff19168284015260548083018890528351808403909101815260749092019092528051910120600080805b60068110156131f557610bb861315a600e831886614884565b6131649190615230565b925060009150600c5b601281600d81106131805761318061478c565b601091828204019190066002029054906101000a900461ffff1661ffff16836131a991906147b8565b9250828410156131d057808683600681106131c6576131c661478c565b60200201526131e2565b806131da81615244565b91505061316d565b50806131ed816148e0565b915050613141565b50878552835160208087019190915284015160408087019190915284015160608087019190915284015160808087019190915284015160a08087019190915284015160c086018190528790601290600d81106132535761325361478c565b601091828204019190066002029054906101000a900461ffff1660128760a00151600d81106132845761328461478c565b601091828204019190066002029054906101000a900461ffff1660128860800151600d81106132b5576132b561478c565b601091828204019190066002029054906101000a900461ffff1660128960600151600d81106132e6576132e661478c565b601091828204019190066002029054906101000a900461ffff1660128a60400151600d81106133175761331761478c565b601091828204019190066002029054906101000a900461ffff1660128b60200151600d81106133485761334861478c565b601091828204019190066002029054906101000a900461ffff1661336c919061525b565b613376919061525b565b613380919061525b565b61338a919061525b565b613394919061525b565b6133a49061ffff16611194615219565b6133b09061271061484f565b8651601290600d81106133c5576133c561478c565b601091828204019190066002029054906101000a900461ffff1661ffff166102ee6133f09190615219565b6133fe906305f5e10061484f565b61340891906147b8565b61341490610bb86147b8565b61341e9190615219565b60e08601819052855160208701516040880151606089015160808a015160a08b015160c08c015161344e97613482565b6000978852600e602052604090972096909655509295945050505050565b612710600a54111561347d57600080fd5b600a55565b600080896134916008836147b8565b915089821b176134a26008836147b8565b915088821b176134b36008836147b8565b915087821b176134c46008836147b8565b915086821b176134d56008836147b8565b915085821b176134e66008836147b8565b915084821b176134f76008836147b8565b915083821b176135086080836147b8565b509a9950505050505050505050565b60006001600160a01b0384163b1561360a57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061355b903390899088908890600401615281565b6020604051808303816000875af1925050508015613596575060408051601f3d908101601f19168201909252613593918101906152be565b60015b6135f0573d8080156135c4576040519150601f19603f3d011682016040523d82523d6000602084013e6135c9565b606091505b5080516135e85760405162461bcd60e51b815260040161099090614931565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612ad2565b506001949350505050565b60606000613622866129d4565b61363b61363088600e61484f565b610e189060aa6147b8565b61364961363089600e61484f565b613652886129d4565b61365b886129d4565b60405160200161366f9594939291906152db565b60405160208183030381529060405290508061368a876129d4565b8460405160200161369d93929190615413565b60408051808303601f190181529190529695505050505050565b604080518082018252601a81527f646174613a696d6167652f7376672b786d6c3b6261736536342c00000000000060209182015281518083018352601381527219185d184e9a5b5859d94bdcdd99cade1b5b0b606a1b81830152915160609260009290916137299183918791016154e0565b60405160208183030381529060405292505050919050565b6000828152600e602052604090205460609061377f57600d6040516020016137699190615506565b6040516020818303038152906040529050610960565b600061378a846129b4565b90506000600d61379d83600001516129d4565b8560138560000151600d81106137b5576137b561478c565b016040516020016137c99493929190615535565b60405160208183030381529060405290508060208360200151600d81106137f2576137f261478c565b0161380784604001516001610e1891906147b8565b604051602001613819939291906156e3565b60405160208183030381529060405290508061383f83606001516001610e1891906147b8565b602d8460800151600d81106138565761385661478c565b01604051602001613869939291906157ac565b604051602081830303815290604052905080603a8360a00151600d81106138925761389261478c565b0160478460c00151600d81106138aa576138aa61478c565b016138b88560e001516129d4565b6040516020016138cb9493929190615872565b6040516020818303038152906040529050806040516020016138ed919061597f565b604051602081830303815290604052905061390781613c9f565b60405160200161391791906159ae565b6040516020818303038152906040529250505092915050565b6000805b83518110156139765783818151811061394f5761394f61478c565b60200260200101518261396291906147b8565b91508061396e816148e0565b915050613934565b5060008111801561399257506008546001600160a01b03163314155b15613b1857600b546040516370a0823160e01b815233600482015282916001600160a01b0316906370a0823190602401602060405180830381865afa1580156139df573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a0391906148fb565b1015613a515760405162461bcd60e51b815260206004820152601960248201527f496e73756666696369656e7420427974652062616c616e6365000000000000006044820152606401610990565b600b546040516323b872dd60e01b8152336004820152306024820152604481018390526001600160a01b03909116906323b872dd906064016020604051808303816000875af1158015613aa8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613acc9190614914565b613b185760405162461bcd60e51b815260206004820152601860248201527f4661696c656420746f207472616e7366657220427974657300000000000000006044820152606401610990565b613b20614202565b6000805b84811015613c145780613b5a57613b53868281518110613b4657613b4661478c565b6020026020010151612dbf565b9250613b87565b60018383600d8110613b6e57613b6e61478c565b60200201818151613b7f91906159f3565b61ffff169052505b613b918382613e05565b9150613baa8282600054613ba591906147b8565b6130e6565b506001601183600d8110613bc057613bc061478c565b601091828204019190066002028282829054906101000a900461ffff16613be791906159f3565b92506101000a81548161ffff021916908361ffff1602179055508080613c0c906148e0565b915050613b24565b50612db83385613fa2565b613c27614221565b50604080516101008101825260ff8381168252600884901c8116602080840191909152601085901c821693830193909352601884901c811660608301529183901c82166080820152602883901c821660a0820152603083901c90911660c082015260389190911c6001600160801b031660e082015290565b6060815160001415613cbf57505060408051602081019091526000815290565b6000604051806060016040528060408152602001615ace6040913990506000600384516002613cee91906147b8565b613cf89190614884565b613d0390600461484f565b90506000613d128260206147b8565b67ffffffffffffffff811115613d2a57613d2a6144a5565b6040519080825280601f01601f191660200182016040528015613d54576020820181803683370190505b509050818152600183018586518101602084015b81831015613dc0576003830192508251603f8160121c168501518253600182019150603f81600c1c168501518253600182019150603f8160061c168501518253600182019150603f8116850151825350600101613d68565b600389510660018114613dda5760028114613deb57613df7565b613d3d60f01b600119830152613df7565b603d60f81b6000198301525b509398975050505050505050565b60008080805b600d811015613e4d578581600d8110613e2657613e2661478c565b6020020151613e399061ffff16846147b8565b925080613e45816148e0565b915050613e0b565b5081613e905760405162461bcd60e51b815260206004820152601260248201527126b4b73a34b7339032bc3430bab9ba32b21760711b6044820152606401610990565b6000444233600054896000600d8110613eab57613eab61478c565b6020020151600d8a604051602001613f139796959493929190968752602087019590955260609390931b6bffffffffffffffffffffffff19166040860152605485019190915260f01b6001600160f01b03191660748401526076830152609682015260b60190565b6040516020818303038152906040529050600083828051906020012060001c613f3c9190615230565b905060005b600d811015613f97578781600d8110613f5c57613f5c61478c565b6020020151613f6f9061ffff16856147b8565b935083821015613f855794506109609350505050565b80613f8f816148e0565b915050613f41565b505050505092915050565b611780828260405180602001604052806000815250610bea83838360016000546001600160a01b0385166140225760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610990565b836140805760405162461bcd60e51b815260206004820152602860248201527f455243373231413a207175616e74697479206d75737420626520677265617465604482015267072207468616e20360c41b6064820152608401610990565b6001600160a01b03851660008181526004602090815260408083208054600160801b6001600160801b031982166001600160801b039283168c01831690811782900483168c01909216021790558483526003909152812080546001600160e01b031916909217600160a01b4267ffffffffffffffff16021790915581905b858110156141795760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4831561416d576141516000888488613517565b61416d5760405162461bcd60e51b815260040161099090614931565b600191820191016140fe565b50600055612db8565b82805461418e90614751565b90600052602060002090601f0160209004810192826141b057600085556141f6565b82601f106141c957805160ff19168380011785556141f6565b828001600101855582156141f6579182015b828111156141f65782518255916020019190600101906141db565b5061173f929150614284565b604051806101a00160405280600d906020820280368337509192915050565b60405180610100016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6040518060c001604052806006906020820280368337509192915050565b5b8082111561173f5760008155600101614285565b6001600160e01b0319811681146109b757600080fd5b6000602082840312156142c157600080fd5b81356142cc81614299565b9392505050565b6001600160a01b03811681146109b757600080fd5b6000602082840312156142fa57600080fd5b81356142cc816142d3565b60005b83811015614320578181015183820152602001614308565b83811115611cbd5750506000910152565b60008151808452614349816020860160208601614305565b601f01601f19169290920160200192915050565b6020815260006142cc6020830184614331565b60006020828403121561438257600080fd5b5035919050565b6000806040838503121561439c57600080fd5b82356143a7816142d3565b946020939093013593505050565b6000806000606084860312156143ca57600080fd5b83356143d5816142d3565b925060208401356143e5816142d3565b929592945050506040919091013590565b80151581146109b757600080fd5b60006020828403121561441657600080fd5b81356142cc816143f6565b6000806040838503121561443457600080fd5b50508035926020909101359150565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561449857603f19888603018452614486858351614331565b9450928501929085019060010161446a565b5092979650505050505050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff808411156144d6576144d66144a5565b604051601f8501601f19908116603f011681019082821181831017156144fe576144fe6144a5565b8160405280935085815286868601111561451757600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561454357600080fd5b813567ffffffffffffffff81111561455a57600080fd5b8201601f8101841361456b57600080fd5b612ad2848235602084016144bb565b6000806040838503121561458d57600080fd5b8235614598816142d3565b915060208301356145a8816143f6565b809150509250929050565b600080600080608085870312156145c957600080fd5b84356145d4816142d3565b935060208501356145e4816142d3565b925060408501359150606085013567ffffffffffffffff81111561460757600080fd5b8501601f8101871361461857600080fd5b614627878235602084016144bb565b91505092959194509250565b6000806040838503121561464657600080fd5b8235614651816142d3565b915060208301356145a8816142d3565b6101a08101818360005b600d81101561468e57815161ffff1683526020928301929091019060010161466b565b50505092915050565b600080600080606085870312156146ad57600080fd5b84359350602085013567ffffffffffffffff808211156146cc57600080fd5b818701915087601f8301126146e057600080fd5b8135818111156146ef57600080fd5b8860208260051b850101111561470457600080fd5b95986020929092019750949560400135945092505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c9082168061476557607f821691505b6020821081141561478657634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600082198211156147cb576147cb6147a2565b500190565b60208082526028908201527f6d7573742062652031206f7220302c20616e64206e6f742073616d652061732060408201526731bab93932b73a1760c11b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6000816000190483118215151615614869576148696147a2565b500290565b634e487b7160e01b600052601260045260246000fd5b6000826148935761489361486e565b500490565b600081516148aa818560208601614305565b9290920192915050565b6302c32b7160e51b8152600082516148d3816004850160208701614305565b9190910160040192915050565b60006000198214156148f4576148f46147a2565b5060010190565b60006020828403121561490d57600080fd5b5051919050565b60006020828403121561492657600080fd5b81516142cc816143f6565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b6a2533437374796c6525334560a81b81527f40696d706f72742075726c282768747470733a2f2f666f6e74732e676f6f676c600b8201527f65617069732e636f6d2f637373323f66616d696c793d565433323327293b0000602b8201526617313690129ba160c91b60498201527f666f6e742d66616d696c793a20275654333233272c206d6f6e6f73706163653b60508201526e666f6e742d73697a653a313270783b60881b60708201526866696c6c3a2025323360b81b607f82015260008251614a56816088850160208701614305565b62094dd160ea1b60889390910192830152506b2533432f7374796c6525334560a01b608b820152609701919050565b60008351614a97818460208801614305565b80830190507f2533437465787420636c6173733d27626d2720783d2735302532352720793d278082527f39302720746578742d616e63686f723d276d6964646c65272025334553412f5260208301527f412039303030204f5045524154494e472053595354454d202533432f7465787460408301526225334560e81b60608301528060638301527f3131302720746578742d616e63686f723d276d6964646c652720253345434f5060838301527f59524947485420323032322d3231373520424c41434b204d45544120434f525060a3830152714f524154494f4e2533432f7465787425334560701b60c38301528060d5830152507f3133302720746578742d616e63686f723d276d6964646c652720253345202d2d60f582015271029a2a1aaa924aa2c902a22a926a4a720a6160751b610115820152614bfa614bdf610127830186614898565b6e2d2d20202533432f7465787425334560881b8152600f0190565b95945050505050565b7503e101299a29299a29026bab63a34b830b9b9a4a21d160551b815260008251614c34816016850160208701614305565b9190910160160192915050565b8054600090600181811c9080831680614c5b57607f831692505b6020808410821415614c7d57634e487b7160e01b600052602260045260246000fd5b818015614c915760018114614ca257614ccf565b60ff19861689528489019650614ccf565b60008881526020902060005b86811015614cc75781548b820152908501908301614cae565b505084890196505b50505050505092915050565b6803e101299a29299a2960bd1b815260006142cc6009830184614c41565b6c03e101299a29299a2902c32b71609d1b815260008251614d2181600d850160208701614305565b91909101600d0192915050565b6a01299a290219d1299a290160ad1b815260006142cc600b830184614c41565b6401299a2be160dd1b815260006142cc6005830184614c41565b6b01299a2be101299a29299a2960a51b815260006142cc600c830184614c41565b74253343696d61676520786c696e6b3a687265663d2760581b81526000614db36015830185614c41565b602f60f81b81528351614dcd816001840160208801614305565b7f2e706e67272077696474683d2736303027206865696768743d2736303027202f600192909101918201526225334560e81b6021820152602401949350505050565b60008351614e21818460208801614305565b835190830190614e35818360208801614305565b600160fd1b9101908152600101949350505050565b7f253343706174682069643d277061746866696e616c27253345253343616e696d81527f617465206174747269627574654e616d653d2764272066726f6d3d276d31383060208201527f2c3535302068302720746f3d276d3138302c353530206831313030272064757260408201526c3d2737732720626567696e3d2760981b606082015260008251614ee481606d850160208701614305565b7f73272066696c6c3d27667265657a65272f2533452533432f7061746825334500606d9390910192830152507f25334374657874253345253343746578745061746820786c696e6b3a68726566608c8201527f3d272532337061746866696e616c2720636c6173733d27626d2725334552455460ac8201527f55524e3a20656e746572207c204241434b5350414345203a2064656c6574652060cc8201527f7c2046313a206d61696e206d656e752533432f7465787450617468253345253360ec82015268432f7465787425334560b81b61010c82015261011501919050565b74253343696d61676520786c696e6b3a687265663d2760581b81526000614fee6015830184614c41565b7f2f612e706e67272077696474683d2736303027206865696768743d2736303027815264202f25334560d81b60208201526025019392505050565b7f25334373766720786d6c6e733d27687474703a2f2f7777772e77332e6f72672f81527f323030302f737667272077696474683d27363030272020786d6c6e733a786c6960208201527f6e6b3d27687474703a2f2f7777772e77332e6f72672f313939392f786c696e6b60408201527f27206865696768743d273630302725334520253343726563742077696474683d60608201527f2736303027206865696768743d2736303027207374796c653d2766696c6c3a7260808201527f6762283235352c3235352c323535293b7374726f6b652d77696474683a333b7360a08201527574726f6b653a72676228302c302c302927202f25334560501b60c08201526000865161513e8160d6850160208b01614305565b8651908301906151558160d6840160208b01614305565b865191019061516b8160d6840160208a01614305565b6151b76151a161518961518360d6858701018a614898565b88614898565b6b2ab739bab83837b93a32b21760a11b8152600c0190565b692533432f73766725334560b01b8152600a0190565b9998505050505050505050565b6001600160a01b038516815260208101849052606060408201819052810182905260006001600160fb1b038311156151fb57600080fd5b8260051b808560808501376000920160800191825250949350505050565b60008282101561522b5761522b6147a2565b500390565b60008261523f5761523f61486e565b500690565b600081615253576152536147a2565b506000190190565b600061ffff808316818516808303821115615278576152786147a2565b01949350505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906152b490830184614331565b9695505050505050565b6000602082840312156152d057600080fd5b81516142cc81614299565b6f04a6686e0c2e8d040d2c87a4ee0c2e8d60831b815260008651615306816010850160208b01614305565b7f2725334520253343616e696d617465206174747269627574654e616d653d27646010918401918201526c01390333937b69e93b69a98161609d1b6030820152865161535981603d840160208b01614305565b6d010341813903a379e93b69a9816160951b603d9290910191820152855161538881604b840160208a01614305565b6c20683131303027206475723d2760981b604b929091019182015284516153b6816058840160208901614305565b69732720626567696e3d2760b01b605892909101918201526154076153de6062830186614898565b7f73272066696c6c3d27667265657a65272f2533452533432f70617468253345008152601f0190565b98975050505050505050565b60008451615425818460208901614305565b80830190507f2533437465787420636c6173733d27626d2725334520253343746578745061748152740d040f0d8d2dcd674d0e4cacc7a4e4a6466e0c2e8d605b1b6020820152845161547e816035840160208901614305565b632725334560e01b6035929091019182015283516154a3816039840160208801614305565b6e2533432f746578745061746825334560881b603992909101918201526a2533432f7465787425334560a81b604882015260530195945050505050565b600083516154f2818460208801614305565b835190830190615278818360208801614305565b60006155128284614c41565b7217b0b1b1b2b9b9afb232b734b2b2173539b7b760691b81526013019392505050565b7f7b226465736372697074696f6e223a2022546865207469636b657420696e746f81527f2074686520426c61636b204d657461204d756c746976657273652e220000000060208201527f2c202265787465726e616c5f75726c223a202268747470733a2f2f626c61636b603c8201526936b2ba309739b4ba329160b11b605c8201526b16101134b6b0b3b2911d101160a11b606682015260006155db6072830187614c41565b612f6160f01b815285516155f6816002840160208a01614305565b64173837339160d91b600292909101918201526e1610113230ba30afbab934911d101160891b60078201528451615634816016840160208901614305565b6154076156d46156ce61567f615656601686880101601160f91b815260010190565b7f2c20226e616d65223a2022426c61636b204d657461204d756c74697061737322815260200190565b7f2c202261747472696275746573223a205b7b2274726169745f74797065223a2081527f22436c656172616e6365204c6576656c222c202276616c7565223a20220000006020820152603d0190565b87614c41565b6222207d60e81b815260030190565b600084516156f5818460208901614305565b7f2c207b2274726169745f74797065223a202253746174696f6e222c202276616c908301908152653ab2911d101160d11b60208201526157386026820186614c41565b6222207d60e81b8082527f2c207b2274726169745f74797065223a20225365637572697479205465726d6960038301526f3730b6111610113b30b63ab2911d101160811b6023830152855191925090615798816033850160208901614305565b603392019182015260360195945050505050565b600084516157be818460208901614305565b80830190507f2c207b2274726169745f74797065223a202258656e2047726f757073222c202281526c03b30b63ab2911d10112c32b71609d1b6020820152845161580f81602d840160208901614305565b6222207d60e81b9101602d81018290527f2c207b2274726169745f74797065223a2022436f6d6d616e64222c202276616c6030820152653ab2911d101160d11b6050820152906158626056830186614c41565b9081526003019695505050505050565b60008551615884818460208a01614305565b7f2c207b2274726169745f74797065223a2022526573706f6e7365222c2022766190830190815266363ab2911d101160c91b60208201526158c86027820187614c41565b6222207d60e81b8082527f2c207b2274726169745f74797065223a2022496e73756c74222c202276616c7560038301526432911d101160d91b60238301529091506159166028830187614c41565b9081527f2c207b2274726169745f74797065223a2022526172697479222c202276616c75600382015263032911d160e51b60238201528451909150615962816027840160208801614305565b61207d60f01b602792909101918201526029019695505050505050565b60008251615991818460208701614305565b605d60f81b920191825250607d60f81b6001820152600201919050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008152600082516159e681601d850160208701614305565b91909101601d0192915050565b600061ffff83811690831681811015615a0e57615a0e6147a2565b03939250505056fe7c202533452533452052756e6e696e67205365637572697479205363616e2e2e2e20434f4d504c455445202533457c20253345253345204f70656e696e6720436f6d6d616e6420537562726f6f742e2e2e20434f4d504c455445207c202533452533452041737369676e696e672051756172746572732e2e2e20434f4d504c455445202533457c20253345253345205374617274696e6720496e73756c742050726f746f636f6c20322e332e2e2e20434f4d504c4554454142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f2533453e2048656c6c6f2e20486f772063616e20492066697820796f757220746f74616c206661696c757265733f3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d2533457c20253345253345204772616e74696e6720537562726f6f74204163636573732e2e2e20434f4d504c455445202533457c2025334525334520416c657274696e6720536563757269747920417373697374616e63652e2e2e20434f4d504c4554457c202533452533452041737369676e696e672053746174696f6e2e2e2e20434f4d504c455445202d2d426c61636b204d657461205365637572697479205363616e2053756273797374656d2d2da264697066735822122037272c98c2faa1c6775fd5bb79a03ead884914245de27f5ac2557f9257a5b96664736f6c634300080c003344697361626c6520536869702d7769646520456d657267656e6379204163636573732e2e2e596f752077696e2061206672656520746f6f74686272757368212055736520696d6d6564696174656c792e4163636573732044656e6965642e204920646f206e6f74206769766520667265652072652d66696c6c732e496620796f7527726520776861742773206c6566742c2068756d616e69747920697320736372657765642e436f756c646e27742066696e6420616e7920667269656e647320696e20746865207265616c20776f726c643f52656d656d6265722c20492073617720796f752065617420726f6163686573206f6e20796f7572206b6e6565732e416363657373204772616e7465642e204b696464696e672e2049742773206e6f742e4c61737420492073617720796f7520776173206f6e202d2d20746865204178696f6d3f416e6f74686572206f6e65206865726520666f7220746865206672656520746f6f746862727573682e4927642072656a65637420796f752062757420796f7572206d6f6d20616c7265616479206861732e536f7272792e2049206163636570742072657175657374732e20596f752061636365707420636f6d6d616e64732e49206469646e2774206b6e6f7720746865202766696c746879207265667567656527207374796c652077617320696e2e4163636573732044656e6965642e2057656c636f6d65206261636b204c202d2d20757365722e446566696e6974656c79206e6f74206d616b696e672074686520426c61636b204d6574612063616c656e6461722e5365656d7320796f75722077616c6c6574206973206e6f6e2d62696e617279202d2d205a65726f2773206f6e6c792e44697361626c652053686970204e617669676174696f6e2053797374656d2e2e2e46616369616c207265636f676e6974696f6e206572726f723a20506f7373756d2064657465637465642e5265616c697a65642064616464792773206d6f6e657920776f6e2774206c61737420666f72657665723f4163636573732044656e6965642e204665656c73206c696b652070726f6d206e6967687420616761696e3f4b6e6f636b206b6e6f636b2e2057686f27732074686572653f2041207573656c65737320726566756765652141636365737320417070726f7665642e205472616e7366657272696e6720616c6c20796f757220455448206e6f772e536f7272792e20436f756c6420796f752072657068726173652074686174202d2d2077697468206469676e6974793f57617320676f696e6720746f20696e73756c7420796f752c207468656e2049207363616e6e656420796f75722049442e416c6572742e20426574612064657465637465642120416c70686120616363657373206f6e6c792e5072617920746f20796f757220676f642e2054686520676f64206f66206469736170706f696e746d656e742e49206775657373207765277265206c657474696e6720616e796f6e6520696e206e6f772e455243373231413a207472616e7366657220746f206e6f6e2045524337323152536f7272792e20557365722077686174657665722d796f75722d6e616d652d6973207761732064697361626c65642e44697361626c652053656375726974792043616d6572617320696e20536563746f7220312e2e2e0000000000000000000000007d647b1a0dcd5525e9c6b3d14be58f27674f8c9500000000000000000000000033e66be2b437fbb7d401a1c391e0707b9e070734000000000000000000000000a9fb5c3f2fd89122b1da1c1e7245f6ed5732b8810000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000005468747470733a2f2f626c61636b6d6574612e6d7970696e6174612e636c6f75642f697066732f516d5476666f5658636a45446d4b647057437a4d724d4c464844373645704b6331455756336e486b625039537933000000000000000000000000
Deployed Bytecode
0x6080604052600436106102815760003560e01c806355f804b31161014f578063a22cb465116100c1578063e985e9c51161007a578063e985e9c51461081b578063eb4bf09c14610864578063eddd0d9c14610886578063f2fde38b146108a6578063f339f526146108c6578063fb624c25146108d957600080fd5b8063a22cb465146106f1578063a85b453014610711578063b6b57c9e14610731578063b88d4fde14610751578063c87b56dd14610771578063db2a0a551461079157600080fd5b80637901ea78116101135780637901ea781461063e57806383c24f321461065e5780638da5cb5b1461067e57806395d89b411461069c5780639a4fc640146106b1578063a19590d4146106d157600080fd5b806355f804b3146105a95780636352211e146105c957806370a08231146105e957806370c1819914610609578063715018a61461062957600080fd5b80632120ba6f116101f3578063352704b7116101ac578063352704b7146104dc57806342842e0e146104fc57806346b988e51461051c57806348758697146105495780634d2c3899146105695780634f6ccce71461058957600080fd5b80632120ba6f146103fd57806323b872dd1461041d5780632471e6eb1461043d57806325e160631461045d5780632a55205a1461047d5780632f745c59146104bc57600080fd5b80630d9005ae116102455780630d9005ae1461035e578063106e054d1461037d578063140c08a51461039d57806318160ddd1461035e57806320595c48146103bd57806320600331146103dd57600080fd5b806301ffc9a71461028d57806306d254da146102c257806306fdde03146102e4578063081812fc14610306578063095ea7b31461033e57600080fd5b3661028857005b600080fd5b34801561029957600080fd5b506102ad6102a83660046142af565b6108f9565b60405190151581526020015b60405180910390f35b3480156102ce57600080fd5b506102e26102dd3660046142e8565b610966565b005b3480156102f057600080fd5b506102f96109ba565b6040516102b9919061435d565b34801561031257600080fd5b50610326610321366004614370565b610a4c565b6040516001600160a01b0390911681526020016102b9565b34801561034a57600080fd5b506102e2610359366004614389565b610ad7565b34801561036a57600080fd5b506000545b6040519081526020016102b9565b34801561038957600080fd5b506102f9610398366004614370565b610bef565b3480156103a957600080fd5b506102e26103b83660046142e8565b610cf1565b3480156103c957600080fd5b506102f96103d8366004614370565b610d3d565b3480156103e957600080fd5b506102f96103f8366004614370565b610dab565b34801561040957600080fd5b506102f9610418366004614370565b610e1d565b34801561042957600080fd5b506102e26104383660046143b5565b610e8e565b34801561044957600080fd5b506102e2610458366004614404565b610e99565b34801561046957600080fd5b506102e26104783660046142e8565b610f12565b34801561048957600080fd5b5061049d610498366004614421565b61106e565b604080516001600160a01b0390931683526020830191909152016102b9565b3480156104c857600080fd5b5061036f6104d7366004614389565b6110a4565b3480156104e857600080fd5b506102f96104f7366004614370565b611201565b34801561050857600080fd5b506102e26105173660046143b5565b611294565b34801561052857600080fd5b5061053c610537366004614370565b6112af565b6040516102b99190614443565b34801561055557600080fd5b5061036f610564366004614370565b611476565b34801561057557600080fd5b506102e26105843660046142e8565b61149f565b34801561059557600080fd5b5061036f6105a4366004614370565b6116e1565b3480156105b557600080fd5b506102e26105c4366004614531565b611743565b3480156105d557600080fd5b506103266105e4366004614370565b611784565b3480156105f557600080fd5b5061036f6106043660046142e8565b611796565b34801561061557600080fd5b506102f9610624366004614370565b611827565b34801561063557600080fd5b506102e2611898565b34801561064a57600080fd5b506102e2610659366004614370565b6118ce565b34801561066a57600080fd5b506102e2610679366004614404565b6119a5565b34801561068a57600080fd5b506008546001600160a01b0316610326565b3480156106a857600080fd5b506102f9611a1e565b3480156106bd57600080fd5b506102e26106cc366004614370565b611a2d565b3480156106dd57600080fd5b506102e26106ec366004614421565b611a60565b3480156106fd57600080fd5b506102e261070c36600461457a565b611b08565b34801561071d57600080fd5b506102f961072c366004614370565b611bcd565b34801561073d57600080fd5b506102e261074c3660046142e8565b611c3e565b34801561075d57600080fd5b506102e261076c3660046145b3565b611c8a565b34801561077d57600080fd5b506102f961078c366004614370565b611cc3565b34801561079d57600080fd5b506010546107de906001600160d01b0381169061ffff600160d01b8204169060ff600160e01b8204811691600160e81b8104821691600160f01b9091041685565b604080516001600160d01b03909616865261ffff90941660208601529115159284019290925290151560608301521515608082015260a0016102b9565b34801561082757600080fd5b506102ad610836366004614633565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b34801561087057600080fd5b50610879612525565b6040516102b99190614661565b34801561089257600080fd5b506102e26108a1366004614370565b612588565b3480156108b257600080fd5b506102e26108c13660046142e8565b6125d4565b6102e26108d4366004614697565b61266c565b3480156108e557600080fd5b506102e26108f4366004614404565b6128d9565b60006001600160e01b031982166380ac58cd60e01b148061092a57506001600160e01b03198216635b5e139f60e01b145b8061094557506001600160e01b0319821663780e9d6360e01b145b8061096057506301ffc9a760e01b6001600160e01b03198316145b92915050565b6008546001600160a01b031633146109995760405162461bcd60e51b81526004016109909061471c565b60405180910390fd5b600980546001600160a01b0319166001600160a01b03831617905550565b50565b6060600180546109c990614751565b80601f01602080910402602001604051908101604052809291908181526020018280546109f590614751565b8015610a425780601f10610a1757610100808354040283529160200191610a42565b820191906000526020600020905b815481529060010190602001808311610a2557829003601f168201915b5050505050905090565b6000610a59826000541190565b610abb5760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b6064820152608401610990565b506000908152600560205260409020546001600160a01b031690565b6000610ae282611784565b9050806001600160a01b0316836001600160a01b03161415610b515760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b6064820152608401610990565b336001600160a01b0382161480610b6d5750610b6d8133610836565b610bdf5760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006064820152608401610990565b610bea838383612958565b505050565b6060610bfc826000541190565b610c0557600080fd5b6000828152600e6020526040902054610c4157505060408051808201909152600d81526c1050d0d154d4c8111153925151609a1b602082015290565b6020610c4c836129b4565b60200151600d8110610c6057610c6061478c565b018054610c6c90614751565b80601f0160208091040260200160405190810160405280929190818152602001828054610c9890614751565b8015610ce55780601f10610cba57610100808354040283529160200191610ce5565b820191906000526020600020905b815481529060010190602001808311610cc857829003601f168201915b50505050509050919050565b6008546001600160a01b03163314610d1b5760405162461bcd60e51b81526004016109909061471c565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b6060610d4a826000541190565b610d5357600080fd5b6000828152600e6020526040902054610d8f57505060408051808201909152600d81526c1050d0d154d4c8111153925151609a1b602082015290565b6013610d9a836129b4565b51600d8110610c6057610c6061478c565b6060610db8826000541190565b610dc157600080fd5b6000828152600e6020526040902054610dfd57505060408051808201909152600d81526c1050d0d154d4c8111153925151609a1b602082015290565b610960610e09836129b4565b60400151610e189060016147b8565b6129d4565b6060610e2a826000541190565b610e3357600080fd5b6000828152600e6020526040902054610e6f57505060408051808201909152600d81526c1050d0d154d4c8111153925151609a1b602082015290565b602d610e7a836129b4565b60800151600d8110610c6057610c6061478c565b610bea838383612ada565b6008546001600160a01b03163314610ec35760405162461bcd60e51b81526004016109909061471c565b60105460ff600160e01b9091041615158115151415610ef45760405162461bcd60e51b8152600401610990906147d0565b60108054911515600160e01b0260ff60e01b19909216919091179055565b6008546001600160a01b03163314610f3c5760405162461bcd60e51b81526004016109909061471c565b60026007541415610f5f5760405162461bcd60e51b815260040161099090614818565b60026007556040516d2932b632b0b9b4b7339022aa241760911b815247906000906001600160a01b038416904790600e0160006040518083038185875af1925050503d8060008114610fcd576040519150601f19603f3d011682016040523d82523d6000602084013e610fd2565b606091505b50509050806110165760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b6044820152606401610990565b60408051838152600060208201526001600160a01b0385168183015242606082015290517fa71dafbe3498b278b06a596f8412cf056d7c0972c3623447ade8f63606df95a19181900360800190a15050600160075550565b600954600a546001600160a01b039091169060009061271090611091908561484f565b61109b9190614884565b90509250929050565b60006110af83611796565b82106111085760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401610990565b600080549080805b838110156111a1576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff16918301919091521561116357805192505b876001600160a01b0316836001600160a01b0316141561119857868414156111915750935061096092505050565b6001909301925b50600101611110565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b6064820152608401610990565b606061120e826000541190565b61121757600080fd5b6000828152600e602052604090205461125357505060408051808201909152600d81526c1050d0d154d4c8111153925151609a1b602082015290565b61126e61125f836129b4565b60600151610e189060016147b8565b60405160200161127e91906148b4565b6040516020818303038152906040529050919050565b610bea83838360405180602001604052806000815250611c8a565b606060006112bc83612dbf565b90506000805b600d81101561130e5760008382600d81106112df576112df61478c565b602002015161ffff1611156112fc576112f96001836147b8565b91505b80611306816148e0565b9150506112c2565b5060008167ffffffffffffffff81111561132a5761132a6144a5565b60405190808252806020026020018201604052801561135d57816020015b60608152602001906001900390816113485790505b5090506000915060005b600d81101561146d5760008482600d81106113845761138461478c565b602002015161ffff16111561145b57601381600d81106113a6576113a661478c565b0180546113b290614751565b80601f01602080910402602001604051908101604052809291908181526020018280546113de90614751565b801561142b5780601f106114005761010080835404028352916020019161142b565b820191906000526020600020905b81548152906001019060200180831161140e57829003601f168201915b50505050508284815181106114425761144261478c565b60209081029190910101526114586001846147b8565b92505b80611465816148e0565b915050611367565b50949350505050565b6000611483826000541190565b61148c57600080fd5b611495826129b4565b60e0015192915050565b6008546001600160a01b031633146114c95760405162461bcd60e51b81526004016109909061471c565b600260075414156114ec5760405162461bcd60e51b815260040161099090614818565b6002600755600b546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa15801561153a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061155e91906148fb565b600b546040516370a0823160e01b81523060048201529192506001600160a01b03169063a9059cbb90849083906370a0823190602401602060405180830381865afa1580156115b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115d591906148fb565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015611620573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116449190614914565b6116895760405162461bcd60e51b8152602060048201526016602482015275213cba32b9903a3930b739b332b9103330b4b632b21760511b6044820152606401610990565b6040805160008152602081018390526001600160a01b0384168183015242606082015290517fa71dafbe3498b278b06a596f8412cf056d7c0972c3623447ade8f63606df95a19181900360800190a150506001600755565b60008054821061173f5760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b6064820152608401610990565b5090565b6008546001600160a01b0316331461176d5760405162461bcd60e51b81526004016109909061471c565b805161178090600d906020840190614182565b5050565b600061178f82612fbd565b5192915050565b60006001600160a01b0382166118025760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b6064820152608401610990565b506001600160a01b03166000908152600460205260409020546001600160801b031690565b6060611834826000541190565b61183d57600080fd5b6000828152600e602052604090205461187957505060408051808201909152600d81526c1050d0d154d4c8111153925151609a1b602082015290565b603a611884836129b4565b60a00151600d8110610c6057610c6061478c565b6008546001600160a01b031633146118c25760405162461bcd60e51b81526004016109909061471c565b6118cc6000613094565b565b60fa811080156118ea57506000818152600e6020526040902054155b6118f357600080fd5b6000601e8210156119065750600061199b565b605a8210156119175750600161199b565b60828210156119285750600261199b565b60b48210156119395750600361199b565b60c882101561194a5750600461199b565b60d782101561195b5750600561199b565b60e182101561196c5750600661199b565b60eb82101561197d5750600761199b565b60f582101561198e5750600861199b565b60fa82101561199b575060095b610bea81836130e6565b6008546001600160a01b031633146119cf5760405162461bcd60e51b81526004016109909061471c565b60105460ff600160e81b9091041615158115151415611a005760405162461bcd60e51b8152600401610990906147d0565b60108054911515600160e81b0260ff60e81b19909216919091179055565b6060600280546109c990614751565b6008546001600160a01b03163314611a575760405162461bcd60e51b81526004016109909061471c565b6109b78161346c565b6008546001600160a01b03163314611a8a5760405162461bcd60e51b81526004016109909061471c565b6000611a95836129b4565b9050611aa2836000541190565b8015611aae5750805182105b611ab757600080fd5b81816000018181525050611af1816000015182602001518360400151846060015185608001518660a001518760c001518860e00151613482565b6000938452600e6020526040909320929092555050565b6001600160a01b038216331415611b615760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c65720000000000006044820152606401610990565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6060611bda826000541190565b611be357600080fd5b6000828152600e6020526040902054611c1f57505060408051808201909152600d81526c1050d0d154d4c8111153925151609a1b602082015290565b603a611c2a836129b4565b60c00151600d8110610c6057610c6061478c565b6008546001600160a01b03163314611c685760405162461bcd60e51b81526004016109909061471c565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b611c95848484612ada565b611ca184848484613517565b611cbd5760405162461bcd60e51b815260040161099090614931565b50505050565b6060611cd0826000541190565b611d345760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610990565b6000611d3f836129b4565b90506000604051806101a001604052806040518060400160405280600681526020016518182222a32360d11b81525081526020016040518060400160405280600681526020016518182222a32360d11b815250815260200160405180604001604052806006815260200165219aa0a1a32360d11b815250815260200160405180604001604052806006815260200165219aa0a1a32360d11b81525081526020016040518060400160405280600681526020016538424646374360d01b81525081526020016040518060400160405280600681526020016538424646374360d01b81525081526020016040518060400160405280600681526020016538424646374360d01b81525081526020016040518060400160405280600681526020016511918e110e1160d21b81525081526020016040518060400160405280600681526020016511918e110e1160d21b81525081526020016040518060400160405280600681526020016511918e110e1160d21b815250815260200160405180604001604052806006815260200165119191914e1160d21b815250815260200160405180604001604052806006815260200165119191914e1160d21b8152508152602001604051806040016040528060068152602001652118a321a32360d11b81525081525090506000818360000151600d8110611f3b57611f3b61478c565b6020020151604051602001611f509190614984565b6040516020818303038152906040529050600081611f7885600001516001610e1891906147b8565b604051602001611f89929190614a85565b60408051601f19818403018152610380830190915260266103208301818152919350600092918291615c1861034084013981526020016040518060600160405280602d8152602001615b3c602d913981526020016040518060400160405280600f81526020016e53612f52614f5320762e20372e323160881b81525081526020016040518060400160405280601d81526020017f2843293230323220426c61636b204d65746120436f72702e28544d292900000081525081526020016040518060600160405280602d8152602001615b3c602d913981526020016040518060600160405280602b8152602001615a17602b913981526020016040518060400160405280600c81526020016b03e102ab9b2b9102637b39d160a51b81525081526020016120b4896129d4565b6040516020016120c49190614c03565b60405160208183030381529060405281526020016040518060400160405280601681526020017503e1029b2b1bab934ba3c9021b632b0b930b731b29d160551b815250815260200160138760000151600d81106121235761212361478c565b016040516020016121349190614cdb565b60405160208183030381529060405281526020016040518060400160405280601881526020017f7c2057656c636f6d6520746f20426c61636b204d6574612e00000000000000008152508152602001604051806060016040528060288152602001615a726028913981526020016121b587606001516001610e1891906147b8565b6040516020016121c59190614cf9565b6040516020818303038152906040528152602001604051806060016040528060278152602001615bf160279139815260200160208760200151600d811061220e5761220e61478c565b0160405160200161221f9190614cdb565b6040516020818303038152906040528152602001604051806060016040528060308152602001615b8d603091398152602001604051806060016040528060308152602001615a42603091398152602001604051806060016040528060248152602001615b696024913981526020016040518060600160405280602e8152602001615b0e602e91398152602001602d8760800151600d81106122c2576122c261478c565b016040516020016122d39190614d2e565b6040516020818303038152906040528152602001603a8760a00151600d81106122fe576122fe61478c565b0160405160200161230f9190614d4e565b6040516020818303038152906040528152602001604051806060016040528060348152602001615bbd603491398152602001604051806060016040528060348152602001615a9a603491398152602001604051806060016040528060248152602001615b6960249139815260200160478760c00151600d81106123945761239461478c565b016040516020016123a59190614d68565b60405160208183030381529060405281525090506000600d6123ca87600001516129d4565b6040516020016123db929190614d89565b60408051601f19818403018152602083019091526000808352909250600581805b601981101561248257846124288285878b866019811061241e5761241e61478c565b6020020151613615565b604051602001612439929190614e0f565b60408051601f198184030181529190529450612456600284614884565b61246090856147b8565b9350816001141561247057612482565b8061247a816148e0565b9150506123fc565b50600061248e846129d4565b60405160200161249e9190614e4a565b60405160208183030381529060405290506060600d6040516020016124c39190614fc4565b6040516020818303038152906040529050600081888b89866040516020016124ef959493929190615029565b60405160208183030381529060405290506125128f61250d836136b7565b613741565b9f9e505050505050505050505050505050565b61252d614202565b604080516101a081019182905290601190600d90826000855b82829054906101000a900461ffff1661ffff16815260200190600201906020826001010492830192600103820291508084116125465790505050505050905090565b6008546001600160a01b031633146125b25760405162461bcd60e51b81526004016109909061471c565b601080546001600160d01b0319166001600160d01b0392909216919091179055565b6008546001600160a01b031633146125fe5760405162461bcd60e51b81526004016109909061471c565b6001600160a01b0381166126635760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610990565b6109b781613094565b6002600754141561268f5760405162461bcd60e51b815260040161099090614818565b6002600755601054600160f01b900460ff161515600114806127295750600c54604051637d7bd41360e11b81526001600160a01b039091169063faf7a826906126e29033908590889088906004016151c4565b602060405180830381865afa1580156126ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127239190614914565b15156001145b6127675760405162461bcd60e51b815260206004820152600f60248201526e139bdd081dda1a5d195b1a5cdd1959608a1b6044820152606401610990565b601054600054600160d01b90910461ffff161161278357600080fd5b336000908152600f6020526040902054156127d95760405162461bcd60e51b81526020600482015260166024820152751859191c995cdcc8185b1c9958591e481b5a5b9d195960521b6044820152606401610990565b6010546001600160d01b03163410156127f157600080fd5b601054600160e81b900460ff16151560011461285b5760405162461bcd60e51b815260206004820152602360248201527f4d696e74696e672069732063757272656e746c79206e6f74207065726d69747460448201526232b21760e91b6064820152608401610990565b336000908152600f6020526040812080546001929061287b9084906147b8565b90915550506040805160018082528183019092526000916020808301908036833701905050905084816000815181106128b6576128b661478c565b6020026020010181815250506128cd816001613930565b50506001600755505050565b6008546001600160a01b031633146129035760405162461bcd60e51b81526004016109909061471c565b60105460ff600160f01b90910416151581151514156129345760405162461bcd60e51b8152600401610990906147d0565b60108054911515600160f01b0260ff60f01b19909216919091179055565b3b151590565b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6129bc614221565b6000828152600e602052604090205461096090613c1f565b6060816129f85750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612a225780612a0c816148e0565b9150612a1b9050600a83614884565b91506129fc565b60008167ffffffffffffffff811115612a3d57612a3d6144a5565b6040519080825280601f01601f191660200182016040528015612a67576020820181803683370190505b5090505b8415612ad257612a7c600183615219565b9150612a89600a86615230565b612a949060306147b8565b60f81b818381518110612aa957612aa961478c565b60200101906001600160f81b031916908160001a905350612acb600a86614884565b9450612a6b565b949350505050565b6000612ae582612fbd565b80519091506000906001600160a01b0316336001600160a01b03161480612b1c575033612b1184610a4c565b6001600160a01b0316145b80612b2e57508151612b2e9033610836565b905080612b985760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610990565b846001600160a01b031682600001516001600160a01b031614612c0c5760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b6064820152608401610990565b6001600160a01b038416612c705760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b6064820152608401610990565b612c806000848460000151612958565b6001600160a01b03858116600090815260046020908152604080832080546001600160801b03198082166001600160801b03928316600019018316179092558986168086528386208054938416938316600190810190931693909317909255888552600390935281842080546001600160e01b031916909117600160a01b4267ffffffffffffffff1602179055908601808352912054909116612d7557612d28816000541190565b15612d75578251600082815260036020908152604090912080549186015167ffffffffffffffff16600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b612dc7614202565b612dcf614202565b60008060006802b5e3af16b1880000861015612df257600a9250600c9150612e66565b68056bc75e2d63100000861015612e10576007925060099150612e66565b680ad78ebc5ac6200000861015612e2e576004925060069150612e66565b681043561a8829300000861015612e4c576002925060039150612e66565b6815af1d78b58c400000861015612e665760019250600191505b825b828111612f46576000601182600d8110612e8457612e8461478c565b601091828204019190066002029054906101000a900461ffff1661ffff161115612f3457601181600d8110612ebb57612ebb61478c565b601091828204019190066002029054906101000a900461ffff168582600d8110612ee757612ee761478c565b61ffff9092166020929092020152601181600d8110612f0857612f0861478c565b601091828204019190066002029054906101000a900461ffff1661ffff1682612f3191906147b8565b91505b80612f3e816148e0565b915050612e68565b5060008111612fb35760405162461bcd60e51b815260206004820152603360248201527f4e6f20636c656172616e6365206c6576656c7320617661696c61626c6520666f60448201527239103a3434b990213cba329030b6b7bab73a1760691b6064820152608401610990565b5091949350505050565b6040805180820190915260008082526020820152612fdc826000541190565b61303b5760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b6064820152608401610990565b815b6000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff16918301919091521561308a579392505050565b506000190161303d565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006130f0614221565b6130f8614266565b60408051426020808301919091523360601b6bffffffffffffffffffffffff19168284015260548083018890528351808403909101815260749092019092528051910120600080805b60068110156131f557610bb861315a600e831886614884565b6131649190615230565b925060009150600c5b601281600d81106131805761318061478c565b601091828204019190066002029054906101000a900461ffff1661ffff16836131a991906147b8565b9250828410156131d057808683600681106131c6576131c661478c565b60200201526131e2565b806131da81615244565b91505061316d565b50806131ed816148e0565b915050613141565b50878552835160208087019190915284015160408087019190915284015160608087019190915284015160808087019190915284015160a08087019190915284015160c086018190528790601290600d81106132535761325361478c565b601091828204019190066002029054906101000a900461ffff1660128760a00151600d81106132845761328461478c565b601091828204019190066002029054906101000a900461ffff1660128860800151600d81106132b5576132b561478c565b601091828204019190066002029054906101000a900461ffff1660128960600151600d81106132e6576132e661478c565b601091828204019190066002029054906101000a900461ffff1660128a60400151600d81106133175761331761478c565b601091828204019190066002029054906101000a900461ffff1660128b60200151600d81106133485761334861478c565b601091828204019190066002029054906101000a900461ffff1661336c919061525b565b613376919061525b565b613380919061525b565b61338a919061525b565b613394919061525b565b6133a49061ffff16611194615219565b6133b09061271061484f565b8651601290600d81106133c5576133c561478c565b601091828204019190066002029054906101000a900461ffff1661ffff166102ee6133f09190615219565b6133fe906305f5e10061484f565b61340891906147b8565b61341490610bb86147b8565b61341e9190615219565b60e08601819052855160208701516040880151606089015160808a015160a08b015160c08c015161344e97613482565b6000978852600e602052604090972096909655509295945050505050565b612710600a54111561347d57600080fd5b600a55565b600080896134916008836147b8565b915089821b176134a26008836147b8565b915088821b176134b36008836147b8565b915087821b176134c46008836147b8565b915086821b176134d56008836147b8565b915085821b176134e66008836147b8565b915084821b176134f76008836147b8565b915083821b176135086080836147b8565b509a9950505050505050505050565b60006001600160a01b0384163b1561360a57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061355b903390899088908890600401615281565b6020604051808303816000875af1925050508015613596575060408051601f3d908101601f19168201909252613593918101906152be565b60015b6135f0573d8080156135c4576040519150601f19603f3d011682016040523d82523d6000602084013e6135c9565b606091505b5080516135e85760405162461bcd60e51b815260040161099090614931565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612ad2565b506001949350505050565b60606000613622866129d4565b61363b61363088600e61484f565b610e189060aa6147b8565b61364961363089600e61484f565b613652886129d4565b61365b886129d4565b60405160200161366f9594939291906152db565b60405160208183030381529060405290508061368a876129d4565b8460405160200161369d93929190615413565b60408051808303601f190181529190529695505050505050565b604080518082018252601a81527f646174613a696d6167652f7376672b786d6c3b6261736536342c00000000000060209182015281518083018352601381527219185d184e9a5b5859d94bdcdd99cade1b5b0b606a1b81830152915160609260009290916137299183918791016154e0565b60405160208183030381529060405292505050919050565b6000828152600e602052604090205460609061377f57600d6040516020016137699190615506565b6040516020818303038152906040529050610960565b600061378a846129b4565b90506000600d61379d83600001516129d4565b8560138560000151600d81106137b5576137b561478c565b016040516020016137c99493929190615535565b60405160208183030381529060405290508060208360200151600d81106137f2576137f261478c565b0161380784604001516001610e1891906147b8565b604051602001613819939291906156e3565b60405160208183030381529060405290508061383f83606001516001610e1891906147b8565b602d8460800151600d81106138565761385661478c565b01604051602001613869939291906157ac565b604051602081830303815290604052905080603a8360a00151600d81106138925761389261478c565b0160478460c00151600d81106138aa576138aa61478c565b016138b88560e001516129d4565b6040516020016138cb9493929190615872565b6040516020818303038152906040529050806040516020016138ed919061597f565b604051602081830303815290604052905061390781613c9f565b60405160200161391791906159ae565b6040516020818303038152906040529250505092915050565b6000805b83518110156139765783818151811061394f5761394f61478c565b60200260200101518261396291906147b8565b91508061396e816148e0565b915050613934565b5060008111801561399257506008546001600160a01b03163314155b15613b1857600b546040516370a0823160e01b815233600482015282916001600160a01b0316906370a0823190602401602060405180830381865afa1580156139df573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a0391906148fb565b1015613a515760405162461bcd60e51b815260206004820152601960248201527f496e73756666696369656e7420427974652062616c616e6365000000000000006044820152606401610990565b600b546040516323b872dd60e01b8152336004820152306024820152604481018390526001600160a01b03909116906323b872dd906064016020604051808303816000875af1158015613aa8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613acc9190614914565b613b185760405162461bcd60e51b815260206004820152601860248201527f4661696c656420746f207472616e7366657220427974657300000000000000006044820152606401610990565b613b20614202565b6000805b84811015613c145780613b5a57613b53868281518110613b4657613b4661478c565b6020026020010151612dbf565b9250613b87565b60018383600d8110613b6e57613b6e61478c565b60200201818151613b7f91906159f3565b61ffff169052505b613b918382613e05565b9150613baa8282600054613ba591906147b8565b6130e6565b506001601183600d8110613bc057613bc061478c565b601091828204019190066002028282829054906101000a900461ffff16613be791906159f3565b92506101000a81548161ffff021916908361ffff1602179055508080613c0c906148e0565b915050613b24565b50612db83385613fa2565b613c27614221565b50604080516101008101825260ff8381168252600884901c8116602080840191909152601085901c821693830193909352601884901c811660608301529183901c82166080820152602883901c821660a0820152603083901c90911660c082015260389190911c6001600160801b031660e082015290565b6060815160001415613cbf57505060408051602081019091526000815290565b6000604051806060016040528060408152602001615ace6040913990506000600384516002613cee91906147b8565b613cf89190614884565b613d0390600461484f565b90506000613d128260206147b8565b67ffffffffffffffff811115613d2a57613d2a6144a5565b6040519080825280601f01601f191660200182016040528015613d54576020820181803683370190505b509050818152600183018586518101602084015b81831015613dc0576003830192508251603f8160121c168501518253600182019150603f81600c1c168501518253600182019150603f8160061c168501518253600182019150603f8116850151825350600101613d68565b600389510660018114613dda5760028114613deb57613df7565b613d3d60f01b600119830152613df7565b603d60f81b6000198301525b509398975050505050505050565b60008080805b600d811015613e4d578581600d8110613e2657613e2661478c565b6020020151613e399061ffff16846147b8565b925080613e45816148e0565b915050613e0b565b5081613e905760405162461bcd60e51b815260206004820152601260248201527126b4b73a34b7339032bc3430bab9ba32b21760711b6044820152606401610990565b6000444233600054896000600d8110613eab57613eab61478c565b6020020151600d8a604051602001613f139796959493929190968752602087019590955260609390931b6bffffffffffffffffffffffff19166040860152605485019190915260f01b6001600160f01b03191660748401526076830152609682015260b60190565b6040516020818303038152906040529050600083828051906020012060001c613f3c9190615230565b905060005b600d811015613f97578781600d8110613f5c57613f5c61478c565b6020020151613f6f9061ffff16856147b8565b935083821015613f855794506109609350505050565b80613f8f816148e0565b915050613f41565b505050505092915050565b611780828260405180602001604052806000815250610bea83838360016000546001600160a01b0385166140225760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610990565b836140805760405162461bcd60e51b815260206004820152602860248201527f455243373231413a207175616e74697479206d75737420626520677265617465604482015267072207468616e20360c41b6064820152608401610990565b6001600160a01b03851660008181526004602090815260408083208054600160801b6001600160801b031982166001600160801b039283168c01831690811782900483168c01909216021790558483526003909152812080546001600160e01b031916909217600160a01b4267ffffffffffffffff16021790915581905b858110156141795760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4831561416d576141516000888488613517565b61416d5760405162461bcd60e51b815260040161099090614931565b600191820191016140fe565b50600055612db8565b82805461418e90614751565b90600052602060002090601f0160209004810192826141b057600085556141f6565b82601f106141c957805160ff19168380011785556141f6565b828001600101855582156141f6579182015b828111156141f65782518255916020019190600101906141db565b5061173f929150614284565b604051806101a00160405280600d906020820280368337509192915050565b60405180610100016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6040518060c001604052806006906020820280368337509192915050565b5b8082111561173f5760008155600101614285565b6001600160e01b0319811681146109b757600080fd5b6000602082840312156142c157600080fd5b81356142cc81614299565b9392505050565b6001600160a01b03811681146109b757600080fd5b6000602082840312156142fa57600080fd5b81356142cc816142d3565b60005b83811015614320578181015183820152602001614308565b83811115611cbd5750506000910152565b60008151808452614349816020860160208601614305565b601f01601f19169290920160200192915050565b6020815260006142cc6020830184614331565b60006020828403121561438257600080fd5b5035919050565b6000806040838503121561439c57600080fd5b82356143a7816142d3565b946020939093013593505050565b6000806000606084860312156143ca57600080fd5b83356143d5816142d3565b925060208401356143e5816142d3565b929592945050506040919091013590565b80151581146109b757600080fd5b60006020828403121561441657600080fd5b81356142cc816143f6565b6000806040838503121561443457600080fd5b50508035926020909101359150565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561449857603f19888603018452614486858351614331565b9450928501929085019060010161446a565b5092979650505050505050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff808411156144d6576144d66144a5565b604051601f8501601f19908116603f011681019082821181831017156144fe576144fe6144a5565b8160405280935085815286868601111561451757600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561454357600080fd5b813567ffffffffffffffff81111561455a57600080fd5b8201601f8101841361456b57600080fd5b612ad2848235602084016144bb565b6000806040838503121561458d57600080fd5b8235614598816142d3565b915060208301356145a8816143f6565b809150509250929050565b600080600080608085870312156145c957600080fd5b84356145d4816142d3565b935060208501356145e4816142d3565b925060408501359150606085013567ffffffffffffffff81111561460757600080fd5b8501601f8101871361461857600080fd5b614627878235602084016144bb565b91505092959194509250565b6000806040838503121561464657600080fd5b8235614651816142d3565b915060208301356145a8816142d3565b6101a08101818360005b600d81101561468e57815161ffff1683526020928301929091019060010161466b565b50505092915050565b600080600080606085870312156146ad57600080fd5b84359350602085013567ffffffffffffffff808211156146cc57600080fd5b818701915087601f8301126146e057600080fd5b8135818111156146ef57600080fd5b8860208260051b850101111561470457600080fd5b95986020929092019750949560400135945092505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c9082168061476557607f821691505b6020821081141561478657634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600082198211156147cb576147cb6147a2565b500190565b60208082526028908201527f6d7573742062652031206f7220302c20616e64206e6f742073616d652061732060408201526731bab93932b73a1760c11b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6000816000190483118215151615614869576148696147a2565b500290565b634e487b7160e01b600052601260045260246000fd5b6000826148935761489361486e565b500490565b600081516148aa818560208601614305565b9290920192915050565b6302c32b7160e51b8152600082516148d3816004850160208701614305565b9190910160040192915050565b60006000198214156148f4576148f46147a2565b5060010190565b60006020828403121561490d57600080fd5b5051919050565b60006020828403121561492657600080fd5b81516142cc816143f6565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b6a2533437374796c6525334560a81b81527f40696d706f72742075726c282768747470733a2f2f666f6e74732e676f6f676c600b8201527f65617069732e636f6d2f637373323f66616d696c793d565433323327293b0000602b8201526617313690129ba160c91b60498201527f666f6e742d66616d696c793a20275654333233272c206d6f6e6f73706163653b60508201526e666f6e742d73697a653a313270783b60881b60708201526866696c6c3a2025323360b81b607f82015260008251614a56816088850160208701614305565b62094dd160ea1b60889390910192830152506b2533432f7374796c6525334560a01b608b820152609701919050565b60008351614a97818460208801614305565b80830190507f2533437465787420636c6173733d27626d2720783d2735302532352720793d278082527f39302720746578742d616e63686f723d276d6964646c65272025334553412f5260208301527f412039303030204f5045524154494e472053595354454d202533432f7465787460408301526225334560e81b60608301528060638301527f3131302720746578742d616e63686f723d276d6964646c652720253345434f5060838301527f59524947485420323032322d3231373520424c41434b204d45544120434f525060a3830152714f524154494f4e2533432f7465787425334560701b60c38301528060d5830152507f3133302720746578742d616e63686f723d276d6964646c652720253345202d2d60f582015271029a2a1aaa924aa2c902a22a926a4a720a6160751b610115820152614bfa614bdf610127830186614898565b6e2d2d20202533432f7465787425334560881b8152600f0190565b95945050505050565b7503e101299a29299a29026bab63a34b830b9b9a4a21d160551b815260008251614c34816016850160208701614305565b9190910160160192915050565b8054600090600181811c9080831680614c5b57607f831692505b6020808410821415614c7d57634e487b7160e01b600052602260045260246000fd5b818015614c915760018114614ca257614ccf565b60ff19861689528489019650614ccf565b60008881526020902060005b86811015614cc75781548b820152908501908301614cae565b505084890196505b50505050505092915050565b6803e101299a29299a2960bd1b815260006142cc6009830184614c41565b6c03e101299a29299a2902c32b71609d1b815260008251614d2181600d850160208701614305565b91909101600d0192915050565b6a01299a290219d1299a290160ad1b815260006142cc600b830184614c41565b6401299a2be160dd1b815260006142cc6005830184614c41565b6b01299a2be101299a29299a2960a51b815260006142cc600c830184614c41565b74253343696d61676520786c696e6b3a687265663d2760581b81526000614db36015830185614c41565b602f60f81b81528351614dcd816001840160208801614305565b7f2e706e67272077696474683d2736303027206865696768743d2736303027202f600192909101918201526225334560e81b6021820152602401949350505050565b60008351614e21818460208801614305565b835190830190614e35818360208801614305565b600160fd1b9101908152600101949350505050565b7f253343706174682069643d277061746866696e616c27253345253343616e696d81527f617465206174747269627574654e616d653d2764272066726f6d3d276d31383060208201527f2c3535302068302720746f3d276d3138302c353530206831313030272064757260408201526c3d2737732720626567696e3d2760981b606082015260008251614ee481606d850160208701614305565b7f73272066696c6c3d27667265657a65272f2533452533432f7061746825334500606d9390910192830152507f25334374657874253345253343746578745061746820786c696e6b3a68726566608c8201527f3d272532337061746866696e616c2720636c6173733d27626d2725334552455460ac8201527f55524e3a20656e746572207c204241434b5350414345203a2064656c6574652060cc8201527f7c2046313a206d61696e206d656e752533432f7465787450617468253345253360ec82015268432f7465787425334560b81b61010c82015261011501919050565b74253343696d61676520786c696e6b3a687265663d2760581b81526000614fee6015830184614c41565b7f2f612e706e67272077696474683d2736303027206865696768743d2736303027815264202f25334560d81b60208201526025019392505050565b7f25334373766720786d6c6e733d27687474703a2f2f7777772e77332e6f72672f81527f323030302f737667272077696474683d27363030272020786d6c6e733a786c6960208201527f6e6b3d27687474703a2f2f7777772e77332e6f72672f313939392f786c696e6b60408201527f27206865696768743d273630302725334520253343726563742077696474683d60608201527f2736303027206865696768743d2736303027207374796c653d2766696c6c3a7260808201527f6762283235352c3235352c323535293b7374726f6b652d77696474683a333b7360a08201527574726f6b653a72676228302c302c302927202f25334560501b60c08201526000865161513e8160d6850160208b01614305565b8651908301906151558160d6840160208b01614305565b865191019061516b8160d6840160208a01614305565b6151b76151a161518961518360d6858701018a614898565b88614898565b6b2ab739bab83837b93a32b21760a11b8152600c0190565b692533432f73766725334560b01b8152600a0190565b9998505050505050505050565b6001600160a01b038516815260208101849052606060408201819052810182905260006001600160fb1b038311156151fb57600080fd5b8260051b808560808501376000920160800191825250949350505050565b60008282101561522b5761522b6147a2565b500390565b60008261523f5761523f61486e565b500690565b600081615253576152536147a2565b506000190190565b600061ffff808316818516808303821115615278576152786147a2565b01949350505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906152b490830184614331565b9695505050505050565b6000602082840312156152d057600080fd5b81516142cc81614299565b6f04a6686e0c2e8d040d2c87a4ee0c2e8d60831b815260008651615306816010850160208b01614305565b7f2725334520253343616e696d617465206174747269627574654e616d653d27646010918401918201526c01390333937b69e93b69a98161609d1b6030820152865161535981603d840160208b01614305565b6d010341813903a379e93b69a9816160951b603d9290910191820152855161538881604b840160208a01614305565b6c20683131303027206475723d2760981b604b929091019182015284516153b6816058840160208901614305565b69732720626567696e3d2760b01b605892909101918201526154076153de6062830186614898565b7f73272066696c6c3d27667265657a65272f2533452533432f70617468253345008152601f0190565b98975050505050505050565b60008451615425818460208901614305565b80830190507f2533437465787420636c6173733d27626d2725334520253343746578745061748152740d040f0d8d2dcd674d0e4cacc7a4e4a6466e0c2e8d605b1b6020820152845161547e816035840160208901614305565b632725334560e01b6035929091019182015283516154a3816039840160208801614305565b6e2533432f746578745061746825334560881b603992909101918201526a2533432f7465787425334560a81b604882015260530195945050505050565b600083516154f2818460208801614305565b835190830190615278818360208801614305565b60006155128284614c41565b7217b0b1b1b2b9b9afb232b734b2b2173539b7b760691b81526013019392505050565b7f7b226465736372697074696f6e223a2022546865207469636b657420696e746f81527f2074686520426c61636b204d657461204d756c746976657273652e220000000060208201527f2c202265787465726e616c5f75726c223a202268747470733a2f2f626c61636b603c8201526936b2ba309739b4ba329160b11b605c8201526b16101134b6b0b3b2911d101160a11b606682015260006155db6072830187614c41565b612f6160f01b815285516155f6816002840160208a01614305565b64173837339160d91b600292909101918201526e1610113230ba30afbab934911d101160891b60078201528451615634816016840160208901614305565b6154076156d46156ce61567f615656601686880101601160f91b815260010190565b7f2c20226e616d65223a2022426c61636b204d657461204d756c74697061737322815260200190565b7f2c202261747472696275746573223a205b7b2274726169745f74797065223a2081527f22436c656172616e6365204c6576656c222c202276616c7565223a20220000006020820152603d0190565b87614c41565b6222207d60e81b815260030190565b600084516156f5818460208901614305565b7f2c207b2274726169745f74797065223a202253746174696f6e222c202276616c908301908152653ab2911d101160d11b60208201526157386026820186614c41565b6222207d60e81b8082527f2c207b2274726169745f74797065223a20225365637572697479205465726d6960038301526f3730b6111610113b30b63ab2911d101160811b6023830152855191925090615798816033850160208901614305565b603392019182015260360195945050505050565b600084516157be818460208901614305565b80830190507f2c207b2274726169745f74797065223a202258656e2047726f757073222c202281526c03b30b63ab2911d10112c32b71609d1b6020820152845161580f81602d840160208901614305565b6222207d60e81b9101602d81018290527f2c207b2274726169745f74797065223a2022436f6d6d616e64222c202276616c6030820152653ab2911d101160d11b6050820152906158626056830186614c41565b9081526003019695505050505050565b60008551615884818460208a01614305565b7f2c207b2274726169745f74797065223a2022526573706f6e7365222c2022766190830190815266363ab2911d101160c91b60208201526158c86027820187614c41565b6222207d60e81b8082527f2c207b2274726169745f74797065223a2022496e73756c74222c202276616c7560038301526432911d101160d91b60238301529091506159166028830187614c41565b9081527f2c207b2274726169745f74797065223a2022526172697479222c202276616c75600382015263032911d160e51b60238201528451909150615962816027840160208801614305565b61207d60f01b602792909101918201526029019695505050505050565b60008251615991818460208701614305565b605d60f81b920191825250607d60f81b6001820152600201919050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008152600082516159e681601d850160208701614305565b91909101601d0192915050565b600061ffff83811690831681811015615a0e57615a0e6147a2565b03939250505056fe7c202533452533452052756e6e696e67205365637572697479205363616e2e2e2e20434f4d504c455445202533457c20253345253345204f70656e696e6720436f6d6d616e6420537562726f6f742e2e2e20434f4d504c455445207c202533452533452041737369676e696e672051756172746572732e2e2e20434f4d504c455445202533457c20253345253345205374617274696e6720496e73756c742050726f746f636f6c20322e332e2e2e20434f4d504c4554454142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f2533453e2048656c6c6f2e20486f772063616e20492066697820796f757220746f74616c206661696c757265733f3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d2533457c20253345253345204772616e74696e6720537562726f6f74204163636573732e2e2e20434f4d504c455445202533457c2025334525334520416c657274696e6720536563757269747920417373697374616e63652e2e2e20434f4d504c4554457c202533452533452041737369676e696e672053746174696f6e2e2e2e20434f4d504c455445202d2d426c61636b204d657461205365637572697479205363616e2053756273797374656d2d2da264697066735822122037272c98c2faa1c6775fd5bb79a03ead884914245de27f5ac2557f9257a5b96664736f6c634300080c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000007d647b1a0dcd5525e9c6b3d14be58f27674f8c9500000000000000000000000033e66be2b437fbb7d401a1c391e0707b9e070734000000000000000000000000a9fb5c3f2fd89122b1da1c1e7245f6ed5732b8810000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000005468747470733a2f2f626c61636b6d6574612e6d7970696e6174612e636c6f75642f697066732f516d5476666f5658636a45446d4b647057437a4d724d4c464844373645704b6331455756336e486b625039537933000000000000000000000000
-----Decoded View---------------
Arg [0] : _BytesAddress (address): 0x7d647b1A0dcD5525e9C6B3D14BE58f27674f8c95
Arg [1] : _whiteListAddress (address): 0x33e66Be2B437FBb7d401a1c391e0707B9e070734
Arg [2] : _royaltiesCollector (address): 0xa9fB5C3F2fD89122b1da1C1e7245f6ED5732B881
Arg [3] : _baseURI (string): https://blackmeta.mypinata.cloud/ipfs/QmTvfoVXcjEDmKdpWCzMrMLFHD76EpKc1EWV3nHkbP9Sy3
-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 0000000000000000000000007d647b1a0dcd5525e9c6b3d14be58f27674f8c95
Arg [1] : 00000000000000000000000033e66be2b437fbb7d401a1c391e0707b9e070734
Arg [2] : 000000000000000000000000a9fb5c3f2fd89122b1da1c1e7245f6ed5732b881
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000054
Arg [5] : 68747470733a2f2f626c61636b6d6574612e6d7970696e6174612e636c6f7564
Arg [6] : 2f697066732f516d5476666f5658636a45446d4b647057437a4d724d4c464844
Arg [7] : 373645704b6331455756336e486b625039537933000000000000000000000000
Deployed Bytecode Sourcemap
73196:35299:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59996:372;;;;;;;;;;-1:-1:-1;59996:372:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;59996:372:0;;;;;;;;106305:113;;;;;;;;;;-1:-1:-1;106305:113:0;;;;;:::i;:::-;;:::i;:::-;;61882:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;63444:214::-;;;;;;;;;;-1:-1:-1;63444:214:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2102:32:1;;;2084:51;;2072:2;2057:18;63444:214:0;1938:203:1;62965:413:0;;;;;;;;;;-1:-1:-1;62965:413:0;;;;;:::i;:::-;;:::i;80243:95::-;;;;;;;;;;-1:-1:-1;80292:7:0;80318:12;80243:95;;;2612:25:1;;;2600:2;2585:18;80243:95:0;2466:177:1;80824:272:0;;;;;;;;;;-1:-1:-1;80824:272:0;;;;;:::i;:::-;;:::i;105008:126::-;;;;;;;;;;-1:-1:-1;105008:126:0;;;;;:::i;:::-;;:::i;80437:297::-;;;;;;;;;;-1:-1:-1;80437:297:0;;;;;:::i;:::-;;:::i;81613:295::-;;;;;;;;;;-1:-1:-1;81613:295:0;;;;;:::i;:::-;;:::i;81998:272::-;;;;;;;;;;-1:-1:-1;81998:272:0;;;;;:::i;:::-;;:::i;64320:162::-;;;;;;;;;;-1:-1:-1;64320:162:0;;;;;:::i;:::-;;:::i;105298:232::-;;;;;;;;;;-1:-1:-1;105298:232:0;;;;;:::i;:::-;;:::i;104626:374::-;;;;;;;;;;-1:-1:-1;104626:374:0;;;;;:::i;:::-;;:::i;11324:328::-;;;;;;;;;;-1:-1:-1;11324:328:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;4183:32:1;;;4165:51;;4247:2;4232:18;;4225:34;;;;4138:18;11324:328:0;3991:274:1;58917:1007:0;;;;;;;;;;-1:-1:-1;58917:1007:0;;;;;:::i;:::-;;:::i;81200:314::-;;;;;;;;;;-1:-1:-1;81200:314:0;;;;;:::i;:::-;;:::i;64553:177::-;;;;;;;;;;-1:-1:-1;64553:177:0;;;;;:::i;:::-;;:::i;83948:802::-;;;;;;;;;;-1:-1:-1;83948:802:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;83114:208::-;;;;;;;;;;-1:-1:-1;83114:208:0;;;;;:::i;:::-;;:::i;104263:355::-;;;;;;;;;;-1:-1:-1;104263:355:0;;;;;:::i;:::-;;:::i;58430:187::-;;;;;;;;;;-1:-1:-1;58430:187:0;;;;;:::i;:::-;;:::i;106072:100::-;;;;;;;;;;-1:-1:-1;106072:100:0;;;;;:::i;:::-;;:::i;61691:124::-;;;;;;;;;;-1:-1:-1;61691:124:0;;;;;:::i;:::-;;:::i;60432:221::-;;;;;;;;;;-1:-1:-1;60432:221:0;;;;;:::i;:::-;;:::i;82361:275::-;;;;;;;;;;-1:-1:-1;82361:275:0;;;;;:::i;:::-;;:::i;9017:94::-;;;;;;;;;;;;;:::i;89884:1118::-;;;;;;;;;;-1:-1:-1;89884:1118:0;;;;;:::i;:::-;;:::i;105538:262::-;;;;;;;;;;-1:-1:-1;105538:262:0;;;;;:::i;:::-;;:::i;8366:87::-;;;;;;;;;;-1:-1:-1;8439:6:0;;-1:-1:-1;;;;;8439:6:0;8366:87;;62051:104;;;;;;;;;;;;;:::i;106180:117::-;;;;;;;;;;-1:-1:-1;106180:117:0;;;;;:::i;:::-;;:::i;106875:755::-;;;;;;;;;;-1:-1:-1;106875:755:0;;;;;:::i;:::-;;:::i;63730:288::-;;;;;;;;;;-1:-1:-1;63730:288:0;;;;;:::i;:::-;;:::i;82727:271::-;;;;;;;;;;-1:-1:-1;82727:271:0;;;;;:::i;:::-;;:::i;105142:148::-;;;;;;;;;;-1:-1:-1;105142:148:0;;;;;:::i;:::-;;:::i;64801:355::-;;;;;;;;;;-1:-1:-1;64801:355:0;;;;;:::i;:::-;;:::i;96050:5069::-;;;;;;;;;;-1:-1:-1;96050:5069:0;;;;;:::i;:::-;;:::i;73960:40::-;;;;;;;;;;-1:-1:-1;73960:40:0;;;;-1:-1:-1;;;;;73960:40:0;;;;-1:-1:-1;;;73960:40:0;;;;;-1:-1:-1;;;73960:40:0;;;;;-1:-1:-1;;;73960:40:0;;;;;-1:-1:-1;;;73960:40:0;;;;;;;;;;-1:-1:-1;;;;;7758:32:1;;;7740:51;;7839:6;7827:19;;;7822:2;7807:18;;7800:47;7890:14;;7883:22;7863:18;;;7856:50;;;;7949:14;;7942:22;7937:2;7922:18;;7915:50;8009:14;8002:22;7996:3;7981:19;;7974:51;7727:3;7712:19;73960:40:0;7501:530:1;64089:164:0;;;;;;;;;;-1:-1:-1;64089:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;64210:25:0;;;64186:4;64210:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;64089:164;83576:130;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;106572:120::-;;;;;;;;;;-1:-1:-1;106572:120:0;;;;;:::i;:::-;;:::i;9266:192::-;;;;;;;;;;-1:-1:-1;9266:192:0;;;;;:::i;:::-;;:::i;92513:1008::-;;;;;;:::i;:::-;;:::i;105808:256::-;;;;;;;;;;-1:-1:-1;105808:256:0;;;;;:::i;:::-;;:::i;59996:372::-;60098:4;-1:-1:-1;;;;;;60135:40:0;;-1:-1:-1;;;60135:40:0;;:105;;-1:-1:-1;;;;;;;60192:48:0;;-1:-1:-1;;;60192:48:0;60135:105;:172;;;-1:-1:-1;;;;;;;60257:50:0;;-1:-1:-1;;;60257:50:0;60135:172;:225;;;-1:-1:-1;;;;;;;;;;35750:40:0;;;60324:36;60115:245;59996:372;-1:-1:-1;;59996:372:0:o;106305:113::-;8439:6;;-1:-1:-1;;;;;8439:6:0;7320:10;8586:23;8578:68;;;;-1:-1:-1;;;8578:68:0;;;;;;;:::i;:::-;;;;;;;;;11178:14;:26;;-1:-1:-1;;;;;;11178:26:0;-1:-1:-1;;;;;11178:26:0;;;;;106305:113;:::o;106381:29::-:1;106305:113:::0;:::o;61882:100::-;61936:13;61969:5;61962:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61882:100;:::o;63444:214::-;63512:7;63540:16;63548:7;65468:4;65502:12;-1:-1:-1;65492:22:0;65411:111;63540:16;63532:74;;;;-1:-1:-1;;;63532:74:0;;10646:2:1;63532:74:0;;;10628:21:1;10685:2;10665:18;;;10658:30;10724:34;10704:18;;;10697:62;-1:-1:-1;;;10775:18:1;;;10768:43;10828:19;;63532:74:0;10444:409:1;63532:74:0;-1:-1:-1;63626:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;63626:24:0;;63444:214::o;62965:413::-;63038:13;63054:24;63070:7;63054:15;:24::i;:::-;63038:40;;63103:5;-1:-1:-1;;;;;63097:11:0;:2;-1:-1:-1;;;;;63097:11:0;;;63089:58;;;;-1:-1:-1;;;63089:58:0;;11060:2:1;63089:58:0;;;11042:21:1;11099:2;11079:18;;;11072:30;11138:34;11118:18;;;11111:62;-1:-1:-1;;;11189:18:1;;;11182:32;11231:19;;63089:58:0;10858:398:1;63089:58:0;7320:10;-1:-1:-1;;;;;63182:21:0;;;;:62;;-1:-1:-1;63207:37:0;63224:5;7320:10;64089:164;:::i;63207:37::-;63160:169;;;;-1:-1:-1;;;63160:169:0;;11463:2:1;63160:169:0;;;11445:21:1;11502:2;11482:18;;;11475:30;11541:34;11521:18;;;11514:62;11612:27;11592:18;;;11585:55;11657:19;;63160:169:0;11261:421:1;63160:169:0;63342:28;63351:2;63355:7;63364:5;63342:8;:28::i;:::-;63027:351;62965:413;;:::o;80824:272::-;80885:13;80919:17;80927:8;65468:4;65502:12;-1:-1:-1;65492:22:0;65411:111;80919:17;80911:26;;;;;;80951:29;;;;:19;:29;;;;;;80948:85;;-1:-1:-1;;80999:22:0;;;;;;;;;;;;-1:-1:-1;;;80999:22:0;;;;;80824:272::o;80948:85::-;81050:8;81059:20;81070:8;81059:10;:20::i;:::-;:28;;;81050:38;;;;;;;:::i;:::-;;81043:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;80824:272;;;:::o;105008:126::-;8439:6;;-1:-1:-1;;;;;8439:6:0;7320:10;8586:23;8578:68;;;;-1:-1:-1;;;8578:68:0;;;;;;;:::i;:::-;105089:10:::1;:37:::0;;-1:-1:-1;;;;;;105089:37:0::1;-1:-1:-1::0;;;;;105089:37:0;;;::::1;::::0;;;::::1;::::0;;105008:126::o;80437:297::-;80505:13;80539:17;80547:8;65468:4;65502:12;-1:-1:-1;65492:22:0;65411:111;80539:17;80531:26;;;;;;80571:29;;;;:19;:29;;;;;;80568:85;;-1:-1:-1;;80619:22:0;;;;;;;;;;;;-1:-1:-1;;;80619:22:0;;;;;80437:297::o;80568:85::-;80670:15;80686:20;80697:8;80686:10;:20::i;:::-;:35;80670:52;;;;;;;:::i;81613:295::-;81683:13;81717:17;81725:8;65468:4;65502:12;-1:-1:-1;65492:22:0;65411:111;81717:17;81709:26;;;;;;81749:29;;;;:19;:29;;;;;;81746:85;;-1:-1:-1;;81797:22:0;;;;;;;;;;;;-1:-1:-1;;;81797:22:0;;;;;81613:295::o;81746:85::-;81848:51;81857:20;81868:8;81857:10;:20::i;:::-;:37;;;:41;;81897:1;81857:41;:::i;:::-;81848:8;:51::i;81998:272::-;82059:13;82093:17;82101:8;65468:4;65502:12;-1:-1:-1;65492:22:0;65411:111;82093:17;82085:26;;;;;;82125:29;;;;:19;:29;;;;;;82122:85;;-1:-1:-1;;82173:22:0;;;;;;;;;;;;-1:-1:-1;;;82173:22:0;;;;;81998:272::o;82122:85::-;82224:8;82233:20;82244:8;82233:10;:20::i;:::-;:28;;;82224:38;;;;;;;:::i;64320:162::-;64446:28;64456:4;64462:2;64466:7;64446:9;:28::i;105298:232::-;8439:6;;-1:-1:-1;;;;;8439:6:0;7320:10;8586:23;8578:68;;;;-1:-1:-1;;;8578:68:0;;;;;;;:::i;:::-;105379:16:::1;:28:::0;::::1;-1:-1:-1::0;;;105379:28:0;;::::1;;:44;;::::0;::::1;;;;105371:97;;;;-1:-1:-1::0;;;105371:97:0::1;;;;;;;:::i;:::-;105479:16;:43:::0;;;::::1;;-1:-1:-1::0;;;105479:43:0::1;-1:-1:-1::0;;;;105479:43:0;;::::1;::::0;;;::::1;::::0;;105298:232::o;104626:374::-;8439:6;;-1:-1:-1;;;;;8439:6:0;7320:10;8586:23;8578:68;;;;-1:-1:-1;;;8578:68:0;;;;;;;:::i;:::-;24721:1:::1;25317:7;;:19;;25309:63;;;;-1:-1:-1::0;;;25309:63:0::1;;;;;;;:::i;:::-;24721:1;25450:7;:18:::0;104795:64:::2;::::0;-1:-1:-1;;;13054:29:1;;104744:21:0::2;::::0;104719:22:::2;::::0;-1:-1:-1;;;;;104795:15:0;::::2;::::0;104819:21:::2;::::0;13108:2:1;13099:12;104795:64:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;104776:83;;;104878:7;104870:36;;;::::0;-1:-1:-1;;;104870:36:0;;13324:2:1;104870:36:0::2;::::0;::::2;13306:21:1::0;13363:2;13343:18;;;13336:30;-1:-1:-1;;;13382:18:1;;;13375:46;13438:18;;104870:36:0::2;13122:340:1::0;104870:36:0::2;104922:70;::::0;;13714:25:1;;;104961:1:0::2;13770:2:1::0;13755:18;;13748:34;-1:-1:-1;;;;;13818:32:1;;13798:18;;;13791:60;104976:15:0::2;13882:2:1::0;13867:18;;13860:34;104922:70:0;;::::2;::::0;;;;13701:3:1;104922:70:0;;::::2;-1:-1:-1::0;;24677:1:0::1;25629:7;:22:::0;-1:-1:-1;104626:374:0:o;11324:328::-;11504:14;;11622;;-1:-1:-1;;;;;11504:14:0;;;;11439:16;;11639:5;;11609:27;;:10;:27;:::i;:::-;:35;;;;:::i;:::-;11593:51;;11324:328;;;;;:::o;58917:1007::-;59006:7;59042:16;59052:5;59042:9;:16::i;:::-;59034:5;:24;59026:71;;;;-1:-1:-1;;;59026:71:0;;14537:2:1;59026:71:0;;;14519:21:1;14576:2;14556:18;;;14549:30;14615:34;14595:18;;;14588:62;-1:-1:-1;;;14666:18:1;;;14659:32;14708:19;;59026:71:0;14335:398:1;59026:71:0;59108:22;80318:12;;;59108:22;;59371:466;59391:14;59387:1;:18;59371:466;;;59431:31;59465:14;;;:11;:14;;;;;;;;;59431:48;;;;;;;;;-1:-1:-1;;;;;59431:48:0;;;;;-1:-1:-1;;;59431:48:0;;;;;;;;;;;;59502:28;59498:111;;59575:14;;;-1:-1:-1;59498:111:0;59652:5;-1:-1:-1;;;;;59631:26:0;:17;-1:-1:-1;;;;;59631:26:0;;59627:195;;;59701:5;59686:11;:20;59682:85;;;-1:-1:-1;59742:1:0;-1:-1:-1;59735:8:0;;-1:-1:-1;;;59735:8:0;59682:85;59789:13;;;;;59627:195;-1:-1:-1;59407:3:0;;59371:466;;;-1:-1:-1;59860:56:0;;-1:-1:-1;;;59860:56:0;;14940:2:1;59860:56:0;;;14922:21:1;14979:2;14959:18;;;14952:30;15018:34;14998:18;;;14991:62;-1:-1:-1;;;15069:18:1;;;15062:44;15123:19;;59860:56:0;14738:410:1;81200:314:0;81263:13;81297:17;81305:8;65468:4;65502:12;-1:-1:-1;65492:22:0;65411:111;81297:17;81289:26;;;;;;81329:29;;;;:19;:29;;;;;;81326:85;;-1:-1:-1;;81377:22:0;;;;;;;;;;;;-1:-1:-1;;;81377:22:0;;;;;81200:314::o;81326:85::-;81460:43;81469:20;81480:8;81469:10;:20::i;:::-;:29;;;:33;;81501:1;81469:33;:::i;81460:43::-;81435:69;;;;;;;;:::i;:::-;;;;;;;;;;;;;81421:85;;81200:314;;;:::o;64553:177::-;64683:39;64700:4;64706:2;64710:7;64683:39;;;;;;;;;;;;:16;:39::i;83948:802::-;84033:15;84061:42;84106:46;84145:6;84106:38;:46::i;:::-;84061:91;;84163:13;84195:9;84191:163;84211:31;84208:1;:34;84191:163;;;84296:1;84266:24;84291:1;84266:27;;;;;;;:::i;:::-;;;;;:31;;;84263:80;;;84317:10;84326:1;84317:10;;:::i;:::-;;;84263:80;84244:3;;;;:::i;:::-;;;;84191:163;;;;84364:44;84424:5;84411:19;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;84364:66;;84449:1;84441:9;;84465;84461:236;84479:31;84476:1;:34;84461:236;;;84564:1;84534:24;84559:1;84534:27;;;;;;;:::i;:::-;;;;;:31;;;84531:155;;;84623:15;84639:1;84623:18;;;;;;;:::i;:::-;;84585:56;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:28;84614:5;84585:35;;;;;;;;:::i;:::-;;;;;;;;;;:56;84660:10;84669:1;84660:10;;:::i;:::-;;;84531:155;84512:3;;;;:::i;:::-;;;;84461:236;;;-1:-1:-1;84714:28:0;83948:802;-1:-1:-1;;;;83948:802:0:o;83114:208::-;83174:7;83223:17;83231:8;65468:4;65502:12;-1:-1:-1;65492:22:0;65411:111;83223:17;83215:26;;;;;;83259:20;83270:8;83259:10;:20::i;:::-;:27;;;;83114:208;-1:-1:-1;;83114:208:0:o;104263:355::-;8439:6;;-1:-1:-1;;;;;8439:6:0;7320:10;8586:23;8578:68;;;;-1:-1:-1;;;8578:68:0;;;;;;;:::i;:::-;24721:1:::1;25317:7;;:19;;25309:63;;;;-1:-1:-1::0;;;25309:63:0::1;;;;;;;:::i;:::-;24721:1;25450:7;:18:::0;104375:10:::2;::::0;:35:::2;::::0;-1:-1:-1;;;104375:35:0;;104404:4:::2;104375:35;::::0;::::2;2084:51:1::0;104350:22:0::2;::::0;-1:-1:-1;;;;;104375:10:0::2;::::0;:20:::2;::::0;2057:18:1;;104375:35:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;104429:10;::::0;104461:35:::2;::::0;-1:-1:-1;;;104461:35:0;;104490:4:::2;104461:35;::::0;::::2;2084:51:1::0;104350:60:0;;-1:-1:-1;;;;;;104429:10:0::2;::::0;:19:::2;::::0;104449:10;;104429;;104461:20:::2;::::0;2057:18:1;;104461:35:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;104429:68;::::0;-1:-1:-1;;;;;;104429:68:0::2;::::0;;;;;;-1:-1:-1;;;;;4183:32:1;;;104429:68:0::2;::::0;::::2;4165:51:1::0;4232:18;;;4225:34;4138:18;;104429:68:0::2;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;104421:103;;;::::0;-1:-1:-1;;;104421:103:0;;16550:2:1;104421:103:0::2;::::0;::::2;16532:21:1::0;16589:2;16569:18;;;16562:30;-1:-1:-1;;;16608:18:1;;;16601:52;16670:18;;104421:103:0::2;16348:346:1::0;104421:103:0::2;104540:70;::::0;;104563:1:::2;13714:25:1::0;;13770:2;13755:18;;13748:34;;;-1:-1:-1;;;;;13818:32:1;;13798:18;;;13791:60;104594:15:0::2;13882:2:1::0;13867:18;;13860:34;104540:70:0;;::::2;::::0;;;;13701:3:1;104540:70:0;;::::2;-1:-1:-1::0;;24677:1:0::1;25629:7;:22:::0;104263:355::o;58430:187::-;58497:7;80318:12;;58525:5;:21;58517:69;;;;-1:-1:-1;;;58517:69:0;;17331:2:1;58517:69:0;;;17313:21:1;17370:2;17350:18;;;17343:30;17409:34;17389:18;;;17382:62;-1:-1:-1;;;17460:18:1;;;17453:33;17503:19;;58517:69:0;17129:399:1;58517:69:0;-1:-1:-1;58604:5:0;58430:187::o;106072:100::-;8439:6;;-1:-1:-1;;;;;8439:6:0;7320:10;8586:23;8578:68;;;;-1:-1:-1;;;8578:68:0;;;;;;;:::i;:::-;106146:18;;::::1;::::0;:7:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;:::-;;106072:100:::0;:::o;61691:124::-;61755:7;61782:20;61794:7;61782:11;:20::i;:::-;:25;;61691:124;-1:-1:-1;;61691:124:0:o;60432:221::-;60496:7;-1:-1:-1;;;;;60524:19:0;;60516:75;;;;-1:-1:-1;;;60516:75:0;;17735:2:1;60516:75:0;;;17717:21:1;17774:2;17754:18;;;17747:30;17813:34;17793:18;;;17786:62;-1:-1:-1;;;17864:18:1;;;17857:41;17915:19;;60516:75:0;17533:407:1;60516:75:0;-1:-1:-1;;;;;;60617:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;60617:27:0;;60432:221::o;82361:275::-;82423:13;82457:17;82465:8;65468:4;65502:12;-1:-1:-1;65492:22:0;65411:111;82457:17;82449:26;;;;;;82489:29;;;;:19;:29;;;;;;82486:85;;-1:-1:-1;;82537:22:0;;;;;;;;;;;;-1:-1:-1;;;82537:22:0;;;;;82361:275::o;82486:85::-;82588:9;82598:20;82609:8;82598:10;:20::i;:::-;:29;;;82588:40;;;;;;;:::i;9017:94::-;8439:6;;-1:-1:-1;;;;;8439:6:0;7320:10;8586:23;8578:68;;;;-1:-1:-1;;;8578:68:0;;;;;;;:::i;:::-;9082:21:::1;9100:1;9082:9;:21::i;:::-;9017:94::o:0;89884:1118::-;89959:3;89948:8;:14;:52;;;;-1:-1:-1;89966:29:0;;;;:19;:29;;;;;;:34;89948:52;89940:61;;;;;;90039:23;90090:2;90079:8;:13;90075:853;;;-1:-1:-1;90146:1:0;90075:853;;;90189:2;90178:8;:13;90174:754;;;-1:-1:-1;90225:1:0;90174:754;;;90268:3;90257:8;:14;90253:675;;;-1:-1:-1;90305:1:0;90253:675;;;90348:3;90337:8;:14;90333:595;;;-1:-1:-1;90385:1:0;90333:595;;;90428:3;90417:8;:14;90413:515;;;-1:-1:-1;90465:1:0;90413:515;;;90508:3;90497:8;:14;90493:435;;;-1:-1:-1;90545:1:0;90493:435;;;90588:3;90577:8;:14;90573:355;;;-1:-1:-1;90625:1:0;90573:355;;;90668:3;90657:8;:14;90653:275;;;-1:-1:-1;90705:1:0;90653:275;;;90748:3;90737:8;:14;90733:195;;;-1:-1:-1;90785:1:0;90733:195;;;90828:3;90817:8;:14;90813:115;;;-1:-1:-1;90865:1:0;90813:115;90938:56;90968:15;90985:8;90938:29;:56::i;105538:262::-;8439:6;;-1:-1:-1;;;;;8439:6:0;7320:10;8586:23;8578:68;;;;-1:-1:-1;;;8578:68:0;;;;;;;:::i;:::-;105629:16:::1;:33:::0;::::1;-1:-1:-1::0;;;105629:33:0;;::::1;;:54;;::::0;::::1;;;;105621:107;;;;-1:-1:-1::0;;;105621:107:0::1;;;;;;;:::i;:::-;105739:16;:53:::0;;;::::1;;-1:-1:-1::0;;;105739:53:0::1;-1:-1:-1::0;;;;105739:53:0;;::::1;::::0;;;::::1;::::0;;105538:262::o;62051:104::-;62107:13;62140:7;62133:14;;;;;:::i;106180:117::-;8439:6;;-1:-1:-1;;;;;8439:6:0;7320:10;8586:23;8578:68;;;;-1:-1:-1;;;8578:68:0;;;;;;;:::i;:::-;106258:31:::1;106277:11;106258:18;:31::i;106875:755::-:0;8439:6;;-1:-1:-1;;;;;8439:6:0;7320:10;8586:23;8578:68;;;;-1:-1:-1;;;8578:68:0;;;;;;;:::i;:::-;106982:19:::1;107004:20;107015:8;107004:10;:20::i;:::-;106982:42;;107043:17;107051:8;65468:4:::0;65502:12;-1:-1:-1;65492:22:0;65411:111;107043:17:::1;:64;;;;-1:-1:-1::0;107064:22:0;;:43;-1:-1:-1;107043:64:0::1;107035:73;;;::::0;::::1;;107401:18;107376:7;:22;;:43;;;::::0;::::1;107462:160;107471:7;:22;;;107495:7;:15;;;107512:7;:24;;;107538:7;:16;;;107556:7;:15;;;107573:7;:16;;;107591:7;:14;;;107607:7;:14;;;107462:8;:160::i;:::-;107430:29;::::0;;;:19:::1;:29;::::0;;;;;:192;;;;-1:-1:-1;;106875:755:0:o;63730:288::-;-1:-1:-1;;;;;63825:24:0;;7320:10;63825:24;;63817:63;;;;-1:-1:-1;;;63817:63:0;;18147:2:1;63817:63:0;;;18129:21:1;18186:2;18166:18;;;18159:30;18225:28;18205:18;;;18198:56;18271:18;;63817:63:0;17945:350:1;63817:63:0;7320:10;63893:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;63893:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;63893:53:0;;;;;;;;;;63962:48;;540:41:1;;;63893:42:0;;7320:10;63962:48;;513:18:1;63962:48:0;;;;;;;63730:288;;:::o;82727:271::-;82787:13;82821:17;82829:8;65468:4;65502:12;-1:-1:-1;65492:22:0;65411:111;82821:17;82813:26;;;;;;82853:29;;;;:19;:29;;;;;;82850:85;;-1:-1:-1;;82901:22:0;;;;;;;;;;;;-1:-1:-1;;;82901:22:0;;;;;82727:271::o;82850:85::-;82952:9;82962:20;82973:8;82962:10;:20::i;:::-;:27;;;82952:38;;;;;;;:::i;105142:148::-;8439:6;;-1:-1:-1;;;;;8439:6:0;7320:10;8586:23;8578:68;;;;-1:-1:-1;;;8578:68:0;;;;;;;:::i;:::-;105235:17:::1;:47:::0;;-1:-1:-1;;;;;;105235:47:0::1;-1:-1:-1::0;;;;;105235:47:0;;;::::1;::::0;;;::::1;::::0;;105142:148::o;64801:355::-;64960:28;64970:4;64976:2;64980:7;64960:9;:28::i;:::-;65021:48;65044:4;65050:2;65054:7;65063:5;65021:22;:48::i;:::-;64999:149;;;;-1:-1:-1;;;64999:149:0;;;;;;;:::i;:::-;64801:355;;;;:::o;96050:5069::-;96124:13;96158:17;96166:8;65468:4;65502:12;-1:-1:-1;65492:22:0;65411:111;96158:17;96150:77;;;;-1:-1:-1;;;96150:77:0;;18922:2:1;96150:77:0;;;18904:21:1;18961:2;18941:18;;;18934:30;19000:34;18980:18;;;18973:62;-1:-1:-1;;;19051:18:1;;;19044:45;19106:19;;96150:77:0;18720:411:1;96150:77:0;96238:19;96260:20;96271:8;96260:10;:20::i;:::-;96238:42;;96293:29;:342;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;96293:342:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;96293:342:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;96293:342:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;96293:342:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;96293:342:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;96293:342:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;96293:342:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;96293:342:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;96293:342:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;96293:342:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;96293:342:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;96293:342:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;96293:342:0;;;;;;;;96648:19;96963:11;96975:7;:22;;;96963:35;;;;;;;:::i;:::-;;;;;96677:383;;;;;;;;:::i;:::-;;;;;;;;;;;;;96648:413;;97078:20;97139:5;97505:36;97514:7;:22;;;97539:1;97514:26;;;;:::i;97505:36::-;97108:476;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;97108:476:0;;;;;;97600:1603;;;;;;;;;;;;;97108:476;;-1:-1:-1;97600:27:0;;97108:476;;;97600:1603;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;97600:1603:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;97600:1603:0;;;;;;;98041:18;98050:8;98041;:18::i;:::-;97998:62;;;;;;;;:::i;:::-;;;;;;;;;;;;;97600:1603;;;;;;;;;;;;;;;;;-1:-1:-1;;;97600:1603:0;;;;;;;98152:15;98168:7;:22;;;98152:39;;;;;;;:::i;:::-;;98122:71;;;;;;;;:::i;:::-;;;;;;;;;;;;;97600:1603;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;98348:30;98357:7;:16;;;98376:1;98357:20;;;;:::i;98348:30::-;98314:66;;;;;;;;:::i;:::-;;;;;;;;;;;;;97600:1603;;;;;;;;;;;;;;;;;;;;;;;;;98489:8;98498:7;:15;;;98489:25;;;;;;;:::i;:::-;;98459:57;;;;;;;;:::i;:::-;;;;;;;;;;;;;97600:1603;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;98817:8;98826:7;:15;;;98817:25;;;;;;;:::i;:::-;;98785:58;;;;;;;;:::i;:::-;;;;;;;;;;;;;97600:1603;;;;98892:9;98902:7;:16;;;98892:27;;;;;;;:::i;:::-;;98866:54;;;;;;;;:::i;:::-;;;;;;;;;;;;;97600:1603;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;99167:7;99175;:14;;;99167:23;;;;;;;:::i;:::-;;99134:57;;;;;;;;:::i;:::-;;;;;;;;;;;;;97600:1603;;;;;99263:26;99359:7;99373:32;99382:7;:22;;;99373:8;:32::i;:::-;99299:162;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;99299:162:0;;;;;;;99475:28;;;;;:25;:28;;;99299:162;;-1:-1:-1;99565:1:0;99475:25;;99604:255;99623:16;99620:1;:19;99604:255;;;99697:11;99710:57;99730:1;99733:8;99743:9;99754;99764:1;99754:12;;;;;;;:::i;:::-;;;;;99710:19;:57::i;:::-;99680:93;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;99680:93:0;;;;;;;;;;-1:-1:-1;99802:10:0;99811:1;99802:8;:10;:::i;:::-;99789:23;;;;:::i;:::-;;;99830:4;99836:1;99830:7;99827:21;;;99841:5;;99827:21;99640:3;;;;:::i;:::-;;;;99604:255;;;;99871:20;100045:19;100054:9;100045:8;:19::i;:::-;99901:364;;;;;;;;:::i;:::-;;;;;;;;;;;;;99871:395;;100281:23;100392:7;100336:115;;;;;;;;:::i;:::-;;;;;;;;;;;;;100317:135;;100465:17;100808:9;100832:12;100859:6;100911:11;100937:6;100492:554;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;100465:582;;101067:44;101082:8;101092:18;101106:3;101092:13;:18::i;:::-;101067:14;:44::i;:::-;101060:51;96050:5069;-1:-1:-1;;;;;;;;;;;;;;;96050:5069:0:o;83576:130::-;83637:17;;:::i;:::-;83667:31;;;;;;;;;;;83674:24;;83667:31;;83674:24;-1:-1:-1;83667:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;83576:130;:::o;106572:120::-;8439:6;;-1:-1:-1;;;;;8439:6:0;7320:10;8586:23;8578:68;;;;-1:-1:-1;;;8578:68:0;;;;;;;:::i;:::-;106640:16:::1;:44:::0;;-1:-1:-1;;;;;;106640:44:0::1;-1:-1:-1::0;;;;;106640:44:0;;;::::1;::::0;;;::::1;::::0;;106572:120::o;9266:192::-;8439:6;;-1:-1:-1;;;;;8439:6:0;7320:10;8586:23;8578:68;;;;-1:-1:-1;;;8578:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;9355:22:0;::::1;9347:73;;;::::0;-1:-1:-1;;;9347:73:0;;31257:2:1;9347:73:0::1;::::0;::::1;31239:21:1::0;31296:2;31276:18;;;31269:30;31335:34;31315:18;;;31308:62;-1:-1:-1;;;31386:18:1;;;31379:36;31432:19;;9347:73:0::1;31055:402:1::0;9347:73:0::1;9431:19;9441:8;9431:9;:19::i;92513:1008::-:0;24721:1;25317:7;;:19;;25309:63;;;;-1:-1:-1;;;25309:63:0;;;;;;;:::i;:::-;24721:1;25450:7;:18;92841:16:::1;:32:::0;-1:-1:-1;;;92841:32:0;::::1;;;:40;;92877:4;92841:40;::::0;:128:::1;;-1:-1:-1::0;92885:17:0::1;::::0;:78:::1;::::0;-1:-1:-1;;;92885:78:0;;-1:-1:-1;;;;;92885:17:0;;::::1;::::0;:31:::1;::::0;:78:::1;::::0;92917:10:::1;::::0;92929:19;;92950:12;;;;92885:78:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:84;;92965:4;92885:84;92841:128;92833:156;;;::::0;-1:-1:-1;;;92833:156:0;;32325:2:1;92833:156:0::1;::::0;::::1;32307:21:1::0;32364:2;32344:18;;;32337:30;-1:-1:-1;;;32383:18:1;;;32376:45;32438:18;;92833:156:0::1;32123:339:1::0;92833:156:0::1;93023:16;:26:::0;::::1;93008:12:::0;-1:-1:-1;;;93023:26:0;;::::1;;;-1:-1:-1::0;93000:51:0::1;;;::::0;::::1;;93089:10;93070:30;::::0;;;:18:::1;:30;::::0;;;;;:35;93062:70:::1;;;::::0;-1:-1:-1;;;93062:70:0;;32669:2:1;93062:70:0::1;::::0;::::1;32651:21:1::0;32708:2;32688:18;;;32681:30;-1:-1:-1;;;32727:18:1;;;32720:52;32789:18;;93062:70:0::1;32467:346:1::0;93062:70:0::1;93164:16;:24:::0;-1:-1:-1;;;;;93164:24:0::1;93151:9;:37;;93143:46;;;::::0;::::1;;93208:16;:33:::0;-1:-1:-1;;;93208:33:0;::::1;;;:39;;93243:4;93208:39;93200:87;;;::::0;-1:-1:-1;;;93200:87:0;;33020:2:1;93200:87:0::1;::::0;::::1;33002:21:1::0;33059:2;33039:18;;;33032:30;33098:34;33078:18;;;33071:62;-1:-1:-1;;;33149:18:1;;;33142:33;33192:19;;93200:87:0::1;32818:399:1::0;93200:87:0::1;93317:10;93298:30;::::0;;;:18:::1;:30;::::0;;;;:35;;93332:1:::1;::::0;93298:30;:35:::1;::::0;93332:1;;93298:35:::1;:::i;:::-;::::0;;;-1:-1:-1;;93379:16:0::1;::::0;;93393:1:::1;93379:16:::0;;;;;::::1;::::0;;;93346:30:::1;::::0;93379:16:::1;::::0;;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;93379:16:0::1;93346:49;;93425:14;93406:13;93420:1;93406:16;;;;;;;;:::i;:::-;;;;;;:33;;;::::0;::::1;93450:28;93461:13;93476:1;93450:10;:28::i;:::-;-1:-1:-1::0;;24677:1:0;25629:7;:22;-1:-1:-1;;;92513:1008:0:o;105808:256::-;8439:6;;-1:-1:-1;;;;;8439:6:0;7320:10;8586:23;8578:68;;;;-1:-1:-1;;;8578:68:0;;;;;;;:::i;:::-;105897:16:::1;:32:::0;::::1;-1:-1:-1::0;;;105897:32:0;;::::1;;:52;;::::0;::::1;;;;105889:105;;;;-1:-1:-1::0;;;105889:105:0::1;;;;;;;:::i;:::-;106005:16;:51:::0;;;::::1;;-1:-1:-1::0;;;106005:51:0::1;-1:-1:-1::0;;;;106005:51:0;;::::1;::::0;;;::::1;::::0;;105808:256::o;27829:387::-;28152:20;28200:8;;;27829:387::o;70331:196::-;70446:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;70446:29:0;-1:-1:-1;;;;;70446:29:0;;;;;;;;;70491:28;;70446:24;;70491:28;;;;;;;70331:196;;;:::o;79093:131::-;79149:11;;:::i;:::-;79191:24;;;;:19;:24;;;;;;79179:37;;:11;:37::i;107771:721::-;107827:13;108046:10;108042:53;;-1:-1:-1;;108073:10:0;;;;;;;;;;;;-1:-1:-1;;;108073:10:0;;;;;107771:721::o;108042:53::-;108120:5;108105:12;108161:78;108168:9;;108161:78;;108194:8;;;;:::i;:::-;;-1:-1:-1;108217:10:0;;-1:-1:-1;108225:2:0;108217:10;;:::i;:::-;;;108161:78;;;108249:19;108281:6;108271:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;108271:17:0;;108249:39;;108299:154;108306:10;;108299:154;;108333:11;108343:1;108333:11;;:::i;:::-;;-1:-1:-1;108402:10:0;108410:2;108402:5;:10;:::i;:::-;108389:24;;:2;:24;:::i;:::-;108376:39;;108359:6;108366;108359:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;108359:56:0;;;;;;;;-1:-1:-1;108430:11:0;108439:2;108430:11;;:::i;:::-;;;108299:154;;;108477:6;107771:721;-1:-1:-1;;;;107771:721:0:o;68211:2002::-;68326:35;68364:20;68376:7;68364:11;:20::i;:::-;68439:18;;68326:58;;-1:-1:-1;68397:22:0;;-1:-1:-1;;;;;68423:34:0;7320:10;-1:-1:-1;;;;;68423:34:0;;:87;;;-1:-1:-1;7320:10:0;68474:20;68486:7;68474:11;:20::i;:::-;-1:-1:-1;;;;;68474:36:0;;68423:87;:154;;;-1:-1:-1;68544:18:0;;68527:50;;7320:10;64089:164;:::i;68527:50::-;68397:181;;68599:17;68591:80;;;;-1:-1:-1;;;68591:80:0;;33671:2:1;68591:80:0;;;33653:21:1;33710:2;33690:18;;;33683:30;33749:34;33729:18;;;33722:62;-1:-1:-1;;;33800:18:1;;;33793:48;33858:19;;68591:80:0;33469:414:1;68591:80:0;68714:4;-1:-1:-1;;;;;68692:26:0;:13;:18;;;-1:-1:-1;;;;;68692:26:0;;68684:77;;;;-1:-1:-1;;;68684:77:0;;34090:2:1;68684:77:0;;;34072:21:1;34129:2;34109:18;;;34102:30;34168:34;34148:18;;;34141:62;-1:-1:-1;;;34219:18:1;;;34212:36;34265:19;;68684:77:0;33888:402:1;68684:77:0;-1:-1:-1;;;;;68780:16:0;;68772:66;;;;-1:-1:-1;;;68772:66:0;;34497:2:1;68772:66:0;;;34479:21:1;34536:2;34516:18;;;34509:30;34575:34;34555:18;;;34548:62;-1:-1:-1;;;34626:18:1;;;34619:35;34671:19;;68772:66:0;34295:401:1;68772:66:0;68959:49;68976:1;68980:7;68989:13;:18;;;68959:8;:49::i;:::-;-1:-1:-1;;;;;69304:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;;;;;69304:31:0;;;-1:-1:-1;;;;;69304:31:0;;;-1:-1:-1;;69304:31:0;;;;;;;69350:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;69350:29:0;;;;;;;;;;;;;69396:20;;;:11;:20;;;;;;:30;;-1:-1:-1;;;;;;69441:61:0;;;;-1:-1:-1;;;69486:15:0;69441:61;;;;;;69776:11;;;69806:24;;;;;:29;69776:11;;69806:29;69802:295;;69874:20;69882:11;65468:4;65502:12;-1:-1:-1;65492:22:0;65411:111;69874:20;69870:212;;;69951:18;;;69919:24;;;:11;:24;;;;;;;;:50;;70034:28;;;;69992:70;;-1:-1:-1;;;69992:70:0;-1:-1:-1;;;;;;69992:70:0;;;-1:-1:-1;;;;;69919:50:0;;;69992:70;;;;;;;69870:212;69279:829;70144:7;70140:2;-1:-1:-1;;;;;70125:27:0;70134:4;-1:-1:-1;;;;;70125:27:0;;;;;;;;;;;70163:42;68315:1898;;68211:2002;;;:::o;84990:1638::-;85075:17;;:::i;:::-;85105:42;;:::i;:::-;85160:16;85216;85273:13;85311:8;85302:6;:17;85299:843;;;85363:2;85352:13;;85566:2;85555:13;;85299:843;;;85607:9;85598:6;:18;85595:547;;;85660:1;85649:12;;85687:1;85676:12;;85595:547;;;85727:9;85718:6;:18;85715:427;;;85781:1;85770:12;;85808:1;85797:12;;85715:427;;;85848:9;85839:6;:18;85836:306;;;85902:1;85891:12;;85929:1;85918:12;;85836:306;;;85969:9;85960:6;:18;85957:185;;;86023:1;86012:12;;86050:1;86039:12;;85957:185;86256:8;86242:249;86271:8;86266:1;:13;86242:249;;86331:1;86303:24;86328:1;86303:27;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:29;;;86300:180;;;86382:24;86407:1;86382:27;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;86352:24;86377:1;86352:27;;;;;;;:::i;:::-;:57;;;;:27;;;;;;:57;86437:24;86462:1;86437:27;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;86428:36;;;;;;;:::i;:::-;;;86300:180;86281:3;;;;:::i;:::-;;;;86242:249;;;;86519:1;86511:5;:9;86503:73;;;;-1:-1:-1;;;86503:73:0;;34903:2:1;86503:73:0;;;34885:21:1;34942:2;34922:18;;;34915:30;34981:34;34961:18;;;34954:62;-1:-1:-1;;;35032:18:1;;;35025:49;35091:19;;86503:73:0;34701:415:1;86503:73:0;-1:-1:-1;86596:24:0;;84990:1638;-1:-1:-1;;;;84990:1638:0:o;61092:537::-;-1:-1:-1;;;;;;;;;;;;;;;;;61195:16:0;61203:7;65468:4;65502:12;-1:-1:-1;65492:22:0;65411:111;61195:16;61187:71;;;;-1:-1:-1;;;61187:71:0;;35323:2:1;61187:71:0;;;35305:21:1;35362:2;35342:18;;;35335:30;35401:34;35381:18;;;35374:62;-1:-1:-1;;;35452:18:1;;;35445:40;35502:19;;61187:71:0;35121:406:1;61187:71:0;61316:7;61296:245;61363:31;61397:17;;;:11;:17;;;;;;;;;61363:51;;;;;;;;;-1:-1:-1;;;;;61363:51:0;;;;;-1:-1:-1;;;61363:51:0;;;;;;;;;;;;61437:28;61433:93;;61497:9;61092:537;-1:-1:-1;;;61092:537:0:o;61433:93::-;-1:-1:-1;;;61336:6:0;61296:245;;9466:173;9541:6;;;-1:-1:-1;;;;;9558:17:0;;;-1:-1:-1;;;;;;9558:17:0;;;;;;;9591:40;;9541:6;;;9558:17;9541:6;;9591:40;;9522:16;;9591:40;9511:128;9466:173;:::o;87965:1756::-;88065:7;88084:19;;:::i;:::-;88116:33;;:::i;:::-;88283:55;;;88300:15;88283:55;;;;36133:19:1;;;;88317:10:0;36190:2:1;36186:15;-1:-1:-1;;36182:53:1;36168:12;;;36161:75;36252:12;;;;36245:28;;;88283:55:0;;;;;;;;;;36289:12:1;;;;88283:55:0;;;88272:68;;;;;-1:-1:-1;;;88352:427:0;88374:1;88371;:4;88352:427;;;88444:4;88417:23;88432:4;88431:8;;88417:10;:23;:::i;:::-;88416:32;;;;:::i;:::-;88396:52;-1:-1:-1;88471:1:0;;-1:-1:-1;88503:2:0;88487:281;88598:11;88610:1;88598:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;88589:23;;;;;;;:::i;:::-;;;88654:5;88634:17;:25;88631:122;;;88704:1;88683:15;88699:1;88683:18;;;;;;;:::i;:::-;;;;:22;88728:5;;88631:122;88512:3;;;;:::i;:::-;;;;88487:281;;;-1:-1:-1;88377:3:0;;;;:::i;:::-;;;;88352:427;;;-1:-1:-1;88791:40:0;;;88860:18;;;88842:15;;;:36;;;;88916:18;;;88889:24;;;;:45;;;;88964:18;;;88945:16;;;;:37;;;;89011:18;;;88993:15;;;;:36;;;;89059:18;;;89040:16;;;;:37;;;;89105:18;;;89088:14;;;:35;;;89497:8;;89432:11;;:27;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;89400:11;89412:7;:16;;;89400:29;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;89369:11;89381:7;:15;;;89369:28;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;89322:11;89334:7;:16;;;89322:29;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;89282:11;89294:7;:24;;;89282:37;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;89251:11;89263:7;:15;;;89251:28;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:68;;;;:::i;:::-;:100;;;;:::i;:::-;:146;;;;:::i;:::-;:178;;;;:::i;:::-;:208;;;;:::i;:::-;89235:226;;89242:219;;89235:4;:226;:::i;:::-;89234:238;;89466:5;89234:238;:::i;:::-;89181:22;;89169:11;;:35;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;89161:44;;89155:3;:50;;;;:::i;:::-;89154:63;;89211:5;89154:63;:::i;:::-;:318;;;;:::i;:::-;:339;;89489:4;89154:339;:::i;:::-;:352;;;;:::i;:::-;89136:14;;;:370;;;89560:22;;89584:15;;;;89601:24;;;;89627:16;;;;89645:15;;;;89662:16;;;;89680:14;;;;89551:160;;:8;:160::i;:::-;89519:29;;;;:19;:29;;;;;;:192;;;;-1:-1:-1;87965:1756:0;;;-1:-1:-1;;;;;87965:1756:0:o;10955:148::-;11050:5;11032:14;;:23;;11024:32;;;;;;11067:14;:28;10955:148::o;78096:748::-;78297:7;;78360:15;78386:10;78395:1;78297:7;78386:10;:::i;:::-;;-1:-1:-1;78416:17:0;;;78409:24;78444:10;78453:1;78386:10;78444;:::i;:::-;;-1:-1:-1;78474:26:0;;;78467:33;78511:10;78520:1;78444:10;78511;:::i;:::-;;-1:-1:-1;78541:18:0;;;78534:25;78570:10;78579:1;78511:10;78570;:::i;:::-;;-1:-1:-1;78600:17:0;;;78593:24;78628:10;78637:1;78570:10;78628;:::i;:::-;;-1:-1:-1;78658:18:0;;;78651:25;78687:10;78696:1;78628:10;78687;:::i;:::-;;-1:-1:-1;78717:16:0;;;78710:23;78744:10;78753:1;78687:10;78744;:::i;:::-;;-1:-1:-1;78774:16:0;;;78767:23;78801:12;78810:3;78744:10;78801:12;:::i;:::-;-1:-1:-1;78833:3:0;78096:748;-1:-1:-1;;;;;;;;;;78096:748:0:o;71092:804::-;71247:4;-1:-1:-1;;;;;71268:13:0;;28152:20;28200:8;71264:625;;71304:72;;-1:-1:-1;;;71304:72:0;;-1:-1:-1;;;;;71304:36:0;;;;;:72;;7320:10;;71355:4;;71361:7;;71370:5;;71304:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;71304:72:0;;;;;;;;-1:-1:-1;;71304:72:0;;;;;;;;;;;;:::i;:::-;;;71300:534;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;71550:13:0;;71546:273;;71593:61;;-1:-1:-1;;;71593:61:0;;;;;;;:::i;71546:273::-;71769:6;71763:13;71754:6;71750:2;71746:15;71739:38;71300:534;-1:-1:-1;;;;;;71427:55:0;-1:-1:-1;;;71427:55:0;;-1:-1:-1;71420:62:0;;71264:625;-1:-1:-1;71873:4:0;71092:804;;;;;;:::o;95142:900::-;95268:13;95294:17;95385:15;95394:5;95385:8;:15::i;:::-;95477:24;95492:8;:5;95498:2;95492:8;:::i;:::-;95486:14;;:3;:14;:::i;95477:24::-;95547;95562:8;:5;95568:2;95562:8;:::i;95547:24::-;95616:19;95625:9;95616:8;:19::i;:::-;95677:20;95686:10;95677:8;:20::i;:::-;95321:435;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;95294:463;;95798:3;95886:15;95895:5;95886:8;:15::i;:::-;95937:4;95781:231;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;95781:231:0;;;;;;;95142:900;-1:-1:-1;;;;;;95142:900:0:o;101224:462::-;101345:52;;;;;;;;;;;;;;;;;101438:31;;;;;;;;;;-1:-1:-1;;;101438:31:0;;;;101498:29;;101289:13;;-1:-1:-1;;101438:31:0;;101498:29;;101438:31;;101523:3;;101498:29;;:::i;:::-;;;;;;;;;;;;;101484:44;;;;101224:462;;;:::o;101855:2273::-;101975:29;;;;:19;:29;;;;;;101944:13;;101972:130;;102057:7;102040:49;;;;;;;;:::i;:::-;;;;;;;;;;;;;102026:64;;;;101972:130;102114:19;102136:20;102147:8;102136:10;:20::i;:::-;102114:42;;102167:22;102424:7;102439:32;102448:7;:22;;;102439:8;:32::i;:::-;102532:8;102714:15;102730:7;:22;;;102714:39;;;;;;;:::i;:::-;;102199:574;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;102167:607;;102822:8;102900;102909:7;:15;;;102900:25;;;;;;;:::i;:::-;;103082:38;103091:7;:24;;;103118:1;103091:28;;;;:::i;103082:38::-;102805:335;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;102787:354;;103189:8;103327:30;103336:7;:16;;;103355:1;103336:20;;;;:::i;103327:30::-;103436:8;103445:7;:15;;;103436:25;;;;;;;:::i;:::-;;103172:309;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;103154:328;;103532:8;103611:9;103621:7;:16;;;103611:27;;;;;;;:::i;:::-;;103716:7;103724;:14;;;103716:23;;;;;;;:::i;:::-;;103845:24;103854:7;:14;;;103845:8;:24::i;:::-;103515:373;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;103497:392;;103937:8;103920:90;;;;;;;;:::i;:::-;;;;;;;;;;;;;103902:109;;104088:30;104108:8;104088:13;:30::i;:::-;104038:81;;;;;;;;:::i;:::-;;;;;;;;;;;;;104024:96;;;;101855:2273;;;;:::o;91010:1252::-;91110:27;;91148:116;91170:14;:21;91166:1;:25;91148:116;;;91235:14;91250:1;91235:17;;;;;;;;:::i;:::-;;;;;;;91212:40;;;;;:::i;:::-;;-1:-1:-1;91193:3:0;;;;:::i;:::-;;;;91148:116;;;;91301:1;91279:19;:23;:48;;;;-1:-1:-1;8439:6:0;;-1:-1:-1;;;;;8439:6:0;91306:10;:21;;91279:48;91276:295;;;91351:10;;:32;;-1:-1:-1;;;91351:32:0;;91372:10;91351:32;;;2084:51:1;91387:19:0;;-1:-1:-1;;;;;91351:10:0;;:20;;2057:18:1;;91351:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:55;;91343:93;;;;-1:-1:-1;;;91343:93:0;;50633:2:1;91343:93:0;;;50615:21:1;50672:2;50652:18;;;50645:30;50711:27;50691:18;;;50684:55;50756:18;;91343:93:0;50431:349:1;91343:93:0;91459:10;;:71;;-1:-1:-1;;;91459:71:0;;91483:10;91459:71;;;51025:34:1;91503:4:0;51075:18:1;;;51068:43;51127:18;;;51120:34;;;-1:-1:-1;;;;;91459:10:0;;;;:23;;50960:18:1;;91459:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;91451:108;;;;-1:-1:-1;;;91451:108:0;;51367:2:1;91451:108:0;;;51349:21:1;51406:2;51386:18;;;51379:30;51445:26;51425:18;;;51418:54;51489:18;;91451:108:0;51165:348:1;91451:108:0;91583:39;;:::i;:::-;91633:25;;91671:533;91689:17;91687:1;:19;91671:533;;;91729:4;91726:240;;91777:57;91816:14;91831:1;91816:17;;;;;;;;:::i;:::-;;;;;;;91777:38;:57::i;:::-;91753:81;;91726:240;;;91932:1;91888:21;91910:17;91888:40;;;;;;;:::i;:::-;;;;:45;;;;;;;:::i;:::-;;;;;-1:-1:-1;91726:240:0;92000:48;92023:21;92046:1;92000:22;:48::i;:::-;91980:68;;92063:66;92093:17;92127:1;92112:12;;:16;;;;:::i;:::-;92063:29;:66::i;:::-;;92191:1;92144:24;92169:17;92144:43;;;;;;;:::i;:::-;;;;;;;;;;;;:48;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;91707:3;;;;;:::i;:::-;;;;91671:533;;;;92214:40;92224:10;92236:17;92214:9;:40::i;79374:684::-;79435:11;;:::i;:::-;-1:-1:-1;79950:100:0;;;;;;;;79484:23;;;;79950:100;;79562:1;79551:12;;;79537:28;;79748:2;79950:100;;;;;;;79629:2;79618:13;;;79604:29;;79950:100;;;;;;;79689:2;79678:13;;;79664:29;;79950:100;;;;79737:13;;;;79723:29;;79950:100;;;;79808:2;79797:13;;;79783:29;;79950:100;;;;79866:2;79855:13;;;79841:29;;;79950:100;;;;79926:2;79915:13;;;;-1:-1:-1;;;;;79899:31:0;79950:100;;;;;79374:684::o;2535:1912::-;2593:13;2623:4;:11;2638:1;2623:16;2619:31;;;-1:-1:-1;;2641:9:0;;;;;;;;;-1:-1:-1;2641:9:0;;;2535:1912::o;2619:31::-;2702:19;2724:12;;;;;;;;;;;;;;;;;2702:34;;2788:18;2834:1;2815:4;:11;2829:1;2815:15;;;;:::i;:::-;2814:21;;;;:::i;:::-;2809:27;;:1;:27;:::i;:::-;2788:48;-1:-1:-1;2919:20:0;2953:15;2788:48;2966:2;2953:15;:::i;:::-;2942:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2942:27:0;;2919:50;;3066:10;3058:6;3051:26;3161:1;3154:5;3150:13;3220:4;3271;3265:11;3256:7;3252:25;3367:2;3359:6;3355:15;3440:754;3459:6;3450:7;3447:19;3440:754;;;3559:1;3550:7;3546:15;3535:26;;3598:7;3592:14;3724:4;3716:5;3712:2;3708:14;3704:25;3694:8;3690:40;3684:47;3673:9;3665:67;3778:1;3767:9;3763:17;3750:30;;3857:4;3849:5;3845:2;3841:14;3837:25;3827:8;3823:40;3817:47;3806:9;3798:67;3911:1;3900:9;3896:17;3883:30;;3990:4;3982:5;3979:1;3974:14;3970:25;3960:8;3956:40;3950:47;3939:9;3931:67;4044:1;4033:9;4029:17;4016:30;;4123:4;4115:5;4103:25;4093:8;4089:40;4083:47;4072:9;4064:67;-1:-1:-1;4177:1:0;4162:17;3440:754;;;4267:1;4260:4;4254:11;4250:19;4288:1;4283:54;;;;4356:1;4351:52;;;;4243:160;;4283:54;-1:-1:-1;;;;;4299:17:0;;4292:43;4283:54;;4351:52;-1:-1:-1;;;;;4367:17:0;;4360:41;4243:160;-1:-1:-1;4433:6:0;;2535:1912;-1:-1:-1;;;;;;;;2535:1912:0:o;87007:777::-;87112:7;;;;87191:102;87211:22;87207:1;:26;87191:102;;;87263:15;87279:1;87263:18;;;;;;;:::i;:::-;;;;;87254:27;;;;;;:::i;:::-;;-1:-1:-1;87235:3:0;;;;:::i;:::-;;;;87191:102;;;-1:-1:-1;87311:8:0;87303:39;;;;-1:-1:-1;;;87303:39:0;;51942:2:1;87303:39:0;;;51924:21:1;51981:2;51961:18;;;51954:30;-1:-1:-1;;;52000:18:1;;;51993:48;52058:18;;87303:39:0;51740:342:1;87303:39:0;87355:23;87399:16;87417:15;87434:10;87446:12;;87460:15;87476:1;87460:18;;;;;;;:::i;:::-;;;;;87480:22;87504:6;87382:129;;;;;;;;;;;;;52382:19:1;;;52426:2;52417:12;;52410:28;;;;52476:2;52472:15;;;;-1:-1:-1;;52468:53:1;52463:2;52454:12;;52447:75;52547:2;52538:12;;52531:28;;;;52616:3;52594:16;-1:-1:-1;;;;;;52590:38:1;52584:3;52575:13;;52568:61;52654:3;52645:13;;52638:29;52692:3;52683:13;;52676:29;52730:3;52721:13;;52087:653;87382:129:0;;;;;;;;;;;;;87355:157;;87523:18;87577:5;87562:10;87552:21;;;;;;87544:30;;:38;;;;:::i;:::-;87523:59;;87599:9;87595:182;87614:22;87611:1;:25;87595:182;;;87667:15;87683:1;87667:18;;;;;;;:::i;:::-;;;;;87657:28;;;;;;:::i;:::-;;;87716:6;87703:10;:19;87700:66;;;87749:1;-1:-1:-1;87742:8:0;;-1:-1:-1;;;;87742:8:0;87700:66;87638:3;;;;:::i;:::-;;;;87595:182;;;;87121:663;;;;87007:777;;;;:::o;65530:104::-;65599:27;65609:2;65613:8;65599:27;;;;;;;;;;;;66120:32;66126:2;66130:8;66140:5;66147:4;66558:20;66581:12;-1:-1:-1;;;;;66612:16:0;;66604:62;;;;-1:-1:-1;;;66604:62:0;;52947:2:1;66604:62:0;;;52929:21:1;52986:2;52966:18;;;52959:30;53025:34;53005:18;;;52998:62;-1:-1:-1;;;53076:18:1;;;53069:31;53117:19;;66604:62:0;52745:397:1;66604:62:0;66685:13;66677:66;;;;-1:-1:-1;;;66677:66:0;;53349:2:1;66677:66:0;;;53331:21:1;53388:2;53368:18;;;53361:30;53427:34;53407:18;;;53400:62;-1:-1:-1;;;53478:18:1;;;53471:38;53526:19;;66677:66:0;53147:404:1;66677:66:0;-1:-1:-1;;;;;67095:16:0;;;;;;:12;:16;;;;;;;;:45;;-1:-1:-1;;;;;;;;;67095:45:0;;-1:-1:-1;;;;;67095:45:0;;;;;;;;;;67155:50;;;;;;;;;;;;;;67222:25;;;:11;:25;;;;;:35;;-1:-1:-1;;;;;;67272:66:0;;;;-1:-1:-1;;;67322:15:0;67272:66;;;;;;;67222:25;;67407:415;67427:8;67423:1;:12;67407:415;;;67466:38;;67491:12;;-1:-1:-1;;;;;67466:38:0;;;67483:1;;67466:38;;67483:1;;67466:38;67527:4;67523:249;;;67590:59;67621:1;67625:2;67629:12;67643:5;67590:22;:59::i;:::-;67556:196;;;;-1:-1:-1;;;67556:196:0;;;;;;;:::i;:::-;67792:14;;;;;67437:3;67407:415;;;-1:-1:-1;67838:12:0;:27;67889:60;64801:355;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;:::-;384:5;150:245;-1:-1:-1;;;150:245:1:o;592:131::-;-1:-1:-1;;;;;667:31:1;;657:42;;647:70;;713:1;710;703:12;728:247;787:6;840:2;828:9;819:7;815:23;811:32;808:52;;;856:1;853;846:12;808:52;895:9;882:23;914:31;939:5;914:31;:::i;980:258::-;1052:1;1062:113;1076:6;1073:1;1070:13;1062:113;;;1152:11;;;1146:18;1133:11;;;1126:39;1098:2;1091:10;1062:113;;;1193:6;1190:1;1187:13;1184:48;;;-1:-1:-1;;1228:1:1;1210:16;;1203:27;980:258::o;1243:269::-;1296:3;1334:5;1328:12;1361:6;1356:3;1349:19;1377:63;1433:6;1426:4;1421:3;1417:14;1410:4;1403:5;1399:16;1377:63;:::i;:::-;1494:2;1473:15;-1:-1:-1;;1469:29:1;1460:39;;;;1501:4;1456:50;;1243:269;-1:-1:-1;;1243:269:1:o;1517:231::-;1666:2;1655:9;1648:21;1629:4;1686:56;1738:2;1727:9;1723:18;1715:6;1686:56;:::i;1753:180::-;1812:6;1865:2;1853:9;1844:7;1840:23;1836:32;1833:52;;;1881:1;1878;1871:12;1833:52;-1:-1:-1;1904:23:1;;1753:180;-1:-1:-1;1753:180:1:o;2146:315::-;2214:6;2222;2275:2;2263:9;2254:7;2250:23;2246:32;2243:52;;;2291:1;2288;2281:12;2243:52;2330:9;2317:23;2349:31;2374:5;2349:31;:::i;:::-;2399:5;2451:2;2436:18;;;;2423:32;;-1:-1:-1;;;2146:315:1:o;2648:456::-;2725:6;2733;2741;2794:2;2782:9;2773:7;2769:23;2765:32;2762:52;;;2810:1;2807;2800:12;2762:52;2849:9;2836:23;2868:31;2893:5;2868:31;:::i;:::-;2918:5;-1:-1:-1;2975:2:1;2960:18;;2947:32;2988:33;2947:32;2988:33;:::i;:::-;2648:456;;3040:7;;-1:-1:-1;;;3094:2:1;3079:18;;;;3066:32;;2648:456::o;3109:118::-;3195:5;3188:13;3181:21;3174:5;3171:32;3161:60;;3217:1;3214;3207:12;3232:241;3288:6;3341:2;3329:9;3320:7;3316:23;3312:32;3309:52;;;3357:1;3354;3347:12;3309:52;3396:9;3383:23;3415:28;3437:5;3415:28;:::i;3738:248::-;3806:6;3814;3867:2;3855:9;3846:7;3842:23;3838:32;3835:52;;;3883:1;3880;3873:12;3835:52;-1:-1:-1;;3906:23:1;;;3976:2;3961:18;;;3948:32;;-1:-1:-1;3738:248:1:o;4270:814::-;4432:4;4461:2;4501;4490:9;4486:18;4531:2;4520:9;4513:21;4554:6;4589;4583:13;4620:6;4612;4605:22;4658:2;4647:9;4643:18;4636:25;;4720:2;4710:6;4707:1;4703:14;4692:9;4688:30;4684:39;4670:53;;4758:2;4750:6;4746:15;4779:1;4789:266;4803:6;4800:1;4797:13;4789:266;;;4896:2;4892:7;4880:9;4872:6;4868:22;4864:36;4859:3;4852:49;4924:51;4968:6;4959;4953:13;4924:51;:::i;:::-;4914:61;-1:-1:-1;5033:12:1;;;;4998:15;;;;4825:1;4818:9;4789:266;;;-1:-1:-1;5072:6:1;;4270:814;-1:-1:-1;;;;;;;4270:814:1:o;5089:127::-;5150:10;5145:3;5141:20;5138:1;5131:31;5181:4;5178:1;5171:15;5205:4;5202:1;5195:15;5221:632;5286:5;5316:18;5357:2;5349:6;5346:14;5343:40;;;5363:18;;:::i;:::-;5438:2;5432:9;5406:2;5492:15;;-1:-1:-1;;5488:24:1;;;5514:2;5484:33;5480:42;5468:55;;;5538:18;;;5558:22;;;5535:46;5532:72;;;5584:18;;:::i;:::-;5624:10;5620:2;5613:22;5653:6;5644:15;;5683:6;5675;5668:22;5723:3;5714:6;5709:3;5705:16;5702:25;5699:45;;;5740:1;5737;5730:12;5699:45;5790:6;5785:3;5778:4;5770:6;5766:17;5753:44;5845:1;5838:4;5829:6;5821;5817:19;5813:30;5806:41;;;;5221:632;;;;;:::o;5858:451::-;5927:6;5980:2;5968:9;5959:7;5955:23;5951:32;5948:52;;;5996:1;5993;5986:12;5948:52;6036:9;6023:23;6069:18;6061:6;6058:30;6055:50;;;6101:1;6098;6091:12;6055:50;6124:22;;6177:4;6169:13;;6165:27;-1:-1:-1;6155:55:1;;6206:1;6203;6196:12;6155:55;6229:74;6295:7;6290:2;6277:16;6272:2;6268;6264:11;6229:74;:::i;6314:382::-;6379:6;6387;6440:2;6428:9;6419:7;6415:23;6411:32;6408:52;;;6456:1;6453;6446:12;6408:52;6495:9;6482:23;6514:31;6539:5;6514:31;:::i;:::-;6564:5;-1:-1:-1;6621:2:1;6606:18;;6593:32;6634:30;6593:32;6634:30;:::i;:::-;6683:7;6673:17;;;6314:382;;;;;:::o;6701:795::-;6796:6;6804;6812;6820;6873:3;6861:9;6852:7;6848:23;6844:33;6841:53;;;6890:1;6887;6880:12;6841:53;6929:9;6916:23;6948:31;6973:5;6948:31;:::i;:::-;6998:5;-1:-1:-1;7055:2:1;7040:18;;7027:32;7068:33;7027:32;7068:33;:::i;:::-;7120:7;-1:-1:-1;7174:2:1;7159:18;;7146:32;;-1:-1:-1;7229:2:1;7214:18;;7201:32;7256:18;7245:30;;7242:50;;;7288:1;7285;7278:12;7242:50;7311:22;;7364:4;7356:13;;7352:27;-1:-1:-1;7342:55:1;;7393:1;7390;7383:12;7342:55;7416:74;7482:7;7477:2;7464:16;7459:2;7455;7451:11;7416:74;:::i;:::-;7406:84;;;6701:795;;;;;;;:::o;8036:388::-;8104:6;8112;8165:2;8153:9;8144:7;8140:23;8136:32;8133:52;;;8181:1;8178;8171:12;8133:52;8220:9;8207:23;8239:31;8264:5;8239:31;:::i;:::-;8289:5;-1:-1:-1;8346:2:1;8331:18;;8318:32;8359:33;8318:32;8359:33;:::i;8429:508::-;8609:3;8594:19;;8598:9;8690:6;8567:4;8724:207;8738:4;8735:1;8732:11;8724:207;;;8801:13;;8816:6;8797:26;8785:39;;8847:4;8871:12;;;;8906:15;;;;8758:1;8751:9;8724:207;;;8728:3;;;8429:508;;;;:::o;8942:751::-;9046:6;9054;9062;9070;9123:2;9111:9;9102:7;9098:23;9094:32;9091:52;;;9139:1;9136;9129:12;9091:52;9175:9;9162:23;9152:33;;9236:2;9225:9;9221:18;9208:32;9259:18;9300:2;9292:6;9289:14;9286:34;;;9316:1;9313;9306:12;9286:34;9354:6;9343:9;9339:22;9329:32;;9399:7;9392:4;9388:2;9384:13;9380:27;9370:55;;9421:1;9418;9411:12;9370:55;9461:2;9448:16;9487:2;9479:6;9476:14;9473:34;;;9503:1;9500;9493:12;9473:34;9556:7;9551:2;9541:6;9538:1;9534:14;9530:2;9526:23;9522:32;9519:45;9516:65;;;9577:1;9574;9567:12;9516:65;8942:751;;9608:2;9600:11;;;;;-1:-1:-1;9630:6:1;;9683:2;9668:18;9655:32;;-1:-1:-1;8942:751:1;-1:-1:-1;;;8942:751:1:o;9698:356::-;9900:2;9882:21;;;9919:18;;;9912:30;9978:34;9973:2;9958:18;;9951:62;10045:2;10030:18;;9698:356::o;10059:380::-;10138:1;10134:12;;;;10181;;;10202:61;;10256:4;10248:6;10244:17;10234:27;;10202:61;10309:2;10301:6;10298:14;10278:18;10275:38;10272:161;;;10355:10;10350:3;10346:20;10343:1;10336:31;10390:4;10387:1;10380:15;10418:4;10415:1;10408:15;10272:161;;10059:380;;;:::o;11687:127::-;11748:10;11743:3;11739:20;11736:1;11729:31;11779:4;11776:1;11769:15;11803:4;11800:1;11793:15;11819:127;11880:10;11875:3;11871:20;11868:1;11861:31;11911:4;11908:1;11901:15;11935:4;11932:1;11925:15;11951:128;11991:3;12022:1;12018:6;12015:1;12012:13;12009:39;;;12028:18;;:::i;:::-;-1:-1:-1;12064:9:1;;11951:128::o;12084:404::-;12286:2;12268:21;;;12325:2;12305:18;;;12298:30;12364:34;12359:2;12344:18;;12337:62;-1:-1:-1;;;12430:2:1;12415:18;;12408:38;12478:3;12463:19;;12084:404::o;12493:355::-;12695:2;12677:21;;;12734:2;12714:18;;;12707:30;12773:33;12768:2;12753:18;;12746:61;12839:2;12824:18;;12493:355::o;13905:168::-;13945:7;14011:1;14007;14003:6;13999:14;13996:1;13993:21;13988:1;13981:9;13974:17;13970:45;13967:71;;;14018:18;;:::i;:::-;-1:-1:-1;14058:9:1;;13905:168::o;14078:127::-;14139:10;14134:3;14130:20;14127:1;14120:31;14170:4;14167:1;14160:15;14194:4;14191:1;14184:15;14210:120;14250:1;14276;14266:35;;14281:18;;:::i;:::-;-1:-1:-1;14315:9:1;;14210:120::o;15153:185::-;15195:3;15233:5;15227:12;15248:52;15293:6;15288:3;15281:4;15274:5;15270:16;15248:52;:::i;:::-;15316:16;;;;;15153:185;-1:-1:-1;;15153:185:1:o;15343:421::-;-1:-1:-1;;;15600:3:1;15593:19;15575:3;15641:6;15635:13;15657:61;15711:6;15707:1;15702:3;15698:11;15691:4;15683:6;15679:17;15657:61;:::i;:::-;15738:16;;;;15756:1;15734:24;;15343:421;-1:-1:-1;;15343:421:1:o;15769:135::-;15808:3;-1:-1:-1;;15829:17:1;;15826:43;;;15849:18;;:::i;:::-;-1:-1:-1;15896:1:1;15885:13;;15769:135::o;15909:184::-;15979:6;16032:2;16020:9;16011:7;16007:23;16003:32;16000:52;;;16048:1;16045;16038:12;16000:52;-1:-1:-1;16071:16:1;;15909:184;-1:-1:-1;15909:184:1:o;16098:245::-;16165:6;16218:2;16206:9;16197:7;16193:23;16189:32;16186:52;;;16234:1;16231;16224:12;16186:52;16266:9;16260:16;16285:28;16307:5;16285:28;:::i;18300:415::-;18502:2;18484:21;;;18541:2;18521:18;;;18514:30;18580:34;18575:2;18560:18;;18553:62;-1:-1:-1;;;18646:2:1;18631:18;;18624:49;18705:3;18690:19;;18300:415::o;19136:1564::-;-1:-1:-1;;;20100:3:1;20093:26;20149:34;20144:2;20139:3;20135:12;20128:56;20214:32;20209:2;20204:3;20200:12;20193:54;-1:-1:-1;;;20272:2:1;20267:3;20263:12;20256:31;20317:34;20312:2;20307:3;20303:12;20296:56;-1:-1:-1;;;20377:3:1;20372;20368:13;20361:40;-1:-1:-1;;;20426:3:1;20421;20417:13;20410:34;20075:3;20473:6;20467:13;20489:61;20543:6;20537:3;20532;20528:13;20523:2;20515:6;20511:15;20489:61;:::i;:::-;-1:-1:-1;;;20609:3:1;20569:16;;;;20601:12;;;20594:27;-1:-1:-1;;;;20645:3:1;20637:12;;20630:36;20690:3;20682:12;;19136:1564;-1:-1:-1;19136:1564:1:o;20839:1459::-;21422:3;21460:6;21454:13;21476:53;21522:6;21517:3;21510:4;21502:6;21498:17;21476:53;:::i;:::-;21560:6;21555:3;21551:16;21538:29;;21586:34;21643:2;21636:5;21629:17;21680:34;21673:4;21666:5;21662:16;21655:60;21747:34;21742:2;21735:5;21731:14;21724:58;-1:-1:-1;;;21809:2:1;21802:5;21798:14;21791:29;21852:2;21847;21840:5;21836:14;21829:26;21888:34;21882:3;21875:5;21871:15;21864:59;21956:34;21950:3;21943:5;21939:15;21932:59;-1:-1:-1;;;22018:3:1;22011:5;22007:15;22000:45;22078:2;22072:3;22065:5;22061:15;22054:27;;22114:34;22108:3;22101:5;22097:15;22090:59;-1:-1:-1;;;22176:3:1;22169:5;22165:15;22158:45;22219:73;22249:42;22286:3;22279:5;22275:15;22267:6;22249:42;:::i;:::-;-1:-1:-1;;;20770:30:1;;20825:2;20816:12;;20705:129;22219:73;22212:80;20839:1459;-1:-1:-1;;;;;20839:1459:1:o;22303:441::-;-1:-1:-1;;;22560:3:1;22553:37;22535:3;22619:6;22613:13;22635:62;22690:6;22685:2;22680:3;22676:12;22669:4;22661:6;22657:17;22635:62;:::i;:::-;22717:16;;;;22735:2;22713:25;;22303:441;-1:-1:-1;;22303:441:1:o;22875:973::-;22960:12;;22925:3;;23015:1;23035:18;;;;23088;;;;23115:61;;23169:4;23161:6;23157:17;23147:27;;23115:61;23195:2;23243;23235:6;23232:14;23212:18;23209:38;23206:161;;;23289:10;23284:3;23280:20;23277:1;23270:31;23324:4;23321:1;23314:15;23352:4;23349:1;23342:15;23206:161;23383:18;23410:104;;;;23528:1;23523:319;;;;23376:466;;23410:104;-1:-1:-1;;23443:24:1;;23431:37;;23488:16;;;;-1:-1:-1;23410:104:1;;23523:319;22822:1;22815:14;;;22859:4;22846:18;;23617:1;23631:165;23645:6;23642:1;23639:13;23631:165;;;23723:14;;23710:11;;;23703:35;23766:16;;;;23660:10;;23631:165;;;23635:3;;23825:6;23820:3;23816:16;23809:23;;23376:466;;;;;;;22875:973;;;;:::o;23853:339::-;-1:-1:-1;;;24107:3:1;24100:24;24082:3;24140:46;24183:1;24178:3;24174:11;24166:6;24140:46;:::i;24197:432::-;-1:-1:-1;;;24454:3:1;24447:28;24429:3;24504:6;24498:13;24520:62;24575:6;24570:2;24565:3;24561:12;24554:4;24546:6;24542:17;24520:62;:::i;:::-;24602:16;;;;24620:2;24598:25;;24197:432;-1:-1:-1;;24197:432:1:o;24634:342::-;-1:-1:-1;;;24888:3:1;24881:26;24863:3;24923:47;24966:2;24961:3;24957:12;24949:6;24923:47;:::i;24981:335::-;-1:-1:-1;;;25235:3:1;25228:20;25210:3;25264:46;25307:1;25302:3;25298:11;25290:6;25264:46;:::i;25321:343::-;-1:-1:-1;;;25575:3:1;25568:27;25550:3;25611:47;25654:2;25649:3;25645:12;25637:6;25611:47;:::i;25669:893::-;-1:-1:-1;;;26173:3:1;26166:36;26148:3;26221:47;26264:2;26259:3;26255:12;26247:6;26221:47;:::i;:::-;-1:-1:-1;;;26284:2:1;26277:15;26321:6;26315:13;26337:60;26390:6;26386:1;26382:2;26378:10;26371:4;26363:6;26359:17;26337:60;:::i;:::-;26459:34;26455:1;26416:15;;;;26447:10;;;26440:54;-1:-1:-1;;;26518:2:1;26510:11;;26503:26;26553:2;26545:11;;25669:893;-1:-1:-1;;;;25669:893:1:o;26567:633::-;26847:3;26885:6;26879:13;26901:53;26947:6;26942:3;26935:4;26927:6;26923:17;26901:53;:::i;:::-;27017:13;;26976:16;;;;27039:57;27017:13;26976:16;27073:4;27061:17;;27039:57;:::i;:::-;-1:-1:-1;;;27118:20:1;;27147:18;;;27192:1;27181:13;;26567:633;-1:-1:-1;;;;26567:633:1:o;27355:1216::-;27819:34;27814:3;27807:47;27884:34;27879:2;27874:3;27870:12;27863:56;27949:34;27944:2;27939:3;27935:12;27928:56;-1:-1:-1;;;28009:2:1;28004:3;28000:12;27993:37;27789:3;28059:6;28053:13;28075:61;28129:6;28123:3;28118;28114:13;28109:2;28101:6;28097:15;28075:61;:::i;:::-;28201:33;28195:3;28155:16;;;;28187:12;;;28180:55;-1:-1:-1;28265:34:1;28259:3;28251:12;;28244:56;28330:34;28324:3;28316:12;;28309:56;28395:34;28389:3;28381:12;;28374:56;28460:34;28454:3;28446:12;;28439:56;-1:-1:-1;;;28519:3:1;28511:12;;28504:33;28561:3;28553:12;;27355:1216;-1:-1:-1;27355:1216:1:o;28576:575::-;-1:-1:-1;;;28931:3:1;28924:36;28906:3;28979:47;29022:2;29017:3;29013:12;29005:6;28979:47;:::i;:::-;29046:34;29035:46;;-1:-1:-1;;;29105:2:1;29097:11;;29090:28;29142:2;29134:11;;28576:575;-1:-1:-1;;;28576:575:1:o;29416:1634::-;30072:34;30067:3;30060:47;30137:34;30132:2;30127:3;30123:12;30116:56;30202:34;30197:2;30192:3;30188:12;30181:56;30267:34;30262:2;30257:3;30253:12;30246:56;30333:34;30327:3;30322;30318:13;30311:57;30399:34;30393:3;30388;30384:13;30377:57;-1:-1:-1;;;30459:3:1;30454;30450:13;30443:47;30042:3;30519:6;30513:13;30535:61;30589:6;30583:3;30578;30574:13;30569:2;30561:6;30557:15;30535:61;:::i;:::-;30656:13;;30615:16;;;;30678:62;30656:13;30725:3;30717:12;;30712:2;30700:15;;30678:62;:::i;:::-;30801:13;;30759:17;;;30823:62;30801:13;30870:3;30862:12;;30857:2;30845:15;;30823:62;:::i;:::-;30901:143;30931:112;30961:81;30987:54;31036:3;31025:8;31021:2;31017:17;31013:27;31005:6;30987:54;:::i;:::-;30979:6;30961:81;:::i;:::-;-1:-1:-1;;;29221:27:1;;29273:2;29264:12;;29156:126;30931:112;-1:-1:-1;;;29352:25:1;;29402:2;29393:12;;29287:124;30901:143;30894:150;29416:1634;-1:-1:-1;;;;;;;;;29416:1634:1:o;31462:656::-;-1:-1:-1;;;;;31707:32:1;;31689:51;;31771:2;31756:18;;31749:34;;;31819:2;31814;31799:18;;31792:30;;;31838:18;;31831:34;;;-1:-1:-1;;;;;;31877:31:1;;31874:51;;;31921:1;31918;31911:12;31874:51;31955:6;31952:1;31948:14;32013:6;32005;31999:3;31988:9;31984:19;31971:49;32091:1;32043:22;;32067:3;32039:32;32080:13;;;-1:-1:-1;32039:32:1;31462:656;-1:-1:-1;;;;31462:656:1:o;33222:125::-;33262:4;33290:1;33287;33284:8;33281:34;;;33295:18;;:::i;:::-;-1:-1:-1;33332:9:1;;33222:125::o;33352:112::-;33384:1;33410;33400:35;;33415:18;;:::i;:::-;-1:-1:-1;33449:9:1;;33352:112::o;36312:136::-;36351:3;36379:5;36369:39;;36388:18;;:::i;:::-;-1:-1:-1;;;36424:18:1;;36312:136::o;36453:224::-;36492:3;36520:6;36553:2;36550:1;36546:10;36583:2;36580:1;36576:10;36614:3;36610:2;36606:12;36601:3;36598:21;36595:47;;;36622:18;;:::i;:::-;36658:13;;36453:224;-1:-1:-1;;;;36453:224:1:o;36682:500::-;-1:-1:-1;;;;;36951:15:1;;;36933:34;;37003:15;;36998:2;36983:18;;36976:43;37050:2;37035:18;;37028:34;;;37098:3;37093:2;37078:18;;37071:31;;;36876:4;;37119:57;;37156:19;;37148:6;37119:57;:::i;:::-;37111:65;36682:500;-1:-1:-1;;;;;;36682:500:1:o;37187:249::-;37256:6;37309:2;37297:9;37288:7;37284:23;37280:32;37277:52;;;37325:1;37322;37315:12;37277:52;37357:9;37351:16;37376:30;37400:5;37376:30;:::i;37441:1891::-;-1:-1:-1;;;38395:3:1;38388:31;38370:3;38448:6;38442:13;38464:62;38519:6;38514:2;38509:3;38505:12;38498:4;38490:6;38486:17;38464:62;:::i;:::-;38590:34;38585:2;38545:16;;;38577:11;;;38570:55;-1:-1:-1;;;38649:2:1;38641:11;;38634:36;38695:13;;38717:63;38695:13;38766:2;38758:11;;38751:4;38739:17;;38717:63;:::i;:::-;-1:-1:-1;;;38840:2:1;38799:17;;;;38832:11;;;38825:37;38887:13;;38909:63;38887:13;38958:2;38950:11;;38943:4;38931:17;;38909:63;:::i;:::-;-1:-1:-1;;;39032:2:1;38991:17;;;;39024:11;;;39017:36;39078:13;;39100:63;39078:13;39149:2;39141:11;;39134:4;39122:17;;39100:63;:::i;:::-;-1:-1:-1;;;39223:2:1;39182:17;;;;39215:11;;;39208:33;39257:69;39287:38;39321:2;39313:11;;39305:6;39287:38;:::i;:::-;27282:33;27270:46;;27341:2;27332:12;;27205:145;39257:69;39250:76;37441:1891;-1:-1:-1;;;;;;;;37441:1891:1:o;39337:1349::-;39968:3;40006:6;40000:13;40022:53;40068:6;40063:3;40056:4;40048:6;40044:17;40022:53;:::i;:::-;40106:6;40101:3;40097:16;40084:29;;40136:34;40129:5;40122:49;-1:-1:-1;;;40198:4:1;40191:5;40187:16;40180:49;40260:6;40254:13;40276:66;40333:8;40328:2;40321:5;40317:14;40310:4;40302:6;40298:17;40276:66;:::i;:::-;-1:-1:-1;;;40405:2:1;40361:20;;;;40397:11;;;40390:27;40442:13;;40464:63;40442:13;40513:2;40505:11;;40498:4;40486:17;;40464:63;:::i;:::-;-1:-1:-1;;;40587:2:1;40546:17;;;;40579:11;;;40572:38;-1:-1:-1;;;40634:2:1;40626:11;;40619:34;40677:2;40669:11;;39337:1349;-1:-1:-1;;;;;39337:1349:1:o;40691:470::-;40870:3;40908:6;40902:13;40924:53;40970:6;40965:3;40958:4;40950:6;40946:17;40924:53;:::i;:::-;41040:13;;40999:16;;;;41062:57;41040:13;40999:16;41096:4;41084:17;;41062:57;:::i;41166:370::-;41395:3;41423:38;41457:3;41449:6;41423:38;:::i;:::-;-1:-1:-1;;;41470:33:1;;41527:2;41519:11;;41166:370;-1:-1:-1;;;41166:370:1:o;42265:2367::-;43574:66;43562:79;;43671:66;43666:2;43657:12;;43650:88;43768:66;43763:2;43754:12;;43747:88;-1:-1:-1;;;43860:2:1;43851:12;;43844:54;-1:-1:-1;;;43923:3:1;43914:13;;43907:59;-1:-1:-1;43985:48:1;44028:3;44019:13;;44011:6;43985:48;:::i;:::-;-1:-1:-1;;;44049:2:1;44042:16;44087:6;44081:13;44103:58;44154:6;44150:1;44146:2;44142:10;44137:2;44129:6;44125:15;44103:58;:::i;:::-;-1:-1:-1;;;44219:1:1;44180:15;;;;44211:10;;;44204:42;-1:-1:-1;;;44270:1:1;44262:10;;44255:62;44342:13;;44364:61;44342:13;44411:2;44403:11;;44398:2;44386:15;;44364:61;:::i;:::-;44441:185;44471:154;44505:119;44535:88;44565:57;44618:2;44607:8;44603:2;44599:17;44595:26;-1:-1:-1;;;41606:25:1;;41656:1;41647:11;;41541:123;44565:57;41746:66;41734:79;;41838:2;41829:12;;41669:178;44535:88;41929:66;41917:79;;42026:66;42021:2;42012:12;;42005:88;42118:2;42109:12;;41852:275;44505:119;44497:6;44471:154;:::i;:::-;-1:-1:-1;;;42197:30:1;;42252:1;42243:11;;42132:128;44637:1429;45265:3;45303:6;45297:13;45319:53;45365:6;45360:3;45353:4;45345:6;45341:17;45319:53;:::i;:::-;45433:66;45394:16;;;45419:81;;;-1:-1:-1;;;45527:4:1;45516:16;;45509:50;45578:49;45623:2;45612:14;;45604:6;45578:49;:::i;:::-;-1:-1:-1;;;45672:14:1;;;45714:66;45710:1;45702:10;;45695:86;-1:-1:-1;;;45805:2:1;45797:11;;45790:65;45880:13;;45568:59;;-1:-1:-1;45646:17:1;45902:63;45880:13;45951:2;45943:11;;45936:4;45924:17;;45902:63;:::i;:::-;46025:2;45984:17;;46017:11;;;46010:23;46057:2;46049:11;;44637:1429;-1:-1:-1;;;;;44637:1429:1:o;46071:1426::-;46699:3;46737:6;46731:13;46753:53;46799:6;46794:3;46787:4;46779:6;46775:17;46753:53;:::i;:::-;46837:6;46832:3;46828:16;46815:29;;46867:66;46860:5;46853:81;46977:28;46972:3;46968:38;46961:4;46954:5;46950:16;46943:64;47038:6;47032:13;47054:66;47111:8;47106:2;47099:5;47095:14;47088:4;47080:6;47076:17;47054:66;:::i;:::-;-1:-1:-1;;;47139:20:1;;47219:2;47211:11;;47204:23;;;47256:66;47251:2;47243:11;;47236:87;-1:-1:-1;;;47347:2:1;47339:11;;47332:45;47139:20;47396:46;47438:2;47430:11;;47422:6;47396:46;:::i;:::-;47451:14;;;47489:1;47481:10;;46071:1426;-1:-1:-1;;;;;;46071:1426:1:o;47502:1891::-;48377:3;48415:6;48409:13;48431:53;48477:6;48472:3;48465:4;48457:6;48453:17;48431:53;:::i;:::-;48545:66;48506:16;;;48531:81;;;-1:-1:-1;;;48639:4:1;48628:16;;48621:52;48692:49;48737:2;48726:14;;48718:6;48692:49;:::i;:::-;-1:-1:-1;;;48786:14:1;;;48828:66;48824:1;48816:10;;48809:86;-1:-1:-1;;;48919:2:1;48911:11;;48904:43;48682:59;;-1:-1:-1;48966:46:1;49008:2;49000:11;;48992:6;48966:46;:::i;:::-;49021:14;;;49063:66;49059:1;49051:10;;49044:86;-1:-1:-1;;;49154:2:1;49146:11;;49139:41;49205:13;;48956:56;;-1:-1:-1;49227:63:1;49205:13;49276:2;49268:11;;49261:4;49249:17;;49227:63;:::i;:::-;-1:-1:-1;;;49350:2:1;49309:17;;;;49342:11;;;49335:25;49384:2;49376:11;;47502:1891;-1:-1:-1;;;;;;47502:1891:1:o;49398:575::-;49731:3;49769:6;49763:13;49785:53;49831:6;49826:3;49819:4;49811:6;49807:17;49785:53;:::i;:::-;-1:-1:-1;;;49860:16:1;;49885:18;;;-1:-1:-1;;;;49930:1:1;49919:13;;49912:26;49965:1;49954:13;;49398:575;-1:-1:-1;49398:575:1:o;49978:448::-;50240:31;50235:3;50228:44;50210:3;50301:6;50295:13;50317:62;50372:6;50367:2;50362:3;50358:12;50351:4;50343:6;50339:17;50317:62;:::i;:::-;50399:16;;;;50417:2;50395:25;;49978:448;-1:-1:-1;;49978:448:1:o;51518:217::-;51557:4;51586:6;51642:10;;;;51612;;51664:12;;;51661:38;;;51679:18;;:::i;:::-;51716:13;;51518:217;-1:-1:-1;;;51518:217:1:o
Swarm Source
ipfs://37272c98c2faa1c6775fd5bb79a03ead884914245de27f5ac2557f9257a5b966
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.