ETH Price: $2,433.87 (-2.20%)

Token

AEB Figure Collection (AEBF)
 

Overview

Max Total Supply

82 AEBF

Holders

49

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
goririder.eth
0x059576e052fda76df317771ffdfb6663d1509e04
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:
AEBF

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-09-07
*/

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

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


// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;


/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        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: @openzeppelin/contracts/utils/Address.sol


// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // Look for revert reason and bubble it up if present
        if (returndata.length > 0) {
            // The easiest way to bubble the revert reason is using memory via assembly
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

// File: @openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)

pragma solidity ^0.8.0;


/**
 * @dev _Available since v3.1._
 */
interface IERC1155Receiver is IERC165 {
    /**
     * @dev Handles the receipt of a single ERC1155 token type. This function is
     * called at the end of a `safeTransferFrom` after the balance has been updated.
     *
     * NOTE: To accept the transfer, this must return
     * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
     * (i.e. 0xf23a6e61, or its own function selector).
     *
     * @param operator The address which initiated the transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param id The ID of the token being transferred
     * @param value The amount of tokens being transferred
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
     */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external returns (bytes4);

    /**
     * @dev Handles the receipt of a multiple ERC1155 token types. This function
     * is called at the end of a `safeBatchTransferFrom` after the balances have
     * been updated.
     *
     * NOTE: To accept the transfer(s), this must return
     * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
     * (i.e. 0xbc197c81, or its own function selector).
     *
     * @param operator The address which initiated the batch transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param ids An array containing ids of each token being transferred (order and length must match values array)
     * @param values An array containing amounts of each token being transferred (order and length must match ids array)
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
     */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external returns (bytes4);
}

// File: @openzeppelin/contracts/token/ERC1155/IERC1155.sol


// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/IERC1155.sol)

pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC1155 compliant contract, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1155[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155 is IERC165 {
    /**
     * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
     */
    event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);

    /**
     * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
     * transfers.
     */
    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] ids,
        uint256[] values
    );

    /**
     * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
     * `approved`.
     */
    event ApprovalForAll(address indexed account, address indexed operator, bool approved);

    /**
     * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
     *
     * If an {URI} event was emitted for `id`, the standard
     * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
     * returned by {IERC1155MetadataURI-uri}.
     */
    event URI(string value, uint256 indexed id);

    /**
     * @dev Returns the amount of tokens of token type `id` owned by `account`.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) external view returns (uint256);

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
        external
        view
        returns (uint256[] memory);

    /**
     * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
     *
     * Emits an {ApprovalForAll} event.
     *
     * Requirements:
     *
     * - `operator` cannot be the caller.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address account, address operator) external view returns (bool);

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes calldata data
    ) external;

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) external;
}

// File: @openzeppelin/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol)

pragma solidity ^0.8.0;


/**
 * @dev Interface of the optional ERC1155MetadataExtension interface, as defined
 * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155MetadataURI is IERC1155 {
    /**
     * @dev Returns the URI for token type `id`.
     *
     * If the `\{id\}` substring is present in the URI, it must be replaced by
     * clients with the actual token type ID.
     */
    function uri(uint256 id) external view returns (string memory);
}

// File: @openzeppelin/contracts/token/ERC1155/ERC1155.sol


// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC1155/ERC1155.sol)

pragma solidity ^0.8.0;







/**
 * @dev Implementation of the basic standard multi-token.
 * See https://eips.ethereum.org/EIPS/eip-1155
 * Originally based on code by Enjin: https://github.com/enjin/erc-1155
 *
 * _Available since v3.1._
 */
contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {
    using Address for address;

    // Mapping from token ID to account balances
    mapping(uint256 => mapping(address => uint256)) internal _balances;

    // Mapping from account to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json
    string private _uri;

    /**
     * @dev See {_setURI}.
     */
    constructor(string memory uri_) {
        _setURI(uri_);
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC1155).interfaceId ||
            interfaceId == type(IERC1155MetadataURI).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC1155MetadataURI-uri}.
     *
     * This implementation returns the same URI for *all* token types. It relies
     * on the token type ID substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * Clients calling this function must replace the `\{id\}` substring with the
     * actual token type ID.
     */
    function uri(uint256) public view virtual override returns (string memory) {
        return _uri;
    }

    /**
     * @dev See {IERC1155-balanceOf}.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) public view virtual override returns (uint256) {
        require(account != address(0), "ERC1155: address zero is not a valid owner");
        return _balances[id][account];
    }

    /**
     * @dev See {IERC1155-balanceOfBatch}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] memory accounts, uint256[] memory ids)
        public
        view
        virtual
        override
        returns (uint256[] memory)
    {
        require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch");

        uint256[] memory batchBalances = new uint256[](accounts.length);

        for (uint256 i = 0; i < accounts.length; ++i) {
            batchBalances[i] = balanceOf(accounts[i], ids[i]);
        }

        return batchBalances;
    }

    /**
     * @dev See {IERC1155-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC1155-isApprovedForAll}.
     */
    function isApprovedForAll(address account, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[account][operator];
    }

    /**
     * @dev See {IERC1155-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not token owner or approved"
        );
        _safeTransferFrom(from, to, id, amount, data);
    }

    /**
     * @dev See {IERC1155-safeBatchTransferFrom}.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not token owner or approved"
        );
        _safeBatchTransferFrom(from, to, ids, amounts, data);
    }

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }
        _balances[id][to] += amount;

        emit TransferSingle(operator, from, to, id, amount);

        _afterTokenTransfer(operator, from, to, ids, amounts, data);

        _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; ++i) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
            _balances[id][to] += amount;
        }

        emit TransferBatch(operator, from, to, ids, amounts);

        _afterTokenTransfer(operator, from, to, ids, amounts, data);

        _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data);
    }

    /**
     * @dev Sets a new URI for all token types, by relying on the token type ID
     * substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * By this mechanism, any occurrence of the `\{id\}` substring in either the
     * URI or any of the amounts in the JSON file at said URI will be replaced by
     * clients with the token type ID.
     *
     * For example, the `https://token-cdn-domain/\{id\}.json` URI would be
     * interpreted by clients as
     * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json`
     * for token type ID 0x4cce0.
     *
     * See {uri}.
     *
     * Because these URIs cannot be meaningfully represented by the {URI} event,
     * this function emits no events.
     */
    function _setURI(string memory newuri) internal virtual {
        _uri = newuri;
    }

    /**
     * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _mint(
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        _balances[id][to] += amount;
        emit TransferSingle(operator, address(0), to, id, amount);

        _afterTokenTransfer(operator, address(0), to, ids, amounts, data);

        _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _mintBatch(
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; i++) {
            _balances[ids[i]][to] += amounts[i];
        }

        emit TransferBatch(operator, address(0), to, ids, amounts);

        _afterTokenTransfer(operator, address(0), to, ids, amounts, data);

        _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data);
    }

    /**
     * @dev Destroys `amount` tokens of token type `id` from `from`
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `from` must have at least `amount` tokens of token type `id`.
     */
    function _burn(
        address from,
        uint256 id,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }

        emit TransferSingle(operator, from, address(0), id, amount);

        _afterTokenTransfer(operator, from, address(0), ids, amounts, "");
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     */
    function _burnBatch(
        address from,
        uint256[] memory ids,
        uint256[] memory amounts
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

        for (uint256 i = 0; i < ids.length; i++) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
        }

        emit TransferBatch(operator, from, address(0), ids, amounts);

        _afterTokenTransfer(operator, from, address(0), ids, amounts, "");
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits an {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC1155: setting approval status for self");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `ids` and `amounts` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    /**
     * @dev Hook that is called after any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `id` and `amount` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    function _doSafeTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) {
                if (response != IERC1155Receiver.onERC1155Received.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non-ERC1155Receiver implementer");
            }
        }
    }

    function _doSafeBatchTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns (
                bytes4 response
            ) {
                if (response != IERC1155Receiver.onERC1155BatchReceived.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non-ERC1155Receiver implementer");
            }
        }
    }

    function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) {
        uint256[] memory array = new uint256[](1);
        array[0] = element;

        return array;
    }
}

// File: @openzeppelin/contracts/utils/math/Math.sol


// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)

pragma solidity ^0.8.0;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    enum Rounding {
        Down, // Toward negative infinity
        Up, // Toward infinity
        Zero // Toward zero
    }

    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a > b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a == 0 ? 0 : (a - 1) / b + 1;
    }

    /**
     * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
     * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
     * with further edits by Uniswap Labs also under MIT license.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator
    ) internal pure returns (uint256 result) {
        unchecked {
            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
            // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
            // variables such that product = prod1 * 2^256 + prod0.
            uint256 prod0; // Least significant 256 bits of the product
            uint256 prod1; // Most significant 256 bits of the product
            assembly {
                let mm := mulmod(x, y, not(0))
                prod0 := mul(x, y)
                prod1 := sub(sub(mm, prod0), lt(mm, prod0))
            }

            // Handle non-overflow cases, 256 by 256 division.
            if (prod1 == 0) {
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            require(denominator > prod1);

            ///////////////////////////////////////////////
            // 512 by 256 division.
            ///////////////////////////////////////////////

            // Make division exact by subtracting the remainder from [prod1 prod0].
            uint256 remainder;
            assembly {
                // Compute remainder using mulmod.
                remainder := mulmod(x, y, denominator)

                // Subtract 256 bit number from 512 bit number.
                prod1 := sub(prod1, gt(remainder, prod0))
                prod0 := sub(prod0, remainder)
            }

            // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
            // See https://cs.stackexchange.com/q/138556/92363.

            // Does not overflow because the denominator cannot be zero at this stage in the function.
            uint256 twos = denominator & (~denominator + 1);
            assembly {
                // Divide denominator by twos.
                denominator := div(denominator, twos)

                // Divide [prod1 prod0] by twos.
                prod0 := div(prod0, twos)

                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
                twos := add(div(sub(0, twos), twos), 1)
            }

            // Shift in bits from prod1 into prod0.
            prod0 |= prod1 * twos;

            // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
            // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
            // four bits. That is, denominator * inv = 1 mod 2^4.
            uint256 inverse = (3 * denominator) ^ 2;

            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works
            // in modular arithmetic, doubling the correct bits in each step.
            inverse *= 2 - denominator * inverse; // inverse mod 2^8
            inverse *= 2 - denominator * inverse; // inverse mod 2^16
            inverse *= 2 - denominator * inverse; // inverse mod 2^32
            inverse *= 2 - denominator * inverse; // inverse mod 2^64
            inverse *= 2 - denominator * inverse; // inverse mod 2^128
            inverse *= 2 - denominator * inverse; // inverse mod 2^256

            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
            // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
            // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
            // is no longer required.
            result = prod0 * inverse;
            return result;
        }
    }

    /**
     * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator,
        Rounding rounding
    ) internal pure returns (uint256) {
        uint256 result = mulDiv(x, y, denominator);
        if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
            result += 1;
        }
        return result;
    }

    /**
     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.
     *
     * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
     */
    function sqrt(uint256 a) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
        //
        // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
        // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
        //
        // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
        // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
        // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
        //
        // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
        uint256 result = 1 << (log2(a) >> 1);

        // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
        // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
        // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
        // into the expected uint128 result.
        unchecked {
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            return min(result, a / result);
        }
    }

    /**
     * @notice Calculates sqrt(a), following the selected rounding direction.
     */
    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = sqrt(a);
            return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 2, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 128;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 64;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 32;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 16;
            }
            if (value >> 8 > 0) {
                value >>= 8;
                result += 8;
            }
            if (value >> 4 > 0) {
                value >>= 4;
                result += 4;
            }
            if (value >> 2 > 0) {
                value >>= 2;
                result += 2;
            }
            if (value >> 1 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log2(value);
            return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 10, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >= 10**64) {
                value /= 10**64;
                result += 64;
            }
            if (value >= 10**32) {
                value /= 10**32;
                result += 32;
            }
            if (value >= 10**16) {
                value /= 10**16;
                result += 16;
            }
            if (value >= 10**8) {
                value /= 10**8;
                result += 8;
            }
            if (value >= 10**4) {
                value /= 10**4;
                result += 4;
            }
            if (value >= 10**2) {
                value /= 10**2;
                result += 2;
            }
            if (value >= 10**1) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log10(value);
            return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 256, rounded down, of a positive value.
     * Returns 0 if given 0.
     *
     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
     */
    function log256(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 16;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 8;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 4;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 2;
            }
            if (value >> 8 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log256(value);
            return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);
        }
    }
}

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


// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)

pragma solidity ^0.8.0;


/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _SYMBOLS = "0123456789abcdef";
    uint8 private constant _ADDRESS_LENGTH = 20;

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        unchecked {
            uint256 length = Math.log10(value) + 1;
            string memory buffer = new string(length);
            uint256 ptr;
            /// @solidity memory-safe-assembly
            assembly {
                ptr := add(buffer, add(32, length))
            }
            while (true) {
                ptr--;
                /// @solidity memory-safe-assembly
                assembly {
                    mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
                }
                value /= 10;
                if (value == 0) break;
            }
            return buffer;
        }
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        unchecked {
            return toHexString(value, Math.log256(value) + 1);
        }
    }

    /**
     * @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] = _SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}


abstract contract ERC1155Supply is ERC1155 {
    mapping(uint256 => uint256) private _totalSupply;

    /**
     * @dev Total amount of tokens in with a given id.
     */
    function totalSupply(uint256 id) public view virtual returns (uint256) {
        return _totalSupply[id];
    }

    /**
     * @dev Indicates whether any token exist with a given id, or not.
     */
    function exists(uint256 id) public view virtual returns (bool) {
        return ERC1155Supply.totalSupply(id) > 0;
    }

    /**
     * @dev See {ERC1155-_beforeTokenTransfer}.
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual override {
        super._beforeTokenTransfer(operator, from, to, ids, amounts, data);

        if (from == address(0)) {
            for (uint256 i = 0; i < ids.length; ++i) {
                _totalSupply[ids[i]] += amounts[i];
            }
        }

        if (to == address(0)) {
            for (uint256 i = 0; i < ids.length; ++i) {
                uint256 id = ids[i];
                uint256 amount = amounts[i];
                uint256 supply = _totalSupply[id];
                require(supply >= amount, "ERC1155: burn amount exceeds totalSupply");
                unchecked {
                    _totalSupply[id] = supply - amount;
                }
            }
        }
    }
}
// File: @openzeppelin/contracts/token/ERC1155/extensions/ERC1155URIStorage.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC1155/extensions/ERC1155URIStorage.sol)

pragma solidity ^0.8.0;



/**
 * @dev ERC1155 token with storage based token URI management.
 * Inspired by the ERC721URIStorage extension
 *
 * _Available since v4.6._
 */
abstract contract ERC1155URIStorage is ERC1155Supply {
    using Strings for uint256;

    // Optional base URI
    string private _baseURI = "";

    // Optional mapping for token URIs
    mapping(uint256 => string) private _tokenURIs;

    /**
     * @dev See {IERC1155MetadataURI-uri}.
     *
     * This implementation returns the concatenation of the `_baseURI`
     * and the token-specific uri if the latter is set
     *
     * This enables the following behaviors:
     *
     * - if `_tokenURIs[tokenId]` is set, then the result is the concatenation
     *   of `_baseURI` and `_tokenURIs[tokenId]` (keep in mind that `_baseURI`
     *   is empty per default);
     *
     * - if `_tokenURIs[tokenId]` is NOT set then we fallback to `super.uri()`
     *   which in most cases will contain `ERC1155._uri`;
     *
     * - if `_tokenURIs[tokenId]` is NOT set, and if the parents do not have a
     *   uri value set, then the result is empty.
     */
    function uri(uint256 tokenId) public view virtual override returns (string memory) {
        string memory tokenURI = _tokenURIs[tokenId];

        // If token URI is set, concatenate base URI and tokenURI (via abi.encodePacked).
        return bytes(tokenURI).length > 0 ? string(abi.encodePacked(_baseURI, tokenURI)) : super.uri(tokenId);
    }

    /**
     * @dev Sets `tokenURI` as the tokenURI of `tokenId`.
     */
    function _setURI(uint256 tokenId, string memory tokenURI) internal virtual {
        _tokenURIs[tokenId] = tokenURI;
        emit URI(uri(tokenId), tokenId);
    }

    /**
     * @dev Sets `baseURI` as the `_baseURI` for all tokens
     */
    function _setBaseURI(string memory baseURI) internal virtual {
        _baseURI = baseURI;
    }
}

// File: kizuna/kizuna.sol


pragma solidity ^0.8.9;




pragma solidity ^0.8.9;



pragma solidity ^0.8.9;
abstract contract Operable is Context {
    mapping(address => bool) _operators;
    modifier onlyOperator() {
        _checkOperatorRole(_msgSender());
        _;
    }
    function isOperator(address _operator) public view returns (bool) {
        return _operators[_operator];
    }
    function _grantOperatorRole(address _candidate) internal {
        require(
            !_operators[_candidate],
            string(
                abi.encodePacked(
                    "account ",
                    Strings.toHexString(uint160(_msgSender()), 20),
                    " is already has an operator role"
                )
            )
        );
        _operators[_candidate] = true;
    }
    function _revokeOperatorRole(address _candidate) internal {
        _checkOperatorRole(_candidate);
        delete _operators[_candidate];
    }
    function _checkOperatorRole(address _operator) internal view {
        require(
            _operators[_operator],
            string(
                abi.encodePacked(
                    "account ",
                    Strings.toHexString(uint160(_msgSender()), 20),
                    " is not an operator"
                )
            )
        );
    }
}

pragma solidity ^0.8.9;
abstract contract Minter is Context {
    mapping(address => bool) _minters;
    modifier onlyMinter() {
        _checkMinterRole(_msgSender());
        _;
    }
    function isMinter(address _minter) public view returns (bool) {
        return _minters[_minter];
    }
    function _grantMinterRole(address _candidate) internal {
        require(
            !_minters[_candidate],
            string(
                abi.encodePacked(
                    "account ",
                    Strings.toHexString(uint160(_msgSender()), 20),
                    " is already has an minter role"
                )
            )
        );
        _minters[_candidate] = true;
    }
    function _revokeMinterRole(address _candidate) internal {
        _checkMinterRole(_candidate);
        delete _minters[_candidate];
    }
    function _checkMinterRole(address _minter) internal view {
        require(
            _minters[_minter],
            string(
                abi.encodePacked(
                    "account ",
                    Strings.toHexString(uint160(_msgSender()), 20),
                    " is not an minter"
                )
            )
        );
    }
}

// File: EXO/NEW/EXO.sol

pragma solidity >=0.6.0;

/// @title Base64
/// @author Brecht Devos - <[email protected]>
/// @notice Provides functions for encoding/decoding base64
library Base64 {
    string internal constant TABLE_ENCODE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
    bytes  internal constant TABLE_DECODE = hex"0000000000000000000000000000000000000000000000000000000000000000"
                                            hex"00000000000000000000003e0000003f3435363738393a3b3c3d000000000000"
                                            hex"00000102030405060708090a0b0c0d0e0f101112131415161718190000000000"
                                            hex"001a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132330000000000";

    function encode(bytes memory data) internal pure returns (string memory) {
        if (data.length == 0) return '';

        // load the table into memory
        string memory table = TABLE_ENCODE;

        // multiply by 4/3 rounded up
        uint256 encodedLen = 4 * ((data.length + 2) / 3);

        // add some extra buffer at the end required for the writing
        string memory result = new string(encodedLen + 32);

        assembly {
            // set the actual output length
            mstore(result, encodedLen)

            // prepare the lookup table
            let tablePtr := add(table, 1)

            // input ptr
            let dataPtr := data
            let endPtr := add(dataPtr, mload(data))

            // result ptr, jump over length
            let resultPtr := add(result, 32)

            // run over the input, 3 bytes at a time
            for {} lt(dataPtr, endPtr) {}
            {
                // read 3 bytes
                dataPtr := add(dataPtr, 3)
                let input := mload(dataPtr)

                // write 4 characters
                mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F))))
                resultPtr := add(resultPtr, 1)
                mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F))))
                resultPtr := add(resultPtr, 1)
                mstore8(resultPtr, mload(add(tablePtr, and(shr( 6, input), 0x3F))))
                resultPtr := add(resultPtr, 1)
                mstore8(resultPtr, mload(add(tablePtr, and(        input,  0x3F))))
                resultPtr := add(resultPtr, 1)
            }

            // padding with '='
            switch mod(mload(data), 3)
            case 1 { mstore(sub(resultPtr, 2), shl(240, 0x3d3d)) }
            case 2 { mstore(sub(resultPtr, 1), shl(248, 0x3d)) }
        }

        return result;
    }

    function decode(string memory _data) internal pure returns (bytes memory) {
        bytes memory data = bytes(_data);

        if (data.length == 0) return new bytes(0);
        require(data.length % 4 == 0, "invalid base64 decoder input");

        // load the table into memory
        bytes memory table = TABLE_DECODE;

        // every 4 characters represent 3 bytes
        uint256 decodedLen = (data.length / 4) * 3;

        // add some extra buffer at the end required for the writing
        bytes memory result = new bytes(decodedLen + 32);

        assembly {
            // padding with '='
            let lastBytes := mload(add(data, mload(data)))
            if eq(and(lastBytes, 0xFF), 0x3d) {
                decodedLen := sub(decodedLen, 1)
                if eq(and(lastBytes, 0xFFFF), 0x3d3d) {
                    decodedLen := sub(decodedLen, 1)
                }
            }

            // set the actual output length
            mstore(result, decodedLen)

            // prepare the lookup table
            let tablePtr := add(table, 1)

            // input ptr
            let dataPtr := data
            let endPtr := add(dataPtr, mload(data))

            // result ptr, jump over length
            let resultPtr := add(result, 32)

            // run over the input, 4 characters at a time
            for {} lt(dataPtr, endPtr) {}
            {
               // read 4 characters
               dataPtr := add(dataPtr, 4)
               let input := mload(dataPtr)

               // write 3 bytes
               let output := add(
                   add(
                       shl(18, and(mload(add(tablePtr, and(shr(24, input), 0xFF))), 0xFF)),
                       shl(12, and(mload(add(tablePtr, and(shr(16, input), 0xFF))), 0xFF))),
                   add(
                       shl( 6, and(mload(add(tablePtr, and(shr( 8, input), 0xFF))), 0xFF)),
                               and(mload(add(tablePtr, and(        input , 0xFF))), 0xFF)
                    )
                )
                mstore(resultPtr, shl(232, output))
                resultPtr := add(resultPtr, 3)
            }
        }

        return result;
    }
}




// OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _status will be _NOT_ENTERED
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;
    }

    function _nonReentrantAfter() private {
        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}




pragma solidity ^0.8.7;
abstract contract MerkleProof {
    mapping(uint256 => bytes32) internal _alMerkleRoot;
    uint256 public phaseId;

    function _setAlMerkleRootWithId(uint256 _phaseId,bytes32 merkleRoot_) internal virtual {
        _alMerkleRoot[_phaseId] = merkleRoot_;
    }

    function _setAlMerkleRoot(bytes32 merkleRoot_) internal virtual {
        _alMerkleRoot[phaseId] = merkleRoot_;
    }

    function isAllowlisted(address address_,uint256 _phaseId, bytes32[] memory proof_) public view returns (bool) {
        bytes32 _leaf = keccak256(abi.encodePacked(address_));
        for (uint256 i = 0; i < proof_.length; i++) {
            _leaf = _leaf < proof_[i] ? keccak256(abi.encodePacked(_leaf, proof_[i])) : keccak256(abi.encodePacked(proof_[i], _leaf));
        }
        return _leaf == _alMerkleRoot[_phaseId];
    }

}



pragma solidity ^0.8.13;

interface IOperatorFilterRegistry {
    function isOperatorAllowed(address registrant, address operator) external view returns (bool);
    function register(address registrant) external;
    function registerAndSubscribe(address registrant, address subscription) external;
    function registerAndCopyEntries(address registrant, address registrantToCopy) external;
    function unregister(address addr) external;
    function updateOperator(address registrant, address operator, bool filtered) external;
    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;
    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;
    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;
    function subscribe(address registrant, address registrantToSubscribe) external;
    function unsubscribe(address registrant, bool copyExistingEntries) external;
    function subscriptionOf(address addr) external returns (address registrant);
    function subscribers(address registrant) external returns (address[] memory);
    function subscriberAt(address registrant, uint256 index) external returns (address);
    function copyEntriesOf(address registrant, address registrantToCopy) external;
    function isOperatorFiltered(address registrant, address operator) external returns (bool);
    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);
    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);
    function filteredOperators(address addr) external returns (address[] memory);
    function filteredCodeHashes(address addr) external returns (bytes32[] memory);
    function filteredOperatorAt(address registrant, uint256 index) external returns (address);
    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);
    function isRegistered(address addr) external returns (bool);
    function codeHashOf(address addr) external returns (bytes32);
}

pragma solidity ^0.8.13;


/**
 * @title  OperatorFilterer
 * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another
 *         registrant's entries in the OperatorFilterRegistry.
 * @dev    This smart contract is meant to be inherited by token contracts so they can use the following:
 *         - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods.
 *         - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods.
 */
abstract contract OperatorFilterer {
    error OperatorNotAllowed(address operator);
    bool public operatorFilteringEnabled = true;

    IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY =
        IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

    constructor(address subscriptionOrRegistrantToCopy, bool subscribe) {
        // If an inheriting token contract is deployed to a network without the registry deployed, the modifier
        // will not revert, but the contract will need to be registered with the registry once it is deployed in
        // order for the modifier to filter addresses.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (subscribe) {
                OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy);
            } else {
                if (subscriptionOrRegistrantToCopy != address(0)) {
                    OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy);
                } else {
                    OPERATOR_FILTER_REGISTRY.register(address(this));
                }
            }
        }
    }

    modifier onlyAllowedOperator(address from) virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0 && operatorFilteringEnabled) {
            // Allow spending tokens from addresses with balance
            // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred
            // from an EOA.
            if (from == msg.sender) {
                _;
                return;
            }
            if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), msg.sender)) {
                revert OperatorNotAllowed(msg.sender);
            }
        }
        _;
    }

    modifier onlyAllowedOperatorApproval(address operator) virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0 && operatorFilteringEnabled) {
            if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) {
                revert OperatorNotAllowed(operator);
            }
        }
        _;
    }
}


pragma solidity ^0.8.13;
/**
 * @title  DefaultOperatorFilterer
 * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription.
 */
abstract contract DefaultOperatorFilterer is OperatorFilterer {
    address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6);

    constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {}
}

// File: @openzeppelin/contracts/interfaces/IERC2981.sol


// OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol)

pragma solidity ^0.8.0;


/**
 * @dev Interface for the NFT Royalty Standard.
 *
 * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal
 * support for royalty payments across all NFT marketplaces and ecosystem participants.
 *
 * _Available since v4.5._
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
     * exchange. The royalty amount is denominated and should be paid in that same unit of exchange.
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}

// File: @openzeppelin/contracts/token/common/ERC2981.sol


// OpenZeppelin Contracts (last updated v4.7.0) (token/common/ERC2981.sol)

pragma solidity ^0.8.0;



/**
 * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information.
 *
 * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for
 * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first.
 *
 * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the
 * fee is specified in basis points by default.
 *
 * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See
 * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to
 * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.
 *
 * _Available since v4.5._
 */
abstract contract ERC2981 is IERC2981, ERC165 {
    struct RoyaltyInfo {
        address receiver;
        uint96 royaltyFraction;
    }

    RoyaltyInfo private _defaultRoyaltyInfo;
    mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo;

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) {
        return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId);
    }

    /**
     * @inheritdoc IERC2981
     */
    function royaltyInfo(uint256 _tokenId, uint256 _salePrice) public view virtual override returns (address, uint256) {
        RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId];

        if (royalty.receiver == address(0)) {
            royalty = _defaultRoyaltyInfo;
        }

        uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator();

        return (royalty.receiver, royaltyAmount);
    }

    /**
     * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a
     * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an
     * override.
     */
    function _feeDenominator() internal pure virtual returns (uint96) {
        return 10000;
    }

    /**
     * @dev Sets the royalty information that all ids in this contract will default to.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: invalid receiver");

        _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Removes default royalty information.
     */
    function _deleteDefaultRoyalty() internal virtual {
        delete _defaultRoyaltyInfo;
    }

    /**
     * @dev Sets the royalty information for a specific token id, overriding the global default.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setTokenRoyalty(
        uint256 tokenId,
        address receiver,
        uint96 feeNumerator
    ) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: Invalid parameters");

        _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Resets royalty information for the token id back to the global default.
     */
    function _resetTokenRoyalty(uint256 tokenId) internal virtual {
        delete _tokenRoyaltyInfo[tokenId];
    }
}

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



