ETH Price: $3,661.31 (+1.66%)
 

Overview

Max Total Supply

265 SAUDCAMEL

Holders

47

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
savvysav.eth
Balance
1 SAUDCAMEL
0xd5ef94ec1a13a9356c67cf9902b8ed22ebd6a0f6
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
TheSaudiCamels

Compiler Version
v0.8.14+commit.80d49f37

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-07-14
*/

// SPDX-License-Identifier: MIT

    pragma solidity ^0.8.12;

    /**
    * @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

            if (value == 0) {
                return "0";
            }
            uint256 temp = value;
            uint256 digits;
            while (temp != 0) {
                digits++;
                temp /= 10;
            }
            bytes memory buffer = new bytes(digits);
            while (value != 0) {
                digits -= 1;
                buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
                value /= 10;
            }
            return string(buffer);
        }

        /**
        * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
        */
        function toHexString(uint256 value) internal pure returns (string memory) {
            if (value == 0) {
                return "0x00";
            }
            uint256 temp = value;
            uint256 length = 0;
            while (temp != 0) {
                length++;
                temp >>= 8;
            }
            return toHexString(value, length);
        }

        /**
        * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
        */
        function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
            bytes memory buffer = new bytes(2 * length + 2);
            buffer[0] = "0";
            buffer[1] = "x";
            for (uint256 i = 2 * length + 1; i > 1; --i) {
                buffer[i] = _HEX_SYMBOLS[value & 0xf];
                value >>= 4;
            }
            require(value == 0, "Strings: hex length insufficient");
            return string(buffer);
        }
    }

    // File: erc721a/contracts/IERC721A.sol


    // ERC721A Contracts v4.0.0
    // Creator: Chiru Labs

    pragma solidity ^0.8.4;

    /**
    * @dev Interface of an ERC721A compliant contract.
    */
    interface IERC721A {
        /**
        * The caller must own the token or be an approved operator.
        */
        error ApprovalCallerNotOwnerNorApproved();

        /**
        * The token does not exist.
        */
        error ApprovalQueryForNonexistentToken();

        /**
        * The caller cannot approve to their own address.
        */
        error ApproveToCaller();

        /**
        * The caller cannot approve to the current owner.
        */
        error ApprovalToCurrentOwner();

        /**
        * Cannot query the balance for the zero address.
        */
        error BalanceQueryForZeroAddress();

        /**
        * Cannot mint to the zero address.
        */
        error MintToZeroAddress();

        /**
        * The quantity of tokens minted must be more than zero.
        */
        error MintZeroQuantity();

        /**
        * The token does not exist.
        */
        error OwnerQueryForNonexistentToken();

        /**
        * The caller must own the token or be an approved operator.
        */
        error TransferCallerNotOwnerNorApproved();

        /**
        * The token must be owned by `from`.
        */
        error TransferFromIncorrectOwner();

        /**
        * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface.
        */
        error TransferToNonERC721ReceiverImplementer();

        /**
        * Cannot transfer to the zero address.
        */
        error TransferToZeroAddress();

        /**
        * The token does not exist.
        */
        error URIQueryForNonexistentToken();

        struct TokenOwnership {
            // The address of the owner.
            address addr;
            // Keeps track of the start time of ownership with minimal overhead for tokenomics.
            uint64 startTimestamp;
            // Whether the token has been burned.
            bool burned;
        }

        /**
        * @dev Returns the total amount of tokens stored by the contract.
        *
        * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens.
        */
        function totalSupply() external view returns (uint256);

        // ==============================
        //            IERC165
        // ==============================

        /*
        * This function call must use less than 30 000 gas.
        */
        function supportsInterface(bytes4 interfaceId) external view returns (bool);

        // ==============================
        //            IERC721
        // ==============================

        /**
        * @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`.
        *
        * 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 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 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 the account approved for `tokenId` token.
        *
        * Requirements:
        *
        * - `tokenId` must exist.
        */
        function getApproved(uint256 tokenId) external view returns (address operator);

        /**
        * @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);

        // ==============================
        //        IERC721Metadata
        // ==============================

        /**
        * @dev Returns the token collection name.
        */
        function name() external view returns (string memory);

        /**
        * @dev Returns the token collection symbol.
        */
        function symbol() external view returns (string memory);

        /**
        * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
        */
        function tokenURI(uint256 tokenId) external view returns (string memory);
    }

    // File: erc721a/contracts/ERC721A.sol


    // ERC721A Contracts v4.0.0
    // Creator: Chiru Labs

    pragma solidity ^0.8.4;


    /**
    * @dev ERC721 token receiver interface.
    */
    interface ERC721A__IERC721Receiver {
        function onERC721Received(
            address operator,
            address from,
            uint256 tokenId,
            bytes calldata data
        ) external returns (bytes4);
    }

    /**
    * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
    * the Metadata extension. Built to optimize for lower gas during batch mints.
    *
    * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..).
    *
    * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
    *
    * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
    */
    contract ERC721A is IERC721A {
        // Mask of an entry in packed address data.
        uint256 private constant BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1;

        // The bit position of `numberMinted` in packed address data.
        uint256 private constant BITPOS_NUMBER_MINTED = 64;

        // The bit position of `numberBurned` in packed address data.
        uint256 private constant BITPOS_NUMBER_BURNED = 128;

        // The bit position of `aux` in packed address data.
        uint256 private constant BITPOS_AUX = 192;

        // Mask of all 256 bits in packed address data except the 64 bits for `aux`.
        uint256 private constant BITMASK_AUX_COMPLEMENT = (1 << 192) - 1;

        // The bit position of `startTimestamp` in packed ownership.
        uint256 private constant BITPOS_START_TIMESTAMP = 160;

        // The bit mask of the `burned` bit in packed ownership.
        uint256 private constant BITMASK_BURNED = 1 << 224;
        
        // The bit position of the `nextInitialized` bit in packed ownership.
        uint256 private constant BITPOS_NEXT_INITIALIZED = 225;

        // The bit mask of the `nextInitialized` bit in packed ownership.
        uint256 private constant BITMASK_NEXT_INITIALIZED = 1 << 225;

        // The tokenId of the next token to be minted.
        uint256 private _currentIndex;

        // The number of tokens burned.
        uint256 private _burnCounter;

        // 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 `_packedOwnershipOf` implementation for details.
        //
        // Bits Layout:
        // - [0..159]   `addr`
        // - [160..223] `startTimestamp`
        // - [224]      `burned`
        // - [225]      `nextInitialized`
        mapping(uint256 => uint256) private _packedOwnerships;

        // Mapping owner address to address data.
        //
        // Bits Layout:
        // - [0..63]    `balance`
        // - [64..127]  `numberMinted`
        // - [128..191] `numberBurned`
        // - [192..255] `aux`
        mapping(address => uint256) private _packedAddressData;

        // 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_;
            _currentIndex = _startTokenId();
        }

        /**
        * @dev Returns the starting token ID. 
        * To change the starting token ID, please override this function.
        */
        function _startTokenId() internal view virtual returns (uint256) {
            return 0;
        }

        /**
        * @dev Returns the next token ID to be minted.
        */
        function _nextTokenId() internal view returns (uint256) {
            return _currentIndex;
        }

        /**
        * @dev Returns the total number of tokens in existence.
        * Burned tokens will reduce the count. 
        * To get the total number of tokens minted, please see `_totalMinted`.
        */
        function totalSupply() public view override returns (uint256) {
            // Counter underflow is impossible as _burnCounter cannot be incremented
            // more than `_currentIndex - _startTokenId()` times.
            unchecked {
                return _currentIndex - _burnCounter - _startTokenId();
            }
        }

        /**
        * @dev Returns the total amount of tokens minted in the contract.
        */
        function _totalMinted() internal view returns (uint256) {
            // Counter underflow is impossible as _currentIndex does not decrement,
            // and it is initialized to `_startTokenId()`
            unchecked {
                return _currentIndex - _startTokenId();
            }
        }

        /**
        * @dev Returns the total number of tokens burned.
        */
        function _totalBurned() internal view returns (uint256) {
            return _burnCounter;
        }

        /**
        * @dev See {IERC165-supportsInterface}.
        */
        function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
            // The interface IDs are constants representing the first 4 bytes of the XOR of
            // all function selectors in the interface. See: https://eips.ethereum.org/EIPS/eip-165
            // e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`
            return
                interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165.
                interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721.
                interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata.
        }

        /**
        * @dev See {IERC721-balanceOf}.
        */
        function balanceOf(address owner) public view override returns (uint256) {
            if (owner == address(0)) revert BalanceQueryForZeroAddress();
            return _packedAddressData[owner] & BITMASK_ADDRESS_DATA_ENTRY;
        }

        /**
        * Returns the number of tokens minted by `owner`.
        */
        function _numberMinted(address owner) internal view returns (uint256) {
            return (_packedAddressData[owner] >> BITPOS_NUMBER_MINTED) & BITMASK_ADDRESS_DATA_ENTRY;
        }

        /**
        * Returns the number of tokens burned by or on behalf of `owner`.
        */
        function _numberBurned(address owner) internal view returns (uint256) {
            return (_packedAddressData[owner] >> BITPOS_NUMBER_BURNED) & BITMASK_ADDRESS_DATA_ENTRY;
        }

        /**
        * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
        */
        function _getAux(address owner) internal view returns (uint64) {
            return uint64(_packedAddressData[owner] >> BITPOS_AUX);
        }

        /**
        * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
        * If there are multiple variables, please pack them into a uint64.
        */
        function _setAux(address owner, uint64 aux) internal {
            uint256 packed = _packedAddressData[owner];
            uint256 auxCasted;
            assembly { // Cast aux without masking.
                auxCasted := aux
            }
            packed = (packed & BITMASK_AUX_COMPLEMENT) | (auxCasted << BITPOS_AUX);
            _packedAddressData[owner] = packed;
        }

        /**
        * Returns the packed ownership data of `tokenId`.
        */
        function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) {
            uint256 curr = tokenId;

            unchecked {
                if (_startTokenId() <= curr)
                    if (curr < _currentIndex) {
                        uint256 packed = _packedOwnerships[curr];
                        // If not burned.
                        if (packed & BITMASK_BURNED == 0) {
                            // Invariant:
                            // There will always be an ownership that has an address and is not burned
                            // before an ownership that does not have an address and is not burned.
                            // Hence, curr will not underflow.
                            //
                            // We can directly compare the packed value.
                            // If the address is zero, packed is zero.
                            while (packed == 0) {
                                packed = _packedOwnerships[--curr];
                            }
                            return packed;
                        }
                    }
            }
            revert OwnerQueryForNonexistentToken();
        }

        /**
        * Returns the unpacked `TokenOwnership` struct from `packed`.
        */
        function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) {
            ownership.addr = address(uint160(packed));
            ownership.startTimestamp = uint64(packed >> BITPOS_START_TIMESTAMP);
            ownership.burned = packed & BITMASK_BURNED != 0;
        }

        /**
        * Returns the unpacked `TokenOwnership` struct at `index`.
        */
        function _ownershipAt(uint256 index) internal view returns (TokenOwnership memory) {
            return _unpackedOwnership(_packedOwnerships[index]);
        }

        /**
        * @dev Initializes the ownership slot minted at `index` for efficiency purposes.
        */
        function _initializeOwnershipAt(uint256 index) internal {
            if (_packedOwnerships[index] == 0) {
                _packedOwnerships[index] = _packedOwnershipOf(index);
            }
        }

        /**
        * 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) {
            return _unpackedOwnership(_packedOwnershipOf(tokenId));
        }

        /**
        * @dev See {IERC721-ownerOf}.
        */
        function ownerOf(uint256 tokenId) public view override returns (address) {
            return address(uint160(_packedOwnershipOf(tokenId)));
        }

        /**
        * @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) {
            if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

            string memory baseURI = _baseURI();
            return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : '';
        }

        /**
        * @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 Casts the address to uint256 without masking.
        */
        function _addressToUint256(address value) private pure returns (uint256 result) {
            assembly {
                result := value
            }
        }

        /**
        * @dev Casts the boolean to uint256 without branching.
        */
        function _boolToUint256(bool value) private pure returns (uint256 result) {
            assembly {
                result := value
            }
        }

        /**
        * @dev See {IERC721-approve}.
        */
        function approve(address to, uint256 tokenId) public override {
            address owner = address(uint160(_packedOwnershipOf(tokenId)));
            if (to == owner) revert ApprovalToCurrentOwner();

            if (_msgSenderERC721A() != owner)
                if (!isApprovedForAll(owner, _msgSenderERC721A())) {
                    revert ApprovalCallerNotOwnerNorApproved();
                }

            _tokenApprovals[tokenId] = to;
            emit Approval(owner, to, tokenId);
        }

        /**
        * @dev See {IERC721-getApproved}.
        */
        function getApproved(uint256 tokenId) public view override returns (address) {
            if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

            return _tokenApprovals[tokenId];
        }

        /**
        * @dev See {IERC721-setApprovalForAll}.
        */
        function setApprovalForAll(address operator, bool approved) public virtual override {
            if (operator == _msgSenderERC721A()) revert ApproveToCaller();

            _operatorApprovals[_msgSenderERC721A()][operator] = approved;
            emit ApprovalForAll(_msgSenderERC721A(), 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 {
            _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 {
            _transfer(from, to, tokenId);
            if (to.code.length != 0)
                if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                    revert TransferToNonERC721ReceiverImplementer();
                }
        }

        /**
        * @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
                _startTokenId() <= tokenId &&
                tokenId < _currentIndex && // If within bounds,
                _packedOwnerships[tokenId] & BITMASK_BURNED == 0; // and not burned.
        }

        /**
        * @dev Equivalent to `_safeMint(to, quantity, '')`.
        */
        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 {
            uint256 startTokenId = _currentIndex;
            if (to == address(0)) revert MintToZeroAddress();
            if (quantity == 0) revert MintZeroQuantity();

            _beforeTokenTransfers(address(0), to, startTokenId, quantity);

            // Overflows are incredibly unrealistic.
            // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
            // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
            unchecked {
                // Updates:
                // - `balance += quantity`.
                // - `numberMinted += quantity`.
                //
                // We can directly add to the balance and number minted.
                _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1);

                // Updates:
                // - `address` to the owner.
                // - `startTimestamp` to the timestamp of minting.
                // - `burned` to `false`.
                // - `nextInitialized` to `quantity == 1`.
                _packedOwnerships[startTokenId] =
                    _addressToUint256(to) |
                    (block.timestamp << BITPOS_START_TIMESTAMP) |
                    (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED);

                uint256 updatedIndex = startTokenId;
                uint256 end = updatedIndex + quantity;

                if (to.code.length != 0) {
                    do {
                        emit Transfer(address(0), to, updatedIndex);
                        if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                            revert TransferToNonERC721ReceiverImplementer();
                        }
                    } while (updatedIndex < end);
                    // Reentrancy protection
                    if (_currentIndex != startTokenId) revert();
                } else {
                    do {
                        emit Transfer(address(0), to, updatedIndex++);
                    } while (updatedIndex < end);
                }
                _currentIndex = updatedIndex;
            }
            _afterTokenTransfers(address(0), to, startTokenId, quantity);
        }

        /**
        * @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) internal {
            uint256 startTokenId = _currentIndex;
            if (to == address(0)) revert MintToZeroAddress();
            if (quantity == 0) revert MintZeroQuantity();

            _beforeTokenTransfers(address(0), to, startTokenId, quantity);

            // Overflows are incredibly unrealistic.
            // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
            // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
            unchecked {
                // Updates:
                // - `balance += quantity`.
                // - `numberMinted += quantity`.
                //
                // We can directly add to the balance and number minted.
                _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1);

                // Updates:
                // - `address` to the owner.
                // - `startTimestamp` to the timestamp of minting.
                // - `burned` to `false`.
                // - `nextInitialized` to `quantity == 1`.
                _packedOwnerships[startTokenId] =
                    _addressToUint256(to) |
                    (block.timestamp << BITPOS_START_TIMESTAMP) |
                    (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED);

                uint256 updatedIndex = startTokenId;
                uint256 end = updatedIndex + quantity;

                do {
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex < end);

                _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 {
            uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

            if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner();

            bool isApprovedOrOwner = (_msgSenderERC721A() == from ||
                isApprovedForAll(from, _msgSenderERC721A()) ||
                getApproved(tokenId) == _msgSenderERC721A());

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
            if (to == address(0)) revert TransferToZeroAddress();

            _beforeTokenTransfers(from, to, tokenId, 1);

            // Clear approvals from the previous owner.
            delete _tokenApprovals[tokenId];

            // 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 {
                // We can directly increment and decrement the balances.
                --_packedAddressData[from]; // Updates: `balance -= 1`.
                ++_packedAddressData[to]; // Updates: `balance += 1`.

                // Updates:
                // - `address` to the next owner.
                // - `startTimestamp` to the timestamp of transfering.
                // - `burned` to `false`.
                // - `nextInitialized` to `true`.
                _packedOwnerships[tokenId] =
                    _addressToUint256(to) |
                    (block.timestamp << BITPOS_START_TIMESTAMP) |
                    BITMASK_NEXT_INITIALIZED;

                // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
                if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) {
                    uint256 nextTokenId = tokenId + 1;
                    // If the next slot's address is zero and not burned (i.e. packed value is zero).
                    if (_packedOwnerships[nextTokenId] == 0) {
                        // If the next slot is within bounds.
                        if (nextTokenId != _currentIndex) {
                            // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                            _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                        }
                    }
                }
            }

            emit Transfer(from, to, tokenId);
            _afterTokenTransfers(from, to, tokenId, 1);
        }

        /**
        * @dev Equivalent to `_burn(tokenId, false)`.
        */
        function _burn(uint256 tokenId) internal virtual {
            _burn(tokenId, false);
        }

        /**
        * @dev Destroys `tokenId`.
        * The approval is cleared when the token is burned.
        *
        * Requirements:
        *
        * - `tokenId` must exist.
        *
        * Emits a {Transfer} event.
        */
        function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
            uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

            address from = address(uint160(prevOwnershipPacked));

            if (approvalCheck) {
                bool isApprovedOrOwner = (_msgSenderERC721A() == from ||
                    isApprovedForAll(from, _msgSenderERC721A()) ||
                    getApproved(tokenId) == _msgSenderERC721A());

                if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
            }

            _beforeTokenTransfers(from, address(0), tokenId, 1);

            // Clear approvals from the previous owner.
            delete _tokenApprovals[tokenId];

            // 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 {
                // Updates:
                // - `balance -= 1`.
                // - `numberBurned += 1`.
                //
                // We can directly decrement the balance, and increment the number burned.
                // This is equivalent to `packed -= 1; packed += 1 << BITPOS_NUMBER_BURNED;`.
                _packedAddressData[from] += (1 << BITPOS_NUMBER_BURNED) - 1;

                // Updates:
                // - `address` to the last owner.
                // - `startTimestamp` to the timestamp of burning.
                // - `burned` to `true`.
                // - `nextInitialized` to `true`.
                _packedOwnerships[tokenId] =
                    _addressToUint256(from) |
                    (block.timestamp << BITPOS_START_TIMESTAMP) |
                    BITMASK_BURNED | 
                    BITMASK_NEXT_INITIALIZED;

                // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
                if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) {
                    uint256 nextTokenId = tokenId + 1;
                    // If the next slot's address is zero and not burned (i.e. packed value is zero).
                    if (_packedOwnerships[nextTokenId] == 0) {
                        // If the next slot is within bounds.
                        if (nextTokenId != _currentIndex) {
                            // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                            _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                        }
                    }
                }
            }

            emit Transfer(from, address(0), tokenId);
            _afterTokenTransfers(from, address(0), tokenId, 1);

            // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
            unchecked {
                _burnCounter++;
            }
        }

        /**
        * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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 _checkContractOnERC721Received(
            address from,
            address to,
            uint256 tokenId,
            bytes memory _data
        ) private returns (bool) {
            try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns (
                bytes4 retval
            ) {
                return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert TransferToNonERC721ReceiverImplementer();
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        }

        function _beforeTokenTransfers(
            address from,
            address to,
            uint256 startTokenId,
            uint256 quantity
        ) internal virtual {}

        function _afterTokenTransfers(
            address from,
            address to,
            uint256 startTokenId,
            uint256 quantity
        ) internal virtual {}

        function _msgSenderERC721A() internal view virtual returns (address) {
            return msg.sender;
        }

        /**
        * @dev Converts a `uint256` to its ASCII `string` decimal representation.
        */
        function _toString(uint256 value) internal pure returns (string memory ptr) {
            assembly {

                ptr := add(mload(0x40), 128)
                // Update the free memory pointer to allocate.
                mstore(0x40, ptr)

                // Cache the end of the memory to calculate the length later.
                let end := ptr

                for { 
                    // Initialize and perform the first pass without check.
                    let temp := value
                    // Move the pointer 1 byte leftwards to point to an empty character slot.
                    ptr := sub(ptr, 1)
                    // Write the character to the pointer. 48 is the ASCII index of '0'.
                    mstore8(ptr, add(48, mod(temp, 10)))
                    temp := div(temp, 10)
                } temp { 
                    // Keep dividing `temp` until zero.
                    temp := div(temp, 10)
                } { // Body of the for loop.
                    ptr := sub(ptr, 1)
                    mstore8(ptr, add(48, mod(temp, 10)))
                }
                
                let length := sub(end, ptr)
                // Move the pointer 32 bytes leftwards to make room for the length.
                ptr := sub(ptr, 32)
                // Store the length.
                mstore(ptr, length)
            }
        }
    }

    // File: @openzeppelin/contracts/utils/Context.sol


    // OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

    pragma solidity ^0.8.12;

    abstract contract Context {
        function _msgSender() internal view virtual returns (address) {
            return msg.sender;
        }

        function _msgData() internal view virtual returns (bytes calldata) {
            return msg.data;
        }
    }

    // File: @openzeppelin/contracts/access/Ownable.sol


    // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

    pragma solidity ^0.8.12;


    /**
    * @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() {
            _transferOwnership(_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 {
            _transferOwnership(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");
            _transferOwnership(newOwner);
        }

        /**
        * @dev Transfers ownership of the contract to a new account (`newOwner`).
        * Internal function without access restriction.
        */
        function _transferOwnership(address newOwner) internal virtual {
            address oldOwner = _owner;
            _owner = newOwner;
            emit OwnershipTransferred(oldOwner, newOwner);
        }
    }

    // File: contracts/SaudiCamels.sol

     contract TheSaudiCamels is ERC721A, Ownable {
        
        using Strings for uint;
        uint public constant TotalCamel = 5040;
        uint public constant MaxCamel = 15;
        uint public constant PriceCamel = 0.008 ether;
        
        bool public isMetadataLocked = false;
        bool public isPaused = true;
        string private RevealTotalCamel;
        string public notRevealUri = "ipfs://QmTZgzeoLkv8AekHrkCe8rK7zwhF84NQ6C3bQrEJJcYAnj/hidden.json";
        
        mapping(address => uint) private SaudiCamelsperWallets;

        constructor() 
        ERC721A('TheSaudiCamels', 'SAUDCAMEL') {}

        function _baseURI() internal view override returns (string memory) {
            return RevealTotalCamel;
        }

        function _startTokenId() internal pure override returns (uint) {
            return 1;
        }

        function lockMetadata(bool value)  external onlyOwner {
            isMetadataLocked = value;
        }

        function reveal(string memory url) external onlyOwner {
            require(!isMetadataLocked, "SaudiCamels: Metadata is finalized");
            RevealTotalCamel = url;
        }

        function mintedCount(address owner) external view returns (uint) {
            return SaudiCamelsperWallets[owner];
        }


        function setPause(bool value) external onlyOwner {
            isPaused = value;
        }

        function withdraw() public payable onlyOwner {
         (bool os, ) = payable(owner()).call{value: address(this).balance}("");
         require(os);
        }

        function ownerMint(address _address, uint count) external onlyOwner {
            require(
                _totalMinted() + count <= TotalCamel,
                'SaudiCamels: Over limit'
            );
            _safeMint(_address, count);
        }

        function tokenURI(uint tokenId)
            public
            view
            override
            returns (string memory)
        {
            require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

            return bytes(_baseURI()).length > 0 
                ? string(abi.encodePacked(_baseURI(), tokenId.toString(), ".json"))
                : notRevealUri;
        }

        function mint(uint count) external payable {
            require(!isPaused, 'SaudiCamels: Hold on');
            require(count <= MaxCamel,'SaudiCamels: Too many camels minted');
            require(_totalMinted() + count <= TotalCamel,'SaudiCamels: Sold out.');

            uint payForCount = count;
            if(SaudiCamelsperWallets[msg.sender] == 0) {
                payForCount--;
            }

            require(
                msg.value >= payForCount * PriceCamel,
                'SaudiCamels: Wrong ETH value'
            );

            SaudiCamelsperWallets[msg.sender] += count;
            _safeMint(msg.sender, count);
        }
        
    }

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":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":[],"name":"MaxCamel","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PriceCamel","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TotalCamel","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isMetadataLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"lockMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"mintedCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealUri","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":"address","name":"_address","type":"address"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","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":"string","name":"url","type":"string"}],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setPause","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":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526000600860146101000a81548160ff0219169083151502179055506001600860156101000a81548160ff0219169083151502179055506040518060800160405280604181526020016200381f60419139600a90805190602001906200006b9291906200022d565b503480156200007957600080fd5b506040518060400160405280600e81526020017f546865536175646943616d656c730000000000000000000000000000000000008152506040518060400160405280600981526020017f5341554443414d454c00000000000000000000000000000000000000000000008152508160029080519060200190620000fe9291906200022d565b508060039080519060200190620001179291906200022d565b50620001286200015660201b60201c565b600081905550505062000150620001446200015f60201b60201c565b6200016760201b60201c565b62000341565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200023b906200030c565b90600052602060002090601f0160209004810192826200025f5760008555620002ab565b82601f106200027a57805160ff1916838001178555620002ab565b82800160010185558215620002ab579182015b82811115620002aa5782518255916020019190600101906200028d565b5b509050620002ba9190620002be565b5090565b5b80821115620002d9576000816000905550600101620002bf565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200032557607f821691505b6020821081036200033b576200033a620002dd565b5b50919050565b6134ce80620003516000396000f3fe6080604052600436106101cd5760003560e01c80637e80fc4e116100f7578063bedb86fb11610095578063e7219b2511610064578063e7219b2514610634578063e985e9c51461065f578063f2fde38b1461069c578063fddcb5ea146106c5576101cd565b8063bedb86fb14610578578063c87b56dd146105a1578063d45e7b61146105de578063d7e45cd714610609576101cd565b8063a0712d68116100d1578063a0712d68146104df578063a22cb465146104fb578063b187bd2614610524578063b88d4fde1461054f576101cd565b80637e80fc4e146104605780638da5cb5b1461048957806395d89b41146104b4576101cd565b806323b872dd1161016f5780634c2612471161013e5780634c261247146103a65780636352211e146103cf57806370a082311461040c578063715018a614610449576101cd565b806323b872dd146103215780633ccfd60b1461034a57806342842e0e14610354578063484b973c1461037d576101cd565b8063095ea7b3116101ab578063095ea7b31461027757806318160ddd146102a0578063200e9c96146102cb57806322a29d31146102f6576101cd565b806301ffc9a7146101d257806306fdde031461020f578063081812fc1461023a575b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f49190612542565b610702565b604051610206919061258a565b60405180910390f35b34801561021b57600080fd5b50610224610794565b604051610231919061263e565b60405180910390f35b34801561024657600080fd5b50610261600480360381019061025c9190612696565b610826565b60405161026e9190612704565b60405180910390f35b34801561028357600080fd5b5061029e6004803603810190610299919061274b565b6108a2565b005b3480156102ac57600080fd5b506102b5610a48565b6040516102c2919061279a565b60405180910390f35b3480156102d757600080fd5b506102e0610a5f565b6040516102ed919061279a565b60405180910390f35b34801561030257600080fd5b5061030b610a65565b604051610318919061263e565b60405180910390f35b34801561032d57600080fd5b50610348600480360381019061034391906127b5565b610af3565b005b610352610b03565b005b34801561036057600080fd5b5061037b600480360381019061037691906127b5565b610bff565b005b34801561038957600080fd5b506103a4600480360381019061039f919061274b565b610c1f565b005b3480156103b257600080fd5b506103cd60048036038101906103c8919061293d565b610d00565b005b3480156103db57600080fd5b506103f660048036038101906103f19190612696565b610de6565b6040516104039190612704565b60405180910390f35b34801561041857600080fd5b50610433600480360381019061042e9190612986565b610df8565b604051610440919061279a565b60405180910390f35b34801561045557600080fd5b5061045e610eb0565b005b34801561046c57600080fd5b50610487600480360381019061048291906129df565b610f38565b005b34801561049557600080fd5b5061049e610fd1565b6040516104ab9190612704565b60405180910390f35b3480156104c057600080fd5b506104c9610ffb565b6040516104d6919061263e565b60405180910390f35b6104f960048036038101906104f49190612696565b61108d565b005b34801561050757600080fd5b50610522600480360381019061051d9190612a0c565b61128c565b005b34801561053057600080fd5b50610539611403565b604051610546919061258a565b60405180910390f35b34801561055b57600080fd5b5061057660048036038101906105719190612aed565b611416565b005b34801561058457600080fd5b5061059f600480360381019061059a91906129df565b611489565b005b3480156105ad57600080fd5b506105c860048036038101906105c39190612696565b611522565b6040516105d5919061263e565b60405180910390f35b3480156105ea57600080fd5b506105f3611645565b604051610600919061279a565b60405180910390f35b34801561061557600080fd5b5061061e61164a565b60405161062b919061258a565b60405180910390f35b34801561064057600080fd5b5061064961165d565b604051610656919061279a565b60405180910390f35b34801561066b57600080fd5b5061068660048036038101906106819190612b70565b611668565b604051610693919061258a565b60405180910390f35b3480156106a857600080fd5b506106c360048036038101906106be9190612986565b6116fc565b005b3480156106d157600080fd5b506106ec60048036038101906106e79190612986565b6117f3565b6040516106f9919061279a565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061075d57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061078d5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600280546107a390612bdf565b80601f01602080910402602001604051908101604052809291908181526020018280546107cf90612bdf565b801561081c5780601f106107f15761010080835404028352916020019161081c565b820191906000526020600020905b8154815290600101906020018083116107ff57829003601f168201915b5050505050905090565b60006108318261183c565b610867576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108ad8261189b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610914576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610933611967565b73ffffffffffffffffffffffffffffffffffffffff16146109965761095f8161095a611967565b611668565b610995576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610a5261196f565b6001546000540303905090565b6113b081565b600a8054610a7290612bdf565b80601f0160208091040260200160405190810160405280929190818152602001828054610a9e90612bdf565b8015610aeb5780601f10610ac057610100808354040283529160200191610aeb565b820191906000526020600020905b815481529060010190602001808311610ace57829003601f168201915b505050505081565b610afe838383611978565b505050565b610b0b611d1f565b73ffffffffffffffffffffffffffffffffffffffff16610b29610fd1565b73ffffffffffffffffffffffffffffffffffffffff1614610b7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7690612c5c565b60405180910390fd5b6000610b89610fd1565b73ffffffffffffffffffffffffffffffffffffffff1647604051610bac90612cad565b60006040518083038185875af1925050503d8060008114610be9576040519150601f19603f3d011682016040523d82523d6000602084013e610bee565b606091505b5050905080610bfc57600080fd5b50565b610c1a83838360405180602001604052806000815250611416565b505050565b610c27611d1f565b73ffffffffffffffffffffffffffffffffffffffff16610c45610fd1565b73ffffffffffffffffffffffffffffffffffffffff1614610c9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9290612c5c565b60405180910390fd5b6113b081610ca7611d27565b610cb19190612cf1565b1115610cf2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce990612d93565b60405180910390fd5b610cfc8282611d3a565b5050565b610d08611d1f565b73ffffffffffffffffffffffffffffffffffffffff16610d26610fd1565b73ffffffffffffffffffffffffffffffffffffffff1614610d7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7390612c5c565b60405180910390fd5b600860149054906101000a900460ff1615610dcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc390612e25565b60405180910390fd5b8060099080519060200190610de2929190612433565b5050565b6000610df18261189b565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e5f576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610eb8611d1f565b73ffffffffffffffffffffffffffffffffffffffff16610ed6610fd1565b73ffffffffffffffffffffffffffffffffffffffff1614610f2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2390612c5c565b60405180910390fd5b610f366000611d58565b565b610f40611d1f565b73ffffffffffffffffffffffffffffffffffffffff16610f5e610fd1565b73ffffffffffffffffffffffffffffffffffffffff1614610fb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fab90612c5c565b60405180910390fd5b80600860146101000a81548160ff02191690831515021790555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461100a90612bdf565b80601f016020809104026020016040519081016040528092919081815260200182805461103690612bdf565b80156110835780601f1061105857610100808354040283529160200191611083565b820191906000526020600020905b81548152906001019060200180831161106657829003601f168201915b5050505050905090565b600860159054906101000a900460ff16156110dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d490612e91565b60405180910390fd5b600f811115611121576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111890612f23565b60405180910390fd5b6113b08161112d611d27565b6111379190612cf1565b1115611178576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116f90612f8f565b60405180910390fd5b60008190506000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054036111d35780806111cf90612faf565b9150505b661c6bf526340000816111e69190612fd8565b341015611228576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121f9061307e565b60405180910390fd5b81600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546112779190612cf1565b925050819055506112883383611d3a565b5050565b611294611967565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036112f8576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611305611967565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166113b2611967565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516113f7919061258a565b60405180910390a35050565b600860159054906101000a900460ff1681565b611421848484611978565b60008373ffffffffffffffffffffffffffffffffffffffff163b146114835761144c84848484611e1e565b611482576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611491611d1f565b73ffffffffffffffffffffffffffffffffffffffff166114af610fd1565b73ffffffffffffffffffffffffffffffffffffffff1614611505576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fc90612c5c565b60405180910390fd5b80600860156101000a81548160ff02191690831515021790555050565b606061152d8261183c565b61156c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156390613110565b60405180910390fd5b6000611576611f6e565b511161160c57600a805461158990612bdf565b80601f01602080910402602001604051908101604052809291908181526020018280546115b590612bdf565b80156116025780601f106115d757610100808354040283529160200191611602565b820191906000526020600020905b8154815290600101906020018083116115e557829003601f168201915b505050505061163e565b611614611f6e565b61161d83612000565b60405160200161162e9291906131b8565b6040516020818303038152906040525b9050919050565b600f81565b600860149054906101000a900460ff1681565b661c6bf52634000081565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611704611d1f565b73ffffffffffffffffffffffffffffffffffffffff16611722610fd1565b73ffffffffffffffffffffffffffffffffffffffff1614611778576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176f90612c5c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036117e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117de90613259565b60405180910390fd5b6117f081611d58565b50565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60008161184761196f565b11158015611856575060005482105b8015611894575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600080829050806118aa61196f565b116119305760005481101561192f5760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082160361192d575b600081036119235760046000836001900393508381526020019081526020016000205490506118f9565b8092505050611962565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b60006001905090565b60006119838261189b565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146119ea576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611a0b611967565b73ffffffffffffffffffffffffffffffffffffffff161480611a3a5750611a3985611a34611967565b611668565b5b80611a7f5750611a48611967565b73ffffffffffffffffffffffffffffffffffffffff16611a6784610826565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611ab8576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611b1e576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b2b8585856001612160565b6006600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b611c2886612166565b1717600460008581526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000831603611cb05760006001840190506000600460008381526020019081526020016000205403611cae576000548114611cad578260046000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611d188585856001612170565b5050505050565b600033905090565b6000611d3161196f565b60005403905090565b611d54828260405180602001604052806000815250612176565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611e44611967565b8786866040518563ffffffff1660e01b8152600401611e6694939291906132ce565b6020604051808303816000875af1925050508015611ea257506040513d601f19601f82011682018060405250810190611e9f919061332f565b60015b611f1b573d8060008114611ed2576040519150601f19603f3d011682016040523d82523d6000602084013e611ed7565b606091505b506000815103611f13576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060098054611f7d90612bdf565b80601f0160208091040260200160405190810160405280929190818152602001828054611fa990612bdf565b8015611ff65780601f10611fcb57610100808354040283529160200191611ff6565b820191906000526020600020905b815481529060010190602001808311611fd957829003601f168201915b5050505050905090565b606060008203612047576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061215b565b600082905060005b600082146120795780806120629061335c565b915050600a8261207291906133d3565b915061204f565b60008167ffffffffffffffff81111561209557612094612812565b5b6040519080825280601f01601f1916602001820160405280156120c75781602001600182028036833780820191505090505b5090505b60008514612154576001826120e09190613404565b9150600a856120ef9190613438565b60306120fb9190612cf1565b60f81b81838151811061211157612110613469565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561214d91906133d3565b94506120cb565b8093505050505b919050565b50505050565b6000819050919050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036121e2576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000830361221c576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6122296000858386612160565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e161228e60018514612429565b901b60a042901b61229e86612166565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b146123a2575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46123526000878480600101955087611e1e565b612388576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082106122e357826000541461239d57600080fd5b61240d565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082106123a3575b8160008190555050506124236000858386612170565b50505050565b6000819050919050565b82805461243f90612bdf565b90600052602060002090601f01602090048101928261246157600085556124a8565b82601f1061247a57805160ff19168380011785556124a8565b828001600101855582156124a8579182015b828111156124a757825182559160200191906001019061248c565b5b5090506124b591906124b9565b5090565b5b808211156124d25760008160009055506001016124ba565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61251f816124ea565b811461252a57600080fd5b50565b60008135905061253c81612516565b92915050565b600060208284031215612558576125576124e0565b5b60006125668482850161252d565b91505092915050565b60008115159050919050565b6125848161256f565b82525050565b600060208201905061259f600083018461257b565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156125df5780820151818401526020810190506125c4565b838111156125ee576000848401525b50505050565b6000601f19601f8301169050919050565b6000612610826125a5565b61261a81856125b0565b935061262a8185602086016125c1565b612633816125f4565b840191505092915050565b600060208201905081810360008301526126588184612605565b905092915050565b6000819050919050565b61267381612660565b811461267e57600080fd5b50565b6000813590506126908161266a565b92915050565b6000602082840312156126ac576126ab6124e0565b5b60006126ba84828501612681565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006126ee826126c3565b9050919050565b6126fe816126e3565b82525050565b600060208201905061271960008301846126f5565b92915050565b612728816126e3565b811461273357600080fd5b50565b6000813590506127458161271f565b92915050565b60008060408385031215612762576127616124e0565b5b600061277085828601612736565b925050602061278185828601612681565b9150509250929050565b61279481612660565b82525050565b60006020820190506127af600083018461278b565b92915050565b6000806000606084860312156127ce576127cd6124e0565b5b60006127dc86828701612736565b93505060206127ed86828701612736565b92505060406127fe86828701612681565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61284a826125f4565b810181811067ffffffffffffffff8211171561286957612868612812565b5b80604052505050565b600061287c6124d6565b90506128888282612841565b919050565b600067ffffffffffffffff8211156128a8576128a7612812565b5b6128b1826125f4565b9050602081019050919050565b82818337600083830152505050565b60006128e06128db8461288d565b612872565b9050828152602081018484840111156128fc576128fb61280d565b5b6129078482856128be565b509392505050565b600082601f83011261292457612923612808565b5b81356129348482602086016128cd565b91505092915050565b600060208284031215612953576129526124e0565b5b600082013567ffffffffffffffff811115612971576129706124e5565b5b61297d8482850161290f565b91505092915050565b60006020828403121561299c5761299b6124e0565b5b60006129aa84828501612736565b91505092915050565b6129bc8161256f565b81146129c757600080fd5b50565b6000813590506129d9816129b3565b92915050565b6000602082840312156129f5576129f46124e0565b5b6000612a03848285016129ca565b91505092915050565b60008060408385031215612a2357612a226124e0565b5b6000612a3185828601612736565b9250506020612a42858286016129ca565b9150509250929050565b600067ffffffffffffffff821115612a6757612a66612812565b5b612a70826125f4565b9050602081019050919050565b6000612a90612a8b84612a4c565b612872565b905082815260208101848484011115612aac57612aab61280d565b5b612ab78482856128be565b509392505050565b600082601f830112612ad457612ad3612808565b5b8135612ae4848260208601612a7d565b91505092915050565b60008060008060808587031215612b0757612b066124e0565b5b6000612b1587828801612736565b9450506020612b2687828801612736565b9350506040612b3787828801612681565b925050606085013567ffffffffffffffff811115612b5857612b576124e5565b5b612b6487828801612abf565b91505092959194509250565b60008060408385031215612b8757612b866124e0565b5b6000612b9585828601612736565b9250506020612ba685828601612736565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612bf757607f821691505b602082108103612c0a57612c09612bb0565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612c466020836125b0565b9150612c5182612c10565b602082019050919050565b60006020820190508181036000830152612c7581612c39565b9050919050565b600081905092915050565b50565b6000612c97600083612c7c565b9150612ca282612c87565b600082019050919050565b6000612cb882612c8a565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612cfc82612660565b9150612d0783612660565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612d3c57612d3b612cc2565b5b828201905092915050565b7f536175646943616d656c733a204f766572206c696d6974000000000000000000600082015250565b6000612d7d6017836125b0565b9150612d8882612d47565b602082019050919050565b60006020820190508181036000830152612dac81612d70565b9050919050565b7f536175646943616d656c733a204d657461646174612069732066696e616c697a60008201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b6000612e0f6022836125b0565b9150612e1a82612db3565b604082019050919050565b60006020820190508181036000830152612e3e81612e02565b9050919050565b7f536175646943616d656c733a20486f6c64206f6e000000000000000000000000600082015250565b6000612e7b6014836125b0565b9150612e8682612e45565b602082019050919050565b60006020820190508181036000830152612eaa81612e6e565b9050919050565b7f536175646943616d656c733a20546f6f206d616e792063616d656c73206d696e60008201527f7465640000000000000000000000000000000000000000000000000000000000602082015250565b6000612f0d6023836125b0565b9150612f1882612eb1565b604082019050919050565b60006020820190508181036000830152612f3c81612f00565b9050919050565b7f536175646943616d656c733a20536f6c64206f75742e00000000000000000000600082015250565b6000612f796016836125b0565b9150612f8482612f43565b602082019050919050565b60006020820190508181036000830152612fa881612f6c565b9050919050565b6000612fba82612660565b915060008203612fcd57612fcc612cc2565b5b600182039050919050565b6000612fe382612660565b9150612fee83612660565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561302757613026612cc2565b5b828202905092915050565b7f536175646943616d656c733a2057726f6e67204554482076616c756500000000600082015250565b6000613068601c836125b0565b915061307382613032565b602082019050919050565b600060208201905081810360008301526130978161305b565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006130fa602f836125b0565b91506131058261309e565b604082019050919050565b60006020820190508181036000830152613129816130ed565b9050919050565b600081905092915050565b6000613146826125a5565b6131508185613130565b93506131608185602086016125c1565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b60006131a2600583613130565b91506131ad8261316c565b600582019050919050565b60006131c4828561313b565b91506131d0828461313b565b91506131db82613195565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006132436026836125b0565b915061324e826131e7565b604082019050919050565b6000602082019050818103600083015261327281613236565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006132a082613279565b6132aa8185613284565b93506132ba8185602086016125c1565b6132c3816125f4565b840191505092915050565b60006080820190506132e360008301876126f5565b6132f060208301866126f5565b6132fd604083018561278b565b818103606083015261330f8184613295565b905095945050505050565b60008151905061332981612516565b92915050565b600060208284031215613345576133446124e0565b5b60006133538482850161331a565b91505092915050565b600061336782612660565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361339957613398612cc2565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006133de82612660565b91506133e983612660565b9250826133f9576133f86133a4565b5b828204905092915050565b600061340f82612660565b915061341a83612660565b92508282101561342d5761342c612cc2565b5b828203905092915050565b600061344382612660565b915061344e83612660565b92508261345e5761345d6133a4565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea2646970667358221220280f5c764ac8e56dafd49e168f0ef2c8c72addb2e9de236c25d466dc9eff1dc964736f6c634300080e0033697066733a2f2f516d545a677a656f4c6b763841656b48726b436538724b377a77684638344e51364333625172454a4a6359416e6a2f68696464656e2e6a736f6e