contract AEBF is ERC1155URIStorage, Ownable, Operable,Minter,ReentrancyGuard, DefaultOperatorFilterer,ERC2981,MerkleProof {
    using Strings for string;


  mapping(uint256 => uint256) public alMintPrice;
  uint256 public psMintPrice = 0.5 ether;
  uint256 public maxMintsPerALOT = 99;

  uint256 public maxMintsPerPS = 2;
  uint256 public maxMintsPerPSOT = 2;
  uint256 public nowPhaseWl;
  uint256 public nowPhaseAl;
  uint256 public nowPhasePs;

  address internal _withdrawWallet;
  address internal _aa;
  address internal _bb;
  address internal _cc;
  address internal _dd;
  address internal _ee;
  address internal _ff;

  uint256 internal _aaPerc;
  uint256 internal _bbPerc;
  uint256 internal _ccPerc;
  uint256 internal _ddPerc;
  uint256 internal _eePerc;
  uint256 internal _ffPerc;

  //flags
  mapping(uint256 => bool) public isWlSaleEnabled;
  mapping(uint256 => bool) public isAlSaleEnabled;
  bool public isPublicSaleEnabled;

  //mint records.
  mapping(uint256 => uint256) public phaseIds;
  mapping(uint256 => mapping(uint256 => mapping(address => uint256))) internal _alMinted;


    uint256 public mintable;

    string public name = "AEB Figure Collection";
    string public symbol = "AEBF";

    address internal baseWallet = 0x27d2210a381e7D5921Fbb4dF6Fa39fd875ceCB57;

    bool unlock = false;

    mapping(uint256 => uint256) public maxMintsPerAL;
    mapping(address => bool) bondedAddress;
    constructor(
        uint256 _aaPercAdd
    ) ERC1155('') {
        _grantOperatorRole(msg.sender);
        _grantMinterRole(msg.sender);
        _grantOperatorRole(baseWallet);
        _setDefaultRoyalty(baseWallet,0);
        _withdrawWallet = baseWallet;
        // _grantMinterRole(0x7185b9caBa59D37c4C60a1CDb6E04cce69bb0038); //test
        _grantMinterRole(0x421E534EF93F6680f9955DA95af7E6d3a05eDFB0); //main
        _setBaseURI("https://arweave.net/wIX_yZfKynLn01XxYNjDwB2w2MS7-orQNFbTLCo8UXM/");
        initializeNFT(0, '0.json');
        initializeNFT(1, '1.json');
        initializeNFT(2, '2.json');
        maxMintsPerAL[0] = 99;
        maxMintsPerAL[1] = 99;

        alMintPrice[0] = 0.1 ether;//light
        alMintPrice[1] = 0.2 ether;//premium
        alMintPrice[2] = 0.3 ether;//elite
        _aa = msg.sender;
        _aaPerc = _aaPercAdd;
    }


  //set Default Royalty._feeNumerator 500 = 5% Royalty
  function setDefaultRoyalty(address _receiver, uint96 _feeNumerator) external virtual onlyOperator {
      _setDefaultRoyalty(_receiver, _feeNumerator);
  }
  //for ERC2981
  function supportsInterface(bytes4 interfaceId) public view virtual override(ERC1155, ERC2981) returns (bool) {
    return super.supportsInterface(interfaceId);
  }
  //for ERC2981 Opensea
  function contractURI() external view virtual returns (string memory) {
        return _formatContractURI();
  }
  //make contractURI
  function _formatContractURI() internal view returns (string memory) {
    (address receiver, uint256 royaltyFraction) = royaltyInfo(0,_feeDenominator());//tokenid=0
    return string(
      abi.encodePacked(
        "data:application/json;base64,",
        Base64.encode(
          bytes(
            abi.encodePacked(
                '{"seller_fee_basis_points":', Strings.toString(royaltyFraction),
                ', "fee_recipient":"', Strings.toHexString(uint256(uint160(receiver)), 20), '"}'
            )
          )
        )
      )
    );
  }

    //OPENSEA.OPERATORFilterer.START
    /**
     * @notice Set the state of the OpenSea operator filter
     * @param value Flag indicating if the operator filter should be applied to transfers and approvals
     */
    function setOperatorFilteringEnabled(bool value) external onlyOperator {
        operatorFilteringEnabled = value;
    }

    /**
     * @dev See {IERC1155-setApprovalForAll}.
     *      In this example the added modifier ensures that the operator is allowed by the OperatorFilterRegistry.
     */
    function setApprovalForAll(address operator, bool approved) public override onlyAllowedOperatorApproval(operator) {
        require(
            operator == owner() || bondedAddress[operator] == true || unlock == true,
            'Send NFT not allowed'
        );
        super.setApprovalForAll(operator, approved);
        _setApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC1155-safeTransferFrom}.
     *      In this example the added modifier ensures that the operator is allowed by the OperatorFilterRegistry.
     */
    function safeTransferFrom(address from, address to, uint256 tokenId, uint256 amount, bytes memory data)
        public
        override
        onlyAllowedOperator(from)
    {
        super.safeTransferFrom(from, to, tokenId, amount, data);
    }

    /**
     * @dev See {IERC1155-safeBatchTransferFrom}.
     *      In this example the added modifier ensures that the operator is allowed by the OperatorFilterRegistry.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) public virtual override onlyAllowedOperator(from) {
        super.safeBatchTransferFrom(from, to, ids, amounts, data);
    }


    //OPENSEA.OPERATORFilterer.END


    function locked(address to) external view returns (bool) {
        return bondedAddress[to];
    }

    function bound(address to, bool flag) public onlyOperator {
        bondedAddress[to] = flag;
    }

    function setBaseURI(string memory uri_) external onlyOperator {
        _setBaseURI(uri_);
    }

    function setTokenURI(uint256 tokenId, string memory _tokenURI)
        external
        onlyOperator
    {
        _setURI(tokenId, _tokenURI);
    }

    function initializeNFT(uint256 tokenId, string memory _tokenURI)
        public
        onlyOperator
    {
        require(bytes(uri(tokenId)).length == 0, 'SBT already exists');
        _mint(baseWallet, tokenId, 1, '');
        _setURI(tokenId, _tokenURI);
    }
  
  //AL mint.
  function allowlistMint(uint256 _alId,uint256 _tokenId,uint256 _amount, bytes32[] memory proof_) external payable virtual nonReentrant {
    require(bytes(uri(_tokenId)).length != 0, 'Not initialized');
    require(isAlSaleEnabled[_alId], "allowlistMint is Paused");
    require(isAllowlisted(msg.sender,_alId, proof_), "You are not whitelisted!");
    require(maxMintsPerALOT >= _amount, "allowlistMint: Over max mints per one time");
    require(maxMintsPerAL[_alId] >= _amount, "allowlistMint: Over max mints per wallet");
    require(maxMintsPerAL[_alId] >= _alMinted[_alId][phaseIds[_alId]][msg.sender] + _amount, "You have no whitelistMint left");
    require(msg.value == alMintPrice[_tokenId] * _amount, "ETH value is not correct");
    require((_amount + totalSupply(_tokenId)) <= (mintable) || mintable == 0, "No more NFTs");
    _alMinted[_alId][phaseIds[_alId]][msg.sender] += _amount;
    _mint(msg.sender, _tokenId, _amount, '');
  }


  function minter(
       uint256 _alId,
       uint256 _tokenId,
       uint256 _amount,
       address _receiver,
       bytes32[] memory _proof
   ) external payable virtual nonReentrant onlyMinter {
    require(bytes(uri(_tokenId)).length != 0, 'Not initialized');
    require(isAlSaleEnabled[_alId], "allowlistMint is Paused");
    require(isAllowlisted(_receiver,_alId, _proof), "You are not whitelisted!");
    require(maxMintsPerALOT >= _amount, "allowlistMint: Over max mints per one time");
    require(maxMintsPerAL[_alId] >= _amount, "allowlistMint: Over max mints per wallet");
    require(maxMintsPerAL[_alId] >= _alMinted[_alId][phaseIds[_alId]][_receiver] + _amount, "You have no whitelistMint left");
    require(msg.value == alMintPrice[_tokenId] * _amount, "ETH value is not correct");
    require((_amount + totalSupply(_tokenId)) <= (mintable) || mintable == 0, "No more NFTs");
    _alMinted[_alId][phaseIds[_alId]][_receiver] += _amount;
    _mint(_receiver, _tokenId, _amount, '');
   }

  function setMintable(uint256 _mintable) external virtual onlyOperator {
    mintable = _mintable;
  }

  function alMinted(address _address) external view virtual returns (uint256){
    return _alMinted[nowPhaseAl][phaseIds[nowPhaseAl]][_address];
  }
  
  function alIdMinted(uint256 _nowPhaseAl,address _address) external view virtual returns (uint256){
    return _alMinted[_nowPhaseAl][phaseIds[_nowPhaseAl]][_address];
  }

    // GET phaseId.
  function getPhaseId() external view virtual returns (uint256){
    return phaseId;
  }
    // SET phaseId.
  function setPhaseId(uint256 _phaseId) external virtual onlyOperator {
    phaseId = _phaseId;
  }
    // SET phaseId.
  function setPhaseIdWithReset(uint256 _phaseId) external virtual onlyOperator {
    phaseId = _phaseId;
    nowPhaseAl += 1;
  }

  function setNowPhaseAl(uint256 _nowPhaseAl) external virtual onlyOperator {
    nowPhaseAl = _nowPhaseAl;
  }

  function setMaxMintsPerALOT(uint256 _maxMintsPerALOT) external virtual onlyOperator {
    maxMintsPerALOT = _maxMintsPerALOT;
  }
  function setMaxMintsPerAL(uint256 _maxMintsPerAL,uint256 _id) external virtual onlyOperator {
    maxMintsPerAL[_id] = _maxMintsPerAL;
  }
  function setMerkleRootAlWithId(uint256 _phaseId,bytes32 merkleRoot_) external virtual onlyOperator {
    _setAlMerkleRootWithId(_phaseId,merkleRoot_);
  }
    // GET phaseId.
  function getPhaseIds(uint256 _alId) external view virtual returns (uint256){
    return phaseIds[_alId];
  }

  //AL.SaleEnable
  function setAllowlistSaleEnable(uint256 _alId,bool bool_) external virtual onlyOperator {
    isAlSaleEnabled[_alId] = bool_;
  }
  //PS.SaleEnable
  function setPublicSaleEnable(bool bool_) external virtual onlyOperator {
    isPublicSaleEnabled = bool_;
  }

  //AL.Price
  function setAlPrice(uint256 _alId,uint256 newPrice) external virtual onlyOperator {
    alMintPrice[_alId] = newPrice;
  }
  //PS.Price
  function setPsPrice(uint256 newPrice) external virtual onlyOperator {
    psMintPrice = newPrice;
  }

  //unlock
  function setUnlock(bool bool_) external virtual onlyOperator {
    unlock = bool_;
  }

    function mint(
        address to,
        uint256 id,
        uint256 amount
    ) public onlyOperator {
        require(bytes(uri(id)).length != 0, 'Not initialized');
        _mint(to, id, amount, '');
    }

    function batchMintTo(
        address[] memory list,
        uint256 id,
        uint256[] memory amount
    ) public onlyOperator {
        for (uint256 i = 0; i < list.length; i++) {
            _mint(list[i], id, amount[i], '');
        }
    }

    function burnAdmin(
        address to,
        uint256 id,
        uint256 amount
    ) public onlyOperator {
        _burn(to, id, amount);
    }

    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual override {
        require(
            operator == owner() || bondedAddress[operator] == true || unlock == true || from == address(0),
            'Send NFT not allowed'
        );
        super._beforeTokenTransfer(operator, from, to, ids, amounts, data);
    }

      /** @dev receive. */
  function receiveToDeb() external payable virtual onlyOperator nonReentrant {
      require(msg.value > 0, "ETH value is not correct");
  }
  /**
    @dev set aa's wallet and fraction.withdraw to this wallet.only operator.
    */
  function setWallet__aa(address _owner,uint256 _perc) external virtual onlyOperator {
    _aa = _owner;
    _aaPerc = _perc;
  }

  /**
    @dev set bb's wallet and fraction.withdraw to this wallet.only operator.
    */
  function setWallet__bb(address _owner,uint256 _perc) external virtual onlyOperator {
    _bb = _owner;
    _bbPerc = _perc;
  }

  /**
    @dev set cc's wallet and fraction.withdraw to this wallet.only operator.
    */
  function setWallet__cc(address _owner,uint256 _perc) external virtual onlyOperator {
    _cc = _owner;
    _ccPerc = _perc;
  }

  /**
    @dev set dd's wallet and fraction.withdraw to this wallet.only operator.
    */
  function setWallet__dd(address _owner,uint256 _perc) external virtual onlyOperator {
    _dd = _owner;
    _ddPerc = _perc;
  }

  /**
    @dev set ee's wallet and fraction.withdraw to this wallet.only operator.
    */
  function setWallet__ee(address _owner,uint256 _perc) external virtual onlyOperator {
    _ee = _owner;
    _eePerc = _perc;
  }

  /**
    @dev set ff's wallet and fraction.withdraw to this wallet.only operator.
    */
  function setWallet__ff(address _owner,uint256 _perc) external virtual onlyOperator {
    _ff = _owner;
    _ffPerc = _perc;
  }
  /**
    @dev set withdraw's wallet.withdraw to this wallet.only operator.
    */
  function setWallet__ww(address _owner) external virtual onlyOperator {
    _withdrawWallet = _owner;
  }

  /** @dev widraw ETH from this contract.only operator. */
  function withdraw() external payable virtual onlyOperator nonReentrant{
    require((_aa != address(0) && _aaPerc != 0) || _aa == address(0),"please set withdraw Address_aa and percentage.");
    require((_bb != address(0) && _bbPerc != 0) || _bb == address(0),"please set withdraw Address_bb and percentage.");
    require((_cc != address(0) && _ccPerc != 0) || _cc == address(0),"please set withdraw Address_cc and percentage.");
    require((_dd != address(0) && _ddPerc != 0) || _dd == address(0),"please set withdraw Address_dd and percentage.");
    require((_ee != address(0) && _eePerc != 0) || _ee == address(0),"please set withdraw Address_ee and percentage.");
    require((_ff != address(0) && _ffPerc != 0) || _ff == address(0),"please set withdraw Address_ff and percentage.");
    uint256 _ethBalance = address(this).balance;
    bool os;
    if(_aa != address(0)){//if _aa has.
        (os, ) = payable(_aa).call{value: (_ethBalance * _aaPerc/10000)}("");
        require(os, "Failed to withdraw_aa Ether");
    }
    if(_bb != address(0)){//if _bb has.
        (os, ) = payable(_bb).call{value: (_ethBalance * _bbPerc/10000)}("");
        require(os, "Failed to withdraw_bb Ether");
    }
    if(_cc != address(0)){//if _cc has.
        (os, ) = payable(_cc).call{value: (_ethBalance * _ccPerc/10000)}("");
        require(os, "Failed to withdraw_cc Ether");
    }
    if(_dd != address(0)){//if _dd has.
        (os, ) = payable(_dd).call{value: (_ethBalance * _ddPerc/10000)}("");
        require(os, "Failed to withdraw_dd Ether");
    }
    if(_ee != address(0)){//if _ee has.
        (os, ) = payable(_ee).call{value: (_ethBalance * _eePerc/10000)}("");
        require(os, "Failed to withdraw_ee Ether");
    }
    if(_ff != address(0)){//if _ff has.
        (os, ) = payable(_ff).call{value: (_ethBalance * _ffPerc/10000)}("");
        require(os, "Failed to withdraw_ff Ether");
    }
    _ethBalance = address(this).balance;
    if(_withdrawWallet != address(0)){//if _withdrawWallet has.
        (os, ) = payable(_withdrawWallet).call{value: (_ethBalance)}("");
    }else{
        (os, ) = payable(owner()).call{value: (_ethBalance)}("");
    }
    require(os, "Failed to withdraw Ether");
  }
    /**
        @dev Operable.Role.ADD
     */
    function grantOperatorRole(address _candidate) external onlyOwner {
        _grantOperatorRole(_candidate);
    }
    /**
        @dev Operable.Role.REMOVE
     */
    function revokeOperatorRole(address _candidate) external onlyOwner {
        _revokeOperatorRole(_candidate);
    }

    /**
        @dev Minter.Role.ADD
     */
    function grantMinterRole(address _candidate) external onlyOwner {
        _grantMinterRole(_candidate);
    }
    /**
        @dev Minter.Role.REMOVE
     */
    function revokeMinterRole(address _candidate) external onlyOwner {
        _revokeMinterRole(_candidate);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint256","name":"_aaPercAdd","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","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":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nowPhaseAl","type":"uint256"},{"internalType":"address","name":"_address","type":"address"}],"name":"alIdMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"alMintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"alMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_alId","type":"uint256"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes32[]","name":"proof_","type":"bytes32[]"}],"name":"allowlistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"list","type":"address[]"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256[]","name":"amount","type":"uint256[]"}],"name":"batchMintTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"flag","type":"bool"}],"name":"bound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPhaseId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_alId","type":"uint256"}],"name":"getPhaseIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_candidate","type":"address"}],"name":"grantMinterRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_candidate","type":"address"}],"name":"grantOperatorRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"_tokenURI","type":"string"}],"name":"initializeNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"isAlSaleEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"address_","type":"address"},{"internalType":"uint256","name":"_phaseId","type":"uint256"},{"internalType":"bytes32[]","name":"proof_","type":"bytes32[]"}],"name":"isAllowlisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"isMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"}],"name":"isOperator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublicSaleEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"isWlSaleEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"locked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"maxMintsPerAL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintsPerALOT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintsPerPS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintsPerPSOT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_alId","type":"uint256"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"}],"name":"minter","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nowPhaseAl","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nowPhasePs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nowPhaseWl","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operatorFilteringEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"phaseId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"phaseIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"psMintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"receiveToDeb","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_candidate","type":"address"}],"name":"revokeMinterRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_candidate","type":"address"}],"name":"revokeOperatorRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"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":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","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":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_alId","type":"uint256"},{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setAlPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_alId","type":"uint256"},{"internalType":"bool","name":"bool_","type":"bool"}],"name":"setAllowlistSaleEnable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint96","name":"_feeNumerator","type":"uint96"}],"name":"setDefaultRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintsPerAL","type":"uint256"},{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"setMaxMintsPerAL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintsPerALOT","type":"uint256"}],"name":"setMaxMintsPerALOT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_phaseId","type":"uint256"},{"internalType":"bytes32","name":"merkleRoot_","type":"bytes32"}],"name":"setMerkleRootAlWithId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintable","type":"uint256"}],"name":"setMintable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nowPhaseAl","type":"uint256"}],"name":"setNowPhaseAl","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setOperatorFilteringEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_phaseId","type":"uint256"}],"name":"setPhaseId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_phaseId","type":"uint256"}],"name":"setPhaseIdWithReset","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPsPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"bool_","type":"bool"}],"name":"setPublicSaleEnable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"_tokenURI","type":"string"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"bool_","type":"bool"}],"name":"setUnlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_perc","type":"uint256"}],"name":"setWallet__aa","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_perc","type":"uint256"}],"name":"setWallet__bb","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_perc","type":"uint256"}],"name":"setWallet__cc","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_perc","type":"uint256"}],"name":"setWallet__dd","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_perc","type":"uint256"}],"name":"setWallet__ee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_perc","type":"uint256"}],"name":"setWallet__ff","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"setWallet__ww","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":"id","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