Deployed Bytecode

0x6080604052600436106101cd5760003560e01c80637e80fc4e116100f7578063bedb86fb11610095578063e7219b2511610064578063e7219b2514610634578063e985e9c51461065f578063f2fde38b1461069c578063fddcb5ea146106c5576101cd565b8063bedb86fb14610578578063c87b56dd146105a1578063d45e7b61146105de578063d7e45cd714610609576101cd565b8063a0712d68116100d1578063a0712d68146104df578063a22cb465146104fb578063b187bd2614610524578063b88d4fde1461054f576101cd565b80637e80fc4e146104605780638da5cb5b1461048957806395d89b41146104b4576101cd565b806323b872dd1161016f5780634c2612471161013e5780634c261247146103a65780636352211e146103cf57806370a082311461040c578063715018a614610449576101cd565b806323b872dd146103215780633ccfd60b1461034a57806342842e0e14610354578063484b973c1461037d576101cd565b8063095ea7b3116101ab578063095ea7b31461027757806318160ddd146102a0578063200e9c96146102cb57806322a29d31146102f6576101cd565b806301ffc9a7146101d257806306fdde031461020f578063081812fc1461023a575b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f49190612542565b610702565b604051610206919061258a565b60405180910390f35b34801561021b57600080fd5b50610224610794565b604051610231919061263e565b60405180910390f35b34801561024657600080fd5b50610261600480360381019061025c9190612696565b610826565b60405161026e9190612704565b60405180910390f35b34801561028357600080fd5b5061029e6004803603810190610299919061274b565b6108a2565b005b3480156102ac57600080fd5b506102b5610a48565b6040516102c2919061279a565b60405180910390f35b3480156102d757600080fd5b506102e0610a5f565b6040516102ed919061279a565b60405180910390f35b34801561030257600080fd5b5061030b610a65565b604051610318919061263e565b60405180910390f35b34801561032d57600080fd5b50610348600480360381019061034391906127b5565b610af3565b005b610352610b03565b005b34801561036057600080fd5b5061037b600480360381019061037691906127b5565b610bff565b005b34801561038957600080fd5b506103a4600480360381019061039f919061274b565b610c1f565b005b3480156103b257600080fd5b506103cd60048036038101906103c8919061293d565b610d00565b005b3480156103db57600080fd5b506103f660048036038101906103f19190612696565b610de6565b6040516104039190612704565b60405180910390f35b34801561041857600080fd5b50610433600480360381019061042e9190612986565b610df8565b604051610440919061279a565b60405180910390f35b34801561045557600080fd5b5061045e610eb0565b005b34801561046c57600080fd5b50610487600480360381019061048291906129df565b610f38565b005b34801561049557600080fd5b5061049e610fd1565b6040516104ab9190612704565b60405180910390f35b3480156104c057600080fd5b506104c9610ffb565b6040516104d6919061263e565b60405180910390f35b6104f960048036038101906104f49190612696565b61108d565b005b34801561050757600080fd5b50610522600480360381019061051d9190612a0c565b61128c565b005b34801561053057600080fd5b50610539611403565b604051610546919061258a565b60405180910390f35b34801561055b57600080fd5b5061057660048036038101906105719190612aed565b611416565b005b34801561058457600080fd5b5061059f600480360381019061059a91906129df565b611489565b005b3480156105ad57600080fd5b506105c860048036038101906105c39190612696565b611522565b6040516105d5919061263e565b60405180910390f35b3480156105ea57600080fd5b506105f3611645565b604051610600919061279a565b60405180910390f35b34801561061557600080fd5b5061061e61164a565b60405161062b919061258a565b60405180910390f35b34801561064057600080fd5b5061064961165d565b604051610656919061279a565b60405180910390f35b34801561066b57600080fd5b5061068660048036038101906106819190612b70565b611668565b604051610693919061258a565b60405180910390f35b3480156106a857600080fd5b506106c360048036038101906106be9190612986565b6116fc565b005b3480156106d157600080fd5b506106ec60048036038101906106e79190612986565b6117f3565b6040516106f9919061279a565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061075d57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061078d5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600280546107a390612bdf565b80601f01602080910402602001604051908101604052809291908181526020018280546107cf90612bdf565b801561081c5780601f106107f15761010080835404028352916020019161081c565b820191906000526020600020905b8154815290600101906020018083116107ff57829003601f168201915b5050505050905090565b60006108318261183c565b610867576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108ad8261189b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610914576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610933611967565b73ffffffffffffffffffffffffffffffffffffffff16146109965761095f8161095a611967565b611668565b610995576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610a5261196f565b6001546000540303905090565b6113b081565b600a8054610a7290612bdf565b80601f0160208091040260200160405190810160405280929190818152602001828054610a9e90612bdf565b8015610aeb5780601f10610ac057610100808354040283529160200191610aeb565b820191906000526020600020905b815481529060010190602001808311610ace57829003601f168201915b505050505081565b610afe838383611978565b505050565b610b0b611d1f565b73ffffffffffffffffffffffffffffffffffffffff16610b29610fd1565b73ffffffffffffffffffffffffffffffffffffffff1614610b7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7690612c5c565b60405180910390fd5b6000610b89610fd1565b73ffffffffffffffffffffffffffffffffffffffff1647604051610bac90612cad565b60006040518083038185875af1925050503d8060008114610be9576040519150601f19603f3d011682016040523d82523d6000602084013e610bee565b606091505b5050905080610bfc57600080fd5b50565b610c1a83838360405180602001604052806000815250611416565b505050565b610c27611d1f565b73ffffffffffffffffffffffffffffffffffffffff16610c45610fd1565b73ffffffffffffffffffffffffffffffffffffffff1614610c9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9290612c5c565b60405180910390fd5b6113b081610ca7611d27565b610cb19190612cf1565b1115610cf2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce990612d93565b60405180910390fd5b610cfc8282611d3a565b5050565b610d08611d1f565b73ffffffffffffffffffffffffffffffffffffffff16610d26610fd1565b73ffffffffffffffffffffffffffffffffffffffff1614610d7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7390612c5c565b60405180910390fd5b600860149054906101000a900460ff1615610dcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc390612e25565b60405180910390fd5b8060099080519060200190610de2929190612433565b5050565b6000610df18261189b565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e5f576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610eb8611d1f565b73ffffffffffffffffffffffffffffffffffffffff16610ed6610fd1565b73ffffffffffffffffffffffffffffffffffffffff1614610f2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2390612c5c565b60405180910390fd5b610f366000611d58565b565b610f40611d1f565b73ffffffffffffffffffffffffffffffffffffffff16610f5e610fd1565b73ffffffffffffffffffffffffffffffffffffffff1614610fb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fab90612c5c565b60405180910390fd5b80600860146101000a81548160ff02191690831515021790555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461100a90612bdf565b80601f016020809104026020016040519081016040528092919081815260200182805461103690612bdf565b80156110835780601f1061105857610100808354040283529160200191611083565b820191906000526020600020905b81548152906001019060200180831161106657829003601f168201915b5050505050905090565b600860159054906101000a900460ff16156110dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d490612e91565b60405180910390fd5b600f811115611121576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111890612f23565b60405180910390fd5b6113b08161112d611d27565b6111379190612cf1565b1115611178576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116f90612f8f565b60405180910390fd5b60008190506000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054036111d35780806111cf90612faf565b9150505b661c6bf526340000816111e69190612fd8565b341015611228576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121f9061307e565b60405180910390fd5b81600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546112779190612cf1565b925050819055506112883383611d3a565b5050565b611294611967565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036112f8576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611305611967565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166113b2611967565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516113f7919061258a565b60405180910390a35050565b600860159054906101000a900460ff1681565b611421848484611978565b60008373ffffffffffffffffffffffffffffffffffffffff163b146114835761144c84848484611e1e565b611482576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611491611d1f565b73ffffffffffffffffffffffffffffffffffffffff166114af610fd1565b73ffffffffffffffffffffffffffffffffffffffff1614611505576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fc90612c5c565b60405180910390fd5b80600860156101000a81548160ff02191690831515021790555050565b606061152d8261183c565b61156c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156390613110565b60405180910390fd5b6000611576611f6e565b511161160c57600a805461158990612bdf565b80601f01602080910402602001604051908101604052809291908181526020018280546115b590612bdf565b80156116025780601f106115d757610100808354040283529160200191611602565b820191906000526020600020905b8154815290600101906020018083116115e557829003601f168201915b505050505061163e565b611614611f6e565b61161d83612000565b60405160200161162e9291906131b8565b6040516020818303038152906040525b9050919050565b600f81565b600860149054906101000a900460ff1681565b661c6bf52634000081565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611704611d1f565b73ffffffffffffffffffffffffffffffffffffffff16611722610fd1565b73ffffffffffffffffffffffffffffffffffffffff1614611778576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176f90612c5c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036117e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117de90613259565b60405180910390fd5b6117f081611d58565b50565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60008161184761196f565b11158015611856575060005482105b8015611894575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600080829050806118aa61196f565b116119305760005481101561192f5760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082160361192d575b600081036119235760046000836001900393508381526020019081526020016000205490506118f9565b8092505050611962565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b60006001905090565b60006119838261189b565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146119ea576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611a0b611967565b73ffffffffffffffffffffffffffffffffffffffff161480611a3a5750611a3985611a34611967565b611668565b5b80611a7f5750611a48611967565b73ffffffffffffffffffffffffffffffffffffffff16611a6784610826565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611ab8576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611b1e576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b2b8585856001612160565b6006600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b611c2886612166565b1717600460008581526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000831603611cb05760006001840190506000600460008381526020019081526020016000205403611cae576000548114611cad578260046000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611d188585856001612170565b5050505050565b600033905090565b6000611d3161196f565b60005403905090565b611d54828260405180602001604052806000815250612176565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611e44611967565b8786866040518563ffffffff1660e01b8152600401611e6694939291906132ce565b6020604051808303816000875af1925050508015611ea257506040513d601f19601f82011682018060405250810190611e9f919061332f565b60015b611f1b573d8060008114611ed2576040519150601f19603f3d011682016040523d82523d6000602084013e611ed7565b606091505b506000815103611f13576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060098054611f7d90612bdf565b80601f0160208091040260200160405190810160405280929190818152602001828054611fa990612bdf565b8015611ff65780601f10611fcb57610100808354040283529160200191611ff6565b820191906000526020600020905b815481529060010190602001808311611fd957829003601f168201915b5050505050905090565b606060008203612047576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061215b565b600082905060005b600082146120795780806120629061335c565b915050600a8261207291906133d3565b915061204f565b60008167ffffffffffffffff81111561209557612094612812565b5b6040519080825280601f01601f1916602001820160405280156120c75781602001600182028036833780820191505090505b5090505b60008514612154576001826120e09190613404565b9150600a856120ef9190613438565b60306120fb9190612cf1565b60f81b81838151811061211157612110613469565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561214d91906133d3565b94506120cb565b8093505050505b919050565b50505050565b6000819050919050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036121e2576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000830361221c576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6122296000858386612160565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e161228e60018514612429565b901b60a042901b61229e86612166565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b146123a2575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46123526000878480600101955087611e1e565b612388576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082106122e357826000541461239d57600080fd5b61240d565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082106123a3575b8160008190555050506124236000858386612170565b50505050565b6000819050919050565b82805461243f90612bdf565b90600052602060002090601f01602090048101928261246157600085556124a8565b82601f1061247a57805160ff19168380011785556124a8565b828001600101855582156124a8579182015b828111156124a757825182559160200191906001019061248c565b5b5090506124b591906124b9565b5090565b5b808211156124d25760008160009055506001016124ba565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61251f816124ea565b811461252a57600080fd5b50565b60008135905061253c81612516565b92915050565b600060208284031215612558576125576124e0565b5b60006125668482850161252d565b91505092915050565b60008115159050919050565b6125848161256f565b82525050565b600060208201905061259f600083018461257b565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156125df5780820151818401526020810190506125c4565b838111156125ee576000848401525b50505050565b6000601f19601f8301169050919050565b6000612610826125a5565b61261a81856125b0565b935061262a8185602086016125c1565b612633816125f4565b840191505092915050565b600060208201905081810360008301526126588184612605565b905092915050565b6000819050919050565b61267381612660565b811461267e57600080fd5b50565b6000813590506126908161266a565b92915050565b6000602082840312156126ac576126ab6124e0565b5b60006126ba84828501612681565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006126ee826126c3565b9050919050565b6126fe816126e3565b82525050565b600060208201905061271960008301846126f5565b92915050565b612728816126e3565b811461273357600080fd5b50565b6000813590506127458161271f565b92915050565b60008060408385031215612762576127616124e0565b5b600061277085828601612736565b925050602061278185828601612681565b9150509250929050565b61279481612660565b82525050565b60006020820190506127af600083018461278b565b92915050565b6000806000606084860312156127ce576127cd6124e0565b5b60006127dc86828701612736565b93505060206127ed86828701612736565b92505060406127fe86828701612681565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61284a826125f4565b810181811067ffffffffffffffff8211171561286957612868612812565b5b80604052505050565b600061287c6124d6565b90506128888282612841565b919050565b600067ffffffffffffffff8211156128a8576128a7612812565b5b6128b1826125f4565b9050602081019050919050565b82818337600083830152505050565b60006128e06128db8461288d565b612872565b9050828152602081018484840111156128fc576128fb61280d565b5b6129078482856128be565b509392505050565b600082601f83011261292457612923612808565b5b81356129348482602086016128cd565b91505092915050565b600060208284031215612953576129526124e0565b5b600082013567ffffffffffffffff811115612971576129706124e5565b5b61297d8482850161290f565b91505092915050565b60006020828403121561299c5761299b6124e0565b5b60006129aa84828501612736565b91505092915050565b6129bc8161256f565b81146129c757600080fd5b50565b6000813590506129d9816129b3565b92915050565b6000602082840312156129f5576129f46124e0565b5b6000612a03848285016129ca565b91505092915050565b60008060408385031215612a2357612a226124e0565b5b6000612a3185828601612736565b9250506020612a42858286016129ca565b9150509250929050565b600067ffffffffffffffff821115612a6757612a66612812565b5b612a70826125f4565b9050602081019050919050565b6000612a90612a8b84612a4c565b612872565b905082815260208101848484011115612aac57612aab61280d565b5b612ab78482856128be565b509392505050565b600082601f830112612ad457612ad3612808565b5b8135612ae4848260208601612a7d565b91505092915050565b60008060008060808587031215612b0757612b066124e0565b5b6000612b1587828801612736565b9450506020612b2687828801612736565b9350506040612b3787828801612681565b925050606085013567ffffffffffffffff811115612b5857612b576124e5565b5b612b6487828801612abf565b91505092959194509250565b60008060408385031215612b8757612b866124e0565b5b6000612b9585828601612736565b9250506020612ba685828601612736565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612bf757607f821691505b602082108103612c0a57612c09612bb0565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612c466020836125b0565b9150612c5182612c10565b602082019050919050565b60006020820190508181036000830152612c7581612c39565b9050919050565b600081905092915050565b50565b6000612c97600083612c7c565b9150612ca282612c87565b600082019050919050565b6000612cb882612c8a565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612cfc82612660565b9150612d0783612660565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612d3c57612d3b612cc2565b5b828201905092915050565b7f536175646943616d656c733a204f766572206c696d6974000000000000000000600082015250565b6000612d7d6017836125b0565b9150612d8882612d47565b602082019050919050565b60006020820190508181036000830152612dac81612d70565b9050919050565b7f536175646943616d656c733a204d657461646174612069732066696e616c697a60008201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b6000612e0f6022836125b0565b9150612e1a82612db3565b604082019050919050565b60006020820190508181036000830152612e3e81612e02565b9050919050565b7f536175646943616d656c733a20486f6c64206f6e000000000000000000000000600082015250565b6000612e7b6014836125b0565b9150612e8682612e45565b602082019050919050565b60006020820190508181036000830152612eaa81612e6e565b9050919050565b7f536175646943616d656c733a20546f6f206d616e792063616d656c73206d696e60008201527f7465640000000000000000000000000000000000000000000000000000000000602082015250565b6000612f0d6023836125b0565b9150612f1882612eb1565b604082019050919050565b60006020820190508181036000830152612f3c81612f00565b9050919050565b7f536175646943616d656c733a20536f6c64206f75742e00000000000000000000600082015250565b6000612f796016836125b0565b9150612f8482612f43565b602082019050919050565b60006020820190508181036000830152612fa881612f6c565b9050919050565b6000612fba82612660565b915060008203612fcd57612fcc612cc2565b5b600182039050919050565b6000612fe382612660565b9150612fee83612660565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561302757613026612cc2565b5b828202905092915050565b7f536175646943616d656c733a2057726f6e67204554482076616c756500000000600082015250565b6000613068601c836125b0565b915061307382613032565b602082019050919050565b600060208201905081810360008301526130978161305b565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006130fa602f836125b0565b91506131058261309e565b604082019050919050565b60006020820190508181036000830152613129816130ed565b9050919050565b600081905092915050565b6000613146826125a5565b6131508185613130565b93506131608185602086016125c1565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b60006131a2600583613130565b91506131ad8261316c565b600582019050919050565b60006131c4828561313b565b91506131d0828461313b565b91506131db82613195565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006132436026836125b0565b915061324e826131e7565b604082019050919050565b6000602082019050818103600083015261327281613236565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006132a082613279565b6132aa8185613284565b93506132ba8185602086016125c1565b6132c3816125f4565b840191505092915050565b60006080820190506132e360008301876126f5565b6132f060208301866126f5565b6132fd604083018561278b565b818103606083015261330f8184613295565b905095945050505050565b60008151905061332981612516565b92915050565b600060208284031215613345576133446124e0565b5b60006133538482850161331a565b91505092915050565b600061336782612660565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361339957613398612cc2565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006133de82612660565b91506133e983612660565b9250826133f9576133f86133a4565b5b828204905092915050565b600061340f82612660565b915061341a83612660565b92508282101561342d5761342c612cc2565b5b828203905092915050565b600061344382612660565b915061344e83612660565b92508261345e5761345d6133a4565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea2646970667358221220280f5c764ac8e56dafd49e168f0ef2c8c72addb2e9de236c25d466dc9eff1dc964736f6c634300080e0033

Deployed Bytecode Sourcemap

44621:2991:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16176:647;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21611:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23891:216;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23301:510;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15132:339;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44719:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45006:96;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24855:194;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46062:161;;;:::i;:::-;;25134:209;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46235:257;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45623:182;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21378:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16901:236;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43683:111;;;;;;;;;;;;;:::i;:::-;;45506:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42972:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21802:112;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46927:668;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24193:324;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44926:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25428:440;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45958:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46504:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44768:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44879:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44813:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24602:172;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43966:213;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45817:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16176:647;16261:4;16596:10;16581:25;;:11;:25;;;;:106;;;;16677:10;16662:25;;:11;:25;;;;16581:106;:187;;;;16758:10;16743:25;;:11;:25;;;;16581:187;16557:211;;16176:647;;;:::o;21611:108::-;21665:13;21702:5;21695:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21611:108;:::o;23891:216::-;23959:7;23988:16;23996:7;23988;:16::i;:::-;23983:64;;24013:34;;;;;;;;;;;;;;23983:64;24071:15;:24;24087:7;24071:24;;;;;;;;;;;;;;;;;;;;;24064:31;;23891:216;;;:::o;23301:510::-;23378:13;23410:27;23429:7;23410:18;:27::i;:::-;23378:61;;23464:5;23458:11;;:2;:11;;;23454:48;;23478:24;;;;;;;;;;;;;;23454:48;23546:5;23523:28;;:19;:17;:19::i;:::-;:28;;;23519:187;;23575:44;23592:5;23599:19;:17;:19::i;:::-;23575:16;:44::i;:::-;23570:136;;23651:35;;;;;;;;;;;;;;23570:136;23519:187;23749:2;23722:15;:24;23738:7;23722:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;23791:7;23787:2;23771:28;;23780:5;23771:28;;;;;;;;;;;;23363:448;23301:510;;:::o;15132:339::-;15185:7;15429:15;:13;:15::i;:::-;15414:12;;15398:13;;:28;:46;15391:53;;15132:339;:::o;44719:38::-;44753:4;44719:38;:::o;45006:96::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;24855:194::-;25009:28;25019:4;25025:2;25029:7;25009:9;:28::i;:::-;24855:194;;;:::o;46062:161::-;43229:12;:10;:12::i;:::-;43218:23;;:7;:5;:7::i;:::-;:23;;;43210:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46120:7:::1;46141;:5;:7::i;:::-;46133:21;;46162;46133:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46119:69;;;46208:2;46200:11;;;::::0;::::1;;46107:116;46062:161::o:0;25134:209::-;25292:39;25309:4;25315:2;25319:7;25292:39;;;;;;;;;;;;:16;:39::i;:::-;25134:209;;;:::o;46235:257::-;43229:12;:10;:12::i;:::-;43218:23;;:7;:5;:7::i;:::-;:23;;;43210:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44753:4:::1;46361:5;46344:14;:12;:14::i;:::-;:22;;;;:::i;:::-;:36;;46318:121;;;;;;;;;;;;:::i;:::-;;;;;;;;;46454:26;46464:8;46474:5;46454:9;:26::i;:::-;46235:257:::0;;:::o;45623:182::-;43229:12;:10;:12::i;:::-;43218:23;;:7;:5;:7::i;:::-;:23;;;43210:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45701:16:::1;;;;;;;;;;;45700:17;45692:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;45790:3;45771:16;:22;;;;;;;;;;;;:::i;:::-;;45623:182:::0;:::o;21378:152::-;21442:7;21489:27;21508:7;21489:18;:27::i;:::-;21466:52;;21378:152;;;:::o;16901:236::-;16965:7;17010:1;16993:19;;:5;:19;;;16989:60;;17021:28;;;;;;;;;;;;;;16989:60;11821:13;17071:18;:25;17090:5;17071:25;;;;;;;;;;;;;;;;:54;17064:61;;16901:236;;;:::o;43683:111::-;43229:12;:10;:12::i;:::-;43218:23;;:7;:5;:7::i;:::-;:23;;;43210:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43752:30:::1;43779:1;43752:18;:30::i;:::-;43683:111::o:0;45506:105::-;43229:12;:10;:12::i;:::-;43218:23;;:7;:5;:7::i;:::-;:23;;;43210:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45594:5:::1;45575:16;;:24;;;;;;;;;;;;;;;;;;45506:105:::0;:::o;42972:95::-;43018:7;43049:6;;;;;;;;;;;43042:13;;42972:95;:::o;21802:112::-;21858:13;21895:7;21888:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21802:112;:::o;46927:668::-;46994:8;;;;;;;;;;;46993:9;46985:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;44800:2;47050:5;:17;;47042:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;44753:4;47146:5;47129:14;:12;:14::i;:::-;:22;;;;:::i;:::-;:36;;47121:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;47208:16;47227:5;47208:24;;47287:1;47250:21;:33;47272:10;47250:33;;;;;;;;;;;;;;;;:38;47247:91;;47309:13;;;;;:::i;:::-;;;;47247:91;44847:11;47393;:24;;;;:::i;:::-;47380:9;:37;;47354:127;;;;;;;;;;;;:::i;:::-;;;;;;;;;47535:5;47498:21;:33;47520:10;47498:33;;;;;;;;;;;;;;;;:42;;;;;;;:::i;:::-;;;;;;;;47555:28;47565:10;47577:5;47555:9;:28::i;:::-;46970:625;46927:668;:::o;24193:324::-;24308:19;:17;:19::i;:::-;24296:31;;:8;:31;;;24292:61;;24336:17;;;;;;;;;;;;;;24292:61;24422:8;24370:18;:39;24389:19;:17;:19::i;:::-;24370:39;;;;;;;;;;;;;;;:49;24410:8;24370:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;24486:8;24450:55;;24465:19;:17;:19::i;:::-;24450:55;;;24496:8;24450:55;;;;;;:::i;:::-;;;;;;;;24193:324;;:::o;44926:27::-;;;;;;;;;;;;;:::o;25428:440::-;25619:28;25629:4;25635:2;25639:7;25619:9;:28::i;:::-;25684:1;25666:2;:14;;;:19;25662:195;;25709:56;25740:4;25746:2;25750:7;25759:5;25709:30;:56::i;:::-;25704:153;;25797:40;;;;;;;;;;;;;;25704:153;25662:195;25428:440;;;;:::o;45958:92::-;43229:12;:10;:12::i;:::-;43218:23;;:7;:5;:7::i;:::-;:23;;;43210:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46033:5:::1;46022:8;;:16;;;;;;;;;;;;;;;;;;45958:92:::0;:::o;46504:411::-;46618:13;46665:16;46673:7;46665;:16::i;:::-;46657:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;46784:1;46763:10;:8;:10::i;:::-;46757:24;:28;:146;;46891:12;46757:146;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46830:10;:8;:10::i;:::-;46842:18;:7;:16;:18::i;:::-;46813:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;46757:146;46750:153;;46504:411;;;:::o;44768:34::-;44800:2;44768:34;:::o;44879:36::-;;;;;;;;;;;;;:::o;44813:45::-;44847:11;44813:45;:::o;24602:172::-;24699:4;24727:18;:25;24746:5;24727:25;;;;;;;;;;;;;;;:35;24753:8;24727:35;;;;;;;;;;;;;;;;;;;;;;;;;24720:42;;24602:172;;;;:::o;43966:213::-;43229:12;:10;:12::i;:::-;43218:23;;:7;:5;:7::i;:::-;:23;;;43210:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44079:1:::1;44059:22;;:8;:22;;::::0;44051:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;44139:28;44158:8;44139:18;:28::i;:::-;43966:213:::0;:::o;45817:127::-;45876:4;45904:21;:28;45926:5;45904:28;;;;;;;;;;;;;;;;45897:35;;45817:127;;;:::o;26149:293::-;26206:4;26270:7;26251:15;:13;:15::i;:::-;:26;;:70;;;;;26308:13;;26298:7;:23;26251:70;:160;;;;;26410:1;12639:8;26363:17;:26;26381:7;26363:26;;;;;;;;;;;;:43;:48;26251:160;26227:184;;26149:293;;;:::o;18680:1221::-;18747:7;18771:12;18786:7;18771:22;;18862:4;18843:15;:13;:15::i;:::-;:23;18839:983;;18900:13;;18893:4;:20;18889:933;;;18942:14;18959:17;:23;18977:4;18959:23;;;;;;;;;;;;18942:40;;19083:1;12639:8;19056:6;:23;:28;19052:747;;19607:121;19624:1;19614:6;:11;19607:121;;19671:17;:25;19689:6;;;;;;;19671:25;;;;;;;;;;;;19662:34;;19607:121;;;19765:6;19758:13;;;;;;19052:747;18915:907;18889:933;18839:983;19858:31;;;;;;;;;;;;;;18680:1221;;;;:::o;39732:113::-;39792:7;39823:10;39816:17;;39732:113;:::o;45396:98::-;45453:4;45481:1;45474:8;;45396:98;:::o;31854:2699::-;31989:27;32019;32038:7;32019:18;:27::i;:::-;31989:57;;32108:4;32067:45;;32083:19;32067:45;;;32063:86;;32121:28;;;;;;;;;;;;;;32063:86;32166:22;32215:4;32192:27;;:19;:17;:19::i;:::-;:27;;;:91;;;;32240:43;32257:4;32263:19;:17;:19::i;:::-;32240:16;:43::i;:::-;32192:91;:155;;;;32328:19;:17;:19::i;:::-;32304:43;;:20;32316:7;32304:11;:20::i;:::-;:43;;;32192:155;32166:182;;32370:17;32365:66;;32396:35;;;;;;;;;;;;;;32365:66;32464:1;32450:16;;:2;:16;;;32446:52;;32475:23;;;;;;;;;;;;;;32446:52;32515:43;32537:4;32543:2;32547:7;32556:1;32515:21;:43::i;:::-;32639:15;:24;32655:7;32639:24;;;;;;;;;;;;32632:31;;;;;;;;;;;33055:18;:24;33074:4;33055:24;;;;;;;;;;;;;;;;33053:26;;;;;;;;;;;;33128:18;:22;33147:2;33128:22;;;;;;;;;;;;;;;;33126:24;;;;;;;;;;;12941:8;12515:3;33541:15;:41;;33495:21;33513:2;33495:17;:21::i;:::-;:88;:136;33445:17;:26;33463:7;33445:26;;;;;;;;;;;:186;;;;33809:1;12941:8;33759:19;:46;:51;33755:666;;33835:19;33867:1;33857:7;:11;33835:33;;34032:1;33998:17;:30;34016:11;33998:30;;;;;;;;;;;;:35;33994:408;;34144:13;;34129:11;:28;34125:254;;34332:19;34299:17;:30;34317:11;34299:30;;;;;;;;;;;:52;;;;34125:254;33994:408;33812:609;33755:666;34476:7;34472:2;34457:27;;34466:4;34457:27;;;;;;;;;;;;34499:42;34520:4;34526:2;34530:7;34539:1;34499:20;:42::i;:::-;31974:2579;;31854:2699;;;:::o;41574:106::-;41627:7;41658:10;41651:17;;41574:106;:::o;15583:309::-;15630:7;15850:15;:13;:15::i;:::-;15834:13;;:31;15827:38;;15583:309;:::o;26540:112::-;26613:27;26623:2;26627:8;26613:27;;;;;;;;;;;;:9;:27::i;:::-;26540:112;;:::o;44356:207::-;44434:16;44453:6;;;;;;;;;;;44434:25;;44483:8;44474:6;;:17;;;;;;;;;;;;;;;;;;44542:8;44511:40;;44532:8;44511:40;;;;;;;;;;;;44419:144;44356:207;:::o;38547:792::-;38730:4;38780:2;38755:45;;;38801:19;:17;:19::i;:::-;38822:4;38828:7;38837:5;38755:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;38751:577;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39075:1;39058:6;:13;:18;39054:259;;39108:40;;;;;;;;;;;;;;39054:259;39263:6;39257:13;39248:6;39244:2;39240:15;39233:38;38751:577;38936:54;;;38926:64;;;:6;:64;;;;38919:71;;;38547:792;;;;;;:::o;45267:117::-;45319:13;45356:16;45349:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45267:117;:::o;325:673::-;381:13;497:1;488:5;:10;484:61;;519:10;;;;;;;;;;;;;;;;;;;;;484:61;559:12;574:5;559:20;;594:14;623:90;638:1;630:4;:9;623:90;;660:8;;;;;:::i;:::-;;;;695:2;687:10;;;;;:::i;:::-;;;623:90;;;727:19;759:6;749:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;727:39;;781:170;797:1;788:5;:10;781:170;;829:1;819:11;;;;;:::i;:::-;;;900:2;892:5;:10;;;;:::i;:::-;879:2;:24;;;;:::i;:::-;866:39;;849:6;856;849:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;933:2;924:11;;;;;:::i;:::-;;;781:170;;;979:6;965:21;;;;;325:673;;;;:::o;39351:179::-;;;;;:::o;22802:164::-;22866:14;22935:5;22925:15;;22802:164;;;:::o;39542:178::-;;;;;:::o;27063:2424::-;27206:20;27229:13;;27206:36;;27275:1;27261:16;;:2;:16;;;27257:48;;27286:19;;;;;;;;;;;;;;27257:48;27336:1;27324:8;:13;27320:44;;27346:18;;;;;;;;;;;;;;27320:44;27381:61;27411:1;27415:2;27419:12;27433:8;27381:21;:61::i;:::-;28025:1;11966:2;27996:1;:25;;27995:31;27983:8;:44;27957:18;:22;27976:2;27957:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;12798:3;28462:29;28489:1;28477:8;:13;28462:14;:29::i;:::-;:56;;12515:3;28395:15;:41;;28349:21;28367:2;28349:17;:21::i;:::-;:88;:170;28294:17;:31;28312:12;28294:31;;;;;;;;;;;:225;;;;28540:20;28563:12;28540:35;;28594:11;28623:8;28608:12;:23;28594:37;;28674:1;28656:2;:14;;;:19;28652:687;;28700:333;28760:12;28756:2;28735:38;;28752:1;28735:38;;;;;;;;;;;;28805:69;28844:1;28848:2;28852:14;;;;;;28868:5;28805:30;:69::i;:::-;28800:182;;28914:40;;;;;;;;;;;;;;28800:182;29028:3;29013:12;:18;28700:333;;29122:12;29105:13;;:29;29101:43;;29136:8;;;29101:43;28652:687;;;29193:127;29253:14;;;;;;29249:2;29228:40;;29245:1;29228:40;;;;;;;;;;;;29315:3;29300:12;:18;29193:127;;28652:687;29373:12;29357:13;:28;;;;27710:1691;;29415:60;29444:1;29448:2;29452:12;29466:8;29415:20;:60::i;:::-;27191:2296;27063:2424;;;:::o;23067:158::-;23125:14;23194:5;23184:15;;23067:158;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:117::-;6024:1;6021;6014:12;6038:117;6147:1;6144;6137:12;6161:180;6209:77;6206:1;6199:88;6306:4;6303:1;6296:15;6330:4;6327:1;6320:15;6347:281;6430:27;6452:4;6430:27;:::i;:::-;6422:6;6418:40;6560:6;6548:10;6545:22;6524:18;6512:10;6509:34;6506:62;6503:88;;;6571:18;;:::i;:::-;6503:88;6611:10;6607:2;6600:22;6390:238;6347:281;;:::o;6634:129::-;6668:6;6695:20;;:::i;:::-;6685:30;;6724:33;6752:4;6744:6;6724:33;:::i;:::-;6634:129;;;:::o;6769:308::-;6831:4;6921:18;6913:6;6910:30;6907:56;;;6943:18;;:::i;:::-;6907:56;6981:29;7003:6;6981:29;:::i;:::-;6973:37;;7065:4;7059;7055:15;7047:23;;6769:308;;;:::o;7083:154::-;7167:6;7162:3;7157;7144:30;7229:1;7220:6;7215:3;7211:16;7204:27;7083:154;;;:::o;7243:412::-;7321:5;7346:66;7362:49;7404:6;7362:49;:::i;:::-;7346:66;:::i;:::-;7337:75;;7435:6;7428:5;7421:21;7473:4;7466:5;7462:16;7511:3;7502:6;7497:3;7493:16;7490:25;7487:112;;;7518:79;;:::i;:::-;7487:112;7608:41;7642:6;7637:3;7632;7608:41;:::i;:::-;7327:328;7243:412;;;;;:::o;7675:340::-;7731:5;7780:3;7773:4;7765:6;7761:17;7757:27;7747:122;;7788:79;;:::i;:::-;7747:122;7905:6;7892:20;7930:79;8005:3;7997:6;7990:4;7982:6;7978:17;7930:79;:::i;:::-;7921:88;;7737:278;7675:340;;;;:::o;8021:509::-;8090:6;8139:2;8127:9;8118:7;8114:23;8110:32;8107:119;;;8145:79;;:::i;:::-;8107:119;8293:1;8282:9;8278:17;8265:31;8323:18;8315:6;8312:30;8309:117;;;8345:79;;:::i;:::-;8309:117;8450:63;8505:7;8496:6;8485:9;8481:22;8450:63;:::i;:::-;8440:73;;8236:287;8021:509;;;;:::o;8536:329::-;8595:6;8644:2;8632:9;8623:7;8619:23;8615:32;8612:119;;;8650:79;;:::i;:::-;8612:119;8770:1;8795:53;8840:7;8831:6;8820:9;8816:22;8795:53;:::i;:::-;8785:63;;8741:117;8536:329;;;;:::o;8871:116::-;8941:21;8956:5;8941:21;:::i;:::-;8934:5;8931:32;8921:60;;8977:1;8974;8967:12;8921:60;8871:116;:::o;8993:133::-;9036:5;9074:6;9061:20;9052:29;;9090:30;9114:5;9090:30;:::i;:::-;8993:133;;;;:::o;9132:323::-;9188:6;9237:2;9225:9;9216:7;9212:23;9208:32;9205:119;;;9243:79;;:::i;:::-;9205:119;9363:1;9388:50;9430:7;9421:6;9410:9;9406:22;9388:50;:::i;:::-;9378:60;;9334:114;9132:323;;;;:::o;9461:468::-;9526:6;9534;9583:2;9571:9;9562:7;9558:23;9554:32;9551:119;;;9589:79;;:::i;:::-;9551:119;9709:1;9734:53;9779:7;9770:6;9759:9;9755:22;9734:53;:::i;:::-;9724:63;;9680:117;9836:2;9862:50;9904:7;9895:6;9884:9;9880:22;9862:50;:::i;:::-;9852:60;;9807:115;9461:468;;;;;:::o;9935:307::-;9996:4;10086:18;10078:6;10075:30;10072:56;;;10108:18;;:::i;:::-;10072:56;10146:29;10168:6;10146:29;:::i;:::-;10138:37;;10230:4;10224;10220:15;10212:23;;9935:307;;;:::o;10248:410::-;10325:5;10350:65;10366:48;10407:6;10366:48;:::i;:::-;10350:65;:::i;:::-;10341:74;;10438:6;10431:5;10424:21;10476:4;10469:5;10465:16;10514:3;10505:6;10500:3;10496:16;10493:25;10490:112;;;10521:79;;:::i;:::-;10490:112;10611:41;10645:6;10640:3;10635;10611:41;:::i;:::-;10331:327;10248:410;;;;;:::o;10677:338::-;10732:5;10781:3;10774:4;10766:6;10762:17;10758:27;10748:122;;10789:79;;:::i;:::-;10748:122;10906:6;10893:20;10931:78;11005:3;10997:6;10990:4;10982:6;10978:17;10931:78;:::i;:::-;10922:87;;10738:277;10677:338;;;;:::o;11021:943::-;11116:6;11124;11132;11140;11189:3;11177:9;11168:7;11164:23;11160:33;11157:120;;;11196:79;;:::i;:::-;11157:120;11316:1;11341:53;11386:7;11377:6;11366:9;11362:22;11341:53;:::i;:::-;11331:63;;11287:117;11443:2;11469:53;11514:7;11505:6;11494:9;11490:22;11469:53;:::i;:::-;11459:63;;11414:118;11571:2;11597:53;11642:7;11633:6;11622:9;11618:22;11597:53;:::i;:::-;11587:63;;11542:118;11727:2;11716:9;11712:18;11699:32;11758:18;11750:6;11747:30;11744:117;;;11780:79;;:::i;:::-;11744:117;11885:62;11939:7;11930:6;11919:9;11915:22;11885:62;:::i;:::-;11875:72;;11670:287;11021:943;;;;;;;:::o;11970:474::-;12038:6;12046;12095:2;12083:9;12074:7;12070:23;12066:32;12063:119;;;12101:79;;:::i;:::-;12063:119;12221:1;12246:53;12291:7;12282:6;12271:9;12267:22;12246:53;:::i;:::-;12236:63;;12192:117;12348:2;12374:53;12419:7;12410:6;12399:9;12395:22;12374:53;:::i;:::-;12364:63;;12319:118;11970:474;;;;;:::o;12450:180::-;12498:77;12495:1;12488:88;12595:4;12592:1;12585:15;12619:4;12616:1;12609:15;12636:320;12680:6;12717:1;12711:4;12707:12;12697:22;;12764:1;12758:4;12754:12;12785:18;12775:81;;12841:4;12833:6;12829:17;12819:27;;12775:81;12903:2;12895:6;12892:14;12872:18;12869:38;12866:84;;12922:18;;:::i;:::-;12866:84;12687:269;12636:320;;;:::o;12962:182::-;13102:34;13098:1;13090:6;13086:14;13079:58;12962:182;:::o;13150:366::-;13292:3;13313:67;13377:2;13372:3;13313:67;:::i;:::-;13306:74;;13389:93;13478:3;13389:93;:::i;:::-;13507:2;13502:3;13498:12;13491:19;;13150:366;;;:::o;13522:419::-;13688:4;13726:2;13715:9;13711:18;13703:26;;13775:9;13769:4;13765:20;13761:1;13750:9;13746:17;13739:47;13803:131;13929:4;13803:131;:::i;:::-;13795:139;;13522:419;;;:::o;13947:147::-;14048:11;14085:3;14070:18;;13947:147;;;;:::o;14100:114::-;;:::o;14220:398::-;14379:3;14400:83;14481:1;14476:3;14400:83;:::i;:::-;14393:90;;14492:93;14581:3;14492:93;:::i;:::-;14610:1;14605:3;14601:11;14594:18;;14220:398;;;:::o;14624:379::-;14808:3;14830:147;14973:3;14830:147;:::i;:::-;14823:154;;14994:3;14987:10;;14624:379;;;:::o;15009:180::-;15057:77;15054:1;15047:88;15154:4;15151:1;15144:15;15178:4;15175:1;15168:15;15195:305;15235:3;15254:20;15272:1;15254:20;:::i;:::-;15249:25;;15288:20;15306:1;15288:20;:::i;:::-;15283:25;;15442:1;15374:66;15370:74;15367:1;15364:81;15361:107;;;15448:18;;:::i;:::-;15361:107;15492:1;15489;15485:9;15478:16;;15195:305;;;;:::o;15506:173::-;15646:25;15642:1;15634:6;15630:14;15623:49;15506:173;:::o;15685:366::-;15827:3;15848:67;15912:2;15907:3;15848:67;:::i;:::-;15841:74;;15924:93;16013:3;15924:93;:::i;:::-;16042:2;16037:3;16033:12;16026:19;;15685:366;;;:::o;16057:419::-;16223:4;16261:2;16250:9;16246:18;16238:26;;16310:9;16304:4;16300:20;16296:1;16285:9;16281:17;16274:47;16338:131;16464:4;16338:131;:::i;:::-;16330:139;;16057:419;;;:::o;16482:221::-;16622:34;16618:1;16610:6;16606:14;16599:58;16691:4;16686:2;16678:6;16674:15;16667:29;16482:221;:::o;16709:366::-;16851:3;16872:67;16936:2;16931:3;16872:67;:::i;:::-;16865:74;;16948:93;17037:3;16948:93;:::i;:::-;17066:2;17061:3;17057:12;17050:19;;16709:366;;;:::o;17081:419::-;17247:4;17285:2;17274:9;17270:18;17262:26;;17334:9;17328:4;17324:20;17320:1;17309:9;17305:17;17298:47;17362:131;17488:4;17362:131;:::i;:::-;17354:139;;17081:419;;;:::o;17506:170::-;17646:22;17642:1;17634:6;17630:14;17623:46;17506:170;:::o;17682:366::-;17824:3;17845:67;17909:2;17904:3;17845:67;:::i;:::-;17838:74;;17921:93;18010:3;17921:93;:::i;:::-;18039:2;18034:3;18030:12;18023:19;;17682:366;;;:::o;18054:419::-;18220:4;18258:2;18247:9;18243:18;18235:26;;18307:9;18301:4;18297:20;18293:1;18282:9;18278:17;18271:47;18335:131;18461:4;18335:131;:::i;:::-;18327:139;;18054:419;;;:::o;18479:222::-;18619:34;18615:1;18607:6;18603:14;18596:58;18688:5;18683:2;18675:6;18671:15;18664:30;18479:222;:::o;18707:366::-;18849:3;18870:67;18934:2;18929:3;18870:67;:::i;:::-;18863:74;;18946:93;19035:3;18946:93;:::i;:::-;19064:2;19059:3;19055:12;19048:19;;18707:366;;;:::o;19079:419::-;19245:4;19283:2;19272:9;19268:18;19260:26;;19332:9;19326:4;19322:20;19318:1;19307:9;19303:17;19296:47;19360:131;19486:4;19360:131;:::i;:::-;19352:139;;19079:419;;;:::o;19504:172::-;19644:24;19640:1;19632:6;19628:14;19621:48;19504:172;:::o;19682:366::-;19824:3;19845:67;19909:2;19904:3;19845:67;:::i;:::-;19838:74;;19921:93;20010:3;19921:93;:::i;:::-;20039:2;20034:3;20030:12;20023:19;;19682:366;;;:::o;20054:419::-;20220:4;20258:2;20247:9;20243:18;20235:26;;20307:9;20301:4;20297:20;20293:1;20282:9;20278:17;20271:47;20335:131;20461:4;20335:131;:::i;:::-;20327:139;;20054:419;;;:::o;20479:171::-;20518:3;20541:24;20559:5;20541:24;:::i;:::-;20532:33;;20587:4;20580:5;20577:15;20574:41;;20595:18;;:::i;:::-;20574:41;20642:1;20635:5;20631:13;20624:20;;20479:171;;;:::o;20656:348::-;20696:7;20719:20;20737:1;20719:20;:::i;:::-;20714:25;;20753:20;20771:1;20753:20;:::i;:::-;20748:25;;20941:1;20873:66;20869:74;20866:1;20863:81;20858:1;20851:9;20844:17;20840:105;20837:131;;;20948:18;;:::i;:::-;20837:131;20996:1;20993;20989:9;20978:20;;20656:348;;;;:::o;21010:178::-;21150:30;21146:1;21138:6;21134:14;21127:54;21010:178;:::o;21194:366::-;21336:3;21357:67;21421:2;21416:3;21357:67;:::i;:::-;21350:74;;21433:93;21522:3;21433:93;:::i;:::-;21551:2;21546:3;21542:12;21535:19;;21194:366;;;:::o;21566:419::-;21732:4;21770:2;21759:9;21755:18;21747:26;;21819:9;21813:4;21809:20;21805:1;21794:9;21790:17;21783:47;21847:131;21973:4;21847:131;:::i;:::-;21839:139;;21566:419;;;:::o;21991:234::-;22131:34;22127:1;22119:6;22115:14;22108:58;22200:17;22195:2;22187:6;22183:15;22176:42;21991:234;:::o;22231:366::-;22373:3;22394:67;22458:2;22453:3;22394:67;:::i;:::-;22387:74;;22470:93;22559:3;22470:93;:::i;:::-;22588:2;22583:3;22579:12;22572:19;;22231:366;;;:::o;22603:419::-;22769:4;22807:2;22796:9;22792:18;22784:26;;22856:9;22850:4;22846:20;22842:1;22831:9;22827:17;22820:47;22884:131;23010:4;22884:131;:::i;:::-;22876:139;;22603:419;;;:::o;23028:148::-;23130:11;23167:3;23152:18;;23028:148;;;;:::o;23182:377::-;23288:3;23316:39;23349:5;23316:39;:::i;:::-;23371:89;23453:6;23448:3;23371:89;:::i;:::-;23364:96;;23469:52;23514:6;23509:3;23502:4;23495:5;23491:16;23469:52;:::i;:::-;23546:6;23541:3;23537:16;23530:23;;23292:267;23182:377;;;;:::o;23565:155::-;23705:7;23701:1;23693:6;23689:14;23682:31;23565:155;:::o;23726:400::-;23886:3;23907:84;23989:1;23984:3;23907:84;:::i;:::-;23900:91;;24000:93;24089:3;24000:93;:::i;:::-;24118:1;24113:3;24109:11;24102:18;;23726:400;;;:::o;24132:701::-;24413:3;24435:95;24526:3;24517:6;24435:95;:::i;:::-;24428:102;;24547:95;24638:3;24629:6;24547:95;:::i;:::-;24540:102;;24659:148;24803:3;24659:148;:::i;:::-;24652:155;;24824:3;24817:10;;24132:701;;;;;:::o;24839:225::-;24979:34;24975:1;24967:6;24963:14;24956:58;25048:8;25043:2;25035:6;25031:15;25024:33;24839:225;:::o;25070:366::-;25212:3;25233:67;25297:2;25292:3;25233:67;:::i;:::-;25226:74;;25309:93;25398:3;25309:93;:::i;:::-;25427:2;25422:3;25418:12;25411:19;;25070:366;;;:::o;25442:419::-;25608:4;25646:2;25635:9;25631:18;25623:26;;25695:9;25689:4;25685:20;25681:1;25670:9;25666:17;25659:47;25723:131;25849:4;25723:131;:::i;:::-;25715:139;;25442:419;;;:::o;25867:98::-;25918:6;25952:5;25946:12;25936:22;;25867:98;;;:::o;25971:168::-;26054:11;26088:6;26083:3;26076:19;26128:4;26123:3;26119:14;26104:29;;25971:168;;;;:::o;26145:360::-;26231:3;26259:38;26291:5;26259:38;:::i;:::-;26313:70;26376:6;26371:3;26313:70;:::i;:::-;26306:77;;26392:52;26437:6;26432:3;26425:4;26418:5;26414:16;26392:52;:::i;:::-;26469:29;26491:6;26469:29;:::i;:::-;26464:3;26460:39;26453:46;;26235:270;26145:360;;;;:::o;26511:640::-;26706:4;26744:3;26733:9;26729:19;26721:27;;26758:71;26826:1;26815:9;26811:17;26802:6;26758:71;:::i;:::-;26839:72;26907:2;26896:9;26892:18;26883:6;26839:72;:::i;:::-;26921;26989:2;26978:9;26974:18;26965:6;26921:72;:::i;:::-;27040:9;27034:4;27030:20;27025:2;27014:9;27010:18;27003:48;27068:76;27139:4;27130:6;27068:76;:::i;:::-;27060:84;;26511:640;;;;;;;:::o;27157:141::-;27213:5;27244:6;27238:13;27229:22;;27260:32;27286:5;27260:32;:::i;:::-;27157:141;;;;:::o;27304:349::-;27373:6;27422:2;27410:9;27401:7;27397:23;27393:32;27390:119;;;27428:79;;:::i;:::-;27390:119;27548:1;27573:63;27628:7;27619:6;27608:9;27604:22;27573:63;:::i;:::-;27563:73;;27519:127;27304:349;;;;:::o;27659:233::-;27698:3;27721:24;27739:5;27721:24;:::i;:::-;27712:33;;27767:66;27760:5;27757:77;27754:103;;27837:18;;:::i;:::-;27754:103;27884:1;27877:5;27873:13;27866:20;;27659:233;;;:::o;27898:180::-;27946:77;27943:1;27936:88;28043:4;28040:1;28033:15;28067:4;28064:1;28057:15;28084:185;28124:1;28141:20;28159:1;28141:20;:::i;:::-;28136:25;;28175:20;28193:1;28175:20;:::i;:::-;28170:25;;28214:1;28204:35;;28219:18;;:::i;:::-;28204:35;28261:1;28258;28254:9;28249:14;;28084:185;;;;:::o;28275:191::-;28315:4;28335:20;28353:1;28335:20;:::i;:::-;28330:25;;28369:20;28387:1;28369:20;:::i;:::-;28364:25;;28408:1;28405;28402:8;28399:34;;;28413:18;;:::i;:::-;28399:34;28458:1;28455;28451:9;28443:17;;28275:191;;;;:::o;28472:176::-;28504:1;28521:20;28539:1;28521:20;:::i;:::-;28516:25;;28555:20;28573:1;28555:20;:::i;:::-;28550:25;;28594:1;28584:35;;28599:18;;:::i;:::-;28584:35;28640:1;28637;28633:9;28628:14;;28472:176;;;;:::o;28654:180::-;28702:77;28699:1;28692:88;28799:4;28796:1;28789:15;28823:4;28820:1;28813:15

Swarm Source

ipfs://280f5c764ac8e56dafd49e168f0ef2c8c72addb2e9de236c25d466dc9eff1dc9
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.