60a0604052600060809081526004906200001a9082620012ab565b50600a805460ff191660011790556706f05b59d3b2000060105560636011556002601281905560135560408051808201909152601581527f4145422046696775726520436f6c6c656374696f6e00000000000000000000006020820152602a90620000869082620012ab565b5060408051808201909152600481526320a2a12360e11b6020820152602b90620000b19082620012ab565b50602c80546001600160a81b0319167327d2210a381e7d5921fbb4df6fa39fd875cecb57179055348015620000e557600080fd5b5060405162006a8b38038062006a8b833981016040819052620001089162001377565b733cc6cdda760b79bafa08df41ecfa224f810dceb66001604051806020016040528060008152506200014081620004c560201b60201c565b506200014c33620004d7565b60016009556daaeb6d7670e522a718067333cd4e3b1562000296578015620001e457604051633e9f1edf60e11b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e90637d3e3dbe906044015b600060405180830381600087803b158015620001c557600080fd5b505af1158015620001da573d6000803e3d6000fd5b5050505062000296565b6001600160a01b03821615620002355760405163a0af290360e01b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e9063a0af290390604401620001aa565b604051632210724360e11b81523060048201526daaeb6d7670e522a718067333cd4e90634420e48690602401600060405180830381600087803b1580156200027c57600080fd5b505af115801562000291573d6000803e3d6000fd5b505050505b50620002a490503362000529565b620002af33620005d8565b602c54620002c6906001600160a01b031662000529565b602c54620002df906001600160a01b0316600062000667565b602c54601780546001600160a01b0319166001600160a01b039092169190911790556200032073421e534ef93f6680f9955da95af7e6d3a05edfb0620005d8565b6200034460405180606001604052806040815260200162006a4b6040913962000768565b6200037560006040518060400160405280600681526020016518173539b7b760d11b8152506200077660201b60201c565b620003a660016040518060400160405280600681526020016518973539b7b760d11b8152506200077660201b60201c565b620003d760026040518060400160405280600681526020016519173539b7b760d11b8152506200077660201b60201c565b60637f6648a85983aca0407b603b260cacb25b5e5e8e5194522de3d8a800e71aa41bae8190557f4ac3b22e31fa68474eb1c8f858cd447cf1ee3eef7de8984178a7afa8f4fe0cd055600f60205267016345785d8a00007ff4803e074bd026baaf6ed2e288c9515f68c72fb7216eebdd7cae1718a53ec375556702c68af0bb1400007f169f97de0d9a84d840042b17d3c6b9638b3d6fd9024c9eb0c7a306a17b49f88f556002600052670429d069189e00007fa74ba3945261e09fde15ba3db55005b205e61eeb4ad811ac0faa2b315bffeead55601880546001600160a01b03191633179055601e5562001776565b6002620004d38282620012ab565b5050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b03811660009081526007602052604090205460ff161562000568335b6001600160a01b031660146200080960201b62002bf41760201c565b6040516020016200057a9190620013b7565b60405160208183030381529060405290620005b35760405162461bcd60e51b8152600401620005aa91906200143e565b60405180910390fd5b506001600160a01b03166000908152600760205260409020805460ff19166001179055565b6001600160a01b03811660009081526008602052604090205460ff161562000600336200054c565b60405160200162000612919062001453565b60405160208183030381529060405290620006425760405162461bcd60e51b8152600401620005aa91906200143e565b506001600160a01b03166000908152600860205260409020805460ff19166001179055565b6127106001600160601b0382161115620006d75760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b6064820152608401620005aa565b6001600160a01b0382166200072f5760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401620005aa565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600b55565b6004620004d38282620012ab565b6200078133620009cb565b6200078c8262000a34565b5115620007d15760405162461bcd60e51b815260206004820152601260248201527153425420616c72656164792065786973747360701b6044820152606401620005aa565b602c54604080516020810190915260008152620007fd916001600160a01b031690849060019062000b2d565b620004d3828262000c5c565b606060006200081a836002620014c2565b62000827906002620014dc565b6001600160401b038111156200084157620008416200120a565b6040519080825280601f01601f1916602001820160405280156200086c576020820181803683370190505b509050600360fc1b816000815181106200088a576200088a620014f2565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110620008bc57620008bc620014f2565b60200101906001600160f81b031916908160001a9053506000620008e2846002620014c2565b620008ef906001620014dc565b90505b600181111562000971576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110620009275762000927620014f2565b1a60f81b828281518110620009405762000940620014f2565b60200101906001600160f81b031916908160001a90535060049490941c93620009698162001508565b9050620008f2565b508315620009c25760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401620005aa565b90505b92915050565b6001600160a01b03811660009081526007602052604090205460ff16620009f2336200054c565b60405160200162000a04919062001522565b60405160208183030381529060405290620004d35760405162461bcd60e51b8152600401620005aa91906200143e565b60008181526005602052604081208054606092919062000a549062001220565b80601f016020809104026020016040519081016040528092919081815260200182805462000a829062001220565b801562000ad35780601f1062000aa75761010080835404028352916020019162000ad3565b820191906000526020600020905b81548152906001019060200180831162000ab557829003601f168201915b50505050509050600081511162000b005762000afa8362000cbf60201b62002d8f1760201c565b62000b26565b60048160405160200162000b169291906200157b565b6040516020818303038152906040525b9392505050565b6001600160a01b03841662000b8f5760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401620005aa565b33600062000b9d8562000d5b565b9050600062000bac8562000d5b565b905062000bbf8360008985858962000da9565b6000868152602081815260408083206001600160a01b038b1684529091528120805487929062000bf1908490620014dc565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a462000c538360008989898962000e81565b50505050505050565b600082815260056020526040902062000c768282620012ab565b50817f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b62000ca48262000a34565b60405162000cb391906200143e565b60405180910390a25050565b60606002805462000cd09062001220565b80601f016020809104026020016040519081016040528092919081815260200182805462000cfe9062001220565b801562000d4f5780601f1062000d235761010080835404028352916020019162000d4f565b820191906000526020600020905b81548152906001019060200180831162000d3157829003601f168201915b50505050509050919050565b6040805160018082528183019092526060916000919060208083019080368337019050509050828160008151811062000d985762000d98620014f2565b602090810291909101015292915050565b6006546001600160a01b038781169116148062000de357506001600160a01b0386166000908152602e602052604090205460ff1615156001145b8062000dfd5750602c54600160a01b900460ff1615156001145b8062000e1057506001600160a01b038516155b62000e5e5760405162461bcd60e51b815260206004820152601460248201527f53656e64204e4654206e6f7420616c6c6f7765640000000000000000000000006044820152606401620005aa565b62000e798686868686866200104d60201b62002e231760201c565b505050505050565b62000ea0846001600160a01b0316620011fb60201b62002fa51760201c565b1562000e795760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e619062000edc90899089908890889088906004016200160c565b6020604051808303816000875af192505050801562000f1a575060408051601f3d908101601f1916820190925262000f179181019062001653565b60015b62000fda5762000f296200167f565b806308c379a00362000f69575062000f40620016cb565b8062000f4d575062000f6b565b8060405162461bcd60e51b8152600401620005aa91906200143e565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e2d4552433131353560448201527f526563656976657220696d706c656d656e7465720000000000000000000000006064820152608401620005aa565b6001600160e01b0319811663f23a6e6160e01b1462000c535760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a656374656044820152676420746f6b656e7360c01b6064820152608401620005aa565b6200106886868686868662000e7960201b6200149e1760201c565b6001600160a01b038516620010fc5760005b8351811015620010fa57828181518110620010995762001099620014f2565b602002602001015160036000868481518110620010ba57620010ba620014f2565b602002602001015181526020019081526020016000206000828254620010e19190620014dc565b90915550620010f29050816200175a565b90506200107a565b505b6001600160a01b03841662000e795760005b835181101562000c535760008482815181106200112f576200112f620014f2565b602002602001015190506000848381518110620011505762001150620014f2565b6020026020010151905060006003600084815260200190815260200160002054905081811015620011d55760405162461bcd60e51b815260206004820152602860248201527f455243313135353a206275726e20616d6f756e74206578636565647320746f74604482015267616c537570706c7960c01b6064820152608401620005aa565b60009283526003602052604090922091039055620011f3816200175a565b90506200110e565b6001600160a01b03163b151590565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200123557607f821691505b6020821081036200125657634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620012a657600081815260208120601f850160051c81016020861015620012855750805b601f850160051c820191505b8181101562000e795782815560010162001291565b505050565b81516001600160401b03811115620012c757620012c76200120a565b620012df81620012d8845462001220565b846200125c565b602080601f831160018114620013175760008415620012fe5750858301515b600019600386901b1c1916600185901b17855562000e79565b600085815260208120601f198616915b82811015620013485788860151825594840194600190910190840162001327565b5085821015620013675787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000602082840312156200138a57600080fd5b5051919050565b60005b83811015620013ae57818101518382015260200162001394565b50506000910152565b67030b1b1b7bab73a160c51b815260008251620013dc81600885016020870162001391565b7f20697320616c72656164792068617320616e206f70657261746f7220726f6c656008939091019283015250602801919050565b600081518084526200142a81602086016020860162001391565b601f01601f19169290920160200192915050565b60208152600062000b26602083018462001410565b67030b1b1b7bab73a160c51b8152600082516200147881600885016020870162001391565b7f20697320616c72656164792068617320616e206d696e74657220726f6c6500006008939091019283015250602601919050565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417620009c557620009c5620014ac565b80820180821115620009c557620009c5620014ac565b634e487b7160e01b600052603260045260246000fd5b6000816200151a576200151a620014ac565b506000190190565b67030b1b1b7bab73a160c51b8152600082516200154781600885016020870162001391565b7f206973206e6f7420616e206f70657261746f72000000000000000000000000006008939091019283015250601b01919050565b60008084546200158b8162001220565b60018281168015620015a65760018114620015bc57620015ed565b60ff1984168752821515830287019450620015ed565b8860005260208060002060005b85811015620015e45781548a820152908401908201620015c9565b50505082870194505b5050505083516200160381836020880162001391565b01949350505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090620016489083018462001410565b979650505050505050565b6000602082840312156200166657600080fd5b81516001600160e01b031981168114620009c257600080fd5b600060033d1115620016995760046000803e5060005160e01c5b90565b601f8201601f191681016001600160401b0381118282101715620016c457620016c46200120a565b6040525050565b600060443d1015620016da5790565b6040516003193d81016004833e81513d6001600160401b0380831160248401831017156200170a57505050505090565b8285019150815181811115620017235750505050505090565b843d87010160208285010111156200173e5750505050505090565b6200174f602082860101876200169c565b509095945050505050565b6000600182016200176f576200176f620014ac565b5060010190565b6152c580620017866000396000f3fe60806040526004361061045c5760003560e01c8063715018a61161023f578063b6cbcf3311610139578063df58a1b5116100b6578063f09388891161007a578063f093888914610e4f578063f242432a14610e7f578063f2fde38b14610e9f578063fb796e6c14610ebf578063fdf03cd514610ed957600080fd5b8063df58a1b514610db2578063e1e3617614610dc8578063e8a3d48514610ddb578063e985e9c514610df0578063ea7baab114610e3957600080fd5b8063cbf9fe5f116100fd578063cbf9fe5f14610d0e578063d2de022f14610d47578063d4e45c1414610d67578063d5dcfbc614610d7c578063d78be71c14610d9257600080fd5b8063b6cbcf3314610c44578063b7c0b8e814610c71578063ba05e11514610c91578063bd85b03914610cc1578063c66eceb514610cee57600080fd5b806391e4bac8116101c7578063a22cb4651161018b578063a22cb46514610b8b578063a355fd2914610bab578063aa271e1a14610bcb578063b219f7d714610c04578063b2b1b37b14610c2457600080fd5b806391e4bac814610b0e5780639324b42a14610b2e57806395d89b4114610b4e578063962c167b14610b635780639da9778c14610b8357600080fd5b80638528eefe1161020e5780638528eefe14610a3e578063872a280314610a5e5780638bec504014610a7e5780638da5cb5b14610a9e5780638e37326a14610abc57600080fd5b8063715018a6146109e057806378d8fed8146109f55780637e99896714610a15578063830f821114610a2857600080fd5b80632cda91031161035b5780634bf365df116102d85780635822768b1161029c5780635822768b1461093157806358303b101461095157806369e2f0fb146109675780636d70f7ae146109875780636fa0cf5f146109c057600080fd5b80634bf365df1461087f5780634e1273f4146108955780634f558e79146108c257806355f804b3146108f157806356f5d89d1461091157600080fd5b80633dd1eb611161031f5780633dd1eb61146107c85780634009920d146107e8578063405059601461080257806341f434341461082f57806342454db91461086957600080fd5b80632cda91031461074a5780632e9901f41461076a5780632eb2c2d614610780578063385453cd146107a05780633ccfd60b146107c057600080fd5b806319d580a8116103e9578063267fe989116103ad578063267fe9891461067e57806327ac0c581461069e57806327d22615146106be5780632a55205a146106de5780632c3936ce1461071d57600080fd5b806319d580a8146105a85780631a09cfe2146105c85780631a8b8357146105de578063214344211461060b578063235dfa501461065e57600080fd5b806306fdde031161043057806306fdde03146105065780630b8cb103146105285780630e89341c14610548578063156e29f614610568578063162094c41461058857600080fd5b8062fdd58e1461046157806301ffc9a71461049457806303c0f48c146104c457806304634d8d146104e6575b600080fd5b34801561046d57600080fd5b5061048161047c366004614251565b610ef9565b6040519081526020015b60405180910390f35b3480156104a057600080fd5b506104b46104af366004614291565b610f92565b604051901515815260200161048b565b3480156104d057600080fd5b506104e46104df3660046142ae565b610f9d565b005b3480156104f257600080fd5b506104e46105013660046142c7565b610fab565b34801561051257600080fd5b5061051b610fc2565b60405161048b919061435a565b34801561053457600080fd5b506104e461054336600461436d565b611050565b34801561055457600080fd5b5061051b6105633660046142ae565b61107b565b34801561057457600080fd5b506104e4610583366004614388565b61115b565b34801561059457600080fd5b506104e46105a3366004614470565b6111ad565b3480156105b457600080fd5b506104e46105c3366004614251565b6111c0565b3480156105d457600080fd5b5061048160125481565b3480156105ea57600080fd5b506104816105f93660046142ae565b602d6020526000908152604090205481565b34801561061757600080fd5b5061048161062636600461436d565b60155460009081526028602090815260408083206027835281842054845282528083206001600160a01b039094168352929052205490565b34801561066a57600080fd5b506104e4610679366004614251565b6111ef565b34801561068a57600080fd5b506104e46106993660046142ae565b61121e565b3480156106aa57600080fd5b506104e46106b936600461436d565b611249565b3480156106ca57600080fd5b506104e46106d9366004614251565b61125d565b3480156106ea57600080fd5b506106fe6106f93660046144b6565b61128c565b604080516001600160a01b03909316835260208301919091520161048b565b34801561072957600080fd5b506104816107383660046142ae565b600f6020526000908152604090205481565b34801561075657600080fd5b506104e4610765366004614470565b611338565b34801561077657600080fd5b5061048160115481565b34801561078c57600080fd5b506104e461079b36600461456c565b6113b7565b3480156107ac57600080fd5b506104e46107bb3660046144b6565b6114a6565b6104e46114c0565b3480156107d457600080fd5b506104e46107e336600461436d565b611e40565b3480156107f457600080fd5b506026546104b49060ff1681565b34801561080e57600080fd5b5061048161081d3660046142ae565b60009081526027602052604090205490565b34801561083b57600080fd5b506108516daaeb6d7670e522a718067333cd4e81565b6040516001600160a01b03909116815260200161048b565b34801561087557600080fd5b5061048160105481565b34801561088b57600080fd5b5061048160295481565b3480156108a157600080fd5b506108b56108b0366004614682565b611e51565b60405161048b9190614716565b3480156108ce57600080fd5b506104b46108dd3660046142ae565b600090815260036020526040902054151590565b3480156108fd57600080fd5b506104e461090c366004614729565b611f7a565b34801561091d57600080fd5b506104e461092c366004614773565b611f8c565b34801561093d57600080fd5b506104e461094c366004614251565b611fc0565b34801561095d57600080fd5b50610481600e5481565b34801561097357600080fd5b506104e461098236600461436d565b611fef565b34801561099357600080fd5b506104b46109a236600461436d565b6001600160a01b031660009081526007602052604090205460ff1690565b3480156109cc57600080fd5b506104e46109db3660046144b6565b612000565b3480156109ec57600080fd5b506104e461201b565b348015610a0157600080fd5b506104e4610a1036600461479f565b61202d565b6104e4610a233660046147bc565b612054565b348015610a3457600080fd5b5061048160145481565b348015610a4a57600080fd5b506104e4610a59366004614819565b612332565b348015610a6a57600080fd5b506104e4610a7936600461483e565b61235b565b348015610a8a57600080fd5b506104e4610a99366004614251565b6123d5565b348015610aaa57600080fd5b506006546001600160a01b0316610851565b348015610ac857600080fd5b50610481610ad73660046148aa565b60009182526028602090815260408084206027835281852054855282528084206001600160a01b0393909316845291905290205490565b348015610b1a57600080fd5b506104e4610b293660046142ae565b612404565b348015610b3a57600080fd5b506104e4610b49366004614388565b612412565b348015610b5a57600080fd5b5061051b612426565b348015610b6f57600080fd5b506104e4610b7e366004614251565b612433565b6104e4612462565b348015610b9757600080fd5b506104e4610ba6366004614773565b61249d565b348015610bb757600080fd5b506104e4610bc636600461479f565b612611565b348015610bd757600080fd5b506104b4610be636600461436d565b6001600160a01b031660009081526008602052604090205460ff1690565b348015610c1057600080fd5b506104e4610c1f36600461436d565b61262d565b348015610c3057600080fd5b506104e4610c3f3660046142ae565b61263e565b348015610c5057600080fd5b50610481610c5f3660046142ae565b60276020526000908152604090205481565b348015610c7d57600080fd5b506104e4610c8c36600461479f565b61264c565b348015610c9d57600080fd5b506104b4610cac3660046142ae565b60246020526000908152604090205460ff1681565b348015610ccd57600080fd5b50610481610cdc3660046142ae565b60009081526003602052604090205490565b348015610cfa57600080fd5b506104e4610d093660046144b6565b612668565b348015610d1a57600080fd5b506104b4610d2936600461436d565b6001600160a01b03166000908152602e602052604090205460ff1690565b348015610d5357600080fd5b506104b4610d623660046148d6565b612683565b348015610d7357600080fd5b50600e54610481565b348015610d8857600080fd5b5061048160155481565b348015610d9e57600080fd5b506104e4610dad3660046142ae565b6127b5565b348015610dbe57600080fd5b5061048160165481565b6104e4610dd6366004614922565b6127c3565b348015610de757600080fd5b5061051b612a7f565b348015610dfc57600080fd5b506104b4610e0b36600461497b565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b348015610e4557600080fd5b5061048160135481565b348015610e5b57600080fd5b506104b4610e6a3660046142ae565b60256020526000908152604090205460ff1681565b348015610e8b57600080fd5b506104e4610e9a3660046149a5565b612a8e565b348015610eab57600080fd5b506104e4610eba36600461436d565b612b70565b348015610ecb57600080fd5b50600a546104b49060ff1681565b348015610ee557600080fd5b506104e4610ef43660046142ae565b612be6565b60006001600160a01b038316610f695760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201526930b634b21037bbb732b960b11b60648201526084015b60405180910390fd5b506000818152602081815260408083206001600160a01b03861684529091529020545b92915050565b6000610f8c82612fb4565b610fa633612fd9565b601555565b610fb433612fd9565b610fbe8282613047565b5050565b602a8054610fcf90614a09565b80601f0160208091040260200160405190810160405280929190818152602001828054610ffb90614a09565b80156110485780601f1061101d57610100808354040283529160200191611048565b820191906000526020600020905b81548152906001019060200180831161102b57829003601f168201915b505050505081565b61105933612fd9565b601780546001600160a01b0319166001600160a01b0392909216919091179055565b60008181526005602052604081208054606092919061109990614a09565b80601f01602080910402602001604051908101604052809291908181526020018280546110c590614a09565b80156111125780601f106110e757610100808354040283529160200191611112565b820191906000526020600020905b8154815290600101906020018083116110f557829003601f168201915b5050505050905060008151116111305761112b83612d8f565b611154565b600481604051602001611144929190614a43565b6040516020818303038152906040525b9392505050565b61116433612fd9565b61116d8261107b565b5160000361118d5760405162461bcd60e51b8152600401610f6090614aca565b6111a883838360405180602001604052806000815250613144565b505050565b6111b633612fd9565b610fbe828261325e565b6111c933612fd9565b601a80546001600160a01b0319166001600160a01b039390931692909217909155602055565b6111f833612fd9565b601c80546001600160a01b0319166001600160a01b039390931692909217909155602255565b61122733612fd9565b80600e819055506001601560008282546112419190614b09565b909155505050565b6112516132bb565b61125a81613315565b50565b61126633612fd9565b601980546001600160a01b0319166001600160a01b039390931692909217909155601f55565b6000828152600c602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092528291611301575060408051808201909152600b546001600160a01b0381168252600160a01b90046001600160601b031660208201525b602081015160009061271090611320906001600160601b031687614b1c565b61132a9190614b33565b915196919550909350505050565b61134133612fd9565b61134a8261107b565b511561138d5760405162461bcd60e51b815260206004820152601260248201527153425420616c72656164792065786973747360701b6044820152606401610f60565b602c546040805160208101909152600081526111b6916001600160a01b0316908490600190613144565b846daaeb6d7670e522a718067333cd4e3b158015906113d85750600a5460ff165b1561149157336001600160a01b038216036113ff576113fa868686868661339d565b61149e565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa15801561144e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114729190614b55565b61149157604051633b79c77360e21b8152336004820152602401610f60565b61149e868686868661339d565b505050505050565b6114af33612fd9565b6000908152602d6020526040902055565b6114c933612fd9565b6114d16133e2565b6018546001600160a01b0316158015906114ec5750601e5415155b8061150057506018546001600160a01b0316155b6115635760405162461bcd60e51b815260206004820152602e60248201527f706c656173652073657420776974686472617720416464726573735f6161206160448201526d3732103832b931b2b73a30b3b29760911b6064820152608401610f60565b6019546001600160a01b03161580159061157e5750601f5415155b8061159257506019546001600160a01b0316155b6115f55760405162461bcd60e51b815260206004820152602e60248201527f706c656173652073657420776974686472617720416464726573735f6262206160448201526d3732103832b931b2b73a30b3b29760911b6064820152608401610f60565b601a546001600160a01b031615801590611610575060205415155b806116245750601a546001600160a01b0316155b6116875760405162461bcd60e51b815260206004820152602e60248201527f706c656173652073657420776974686472617720416464726573735f6363206160448201526d3732103832b931b2b73a30b3b29760911b6064820152608401610f60565b601b546001600160a01b0316158015906116a2575060215415155b806116b65750601b546001600160a01b0316155b6117195760405162461bcd60e51b815260206004820152602e60248201527f706c656173652073657420776974686472617720416464726573735f6464206160448201526d3732103832b931b2b73a30b3b29760911b6064820152608401610f60565b601c546001600160a01b031615801590611734575060225415155b806117485750601c546001600160a01b0316155b6117ab5760405162461bcd60e51b815260206004820152602e60248201527f706c656173652073657420776974686472617720416464726573735f6565206160448201526d3732103832b931b2b73a30b3b29760911b6064820152608401610f60565b601d546001600160a01b0316158015906117c6575060235415155b806117da5750601d546001600160a01b0316155b61183d5760405162461bcd60e51b815260206004820152602e60248201527f706c656173652073657420776974686472617720416464726573735f6666206160448201526d3732103832b931b2b73a30b3b29760911b6064820152608401610f60565b60185447906000906001600160a01b03161561191157601854601e546001600160a01b0390911690612710906118739085614b1c565b61187d9190614b33565b604051600081818185875af1925050503d80600081146118b9576040519150601f19603f3d011682016040523d82523d6000602084013e6118be565b606091505b505080915050806119115760405162461bcd60e51b815260206004820152601b60248201527f4661696c656420746f2077697468647261775f616120457468657200000000006044820152606401610f60565b6019546001600160a01b0316156119e057601954601f546001600160a01b0390911690612710906119429085614b1c565b61194c9190614b33565b604051600081818185875af1925050503d8060008114611988576040519150601f19603f3d011682016040523d82523d6000602084013e61198d565b606091505b505080915050806119e05760405162461bcd60e51b815260206004820152601b60248201527f4661696c656420746f2077697468647261775f626220457468657200000000006044820152606401610f60565b601a546001600160a01b031615611aaf57601a546020546001600160a01b039091169061271090611a119085614b1c565b611a1b9190614b33565b604051600081818185875af1925050503d8060008114611a57576040519150601f19603f3d011682016040523d82523d6000602084013e611a5c565b606091505b50508091505080611aaf5760405162461bcd60e51b815260206004820152601b60248201527f4661696c656420746f2077697468647261775f636320457468657200000000006044820152606401610f60565b601b546001600160a01b031615611b7e57601b546021546001600160a01b039091169061271090611ae09085614b1c565b611aea9190614b33565b604051600081818185875af1925050503d8060008114611b26576040519150601f19603f3d011682016040523d82523d6000602084013e611b2b565b606091505b50508091505080611b7e5760405162461bcd60e51b815260206004820152601b60248201527f4661696c656420746f2077697468647261775f646420457468657200000000006044820152606401610f60565b601c546001600160a01b031615611c4d57601c546022546001600160a01b039091169061271090611baf9085614b1c565b611bb99190614b33565b604051600081818185875af1925050503d8060008114611bf5576040519150601f19603f3d011682016040523d82523d6000602084013e611bfa565b606091505b50508091505080611c4d5760405162461bcd60e51b815260206004820152601b60248201527f4661696c656420746f2077697468647261775f656520457468657200000000006044820152606401610f60565b601d546001600160a01b031615611d1c57601d546023546001600160a01b039091169061271090611c7e9085614b1c565b611c889190614b33565b604051600081818185875af1925050503d8060008114611cc4576040519150601f19603f3d011682016040523d82523d6000602084013e611cc9565b606091505b50508091505080611d1c5760405162461bcd60e51b815260206004820152601b60248201527f4661696c656420746f2077697468647261775f666620457468657200000000006044820152606401610f60565b6017544792506001600160a01b031615611d8d576017546040516001600160a01b03909116908390600081818185875af1925050503d8060008114611d7d576040519150601f19603f3d011682016040523d82523d6000602084013e611d82565b606091505b505080915050611de5565b6006546040516001600160a01b03909116908390600081818185875af1925050503d8060008114611dda576040519150601f19603f3d011682016040523d82523d6000602084013e611ddf565b606091505b50909150505b80611e325760405162461bcd60e51b815260206004820152601860248201527f4661696c656420746f20776974686472617720457468657200000000000000006044820152606401610f60565b5050611e3e6001600955565b565b611e486132bb565b61125a8161343b565b60608151835114611eb65760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610f60565b600083516001600160401b03811115611ed157611ed16143bb565b604051908082528060200260200182016040528015611efa578160200160208202803683370190505b50905060005b8451811015611f7257611f45858281518110611f1e57611f1e614b72565b6020026020010151858381518110611f3857611f38614b72565b6020026020010151610ef9565b828281518110611f5757611f57614b72565b6020908102919091010152611f6b81614b88565b9050611f00565b509392505050565b611f8333612fd9565b61125a816134c3565b611f9533612fd9565b6001600160a01b03919091166000908152602e60205260409020805460ff1916911515919091179055565b611fc933612fd9565b601b80546001600160a01b0319166001600160a01b039390931692909217909155602155565b611ff76132bb565b61125a816134cf565b61200933612fd9565b6000918252600d602052604090912055565b6120236132bb565b611e3e60006134f9565b61203633612fd9565b602c8054911515600160a01b0260ff60a01b19909216919091179055565b61205c6133e2565b6120653361354b565b61206e8461107b565b5160000361208e5760405162461bcd60e51b8152600401610f6090614aca565b60008581526025602052604090205460ff166120e65760405162461bcd60e51b8152602060048201526017602482015276185b1b1bdddb1a5cdd135a5b9d081a5cc814185d5cd959604a1b6044820152606401610f60565b6120f1828683612683565b6121385760405162461bcd60e51b8152602060048201526018602482015277596f7520617265206e6f742077686974656c69737465642160401b6044820152606401610f60565b82601154101561215a5760405162461bcd60e51b8152600401610f6090614ba1565b6000858152602d60205260409020548311156121885760405162461bcd60e51b8152600401610f6090614beb565b60008581526028602090815260408083206027835281842054845282528083206001600160a01b03861684529091529020546121c5908490614b09565b6000868152602d602052604090205410156122225760405162461bcd60e51b815260206004820152601e60248201527f596f752068617665206e6f2077686974656c6973744d696e74206c65667400006044820152606401610f60565b6000848152600f602052604090205461223c908490614b1c565b341461225a5760405162461bcd60e51b8152600401610f6090614c33565b6029546000858152600360205260409020546122769085614b09565b1115806122835750602954155b6122be5760405162461bcd60e51b815260206004820152600c60248201526b4e6f206d6f7265204e46547360a01b6044820152606401610f60565b60008581526028602090815260408083206027835281842054845282528083206001600160a01b0386168452909152812080548592906122ff908490614b09565b9250508190555061232182858560405180602001604052806000815250613144565b61232b6001600955565b5050505050565b61233b33612fd9565b600091825260256020526040909120805460ff1916911515919091179055565b61236433612fd9565b60005b83518110156123cf576123bd84828151811061238557612385614b72565b6020026020010151848484815181106123a0576123a0614b72565b602002602001015160405180602001604052806000815250613144565b806123c781614b88565b915050612367565b50505050565b6123de33612fd9565b601880546001600160a01b0319166001600160a01b039390931692909217909155601e55565b61240d33612fd9565b602955565b61241b33612fd9565b6111a8838383613580565b602b8054610fcf90614a09565b61243c33612fd9565b601d80546001600160a01b0319166001600160a01b039390931692909217909155602355565b61246b33612fd9565b6124736133e2565b600034116124935760405162461bcd60e51b8152600401610f6090614c33565b611e3e6001600955565b816daaeb6d7670e522a718067333cd4e3b158015906124be5750600a5460ff165b1561256757604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa15801561251b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061253f9190614b55565b61256757604051633b79c77360e21b81526001600160a01b0382166004820152602401610f60565b6006546001600160a01b03848116911614806125a057506001600160a01b0383166000908152602e602052604090205460ff1615156001145b806125b95750602c54600160a01b900460ff1615156001145b6125fc5760405162461bcd60e51b815260206004820152601460248201527314d95b9908139195081b9bdd08185b1b1bddd95960621b6044820152606401610f60565b6126068383613710565b6111a8338484613717565b61261a33612fd9565b6026805460ff1916911515919091179055565b6126356132bb565b61125a816137f7565b61264733612fd9565b601155565b61265533612fd9565b600a805460ff1916911515919091179055565b61267133612fd9565b6000918252600f602052604090912055565b6040516bffffffffffffffffffffffff19606085901b166020820152600090819060340160405160208183030381529060405280519060200120905060005b835181101561279b578381815181106126dd576126dd614b72565b6020026020010151821061273b578381815181106126fd576126fd614b72565b602002602001015182604051602001612720929190918252602082015260400190565b60405160208183030381529060405280519060200120612787565b8184828151811061274e5761274e614b72565b6020026020010151604051602001612770929190918252602082015260400190565b604051602081830303815290604052805190602001205b91508061279381614b88565b9150506126c2565b506000848152600d60205260409020541490509392505050565b6127be33612fd9565b601055565b6127cb6133e2565b6127d48361107b565b516000036127f45760405162461bcd60e51b8152600401610f6090614aca565b60008481526025602052604090205460ff1661284c5760405162461bcd60e51b8152602060048201526017602482015276185b1b1bdddb1a5cdd135a5b9d081a5cc814185d5cd959604a1b6044820152606401610f60565b612857338583612683565b61289e5760405162461bcd60e51b8152602060048201526018602482015277596f7520617265206e6f742077686974656c69737465642160401b6044820152606401610f60565b8160115410156128c05760405162461bcd60e51b8152600401610f6090614ba1565b6000848152602d60205260409020548211156128ee5760405162461bcd60e51b8152600401610f6090614beb565b6000848152602860209081526040808320602783528184205484528252808320338452909152902054612922908390614b09565b6000858152602d6020526040902054101561297f5760405162461bcd60e51b815260206004820152601e60248201527f596f752068617665206e6f2077686974656c6973744d696e74206c65667400006044820152606401610f60565b6000838152600f6020526040902054612999908390614b1c565b34146129b75760405162461bcd60e51b8152600401610f6090614c33565b6029546000848152600360205260409020546129d39084614b09565b1115806129e05750602954155b612a1b5760405162461bcd60e51b815260206004820152600c60248201526b4e6f206d6f7265204e46547360a01b6044820152606401610f60565b600084815260286020908152604080832060278352818420548452825280832033845290915281208054849290612a53908490614b09565b92505081905550612a7533848460405180602001604052806000815250613144565b6123cf6001600955565b6060612a89613821565b905090565b846daaeb6d7670e522a718067333cd4e3b15801590612aaf5750600a5460ff165b15612b6357336001600160a01b03821603612ad1576113fa86868686866138a1565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015612b20573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b449190614b55565b612b6357604051633b79c77360e21b8152336004820152602401610f60565b61149e86868686866138a1565b612b786132bb565b6001600160a01b038116612bdd5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610f60565b61125a816134f9565b612bef33612fd9565b600e55565b60606000612c03836002614b1c565b612c0e906002614b09565b6001600160401b03811115612c2557612c256143bb565b6040519080825280601f01601f191660200182016040528015612c4f576020820181803683370190505b509050600360fc1b81600081518110612c6a57612c6a614b72565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110612c9957612c99614b72565b60200101906001600160f81b031916908160001a9053506000612cbd846002614b1c565b612cc8906001614b09565b90505b6001811115612d40576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110612cfc57612cfc614b72565b1a60f81b828281518110612d1257612d12614b72565b60200101906001600160f81b031916908160001a90535060049490941c93612d3981614c6a565b9050612ccb565b5083156111545760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610f60565b606060028054612d9e90614a09565b80601f0160208091040260200160405190810160405280929190818152602001828054612dca90614a09565b8015612e175780601f10612dec57610100808354040283529160200191612e17565b820191906000526020600020905b815481529060010190602001808311612dfa57829003601f168201915b50505050509050919050565b6001600160a01b038516612eaa5760005b8351811015612ea857828181518110612e4f57612e4f614b72565b602002602001015160036000868481518110612e6d57612e6d614b72565b602002602001015181526020019081526020016000206000828254612e929190614b09565b90915550612ea1905081614b88565b9050612e34565b505b6001600160a01b03841661149e5760005b8351811015612f9c576000848281518110612ed857612ed8614b72565b602002602001015190506000848381518110612ef657612ef6614b72565b6020026020010151905060006003600084815260200190815260200160002054905081811015612f795760405162461bcd60e51b815260206004820152602860248201527f455243313135353a206275726e20616d6f756e74206578636565647320746f74604482015267616c537570706c7960c01b6064820152608401610f60565b60009283526003602052604090922091039055612f9581614b88565b9050612ebb565b50505050505050565b6001600160a01b03163b151590565b60006001600160e01b0319821663152a902d60e11b1480610f8c5750610f8c826138e6565b6001600160a01b03811660009081526007602052604090205460ff1661300a335b6001600160a01b03166014612bf4565b60405160200161301a9190614c81565b60405160208183030381529060405290610fbe5760405162461bcd60e51b8152600401610f60919061435a565b6127106001600160601b03821611156130b55760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b6064820152608401610f60565b6001600160a01b03821661310b5760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401610f60565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600b55565b6001600160a01b0384166131a45760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610f60565b3360006131b085613936565b905060006131bd85613936565b90506131ce83600089858589613981565b6000868152602081815260408083206001600160a01b038b168452909152812080548792906131fe908490614b09565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4612f9c83600089898989613a36565b60008281526005602052604090206132768282614d14565b50817f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b6132a28461107b565b6040516132af919061435a565b60405180910390a25050565b6006546001600160a01b03163314611e3e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610f60565b6001600160a01b03811660009081526007602052604090205460ff161561333b33612ffa565b60405160200161334b9190614dd3565b604051602081830303815290604052906133785760405162461bcd60e51b8152600401610f60919061435a565b506001600160a01b03166000908152600760205260409020805460ff19166001179055565b6001600160a01b0385163314806133b957506133b98533610e0b565b6133d55760405162461bcd60e51b8152600401610f6090614e2a565b61232b8585858585613b91565b6002600954036134345760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610f60565b6002600955565b6001600160a01b03811660009081526008602052604090205460ff161561346133612ffa565b6040516020016134719190614e78565b6040516020818303038152906040529061349e5760405162461bcd60e51b8152600401610f60919061435a565b506001600160a01b03166000908152600860205260409020805460ff19166001179055565b6004610fbe8282614d14565b6134d88161354b565b6001600160a01b03166000908152600860205260409020805460ff19169055565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b03811660009081526008602052604090205460ff1661357033612ffa565b60405160200161301a9190614ecf565b6001600160a01b0383166135e25760405162461bcd60e51b815260206004820152602360248201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260448201526265737360e81b6064820152608401610f60565b3360006135ee84613936565b905060006135fb84613936565b905061361b83876000858560405180602001604052806000815250613981565b6000858152602081815260408083206001600160a01b038a168452909152902054848110156136985760405162461bcd60e51b8152602060048201526024808201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604482015263616e636560e01b6064820152608401610f60565b6000868152602081815260408083206001600160a01b038b81168086529184528285208a8703905582518b81529384018a90529092908816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4604080516020810190915260009052612f9c565b610fbe3383835b816001600160a01b0316836001600160a01b03160361378a5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610f60565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61380081612fd9565b6001600160a01b03166000908152600760205260409020805460ff19169055565b60606000806138328161271061128c565b9150915061387b61384282613d74565b613856846001600160a01b03166014612bf4565b604051602001613867929190614f1a565b604051602081830303815290604052613e06565b60405160200161388b9190614fa0565b6040516020818303038152906040529250505090565b6001600160a01b0385163314806138bd57506138bd8533610e0b565b6138d95760405162461bcd60e51b8152600401610f6090614e2a565b61232b8585858585613f6a565b60006001600160e01b03198216636cdb3d1360e11b148061391757506001600160e01b031982166303a24d0760e21b145b80610f8c57506301ffc9a760e01b6001600160e01b0319831614610f8c565b6040805160018082528183019092526060916000919060208083019080368337019050509050828160008151811061397057613970614b72565b602090810291909101015292915050565b6006546001600160a01b03878116911614806139ba57506001600160a01b0386166000908152602e602052604090205460ff1615156001145b806139d35750602c54600160a01b900460ff1615156001145b806139e557506001600160a01b038516155b613a285760405162461bcd60e51b815260206004820152601460248201527314d95b9908139195081b9bdd08185b1b1bddd95960621b6044820152606401610f60565b61149e868686868686612e23565b6001600160a01b0384163b1561149e5760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190613a7a9089908990889088908890600401614fe5565b6020604051808303816000875af1925050508015613ab5575060408051601f3d908101601f19168201909252613ab29181019061502a565b60015b613b6157613ac1615047565b806308c379a003613afa5750613ad5615063565b80613ae05750613afc565b8060405162461bcd60e51b8152600401610f60919061435a565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e2d455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610f60565b6001600160e01b0319811663f23a6e6160e01b14612f9c5760405162461bcd60e51b8152600401610f60906150ec565b8151835114613bf35760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b6064820152608401610f60565b6001600160a01b038416613c195760405162461bcd60e51b8152600401610f6090615134565b33613c28818787878787613981565b60005b8451811015613d0e576000858281518110613c4857613c48614b72565b602002602001015190506000858381518110613c6657613c66614b72565b602090810291909101810151600084815280835260408082206001600160a01b038e168352909352919091205490915081811015613cb65760405162461bcd60e51b8152600401610f6090615179565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290613cf3908490614b09565b9250508190555050505080613d0790614b88565b9050613c2b565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051613d5e9291906151c3565b60405180910390a461149e8187878787876140a2565b60606000613d818361415d565b60010190506000816001600160401b03811115613da057613da06143bb565b6040519080825280601f01601f191660200182016040528015613dca576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084613dd457509392505050565b60608151600003613e2557505060408051602081019091526000815290565b60006040518060600160405280604081526020016152506040913990506000600384516002613e549190614b09565b613e5e9190614b33565b613e69906004614b1c565b90506000613e78826020614b09565b6001600160401b03811115613e8f57613e8f6143bb565b6040519080825280601f01601f191660200182016040528015613eb9576020820181803683370190505b509050818152600183018586518101602084015b81831015613f25576003830192508251603f8160121c168501518253600182019150603f81600c1c168501518253600182019150603f8160061c168501518253600182019150603f8116850151825350600101613ecd565b600389510660018114613f3f5760028114613f5057613f5c565b613d3d60f01b600119830152613f5c565b603d60f81b6000198301525b509398975050505050505050565b6001600160a01b038416613f905760405162461bcd60e51b8152600401610f6090615134565b336000613f9c85613936565b90506000613fa985613936565b9050613fb9838989858589613981565b6000868152602081815260408083206001600160a01b038c16845290915290205485811015613ffa5760405162461bcd60e51b8152600401610f6090615179565b6000878152602081815260408083206001600160a01b038d8116855292528083208985039055908a16825281208054889290614037908490614b09565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4614097848a8a8a8a8a613a36565b505050505050505050565b6001600160a01b0384163b1561149e5760405163bc197c8160e01b81526001600160a01b0385169063bc197c81906140e690899089908890889088906004016151f1565b6020604051808303816000875af1925050508015614121575060408051601f3d908101601f1916820190925261411e9181019061502a565b60015b61412d57613ac1615047565b6001600160e01b0319811663bc197c8160e01b14612f9c5760405162461bcd60e51b8152600401610f60906150ec565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b831061419c5772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef810000000083106141c8576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc1000083106141e657662386f26fc10000830492506010015b6305f5e10083106141fe576305f5e100830492506008015b612710831061421257612710830492506004015b60648310614224576064830492506002015b600a8310610f8c5760010192915050565b80356001600160a01b038116811461424c57600080fd5b919050565b6000806040838503121561426457600080fd5b61426d83614235565b946020939093013593505050565b6001600160e01b03198116811461125a57600080fd5b6000602082840312156142a357600080fd5b81356111548161427b565b6000602082840312156142c057600080fd5b5035919050565b600080604083850312156142da57600080fd5b6142e383614235565b915060208301356001600160601b03811681146142ff57600080fd5b809150509250929050565b60005b8381101561432557818101518382015260200161430d565b50506000910152565b6000815180845261434681602086016020860161430a565b601f01601f19169290920160200192915050565b602081526000611154602083018461432e565b60006020828403121561437f57600080fd5b61115482614235565b60008060006060848603121561439d57600080fd5b6143a684614235565b95602085013595506040909401359392505050565b634e487b7160e01b600052604160045260246000fd5b601f8201601f191681016001600160401b03811182821017156143f6576143f66143bb565b6040525050565b600082601f83011261440e57600080fd5b81356001600160401b03811115614427576144276143bb565b60405161443e601f8301601f1916602001826143d1565b81815284602083860101111561445357600080fd5b816020850160208301376000918101602001919091529392505050565b6000806040838503121561448357600080fd5b8235915060208301356001600160401b038111156144a057600080fd5b6144ac858286016143fd565b9150509250929050565b600080604083850312156144c957600080fd5b50508035926020909101359150565b60006001600160401b038211156144f1576144f16143bb565b5060051b60200190565b600082601f83011261450c57600080fd5b81356020614519826144d8565b60405161452682826143d1565b83815260059390931b850182019282810191508684111561454657600080fd5b8286015b84811015614561578035835291830191830161454a565b509695505050505050565b600080600080600060a0868803121561458457600080fd5b61458d86614235565b945061459b60208701614235565b935060408601356001600160401b03808211156145b757600080fd5b6145c389838a016144fb565b945060608801359150808211156145d957600080fd5b6145e589838a016144fb565b935060808801359150808211156145fb57600080fd5b50614608888289016143fd565b9150509295509295909350565b600082601f83011261462657600080fd5b81356020614633826144d8565b60405161464082826143d1565b83815260059390931b850182019282810191508684111561466057600080fd5b8286015b848110156145615761467581614235565b8352918301918301614664565b6000806040838503121561469557600080fd5b82356001600160401b03808211156146ac57600080fd5b6146b886838701614615565b935060208501359150808211156146ce57600080fd5b506144ac858286016144fb565b600081518084526020808501945080840160005b8381101561470b578151875295820195908201906001016146ef565b509495945050505050565b60208152600061115460208301846146db565b60006020828403121561473b57600080fd5b81356001600160401b0381111561475157600080fd5b61475d848285016143fd565b949350505050565b801515811461125a57600080fd5b6000806040838503121561478657600080fd5b61478f83614235565b915060208301356142ff81614765565b6000602082840312156147b157600080fd5b813561115481614765565b600080600080600060a086880312156147d457600080fd5b8535945060208601359350604086013592506147f260608701614235565b915060808601356001600160401b0381111561480d57600080fd5b614608888289016144fb565b6000806040838503121561482c57600080fd5b8235915060208301356142ff81614765565b60008060006060848603121561485357600080fd5b83356001600160401b038082111561486a57600080fd5b61487687838801614615565b945060208601359350604086013591508082111561489357600080fd5b506148a0868287016144fb565b9150509250925092565b600080604083850312156148bd57600080fd5b823591506148cd60208401614235565b90509250929050565b6000806000606084860312156148eb57600080fd5b6148f484614235565b92506020840135915060408401356001600160401b0381111561491657600080fd5b6148a0868287016144fb565b6000806000806080858703121561493857600080fd5b84359350602085013592506040850135915060608501356001600160401b0381111561496357600080fd5b61496f878288016144fb565b91505092959194509250565b6000806040838503121561498e57600080fd5b61499783614235565b91506148cd60208401614235565b600080600080600060a086880312156149bd57600080fd5b6149c686614235565b94506149d460208701614235565b9350604086013592506060860135915060808601356001600160401b038111156149fd57600080fd5b614608888289016143fd565b600181811c90821680614a1d57607f821691505b602082108103614a3d57634e487b7160e01b600052602260045260246000fd5b50919050565b6000808454614a5181614a09565b60018281168015614a695760018114614a7e57614aad565b60ff1984168752821515830287019450614aad565b8860005260208060002060005b85811015614aa45781548a820152908401908201614a8b565b50505082870194505b505050508351614ac181836020880161430a565b01949350505050565b6020808252600f908201526e139bdd081a5b9a5d1a585b1a5e9959608a1b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b80820180821115610f8c57610f8c614af3565b8082028115828204841417610f8c57610f8c614af3565b600082614b5057634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215614b6757600080fd5b815161115481614765565b634e487b7160e01b600052603260045260246000fd5b600060018201614b9a57614b9a614af3565b5060010190565b6020808252602a908201527f616c6c6f776c6973744d696e743a204f766572206d6178206d696e747320706560408201526972206f6e652074696d6560b01b606082015260800190565b60208082526028908201527f616c6c6f776c6973744d696e743a204f766572206d6178206d696e74732070656040820152671c881dd85b1b195d60c21b606082015260800190565b60208082526018908201527f4554482076616c7565206973206e6f7420636f72726563740000000000000000604082015260600190565b600081614c7957614c79614af3565b506000190190565b67030b1b1b7bab73a160c51b815260008251614ca481600885016020870161430a565b721034b9903737ba1030b71037b832b930ba37b960691b6008939091019283015250601b01919050565b601f8211156111a857600081815260208120601f850160051c81016020861015614cf55750805b601f850160051c820191505b8181101561149e57828155600101614d01565b81516001600160401b03811115614d2d57614d2d6143bb565b614d4181614d3b8454614a09565b84614cce565b602080601f831160018114614d765760008415614d5e5750858301515b600019600386901b1c1916600185901b17855561149e565b600085815260208120601f198616915b82811015614da557888601518255948401946001909101908401614d86565b5085821015614dc35787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b67030b1b1b7bab73a160c51b815260008251614df681600885016020870161430a565b7f20697320616c72656164792068617320616e206f70657261746f7220726f6c656008939091019283015250602801919050565b6020808252602e908201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60408201526d195c881bdc88185c1c1c9bdd995960921b606082015260800190565b67030b1b1b7bab73a160c51b815260008251614e9b81600885016020870161430a565b7f20697320616c72656164792068617320616e206d696e74657220726f6c6500006008939091019283015250602601919050565b67030b1b1b7bab73a160c51b815260008251614ef281600885016020870161430a565b701034b9903737ba1030b71036b4b73a32b960791b6008939091019283015250601901919050565b7f7b2273656c6c65725f6665655f62617369735f706f696e7473223a0000000000815260008351614f5281601b85016020880161430a565b721610113332b2afb932b1b4b834b2b73a111d1160691b601b918401918201528351614f8581602e84016020880161430a565b61227d60f01b602e9290910191820152603001949350505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815260008251614fd881601d85016020870161430a565b91909101601d0192915050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a06080820181905260009061501f9083018461432e565b979650505050505050565b60006020828403121561503c57600080fd5b81516111548161427b565b600060033d11156150605760046000803e5060005160e01c5b90565b600060443d10156150715790565b6040516003193d81016004833e81513d6001600160401b0381602484011181841117156150a057505050505090565b82850191508151818111156150b85750505050505090565b843d87010160208285010111156150d25750505050505090565b6150e1602082860101876143d1565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b6040815260006151d660408301856146db565b82810360208401526151e881856146db565b95945050505050565b6001600160a01b0386811682528516602082015260a06040820181905260009061521d908301866146db565b828103606084015261522f81866146db565b90508281036080840152615243818561432e565b9897505050505050505056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220a1219e0f0fbe4e6bb26d0126744724fd0f5be0f1bc1d7106164ac9a47d725f3064736f6c6343000811003368747470733a2f2f617277656176652e6e65742f7749585f795a664b796e4c6e30315878594e6a4477423277324d53372d6f72514e4662544c436f3855584d2f00000000000000000000000000000000000000000000000000000000000003e8

Deployed Bytecode

0x60806040526004361061045c5760003560e01c8063715018a61161023f578063b6cbcf3311610139578063df58a1b5116100b6578063f09388891161007a578063f093888914610e4f578063f242432a14610e7f578063f2fde38b14610e9f578063fb796e6c14610ebf578063fdf03cd514610ed957600080fd5b8063df58a1b514610db2578063e1e3617614610dc8578063e8a3d48514610ddb578063e985e9c514610df0578063ea7baab114610e3957600080fd5b8063cbf9fe5f116100fd578063cbf9fe5f14610d0e578063d2de022f14610d47578063d4e45c1414610d67578063d5dcfbc614610d7c578063d78be71c14610d9257600080fd5b8063b6cbcf3314610c44578063b7c0b8e814610c71578063ba05e11514610c91578063bd85b03914610cc1578063c66eceb514610cee57600080fd5b806391e4bac8116101c7578063a22cb4651161018b578063a22cb46514610b8b578063a355fd2914610bab578063aa271e1a14610bcb578063b219f7d714610c04578063b2b1b37b14610c2457600080fd5b806391e4bac814610b0e5780639324b42a14610b2e57806395d89b4114610b4e578063962c167b14610b635780639da9778c14610b8357600080fd5b80638528eefe1161020e5780638528eefe14610a3e578063872a280314610a5e5780638bec504014610a7e5780638da5cb5b14610a9e5780638e37326a14610abc57600080fd5b8063715018a6146109e057806378d8fed8146109f55780637e99896714610a15578063830f821114610a2857600080fd5b80632cda91031161035b5780634bf365df116102d85780635822768b1161029c5780635822768b1461093157806358303b101461095157806369e2f0fb146109675780636d70f7ae146109875780636fa0cf5f146109c057600080fd5b80634bf365df1461087f5780634e1273f4146108955780634f558e79146108c257806355f804b3146108f157806356f5d89d1461091157600080fd5b80633dd1eb611161031f5780633dd1eb61146107c85780634009920d146107e8578063405059601461080257806341f434341461082f57806342454db91461086957600080fd5b80632cda91031461074a5780632e9901f41461076a5780632eb2c2d614610780578063385453cd146107a05780633ccfd60b146107c057600080fd5b806319d580a8116103e9578063267fe989116103ad578063267fe9891461067e57806327ac0c581461069e57806327d22615146106be5780632a55205a146106de5780632c3936ce1461071d57600080fd5b806319d580a8146105a85780631a09cfe2146105c85780631a8b8357146105de578063214344211461060b578063235dfa501461065e57600080fd5b806306fdde031161043057806306fdde03146105065780630b8cb103146105285780630e89341c14610548578063156e29f614610568578063162094c41461058857600080fd5b8062fdd58e1461046157806301ffc9a71461049457806303c0f48c146104c457806304634d8d146104e6575b600080fd5b34801561046d57600080fd5b5061048161047c366004614251565b610ef9565b6040519081526020015b60405180910390f35b3480156104a057600080fd5b506104b46104af366004614291565b610f92565b604051901515815260200161048b565b3480156104d057600080fd5b506104e46104df3660046142ae565b610f9d565b005b3480156104f257600080fd5b506104e46105013660046142c7565b610fab565b34801561051257600080fd5b5061051b610fc2565b60405161048b919061435a565b34801561053457600080fd5b506104e461054336600461436d565b611050565b34801561055457600080fd5b5061051b6105633660046142ae565b61107b565b34801561057457600080fd5b506104e4610583366004614388565b61115b565b34801561059457600080fd5b506104e46105a3366004614470565b6111ad565b3480156105b457600080fd5b506104e46105c3366004614251565b6111c0565b3480156105d457600080fd5b5061048160125481565b3480156105ea57600080fd5b506104816105f93660046142ae565b602d6020526000908152604090205481565b34801561061757600080fd5b5061048161062636600461436d565b60155460009081526028602090815260408083206027835281842054845282528083206001600160a01b039094168352929052205490565b34801561066a57600080fd5b506104e4610679366004614251565b6111ef565b34801561068a57600080fd5b506104e46106993660046142ae565b61121e565b3480156106aa57600080fd5b506104e46106b936600461436d565b611249565b3480156106ca57600080fd5b506104e46106d9366004614251565b61125d565b3480156106ea57600080fd5b506106fe6106f93660046144b6565b61128c565b604080516001600160a01b03909316835260208301919091520161048b565b34801561072957600080fd5b506104816107383660046142ae565b600f6020526000908152604090205481565b34801561075657600080fd5b506104e4610765366004614470565b611338565b34801561077657600080fd5b5061048160115481565b34801561078c57600080fd5b506104e461079b36600461456c565b6113b7565b3480156107ac57600080fd5b506104e46107bb3660046144b6565b6114a6565b6104e46114c0565b3480156107d457600080fd5b506104e46107e336600461436d565b611e40565b3480156107f457600080fd5b506026546104b49060ff1681565b34801561080e57600080fd5b5061048161081d3660046142ae565b60009081526027602052604090205490565b34801561083b57600080fd5b506108516daaeb6d7670e522a718067333cd4e81565b6040516001600160a01b03909116815260200161048b565b34801561087557600080fd5b5061048160105481565b34801561088b57600080fd5b5061048160295481565b3480156108a157600080fd5b506108b56108b0366004614682565b611e51565b60405161048b9190614716565b3480156108ce57600080fd5b506104b46108dd3660046142ae565b600090815260036020526040902054151590565b3480156108fd57600080fd5b506104e461090c366004614729565b611f7a565b34801561091d57600080fd5b506104e461092c366004614773565b611f8c565b34801561093d57600080fd5b506104e461094c366004614251565b611fc0565b34801561095d57600080fd5b50610481600e5481565b34801561097357600080fd5b506104e461098236600461436d565b611fef565b34801561099357600080fd5b506104b46109a236600461436d565b6001600160a01b031660009081526007602052604090205460ff1690565b3480156109cc57600080fd5b506104e46109db3660046144b6565b612000565b3480156109ec57600080fd5b506104e461201b565b348015610a0157600080fd5b506104e4610a1036600461479f565b61202d565b6104e4610a233660046147bc565b612054565b348015610a3457600080fd5b5061048160145481565b348015610a4a57600080fd5b506104e4610a59366004614819565b612332565b348015610a6a57600080fd5b506104e4610a7936600461483e565b61235b565b348015610a8a57600080fd5b506104e4610a99366004614251565b6123d5565b348015610aaa57600080fd5b506006546001600160a01b0316610851565b348015610ac857600080fd5b50610481610ad73660046148aa565b60009182526028602090815260408084206027835281852054855282528084206001600160a01b0393909316845291905290205490565b348015610b1a57600080fd5b506104e4610b293660046142ae565b612404565b348015610b3a57600080fd5b506104e4610b49366004614388565b612412565b348015610b5a57600080fd5b5061051b612426565b348015610b6f57600080fd5b506104e4610b7e366004614251565b612433565b6104e4612462565b348015610b9757600080fd5b506104e4610ba6366004614773565b61249d565b348015610bb757600080fd5b506104e4610bc636600461479f565b612611565b348015610bd757600080fd5b506104b4610be636600461436d565b6001600160a01b031660009081526008602052604090205460ff1690565b348015610c1057600080fd5b506104e4610c1f36600461436d565b61262d565b348015610c3057600080fd5b506104e4610c3f3660046142ae565b61263e565b348015610c5057600080fd5b50610481610c5f3660046142ae565b60276020526000908152604090205481565b348015610c7d57600080fd5b506104e4610c8c36600461479f565b61264c565b348015610c9d57600080fd5b506104b4610cac3660046142ae565b60246020526000908152604090205460ff1681565b348015610ccd57600080fd5b50610481610cdc3660046142ae565b60009081526003602052604090205490565b348015610cfa57600080fd5b506104e4610d093660046144b6565b612668565b348015610d1a57600080fd5b506104b4610d2936600461436d565b6001600160a01b03166000908152602e602052604090205460ff1690565b348015610d5357600080fd5b506104b4610d623660046148d6565b612683565b348015610d7357600080fd5b50600e54610481565b348015610d8857600080fd5b5061048160155481565b348015610d9e57600080fd5b506104e4610dad3660046142ae565b6127b5565b348015610dbe57600080fd5b5061048160165481565b6104e4610dd6366004614922565b6127c3565b348015610de757600080fd5b5061051b612a7f565b348015610dfc57600080fd5b506104b4610e0b36600461497b565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b348015610e4557600080fd5b5061048160135481565b348015610e5b57600080fd5b506104b4610e6a3660046142ae565b60256020526000908152604090205460ff1681565b348015610e8b57600080fd5b506104e4610e9a3660046149a5565b612a8e565b348015610eab57600080fd5b506104e4610eba36600461436d565b612b70565b348015610ecb57600080fd5b50600a546104b49060ff1681565b348015610ee557600080fd5b506104e4610ef43660046142ae565b612be6565b60006001600160a01b038316610f695760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201526930b634b21037bbb732b960b11b60648201526084015b60405180910390fd5b506000818152602081815260408083206001600160a01b03861684529091529020545b92915050565b6000610f8c82612fb4565b610fa633612fd9565b601555565b610fb433612fd9565b610fbe8282613047565b5050565b602a8054610fcf90614a09565b80601f0160208091040260200160405190810160405280929190818152602001828054610ffb90614a09565b80156110485780601f1061101d57610100808354040283529160200191611048565b820191906000526020600020905b81548152906001019060200180831161102b57829003601f168201915b505050505081565b61105933612fd9565b601780546001600160a01b0319166001600160a01b0392909216919091179055565b60008181526005602052604081208054606092919061109990614a09565b80601f01602080910402602001604051908101604052809291908181526020018280546110c590614a09565b80156111125780601f106110e757610100808354040283529160200191611112565b820191906000526020600020905b8154815290600101906020018083116110f557829003601f168201915b5050505050905060008151116111305761112b83612d8f565b611154565b600481604051602001611144929190614a43565b6040516020818303038152906040525b9392505050565b61116433612fd9565b61116d8261107b565b5160000361118d5760405162461bcd60e51b8152600401610f6090614aca565b6111a883838360405180602001604052806000815250613144565b505050565b6111b633612fd9565b610fbe828261325e565b6111c933612fd9565b601a80546001600160a01b0319166001600160a01b039390931692909217909155602055565b6111f833612fd9565b601c80546001600160a01b0319166001600160a01b039390931692909217909155602255565b61122733612fd9565b80600e819055506001601560008282546112419190614b09565b909155505050565b6112516132bb565b61125a81613315565b50565b61126633612fd9565b601980546001600160a01b0319166001600160a01b039390931692909217909155601f55565b6000828152600c602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092528291611301575060408051808201909152600b546001600160a01b0381168252600160a01b90046001600160601b031660208201525b602081015160009061271090611320906001600160601b031687614b1c565b61132a9190614b33565b915196919550909350505050565b61134133612fd9565b61134a8261107b565b511561138d5760405162461bcd60e51b815260206004820152601260248201527153425420616c72656164792065786973747360701b6044820152606401610f60565b602c546040805160208101909152600081526111b6916001600160a01b0316908490600190613144565b846daaeb6d7670e522a718067333cd4e3b158015906113d85750600a5460ff165b1561149157336001600160a01b038216036113ff576113fa868686868661339d565b61149e565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa15801561144e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114729190614b55565b61149157604051633b79c77360e21b8152336004820152602401610f60565b61149e868686868661339d565b505050505050565b6114af33612fd9565b6000908152602d6020526040902055565b6114c933612fd9565b6114d16133e2565b6018546001600160a01b0316158015906114ec5750601e5415155b8061150057506018546001600160a01b0316155b6115635760405162461bcd60e51b815260206004820152602e60248201527f706c656173652073657420776974686472617720416464726573735f6161206160448201526d3732103832b931b2b73a30b3b29760911b6064820152608401610f60565b6019546001600160a01b03161580159061157e5750601f5415155b8061159257506019546001600160a01b0316155b6115f55760405162461bcd60e51b815260206004820152602e60248201527f706c656173652073657420776974686472617720416464726573735f6262206160448201526d3732103832b931b2b73a30b3b29760911b6064820152608401610f60565b601a546001600160a01b031615801590611610575060205415155b806116245750601a546001600160a01b0316155b6116875760405162461bcd60e51b815260206004820152602e60248201527f706c656173652073657420776974686472617720416464726573735f6363206160448201526d3732103832b931b2b73a30b3b29760911b6064820152608401610f60565b601b546001600160a01b0316158015906116a2575060215415155b806116b65750601b546001600160a01b0316155b6117195760405162461bcd60e51b815260206004820152602e60248201527f706c656173652073657420776974686472617720416464726573735f6464206160448201526d3732103832b931b2b73a30b3b29760911b6064820152608401610f60565b601c546001600160a01b031615801590611734575060225415155b806117485750601c546001600160a01b0316155b6117ab5760405162461bcd60e51b815260206004820152602e60248201527f706c656173652073657420776974686472617720416464726573735f6565206160448201526d3732103832b931b2b73a30b3b29760911b6064820152608401610f60565b601d546001600160a01b0316158015906117c6575060235415155b806117da5750601d546001600160a01b0316155b61183d5760405162461bcd60e51b815260206004820152602e60248201527f706c656173652073657420776974686472617720416464726573735f6666206160448201526d3732103832b931b2b73a30b3b29760911b6064820152608401610f60565b60185447906000906001600160a01b03161561191157601854601e546001600160a01b0390911690612710906118739085614b1c565b61187d9190614b33565b604051600081818185875af1925050503d80600081146118b9576040519150601f19603f3d011682016040523d82523d6000602084013e6118be565b606091505b505080915050806119115760405162461bcd60e51b815260206004820152601b60248201527f4661696c656420746f2077697468647261775f616120457468657200000000006044820152606401610f60565b6019546001600160a01b0316156119e057601954601f546001600160a01b0390911690612710906119429085614b1c565b61194c9190614b33565b604051600081818185875af1925050503d8060008114611988576040519150601f19603f3d011682016040523d82523d6000602084013e61198d565b606091505b505080915050806119e05760405162461bcd60e51b815260206004820152601b60248201527f4661696c656420746f2077697468647261775f626220457468657200000000006044820152606401610f60565b601a546001600160a01b031615611aaf57601a546020546001600160a01b039091169061271090611a119085614b1c565b611a1b9190614b33565b604051600081818185875af1925050503d8060008114611a57576040519150601f19603f3d011682016040523d82523d6000602084013e611a5c565b606091505b50508091505080611aaf5760405162461bcd60e51b815260206004820152601b60248201527f4661696c656420746f2077697468647261775f636320457468657200000000006044820152606401610f60565b601b546001600160a01b031615611b7e57601b546021546001600160a01b039091169061271090611ae09085614b1c565b611aea9190614b33565b604051600081818185875af1925050503d8060008114611b26576040519150601f19603f3d011682016040523d82523d6000602084013e611b2b565b606091505b50508091505080611b7e5760405162461bcd60e51b815260206004820152601b60248201527f4661696c656420746f2077697468647261775f646420457468657200000000006044820152606401610f60565b601c546001600160a01b031615611c4d57601c546022546001600160a01b039091169061271090611baf9085614b1c565b611bb99190614b33565b604051600081818185875af1925050503d8060008114611bf5576040519150601f19603f3d011682016040523d82523d6000602084013e611bfa565b606091505b50508091505080611c4d5760405162461bcd60e51b815260206004820152601b60248201527f4661696c656420746f2077697468647261775f656520457468657200000000006044820152606401610f60565b601d546001600160a01b031615611d1c57601d546023546001600160a01b039091169061271090611c7e9085614b1c565b611c889190614b33565b604051600081818185875af1925050503d8060008114611cc4576040519150601f19603f3d011682016040523d82523d6000602084013e611cc9565b606091505b50508091505080611d1c5760405162461bcd60e51b815260206004820152601b60248201527f4661696c656420746f2077697468647261775f666620457468657200000000006044820152606401610f60565b6017544792506001600160a01b031615611d8d576017546040516001600160a01b03909116908390600081818185875af1925050503d8060008114611d7d576040519150601f19603f3d011682016040523d82523d6000602084013e611d82565b606091505b505080915050611de5565b6006546040516001600160a01b03909116908390600081818185875af1925050503d8060008114611dda576040519150601f19603f3d011682016040523d82523d6000602084013e611ddf565b606091505b50909150505b80611e325760405162461bcd60e51b815260206004820152601860248201527f4661696c656420746f20776974686472617720457468657200000000000000006044820152606401610f60565b5050611e3e6001600955565b565b611e486132bb565b61125a8161343b565b60608151835114611eb65760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610f60565b600083516001600160401b03811115611ed157611ed16143bb565b604051908082528060200260200182016040528015611efa578160200160208202803683370190505b50905060005b8451811015611f7257611f45858281518110611f1e57611f1e614b72565b6020026020010151858381518110611f3857611f38614b72565b6020026020010151610ef9565b828281518110611f5757611f57614b72565b6020908102919091010152611f6b81614b88565b9050611f00565b509392505050565b611f8333612fd9565b61125a816134c3565b611f9533612fd9565b6001600160a01b03919091166000908152602e60205260409020805460ff1916911515919091179055565b611fc933612fd9565b601b80546001600160a01b0319166001600160a01b039390931692909217909155602155565b611ff76132bb565b61125a816134cf565b61200933612fd9565b6000918252600d602052604090912055565b6120236132bb565b611e3e60006134f9565b61203633612fd9565b602c8054911515600160a01b0260ff60a01b19909216919091179055565b61205c6133e2565b6120653361354b565b61206e8461107b565b5160000361208e5760405162461bcd60e51b8152600401610f6090614aca565b60008581526025602052604090205460ff166120e65760405162461bcd60e51b8152602060048201526017602482015276185b1b1bdddb1a5cdd135a5b9d081a5cc814185d5cd959604a1b6044820152606401610f60565b6120f1828683612683565b6121385760405162461bcd60e51b8152602060048201526018602482015277596f7520617265206e6f742077686974656c69737465642160401b6044820152606401610f60565b82601154101561215a5760405162461bcd60e51b8152600401610f6090614ba1565b6000858152602d60205260409020548311156121885760405162461bcd60e51b8152600401610f6090614beb565b60008581526028602090815260408083206027835281842054845282528083206001600160a01b03861684529091529020546121c5908490614b09565b6000868152602d602052604090205410156122225760405162461bcd60e51b815260206004820152601e60248201527f596f752068617665206e6f2077686974656c6973744d696e74206c65667400006044820152606401610f60565b6000848152600f602052604090205461223c908490614b1c565b341461225a5760405162461bcd60e51b8152600401610f6090614c33565b6029546000858152600360205260409020546122769085614b09565b1115806122835750602954155b6122be5760405162461bcd60e51b815260206004820152600c60248201526b4e6f206d6f7265204e46547360a01b6044820152606401610f60565b60008581526028602090815260408083206027835281842054845282528083206001600160a01b0386168452909152812080548592906122ff908490614b09565b9250508190555061232182858560405180602001604052806000815250613144565b61232b6001600955565b5050505050565b61233b33612fd9565b600091825260256020526040909120805460ff1916911515919091179055565b61236433612fd9565b60005b83518110156123cf576123bd84828151811061238557612385614b72565b6020026020010151848484815181106123a0576123a0614b72565b602002602001015160405180602001604052806000815250613144565b806123c781614b88565b915050612367565b50505050565b6123de33612fd9565b601880546001600160a01b0319166001600160a01b039390931692909217909155601e55565b61240d33612fd9565b602955565b61241b33612fd9565b6111a8838383613580565b602b8054610fcf90614a09565b61243c33612fd9565b601d80546001600160a01b0319166001600160a01b039390931692909217909155602355565b61246b33612fd9565b6124736133e2565b600034116124935760405162461bcd60e51b8152600401610f6090614c33565b611e3e6001600955565b816daaeb6d7670e522a718067333cd4e3b158015906124be5750600a5460ff165b1561256757604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa15801561251b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061253f9190614b55565b61256757604051633b79c77360e21b81526001600160a01b0382166004820152602401610f60565b6006546001600160a01b03848116911614806125a057506001600160a01b0383166000908152602e602052604090205460ff1615156001145b806125b95750602c54600160a01b900460ff1615156001145b6125fc5760405162461bcd60e51b815260206004820152601460248201527314d95b9908139195081b9bdd08185b1b1bddd95960621b6044820152606401610f60565b6126068383613710565b6111a8338484613717565b61261a33612fd9565b6026805460ff1916911515919091179055565b6126356132bb565b61125a816137f7565b61264733612fd9565b601155565b61265533612fd9565b600a805460ff1916911515919091179055565b61267133612fd9565b6000918252600f602052604090912055565b6040516bffffffffffffffffffffffff19606085901b166020820152600090819060340160405160208183030381529060405280519060200120905060005b835181101561279b578381815181106126dd576126dd614b72565b6020026020010151821061273b578381815181106126fd576126fd614b72565b602002602001015182604051602001612720929190918252602082015260400190565b60405160208183030381529060405280519060200120612787565b8184828151811061274e5761274e614b72565b6020026020010151604051602001612770929190918252602082015260400190565b604051602081830303815290604052805190602001205b91508061279381614b88565b9150506126c2565b506000848152600d60205260409020541490509392505050565b6127be33612fd9565b601055565b6127cb6133e2565b6127d48361107b565b516000036127f45760405162461bcd60e51b8152600401610f6090614aca565b60008481526025602052604090205460ff1661284c5760405162461bcd60e51b8152602060048201526017602482015276185b1b1bdddb1a5cdd135a5b9d081a5cc814185d5cd959604a1b6044820152606401610f60565b612857338583612683565b61289e5760405162461bcd60e51b8152602060048201526018602482015277596f7520617265206e6f742077686974656c69737465642160401b6044820152606401610f60565b8160115410156128c05760405162461bcd60e51b8152600401610f6090614ba1565b6000848152602d60205260409020548211156128ee5760405162461bcd60e51b8152600401610f6090614beb565b6000848152602860209081526040808320602783528184205484528252808320338452909152902054612922908390614b09565b6000858152602d6020526040902054101561297f5760405162461bcd60e51b815260206004820152601e60248201527f596f752068617665206e6f2077686974656c6973744d696e74206c65667400006044820152606401610f60565b6000838152600f6020526040902054612999908390614b1c565b34146129b75760405162461bcd60e51b8152600401610f6090614c33565b6029546000848152600360205260409020546129d39084614b09565b1115806129e05750602954155b612a1b5760405162461bcd60e51b815260206004820152600c60248201526b4e6f206d6f7265204e46547360a01b6044820152606401610f60565b600084815260286020908152604080832060278352818420548452825280832033845290915281208054849290612a53908490614b09565b92505081905550612a7533848460405180602001604052806000815250613144565b6123cf6001600955565b6060612a89613821565b905090565b846daaeb6d7670e522a718067333cd4e3b15801590612aaf5750600a5460ff165b15612b6357336001600160a01b03821603612ad1576113fa86868686866138a1565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015612b20573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b449190614b55565b612b6357604051633b79c77360e21b8152336004820152602401610f60565b61149e86868686866138a1565b612b786132bb565b6001600160a01b038116612bdd5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610f60565b61125a816134f9565b612bef33612fd9565b600e55565b60606000612c03836002614b1c565b612c0e906002614b09565b6001600160401b03811115612c2557612c256143bb565b6040519080825280601f01601f191660200182016040528015612c4f576020820181803683370190505b509050600360fc1b81600081518110612c6a57612c6a614b72565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110612c9957612c99614b72565b60200101906001600160f81b031916908160001a9053506000612cbd846002614b1c565b612cc8906001614b09565b90505b6001811115612d40576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110612cfc57612cfc614b72565b1a60f81b828281518110612d1257612d12614b72565b60200101906001600160f81b031916908160001a90535060049490941c93612d3981614c6a565b9050612ccb565b5083156111545760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610f60565b606060028054612d9e90614a09565b80601f0160208091040260200160405190810160405280929190818152602001828054612dca90614a09565b8015612e175780601f10612dec57610100808354040283529160200191612e17565b820191906000526020600020905b815481529060010190602001808311612dfa57829003601f168201915b50505050509050919050565b6001600160a01b038516612eaa5760005b8351811015612ea857828181518110612e4f57612e4f614b72565b602002602001015160036000868481518110612e6d57612e6d614b72565b602002602001015181526020019081526020016000206000828254612e929190614b09565b90915550612ea1905081614b88565b9050612e34565b505b6001600160a01b03841661149e5760005b8351811015612f9c576000848281518110612ed857612ed8614b72565b602002602001015190506000848381518110612ef657612ef6614b72565b6020026020010151905060006003600084815260200190815260200160002054905081811015612f795760405162461bcd60e51b815260206004820152602860248201527f455243313135353a206275726e20616d6f756e74206578636565647320746f74604482015267616c537570706c7960c01b6064820152608401610f60565b60009283526003602052604090922091039055612f9581614b88565b9050612ebb565b50505050505050565b6001600160a01b03163b151590565b60006001600160e01b0319821663152a902d60e11b1480610f8c5750610f8c826138e6565b6001600160a01b03811660009081526007602052604090205460ff1661300a335b6001600160a01b03166014612bf4565b60405160200161301a9190614c81565b60405160208183030381529060405290610fbe5760405162461bcd60e51b8152600401610f60919061435a565b6127106001600160601b03821611156130b55760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b6064820152608401610f60565b6001600160a01b03821661310b5760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401610f60565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600b55565b6001600160a01b0384166131a45760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610f60565b3360006131b085613936565b905060006131bd85613936565b90506131ce83600089858589613981565b6000868152602081815260408083206001600160a01b038b168452909152812080548792906131fe908490614b09565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4612f9c83600089898989613a36565b60008281526005602052604090206132768282614d14565b50817f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b6132a28461107b565b6040516132af919061435a565b60405180910390a25050565b6006546001600160a01b03163314611e3e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610f60565b6001600160a01b03811660009081526007602052604090205460ff161561333b33612ffa565b60405160200161334b9190614dd3565b604051602081830303815290604052906133785760405162461bcd60e51b8152600401610f60919061435a565b506001600160a01b03166000908152600760205260409020805460ff19166001179055565b6001600160a01b0385163314806133b957506133b98533610e0b565b6133d55760405162461bcd60e51b8152600401610f6090614e2a565b61232b8585858585613b91565b6002600954036134345760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610f60565b6002600955565b6001600160a01b03811660009081526008602052604090205460ff161561346133612ffa565b6040516020016134719190614e78565b6040516020818303038152906040529061349e5760405162461bcd60e51b8152600401610f60919061435a565b506001600160a01b03166000908152600860205260409020805460ff19166001179055565b6004610fbe8282614d14565b6134d88161354b565b6001600160a01b03166000908152600860205260409020805460ff19169055565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b03811660009081526008602052604090205460ff1661357033612ffa565b60405160200161301a9190614ecf565b6001600160a01b0383166135e25760405162461bcd60e51b815260206004820152602360248201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260448201526265737360e81b6064820152608401610f60565b3360006135ee84613936565b905060006135fb84613936565b905061361b83876000858560405180602001604052806000815250613981565b6000858152602081815260408083206001600160a01b038a168452909152902054848110156136985760405162461bcd60e51b8152602060048201526024808201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604482015263616e636560e01b6064820152608401610f60565b6000868152602081815260408083206001600160a01b038b81168086529184528285208a8703905582518b81529384018a90529092908816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4604080516020810190915260009052612f9c565b610fbe3383835b816001600160a01b0316836001600160a01b03160361378a5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610f60565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61380081612fd9565b6001600160a01b03166000908152600760205260409020805460ff19169055565b60606000806138328161271061128c565b9150915061387b61384282613d74565b613856846001600160a01b03166014612bf4565b604051602001613867929190614f1a565b604051602081830303815290604052613e06565b60405160200161388b9190614fa0565b6040516020818303038152906040529250505090565b6001600160a01b0385163314806138bd57506138bd8533610e0b565b6138d95760405162461bcd60e51b8152600401610f6090614e2a565b61232b8585858585613f6a565b60006001600160e01b03198216636cdb3d1360e11b148061391757506001600160e01b031982166303a24d0760e21b145b80610f8c57506301ffc9a760e01b6001600160e01b0319831614610f8c565b6040805160018082528183019092526060916000919060208083019080368337019050509050828160008151811061397057613970614b72565b602090810291909101015292915050565b6006546001600160a01b03878116911614806139ba57506001600160a01b0386166000908152602e602052604090205460ff1615156001145b806139d35750602c54600160a01b900460ff1615156001145b806139e557506001600160a01b038516155b613a285760405162461bcd60e51b815260206004820152601460248201527314d95b9908139195081b9bdd08185b1b1bddd95960621b6044820152606401610f60565b61149e868686868686612e23565b6001600160a01b0384163b1561149e5760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190613a7a9089908990889088908890600401614fe5565b6020604051808303816000875af1925050508015613ab5575060408051601f3d908101601f19168201909252613ab29181019061502a565b60015b613b6157613ac1615047565b806308c379a003613afa5750613ad5615063565b80613ae05750613afc565b8060405162461bcd60e51b8152600401610f60919061435a565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e2d455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610f60565b6001600160e01b0319811663f23a6e6160e01b14612f9c5760405162461bcd60e51b8152600401610f60906150ec565b8151835114613bf35760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b6064820152608401610f60565b6001600160a01b038416613c195760405162461bcd60e51b8152600401610f6090615134565b33613c28818787878787613981565b60005b8451811015613d0e576000858281518110613c4857613c48614b72565b602002602001015190506000858381518110613c6657613c66614b72565b602090810291909101810151600084815280835260408082206001600160a01b038e168352909352919091205490915081811015613cb65760405162461bcd60e51b8152600401610f6090615179565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290613cf3908490614b09565b9250508190555050505080613d0790614b88565b9050613c2b565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051613d5e9291906151c3565b60405180910390a461149e8187878787876140a2565b60606000613d818361415d565b60010190506000816001600160401b03811115613da057613da06143bb565b6040519080825280601f01601f191660200182016040528015613dca576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084613dd457509392505050565b60608151600003613e2557505060408051602081019091526000815290565b60006040518060600160405280604081526020016152506040913990506000600384516002613e549190614b09565b613e5e9190614b33565b613e69906004614b1c565b90506000613e78826020614b09565b6001600160401b03811115613e8f57613e8f6143bb565b6040519080825280601f01601f191660200182016040528015613eb9576020820181803683370190505b509050818152600183018586518101602084015b81831015613f25576003830192508251603f8160121c168501518253600182019150603f81600c1c168501518253600182019150603f8160061c168501518253600182019150603f8116850151825350600101613ecd565b600389510660018114613f3f5760028114613f5057613f5c565b613d3d60f01b600119830152613f5c565b603d60f81b6000198301525b509398975050505050505050565b6001600160a01b038416613f905760405162461bcd60e51b8152600401610f6090615134565b336000613f9c85613936565b90506000613fa985613936565b9050613fb9838989858589613981565b6000868152602081815260408083206001600160a01b038c16845290915290205485811015613ffa5760405162461bcd60e51b8152600401610f6090615179565b6000878152602081815260408083206001600160a01b038d8116855292528083208985039055908a16825281208054889290614037908490614b09565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4614097848a8a8a8a8a613a36565b505050505050505050565b6001600160a01b0384163b1561149e5760405163bc197c8160e01b81526001600160a01b0385169063bc197c81906140e690899089908890889088906004016151f1565b6020604051808303816000875af1925050508015614121575060408051601f3d908101601f1916820190925261411e9181019061502a565b60015b61412d57613ac1615047565b6001600160e01b0319811663bc197c8160e01b14612f9c5760405162461bcd60e51b8152600401610f60906150ec565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b831061419c5772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef810000000083106141c8576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc1000083106141e657662386f26fc10000830492506010015b6305f5e10083106141fe576305f5e100830492506008015b612710831061421257612710830492506004015b60648310614224576064830492506002015b600a8310610f8c5760010192915050565b80356001600160a01b038116811461424c57600080fd5b919050565b6000806040838503121561426457600080fd5b61426d83614235565b946020939093013593505050565b6001600160e01b03198116811461125a57600080fd5b6000602082840312156142a357600080fd5b81356111548161427b565b6000602082840312156142c057600080fd5b5035919050565b600080604083850312156142da57600080fd5b6142e383614235565b915060208301356001600160601b03811681146142ff57600080fd5b809150509250929050565b60005b8381101561432557818101518382015260200161430d565b50506000910152565b6000815180845261434681602086016020860161430a565b601f01601f19169290920160200192915050565b602081526000611154602083018461432e565b60006020828403121561437f57600080fd5b61115482614235565b60008060006060848603121561439d57600080fd5b6143a684614235565b95602085013595506040909401359392505050565b634e487b7160e01b600052604160045260246000fd5b601f8201601f191681016001600160401b03811182821017156143f6576143f66143bb565b6040525050565b600082601f83011261440e57600080fd5b81356001600160401b03811115614427576144276143bb565b60405161443e601f8301601f1916602001826143d1565b81815284602083860101111561445357600080fd5b816020850160208301376000918101602001919091529392505050565b6000806040838503121561448357600080fd5b8235915060208301356001600160401b038111156144a057600080fd5b6144ac858286016143fd565b9150509250929050565b600080604083850312156144c957600080fd5b50508035926020909101359150565b60006001600160401b038211156144f1576144f16143bb565b5060051b60200190565b600082601f83011261450c57600080fd5b81356020614519826144d8565b60405161452682826143d1565b83815260059390931b850182019282810191508684111561454657600080fd5b8286015b84811015614561578035835291830191830161454a565b509695505050505050565b600080600080600060a0868803121561458457600080fd5b61458d86614235565b945061459b60208701614235565b935060408601356001600160401b03808211156145b757600080fd5b6145c389838a016144fb565b945060608801359150808211156145d957600080fd5b6145e589838a016144fb565b935060808801359150808211156145fb57600080fd5b50614608888289016143fd565b9150509295509295909350565b600082601f83011261462657600080fd5b81356020614633826144d8565b60405161464082826143d1565b83815260059390931b850182019282810191508684111561466057600080fd5b8286015b848110156145615761467581614235565b8352918301918301614664565b6000806040838503121561469557600080fd5b82356001600160401b03808211156146ac57600080fd5b6146b886838701614615565b935060208501359150808211156146ce57600080fd5b506144ac858286016144fb565b600081518084526020808501945080840160005b8381101561470b578151875295820195908201906001016146ef565b509495945050505050565b60208152600061115460208301846146db565b60006020828403121561473b57600080fd5b81356001600160401b0381111561475157600080fd5b61475d848285016143fd565b949350505050565b801515811461125a57600080fd5b6000806040838503121561478657600080fd5b61478f83614235565b915060208301356142ff81614765565b6000602082840312156147b157600080fd5b813561115481614765565b600080600080600060a086880312156147d457600080fd5b8535945060208601359350604086013592506147f260608701614235565b915060808601356001600160401b0381111561480d57600080fd5b614608888289016144fb565b6000806040838503121561482c57600080fd5b8235915060208301356142ff81614765565b60008060006060848603121561485357600080fd5b83356001600160401b038082111561486a57600080fd5b61487687838801614615565b945060208601359350604086013591508082111561489357600080fd5b506148a0868287016144fb565b9150509250925092565b600080604083850312156148bd57600080fd5b823591506148cd60208401614235565b90509250929050565b6000806000606084860312156148eb57600080fd5b6148f484614235565b92506020840135915060408401356001600160401b0381111561491657600080fd5b6148a0868287016144fb565b6000806000806080858703121561493857600080fd5b84359350602085013592506040850135915060608501356001600160401b0381111561496357600080fd5b61496f878288016144fb565b91505092959194509250565b6000806040838503121561498e57600080fd5b61499783614235565b91506148cd60208401614235565b600080600080600060a086880312156149bd57600080fd5b6149c686614235565b94506149d460208701614235565b9350604086013592506060860135915060808601356001600160401b038111156149fd57600080fd5b614608888289016143fd565b600181811c90821680614a1d57607f821691505b602082108103614a3d57634e487b7160e01b600052602260045260246000fd5b50919050565b6000808454614a5181614a09565b60018281168015614a695760018114614a7e57614aad565b60ff1984168752821515830287019450614aad565b8860005260208060002060005b85811015614aa45781548a820152908401908201614a8b565b50505082870194505b505050508351614ac181836020880161430a565b01949350505050565b6020808252600f908201526e139bdd081a5b9a5d1a585b1a5e9959608a1b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b80820180821115610f8c57610f8c614af3565b8082028115828204841417610f8c57610f8c614af3565b600082614b5057634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215614b6757600080fd5b815161115481614765565b634e487b7160e01b600052603260045260246000fd5b600060018201614b9a57614b9a614af3565b5060010190565b6020808252602a908201527f616c6c6f776c6973744d696e743a204f766572206d6178206d696e747320706560408201526972206f6e652074696d6560b01b606082015260800190565b60208082526028908201527f616c6c6f776c6973744d696e743a204f766572206d6178206d696e74732070656040820152671c881dd85b1b195d60c21b606082015260800190565b60208082526018908201527f4554482076616c7565206973206e6f7420636f72726563740000000000000000604082015260600190565b600081614c7957614c79614af3565b506000190190565b67030b1b1b7bab73a160c51b815260008251614ca481600885016020870161430a565b721034b9903737ba1030b71037b832b930ba37b960691b6008939091019283015250601b01919050565b601f8211156111a857600081815260208120601f850160051c81016020861015614cf55750805b601f850160051c820191505b8181101561149e57828155600101614d01565b81516001600160401b03811115614d2d57614d2d6143bb565b614d4181614d3b8454614a09565b84614cce565b602080601f831160018114614d765760008415614d5e5750858301515b600019600386901b1c1916600185901b17855561149e565b600085815260208120601f198616915b82811015614da557888601518255948401946001909101908401614d86565b5085821015614dc35787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b67030b1b1b7bab73a160c51b815260008251614df681600885016020870161430a565b7f20697320616c72656164792068617320616e206f70657261746f7220726f6c656008939091019283015250602801919050565b6020808252602e908201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60408201526d195c881bdc88185c1c1c9bdd995960921b606082015260800190565b67030b1b1b7bab73a160c51b815260008251614e9b81600885016020870161430a565b7f20697320616c72656164792068617320616e206d696e74657220726f6c6500006008939091019283015250602601919050565b67030b1b1b7bab73a160c51b815260008251614ef281600885016020870161430a565b701034b9903737ba1030b71036b4b73a32b960791b6008939091019283015250601901919050565b7f7b2273656c6c65725f6665655f62617369735f706f696e7473223a0000000000815260008351614f5281601b85016020880161430a565b721610113332b2afb932b1b4b834b2b73a111d1160691b601b918401918201528351614f8581602e84016020880161430a565b61227d60f01b602e9290910191820152603001949350505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815260008251614fd881601d85016020870161430a565b91909101601d0192915050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a06080820181905260009061501f9083018461432e565b979650505050505050565b60006020828403121561503c57600080fd5b81516111548161427b565b600060033d11156150605760046000803e5060005160e01c5b90565b600060443d10156150715790565b6040516003193d81016004833e81513d6001600160401b0381602484011181841117156150a057505050505090565b82850191508151818111156150b85750505050505090565b843d87010160208285010111156150d25750505050505090565b6150e1602082860101876143d1565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b6040815260006151d660408301856146db565b82810360208401526151e881856146db565b95945050505050565b6001600160a01b0386811682528516602082015260a06040820181905260009061521d908301866146db565b828103606084015261522f81866146db565b90508281036080840152615243818561432e565b9897505050505050505056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220a1219e0f0fbe4e6bb26d0126744724fd0f5be0f1bc1d7106164ac9a47d725f3064736f6c63430008110033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000000000000000000000000000000000000000003e8

-----Decoded View---------------
Arg [0] : _aaPercAdd (uint256): 1000

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000003e8


Deployed Bytecode Sourcemap

80883:16286:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24477:230;;;;;;;;;;-1:-1:-1;24477:230:0;;;;;:::i;:::-;;:::i;:::-;;;597:25:1;;;585:2;570:18;24477:230:0;;;;;;;;83492:165;;;;;;;;;;-1:-1:-1;83492:165:0;;;;;:::i;:::-;;:::i;:::-;;;1184:14:1;;1177:22;1159:41;;1147:2;1132:18;83492:165:0;1019:187:1;89921:111:0;;;;;;;;;;-1:-1:-1;89921:111:0;;;;;:::i;:::-;;:::i;:::-;;83314:157;;;;;;;;;;-1:-1:-1;83314:157:0;;;;;:::i;:::-;;:::i;82063:44::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;94050:106::-;;;;;;;;;;-1:-1:-1;94050:106:0;;;;;:::i;:::-;;:::i;58087:351::-;;;;;;;;;;-1:-1:-1;58087:351:0;;;;;:::i;:::-;;:::i;91277:217::-;;;;;;;;;;-1:-1:-1;91277:217:0;;;;;:::i;:::-;;:::i;86633:154::-;;;;;;;;;;-1:-1:-1;86633:154:0;;;;;:::i;:::-;;:::i;93143:130::-;;;;;;;;;;-1:-1:-1;93143:130:0;;;;;:::i;:::-;;:::i;81181:32::-;;;;;;;;;;;;;;;;82261:48;;;;;;;;;;-1:-1:-1;82261:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;89193:148;;;;;;;;;;-1:-1:-1;89193:148:0;;;;;:::i;:::-;89292:10;;89260:7;89282:21;;;:9;:21;;;;;;;;89304:8;:20;;;;;;89282:43;;;;;;;-1:-1:-1;;;;;89282:53:0;;;;;;;;;;;89193:148;93601:130;;;;;;;;;;-1:-1:-1;93601:130:0;;;;;:::i;:::-;;:::i;89785:::-;;;;;;;;;;-1:-1:-1;89785:130:0;;;;;:::i;:::-;;:::i;96538:115::-;;;;;;;;;;-1:-1:-1;96538:115:0;;;;;:::i;:::-;;:::i;92914:130::-;;;;;;;;;;-1:-1:-1;92914:130:0;;;;;:::i;:::-;;:::i;78328:442::-;;;;;;;;;;-1:-1:-1;78328:442:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;4828:32:1;;;4810:51;;4892:2;4877:18;;4870:34;;;;4783:18;78328:442:0;4636:274:1;81045:46:0;;;;;;;;;;-1:-1:-1;81045:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;86795:271;;;;;;;;;;-1:-1:-1;86795:271:0;;;;;:::i;:::-;;:::i;81139:35::-;;;;;;;;;;;;;;;;85958:302;;;;;;;;;;-1:-1:-1;85958:302:0;;;;;:::i;:::-;;:::i;90173:140::-;;;;;;;;;;-1:-1:-1;90173:140:0;;;;;:::i;:::-;;:::i;94222:2260::-;;;:::i;96885:111::-;;;;;;;;;;-1:-1:-1;96885:111:0;;;;;:::i;:::-;;:::i;81829:31::-;;;;;;;;;;-1:-1:-1;81829:31:0;;;;;;;;90498:110;;;;;;;;;;-1:-1:-1;90498:110:0;;;;;:::i;:::-;90565:7;90587:15;;;:8;:15;;;;;;;90498:110;73057:143;;;;;;;;;;;;73157:42;73057:143;;;;;-1:-1:-1;;;;;6977:32:1;;;6959:51;;6947:2;6932:18;73057:143:0;6781:235:1;81096:38:0;;;;;;;;;;;;;;;;82031:23;;;;;;;;;;;;;;;;24873:524;;;;;;;;;;-1:-1:-1;24873:524:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;55595:122::-;;;;;;;;;;-1:-1:-1;55595:122:0;;;;;:::i;:::-;55652:4;55473:16;;;:12;:16;;;;;;-1:-1:-1;;;55595:122:0;86527:98;;;;;;;;;;-1:-1:-1;86527:98:0;;;;;:::i;:::-;;:::i;86418:101::-;;;;;;;;;;-1:-1:-1;86418:101:0;;;;;:::i;:::-;;:::i;93372:130::-;;;;;;;;;;-1:-1:-1;93372:130:0;;;;;:::i;:::-;;:::i;69459:22::-;;;;;;;;;;;;;;;;97053:113;;;;;;;;;;-1:-1:-1;97053:113:0;;;;;:::i;:::-;;:::i;59182:::-;;;;;;;;;;-1:-1:-1;59182:113:0;;;;;:::i;:::-;-1:-1:-1;;;;;59266:21:0;59242:4;59266:21;;;:10;:21;;;;;;;;;59182:113;90317:156;;;;;;;;;;-1:-1:-1;90317:156:0;;;;;:::i;:::-;;:::i;2753:103::-;;;;;;;;;;;;;:::i;91181:88::-;;;;;;;;;;-1:-1:-1;91181:88:0;;;;;:::i;:::-;;:::i;88053:1025::-;;;;;;:::i;:::-;;:::i;81257:25::-;;;;;;;;;;;;;;;;90633:131;;;;;;;;;;-1:-1:-1;90633:131:0;;;;;:::i;:::-;;:::i;91502:255::-;;;;;;;;;;-1:-1:-1;91502:255:0;;;;;:::i;:::-;;:::i;92685:130::-;;;;;;;;;;-1:-1:-1;92685:130:0;;;;;:::i;:::-;;:::i;2105:87::-;;;;;;;;;;-1:-1:-1;2178:6:0;;-1:-1:-1;;;;;2178:6:0;2105:87;;89349:172;;;;;;;;;;-1:-1:-1;89349:172:0;;;;;:::i;:::-;89438:7;89460:22;;;:9;:22;;;;;;;;89483:8;:21;;;;;;89460:45;;;;;;;-1:-1:-1;;;;;89460:55:0;;;;;;;;;;;;;89349:172;89084:103;;;;;;;;;;-1:-1:-1;89084:103:0;;;;;:::i;:::-;;:::i;91765:153::-;;;;;;;;;;-1:-1:-1;91765:153:0;;;;;:::i;:::-;;:::i;82114:29::-;;;;;;;;;;;;;:::i;93830:130::-;;;;;;;;;;-1:-1:-1;93830:130:0;;;;;:::i;:::-;;:::i;92448:140::-;;;:::i;84933:392::-;;;;;;;;;;-1:-1:-1;84933:392:0;;;;;:::i;:::-;;:::i;90787:111::-;;;;;;;;;;-1:-1:-1;90787:111:0;;;;;:::i;:::-;;:::i;60455:105::-;;;;;;;;;;-1:-1:-1;60455:105:0;;;;;:::i;:::-;-1:-1:-1;;;;;60535:17:0;60511:4;60535:17;;;:8;:17;;;;;;;;;60455:105;96712:117;;;;;;;;;;-1:-1:-1;96712:117:0;;;;;:::i;:::-;;:::i;90038:131::-;;;;;;;;;;-1:-1:-1;90038:131:0;;;;;:::i;:::-;;:::i;81886:43::-;;;;;;;;;;-1:-1:-1;81886:43:0;;;;;:::i;:::-;;;;;;;;;;;;;;84622:122;;;;;;;;;;-1:-1:-1;84622:122:0;;;;;:::i;:::-;;:::i;81725:47::-;;;;;;;;;;-1:-1:-1;81725:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;55384:113;;;;;;;;;;-1:-1:-1;55384:113:0;;;;;:::i;:::-;55446:7;55473:16;;;:12;:16;;;;;;;55384:113;90918:124;;;;;;;;;;-1:-1:-1;90918:124:0;;;;;:::i;:::-;;:::i;86310:100::-;;;;;;;;;;-1:-1:-1;86310:100:0;;;;;:::i;:::-;-1:-1:-1;;;;;86385:17:0;86361:4;86385:17;;;:13;:17;;;;;;;;;86310:100;69768:434;;;;;;;;;;-1:-1:-1;69768:434:0;;;;;:::i;:::-;;:::i;89548:88::-;;;;;;;;;;-1:-1:-1;89623:7:0;;89548:88;;81287:25;;;;;;;;;;;;;;;;91060:103;;;;;;;;;;-1:-1:-1;91060:103:0;;;;;:::i;:::-;;:::i;81317:25::-;;;;;;;;;;;;;;;;87088:957;;;;;;:::i;:::-;;:::i;83686:113::-;;;;;;;;;;;;;:::i;25697:168::-;;;;;;;;;;-1:-1:-1;25697:168:0;;;;;:::i;:::-;-1:-1:-1;;;;;25820:27:0;;;25796:4;25820:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;25697:168;81218:34;;;;;;;;;;;;;;;;81777:47;;;;;;;;;;-1:-1:-1;81777:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;85513:252;;;;;;;;;;-1:-1:-1;85513:252:0;;;;;:::i;:::-;;:::i;3011:201::-;;;;;;;;;;-1:-1:-1;3011:201:0;;;;;:::i;:::-;;:::i;73005:43::-;;;;;;;;;;-1:-1:-1;73005:43:0;;;;;;;;89661:99;;;;;;;;;;-1:-1:-1;89661:99:0;;;;;:::i;:::-;;:::i;24477:230::-;24563:7;-1:-1:-1;;;;;24591:21:0;;24583:76;;;;-1:-1:-1;;;24583:76:0;;14545:2:1;24583:76:0;;;14527:21:1;14584:2;14564:18;;;14557:30;14623:34;14603:18;;;14596:62;-1:-1:-1;;;14674:18:1;;;14667:40;14724:19;;24583:76:0;;;;;;;;;-1:-1:-1;24677:9:0;:13;;;;;;;;;;;-1:-1:-1;;;;;24677:22:0;;;;;;;;;;24477:230;;;;;:::o;83492:165::-;83595:4;83615:36;83639:11;83615:23;:36::i;89921:111::-;59124:32;736:10;59124:18;:32::i;:::-;90002:10:::1;:24:::0;89921:111::o;83314:157::-;59124:32;736:10;59124:18;:32::i;:::-;83421:44:::1;83440:9;83451:13;83421:18;:44::i;:::-;83314:157:::0;;:::o;82063:44::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;94050:106::-;59124:32;736:10;59124:18;:32::i;:::-;94126:15:::1;:24:::0;;-1:-1:-1;;;;;;94126:24:0::1;-1:-1:-1::0;;;;;94126:24:0;;;::::1;::::0;;;::::1;::::0;;94050:106::o;58087:351::-;58181:22;58206:19;;;:10;:19;;;;;58181:44;;58155:13;;58181:22;58206:19;58181:44;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58361:1;58342:8;58336:22;:26;:94;;58412:18;58422:7;58412:9;:18::i;:::-;58336:94;;;58389:8;58399;58372:36;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58336:94;58329:101;58087:351;-1:-1:-1;;;58087:351:0:o;91277:217::-;59124:32;736:10;59124:18;:32::i;:::-;91410:7:::1;91414:2;91410:3;:7::i;:::-;91404:21;91429:1;91404:26:::0;91396:54:::1;;;;-1:-1:-1::0;;;91396:54:0::1;;;;;;;:::i;:::-;91461:25;91467:2;91471;91475:6;91461:25;;;;;;;;;;;::::0;:5:::1;:25::i;:::-;91277:217:::0;;;:::o;86633:154::-;59124:32;736:10;59124:18;:32::i;:::-;86752:27:::1;86760:7;86769:9;86752:7;:27::i;93143:130::-:0;59124:32;736:10;59124:18;:32::i;:::-;93233:3:::1;:12:::0;;-1:-1:-1;;;;;;93233:12:0::1;-1:-1:-1::0;;;;;93233:12:0;;;::::1;::::0;;;::::1;::::0;;;93252:7:::1;:15:::0;93143:130::o;93601:::-;59124:32;736:10;59124:18;:32::i;:::-;93691:3:::1;:12:::0;;-1:-1:-1;;;;;;93691:12:0::1;-1:-1:-1::0;;;;;93691:12:0;;;::::1;::::0;;;::::1;::::0;;;93710:7:::1;:15:::0;93601:130::o;89785:::-;59124:32;736:10;59124:18;:32::i;:::-;89879:8:::1;89869:7;:18;;;;89908:1;89894:10;;:15;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;89785:130:0:o;96538:115::-;1991:13;:11;:13::i;:::-;96615:30:::1;96634:10;96615:18;:30::i;:::-;96538:115:::0;:::o;92914:130::-;59124:32;736:10;59124:18;:32::i;:::-;93004:3:::1;:12:::0;;-1:-1:-1;;;;;;93004:12:0::1;-1:-1:-1::0;;;;;93004:12:0;;;::::1;::::0;;;::::1;::::0;;;93023:7:::1;:15:::0;92914:130::o;78328:442::-;78425:7;78483:27;;;:17;:27;;;;;;;;78454:56;;;;;;;;;-1:-1:-1;;;;;78454:56:0;;;;;-1:-1:-1;;;78454:56:0;;;-1:-1:-1;;;;;78454:56:0;;;;;;;;78425:7;;78523:92;;-1:-1:-1;78574:29:0;;;;;;;;;78584:19;78574:29;-1:-1:-1;;;;;78574:29:0;;;;-1:-1:-1;;;78574:29:0;;-1:-1:-1;;;;;78574:29:0;;;;;78523:92;78665:23;;;;78627:21;;79136:5;;78652:36;;-1:-1:-1;;;;;78652:36:0;:10;:36;:::i;:::-;78651:58;;;;:::i;:::-;78730:16;;;;;-1:-1:-1;78328:442:0;;-1:-1:-1;;;;78328:442:0:o;86795:271::-;59124:32;736:10;59124:18;:32::i;:::-;86928:12:::1;86932:7;86928:3;:12::i;:::-;86922:26:::0;:31;86914:62:::1;;;::::0;-1:-1:-1;;;86914:62:0;;17625:2:1;86914:62:0::1;::::0;::::1;17607:21:1::0;17664:2;17644:18;;;17637:30;-1:-1:-1;;;17683:18:1;;;17676:48;17741:18;;86914:62:0::1;17423:342:1::0;86914:62:0::1;86993:10;::::0;86987:33:::1;::::0;;::::1;::::0;::::1;::::0;;;86993:10:::1;86987:33:::0;;::::1;::::0;-1:-1:-1;;;;;86993:10:0::1;::::0;87005:7;;86993:10;;86987:5:::1;:33::i;85958:302::-:0;86178:4;73157:42;74305:45;:49;;;;:77;;-1:-1:-1;74358:24:0;;;;74305:77;74301:567;;;74622:10;-1:-1:-1;;;;;74614:18:0;;;74610:85;;86195:57:::1;86223:4;86229:2;86233:3;86238:7;86247:4;86195:27;:57::i;:::-;74673:7:::0;;74610:85;74714:69;;-1:-1:-1;;;74714:69:0;;74765:4;74714:69;;;17982:34:1;74772:10:0;18032:18:1;;;18025:43;73157:42:0;;74714;;17917:18:1;;74714:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;74709:148;;74811:30;;-1:-1:-1;;;74811:30:0;;74830:10;74811:30;;;6959:51:1;6932:18;;74811:30:0;6781:235:1;74709:148:0;86195:57:::1;86223:4;86229:2;86233:3;86238:7;86247:4;86195:27;:57::i;:::-;85958:302:::0;;;;;;:::o;90173:140::-;59124:32;736:10;59124:18;:32::i;:::-;90272:18:::1;::::0;;;:13:::1;:18;::::0;;;;:35;90173:140::o;94222:2260::-;59124:32;736:10;59124:18;:32::i;:::-;68733:21:::1;:19;:21::i;:::-;94308:3:::2;::::0;-1:-1:-1;;;;;94308:3:0::2;:17:::0;;::::2;::::0;:33:::2;;-1:-1:-1::0;94329:7:0::2;::::0;:12;::::2;94308:33;94307:56;;;-1:-1:-1::0;94346:3:0::2;::::0;-1:-1:-1;;;;;94346:3:0::2;:17:::0;94307:56:::2;94299:114;;;::::0;-1:-1:-1;;;94299:114:0;;18531:2:1;94299:114:0::2;::::0;::::2;18513:21:1::0;18570:2;18550:18;;;18543:30;18609:34;18589:18;;;18582:62;-1:-1:-1;;;18660:18:1;;;18653:44;18714:19;;94299:114:0::2;18329:410:1::0;94299:114:0::2;94429:3;::::0;-1:-1:-1;;;;;94429:3:0::2;:17:::0;;::::2;::::0;:33:::2;;-1:-1:-1::0;94450:7:0::2;::::0;:12;::::2;94429:33;94428:56;;;-1:-1:-1::0;94467:3:0::2;::::0;-1:-1:-1;;;;;94467:3:0::2;:17:::0;94428:56:::2;94420:114;;;::::0;-1:-1:-1;;;94420:114:0;;18946:2:1;94420:114:0::2;::::0;::::2;18928:21:1::0;18985:2;18965:18;;;18958:30;19024:34;19004:18;;;18997:62;-1:-1:-1;;;19075:18:1;;;19068:44;19129:19;;94420:114:0::2;18744:410:1::0;94420:114:0::2;94550:3;::::0;-1:-1:-1;;;;;94550:3:0::2;:17:::0;;::::2;::::0;:33:::2;;-1:-1:-1::0;94571:7:0::2;::::0;:12;::::2;94550:33;94549:56;;;-1:-1:-1::0;94588:3:0::2;::::0;-1:-1:-1;;;;;94588:3:0::2;:17:::0;94549:56:::2;94541:114;;;::::0;-1:-1:-1;;;94541:114:0;;19361:2:1;94541:114:0::2;::::0;::::2;19343:21:1::0;19400:2;19380:18;;;19373:30;19439:34;19419:18;;;19412:62;-1:-1:-1;;;19490:18:1;;;19483:44;19544:19;;94541:114:0::2;19159:410:1::0;94541:114:0::2;94671:3;::::0;-1:-1:-1;;;;;94671:3:0::2;:17:::0;;::::2;::::0;:33:::2;;-1:-1:-1::0;94692:7:0::2;::::0;:12;::::2;94671:33;94670:56;;;-1:-1:-1::0;94709:3:0::2;::::0;-1:-1:-1;;;;;94709:3:0::2;:17:::0;94670:56:::2;94662:114;;;::::0;-1:-1:-1;;;94662:114:0;;19776:2:1;94662:114:0::2;::::0;::::2;19758:21:1::0;19815:2;19795:18;;;19788:30;19854:34;19834:18;;;19827:62;-1:-1:-1;;;19905:18:1;;;19898:44;19959:19;;94662:114:0::2;19574:410:1::0;94662:114:0::2;94792:3;::::0;-1:-1:-1;;;;;94792:3:0::2;:17:::0;;::::2;::::0;:33:::2;;-1:-1:-1::0;94813:7:0::2;::::0;:12;::::2;94792:33;94791:56;;;-1:-1:-1::0;94830:3:0::2;::::0;-1:-1:-1;;;;;94830:3:0::2;:17:::0;94791:56:::2;94783:114;;;::::0;-1:-1:-1;;;94783:114:0;;20191:2:1;94783:114:0::2;::::0;::::2;20173:21:1::0;20230:2;20210:18;;;20203:30;20269:34;20249:18;;;20242:62;-1:-1:-1;;;20320:18:1;;;20313:44;20374:19;;94783:114:0::2;19989:410:1::0;94783:114:0::2;94913:3;::::0;-1:-1:-1;;;;;94913:3:0::2;:17:::0;;::::2;::::0;:33:::2;;-1:-1:-1::0;94934:7:0::2;::::0;:12;::::2;94913:33;94912:56;;;-1:-1:-1::0;94951:3:0::2;::::0;-1:-1:-1;;;;;94951:3:0::2;:17:::0;94912:56:::2;94904:114;;;::::0;-1:-1:-1;;;94904:114:0;;20606:2:1;94904:114:0::2;::::0;::::2;20588:21:1::0;20645:2;20625:18;;;20618:30;20684:34;20664:18;;;20657:62;-1:-1:-1;;;20735:18:1;;;20728:44;20789:19;;94904:114:0::2;20404:410:1::0;94904:114:0::2;95092:3;::::0;95047:21:::2;::::0;95025:19:::2;::::0;-1:-1:-1;;;;;95092:3:0::2;:17:::0;95089:174:::2;;95151:3;::::0;95183:7:::2;::::0;-1:-1:-1;;;;;95151:3:0;;::::2;::::0;95191:5:::2;::::0;95169:21:::2;::::0;:11;:21:::2;:::i;:::-;:27;;;;:::i;:::-;95143:59;::::0;::::2;::::0;;;;;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;95134:68;;;;;95221:2;95213:42;;;::::0;-1:-1:-1;;;95213:42:0;;21231:2:1;95213:42:0::2;::::0;::::2;21213:21:1::0;21270:2;21250:18;;;21243:30;21309:29;21289:18;;;21282:57;21356:18;;95213:42:0::2;21029:351:1::0;95213:42:0::2;95272:3;::::0;-1:-1:-1;;;;;95272:3:0::2;:17:::0;95269:174:::2;;95331:3;::::0;95363:7:::2;::::0;-1:-1:-1;;;;;95331:3:0;;::::2;::::0;95371:5:::2;::::0;95349:21:::2;::::0;:11;:21:::2;:::i;:::-;:27;;;;:::i;:::-;95323:59;::::0;::::2;::::0;;;;;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;95314:68;;;;;95401:2;95393:42;;;::::0;-1:-1:-1;;;95393:42:0;;21587:2:1;95393:42:0::2;::::0;::::2;21569:21:1::0;21626:2;21606:18;;;21599:30;21665:29;21645:18;;;21638:57;21712:18;;95393:42:0::2;21385:351:1::0;95393:42:0::2;95452:3;::::0;-1:-1:-1;;;;;95452:3:0::2;:17:::0;95449:174:::2;;95511:3;::::0;95543:7:::2;::::0;-1:-1:-1;;;;;95511:3:0;;::::2;::::0;95551:5:::2;::::0;95529:21:::2;::::0;:11;:21:::2;:::i;:::-;:27;;;;:::i;:::-;95503:59;::::0;::::2;::::0;;;;;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;95494:68;;;;;95581:2;95573:42;;;::::0;-1:-1:-1;;;95573:42:0;;21943:2:1;95573:42:0::2;::::0;::::2;21925:21:1::0;21982:2;21962:18;;;21955:30;22021:29;22001:18;;;21994:57;22068:18;;95573:42:0::2;21741:351:1::0;95573:42:0::2;95632:3;::::0;-1:-1:-1;;;;;95632:3:0::2;:17:::0;95629:174:::2;;95691:3;::::0;95723:7:::2;::::0;-1:-1:-1;;;;;95691:3:0;;::::2;::::0;95731:5:::2;::::0;95709:21:::2;::::0;:11;:21:::2;:::i;:::-;:27;;;;:::i;:::-;95683:59;::::0;::::2;::::0;;;;;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;95674:68;;;;;95761:2;95753:42;;;::::0;-1:-1:-1;;;95753:42:0;;22299:2:1;95753:42:0::2;::::0;::::2;22281:21:1::0;22338:2;22318:18;;;22311:30;22377:29;22357:18;;;22350:57;22424:18;;95753:42:0::2;22097:351:1::0;95753:42:0::2;95812:3;::::0;-1:-1:-1;;;;;95812:3:0::2;:17:::0;95809:174:::2;;95871:3;::::0;95903:7:::2;::::0;-1:-1:-1;;;;;95871:3:0;;::::2;::::0;95911:5:::2;::::0;95889:21:::2;::::0;:11;:21:::2;:::i;:::-;:27;;;;:::i;:::-;95863:59;::::0;::::2;::::0;;;;;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;95854:68;;;;;95941:2;95933:42;;;::::0;-1:-1:-1;;;95933:42:0;;22655:2:1;95933:42:0::2;::::0;::::2;22637:21:1::0;22694:2;22674:18;;;22667:30;22733:29;22713:18;;;22706:57;22780:18;;95933:42:0::2;22453:351:1::0;95933:42:0::2;95992:3;::::0;-1:-1:-1;;;;;95992:3:0::2;:17:::0;95989:174:::2;;96051:3;::::0;96083:7:::2;::::0;-1:-1:-1;;;;;96051:3:0;;::::2;::::0;96091:5:::2;::::0;96069:21:::2;::::0;:11;:21:::2;:::i;:::-;:27;;;;:::i;:::-;96043:59;::::0;::::2;::::0;;;;;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;96034:68;;;;;96121:2;96113:42;;;::::0;-1:-1:-1;;;96113:42:0;;23011:2:1;96113:42:0::2;::::0;::::2;22993:21:1::0;23050:2;23030:18;;;23023:30;23089:29;23069:18;;;23062:57;23136:18;;96113:42:0::2;22809:351:1::0;96113:42:0::2;96214:15;::::0;96183:21:::2;::::0;-1:-1:-1;;;;;;96214:15:0::2;:29:::0;96211:220:::2;;96297:15;::::0;96289:55:::2;::::0;-1:-1:-1;;;;;96297:15:0;;::::2;::::0;96327:11;;96289:55:::2;::::0;;;96327:11;96297:15;96289:55:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;96280:64;;;;;96211:220;;;2178:6:::0;;96376:47:::2;::::0;-1:-1:-1;;;;;2178:6:0;;;;96406:11;;96376:47:::2;::::0;;;96406:11;2178:6;96376:47:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;96367:56:0;;-1:-1:-1;;96211:220:0::2;96445:2;96437:39;;;::::0;-1:-1:-1;;;96437:39:0;;23367:2:1;96437:39:0::2;::::0;::::2;23349:21:1::0;23406:2;23386:18;;;23379:30;23445:26;23425:18;;;23418:54;23489:18;;96437:39:0::2;23165:348:1::0;96437:39:0::2;94292:2190;;68777:20:::1;68171:1:::0;69297:7;:22;69114:213;68777:20:::1;94222:2260::o:0;96885:111::-;1991:13;:11;:13::i;:::-;96960:28:::1;96977:10;96960:16;:28::i;24873:524::-:0;25029:16;25090:3;:10;25071:8;:15;:29;25063:83;;;;-1:-1:-1;;;25063:83:0;;23720:2:1;25063:83:0;;;23702:21:1;23759:2;23739:18;;;23732:30;23798:34;23778:18;;;23771:62;-1:-1:-1;;;23849:18:1;;;23842:39;23898:19;;25063:83:0;23518:405:1;25063:83:0;25159:30;25206:8;:15;-1:-1:-1;;;;;25192:30:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25192:30:0;;25159:63;;25240:9;25235:122;25259:8;:15;25255:1;:19;25235:122;;;25315:30;25325:8;25334:1;25325:11;;;;;;;;:::i;:::-;;;;;;;25338:3;25342:1;25338:6;;;;;;;;:::i;:::-;;;;;;;25315:9;:30::i;:::-;25296:13;25310:1;25296:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;25276:3;;;:::i;:::-;;;25235:122;;;-1:-1:-1;25376:13:0;24873:524;-1:-1:-1;;;24873:524:0:o;86527:98::-;59124:32;736:10;59124:18;:32::i;:::-;86600:17:::1;86612:4;86600:11;:17::i;86418:101::-:0;59124:32;736:10;59124:18;:32::i;:::-;-1:-1:-1;;;;;86487:17:0;;;::::1;;::::0;;;:13:::1;:17;::::0;;;;:24;;-1:-1:-1;;86487:24:0::1;::::0;::::1;;::::0;;;::::1;::::0;;86418:101::o;93372:130::-;59124:32;736:10;59124:18;:32::i;:::-;93462:3:::1;:12:::0;;-1:-1:-1;;;;;;93462:12:0::1;-1:-1:-1::0;;;;;93462:12:0;;;::::1;::::0;;;::::1;::::0;;;93481:7:::1;:15:::0;93372:130::o;97053:113::-;1991:13;:11;:13::i;:::-;97129:29:::1;97147:10;97129:17;:29::i;90317:156::-:0;59124:32;736:10;59124:18;:32::i;:::-;69588:23;;;;:13;:23;;;;;;:37;83314:157::o;2753:103::-;1991:13;:11;:13::i;:::-;2818:30:::1;2845:1;2818:18;:30::i;91181:88::-:0;59124:32;736:10;59124:18;:32::i;:::-;91249:6:::1;:14:::0;;;::::1;;-1:-1:-1::0;;;91249:14:0::1;-1:-1:-1::0;;;;91249:14:0;;::::1;::::0;;;::::1;::::0;;91181:88::o;88053:1025::-;68733:21;:19;:21::i;:::-;60399:30:::1;736:10:::0;60399:16:::1;:30::i;:::-;88279:13:::2;88283:8;88279:3;:13::i;:::-;88273:27;88304:1;88273:32:::0;88265:60:::2;;;;-1:-1:-1::0;;;88265:60:0::2;;;;;;;:::i;:::-;88340:22;::::0;;;:15:::2;:22;::::0;;;;;::::2;;88332:58;;;::::0;-1:-1:-1;;;88332:58:0;;24402:2:1;88332:58:0::2;::::0;::::2;24384:21:1::0;24441:2;24421:18;;;24414:30;-1:-1:-1;;;24460:18:1;;;24453:53;24523:18;;88332:58:0::2;24200:347:1::0;88332:58:0::2;88405:38;88419:9;88429:5;88436:6;88405:13;:38::i;:::-;88397:75;;;::::0;-1:-1:-1;;;88397:75:0;;24754:2:1;88397:75:0::2;::::0;::::2;24736:21:1::0;24793:2;24773:18;;;24766:30;-1:-1:-1;;;24812:18:1;;;24805:54;24876:18;;88397:75:0::2;24552:348:1::0;88397:75:0::2;88506:7;88487:15;;:26;;88479:81;;;;-1:-1:-1::0;;;88479:81:0::2;;;;;;;:::i;:::-;88575:20;::::0;;;:13:::2;:20;::::0;;;;;:31;-1:-1:-1;88575:31:0::2;88567:84;;;;-1:-1:-1::0;;;88567:84:0::2;;;;;;;:::i;:::-;88690:16;::::0;;;:9:::2;:16;::::0;;;;;;;88707:8:::2;:15:::0;;;;;;88690:33;;;;;;;-1:-1:-1;;;;;88690:44:0;::::2;::::0;;;;;;;;:54:::2;::::0;88737:7;;88690:54:::2;:::i;:::-;88666:20;::::0;;;:13:::2;:20;::::0;;;;;:78:::2;;88658:121;;;::::0;-1:-1:-1;;;88658:121:0;;25927:2:1;88658:121:0::2;::::0;::::2;25909:21:1::0;25966:2;25946:18;;;25939:30;26005:32;25985:18;;;25978:60;26055:18;;88658:121:0::2;25725:354:1::0;88658:121:0::2;88807:21;::::0;;;:11:::2;:21;::::0;;;;;:31:::2;::::0;88831:7;;88807:31:::2;:::i;:::-;88794:9;:44;88786:81;;;;-1:-1:-1::0;;;88786:81:0::2;;;;;;;:::i;:::-;88920:8;::::0;55446:7;55473:16;;;:12;:16;;;;;;88883:31:::2;::::0;:7;:31:::2;:::i;:::-;88882:47;;:64;;;-1:-1:-1::0;88933:8:0::2;::::0;:13;88882:64:::2;88874:89;;;::::0;-1:-1:-1;;;88874:89:0;;26639:2:1;88874:89:0::2;::::0;::::2;26621:21:1::0;26678:2;26658:18;;;26651:30;-1:-1:-1;;;26697:18:1;;;26690:42;26749:18;;88874:89:0::2;26437:336:1::0;88874:89:0::2;88970:16;::::0;;;:9:::2;:16;::::0;;;;;;;88987:8:::2;:15:::0;;;;;;88970:33;;;;;;;-1:-1:-1;;;;;88970:44:0;::::2;::::0;;;;;;;:55;;89018:7;;88970:16;:55:::2;::::0;89018:7;;88970:55:::2;:::i;:::-;;;;;;;;89032:39;89038:9;89049:8;89059:7;89032:39;;;;;;;;;;;::::0;:5:::2;:39::i;:::-;68777:20:::0;68171:1;69297:7;:22;69114:213;68777:20;88053:1025;;;;;:::o;90633:131::-;59124:32;736:10;59124:18;:32::i;:::-;90728:22:::1;::::0;;;:15:::1;:22;::::0;;;;;:30;;-1:-1:-1;;90728:30:0::1;::::0;::::1;;::::0;;;::::1;::::0;;90633:131::o;91502:255::-;59124:32;736:10;59124:18;:32::i;:::-;91653:9:::1;91648:102;91672:4;:11;91668:1;:15;91648:102;;;91705:33;91711:4;91716:1;91711:7;;;;;;;;:::i;:::-;;;;;;;91720:2;91724:6;91731:1;91724:9;;;;;;;;:::i;:::-;;;;;;;91705:33;;;;;;;;;;;::::0;:5:::1;:33::i;:::-;91685:3:::0;::::1;::::0;::::1;:::i;:::-;;;;91648:102;;;;91502:255:::0;;;:::o;92685:130::-;59124:32;736:10;59124:18;:32::i;:::-;92775:3:::1;:12:::0;;-1:-1:-1;;;;;;92775:12:0::1;-1:-1:-1::0;;;;;92775:12:0;;;::::1;::::0;;;::::1;::::0;;;92794:7:::1;:15:::0;92685:130::o;89084:103::-;59124:32;736:10;59124:18;:32::i;:::-;89161:8:::1;:20:::0;89084:103::o;91765:153::-;59124:32;736:10;59124:18;:32::i;:::-;91889:21:::1;91895:2;91899;91903:6;91889:5;:21::i;82114:29::-:0;;;;;;;:::i;93830:130::-;59124:32;736:10;59124:18;:32::i;:::-;93920:3:::1;:12:::0;;-1:-1:-1;;;;;;93920:12:0::1;-1:-1:-1::0;;;;;93920:12:0;;;::::1;::::0;;;::::1;::::0;;;93939:7:::1;:15:::0;93830:130::o;92448:140::-;59124:32;736:10;59124:18;:32::i;:::-;68733:21:::1;:19;:21::i;:::-;92552:1:::2;92540:9;:13;92532:50;;;;-1:-1:-1::0;;;92532:50:0::2;;;;;;;:::i;:::-;68777:20:::1;68171:1:::0;69297:7;:22;69114:213;84933:392;85037:8;73157:42;75079:45;:49;;;;:77;;-1:-1:-1;75132:24:0;;;;75079:77;75075:253;;;75178:67;;-1:-1:-1;;;75178:67:0;;75229:4;75178:67;;;17982:34:1;-1:-1:-1;;;;;18052:15:1;;18032:18;;;18025:43;73157:42:0;;75178;;17917:18:1;;75178:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;75173:144;;75273:28;;-1:-1:-1;;;75273:28:0;;-1:-1:-1;;;;;6977:32:1;;75273:28:0;;;6959:51:1;6932:18;;75273:28:0;6781:235:1;75173:144:0;2178:6;;-1:-1:-1;;;;;85080:19:0;;::::1;2178:6:::0;;85080:19:::1;::::0;:54:::1;;-1:-1:-1::0;;;;;;85103:23:0;::::1;;::::0;;;:13:::1;:23;::::0;;;;;::::1;;:31;;:23:::0;:31:::1;85080:54;:72;;;-1:-1:-1::0;85138:6:0::1;::::0;-1:-1:-1;;;85138:6:0;::::1;;;:14;;85148:4;85138:14;85080:72;85058:142;;;::::0;-1:-1:-1;;;85058:142:0;;26980:2:1;85058:142:0::1;::::0;::::1;26962:21:1::0;27019:2;26999:18;;;26992:30;-1:-1:-1;;;27038:18:1;;;27031:50;27098:18;;85058:142:0::1;26778:344:1::0;85058:142:0::1;85211:43;85235:8;85245;85211:23;:43::i;:::-;85265:52;736:10:::0;85298:8:::1;85308;85265:18;:52::i;90787:111::-:0;59124:32;736:10;59124:18;:32::i;:::-;90865:19:::1;:27:::0;;-1:-1:-1;;90865:27:0::1;::::0;::::1;;::::0;;;::::1;::::0;;90787:111::o;96712:117::-;1991:13;:11;:13::i;:::-;96790:31:::1;96810:10;96790:19;:31::i;90038:131::-:0;59124:32;736:10;59124:18;:32::i;:::-;90129:15:::1;:34:::0;90038:131::o;84622:122::-;59124:32;736:10;59124:18;:32::i;:::-;84704:24:::1;:32:::0;;-1:-1:-1;;84704:32:0::1;::::0;::::1;;::::0;;;::::1;::::0;;84622:122::o;90918:124::-;59124:32;736:10;59124:18;:32::i;:::-;91007:18:::1;::::0;;;:11:::1;:18;::::0;;;;;:29;90918:124::o;69768:434::-;69915:26;;-1:-1:-1;;27276:2:1;27272:15;;;27268:53;69915:26:0;;;27256:66:1;69872:4:0;;;;27338:12:1;;69915:26:0;;;;;;;;;;;;69905:37;;;;;;69889:53;;69958:9;69953:192;69977:6;:13;69973:1;:17;69953:192;;;70028:6;70035:1;70028:9;;;;;;;;:::i;:::-;;;;;;;70020:5;:17;:113;;70115:6;70122:1;70115:9;;;;;;;;:::i;:::-;;;;;;;70126:5;70098:34;;;;;;;;27518:19:1;;;27562:2;27553:12;;27546:28;27599:2;27590:12;;27361:247;70098:34:0;;;;;;;;;;;;;70088:45;;;;;;70020:113;;;70067:5;70074:6;70081:1;70074:9;;;;;;;;:::i;:::-;;;;;;;70050:34;;;;;;;;27518:19:1;;;27562:2;27553:12;;27546:28;27599:2;27590:12;;27361:247;70050:34:0;;;;;;;;;;;;;70040:45;;;;;;70020:113;70012:121;-1:-1:-1;69992:3:0;;;;:::i;:::-;;;;69953:192;;;-1:-1:-1;70171:23:0;;;;:13;:23;;;;;;70162:32;;-1:-1:-1;69768:434:0;;;;;:::o;91060:103::-;59124:32;736:10;59124:18;:32::i;:::-;91135:11:::1;:22:::0;91060:103::o;87088:957::-;68733:21;:19;:21::i;:::-;87243:13:::1;87247:8;87243:3;:13::i;:::-;87237:27;87268:1;87237:32:::0;87229:60:::1;;;;-1:-1:-1::0;;;87229:60:0::1;;;;;;;:::i;:::-;87304:22;::::0;;;:15:::1;:22;::::0;;;;;::::1;;87296:58;;;::::0;-1:-1:-1;;;87296:58:0;;24402:2:1;87296:58:0::1;::::0;::::1;24384:21:1::0;24441:2;24421:18;;;24414:30;-1:-1:-1;;;24460:18:1;;;24453:53;24523:18;;87296:58:0::1;24200:347:1::0;87296:58:0::1;87369:39;87383:10;87394:5;87401:6;87369:13;:39::i;:::-;87361:76;;;::::0;-1:-1:-1;;;87361:76:0;;24754:2:1;87361:76:0::1;::::0;::::1;24736:21:1::0;24793:2;24773:18;;;24766:30;-1:-1:-1;;;24812:18:1;;;24805:54;24876:18;;87361:76:0::1;24552:348:1::0;87361:76:0::1;87471:7;87452:15;;:26;;87444:81;;;;-1:-1:-1::0;;;87444:81:0::1;;;;;;;:::i;:::-;87540:20;::::0;;;:13:::1;:20;::::0;;;;;:31;-1:-1:-1;87540:31:0::1;87532:84;;;;-1:-1:-1::0;;;87532:84:0::1;;;;;;;:::i;:::-;87655:16;::::0;;;:9:::1;:16;::::0;;;;;;;87672:8:::1;:15:::0;;;;;;87655:33;;;;;;;87689:10:::1;87655:45:::0;;;;;;;;:55:::1;::::0;87703:7;;87655:55:::1;:::i;:::-;87631:20;::::0;;;:13:::1;:20;::::0;;;;;:79:::1;;87623:122;;;::::0;-1:-1:-1;;;87623:122:0;;25927:2:1;87623:122:0::1;::::0;::::1;25909:21:1::0;25966:2;25946:18;;;25939:30;26005:32;25985:18;;;25978:60;26055:18;;87623:122:0::1;25725:354:1::0;87623:122:0::1;87773:21;::::0;;;:11:::1;:21;::::0;;;;;:31:::1;::::0;87797:7;;87773:31:::1;:::i;:::-;87760:9;:44;87752:81;;;;-1:-1:-1::0;;;87752:81:0::1;;;;;;;:::i;:::-;87886:8;::::0;55446:7;55473:16;;;:12;:16;;;;;;87849:31:::1;::::0;:7;:31:::1;:::i;:::-;87848:47;;:64;;;-1:-1:-1::0;87899:8:0::1;::::0;:13;87848:64:::1;87840:89;;;::::0;-1:-1:-1;;;87840:89:0;;26639:2:1;87840:89:0::1;::::0;::::1;26621:21:1::0;26678:2;26658:18;;;26651:30;-1:-1:-1;;;26697:18:1;;;26690:42;26749:18;;87840:89:0::1;26437:336:1::0;87840:89:0::1;87936:16;::::0;;;:9:::1;:16;::::0;;;;;;;87953:8:::1;:15:::0;;;;;;87936:33;;;;;;;87970:10:::1;87936:45:::0;;;;;;;:56;;87985:7;;87936:16;:56:::1;::::0;87985:7;;87936:56:::1;:::i;:::-;;;;;;;;87999:40;88005:10;88017:8;88027:7;87999:40;;;;;;;;;;;::::0;:5:::1;:40::i;:::-;68777:20:::0;68171:1;69297:7;:22;69114:213;83686:113;83740:13;83773:20;:18;:20::i;:::-;83766:27;;83686:113;:::o;85513:252::-;85680:4;73157:42;74305:45;:49;;;;:77;;-1:-1:-1;74358:24:0;;;;74305:77;74301:567;;;74622:10;-1:-1:-1;;;;;74614:18:0;;;74610:85;;85702:55:::1;85725:4;85731:2;85735:7;85744:6;85752:4;85702:22;:55::i;74610:85::-:0;74714:69;;-1:-1:-1;;;74714:69:0;;74765:4;74714:69;;;17982:34:1;74772:10:0;18032:18:1;;;18025:43;73157:42:0;;74714;;17917:18:1;;74714:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;74709:148;;74811:30;;-1:-1:-1;;;74811:30:0;;74830:10;74811:30;;;6959:51:1;6932:18;;74811:30:0;6781:235:1;74709:148:0;85702:55:::1;85725:4;85731:2;85735:7;85744:6;85752:4;85702:22;:55::i;3011:201::-:0;1991:13;:11;:13::i;:::-;-1:-1:-1;;;;;3100:22:0;::::1;3092:73;;;::::0;-1:-1:-1;;;3092:73:0;;27815:2:1;3092:73:0::1;::::0;::::1;27797:21:1::0;27854:2;27834:18;;;27827:30;27893:34;27873:18;;;27866:62;-1:-1:-1;;;27944:18:1;;;27937:36;27990:19;;3092:73:0::1;27613:402:1::0;3092:73:0::1;3176:28;3195:8;3176:18;:28::i;89661:99::-:0;59124:32;736:10;59124:18;:32::i;:::-;89736:7:::1;:18:::0;89661:99::o;54439:447::-;54514:13;54540:19;54572:10;54576:6;54572:1;:10;:::i;:::-;:14;;54585:1;54572:14;:::i;:::-;-1:-1:-1;;;;;54562:25:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54562:25:0;;54540:47;;-1:-1:-1;;;54598:6:0;54605:1;54598:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;54598:15:0;;;;;;;;;-1:-1:-1;;;54624:6:0;54631:1;54624:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;54624:15:0;;;;;;;;-1:-1:-1;54655:9:0;54667:10;54671:6;54667:1;:10;:::i;:::-;:14;;54680:1;54667:14;:::i;:::-;54655:26;;54650:131;54687:1;54683;:5;54650:131;;;-1:-1:-1;;;54731:5:0;54739:3;54731:11;54722:21;;;;;;;:::i;:::-;;;;54710:6;54717:1;54710:9;;;;;;;;:::i;:::-;;;;:33;-1:-1:-1;;;;;54710:33:0;;;;;;;;-1:-1:-1;54768:1:0;54758:11;;;;;54690:3;;;:::i;:::-;;;54650:131;;;-1:-1:-1;54799:10:0;;54791:55;;;;-1:-1:-1;;;54791:55:0;;28363:2:1;54791:55:0;;;28345:21:1;;;28382:18;;;28375:30;28441:34;28421:18;;;28414:62;28493:18;;54791:55:0;28161:356:1;24221:105:0;24281:13;24314:4;24307:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24221:105;;;:::o;55792:931::-;-1:-1:-1;;;;;56114:18:0;;56110:160;;56154:9;56149:110;56173:3;:10;56169:1;:14;56149:110;;;56233:7;56241:1;56233:10;;;;;;;;:::i;:::-;;;;;;;56209:12;:20;56222:3;56226:1;56222:6;;;;;;;;:::i;:::-;;;;;;;56209:20;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;-1:-1:-1;56185:3:0;;-1:-1:-1;56185:3:0;;:::i;:::-;;;56149:110;;;;56110:160;-1:-1:-1;;;;;56286:16:0;;56282:434;;56324:9;56319:386;56343:3;:10;56339:1;:14;56319:386;;;56379:10;56392:3;56396:1;56392:6;;;;;;;;:::i;:::-;;;;;;;56379:19;;56417:14;56434:7;56442:1;56434:10;;;;;;;;:::i;:::-;;;;;;;56417:27;;56463:14;56480:12;:16;56493:2;56480:16;;;;;;;;;;;;56463:33;;56533:6;56523;:16;;56515:69;;;;-1:-1:-1;;;56515:69:0;;28724:2:1;56515:69:0;;;28706:21:1;28763:2;28743:18;;;28736:30;28802:34;28782:18;;;28775:62;-1:-1:-1;;;28853:18:1;;;28846:38;28901:19;;56515:69:0;28522:404:1;56515:69:0;56636:16;;;;:12;:16;;;;;;56655:15;;56636:34;;56355:3;;;:::i;:::-;;;56319:386;;;;55792:931;;;;;;:::o;4803:326::-;-1:-1:-1;;;;;5098:19:0;;:23;;;4803:326::o;78058:215::-;78160:4;-1:-1:-1;;;;;;78184:41:0;;-1:-1:-1;;;78184:41:0;;:81;;;78229:36;78253:11;78229:23;:36::i;59881:370::-;-1:-1:-1;;;;;59975:21:0;;;;;;:10;:21;;;;;;;;60108:46;736:10;60136:12;-1:-1:-1;;;;;60108:46:0;60151:2;60108:19;:46::i;:::-;60036:181;;;;;;;;:::i;:::-;;;;;;;;;;;;;59953:290;;;;;-1:-1:-1;;;59953:290:0;;;;;;;;:::i;79420:332::-;79136:5;-1:-1:-1;;;;;79523:33:0;;;;79515:88;;;;-1:-1:-1;;;79515:88:0;;29749:2:1;79515:88:0;;;29731:21:1;29788:2;29768:18;;;29761:30;29827:34;29807:18;;;29800:62;-1:-1:-1;;;29878:18:1;;;29871:40;29928:19;;79515:88:0;29547:406:1;79515:88:0;-1:-1:-1;;;;;79622:22:0;;79614:60;;;;-1:-1:-1;;;79614:60:0;;30160:2:1;79614:60:0;;;30142:21:1;30199:2;30179:18;;;30172:30;30238:27;30218:18;;;30211:55;30283:18;;79614:60:0;29958:349:1;79614:60:0;79709:35;;;;;;;;;-1:-1:-1;;;;;79709:35:0;;;;;;-1:-1:-1;;;;;79709:35:0;;;;;;;;;;-1:-1:-1;;;79687:57:0;;;;:19;:57;79420:332::o;31118:729::-;-1:-1:-1;;;;;31271:16:0;;31263:62;;;;-1:-1:-1;;;31263:62:0;;30514:2:1;31263:62:0;;;30496:21:1;30553:2;30533:18;;;30526:30;30592:34;30572:18;;;30565:62;-1:-1:-1;;;30643:18:1;;;30636:31;30684:19;;31263:62:0;30312:397:1;31263:62:0;736:10;31338:16;31403:21;31421:2;31403:17;:21::i;:::-;31380:44;;31435:24;31462:25;31480:6;31462:17;:25::i;:::-;31435:52;;31500:66;31521:8;31539:1;31543:2;31547:3;31552:7;31561:4;31500:20;:66::i;:::-;31579:9;:13;;;;;;;;;;;-1:-1:-1;;;;;31579:17:0;;;;;;;;;:27;;31600:6;;31579:9;:27;;31600:6;;31579:27;:::i;:::-;;;;-1:-1:-1;;31622:52:0;;;30888:25:1;;;30944:2;30929:18;;30922:34;;;-1:-1:-1;;;;;31622:52:0;;;;31655:1;;31622:52;;;;;;30861:18:1;31622:52:0;;;;;;;31765:74;31796:8;31814:1;31818:2;31822;31826:6;31834:4;31765:30;:74::i;58523:166::-;58609:19;;;;:10;:19;;;;;:30;58631:8;58609:19;:30;:::i;:::-;;58673:7;58655:26;58659:12;58663:7;58659:3;:12::i;:::-;58655:26;;;;;;:::i;:::-;;;;;;;;58523:166;;:::o;2270:132::-;2178:6;;-1:-1:-1;;;;;2178:6:0;736:10;2334:23;2326:68;;;;-1:-1:-1;;;2326:68:0;;33247:2:1;2326:68:0;;;33229:21:1;;;33266:18;;;33259:30;33325:34;33305:18;;;33298:62;33377:18;;2326:68:0;33045:356:1;59301:421:0;-1:-1:-1;;;;;59392:22:0;;;;;;:10;:22;;;;;;;;59391:23;59526:46;736:10;59554:12;656:98;59526:46;59454:194;;;;;;;;:::i;:::-;;;;;;;;;;;;;59369:305;;;;;-1:-1:-1;;;59369:305:0;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;59685:22:0;;;;;:10;:22;;;;;:29;;-1:-1:-1;;59685:29:0;59710:4;59685:29;;;59301:421::o;26420:438::-;-1:-1:-1;;;;;26653:20:0;;736:10;26653:20;;:60;;-1:-1:-1;26677:36:0;26694:4;736:10;25697:168;:::i;26677:36::-;26631:156;;;;-1:-1:-1;;;26631:156:0;;;;;;;:::i;:::-;26798:52;26821:4;26827:2;26831:3;26836:7;26845:4;26798:22;:52::i;68813:293::-;68215:1;68947:7;;:19;68939:63;;;;-1:-1:-1;;;68939:63:0;;34652:2:1;68939:63:0;;;34634:21:1;34691:2;34671:18;;;34664:30;34730:33;34710:18;;;34703:61;34781:18;;68939:63:0;34450:355:1;68939:63:0;68215:1;69080:7;:18;68813:293::o;60566:413::-;-1:-1:-1;;;;;60655:20:0;;;;;;:8;:20;;;;;;;;60654:21;60787:46;736:10;60815:12;656:98;60787:46;60715:192;;;;;;;;:::i;:::-;;;;;;;;;;;;;60632:301;;;;;-1:-1:-1;;;60632:301:0;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;60944:20:0;;;;;:8;:20;;;;;:27;;-1:-1:-1;;60944:27:0;60967:4;60944:27;;;60566:413::o;58776:98::-;58848:8;:18;58859:7;58848:8;:18;:::i;60985:141::-;61052:28;61069:10;61052:16;:28::i;:::-;-1:-1:-1;;;;;61098:20:0;;;;;:8;:20;;;;;61091:27;;-1:-1:-1;;61091:27:0;;;60985:141::o;3372:191::-;3465:6;;;-1:-1:-1;;;;;3482:17:0;;;-1:-1:-1;;;;;;3482:17:0;;;;;;;3515:40;;3465:6;;;3482:17;3465:6;;3515:40;;3446:16;;3515:40;3435:128;3372:191;:::o;61132:360::-;-1:-1:-1;;;;;61222:17:0;;;;;;:8;:17;;;;;;;;61351:46;736:10;61379:12;656:98;61351:46;61279:179;;;;;;;;:::i;33361:808::-;-1:-1:-1;;;;;33488:18:0;;33480:66;;;;-1:-1:-1;;;33480:66:0;;36253:2:1;33480:66:0;;;36235:21:1;36292:2;36272:18;;;36265:30;36331:34;36311:18;;;36304:62;-1:-1:-1;;;36382:18:1;;;36375:33;36425:19;;33480:66:0;36051:399:1;33480:66:0;736:10;33559:16;33624:21;33642:2;33624:17;:21::i;:::-;33601:44;;33656:24;33683:25;33701:6;33683:17;:25::i;:::-;33656:52;;33721:66;33742:8;33752:4;33766:1;33770:3;33775:7;33721:66;;;;;;;;;;;;:20;:66::i;:::-;33800:19;33822:13;;;;;;;;;;;-1:-1:-1;;;;;33822:19:0;;;;;;;;;;33860:21;;;;33852:70;;;;-1:-1:-1;;;33852:70:0;;36657:2:1;33852:70:0;;;36639:21:1;36696:2;36676:18;;;36669:30;36735:34;36715:18;;;36708:62;-1:-1:-1;;;36786:18:1;;;36779:34;36830:19;;33852:70:0;36455:400:1;33852:70:0;33958:9;:13;;;;;;;;;;;-1:-1:-1;;;;;33958:19:0;;;;;;;;;;;;33980:20;;;33958:42;;34029:54;;30888:25:1;;;30929:18;;;30922:34;;;33958:19:0;;34029:54;;;;;;30861:18:1;34029:54:0;;;;;;;34096:65;;;;;;;;;34140:1;34096:65;;;85958:302;25470:155;25565:52;736:10;25598:8;25608;35531:331;35686:8;-1:-1:-1;;;;;35677:17:0;:5;-1:-1:-1;;;;;35677:17:0;;35669:71;;;;-1:-1:-1;;;35669:71:0;;37062:2:1;35669:71:0;;;37044:21:1;37101:2;37081:18;;;37074:30;37140:34;37120:18;;;37113:62;-1:-1:-1;;;37191:18:1;;;37184:39;37240:19;;35669:71:0;36860:405:1;35669:71:0;-1:-1:-1;;;;;35751:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;35751:46:0;;;;;;;;;;35813:41;;1159::1;;;35813::0;;1132:18:1;35813:41:0;;;;;;;35531:331;;;:::o;59728:147::-;59797:30;59816:10;59797:18;:30::i;:::-;-1:-1:-1;;;;;59845:22:0;;;;;:10;:22;;;;;59838:29;;-1:-1:-1;;59838:29:0;;;59728:147::o;83825:567::-;83878:13;83901:16;;83946:32;83901:16;79136:5;83946:11;:32::i;:::-;83900:78;;;;84087:283;84199:33;84216:15;84199:16;:33::i;:::-;84274:51;84310:8;-1:-1:-1;;;;;84294:26:0;84322:2;84274:19;:51::i;:::-;84133:213;;;;;;;;;:::i;:::-;;;;;;;;;;;;;84087:13;:283::i;:::-;84018:361;;;;;;;;:::i;:::-;;;;;;;;;;;;;83996:390;;;;83825:567;:::o;25937:406::-;-1:-1:-1;;;;;26145:20:0;;736:10;26145:20;;:60;;-1:-1:-1;26169:36:0;26186:4;736:10;25697:168;:::i;26169:36::-;26123:156;;;;-1:-1:-1;;;26123:156:0;;;;;;;:::i;:::-;26290:45;26308:4;26314:2;26318;26322:6;26330:4;26290:17;:45::i;23500:310::-;23602:4;-1:-1:-1;;;;;;23639:41:0;;-1:-1:-1;;;23639:41:0;;:110;;-1:-1:-1;;;;;;;23697:52:0;;-1:-1:-1;;;23697:52:0;23639:110;:163;;;-1:-1:-1;;;;;;;;;;14889:40:0;;;23766:36;14780:157;39797:198;39917:16;;;39931:1;39917:16;;;;;;;;;39863;;39892:22;;39917:16;;;;;;;;;;;;-1:-1:-1;39917:16:0;39892:41;;39955:7;39944:5;39950:1;39944:8;;;;;;;;:::i;:::-;;;;;;;;;;:18;39982:5;39797:198;-1:-1:-1;;39797:198:0:o;91926:488::-;2178:6;;-1:-1:-1;;;;;92187:19:0;;;2178:6;;92187:19;;:54;;-1:-1:-1;;;;;;92210:23:0;;;;;;:13;:23;;;;;;;;:31;;:23;:31;92187:54;:72;;;-1:-1:-1;92245:6:0;;-1:-1:-1;;;92245:6:0;;;;:14;;92255:4;92245:14;92187:72;:94;;;-1:-1:-1;;;;;;92263:18:0;;;92187:94;92165:164;;;;-1:-1:-1;;;92165:164:0;;26980:2:1;92165:164:0;;;26962:21:1;27019:2;26999:18;;;26992:30;-1:-1:-1;;;27038:18:1;;;27031:50;27098:18;;92165:164:0;26778:344:1;92165:164:0;92340:66;92367:8;92377:4;92383:2;92387:3;92392:7;92401:4;92340:26;:66::i;38224:744::-;-1:-1:-1;;;;;38439:13:0;;5098:19;:23;38435:526;;38475:72;;-1:-1:-1;;;38475:72:0;;-1:-1:-1;;;;;38475:38:0;;;;;:72;;38514:8;;38524:4;;38530:2;;38534:6;;38542:4;;38475:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38475:72:0;;;;;;;;-1:-1:-1;;38475:72:0;;;;;;;;;;;;:::i;:::-;;;38471:479;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;38823:6;38816:14;;-1:-1:-1;;;38816:14:0;;;;;;;;:::i;38471:479::-;;;38872:62;;-1:-1:-1;;;38872:62:0;;40673:2:1;38872:62:0;;;40655:21:1;40712:2;40692:18;;;40685:30;40751:34;40731:18;;;40724:62;-1:-1:-1;;;40802:18:1;;;40795:50;40862:19;;38872:62:0;40471:416:1;38471:479:0;-1:-1:-1;;;;;;38597:55:0;;-1:-1:-1;;;38597:55:0;38593:154;;38677:50;;-1:-1:-1;;;38677:50:0;;;;;;;:::i;28654:1146::-;28881:7;:14;28867:3;:10;:28;28859:81;;;;-1:-1:-1;;;28859:81:0;;41503:2:1;28859:81:0;;;41485:21:1;41542:2;41522:18;;;41515:30;41581:34;41561:18;;;41554:62;-1:-1:-1;;;41632:18:1;;;41625:38;41680:19;;28859:81:0;41301:404:1;28859:81:0;-1:-1:-1;;;;;28959:16:0;;28951:66;;;;-1:-1:-1;;;28951:66:0;;;;;;;:::i;:::-;736:10;29074:60;736:10;29105:4;29111:2;29115:3;29120:7;29129:4;29074:20;:60::i;:::-;29152:9;29147:421;29171:3;:10;29167:1;:14;29147:421;;;29203:10;29216:3;29220:1;29216:6;;;;;;;;:::i;:::-;;;;;;;29203:19;;29237:14;29254:7;29262:1;29254:10;;;;;;;;:::i;:::-;;;;;;;;;;;;29281:19;29303:13;;;;;;;;;;-1:-1:-1;;;;;29303:19:0;;;;;;;;;;;;29254:10;;-1:-1:-1;29345:21:0;;;;29337:76;;;;-1:-1:-1;;;29337:76:0;;;;;;;:::i;:::-;29457:9;:13;;;;;;;;;;;-1:-1:-1;;;;;29457:19:0;;;;;;;;;;29479:20;;;29457:42;;29529:17;;;;;;;:27;;29479:20;;29457:9;29529:27;;29479:20;;29529:27;:::i;:::-;;;;;;;;29188:380;;;29183:3;;;;:::i;:::-;;;29147:421;;;;29615:2;-1:-1:-1;;;;;29585:47:0;29609:4;-1:-1:-1;;;;;29585:47:0;29599:8;-1:-1:-1;;;;;29585:47:0;;29619:3;29624:7;29585:47;;;;;;;:::i;:::-;;;;;;;;29717:75;29753:8;29763:4;29769:2;29773:3;29778:7;29787:4;29717:35;:75::i;53307:716::-;53363:13;53414:14;53431:17;53442:5;53431:10;:17::i;:::-;53451:1;53431:21;53414:38;;53467:20;53501:6;-1:-1:-1;;;;;53490:18:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53490:18:0;-1:-1:-1;53467:41:0;-1:-1:-1;53632:28:0;;;53648:2;53632:28;53689:288;-1:-1:-1;;53721:5:0;-1:-1:-1;;;53858:2:0;53847:14;;53842:30;53721:5;53829:44;53919:2;53910:11;;;-1:-1:-1;53940:21:0;53689:288;53940:21;-1:-1:-1;53998:6:0;53307:716;-1:-1:-1;;;53307:716:0:o;62283:1912::-;62341:13;62371:4;:11;62386:1;62371:16;62367:31;;-1:-1:-1;;62389:9:0;;;;;;;;;-1:-1:-1;62389:9:0;;;62283:1912::o;62367:31::-;62450:19;62472:12;;;;;;;;;;;;;;;;;62450:34;;62536:18;62582:1;62563:4;:11;62577:1;62563:15;;;;:::i;:::-;62562:21;;;;:::i;:::-;62557:27;;:1;:27;:::i;:::-;62536:48;-1:-1:-1;62667:20:0;62701:15;62536:48;62714:2;62701:15;:::i;:::-;-1:-1:-1;;;;;62690:27:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;62690:27:0;;62667:50;;62814:10;62806:6;62799:26;62909:1;62902:5;62898:13;62968:4;63019;63013:11;63004:7;63000:25;63115:2;63107:6;63103:15;63188:754;63207:6;63198:7;63195:19;63188:754;;;63307:1;63298:7;63294:15;63283:26;;63346:7;63340:14;63472:4;63464:5;63460:2;63456:14;63452:25;63442:8;63438:40;63432:47;63421:9;63413:67;63526:1;63515:9;63511:17;63498:30;;63605:4;63597:5;63593:2;63589:14;63585:25;63575:8;63571:40;63565:47;63554:9;63546:67;63659:1;63648:9;63644:17;63631:30;;63738:4;63730:5;63727:1;63722:14;63718:25;63708:8;63704:40;63698:47;63687:9;63679:67;63792:1;63781:9;63777:17;63764:30;;63871:4;63863:5;63851:25;63841:8;63837:40;63831:47;63820:9;63812:67;-1:-1:-1;63925:1:0;63910:17;63188:754;;;64015:1;64008:4;64002:11;63998:19;64036:1;64031:54;;;;64104:1;64099:52;;;;63991:160;;64031:54;-1:-1:-1;;;;;64047:17:0;;64040:43;64031:54;;64099:52;-1:-1:-1;;;;;64115:17:0;;64108:41;63991:160;-1:-1:-1;64181:6:0;;62283:1912;-1:-1:-1;;;;;;;;62283:1912:0:o;27322:974::-;-1:-1:-1;;;;;27510:16:0;;27502:66;;;;-1:-1:-1;;;27502:66:0;;;;;;;:::i;:::-;736:10;27581:16;27646:21;27664:2;27646:17;:21::i;:::-;27623:44;;27678:24;27705:25;27723:6;27705:17;:25::i;:::-;27678:52;;27743:60;27764:8;27774:4;27780:2;27784:3;27789:7;27798:4;27743:20;:60::i;:::-;27816:19;27838:13;;;;;;;;;;;-1:-1:-1;;;;;27838:19:0;;;;;;;;;;27876:21;;;;27868:76;;;;-1:-1:-1;;;27868:76:0;;;;;;;:::i;:::-;27980:9;:13;;;;;;;;;;;-1:-1:-1;;;;;27980:19:0;;;;;;;;;;28002:20;;;27980:42;;28044:17;;;;;;;:27;;28002:20;;27980:9;28044:27;;28002:20;;28044:27;:::i;:::-;;;;-1:-1:-1;;28089:46:0;;;30888:25:1;;;30944:2;30929:18;;30922:34;;;-1:-1:-1;;;;;28089:46:0;;;;;;;;;;;;;;30861:18:1;28089:46:0;;;;;;;28220:68;28251:8;28261:4;28267:2;28271;28275:6;28283:4;28220:30;:68::i;:::-;27491:805;;;;27322:974;;;;;:::o;38976:813::-;-1:-1:-1;;;;;39216:13:0;;5098:19;:23;39212:570;;39252:79;;-1:-1:-1;;;39252:79:0;;-1:-1:-1;;;;;39252:43:0;;;;;:79;;39296:8;;39306:4;;39312:3;;39317:7;;39326:4;;39252:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39252:79:0;;;;;;;;-1:-1:-1;;39252:79:0;;;;;;;;;;;;:::i;:::-;;;39248:523;;;;:::i;:::-;-1:-1:-1;;;;;;39413:60:0;;-1:-1:-1;;;39413:60:0;39409:159;;39498:50;;-1:-1:-1;;;39498:50:0;;;;;;;:::i;50173:922::-;50226:7;;-1:-1:-1;;;50304:15:0;;50300:102;;-1:-1:-1;;;50340:15:0;;;-1:-1:-1;50384:2:0;50374:12;50300:102;50429:6;50420:5;:15;50416:102;;50465:6;50456:15;;;-1:-1:-1;50500:2:0;50490:12;50416:102;50545:6;50536:5;:15;50532:102;;50581:6;50572:15;;;-1:-1:-1;50616:2:0;50606:12;50532:102;50661:5;50652;:14;50648:99;;50696:5;50687:14;;;-1:-1:-1;50730:1:0;50720:11;50648:99;50774:5;50765;:14;50761:99;;50809:5;50800:14;;;-1:-1:-1;50843:1:0;50833:11;50761:99;50887:5;50878;:14;50874:99;;50922:5;50913:14;;;-1:-1:-1;50956:1:0;50946:11;50874:99;51000:5;50991;:14;50987:66;;51036:1;51026:11;51081:6;50173:922;-1:-1:-1;;50173:922:0:o;14:173:1:-;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:254::-;260:6;268;321:2;309:9;300:7;296:23;292:32;289:52;;;337:1;334;327:12;289:52;360:29;379:9;360:29;:::i;:::-;350:39;436:2;421:18;;;;408:32;;-1:-1:-1;;;192:254:1:o;633:131::-;-1:-1:-1;;;;;;707:32:1;;697:43;;687:71;;754:1;751;744:12;769:245;827:6;880:2;868:9;859:7;855:23;851:32;848:52;;;896:1;893;886:12;848:52;935:9;922:23;954:30;978:5;954:30;:::i;1211:180::-;1270:6;1323:2;1311:9;1302:7;1298:23;1294:32;1291:52;;;1339:1;1336;1329:12;1291:52;-1:-1:-1;1362:23:1;;1211:180;-1:-1:-1;1211:180:1:o;1396:366::-;1463:6;1471;1524:2;1512:9;1503:7;1499:23;1495:32;1492:52;;;1540:1;1537;1530:12;1492:52;1563:29;1582:9;1563:29;:::i;:::-;1553:39;;1642:2;1631:9;1627:18;1614:32;-1:-1:-1;;;;;1679:5:1;1675:38;1668:5;1665:49;1655:77;;1728:1;1725;1718:12;1655:77;1751:5;1741:15;;;1396:366;;;;;:::o;1767:250::-;1852:1;1862:113;1876:6;1873:1;1870:13;1862:113;;;1952:11;;;1946:18;1933:11;;;1926:39;1898:2;1891:10;1862:113;;;-1:-1:-1;;2009:1:1;1991:16;;1984:27;1767:250::o;2022:271::-;2064:3;2102:5;2096:12;2129:6;2124:3;2117:19;2145:76;2214:6;2207:4;2202:3;2198:14;2191:4;2184:5;2180:16;2145:76;:::i;:::-;2275:2;2254:15;-1:-1:-1;;2250:29:1;2241:39;;;;2282:4;2237:50;;2022:271;-1:-1:-1;;2022:271:1:o;2298:220::-;2447:2;2436:9;2429:21;2410:4;2467:45;2508:2;2497:9;2493:18;2485:6;2467:45;:::i;2523:186::-;2582:6;2635:2;2623:9;2614:7;2610:23;2606:32;2603:52;;;2651:1;2648;2641:12;2603:52;2674:29;2693:9;2674:29;:::i;2714:322::-;2791:6;2799;2807;2860:2;2848:9;2839:7;2835:23;2831:32;2828:52;;;2876:1;2873;2866:12;2828:52;2899:29;2918:9;2899:29;:::i;:::-;2889:39;2975:2;2960:18;;2947:32;;-1:-1:-1;3026:2:1;3011:18;;;2998:32;;2714:322;-1:-1:-1;;;2714:322:1:o;3041:127::-;3102:10;3097:3;3093:20;3090:1;3083:31;3133:4;3130:1;3123:15;3157:4;3154:1;3147:15;3173:249;3283:2;3264:13;;-1:-1:-1;;3260:27:1;3248:40;;-1:-1:-1;;;;;3303:34:1;;3339:22;;;3300:62;3297:88;;;3365:18;;:::i;:::-;3401:2;3394:22;-1:-1:-1;;3173:249:1:o;3427:556::-;3470:5;3523:3;3516:4;3508:6;3504:17;3500:27;3490:55;;3541:1;3538;3531:12;3490:55;3577:6;3564:20;-1:-1:-1;;;;;3599:2:1;3596:26;3593:52;;;3625:18;;:::i;:::-;3674:2;3668:9;3686:67;3741:2;3722:13;;-1:-1:-1;;3718:27:1;3747:4;3714:38;3668:9;3686:67;:::i;:::-;3777:2;3769:6;3762:18;3823:3;3816:4;3811:2;3803:6;3799:15;3795:26;3792:35;3789:55;;;3840:1;3837;3830:12;3789:55;3904:2;3897:4;3889:6;3885:17;3878:4;3870:6;3866:17;3853:54;3951:1;3927:15;;;3944:4;3923:26;3916:37;;;;3931:6;3427:556;-1:-1:-1;;;3427:556:1:o;3988:390::-;4066:6;4074;4127:2;4115:9;4106:7;4102:23;4098:32;4095:52;;;4143:1;4140;4133:12;4095:52;4179:9;4166:23;4156:33;;4240:2;4229:9;4225:18;4212:32;-1:-1:-1;;;;;4259:6:1;4256:30;4253:50;;;4299:1;4296;4289:12;4253:50;4322;4364:7;4355:6;4344:9;4340:22;4322:50;:::i;:::-;4312:60;;;3988:390;;;;;:::o;4383:248::-;4451:6;4459;4512:2;4500:9;4491:7;4487:23;4483:32;4480:52;;;4528:1;4525;4518:12;4480:52;-1:-1:-1;;4551:23:1;;;4621:2;4606:18;;;4593:32;;-1:-1:-1;4383:248:1:o;4915:183::-;4975:4;-1:-1:-1;;;;;5000:6:1;4997:30;4994:56;;;5030:18;;:::i;:::-;-1:-1:-1;5075:1:1;5071:14;5087:4;5067:25;;4915:183::o;5103:724::-;5157:5;5210:3;5203:4;5195:6;5191:17;5187:27;5177:55;;5228:1;5225;5218:12;5177:55;5264:6;5251:20;5290:4;5313:43;5353:2;5313:43;:::i;:::-;5385:2;5379:9;5397:31;5425:2;5417:6;5397:31;:::i;:::-;5463:18;;;5555:1;5551:10;;;;5539:23;;5535:32;;;5497:15;;;;-1:-1:-1;5579:15:1;;;5576:35;;;5607:1;5604;5597:12;5576:35;5643:2;5635:6;5631:15;5655:142;5671:6;5666:3;5663:15;5655:142;;;5737:17;;5725:30;;5775:12;;;;5688;;5655:142;;;-1:-1:-1;5815:6:1;5103:724;-1:-1:-1;;;;;;5103:724:1:o;5832:944::-;5986:6;5994;6002;6010;6018;6071:3;6059:9;6050:7;6046:23;6042:33;6039:53;;;6088:1;6085;6078:12;6039:53;6111:29;6130:9;6111:29;:::i;:::-;6101:39;;6159:38;6193:2;6182:9;6178:18;6159:38;:::i;:::-;6149:48;;6248:2;6237:9;6233:18;6220:32;-1:-1:-1;;;;;6312:2:1;6304:6;6301:14;6298:34;;;6328:1;6325;6318:12;6298:34;6351:61;6404:7;6395:6;6384:9;6380:22;6351:61;:::i;:::-;6341:71;;6465:2;6454:9;6450:18;6437:32;6421:48;;6494:2;6484:8;6481:16;6478:36;;;6510:1;6507;6500:12;6478:36;6533:63;6588:7;6577:8;6566:9;6562:24;6533:63;:::i;:::-;6523:73;;6649:3;6638:9;6634:19;6621:33;6605:49;;6679:2;6669:8;6666:16;6663:36;;;6695:1;6692;6685:12;6663:36;;6718:52;6762:7;6751:8;6740:9;6736:24;6718:52;:::i;:::-;6708:62;;;5832:944;;;;;;;;:::o;7021:730::-;7075:5;7128:3;7121:4;7113:6;7109:17;7105:27;7095:55;;7146:1;7143;7136:12;7095:55;7182:6;7169:20;7208:4;7231:43;7271:2;7231:43;:::i;:::-;7303:2;7297:9;7315:31;7343:2;7335:6;7315:31;:::i;:::-;7381:18;;;7473:1;7469:10;;;;7457:23;;7453:32;;;7415:15;;;;-1:-1:-1;7497:15:1;;;7494:35;;;7525:1;7522;7515:12;7494:35;7561:2;7553:6;7549:15;7573:148;7589:6;7584:3;7581:15;7573:148;;;7655:23;7674:3;7655:23;:::i;:::-;7643:36;;7699:12;;;;7606;;7573:148;;7756:595;7874:6;7882;7935:2;7923:9;7914:7;7910:23;7906:32;7903:52;;;7951:1;7948;7941:12;7903:52;7991:9;7978:23;-1:-1:-1;;;;;8061:2:1;8053:6;8050:14;8047:34;;;8077:1;8074;8067:12;8047:34;8100:61;8153:7;8144:6;8133:9;8129:22;8100:61;:::i;:::-;8090:71;;8214:2;8203:9;8199:18;8186:32;8170:48;;8243:2;8233:8;8230:16;8227:36;;;8259:1;8256;8249:12;8227:36;;8282:63;8337:7;8326:8;8315:9;8311:24;8282:63;:::i;8356:435::-;8409:3;8447:5;8441:12;8474:6;8469:3;8462:19;8500:4;8529:2;8524:3;8520:12;8513:19;;8566:2;8559:5;8555:14;8587:1;8597:169;8611:6;8608:1;8605:13;8597:169;;;8672:13;;8660:26;;8706:12;;;;8741:15;;;;8633:1;8626:9;8597:169;;;-1:-1:-1;8782:3:1;;8356:435;-1:-1:-1;;;;;8356:435:1:o;8796:261::-;8975:2;8964:9;8957:21;8938:4;8995:56;9047:2;9036:9;9032:18;9024:6;8995:56;:::i;9062:322::-;9131:6;9184:2;9172:9;9163:7;9159:23;9155:32;9152:52;;;9200:1;9197;9190:12;9152:52;9240:9;9227:23;-1:-1:-1;;;;;9265:6:1;9262:30;9259:50;;;9305:1;9302;9295:12;9259:50;9328;9370:7;9361:6;9350:9;9346:22;9328:50;:::i;:::-;9318:60;9062:322;-1:-1:-1;;;;9062:322:1:o;9389:118::-;9475:5;9468:13;9461:21;9454:5;9451:32;9441:60;;9497:1;9494;9487:12;9512:315;9577:6;9585;9638:2;9626:9;9617:7;9613:23;9609:32;9606:52;;;9654:1;9651;9644:12;9606:52;9677:29;9696:9;9677:29;:::i;:::-;9667:39;;9756:2;9745:9;9741:18;9728:32;9769:28;9791:5;9769:28;:::i;10085:241::-;10141:6;10194:2;10182:9;10173:7;10169:23;10165:32;10162:52;;;10210:1;10207;10200:12;10162:52;10249:9;10236:23;10268:28;10290:5;10268:28;:::i;10331:628::-;10451:6;10459;10467;10475;10483;10536:3;10524:9;10515:7;10511:23;10507:33;10504:53;;;10553:1;10550;10543:12;10504:53;10589:9;10576:23;10566:33;;10646:2;10635:9;10631:18;10618:32;10608:42;;10697:2;10686:9;10682:18;10669:32;10659:42;;10720:38;10754:2;10743:9;10739:18;10720:38;:::i;:::-;10710:48;;10809:3;10798:9;10794:19;10781:33;-1:-1:-1;;;;;10829:6:1;10826:30;10823:50;;;10869:1;10866;10859:12;10823:50;10892:61;10945:7;10936:6;10925:9;10921:22;10892:61;:::i;10964:309::-;11029:6;11037;11090:2;11078:9;11069:7;11065:23;11061:32;11058:52;;;11106:1;11103;11096:12;11058:52;11142:9;11129:23;11119:33;;11202:2;11191:9;11187:18;11174:32;11215:28;11237:5;11215:28;:::i;11278:663::-;11405:6;11413;11421;11474:2;11462:9;11453:7;11449:23;11445:32;11442:52;;;11490:1;11487;11480:12;11442:52;11530:9;11517:23;-1:-1:-1;;;;;11600:2:1;11592:6;11589:14;11586:34;;;11616:1;11613;11606:12;11586:34;11639:61;11692:7;11683:6;11672:9;11668:22;11639:61;:::i;:::-;11629:71;;11747:2;11736:9;11732:18;11719:32;11709:42;;11804:2;11793:9;11789:18;11776:32;11760:48;;11833:2;11823:8;11820:16;11817:36;;;11849:1;11846;11839:12;11817:36;;11872:63;11927:7;11916:8;11905:9;11901:24;11872:63;:::i;:::-;11862:73;;;11278:663;;;;;:::o;12154:254::-;12222:6;12230;12283:2;12271:9;12262:7;12258:23;12254:32;12251:52;;;12299:1;12296;12289:12;12251:52;12335:9;12322:23;12312:33;;12364:38;12398:2;12387:9;12383:18;12364:38;:::i;:::-;12354:48;;12154:254;;;;;:::o;12413:490::-;12515:6;12523;12531;12584:2;12572:9;12563:7;12559:23;12555:32;12552:52;;;12600:1;12597;12590:12;12552:52;12623:29;12642:9;12623:29;:::i;:::-;12613:39;;12699:2;12688:9;12684:18;12671:32;12661:42;;12754:2;12743:9;12739:18;12726:32;-1:-1:-1;;;;;12773:6:1;12770:30;12767:50;;;12813:1;12810;12803:12;12767:50;12836:61;12889:7;12880:6;12869:9;12865:22;12836:61;:::i;12908:553::-;13019:6;13027;13035;13043;13096:3;13084:9;13075:7;13071:23;13067:33;13064:53;;;13113:1;13110;13103:12;13064:53;13149:9;13136:23;13126:33;;13206:2;13195:9;13191:18;13178:32;13168:42;;13257:2;13246:9;13242:18;13229:32;13219:42;;13312:2;13301:9;13297:18;13284:32;-1:-1:-1;;;;;13331:6:1;13328:30;13325:50;;;13371:1;13368;13361:12;13325:50;13394:61;13447:7;13438:6;13427:9;13423:22;13394:61;:::i;:::-;13384:71;;;12908:553;;;;;;;:::o;13466:260::-;13534:6;13542;13595:2;13583:9;13574:7;13570:23;13566:32;13563:52;;;13611:1;13608;13601:12;13563:52;13634:29;13653:9;13634:29;:::i;:::-;13624:39;;13682:38;13716:2;13705:9;13701:18;13682:38;:::i;13731:607::-;13835:6;13843;13851;13859;13867;13920:3;13908:9;13899:7;13895:23;13891:33;13888:53;;;13937:1;13934;13927:12;13888:53;13960:29;13979:9;13960:29;:::i;:::-;13950:39;;14008:38;14042:2;14031:9;14027:18;14008:38;:::i;:::-;13998:48;;14093:2;14082:9;14078:18;14065:32;14055:42;;14144:2;14133:9;14129:18;14116:32;14106:42;;14199:3;14188:9;14184:19;14171:33;-1:-1:-1;;;;;14219:6:1;14216:30;14213:50;;;14259:1;14256;14249:12;14213:50;14282;14324:7;14315:6;14304:9;14300:22;14282:50;:::i;14754:380::-;14833:1;14829:12;;;;14876;;;14897:61;;14951:4;14943:6;14939:17;14929:27;;14897:61;15004:2;14996:6;14993:14;14973:18;14970:38;14967:161;;15050:10;15045:3;15041:20;15038:1;15031:31;15085:4;15082:1;15075:15;15113:4;15110:1;15103:15;14967:161;;14754:380;;;:::o;15265:1020::-;15441:3;15470:1;15503:6;15497:13;15533:36;15559:9;15533:36;:::i;:::-;15588:1;15605:18;;;15632:133;;;;15779:1;15774:356;;;;15598:532;;15632:133;-1:-1:-1;;15665:24:1;;15653:37;;15738:14;;15731:22;15719:35;;15710:45;;;-1:-1:-1;15632:133:1;;15774:356;15805:6;15802:1;15795:17;15835:4;15880:2;15877:1;15867:16;15905:1;15919:165;15933:6;15930:1;15927:13;15919:165;;;16011:14;;15998:11;;;15991:35;16054:16;;;;15948:10;;15919:165;;;15923:3;;;16113:6;16108:3;16104:16;16097:23;;15598:532;;;;;16161:6;16155:13;16177:68;16236:8;16231:3;16224:4;16216:6;16212:17;16177:68;:::i;:::-;16261:18;;15265:1020;-1:-1:-1;;;;15265:1020:1:o;16290:339::-;16492:2;16474:21;;;16531:2;16511:18;;;16504:30;-1:-1:-1;;;16565:2:1;16550:18;;16543:45;16620:2;16605:18;;16290:339::o;16634:127::-;16695:10;16690:3;16686:20;16683:1;16676:31;16726:4;16723:1;16716:15;16750:4;16747:1;16740:15;16766:125;16831:9;;;16852:10;;;16849:36;;;16865:18;;:::i;16896:168::-;16969:9;;;17000;;17017:15;;;17011:22;;16997:37;16987:71;;17038:18;;:::i;17201:217::-;17241:1;17267;17257:132;;17311:10;17306:3;17302:20;17299:1;17292:31;17346:4;17343:1;17336:15;17374:4;17371:1;17364:15;17257:132;-1:-1:-1;17403:9:1;;17201:217::o;18079:245::-;18146:6;18199:2;18187:9;18178:7;18174:23;18170:32;18167:52;;;18215:1;18212;18205:12;18167:52;18247:9;18241:16;18266:28;18288:5;18266:28;:::i;23928:127::-;23989:10;23984:3;23980:20;23977:1;23970:31;24020:4;24017:1;24010:15;24044:4;24041:1;24034:15;24060:135;24099:3;24120:17;;;24117:43;;24140:18;;:::i;:::-;-1:-1:-1;24187:1:1;24176:13;;24060:135::o;24905:406::-;25107:2;25089:21;;;25146:2;25126:18;;;25119:30;25185:34;25180:2;25165:18;;25158:62;-1:-1:-1;;;25251:2:1;25236:18;;25229:40;25301:3;25286:19;;24905:406::o;25316:404::-;25518:2;25500:21;;;25557:2;25537:18;;;25530:30;25596:34;25591:2;25576:18;;25569:62;-1:-1:-1;;;25662:2:1;25647:18;;25640:38;25710:3;25695:19;;25316:404::o;26084:348::-;26286:2;26268:21;;;26325:2;26305:18;;;26298:30;26364:26;26359:2;26344:18;;26337:54;26423:2;26408:18;;26084:348::o;28020:136::-;28059:3;28087:5;28077:39;;28096:18;;:::i;:::-;-1:-1:-1;;;28132:18:1;;28020:136::o;28931:611::-;-1:-1:-1;;;29289:3:1;29282:23;29264:3;29334:6;29328:13;29350:74;29417:6;29413:1;29408:3;29404:11;29397:4;29389:6;29385:17;29350:74;:::i;:::-;-1:-1:-1;;;29483:1:1;29443:16;;;;29475:10;;;29468:41;-1:-1:-1;29533:2:1;29525:11;;28931:611;-1:-1:-1;28931:611:1:o;30967:545::-;31069:2;31064:3;31061:11;31058:448;;;31105:1;31130:5;31126:2;31119:17;31175:4;31171:2;31161:19;31245:2;31233:10;31229:19;31226:1;31222:27;31216:4;31212:38;31281:4;31269:10;31266:20;31263:47;;;-1:-1:-1;31304:4:1;31263:47;31359:2;31354:3;31350:12;31347:1;31343:20;31337:4;31333:31;31323:41;;31414:82;31432:2;31425:5;31422:13;31414:82;;;31477:17;;;31458:1;31447:13;31414:82;;31688:1352;31814:3;31808:10;-1:-1:-1;;;;;31833:6:1;31830:30;31827:56;;;31863:18;;:::i;:::-;31892:97;31982:6;31942:38;31974:4;31968:11;31942:38;:::i;:::-;31936:4;31892:97;:::i;:::-;32044:4;;32108:2;32097:14;;32125:1;32120:663;;;;32827:1;32844:6;32841:89;;;-1:-1:-1;32896:19:1;;;32890:26;32841:89;-1:-1:-1;;31645:1:1;31641:11;;;31637:24;31633:29;31623:40;31669:1;31665:11;;;31620:57;32943:81;;32090:944;;32120:663;15212:1;15205:14;;;15249:4;15236:18;;-1:-1:-1;;32156:20:1;;;32274:236;32288:7;32285:1;32282:14;32274:236;;;32377:19;;;32371:26;32356:42;;32469:27;;;;32437:1;32425:14;;;;32304:19;;32274:236;;;32278:3;32538:6;32529:7;32526:19;32523:201;;;32599:19;;;32593:26;-1:-1:-1;;32682:1:1;32678:14;;;32694:3;32674:24;32670:37;32666:42;32651:58;32636:74;;32523:201;-1:-1:-1;;;;;32770:1:1;32754:14;;;32750:22;32737:36;;-1:-1:-1;31688:1352:1:o;33406:624::-;-1:-1:-1;;;33764:3:1;33757:23;33739:3;33809:6;33803:13;33825:74;33892:6;33888:1;33883:3;33879:11;33872:4;33864:6;33860:17;33825:74;:::i;:::-;33962:34;33958:1;33918:16;;;;33950:10;;;33943:54;-1:-1:-1;34021:2:1;34013:11;;33406:624;-1:-1:-1;33406:624:1:o;34035:410::-;34237:2;34219:21;;;34276:2;34256:18;;;34249:30;34315:34;34310:2;34295:18;;34288:62;-1:-1:-1;;;34381:2:1;34366:18;;34359:44;34435:3;34420:19;;34035:410::o;34810:622::-;-1:-1:-1;;;35168:3:1;35161:23;35143:3;35213:6;35207:13;35229:74;35296:6;35292:1;35287:3;35283:11;35276:4;35268:6;35264:17;35229:74;:::i;:::-;35366:32;35362:1;35322:16;;;;35354:10;;;35347:52;-1:-1:-1;35423:2:1;35415:11;;34810:622;-1:-1:-1;34810:622:1:o;35437:609::-;-1:-1:-1;;;35795:3:1;35788:23;35770:3;35840:6;35834:13;35856:74;35923:6;35919:1;35914:3;35910:11;35903:4;35895:6;35891:17;35856:74;:::i;:::-;-1:-1:-1;;;35989:1:1;35949:16;;;;35981:10;;;35974:39;-1:-1:-1;36037:2:1;36029:11;;35437:609;-1:-1:-1;35437:609:1:o;37270:1050::-;37782:66;37777:3;37770:79;37752:3;37878:6;37872:13;37894:75;37962:6;37957:2;37952:3;37948:12;37941:4;37933:6;37929:17;37894:75;:::i;:::-;-1:-1:-1;;;38028:2:1;37988:16;;;38020:11;;;38013:71;38109:13;;38131:76;38109:13;38193:2;38185:11;;38178:4;38166:17;;38131:76;:::i;:::-;-1:-1:-1;;;38267:2:1;38226:17;;;;38259:11;;;38252:35;38311:2;38303:11;;37270:1050;-1:-1:-1;;;;37270:1050:1:o;38325:461::-;38587:31;38582:3;38575:44;38557:3;38648:6;38642:13;38664:75;38732:6;38727:2;38722:3;38718:12;38711:4;38703:6;38699:17;38664:75;:::i;:::-;38759:16;;;;38777:2;38755:25;;38325:461;-1:-1:-1;;38325:461:1:o;38791:561::-;-1:-1:-1;;;;;39088:15:1;;;39070:34;;39140:15;;39135:2;39120:18;;39113:43;39187:2;39172:18;;39165:34;;;39230:2;39215:18;;39208:34;;;39050:3;39273;39258:19;;39251:32;;;39013:4;;39300:46;;39326:19;;39318:6;39300:46;:::i;:::-;39292:54;38791:561;-1:-1:-1;;;;;;;38791:561:1:o;39357:249::-;39426:6;39479:2;39467:9;39458:7;39454:23;39450:32;39447:52;;;39495:1;39492;39485:12;39447:52;39527:9;39521:16;39546:30;39570:5;39546:30;:::i;39611:179::-;39646:3;39688:1;39670:16;39667:23;39664:120;;;39734:1;39731;39728;39713:23;-1:-1:-1;39771:1:1;39765:8;39760:3;39756:18;39664:120;39611:179;:::o;39795:671::-;39834:3;39876:4;39858:16;39855:26;39852:39;;;39795:671;:::o;39852:39::-;39918:2;39912:9;-1:-1:-1;;39983:16:1;39979:25;;39976:1;39912:9;39955:50;40034:4;40028:11;40058:16;-1:-1:-1;;;;;40164:2:1;40157:4;40149:6;40145:17;40142:25;40137:2;40129:6;40126:14;40123:45;40120:58;;;40171:5;;;;;39795:671;:::o;40120:58::-;40208:6;40202:4;40198:17;40187:28;;40244:3;40238:10;40271:2;40263:6;40260:14;40257:27;;;40277:5;;;;;;39795:671;:::o;40257:27::-;40361:2;40342:16;40336:4;40332:27;40328:36;40321:4;40312:6;40307:3;40303:16;40299:27;40296:69;40293:82;;;40368:5;;;;;;39795:671;:::o;40293:82::-;40384:57;40435:4;40426:6;40418;40414:19;40410:30;40404:4;40384:57;:::i;:::-;-1:-1:-1;40457:3:1;;39795:671;-1:-1:-1;;;;;39795:671:1:o;40892:404::-;41094:2;41076:21;;;41133:2;41113:18;;;41106:30;41172:34;41167:2;41152:18;;41145:62;-1:-1:-1;;;41238:2:1;41223:18;;41216:38;41286:3;41271:19;;40892:404::o;41710:401::-;41912:2;41894:21;;;41951:2;41931:18;;;41924:30;41990:34;41985:2;41970:18;;41963:62;-1:-1:-1;;;42056:2:1;42041:18;;42034:35;42101:3;42086:19;;41710:401::o;42116:406::-;42318:2;42300:21;;;42357:2;42337:18;;;42330:30;42396:34;42391:2;42376:18;;42369:62;-1:-1:-1;;;42462:2:1;42447:18;;42440:40;42512:3;42497:19;;42116:406::o;42527:465::-;42784:2;42773:9;42766:21;42747:4;42810:56;42862:2;42851:9;42847:18;42839:6;42810:56;:::i;:::-;42914:9;42906:6;42902:22;42897:2;42886:9;42882:18;42875:50;42942:44;42979:6;42971;42942:44;:::i;:::-;42934:52;42527:465;-1:-1:-1;;;;;42527:465:1:o;42997:827::-;-1:-1:-1;;;;;43394:15:1;;;43376:34;;43446:15;;43441:2;43426:18;;43419:43;43356:3;43493:2;43478:18;;43471:31;;;43319:4;;43525:57;;43562:19;;43554:6;43525:57;:::i;:::-;43630:9;43622:6;43618:22;43613:2;43602:9;43598:18;43591:50;43664:44;43701:6;43693;43664:44;:::i;:::-;43650:58;;43757:9;43749:6;43745:22;43739:3;43728:9;43724:19;43717:51;43785:33;43811:6;43803;43785:33;:::i;:::-;43777:41;42997:827;-1:-1:-1;;;;;;;;42997:827:1:o

Swarm Source

ipfs://a1219e0f0fbe4e6bb26d0126744724fd0f5be0f1bc1d7106164ac9a47d725f30
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.