ETH Price: $3,057.26 (-7.46%)
Gas: 18 Gwei

Token

Multivaria ()
 

Overview

Max Total Supply

0

Holders

96

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
0x403d8A3A7347302ff51a244a7c02676A0031F302
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:
Multivaria

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 13 of 15: Multivaria.sol
// SPDX-License-Identifier: MIT

pragma solidity >= 0.8.13;

import "./ERC1155.sol";
import "./IEIP2981.sol";
import "./AdminControl.sol";
import "./Strings.sol";

contract Multivaria is ERC1155, AdminControl {
    
    address payable  private _royalties_recipient;
    mapping (uint256 => uint256) _tokenMaxSupply;
    mapping (uint256 => uint256) _tokenTier;
    uint256 public _editionsLeft = 200;
    uint256 private _royaltyAmount; //in % 
    uint256 [10] _ubs;
    string public _name = "Multivaria";
    string _uri;
    bool public _shiftActivated;
    bool public _advancedCardShifted;       

    
    constructor () ERC1155("") {
        _royalties_recipient = payable(msg.sender);
        _royaltyAmount = 10;
        _ubs = [2,5,10,20,35,55,80,110,150,200];
    } 

    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override(ERC1155, AdminControl)
        returns (bool)
    {
        return
        AdminControl.supportsInterface(interfaceId) ||
        ERC1155.supportsInterface(interfaceId) ||
        interfaceId == type(IEIP2981).interfaceId ||
        super.supportsInterface(interfaceId);
    }

    function name() public view returns (string memory) {
        return _name;
    }

    function getPseudoRndTier() public returns (uint256){    
        bool tierFound = false;
        uint [10] memory  ubs = _ubs;
        uint256 tier=0;
        uint256 editionsLeft = _editionsLeft;
        uint256 rnd = uint256(keccak256(abi.encodePacked(block.timestamp, msg.sender))) % editionsLeft;
        
        for(uint256 i=0; i<= ubs.length-1; i++){
            if(rnd < ubs[i] && tier == 0){
                tierFound = true;
                tier = i+2;
            }
            if(tierFound){
                ubs[i]--;
            }
        }
        editionsLeft--;
        _ubs = ubs;
        _editionsLeft = editionsLeft;
        return tier;   
    }

    function mint( 
        address to,
        uint256 id,
        uint256 amount
    ) external adminRequired{
        _mint(to, id, amount, "0x0");
    }

    function mintBatch(
        address to,
        uint256[] memory ids,
        uint256[] memory amounts
    )external adminRequired{
        _mintBatch(to, ids, amounts, "0x0");
    }

    function toggleShiftActivated()external adminRequired{
        _shiftActivated = !_shiftActivated;
    }

    function adminShift(uint256 multivariaId, uint256 shiftCardId, uint256 shiftedTier) external adminRequired{
        require(multivariaId <= 12 && multivariaId > 1, "Incorrect MultivariaId");
        require(shiftCardId == 13, "Incorrect ShiftCardId");
        require(shiftedTier < 12 , "Incorrect shiftedTier");

        _burn(msg.sender, multivariaId, 1);
        _burn(msg.sender, shiftCardId, 1);
        _mint(msg.sender, shiftedTier, 1, "0x0");
    }

    function shift() external {
        require(_shiftActivated, "Shift disabled");
        require(ERC1155.balanceOf(msg.sender, 12)>=1,"Multivaria Tier 12 missing for the shift");
        require(ERC1155.balanceOf(msg.sender, 13)>=1,"Shift card missing for the shift");

        uint256 shiftedTier = getPseudoRndTier();
        _burn(msg.sender, 12, 1);
        _burn(msg.sender, 13, 1);
        _mint(msg.sender, shiftedTier, 1, "0x0");
    }

    function uniqueShift(uint256 multivariaId) external {
        require(_shiftActivated, "Shift disabled");
        require(multivariaId <= 12 && multivariaId >=2, "A Multivaria Tier 2 needs to be burnt for this shift");
        require(ERC1155.balanceOf(msg.sender, multivariaId) >= 1,"Multivaria missing for the shift");
        require(ERC1155.balanceOf(msg.sender, 1) >= 1,"Advanced Shift card missing for the shift");
        _advancedCardShifted = true;
        _burn(msg.sender, multivariaId, 1);
        // Need to iterate on the token 1
    }

    function setURI(
        string calldata updatedURI
    ) external adminRequired{
        _uri = updatedURI;
    }

    function uri(uint256 tokenId) public view virtual override returns (string memory) {
        if(tokenId == 1 && !_advancedCardShifted){
            return string(abi.encodePacked(_uri, Strings.toString(14), ".json"));
        }
        return string(abi.encodePacked(_uri, Strings.toString(tokenId), ".json"));
    }

    function burn(uint256 tokenId, uint256 quantity) public {
        _burn(msg.sender, tokenId, quantity);
    }

    function burnBatch(
        uint256[] memory ids,
        uint256[] memory amounts
    )external{
        _burnBatch(msg.sender, ids, amounts);
    }

    function setRoyalties(address payable _recipient, uint256 _royaltyPerCent) external adminRequired {
        _royalties_recipient = _recipient;
        _royaltyAmount = _royaltyPerCent;
    }

    function royaltyInfo(uint256 salePrice) external view returns (address, uint256) {
        if(_royalties_recipient != address(0)){
            return (_royalties_recipient, (salePrice * _royaltyAmount) / 100 );
        }
        return (address(0), 0);
    }

    function withdraw(address recipient) external adminRequired {
        payable(recipient).transfer(address(this).balance);
    }

}

File 1 of 15: Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.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 functionCall(target, data, "Address: low-level call failed");
    }

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

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

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

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason 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 {
            // 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 2 of 15: AdminControl.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/// @author: manifold.xyz

import "./ERC165.sol";
import "./EnumerableSet.sol";
import "./Ownable.sol";
import "./IAdminControl.sol";

abstract contract AdminControl is Ownable, IAdminControl, ERC165 {
    using EnumerableSet for EnumerableSet.AddressSet;

    // Track registered admins
    EnumerableSet.AddressSet private _admins;

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

    /**
     * @dev Only allows approved admins to call the specified function
     */
    modifier adminRequired() {
        require(owner() == msg.sender || _admins.contains(msg.sender), "AdminControl: Must be owner or admin");
        _;
    }   

    /**
     * @dev See {IAdminControl-getAdmins}.
     */
    function getAdmins() external view override returns (address[] memory admins) {
        admins = new address[](_admins.length());
        for (uint i = 0; i < _admins.length(); i++) {
            admins[i] = _admins.at(i);
        }
        return admins;
    }

    /**
     * @dev See {IAdminControl-approveAdmin}.
     */
    function approveAdmin(address admin) external override onlyOwner {
        if (!_admins.contains(admin)) {
            emit AdminApproved(admin, msg.sender);
            _admins.add(admin);
        }
    }

    /**
     * @dev See {IAdminControl-revokeAdmin}.
     */
    function revokeAdmin(address admin) external override onlyOwner {
        if (_admins.contains(admin)) {
            emit AdminRevoked(admin, msg.sender);
            _admins.remove(admin);
        }
    }

    /**
     * @dev See {IAdminControl-isAdmin}.
     */
    function isAdmin(address admin) public override view returns (bool) {
        return (owner() == admin || _admins.contains(admin));
    }

}

File 3 of 15: Context.sol
// 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 4 of 15: EnumerableSet.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/structs/EnumerableSet.sol)

pragma solidity ^0.8.0;

/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
 * and `uint256` (`UintSet`) are supported.
 *
 * [WARNING]
 * ====
 *  Trying to delete such a structure from storage will likely result in data corruption, rendering the structure unusable.
 *  See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info.
 *
 *  In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an array of EnumerableSet.
 * ====
 */
library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;
        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping(bytes32 => uint256) _indexes;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) {
            // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            if (lastIndex != toDeleteIndex) {
                bytes32 lastValue = set._values[lastIndex];

                // Move the last value to the index where the value to delete is
                set._values[toDeleteIndex] = lastValue;
                // Update the index for the moved value
                set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex
            }

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        return set._values[index];
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function _values(Set storage set) private view returns (bytes32[] memory) {
        return set._values;
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {
        return _values(set._inner);
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(AddressSet storage set) internal view returns (address[] memory) {
        bytes32[] memory store = _values(set._inner);
        address[] memory result;

        /// @solidity memory-safe-assembly
        assembly {
            result := store
        }

        return result;
    }

    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(UintSet storage set) internal view returns (uint256[] memory) {
        bytes32[] memory store = _values(set._inner);
        uint256[] memory result;

        /// @solidity memory-safe-assembly
        assembly {
            result := store
        }

        return result;
    }
}

File 5 of 15: ERC1155.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/ERC1155.sol)

pragma solidity ^0.8.0;

import "./IERC1155.sol";
import "./IERC1155Receiver.sol";
import "./IERC1155MetadataURI.sol";
import "./Address.sol";
import "./Context.sol";
import "./ERC165.sol";

/**
 * @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)) private _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 nor 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 nor 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 6 of 15: ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @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 7 of 15: IAdminControl.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/// @author: manifold.xyz

import "./IERC165.sol";

/**
 * @dev Interface for admin control
 */
interface IAdminControl is IERC165 {

    event AdminApproved(address indexed account, address indexed sender);
    event AdminRevoked(address indexed account, address indexed sender);

    /**
     * @dev gets address of all admins
     */
    function getAdmins() external view returns (address[] memory);

    /**
     * @dev add an admin.  Can only be called by contract owner.
     */
    function approveAdmin(address admin) external;

    /**
     * @dev remove an admin.  Can only be called by contract owner.
     */
    function revokeAdmin(address admin) external;

    /**
     * @dev checks whether or not given address is an admin
     * Returns True if they are
     */
    function isAdmin(address admin) external view returns (bool);

}

File 8 of 15: IEIP2981.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * EIP-2981
 */
interface IEIP2981 {
    /**
     * bytes4(keccak256("royaltyInfo(uint256,uint256)")) == 0x2a55205a
     *
     * => 0x2a55205a = 0x2a55205a
     */
    function royaltyInfo(uint256 tokenId, uint256 value) external view returns (address, uint256);
}

File 9 of 15: IERC1155.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/IERC1155.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @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 10 of 15: IERC1155MetadataURI.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol)

pragma solidity ^0.8.0;

import "./IERC1155.sol";

/**
 * @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 11 of 15: IERC1155Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @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 12 of 15: IERC165.sol
// SPDX-License-Identifier: MIT
// 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 14 of 15: Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

import "./Context.sol";

/**
 * @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 15 of 15: Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_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) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

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

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

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

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"AdminApproved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"AdminRevoked","type":"event"},{"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":"_advancedCardShifted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_editionsLeft","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_shiftActivated","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"multivariaId","type":"uint256"},{"internalType":"uint256","name":"shiftCardId","type":"uint256"},{"internalType":"uint256","name":"shiftedTier","type":"uint256"}],"name":"adminShift","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"name":"approveAdmin","outputs":[],"stateMutability":"nonpayable","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":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"burnBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getAdmins","outputs":[{"internalType":"address[]","name":"admins","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPseudoRndTier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"name":"isAdmin","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":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"mintBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"name":"revokeAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"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":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_royaltyPerCent","type":"uint256"}],"name":"setRoyalties","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"updatedURI","type":"string"}],"name":"setURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"shift","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":"toggleShiftActivated","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"multivariaId","type":"uint256"}],"name":"uniqueShift","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":[{"internalType":"address","name":"recipient","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c860095560c0604052600a6080908152694d756c7469766172696160b01b60a05260159062000030908262000247565b503480156200003e57600080fd5b506040805160208101909152600081526200005933620000e1565b620000648162000131565b50600680546001600160a01b03191633179055600a808055604080516101408101825260028152600560208201529081018290526014606082015260236080820152603760a0820152605060c0820152606e60e0820152609661010082015260c8610120820152620000da91600b919062000143565b5062000313565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60036200013f828262000247565b5050565b82600a810192821562000179579160200282015b8281111562000179578251829060ff1690559160200191906001019062000157565b50620001879291506200018b565b5090565b5b808211156200018757600081556001016200018c565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620001cd57607f821691505b602082108103620001ee57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200024257600081815260208120601f850160051c810160208610156200021d5750805b601f850160051c820191505b818110156200023e5782815560010162000229565b5050505b505050565b81516001600160401b03811115620002635762000263620001a2565b6200027b81620002748454620001b8565b84620001f4565b602080601f831160018114620002b357600084156200029a5750858301515b600019600386901b1c1916600185901b1785556200023e565b600085815260208120601f198616915b82811015620002e457888601518255948401946001909101908401620002c3565b5085821015620003035787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b61309e80620003236000396000f3fe608060405234801561001057600080fd5b50600436106101fa5760003560e01c80636e1c209a1161011a578063a22cb465116100ad578063d6a09c761161007c578063d6a09c7614610433578063d81d0a151461043b578063e985e9c51461044e578063f242432a1461048a578063f2fde38b1461049d57600080fd5b8063a22cb465146103d3578063b390c0ab146103e6578063cef6d368146103f9578063d28d88521461042b57600080fd5b80638c7ea24b116100e95780638c7ea24b146103865780638da5cb5b1461039957806399fbb93d146103b45780639c8c8466146103c657600080fd5b80636e1c209a1461034f578063715018a6146103625780637b021e221461036a57806383ca4b6f1461037357600080fd5b80632d345670116101925780634e1273f4116101615780634e1273f41461030157806351cff8d91461032157806356e7e7eb146103345780636d73e6691461033c57600080fd5b80632d345670146102b35780632eb2c2d6146102c657806331ae450b146102d95780633923047d146102ee57600080fd5b80630e89341c116101ce5780630e89341c1461027257806312fc41ca14610285578063156e29f61461028d57806324d7806c146102a057600080fd5b8062fdd58e146101ff57806301ffc9a71461022557806302fe53051461024857806306fdde031461025d575b600080fd5b61021261020d3660046122ba565b6104b0565b6040519081526020015b60405180910390f35b6102386102333660046122fc565b61054b565b604051901515815260200161021c565b61025b610256366004612319565b61058f565b005b6102656105eb565b60405161021c91906123da565b6102656102803660046123ed565b61067d565b61025b6106da565b61025b61029b366004612406565b610835565b6102386102ae36600461243b565b6108a6565b61025b6102c136600461243b565b6108df565b61025b6102d43660046125a1565b61093c565b6102e1610988565b60405161021c919061264e565b61025b6102fc36600461269b565b610a36565b61031461030f3660046126c7565b610ba6565b60405161021c91906127ce565b61025b61032f36600461243b565b610ccf565b61025b610d4e565b61025b61034a36600461243b565b610dac565b61025b61035d3660046123ed565b610e04565b61025b610fa4565b61021260095481565b61025b6103813660046127e1565b610fb8565b61025b6103943660046122ba565b610fc3565b6000546040516001600160a01b03909116815260200161021c565b60175461023890610100900460ff1681565b6017546102389060ff1681565b61025b6103e136600461282d565b611033565b61025b6103f436600461286b565b61103e565b61040c6104073660046123ed565b611049565b604080516001600160a01b03909316835260208301919091520161021c565b61026561109c565b61021261112a565b61025b61044936600461288d565b611274565b61023861045c366004612902565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205460ff1690565b61025b610498366004612930565b6112e5565b61025b6104ab36600461243b565b61132a565b60006001600160a01b0383166105205760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201526930b634b21037bbb732b960b11b60648201526084015b60405180910390fd5b5060008181526001602090815260408083206001600160a01b03861684529091529020545b92915050565b6000610556826113a0565b806105655750610565826113c1565b8061058057506001600160e01b0319821663152a902d60e11b145b806105455750610545826113a0565b336105a26000546001600160a01b031690565b6001600160a01b031614806105bd57506105bd600433611411565b6105d95760405162461bcd60e51b815260040161051790612998565b60166105e6828483612a5c565b505050565b6060601580546105fa906129dc565b80601f0160208091040260200160405190810160405280929190818152602001828054610626906129dc565b80156106735780601f1061064857610100808354040283529160200191610673565b820191906000526020600020905b81548152906001019060200180831161065657829003601f168201915b5050505050905090565b60608160011480156106975750601754610100900460ff16155b156106cf5760166106a8600e611436565b6040516020016106b9929190612b1b565b6040516020818303038152906040529050919050565b60166106a883611436565b60175460ff1661071d5760405162461bcd60e51b815260206004820152600e60248201526d14da1a599d08191a5cd8589b195960921b6044820152606401610517565b600161072a33600c6104b0565b10156107895760405162461bcd60e51b815260206004820152602860248201527f4d756c746976617269612054696572203132206d697373696e6720666f7220746044820152671a19481cda1a599d60c21b6064820152608401610517565b600161079633600d6104b0565b10156107e45760405162461bcd60e51b815260206004820181905260248201527f53686966742063617264206d697373696e6720666f72207468652073686966746044820152606401610517565b60006107ee61112a565b90506107fd33600c600161153e565b61080a33600d600161153e565b610832338260016040518060400160405280600381526020016203078360ec1b81525061164a565b50565b336108486000546001600160a01b031690565b6001600160a01b031614806108635750610863600433611411565b61087f5760405162461bcd60e51b815260040161051790612998565b6105e68383836040518060400160405280600381526020016203078360ec1b81525061164a565b6000816001600160a01b03166108c46000546001600160a01b031690565b6001600160a01b031614806105455750610545600483611411565b6108e761171d565b6108f2600482611411565b156108325760405133906001600160a01b038316907f7c0c3c84c67c85fcac635147348bfe374c24a1a93d0366d1cfe9d8853cbf89d590600090a3610938600482611777565b5050565b6001600160a01b0385163314806109585750610958853361045c565b6109745760405162461bcd60e51b815260040161051790612bb2565b610981858585858561178c565b5050505050565b6060610994600461192b565b6001600160401b038111156109ab576109ab612458565b6040519080825280602002602001820160405280156109d4578160200160208202803683370190505b50905060005b6109e4600461192b565b811015610a32576109f6600482611935565b828281518110610a0857610a08612c01565b6001600160a01b039092166020928302919091019091015280610a2a81612c2d565b9150506109da565b5090565b33610a496000546001600160a01b031690565b6001600160a01b03161480610a645750610a64600433611411565b610a805760405162461bcd60e51b815260040161051790612998565b600c8311158015610a915750600183115b610ad65760405162461bcd60e51b8152602060048201526016602482015275125b98dbdc9c9958dd08135d5b1d1a5d985c9a58525960521b6044820152606401610517565b81600d14610b1e5760405162461bcd60e51b8152602060048201526015602482015274125b98dbdc9c9958dd0814da1a599d10d85c991259605a1b6044820152606401610517565b600c8110610b665760405162461bcd60e51b815260206004820152601560248201527424b731b7b93932b1ba1039b434b33a32b22a34b2b960591b6044820152606401610517565b610b723384600161153e565b610b7e3383600161153e565b6105e6338260016040518060400160405280600381526020016203078360ec1b81525061164a565b60608151835114610c0b5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610517565b600083516001600160401b03811115610c2657610c26612458565b604051908082528060200260200182016040528015610c4f578160200160208202803683370190505b50905060005b8451811015610cc757610c9a858281518110610c7357610c73612c01565b6020026020010151858381518110610c8d57610c8d612c01565b60200260200101516104b0565b828281518110610cac57610cac612c01565b6020908102919091010152610cc081612c2d565b9050610c55565b509392505050565b33610ce26000546001600160a01b031690565b6001600160a01b03161480610cfd5750610cfd600433611411565b610d195760405162461bcd60e51b815260040161051790612998565b6040516001600160a01b038216904780156108fc02916000818181858888f19350505050158015610938573d6000803e3d6000fd5b33610d616000546001600160a01b031690565b6001600160a01b03161480610d7c5750610d7c600433611411565b610d985760405162461bcd60e51b815260040161051790612998565b6017805460ff19811660ff90911615179055565b610db461171d565b610dbf600482611411565b6108325760405133906001600160a01b038316907f7e1a1a08d52e4ba0e21554733d66165fd5151f99460116223d9e3a608eec5cb190600090a3610938600482611941565b60175460ff16610e475760405162461bcd60e51b815260206004820152600e60248201526d14da1a599d08191a5cd8589b195960921b6044820152606401610517565b600c8111158015610e59575060028110155b610ec25760405162461bcd60e51b815260206004820152603460248201527f41204d756c7469766172696120546965722032206e6565647320746f20626520604482015273189d5c9b9d08199bdc881d1a1a5cc81cda1a599d60621b6064820152608401610517565b6001610ece33836104b0565b1015610f1c5760405162461bcd60e51b815260206004820181905260248201527f4d756c74697661726961206d697373696e6720666f72207468652073686966746044820152606401610517565b6001610f293360016104b0565b1015610f895760405162461bcd60e51b815260206004820152602960248201527f416476616e6365642053686966742063617264206d697373696e6720666f72206044820152681d1a19481cda1a599d60ba1b6064820152608401610517565b6017805461ff0019166101001790556108323382600161153e565b610fac61171d565b610fb66000611956565b565b6109383383836119a6565b33610fd66000546001600160a01b031690565b6001600160a01b03161480610ff15750610ff1600433611411565b61100d5760405162461bcd60e51b815260040161051790612998565b600680546001600160a01b0319166001600160a01b039390931692909217909155600a55565b610938338383611b34565b61093833838361153e565b60065460009081906001600160a01b03161561109157600654600a546001600160a01b039091169060649061107e9086612c46565b6110889190612c73565b91509150915091565b506000928392509050565b601580546110a9906129dc565b80601f01602080910402602001604051908101604052809291908181526020018280546110d5906129dc565b80156111225780601f106110f757610100808354040283529160200191611122565b820191906000526020600020905b81548152906001019060200180831161110557829003601f168201915b505050505081565b6040805161014081019182905260009182918291600b90600a9082845b81548152602001906001019080831161114757505050505090506000806009549050600081423360405160200161119a92919091825260601b6bffffffffffffffffffffffff1916602082015260340190565b6040516020818303038152906040528051906020012060001c6111bd9190612c87565b905060005b6111ce6001600a612c9b565b811161124c578481600a81106111e6576111e6612c01565b6020020151821080156111f7575083155b1561120e576001955061120b816002612cae565b93505b851561123a578481600a811061122657611226612c01565b6020020180519061123682612cc1565b9052505b8061124481612c2d565b9150506111c2565b508161125781612cc1565b92506112689050600b85600a61225b565b50506009559392505050565b336112876000546001600160a01b031690565b6001600160a01b031614806112a257506112a2600433611411565b6112be5760405162461bcd60e51b815260040161051790612998565b6105e68383836040518060400160405280600381526020016203078360ec1b815250611c14565b6001600160a01b0385163314806113015750611301853361045c565b61131d5760405162461bcd60e51b815260040161051790612bb2565b6109818585858585611d60565b61133261171d565b6001600160a01b0381166113975760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610517565b61083281611956565b60006001600160e01b03198216632a9f3abf60e11b14806105455750610545825b60006001600160e01b03198216636cdb3d1360e11b14806113f257506001600160e01b031982166303a24d0760e21b145b8061054557506301ffc9a760e01b6001600160e01b0319831614610545565b6001600160a01b038116600090815260018301602052604081205415155b9392505050565b60608160000361145d5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611487578061147181612c2d565b91506114809050600a83612c73565b9150611461565b6000816001600160401b038111156114a1576114a1612458565b6040519080825280601f01601f1916602001820160405280156114cb576020820181803683370190505b5090505b8415611536576114e0600183612c9b565b91506114ed600a86612c87565b6114f8906030612cae565b60f81b81838151811061150d5761150d612c01565b60200101906001600160f81b031916908160001a90535061152f600a86612c73565b94506114cf565b949350505050565b6001600160a01b0383166115645760405162461bcd60e51b815260040161051790612cd8565b33600061157084611e8e565b9050600061157d84611e8e565b6040805160208082018352600091829052888252600181528282206001600160a01b038b16835290522054909150848110156115cb5760405162461bcd60e51b815260040161051790612d1b565b60008681526001602090815260408083206001600160a01b038b81168086529184528285208a8703905582518b81529384018a90529092908816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46040805160208101909152600090525b50505050505050565b6001600160a01b0384166116705760405162461bcd60e51b815260040161051790612d5f565b33600061167c85611e8e565b9050600061168985611e8e565b905060008681526001602090815260408083206001600160a01b038b168452909152812080548792906116bd908490612cae565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a461164183600089898989611ed9565b6000546001600160a01b03163314610fb65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610517565b600061142f836001600160a01b038416612034565b81518351146117ad5760405162461bcd60e51b815260040161051790612da0565b6001600160a01b0384166117d35760405162461bcd60e51b815260040161051790612de8565b3360005b84518110156118bd5760008582815181106117f4576117f4612c01565b60200260200101519050600085838151811061181257611812612c01565b60209081029190910181015160008481526001835260408082206001600160a01b038e1683529093529190912054909150818110156118635760405162461bcd60e51b815260040161051790612e2d565b60008381526001602090815260408083206001600160a01b038e8116855292528083208585039055908b168252812080548492906118a2908490612cae565b92505081905550505050806118b690612c2d565b90506117d7565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161190d929190612e77565b60405180910390a4611923818787878787612127565b505050505050565b6000610545825490565b600061142f83836121e2565b600061142f836001600160a01b03841661220c565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0383166119cc5760405162461bcd60e51b815260040161051790612cd8565b80518251146119ed5760405162461bcd60e51b815260040161051790612da0565b604080516020810190915260009081905233905b8351811015611ac6576000848281518110611a1e57611a1e612c01565b602002602001015190506000848381518110611a3c57611a3c612c01565b60209081029190910181015160008481526001835260408082206001600160a01b038c168352909352919091205490915081811015611a8d5760405162461bcd60e51b815260040161051790612d1b565b60009283526001602090815260408085206001600160a01b038b1686529091529092209103905580611abe81612c2d565b915050611a01565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051611b17929190612e77565b60405180910390a460408051602081019091526000905250505050565b816001600160a01b0316836001600160a01b031603611ba75760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610517565b6001600160a01b03838116600081815260026020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b038416611c3a5760405162461bcd60e51b815260040161051790612d5f565b8151835114611c5b5760405162461bcd60e51b815260040161051790612da0565b3360005b8451811015611cf857838181518110611c7a57611c7a612c01565b602002602001015160016000878481518110611c9857611c98612c01565b602002602001015181526020019081526020016000206000886001600160a01b03166001600160a01b031681526020019081526020016000206000828254611ce09190612cae565b90915550819050611cf081612c2d565b915050611c5f565b50846001600160a01b031660006001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611d49929190612e77565b60405180910390a461098181600087878787612127565b6001600160a01b038416611d865760405162461bcd60e51b815260040161051790612de8565b336000611d9285611e8e565b90506000611d9f85611e8e565b905060008681526001602090815260408083206001600160a01b038c16845290915290205485811015611de45760405162461bcd60e51b815260040161051790612e2d565b60008781526001602090815260408083206001600160a01b038d8116855292528083208985039055908a16825281208054889290611e23908490612cae565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611e83848a8a8a8a8a611ed9565b505050505050505050565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110611ec857611ec8612c01565b602090810291909101015292915050565b6001600160a01b0384163b156119235760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190611f1d9089908990889088908890600401612ea5565b6020604051808303816000875af1925050508015611f58575060408051601f3d908101601f19168201909252611f5591810190612eea565b60015b61200457611f64612f07565b806308c379a003611f9d5750611f78612f23565b80611f835750611f9f565b8060405162461bcd60e51b815260040161051791906123da565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610517565b6001600160e01b0319811663f23a6e6160e01b146116415760405162461bcd60e51b815260040161051790612fac565b6000818152600183016020526040812054801561211d576000612058600183612c9b565b855490915060009061206c90600190612c9b565b90508181146120d157600086600001828154811061208c5761208c612c01565b90600052602060002001549050808760000184815481106120af576120af612c01565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806120e2576120e2612ff4565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610545565b6000915050610545565b6001600160a01b0384163b156119235760405163bc197c8160e01b81526001600160a01b0385169063bc197c819061216b908990899088908890889060040161300a565b6020604051808303816000875af19250505080156121a6575060408051601f3d908101601f191682019092526121a391810190612eea565b60015b6121b257611f64612f07565b6001600160e01b0319811663bc197c8160e01b146116415760405162461bcd60e51b815260040161051790612fac565b60008260000182815481106121f9576121f9612c01565b9060005260206000200154905092915050565b600081815260018301602052604081205461225357508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610545565b506000610545565b82600a8101928215612289579160200282015b8281111561228957825182559160200191906001019061226e565b50610a329291505b80821115610a325760008155600101612291565b6001600160a01b038116811461083257600080fd5b600080604083850312156122cd57600080fd5b82356122d8816122a5565b946020939093013593505050565b6001600160e01b03198116811461083257600080fd5b60006020828403121561230e57600080fd5b813561142f816122e6565b6000806020838503121561232c57600080fd5b82356001600160401b038082111561234357600080fd5b818501915085601f83011261235757600080fd5b81358181111561236657600080fd5b86602082850101111561237857600080fd5b60209290920196919550909350505050565b60005b838110156123a557818101518382015260200161238d565b50506000910152565b600081518084526123c681602086016020860161238a565b601f01601f19169290920160200192915050565b60208152600061142f60208301846123ae565b6000602082840312156123ff57600080fd5b5035919050565b60008060006060848603121561241b57600080fd5b8335612426816122a5565b95602085013595506040909401359392505050565b60006020828403121561244d57600080fd5b813561142f816122a5565b634e487b7160e01b600052604160045260246000fd5b601f8201601f191681016001600160401b038111828210171561249357612493612458565b6040525050565b60006001600160401b038211156124b3576124b3612458565b5060051b60200190565b600082601f8301126124ce57600080fd5b813560206124db8261249a565b6040516124e8828261246e565b83815260059390931b850182019282810191508684111561250857600080fd5b8286015b84811015612523578035835291830191830161250c565b509695505050505050565b600082601f83011261253f57600080fd5b81356001600160401b0381111561255857612558612458565b60405161256f601f8301601f19166020018261246e565b81815284602083860101111561258457600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a086880312156125b957600080fd5b85356125c4816122a5565b945060208601356125d4816122a5565b935060408601356001600160401b03808211156125f057600080fd5b6125fc89838a016124bd565b9450606088013591508082111561261257600080fd5b61261e89838a016124bd565b9350608088013591508082111561263457600080fd5b506126418882890161252e565b9150509295509295909350565b6020808252825182820181905260009190848201906040850190845b8181101561268f5783516001600160a01b03168352928401929184019160010161266a565b50909695505050505050565b6000806000606084860312156126b057600080fd5b505081359360208301359350604090920135919050565b600080604083850312156126da57600080fd5b82356001600160401b03808211156126f157600080fd5b818501915085601f83011261270557600080fd5b813560206127128261249a565b60405161271f828261246e565b83815260059390931b850182019282810191508984111561273f57600080fd5b948201945b83861015612766578535612757816122a5565b82529482019490820190612744565b9650508601359250508082111561277c57600080fd5b50612789858286016124bd565b9150509250929050565b600081518084526020808501945080840160005b838110156127c3578151875295820195908201906001016127a7565b509495945050505050565b60208152600061142f6020830184612793565b600080604083850312156127f457600080fd5b82356001600160401b038082111561280b57600080fd5b612817868387016124bd565b9350602085013591508082111561277c57600080fd5b6000806040838503121561284057600080fd5b823561284b816122a5565b91506020830135801515811461286057600080fd5b809150509250929050565b6000806040838503121561287e57600080fd5b50508035926020909101359150565b6000806000606084860312156128a257600080fd5b83356128ad816122a5565b925060208401356001600160401b03808211156128c957600080fd5b6128d5878388016124bd565b935060408601359150808211156128eb57600080fd5b506128f8868287016124bd565b9150509250925092565b6000806040838503121561291557600080fd5b8235612920816122a5565b91506020830135612860816122a5565b600080600080600060a0868803121561294857600080fd5b8535612953816122a5565b94506020860135612963816122a5565b9350604086013592506060860135915060808601356001600160401b0381111561298c57600080fd5b6126418882890161252e565b60208082526024908201527f41646d696e436f6e74726f6c3a204d757374206265206f776e6572206f7220616040820152633236b4b760e11b606082015260800190565b600181811c908216806129f057607f821691505b602082108103612a1057634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156105e657600081815260208120601f850160051c81016020861015612a3d5750805b601f850160051c820191505b8181101561192357828155600101612a49565b6001600160401b03831115612a7357612a73612458565b612a8783612a8183546129dc565b83612a16565b6000601f841160018114612abb5760008515612aa35750838201355b600019600387901b1c1916600186901b178355610981565b600083815260209020601f19861690835b82811015612aec5786850135825560209485019460019092019101612acc565b5086821015612b095760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b6000808454612b29816129dc565b60018281168015612b415760018114612b5657612b85565b60ff1984168752821515830287019450612b85565b8860005260208060002060005b85811015612b7c5781548a820152908401908201612b63565b50505082870194505b505050508351612b9981836020880161238a565b64173539b7b760d91b9101908152600501949350505050565b6020808252602f908201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60408201526e195c881b9bdc88185c1c1c9bdd9959608a1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201612c3f57612c3f612c17565b5060010190565b808202811582820484141761054557610545612c17565b634e487b7160e01b600052601260045260246000fd5b600082612c8257612c82612c5d565b500490565b600082612c9657612c96612c5d565b500690565b8181038181111561054557610545612c17565b8082018082111561054557610545612c17565b600081612cd057612cd0612c17565b506000190190565b60208082526023908201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526024908201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604082015263616e636560e01b606082015260800190565b60208082526021908201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736040820152607360f81b606082015260800190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b604081526000612e8a6040830185612793565b8281036020840152612e9c8185612793565b95945050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090612edf908301846123ae565b979650505050505050565b600060208284031215612efc57600080fd5b815161142f816122e6565b600060033d1115612f205760046000803e5060005160e01c5b90565b600060443d1015612f315790565b6040516003193d81016004833e81513d6001600160401b038160248401118184111715612f6057505050505090565b8285019150815181811115612f785750505050505090565b843d8701016020828501011115612f925750505050505090565b612fa16020828601018761246e565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b634e487b7160e01b600052603160045260246000fd5b6001600160a01b0386811682528516602082015260a06040820181905260009061303690830186612793565b82810360608401526130488186612793565b9050828103608084015261305c81856123ae565b9897505050505050505056fea264697066735822122079bd8ab5d039312969fc1fea0021e137c5a6ee3bd75d0d62ec9b1ea7643ab1bd64736f6c63430008110033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101fa5760003560e01c80636e1c209a1161011a578063a22cb465116100ad578063d6a09c761161007c578063d6a09c7614610433578063d81d0a151461043b578063e985e9c51461044e578063f242432a1461048a578063f2fde38b1461049d57600080fd5b8063a22cb465146103d3578063b390c0ab146103e6578063cef6d368146103f9578063d28d88521461042b57600080fd5b80638c7ea24b116100e95780638c7ea24b146103865780638da5cb5b1461039957806399fbb93d146103b45780639c8c8466146103c657600080fd5b80636e1c209a1461034f578063715018a6146103625780637b021e221461036a57806383ca4b6f1461037357600080fd5b80632d345670116101925780634e1273f4116101615780634e1273f41461030157806351cff8d91461032157806356e7e7eb146103345780636d73e6691461033c57600080fd5b80632d345670146102b35780632eb2c2d6146102c657806331ae450b146102d95780633923047d146102ee57600080fd5b80630e89341c116101ce5780630e89341c1461027257806312fc41ca14610285578063156e29f61461028d57806324d7806c146102a057600080fd5b8062fdd58e146101ff57806301ffc9a71461022557806302fe53051461024857806306fdde031461025d575b600080fd5b61021261020d3660046122ba565b6104b0565b6040519081526020015b60405180910390f35b6102386102333660046122fc565b61054b565b604051901515815260200161021c565b61025b610256366004612319565b61058f565b005b6102656105eb565b60405161021c91906123da565b6102656102803660046123ed565b61067d565b61025b6106da565b61025b61029b366004612406565b610835565b6102386102ae36600461243b565b6108a6565b61025b6102c136600461243b565b6108df565b61025b6102d43660046125a1565b61093c565b6102e1610988565b60405161021c919061264e565b61025b6102fc36600461269b565b610a36565b61031461030f3660046126c7565b610ba6565b60405161021c91906127ce565b61025b61032f36600461243b565b610ccf565b61025b610d4e565b61025b61034a36600461243b565b610dac565b61025b61035d3660046123ed565b610e04565b61025b610fa4565b61021260095481565b61025b6103813660046127e1565b610fb8565b61025b6103943660046122ba565b610fc3565b6000546040516001600160a01b03909116815260200161021c565b60175461023890610100900460ff1681565b6017546102389060ff1681565b61025b6103e136600461282d565b611033565b61025b6103f436600461286b565b61103e565b61040c6104073660046123ed565b611049565b604080516001600160a01b03909316835260208301919091520161021c565b61026561109c565b61021261112a565b61025b61044936600461288d565b611274565b61023861045c366004612902565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205460ff1690565b61025b610498366004612930565b6112e5565b61025b6104ab36600461243b565b61132a565b60006001600160a01b0383166105205760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201526930b634b21037bbb732b960b11b60648201526084015b60405180910390fd5b5060008181526001602090815260408083206001600160a01b03861684529091529020545b92915050565b6000610556826113a0565b806105655750610565826113c1565b8061058057506001600160e01b0319821663152a902d60e11b145b806105455750610545826113a0565b336105a26000546001600160a01b031690565b6001600160a01b031614806105bd57506105bd600433611411565b6105d95760405162461bcd60e51b815260040161051790612998565b60166105e6828483612a5c565b505050565b6060601580546105fa906129dc565b80601f0160208091040260200160405190810160405280929190818152602001828054610626906129dc565b80156106735780601f1061064857610100808354040283529160200191610673565b820191906000526020600020905b81548152906001019060200180831161065657829003601f168201915b5050505050905090565b60608160011480156106975750601754610100900460ff16155b156106cf5760166106a8600e611436565b6040516020016106b9929190612b1b565b6040516020818303038152906040529050919050565b60166106a883611436565b60175460ff1661071d5760405162461bcd60e51b815260206004820152600e60248201526d14da1a599d08191a5cd8589b195960921b6044820152606401610517565b600161072a33600c6104b0565b10156107895760405162461bcd60e51b815260206004820152602860248201527f4d756c746976617269612054696572203132206d697373696e6720666f7220746044820152671a19481cda1a599d60c21b6064820152608401610517565b600161079633600d6104b0565b10156107e45760405162461bcd60e51b815260206004820181905260248201527f53686966742063617264206d697373696e6720666f72207468652073686966746044820152606401610517565b60006107ee61112a565b90506107fd33600c600161153e565b61080a33600d600161153e565b610832338260016040518060400160405280600381526020016203078360ec1b81525061164a565b50565b336108486000546001600160a01b031690565b6001600160a01b031614806108635750610863600433611411565b61087f5760405162461bcd60e51b815260040161051790612998565b6105e68383836040518060400160405280600381526020016203078360ec1b81525061164a565b6000816001600160a01b03166108c46000546001600160a01b031690565b6001600160a01b031614806105455750610545600483611411565b6108e761171d565b6108f2600482611411565b156108325760405133906001600160a01b038316907f7c0c3c84c67c85fcac635147348bfe374c24a1a93d0366d1cfe9d8853cbf89d590600090a3610938600482611777565b5050565b6001600160a01b0385163314806109585750610958853361045c565b6109745760405162461bcd60e51b815260040161051790612bb2565b610981858585858561178c565b5050505050565b6060610994600461192b565b6001600160401b038111156109ab576109ab612458565b6040519080825280602002602001820160405280156109d4578160200160208202803683370190505b50905060005b6109e4600461192b565b811015610a32576109f6600482611935565b828281518110610a0857610a08612c01565b6001600160a01b039092166020928302919091019091015280610a2a81612c2d565b9150506109da565b5090565b33610a496000546001600160a01b031690565b6001600160a01b03161480610a645750610a64600433611411565b610a805760405162461bcd60e51b815260040161051790612998565b600c8311158015610a915750600183115b610ad65760405162461bcd60e51b8152602060048201526016602482015275125b98dbdc9c9958dd08135d5b1d1a5d985c9a58525960521b6044820152606401610517565b81600d14610b1e5760405162461bcd60e51b8152602060048201526015602482015274125b98dbdc9c9958dd0814da1a599d10d85c991259605a1b6044820152606401610517565b600c8110610b665760405162461bcd60e51b815260206004820152601560248201527424b731b7b93932b1ba1039b434b33a32b22a34b2b960591b6044820152606401610517565b610b723384600161153e565b610b7e3383600161153e565b6105e6338260016040518060400160405280600381526020016203078360ec1b81525061164a565b60608151835114610c0b5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610517565b600083516001600160401b03811115610c2657610c26612458565b604051908082528060200260200182016040528015610c4f578160200160208202803683370190505b50905060005b8451811015610cc757610c9a858281518110610c7357610c73612c01565b6020026020010151858381518110610c8d57610c8d612c01565b60200260200101516104b0565b828281518110610cac57610cac612c01565b6020908102919091010152610cc081612c2d565b9050610c55565b509392505050565b33610ce26000546001600160a01b031690565b6001600160a01b03161480610cfd5750610cfd600433611411565b610d195760405162461bcd60e51b815260040161051790612998565b6040516001600160a01b038216904780156108fc02916000818181858888f19350505050158015610938573d6000803e3d6000fd5b33610d616000546001600160a01b031690565b6001600160a01b03161480610d7c5750610d7c600433611411565b610d985760405162461bcd60e51b815260040161051790612998565b6017805460ff19811660ff90911615179055565b610db461171d565b610dbf600482611411565b6108325760405133906001600160a01b038316907f7e1a1a08d52e4ba0e21554733d66165fd5151f99460116223d9e3a608eec5cb190600090a3610938600482611941565b60175460ff16610e475760405162461bcd60e51b815260206004820152600e60248201526d14da1a599d08191a5cd8589b195960921b6044820152606401610517565b600c8111158015610e59575060028110155b610ec25760405162461bcd60e51b815260206004820152603460248201527f41204d756c7469766172696120546965722032206e6565647320746f20626520604482015273189d5c9b9d08199bdc881d1a1a5cc81cda1a599d60621b6064820152608401610517565b6001610ece33836104b0565b1015610f1c5760405162461bcd60e51b815260206004820181905260248201527f4d756c74697661726961206d697373696e6720666f72207468652073686966746044820152606401610517565b6001610f293360016104b0565b1015610f895760405162461bcd60e51b815260206004820152602960248201527f416476616e6365642053686966742063617264206d697373696e6720666f72206044820152681d1a19481cda1a599d60ba1b6064820152608401610517565b6017805461ff0019166101001790556108323382600161153e565b610fac61171d565b610fb66000611956565b565b6109383383836119a6565b33610fd66000546001600160a01b031690565b6001600160a01b03161480610ff15750610ff1600433611411565b61100d5760405162461bcd60e51b815260040161051790612998565b600680546001600160a01b0319166001600160a01b039390931692909217909155600a55565b610938338383611b34565b61093833838361153e565b60065460009081906001600160a01b03161561109157600654600a546001600160a01b039091169060649061107e9086612c46565b6110889190612c73565b91509150915091565b506000928392509050565b601580546110a9906129dc565b80601f01602080910402602001604051908101604052809291908181526020018280546110d5906129dc565b80156111225780601f106110f757610100808354040283529160200191611122565b820191906000526020600020905b81548152906001019060200180831161110557829003601f168201915b505050505081565b6040805161014081019182905260009182918291600b90600a9082845b81548152602001906001019080831161114757505050505090506000806009549050600081423360405160200161119a92919091825260601b6bffffffffffffffffffffffff1916602082015260340190565b6040516020818303038152906040528051906020012060001c6111bd9190612c87565b905060005b6111ce6001600a612c9b565b811161124c578481600a81106111e6576111e6612c01565b6020020151821080156111f7575083155b1561120e576001955061120b816002612cae565b93505b851561123a578481600a811061122657611226612c01565b6020020180519061123682612cc1565b9052505b8061124481612c2d565b9150506111c2565b508161125781612cc1565b92506112689050600b85600a61225b565b50506009559392505050565b336112876000546001600160a01b031690565b6001600160a01b031614806112a257506112a2600433611411565b6112be5760405162461bcd60e51b815260040161051790612998565b6105e68383836040518060400160405280600381526020016203078360ec1b815250611c14565b6001600160a01b0385163314806113015750611301853361045c565b61131d5760405162461bcd60e51b815260040161051790612bb2565b6109818585858585611d60565b61133261171d565b6001600160a01b0381166113975760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610517565b61083281611956565b60006001600160e01b03198216632a9f3abf60e11b14806105455750610545825b60006001600160e01b03198216636cdb3d1360e11b14806113f257506001600160e01b031982166303a24d0760e21b145b8061054557506301ffc9a760e01b6001600160e01b0319831614610545565b6001600160a01b038116600090815260018301602052604081205415155b9392505050565b60608160000361145d5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611487578061147181612c2d565b91506114809050600a83612c73565b9150611461565b6000816001600160401b038111156114a1576114a1612458565b6040519080825280601f01601f1916602001820160405280156114cb576020820181803683370190505b5090505b8415611536576114e0600183612c9b565b91506114ed600a86612c87565b6114f8906030612cae565b60f81b81838151811061150d5761150d612c01565b60200101906001600160f81b031916908160001a90535061152f600a86612c73565b94506114cf565b949350505050565b6001600160a01b0383166115645760405162461bcd60e51b815260040161051790612cd8565b33600061157084611e8e565b9050600061157d84611e8e565b6040805160208082018352600091829052888252600181528282206001600160a01b038b16835290522054909150848110156115cb5760405162461bcd60e51b815260040161051790612d1b565b60008681526001602090815260408083206001600160a01b038b81168086529184528285208a8703905582518b81529384018a90529092908816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46040805160208101909152600090525b50505050505050565b6001600160a01b0384166116705760405162461bcd60e51b815260040161051790612d5f565b33600061167c85611e8e565b9050600061168985611e8e565b905060008681526001602090815260408083206001600160a01b038b168452909152812080548792906116bd908490612cae565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a461164183600089898989611ed9565b6000546001600160a01b03163314610fb65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610517565b600061142f836001600160a01b038416612034565b81518351146117ad5760405162461bcd60e51b815260040161051790612da0565b6001600160a01b0384166117d35760405162461bcd60e51b815260040161051790612de8565b3360005b84518110156118bd5760008582815181106117f4576117f4612c01565b60200260200101519050600085838151811061181257611812612c01565b60209081029190910181015160008481526001835260408082206001600160a01b038e1683529093529190912054909150818110156118635760405162461bcd60e51b815260040161051790612e2d565b60008381526001602090815260408083206001600160a01b038e8116855292528083208585039055908b168252812080548492906118a2908490612cae565b92505081905550505050806118b690612c2d565b90506117d7565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161190d929190612e77565b60405180910390a4611923818787878787612127565b505050505050565b6000610545825490565b600061142f83836121e2565b600061142f836001600160a01b03841661220c565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0383166119cc5760405162461bcd60e51b815260040161051790612cd8565b80518251146119ed5760405162461bcd60e51b815260040161051790612da0565b604080516020810190915260009081905233905b8351811015611ac6576000848281518110611a1e57611a1e612c01565b602002602001015190506000848381518110611a3c57611a3c612c01565b60209081029190910181015160008481526001835260408082206001600160a01b038c168352909352919091205490915081811015611a8d5760405162461bcd60e51b815260040161051790612d1b565b60009283526001602090815260408085206001600160a01b038b1686529091529092209103905580611abe81612c2d565b915050611a01565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051611b17929190612e77565b60405180910390a460408051602081019091526000905250505050565b816001600160a01b0316836001600160a01b031603611ba75760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610517565b6001600160a01b03838116600081815260026020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b038416611c3a5760405162461bcd60e51b815260040161051790612d5f565b8151835114611c5b5760405162461bcd60e51b815260040161051790612da0565b3360005b8451811015611cf857838181518110611c7a57611c7a612c01565b602002602001015160016000878481518110611c9857611c98612c01565b602002602001015181526020019081526020016000206000886001600160a01b03166001600160a01b031681526020019081526020016000206000828254611ce09190612cae565b90915550819050611cf081612c2d565b915050611c5f565b50846001600160a01b031660006001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611d49929190612e77565b60405180910390a461098181600087878787612127565b6001600160a01b038416611d865760405162461bcd60e51b815260040161051790612de8565b336000611d9285611e8e565b90506000611d9f85611e8e565b905060008681526001602090815260408083206001600160a01b038c16845290915290205485811015611de45760405162461bcd60e51b815260040161051790612e2d565b60008781526001602090815260408083206001600160a01b038d8116855292528083208985039055908a16825281208054889290611e23908490612cae565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611e83848a8a8a8a8a611ed9565b505050505050505050565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110611ec857611ec8612c01565b602090810291909101015292915050565b6001600160a01b0384163b156119235760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190611f1d9089908990889088908890600401612ea5565b6020604051808303816000875af1925050508015611f58575060408051601f3d908101601f19168201909252611f5591810190612eea565b60015b61200457611f64612f07565b806308c379a003611f9d5750611f78612f23565b80611f835750611f9f565b8060405162461bcd60e51b815260040161051791906123da565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610517565b6001600160e01b0319811663f23a6e6160e01b146116415760405162461bcd60e51b815260040161051790612fac565b6000818152600183016020526040812054801561211d576000612058600183612c9b565b855490915060009061206c90600190612c9b565b90508181146120d157600086600001828154811061208c5761208c612c01565b90600052602060002001549050808760000184815481106120af576120af612c01565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806120e2576120e2612ff4565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610545565b6000915050610545565b6001600160a01b0384163b156119235760405163bc197c8160e01b81526001600160a01b0385169063bc197c819061216b908990899088908890889060040161300a565b6020604051808303816000875af19250505080156121a6575060408051601f3d908101601f191682019092526121a391810190612eea565b60015b6121b257611f64612f07565b6001600160e01b0319811663bc197c8160e01b146116415760405162461bcd60e51b815260040161051790612fac565b60008260000182815481106121f9576121f9612c01565b9060005260206000200154905092915050565b600081815260018301602052604081205461225357508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610545565b506000610545565b82600a8101928215612289579160200282015b8281111561228957825182559160200191906001019061226e565b50610a329291505b80821115610a325760008155600101612291565b6001600160a01b038116811461083257600080fd5b600080604083850312156122cd57600080fd5b82356122d8816122a5565b946020939093013593505050565b6001600160e01b03198116811461083257600080fd5b60006020828403121561230e57600080fd5b813561142f816122e6565b6000806020838503121561232c57600080fd5b82356001600160401b038082111561234357600080fd5b818501915085601f83011261235757600080fd5b81358181111561236657600080fd5b86602082850101111561237857600080fd5b60209290920196919550909350505050565b60005b838110156123a557818101518382015260200161238d565b50506000910152565b600081518084526123c681602086016020860161238a565b601f01601f19169290920160200192915050565b60208152600061142f60208301846123ae565b6000602082840312156123ff57600080fd5b5035919050565b60008060006060848603121561241b57600080fd5b8335612426816122a5565b95602085013595506040909401359392505050565b60006020828403121561244d57600080fd5b813561142f816122a5565b634e487b7160e01b600052604160045260246000fd5b601f8201601f191681016001600160401b038111828210171561249357612493612458565b6040525050565b60006001600160401b038211156124b3576124b3612458565b5060051b60200190565b600082601f8301126124ce57600080fd5b813560206124db8261249a565b6040516124e8828261246e565b83815260059390931b850182019282810191508684111561250857600080fd5b8286015b84811015612523578035835291830191830161250c565b509695505050505050565b600082601f83011261253f57600080fd5b81356001600160401b0381111561255857612558612458565b60405161256f601f8301601f19166020018261246e565b81815284602083860101111561258457600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a086880312156125b957600080fd5b85356125c4816122a5565b945060208601356125d4816122a5565b935060408601356001600160401b03808211156125f057600080fd5b6125fc89838a016124bd565b9450606088013591508082111561261257600080fd5b61261e89838a016124bd565b9350608088013591508082111561263457600080fd5b506126418882890161252e565b9150509295509295909350565b6020808252825182820181905260009190848201906040850190845b8181101561268f5783516001600160a01b03168352928401929184019160010161266a565b50909695505050505050565b6000806000606084860312156126b057600080fd5b505081359360208301359350604090920135919050565b600080604083850312156126da57600080fd5b82356001600160401b03808211156126f157600080fd5b818501915085601f83011261270557600080fd5b813560206127128261249a565b60405161271f828261246e565b83815260059390931b850182019282810191508984111561273f57600080fd5b948201945b83861015612766578535612757816122a5565b82529482019490820190612744565b9650508601359250508082111561277c57600080fd5b50612789858286016124bd565b9150509250929050565b600081518084526020808501945080840160005b838110156127c3578151875295820195908201906001016127a7565b509495945050505050565b60208152600061142f6020830184612793565b600080604083850312156127f457600080fd5b82356001600160401b038082111561280b57600080fd5b612817868387016124bd565b9350602085013591508082111561277c57600080fd5b6000806040838503121561284057600080fd5b823561284b816122a5565b91506020830135801515811461286057600080fd5b809150509250929050565b6000806040838503121561287e57600080fd5b50508035926020909101359150565b6000806000606084860312156128a257600080fd5b83356128ad816122a5565b925060208401356001600160401b03808211156128c957600080fd5b6128d5878388016124bd565b935060408601359150808211156128eb57600080fd5b506128f8868287016124bd565b9150509250925092565b6000806040838503121561291557600080fd5b8235612920816122a5565b91506020830135612860816122a5565b600080600080600060a0868803121561294857600080fd5b8535612953816122a5565b94506020860135612963816122a5565b9350604086013592506060860135915060808601356001600160401b0381111561298c57600080fd5b6126418882890161252e565b60208082526024908201527f41646d696e436f6e74726f6c3a204d757374206265206f776e6572206f7220616040820152633236b4b760e11b606082015260800190565b600181811c908216806129f057607f821691505b602082108103612a1057634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156105e657600081815260208120601f850160051c81016020861015612a3d5750805b601f850160051c820191505b8181101561192357828155600101612a49565b6001600160401b03831115612a7357612a73612458565b612a8783612a8183546129dc565b83612a16565b6000601f841160018114612abb5760008515612aa35750838201355b600019600387901b1c1916600186901b178355610981565b600083815260209020601f19861690835b82811015612aec5786850135825560209485019460019092019101612acc565b5086821015612b095760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b6000808454612b29816129dc565b60018281168015612b415760018114612b5657612b85565b60ff1984168752821515830287019450612b85565b8860005260208060002060005b85811015612b7c5781548a820152908401908201612b63565b50505082870194505b505050508351612b9981836020880161238a565b64173539b7b760d91b9101908152600501949350505050565b6020808252602f908201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60408201526e195c881b9bdc88185c1c1c9bdd9959608a1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201612c3f57612c3f612c17565b5060010190565b808202811582820484141761054557610545612c17565b634e487b7160e01b600052601260045260246000fd5b600082612c8257612c82612c5d565b500490565b600082612c9657612c96612c5d565b500690565b8181038181111561054557610545612c17565b8082018082111561054557610545612c17565b600081612cd057612cd0612c17565b506000190190565b60208082526023908201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526024908201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604082015263616e636560e01b606082015260800190565b60208082526021908201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736040820152607360f81b606082015260800190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b604081526000612e8a6040830185612793565b8281036020840152612e9c8185612793565b95945050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090612edf908301846123ae565b979650505050505050565b600060208284031215612efc57600080fd5b815161142f816122e6565b600060033d1115612f205760046000803e5060005160e01c5b90565b600060443d1015612f315790565b6040516003193d81016004833e81513d6001600160401b038160248401118184111715612f6057505050505090565b8285019150815181811115612f785750505050505090565b843d8701016020828501011115612f925750505050505090565b612fa16020828601018761246e565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b634e487b7160e01b600052603160045260246000fd5b6001600160a01b0386811682528516602082015260a06040820181905260009061303690830186612793565b82810360608401526130488186612793565b9050828103608084015261305c81856123ae565b9897505050505050505056fea264697066735822122079bd8ab5d039312969fc1fea0021e137c5a6ee3bd75d0d62ec9b1ea7643ab1bd64736f6c63430008110033

Deployed Bytecode Sourcemap

164:4994:12:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2130:227:3;;;;;;:::i;:::-;;:::i;:::-;;;616:25:15;;;604:2;589:18;2130:227:3;;;;;;;;785:384:12;;;;;;:::i;:::-;;:::i;:::-;;;1203:14:15;;1196:22;1178:41;;1166:2;1151:18;785:384:12;1038:187:15;3856:114:12;;;;;;:::i;:::-;;:::i;:::-;;1175:81;;;:::i;:::-;;;;;;;:::i;3976:316::-;;;;;;:::i;:::-;;:::i;2853:442::-;;;:::i;1935:152::-;;;;;;:::i;:::-;;:::i;1873:137:1:-;;;;;;:::i;:::-;;:::i;1605:205::-;;;;;;:::i;:::-;;:::i;4010:427:3:-;;;;;;:::i;:::-;;:::i;1004:261:1:-;;;:::i;:::-;;;;;;;:::i;2391:456:12:-;;;;;;:::i;:::-;;:::i;2514:508:3:-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;5028:127:12:-;;;;;;:::i;:::-;;:::i;2281:104::-;;;:::i;1333:205:1:-;;;;;;:::i;:::-;;:::i;3301:549:12:-;;;;;;:::i;:::-;;:::i;1824:101:13:-;;;:::i;366:34:12:-;;;;;;4413:149;;;;;;:::i;:::-;;:::i;4568:190::-;;;;;;:::i;:::-;;:::i;1194:85:13:-;1240:7;1266:6;1194:85;;-1:-1:-1;;;;;1266:6:13;;;10393:51:15;;10381:2;10366:18;1194:85:13;10247:203:15;563:32:12;;;;;;;;;;;;530:27;;;;;;;;;3090:153:3;;;;;;:::i;:::-;;:::i;4298:109:12:-;;;;;;:::i;:::-;;:::i;4764:258::-;;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;11321:32:15;;;11303:51;;11385:2;11370:18;;11363:34;;;;11276:18;4764:258:12;11129:274:15;473:34:12;;;:::i;1262:667::-;;;:::i;2093:182::-;;;;;;:::i;:::-;;:::i;3310:166:3:-;;;;;;:::i;:::-;-1:-1:-1;;;;;3432:27:3;;;3409:4;3432:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;3310:166;3543:395;;;;;;:::i;:::-;;:::i;2074:198:13:-;;;;;;:::i;:::-;;:::i;2130:227:3:-;2216:7;-1:-1:-1;;;;;2243:21:3;;2235:76;;;;-1:-1:-1;;;2235:76:3;;13477:2:15;2235:76:3;;;13459:21:15;13516:2;13496:18;;;13489:30;13555:34;13535:18;;;13528:62;-1:-1:-1;;;13606:18:15;;;13599:40;13656:19;;2235:76:3;;;;;;;;;-1:-1:-1;2328:13:3;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;2328:22:3;;;;;;;;;;2130:227;;;;;:::o;785:384:12:-;933:4;968:43;999:11;968:30;:43::i;:::-;:93;;;;1023:38;1049:11;1023:25;:38::i;:::-;968:146;;;-1:-1:-1;;;;;;;1073:41:12;;-1:-1:-1;;;1073:41:12;968:146;:194;;;;1126:36;1150:11;1126:23;:36::i;3856:114::-;835:10:1;824:7;1240::13;1266:6;-1:-1:-1;;;;;1266:6:13;;1194:85;824:7:1;-1:-1:-1;;;;;824:21:1;;:53;;;-1:-1:-1;849:28:1;:7;866:10;849:16;:28::i;:::-;816:102;;;;-1:-1:-1;;;816:102:1;;;;;;;:::i;:::-;3946:4:12::1;:17;3953:10:::0;;3946:4;:17:::1;:::i;:::-;;3856:114:::0;;:::o;1175:81::-;1212:13;1244:5;1237:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1175:81;:::o;3976:316::-;4044:13;4072:7;4083:1;4072:12;:37;;;;-1:-1:-1;4089:20:12;;;;;;;4088:21;4072:37;4069:134;;;4155:4;4161:20;4178:2;4161:16;:20::i;:::-;4138:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;4124:68;;3976:316;;;:::o;4069:134::-;4243:4;4249:25;4266:7;4249:16;:25::i;2853:442::-;2897:15;;;;2889:42;;;;-1:-1:-1;;;2889:42:12;;17928:2:15;2889:42:12;;;17910:21:15;17967:2;17947:18;;;17940:30;-1:-1:-1;;;17986:18:15;;;17979:44;18040:18;;2889:42:12;17726:338:15;2889:42:12;2984:1;2949:33;2967:10;2979:2;2949:17;:33::i;:::-;:36;;2941:88;;;;-1:-1:-1;;;2941:88:12;;18271:2:15;2941:88:12;;;18253:21:15;18310:2;18290:18;;;18283:30;18349:34;18329:18;;;18322:62;-1:-1:-1;;;18400:18:15;;;18393:38;18448:19;;2941:88:12;18069:404:15;2941:88:12;3082:1;3047:33;3065:10;3077:2;3047:17;:33::i;:::-;:36;;3039:80;;;;-1:-1:-1;;;3039:80:12;;18680:2:15;3039:80:12;;;18662:21:15;;;18699:18;;;18692:30;18758:34;18738:18;;;18731:62;18810:18;;3039:80:12;18478:356:15;3039:80:12;3130:19;3152:18;:16;:18::i;:::-;3130:40;;3180:24;3186:10;3198:2;3202:1;3180:5;:24::i;:::-;3214;3220:10;3232:2;3236:1;3214:5;:24::i;:::-;3248:40;3254:10;3266:11;3279:1;3248:40;;;;;;;;;;;;;-1:-1:-1;;;3248:40:12;;;:5;:40::i;:::-;2879:416;2853:442::o;1935:152::-;835:10:1;824:7;1240::13;1266:6;-1:-1:-1;;;;;1266:6:13;;1194:85;824:7:1;-1:-1:-1;;;;;824:21:1;;:53;;;-1:-1:-1;849:28:1;:7;866:10;849:16;:28::i;:::-;816:102;;;;-1:-1:-1;;;816:102:1;;;;;;;:::i;:::-;2052:28:12::1;2058:2;2062;2066:6;2052:28;;;;;;;;;;;;;-1:-1:-1::0;;;2052:28:12::1;;::::0;:5:::1;:28::i;1873:137:1:-:0;1935:4;1970:5;-1:-1:-1;;;;;1959:16:1;:7;1240::13;1266:6;-1:-1:-1;;;;;1266:6:13;;1194:85;1959:7:1;-1:-1:-1;;;;;1959:16:1;;:43;;;-1:-1:-1;1979:23:1;:7;1996:5;1979:16;:23::i;1605:205::-;1087:13:13;:11;:13::i;:::-;1683:23:1::1;:7;1700:5:::0;1683:16:::1;:23::i;:::-;1679:125;;;1727:31;::::0;1747:10:::1;::::0;-1:-1:-1;;;;;1727:31:1;::::1;::::0;::::1;::::0;;;::::1;1772:21;:7;1787:5:::0;1772:14:::1;:21::i;:::-;;1605:205:::0;:::o;4010:427:3:-;-1:-1:-1;;;;;4235:20:3;;719:10:2;4235:20:3;;:60;;-1:-1:-1;4259:36:3;4276:4;719:10:2;3310:166:3;:::i;4259:36::-;4214:154;;;;-1:-1:-1;;;4214:154:3;;;;;;;:::i;:::-;4378:52;4401:4;4407:2;4411:3;4416:7;4425:4;4378:22;:52::i;:::-;4010:427;;;;;:::o;1004:261:1:-;1057:23;1115:16;:7;:14;:16::i;:::-;-1:-1:-1;;;;;1101:31:1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1101:31:1;;1092:40;;1147:6;1142:94;1163:16;:7;:14;:16::i;:::-;1159:1;:20;1142:94;;;1212:13;:7;1223:1;1212:10;:13::i;:::-;1200:6;1207:1;1200:9;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1200:25:1;;;:9;;;;;;;;;;;:25;1181:3;;;;:::i;:::-;;;;1142:94;;;;1004:261;:::o;2391:456:12:-;835:10:1;824:7;1240::13;1266:6;-1:-1:-1;;;;;1266:6:13;;1194:85;824:7:1;-1:-1:-1;;;;;824:21:1;;:53;;;-1:-1:-1;849:28:1;:7;866:10;849:16;:28::i;:::-;816:102;;;;-1:-1:-1;;;816:102:1;;;;;;;:::i;:::-;2531:2:12::1;2515:12;:18;;:38;;;;;2552:1;2537:12;:16;2515:38;2507:73;;;::::0;-1:-1:-1;;;2507:73:12;;19861:2:15;2507:73:12::1;::::0;::::1;19843:21:15::0;19900:2;19880:18;;;19873:30;-1:-1:-1;;;19919:18:15;;;19912:52;19981:18;;2507:73:12::1;19659:346:15::0;2507:73:12::1;2598:11;2613:2;2598:17;2590:51;;;::::0;-1:-1:-1;;;2590:51:12;;20212:2:15;2590:51:12::1;::::0;::::1;20194:21:15::0;20251:2;20231:18;;;20224:30;-1:-1:-1;;;20270:18:15;;;20263:51;20331:18;;2590:51:12::1;20010:345:15::0;2590:51:12::1;2673:2;2659:11;:16;2651:51;;;::::0;-1:-1:-1;;;2651:51:12;;20562:2:15;2651:51:12::1;::::0;::::1;20544:21:15::0;20601:2;20581:18;;;20574:30;-1:-1:-1;;;20620:18:15;;;20613:51;20681:18;;2651:51:12::1;20360:345:15::0;2651:51:12::1;2713:34;2719:10;2731:12;2745:1;2713:5;:34::i;:::-;2757:33;2763:10;2775:11;2788:1;2757:5;:33::i;:::-;2800:40;2806:10;2818:11;2831:1;2800:40;;;;;;;;;;;;;-1:-1:-1::0;;;2800:40:12::1;;::::0;:5:::1;:40::i;2514:508:3:-:0;2665:16;2724:3;:10;2705:8;:15;:29;2697:83;;;;-1:-1:-1;;;2697:83:3;;20912:2:15;2697:83:3;;;20894:21:15;20951:2;20931:18;;;20924:30;20990:34;20970:18;;;20963:62;-1:-1:-1;;;21041:18:15;;;21034:39;21090:19;;2697:83:3;20710:405:15;2697:83:3;2791:30;2838:8;:15;-1:-1:-1;;;;;2824:30:3;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2824:30:3;;2791:63;;2870:9;2865:120;2889:8;:15;2885:1;:19;2865:120;;;2944:30;2954:8;2963:1;2954:11;;;;;;;;:::i;:::-;;;;;;;2967:3;2971:1;2967:6;;;;;;;;:::i;:::-;;;;;;;2944:9;:30::i;:::-;2925:13;2939:1;2925:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;2906:3;;;:::i;:::-;;;2865:120;;;-1:-1:-1;3002:13:3;2514:508;-1:-1:-1;;;2514:508:3:o;5028:127:12:-;835:10:1;824:7;1240::13;1266:6;-1:-1:-1;;;;;1266:6:13;;1194:85;824:7:1;-1:-1:-1;;;;;824:21:1;;:53;;;-1:-1:-1;849:28:1;:7;866:10;849:16;:28::i;:::-;816:102;;;;-1:-1:-1;;;816:102:1;;;;;;;:::i;:::-;5098:50:12::1;::::0;-1:-1:-1;;;;;5098:27:12;::::1;::::0;5126:21:::1;5098:50:::0;::::1;;;::::0;::::1;::::0;;;5126:21;5098:27;:50;::::1;;;;;;;;;;;;;::::0;::::1;;;;2281:104:::0;835:10:1;824:7;1240::13;1266:6;-1:-1:-1;;;;;1266:6:13;;1194:85;824:7:1;-1:-1:-1;;;;;824:21:1;;:53;;;-1:-1:-1;849:28:1;:7;866:10;849:16;:28::i;:::-;816:102;;;;-1:-1:-1;;;816:102:1;;;;;;;:::i;:::-;2363:15:12::1;::::0;;-1:-1:-1;;2344:34:12;::::1;2363:15;::::0;;::::1;2362:16;2344:34;::::0;;2281:104::o;1333:205:1:-;1087:13:13;:11;:13::i;:::-;1413:23:1::1;:7;1430:5:::0;1413:16:::1;:23::i;:::-;1408:124;;1457:32;::::0;1478:10:::1;::::0;-1:-1:-1;;;;;1457:32:1;::::1;::::0;::::1;::::0;;;::::1;1503:18;:7;1515:5:::0;1503:11:::1;:18::i;3301:549:12:-:0;3371:15;;;;3363:42;;;;-1:-1:-1;;;3363:42:12;;17928:2:15;3363:42:12;;;17910:21:15;17967:2;17947:18;;;17940:30;-1:-1:-1;;;17986:18:15;;;17979:44;18040:18;;3363:42:12;17726:338:15;3363:42:12;3439:2;3423:12;:18;;:38;;;;;3460:1;3445:12;:16;;3423:38;3415:103;;;;-1:-1:-1;;;3415:103:12;;21322:2:15;3415:103:12;;;21304:21:15;21361:2;21341:18;;;21334:30;21400:34;21380:18;;;21373:62;-1:-1:-1;;;21451:18:15;;;21444:50;21511:19;;3415:103:12;21120:416:15;3415:103:12;3583:1;3536:43;3554:10;3566:12;3536:17;:43::i;:::-;:48;;3528:92;;;;-1:-1:-1;;;3528:92:12;;21743:2:15;3528:92:12;;;21725:21:15;;;21762:18;;;21755:30;21821:34;21801:18;;;21794:62;21873:18;;3528:92:12;21541:356:15;3528:92:12;3674:1;3638:32;3656:10;3668:1;3638:17;:32::i;:::-;:37;;3630:90;;;;-1:-1:-1;;;3630:90:12;;22104:2:15;3630:90:12;;;22086:21:15;22143:2;22123:18;;;22116:30;22182:34;22162:18;;;22155:62;-1:-1:-1;;;22233:18:15;;;22226:39;22282:19;;3630:90:12;21902:405:15;3630:90:12;3730:20;:27;;-1:-1:-1;;3730:27:12;;;;;3767:34;3773:10;3785:12;3753:4;3767:5;:34::i;1824:101:13:-;1087:13;:11;:13::i;:::-;1888:30:::1;1915:1;1888:18;:30::i;:::-;1824:101::o:0;4413:149:12:-;4519:36;4530:10;4542:3;4547:7;4519:10;:36::i;4568:190::-;835:10:1;824:7;1240::13;1266:6;-1:-1:-1;;;;;1266:6:13;;1194:85;824:7:1;-1:-1:-1;;;;;824:21:1;;:53;;;-1:-1:-1;849:28:1;:7;866:10;849:16;:28::i;:::-;816:102;;;;-1:-1:-1;;;816:102:1;;;;;;;:::i;:::-;4676:20:12::1;:33:::0;;-1:-1:-1;;;;;;4676:33:12::1;-1:-1:-1::0;;;;;4676:33:12;;;::::1;::::0;;;::::1;::::0;;;4719:14:::1;:32:::0;4568:190::o;3090:153:3:-;3184:52;719:10:2;3217:8:3;3227;3184:18;:52::i;4298:109:12:-;4364:36;4370:10;4382:7;4391:8;4364:5;:36::i;4764:258::-;4858:20;;4827:7;;;;-1:-1:-1;;;;;4858:20:12;:34;4855:129;;4915:20;;4950:14;;-1:-1:-1;;;;;4915:20:12;;;;4968:3;;4938:26;;:9;:26;:::i;:::-;4937:34;;;;:::i;:::-;4907:66;;;;4764:258;;;:::o;4855:129::-;-1:-1:-1;5009:1:12;;;;-1:-1:-1;4764:258:12;-1:-1:-1;4764:258:12:o;473:34::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1262:667::-;1360:28;;;;;;;;;;-1:-1:-1;;;;;;1384:4:12;;1360:28;;1384:4;1360:28;;;;;;;;;;;;;;;;;;;;;;;;1398:12;1422:20;1445:13;;1422:36;;1468:11;1550:12;1517:15;1534:10;1500:45;;;;;;;;22899:19:15;;;22956:2;22952:15;-1:-1:-1;;22948:53:15;22943:2;22934:12;;22927:75;23027:2;23018:12;;22742:294;1500:45:12;;;;;;;;;;;;;1490:56;;;;;;1482:65;;:80;;;;:::i;:::-;1468:94;;1585:9;1581:236;1602:12;1613:1;1602:10;:12;:::i;:::-;1598:1;:16;1581:236;;1643:3;1647:1;1643:6;;;;;;;:::i;:::-;;;;;1637:3;:12;:25;;;;-1:-1:-1;1653:9:12;;1637:25;1634:106;;;1693:4;;-1:-1:-1;1722:3:12;:1;1724;1722:3;:::i;:::-;1715:10;;1634:106;1756:9;1753:54;;;1784:3;1788:1;1784:6;;;;;;;:::i;:::-;;;;:8;;;;;;:::i;:::-;;;-1:-1:-1;1753:54:12;1616:3;;;;:::i;:::-;;;;1581:236;;;-1:-1:-1;1826:14:12;;;;:::i;:::-;;-1:-1:-1;1850:10:12;;-1:-1:-1;1850:4:12;1857:3;1850:10;;:::i;:::-;-1:-1:-1;;1870:13:12;:28;1915:4;1262:667;-1:-1:-1;;;1262:667:12:o;2093:182::-;835:10:1;824:7;1240::13;1266:6;-1:-1:-1;;;;;1266:6:13;;1194:85;824:7:1;-1:-1:-1;;;;;824:21:1;;:53;;;-1:-1:-1;849:28:1;:7;866:10;849:16;:28::i;:::-;816:102;;;;-1:-1:-1;;;816:102:1;;;;;;;:::i;:::-;2233:35:12::1;2244:2;2248:3;2253:7;2233:35;;;;;;;;;;;;;-1:-1:-1::0;;;2233:35:12::1;;::::0;:10:::1;:35::i;3543:395:3:-:0;-1:-1:-1;;;;;3743:20:3;;719:10:2;3743:20:3;;:60;;-1:-1:-1;3767:36:3;3784:4;719:10:2;3310:166:3;:::i;3767:36::-;3722:154;;;;-1:-1:-1;;;3722:154:3;;;;;;;:::i;:::-;3886:45;3904:4;3910:2;3914;3918:6;3926:4;3886:17;:45::i;2074:198:13:-;1087:13;:11;:13::i;:::-;-1:-1:-1;;;;;2162:22:13;::::1;2154:73;;;::::0;-1:-1:-1;;;2154:73:13;;23764:2:15;2154:73:13::1;::::0;::::1;23746:21:15::0;23803:2;23783:18;;;23776:30;23842:34;23822:18;;;23815:62;-1:-1:-1;;;23893:18:15;;;23886:36;23939:19;;2154:73:13::1;23562:402:15::0;2154:73:13::1;2237:28;2256:8;2237:18;:28::i;458:230:1:-:0;560:4;-1:-1:-1;;;;;;583:46:1;;-1:-1:-1;;;583:46:1;;:98;;;645:36;669:11;1181:305:3;1283:4;-1:-1:-1;;;;;;1318:41:3;;-1:-1:-1;;;1318:41:3;;:109;;-1:-1:-1;;;;;;;1375:52:3;;-1:-1:-1;;;1375:52:3;1318:109;:161;;;-1:-1:-1;;;;;;;;;;937:40:4;;;1443:36:3;829:155:4;8583:165:5;-1:-1:-1;;;;;8716:23:5;;8663:4;4250:19;;;:12;;;:19;;;;;;:24;;8686:55;8679:62;8583:165;-1:-1:-1;;;8583:165:5:o;392:703:14:-;448:13;665:5;674:1;665:10;661:51;;-1:-1:-1;;691:10:14;;;;;;;;;;;;-1:-1:-1;;;691:10:14;;;;;392:703::o;661:51::-;736:5;721:12;775:75;782:9;;775:75;;807:8;;;;:::i;:::-;;-1:-1:-1;829:10:14;;-1:-1:-1;837:2:14;829:10;;:::i;:::-;;;775:75;;;859:19;891:6;-1:-1:-1;;;;;881:17:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;881:17:14;;859:39;;908:150;915:10;;908:150;;941:11;951:1;941:11;;:::i;:::-;;-1:-1:-1;1009:10:14;1017:2;1009:5;:10;:::i;:::-;996:24;;:2;:24;:::i;:::-;983:39;;966:6;973;966:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;966:56:14;;;;;;;;-1:-1:-1;1036:11:14;1045:2;1036:11;;:::i;:::-;;;908:150;;;1081:6;392:703;-1:-1:-1;;;;392:703:14:o;10753:786:3:-;-1:-1:-1;;;;;10875:18:3;;10867:66;;;;-1:-1:-1;;;10867:66:3;;;;;;;:::i;:::-;719:10:2;10944:16:3;11008:21;11026:2;11008:17;:21::i;:::-;10985:44;;11039:24;11066:25;11084:6;11066:17;:25::i;:::-;11102:66;;;;;;;;;-1:-1:-1;11102:66:3;;;;11201:13;;;:9;:13;;;;;-1:-1:-1;;;;;11201:19:3;;;;;;;;11039:52;;-1:-1:-1;11238:21:3;;;;11230:70;;;;-1:-1:-1;;;11230:70:3;;;;;;;:::i;:::-;11334:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;11334:19:3;;;;;;;;;;;;11356:20;;;11334:42;;11402:54;;24952:25:15;;;24993:18;;;24986:34;;;11334:19:3;;11402:54;;;;;;24925:18:15;11402:54:3;;;;;;;11467:65;;;;;;;;;11511:1;11467:65;;;10857:682;;;;10753:786;;;:::o;8577:709::-;-1:-1:-1;;;;;8724:16:3;;8716:62;;;;-1:-1:-1;;;8716:62:3;;;;;;;:::i;:::-;719:10:2;8789:16:3;8853:21;8871:2;8853:17;:21::i;:::-;8830:44;;8884:24;8911:25;8929:6;8911:17;:25::i;:::-;8884:52;;9024:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;9024:17:3;;;;;;;;;:27;;9045:6;;9024:13;:27;;9045:6;;9024:27;:::i;:::-;;;;-1:-1:-1;;9066:52:3;;;24952:25:15;;;25008:2;24993:18;;24986:34;;;-1:-1:-1;;;;;9066:52:3;;;;9099:1;;9066:52;;;;;;24925:18:15;9066:52:3;;;;;;;9205:74;9236:8;9254:1;9258:2;9262;9266:6;9274:4;9205:30;:74::i;1352:130:13:-;1240:7;1266:6;-1:-1:-1;;;;;1266:6:13;719:10:2;1415:23:13;1407:68;;;;-1:-1:-1;;;1407:68:13;;25635:2:15;1407:68:13;;;25617:21:15;;;25654:18;;;25647:30;25713:34;25693:18;;;25686:62;25765:18;;1407:68:13;25433:356:15;8346:156:5;8419:4;8442:53;8450:3;-1:-1:-1;;;;;8470:23:5;;8442:7;:53::i;6180:1115:3:-;6400:7;:14;6386:3;:10;:28;6378:81;;;;-1:-1:-1;;;6378:81:3;;;;;;;:::i;:::-;-1:-1:-1;;;;;6477:16:3;;6469:66;;;;-1:-1:-1;;;6469:66:3;;;;;;;:::i;:::-;719:10:2;6546:16:3;6659:411;6683:3;:10;6679:1;:14;6659:411;;;6714:10;6727:3;6731:1;6727:6;;;;;;;;:::i;:::-;;;;;;;6714:19;;6747:14;6764:7;6772:1;6764:10;;;;;;;;:::i;:::-;;;;;;;;;;;;6789:19;6811:13;;;:9;:13;;;;;;-1:-1:-1;;;;;6811:19:3;;;;;;;;;;;;6764:10;;-1:-1:-1;6852:21:3;;;;6844:76;;;;-1:-1:-1;;;6844:76:3;;;;;;;:::i;:::-;6962:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;6962:19:3;;;;;;;;;;6984:20;;;6962:42;;7032:17;;;;;;;:27;;6984:20;;6962:13;7032:27;;6984:20;;7032:27;:::i;:::-;;;;;;;;6700:370;;;6695:3;;;;:::i;:::-;;;6659:411;;;;7115:2;-1:-1:-1;;;;;7085:47:3;7109:4;-1:-1:-1;;;;;7085:47:3;7099:8;-1:-1:-1;;;;;7085:47:3;;7119:3;7124:7;7085:47;;;;;;;:::i;:::-;;;;;;;;7213:75;7249:8;7259:4;7265:2;7269:3;7274:7;7283:4;7213:35;:75::i;:::-;6368:927;6180:1115;;;;;:::o;8829:115:5:-;8892:7;8918:19;8926:3;4444:18;;4362:107;9286:156;9360:7;9410:22;9414:3;9426:5;9410:3;:22::i;8028:150::-;8098:4;8121:50;8126:3;-1:-1:-1;;;;;8146:23:5;;8121:4;:50::i;2426:187:13:-;2499:16;2518:6;;-1:-1:-1;;;;;2534:17:13;;;-1:-1:-1;;;;;;2534:17:13;;;;;;2566:40;;2518:6;;;;;;;2566:40;;2499:16;2566:40;2489:124;2426:187;:::o;11778:943:3:-;-1:-1:-1;;;;;11925:18:3;;11917:66;;;;-1:-1:-1;;;11917:66:3;;;;;;;:::i;:::-;12015:7;:14;12001:3;:10;:28;11993:81;;;;-1:-1:-1;;;11993:81:3;;;;;;;:::i;:::-;12127:66;;;;;;;;;12085:16;12127:66;;;;719:10:2;;12204:364:3;12228:3;:10;12224:1;:14;12204:364;;;12259:10;12272:3;12276:1;12272:6;;;;;;;;:::i;:::-;;;;;;;12259:19;;12292:14;12309:7;12317:1;12309:10;;;;;;;;:::i;:::-;;;;;;;;;;;;12334:19;12356:13;;;:9;:13;;;;;;-1:-1:-1;;;;;12356:19:3;;;;;;;;;;;;12309:10;;-1:-1:-1;12397:21:3;;;;12389:70;;;;-1:-1:-1;;;12389:70:3;;;;;;;:::i;:::-;12501:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;12501:19:3;;;;;;;;;;12523:20;;12501:42;;12240:3;;;;:::i;:::-;;;;12204:364;;;;12621:1;-1:-1:-1;;;;;12583:55:3;12607:4;-1:-1:-1;;;;;12583:55:3;12597:8;-1:-1:-1;;;;;12583:55:3;;12625:3;12630:7;12583:55;;;;;;;:::i;:::-;;;;;;;;12649:65;;;;;;;;;12693:1;12649:65;;11907:814;11778:943;;;:::o;12857:323::-;13007:8;-1:-1:-1;;;;;12998:17:3;:5;-1:-1:-1;;;;;12998:17:3;;12990:71;;;;-1:-1:-1;;;12990:71:3;;27692:2:15;12990:71:3;;;27674:21:15;27731:2;27711:18;;;27704:30;27770:34;27750:18;;;27743:62;-1:-1:-1;;;27821:18:15;;;27814:39;27870:19;;12990:71:3;27490:405:15;12990:71:3;-1:-1:-1;;;;;13071:25:3;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;13071:46:3;;;;;;;;;;13132:41;;1178::15;;;13132::3;;1151:18:15;13132:41:3;;;;;;;12857:323;;;:::o;9676:791::-;-1:-1:-1;;;;;9848:16:3;;9840:62;;;;-1:-1:-1;;;9840:62:3;;;;;;;:::i;:::-;9934:7;:14;9920:3;:10;:28;9912:81;;;;-1:-1:-1;;;9912:81:3;;;;;;;:::i;:::-;719:10:2;10004:16:3;10123:101;10147:3;:10;10143:1;:14;10123:101;;;10203:7;10211:1;10203:10;;;;;;;;:::i;:::-;;;;;;;10178:9;:17;10188:3;10192:1;10188:6;;;;;;;;:::i;:::-;;;;;;;10178:17;;;;;;;;;;;:21;10196:2;-1:-1:-1;;;;;10178:21:3;-1:-1:-1;;;;;10178:21:3;;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;-1:-1:-1;10159:3:3;;-1:-1:-1;10159:3:3;;;:::i;:::-;;;;10123:101;;;;10275:2;-1:-1:-1;;;;;10239:53:3;10271:1;-1:-1:-1;;;;;10239:53:3;10253:8;-1:-1:-1;;;;;10239:53:3;;10279:3;10284:7;10239:53;;;;;;;:::i;:::-;;;;;;;;10379:81;10415:8;10433:1;10437:2;10441:3;10446:7;10455:4;10379:35;:81::i;4887:947::-;-1:-1:-1;;;;;5068:16:3;;5060:66;;;;-1:-1:-1;;;5060:66:3;;;;;;;:::i;:::-;719:10:2;5137:16:3;5201:21;5219:2;5201:17;:21::i;:::-;5178:44;;5232:24;5259:25;5277:6;5259:17;:25::i;:::-;5232:52;;5366:19;5388:13;;;:9;:13;;;;;;;;-1:-1:-1;;;;;5388:19:3;;;;;;;;;;5425:21;;;;5417:76;;;;-1:-1:-1;;;5417:76:3;;;;;;;:::i;:::-;5527:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;5527:19:3;;;;;;;;;;5549:20;;;5527:42;;5589:17;;;;;;;:27;;5549:20;;5527:13;5589:27;;5549:20;;5589:27;:::i;:::-;;;;-1:-1:-1;;5632:46:3;;;24952:25:15;;;25008:2;24993:18;;24986:34;;;-1:-1:-1;;;;;5632:46:3;;;;;;;;;;;;;;24925:18:15;5632:46:3;;;;;;;5759:68;5790:8;5800:4;5806:2;5810;5814:6;5822:4;5759:30;:68::i;:::-;5050:784;;;;4887:947;;;;;:::o;17011:193::-;17130:16;;;17144:1;17130:16;;;;;;;;;17077;;17105:22;;17130:16;;;;;;;;;;;;-1:-1:-1;17130:16:3;17105:41;;17167:7;17156:5;17162:1;17156:8;;;;;;;;:::i;:::-;;;;;;;;;;:18;17192:5;17011:193;-1:-1:-1;;17011:193:3:o;15482:725::-;-1:-1:-1;;;;;15689:13:3;;1465:19:0;:23;15685:516:3;;15724:72;;-1:-1:-1;;;15724:72:3;;-1:-1:-1;;;;;15724:38:3;;;;;:72;;15763:8;;15773:4;;15779:2;;15783:6;;15791:4;;15724:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15724:72:3;;;;;;;;-1:-1:-1;;15724:72:3;;;;;;;;;;;;:::i;:::-;;;15720:471;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;16067:6;16060:14;;-1:-1:-1;;;16060:14:3;;;;;;;;:::i;15720:471::-;;;16114:62;;-1:-1:-1;;;16114:62:3;;29782:2:15;16114:62:3;;;29764:21:15;29821:2;29801:18;;;29794:30;29860:34;29840:18;;;29833:62;-1:-1:-1;;;29911:18:15;;;29904:50;29971:19;;16114:62:3;29580:416:15;15720:471:3;-1:-1:-1;;;;;;15845:55:3;;-1:-1:-1;;;15845:55:3;15841:152;;15924:50;;-1:-1:-1;;;15924:50:3;;;;;;;:::i;2685:1388:5:-;2751:4;2888:19;;;:12;;;:19;;;;;;2922:15;;2918:1149;;3291:21;3315:14;3328:1;3315:10;:14;:::i;:::-;3363:18;;3291:38;;-1:-1:-1;3343:17:5;;3363:22;;3384:1;;3363:22;:::i;:::-;3343:42;;3417:13;3404:9;:26;3400:398;;3450:17;3470:3;:11;;3482:9;3470:22;;;;;;;;:::i;:::-;;;;;;;;;3450:42;;3621:9;3592:3;:11;;3604:13;3592:26;;;;;;;;:::i;:::-;;;;;;;;;;;;:38;;;;3704:23;;;:12;;;:23;;;;;:36;;;3400:398;3876:17;;:3;;:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;3968:3;:12;;:19;3981:5;3968:19;;;;;;;;;;;3961:26;;;4009:4;4002:11;;;;;;;2918:1149;4051:5;4044:12;;;;;16213:792:3;-1:-1:-1;;;;;16445:13:3;;1465:19:0;:23;16441:558:3;;16480:79;;-1:-1:-1;;;16480:79:3;;-1:-1:-1;;;;;16480:43:3;;;;;:79;;16524:8;;16534:4;;16540:3;;16545:7;;16554:4;;16480:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16480:79:3;;;;;;;;-1:-1:-1;;16480:79:3;;;;;;;;;;;;:::i;:::-;;;16476:513;;;;:::i;:::-;-1:-1:-1;;;;;;16638:60:3;;-1:-1:-1;;;16638:60:3;16634:157;;16722:50;;-1:-1:-1;;;16722:50:3;;;;;;;:::i;4811:118:5:-;4878:7;4904:3;:11;;4916:5;4904:18;;;;;;;;:::i;:::-;;;;;;;;;4897:25;;4811:118;;;;:::o;2113:404::-;2176:4;4250:19;;;:12;;;:19;;;;;;2192:319;;-1:-1:-1;2234:23:5;;;;;;;;:11;:23;;;;;;;;;;;;;2414:18;;2392:19;;;:12;;;:19;;;;;;:40;;;;2446:11;;2192:319;-1:-1:-1;2495:5:5;2488:12;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:131:15;-1:-1:-1;;;;;89:31:15;;79:42;;69:70;;135:1;132;125:12;150:315;218:6;226;279:2;267:9;258:7;254:23;250:32;247:52;;;295:1;292;285:12;247:52;334:9;321:23;353:31;378:5;353:31;:::i;:::-;403:5;455:2;440:18;;;;427:32;;-1:-1:-1;;;150:315:15:o;652:131::-;-1:-1:-1;;;;;;726:32:15;;716:43;;706:71;;773:1;770;763:12;788:245;846:6;899:2;887:9;878:7;874:23;870:32;867:52;;;915:1;912;905:12;867:52;954:9;941:23;973:30;997:5;973:30;:::i;1230:592::-;1301:6;1309;1362:2;1350:9;1341:7;1337:23;1333:32;1330:52;;;1378:1;1375;1368:12;1330:52;1418:9;1405:23;-1:-1:-1;;;;;1488:2:15;1480:6;1477:14;1474:34;;;1504:1;1501;1494:12;1474:34;1542:6;1531:9;1527:22;1517:32;;1587:7;1580:4;1576:2;1572:13;1568:27;1558:55;;1609:1;1606;1599:12;1558:55;1649:2;1636:16;1675:2;1667:6;1664:14;1661:34;;;1691:1;1688;1681:12;1661:34;1736:7;1731:2;1722:6;1718:2;1714:15;1710:24;1707:37;1704:57;;;1757:1;1754;1747:12;1704:57;1788:2;1780:11;;;;;1810:6;;-1:-1:-1;1230:592:15;;-1:-1:-1;;;;1230:592:15:o;1827:250::-;1912:1;1922:113;1936:6;1933:1;1930:13;1922:113;;;2012:11;;;2006:18;1993:11;;;1986:39;1958:2;1951:10;1922:113;;;-1:-1:-1;;2069:1:15;2051:16;;2044:27;1827:250::o;2082:271::-;2124:3;2162:5;2156:12;2189:6;2184:3;2177:19;2205:76;2274:6;2267:4;2262:3;2258:14;2251:4;2244:5;2240:16;2205:76;:::i;:::-;2335:2;2314:15;-1:-1:-1;;2310:29:15;2301:39;;;;2342:4;2297:50;;2082:271;-1:-1:-1;;2082:271:15:o;2358:220::-;2507:2;2496:9;2489:21;2470:4;2527:45;2568:2;2557:9;2553:18;2545:6;2527:45;:::i;2583:180::-;2642:6;2695:2;2683:9;2674:7;2670:23;2666:32;2663:52;;;2711:1;2708;2701:12;2663:52;-1:-1:-1;2734:23:15;;2583:180;-1:-1:-1;2583:180:15:o;2768:383::-;2845:6;2853;2861;2914:2;2902:9;2893:7;2889:23;2885:32;2882:52;;;2930:1;2927;2920:12;2882:52;2969:9;2956:23;2988:31;3013:5;2988:31;:::i;:::-;3038:5;3090:2;3075:18;;3062:32;;-1:-1:-1;3141:2:15;3126:18;;;3113:32;;2768:383;-1:-1:-1;;;2768:383:15:o;3156:247::-;3215:6;3268:2;3256:9;3247:7;3243:23;3239:32;3236:52;;;3284:1;3281;3274:12;3236:52;3323:9;3310:23;3342:31;3367:5;3342:31;:::i;3408:127::-;3469:10;3464:3;3460:20;3457:1;3450:31;3500:4;3497:1;3490:15;3524:4;3521:1;3514:15;3540:249;3650:2;3631:13;;-1:-1:-1;;3627:27:15;3615:40;;-1:-1:-1;;;;;3670:34:15;;3706:22;;;3667:62;3664:88;;;3732:18;;:::i;:::-;3768:2;3761:22;-1:-1:-1;;3540:249:15:o;3794:183::-;3854:4;-1:-1:-1;;;;;3879:6:15;3876:30;3873:56;;;3909:18;;:::i;:::-;-1:-1:-1;3954:1:15;3950:14;3966:4;3946:25;;3794:183::o;3982:724::-;4036:5;4089:3;4082:4;4074:6;4070:17;4066:27;4056:55;;4107:1;4104;4097:12;4056:55;4143:6;4130:20;4169:4;4192:43;4232:2;4192:43;:::i;:::-;4264:2;4258:9;4276:31;4304:2;4296:6;4276:31;:::i;:::-;4342:18;;;4434:1;4430:10;;;;4418:23;;4414:32;;;4376:15;;;;-1:-1:-1;4458:15:15;;;4455:35;;;4486:1;4483;4476:12;4455:35;4522:2;4514:6;4510:15;4534:142;4550:6;4545:3;4542:15;4534:142;;;4616:17;;4604:30;;4654:12;;;;4567;;4534:142;;;-1:-1:-1;4694:6:15;3982:724;-1:-1:-1;;;;;;3982:724:15:o;4711:555::-;4753:5;4806:3;4799:4;4791:6;4787:17;4783:27;4773:55;;4824:1;4821;4814:12;4773:55;4860:6;4847:20;-1:-1:-1;;;;;4882:2:15;4879:26;4876:52;;;4908:18;;:::i;:::-;4957:2;4951:9;4969:67;5024:2;5005:13;;-1:-1:-1;;5001:27:15;5030:4;4997:38;4951:9;4969:67;:::i;:::-;5060:2;5052:6;5045:18;5106:3;5099:4;5094:2;5086:6;5082:15;5078:26;5075:35;5072:55;;;5123:1;5120;5113:12;5072:55;5187:2;5180:4;5172:6;5168:17;5161:4;5153:6;5149:17;5136:54;5234:1;5210:15;;;5227:4;5206:26;5199:37;;;;5214:6;4711:555;-1:-1:-1;;;4711:555:15:o;5271:1071::-;5425:6;5433;5441;5449;5457;5510:3;5498:9;5489:7;5485:23;5481:33;5478:53;;;5527:1;5524;5517:12;5478:53;5566:9;5553:23;5585:31;5610:5;5585:31;:::i;:::-;5635:5;-1:-1:-1;5692:2:15;5677:18;;5664:32;5705:33;5664:32;5705:33;:::i;:::-;5757:7;-1:-1:-1;5815:2:15;5800:18;;5787:32;-1:-1:-1;;;;;5868:14:15;;;5865:34;;;5895:1;5892;5885:12;5865:34;5918:61;5971:7;5962:6;5951:9;5947:22;5918:61;:::i;:::-;5908:71;;6032:2;6021:9;6017:18;6004:32;5988:48;;6061:2;6051:8;6048:16;6045:36;;;6077:1;6074;6067:12;6045:36;6100:63;6155:7;6144:8;6133:9;6129:24;6100:63;:::i;:::-;6090:73;;6216:3;6205:9;6201:19;6188:33;6172:49;;6246:2;6236:8;6233:16;6230:36;;;6262:1;6259;6252:12;6230:36;;6285:51;6328:7;6317:8;6306:9;6302:24;6285:51;:::i;:::-;6275:61;;;5271:1071;;;;;;;;:::o;6347:658::-;6518:2;6570:21;;;6640:13;;6543:18;;;6662:22;;;6489:4;;6518:2;6741:15;;;;6715:2;6700:18;;;6489:4;6784:195;6798:6;6795:1;6792:13;6784:195;;;6863:13;;-1:-1:-1;;;;;6859:39:15;6847:52;;6954:15;;;;6919:12;;;;6895:1;6813:9;6784:195;;;-1:-1:-1;6996:3:15;;6347:658;-1:-1:-1;;;;;;6347:658:15:o;7010:316::-;7087:6;7095;7103;7156:2;7144:9;7135:7;7131:23;7127:32;7124:52;;;7172:1;7169;7162:12;7124:52;-1:-1:-1;;7195:23:15;;;7265:2;7250:18;;7237:32;;-1:-1:-1;7316:2:15;7301:18;;;7288:32;;7010:316;-1:-1:-1;7010:316:15:o;7331:1277::-;7449:6;7457;7510:2;7498:9;7489:7;7485:23;7481:32;7478:52;;;7526:1;7523;7516:12;7478:52;7566:9;7553:23;-1:-1:-1;;;;;7636:2:15;7628:6;7625:14;7622:34;;;7652:1;7649;7642:12;7622:34;7690:6;7679:9;7675:22;7665:32;;7735:7;7728:4;7724:2;7720:13;7716:27;7706:55;;7757:1;7754;7747:12;7706:55;7793:2;7780:16;7815:4;7838:43;7878:2;7838:43;:::i;:::-;7910:2;7904:9;7922:31;7950:2;7942:6;7922:31;:::i;:::-;7988:18;;;8076:1;8072:10;;;;8064:19;;8060:28;;;8022:15;;;;-1:-1:-1;8100:19:15;;;8097:39;;;8132:1;8129;8122:12;8097:39;8156:11;;;;8176:217;8192:6;8187:3;8184:15;8176:217;;;8272:3;8259:17;8289:31;8314:5;8289:31;:::i;:::-;8333:18;;8209:12;;;;8371;;;;8176:217;;;8412:6;-1:-1:-1;;8456:18:15;;8443:32;;-1:-1:-1;;8487:16:15;;;8484:36;;;8516:1;8513;8506:12;8484:36;;8539:63;8594:7;8583:8;8572:9;8568:24;8539:63;:::i;:::-;8529:73;;;7331:1277;;;;;:::o;8613:435::-;8666:3;8704:5;8698:12;8731:6;8726:3;8719:19;8757:4;8786:2;8781:3;8777:12;8770:19;;8823:2;8816:5;8812:14;8844:1;8854:169;8868:6;8865:1;8862:13;8854:169;;;8929:13;;8917:26;;8963:12;;;;8998:15;;;;8890:1;8883:9;8854:169;;;-1:-1:-1;9039:3:15;;8613:435;-1:-1:-1;;;;;8613:435:15:o;9053:261::-;9232:2;9221:9;9214:21;9195:4;9252:56;9304:2;9293:9;9289:18;9281:6;9252:56;:::i;9319:595::-;9437:6;9445;9498:2;9486:9;9477:7;9473:23;9469:32;9466:52;;;9514:1;9511;9504:12;9466:52;9554:9;9541:23;-1:-1:-1;;;;;9624:2:15;9616:6;9613:14;9610:34;;;9640:1;9637;9630:12;9610:34;9663:61;9716:7;9707:6;9696:9;9692:22;9663:61;:::i;:::-;9653:71;;9777:2;9766:9;9762:18;9749:32;9733:48;;9806:2;9796:8;9793:16;9790:36;;;9822:1;9819;9812:12;10455:416;10520:6;10528;10581:2;10569:9;10560:7;10556:23;10552:32;10549:52;;;10597:1;10594;10587:12;10549:52;10636:9;10623:23;10655:31;10680:5;10655:31;:::i;:::-;10705:5;-1:-1:-1;10762:2:15;10747:18;;10734:32;10804:15;;10797:23;10785:36;;10775:64;;10835:1;10832;10825:12;10775:64;10858:7;10848:17;;;10455:416;;;;;:::o;10876:248::-;10944:6;10952;11005:2;10993:9;10984:7;10980:23;10976:32;10973:52;;;11021:1;11018;11011:12;10973:52;-1:-1:-1;;11044:23:15;;;11114:2;11099:18;;;11086:32;;-1:-1:-1;10876:248:15:o;11408:730::-;11535:6;11543;11551;11604:2;11592:9;11583:7;11579:23;11575:32;11572:52;;;11620:1;11617;11610:12;11572:52;11659:9;11646:23;11678:31;11703:5;11678:31;:::i;:::-;11728:5;-1:-1:-1;11784:2:15;11769:18;;11756:32;-1:-1:-1;;;;;11837:14:15;;;11834:34;;;11864:1;11861;11854:12;11834:34;11887:61;11940:7;11931:6;11920:9;11916:22;11887:61;:::i;:::-;11877:71;;12001:2;11990:9;11986:18;11973:32;11957:48;;12030:2;12020:8;12017:16;12014:36;;;12046:1;12043;12036:12;12014:36;;12069:63;12124:7;12113:8;12102:9;12098:24;12069:63;:::i;:::-;12059:73;;;11408:730;;;;;:::o;12143:388::-;12211:6;12219;12272:2;12260:9;12251:7;12247:23;12243:32;12240:52;;;12288:1;12285;12278:12;12240:52;12327:9;12314:23;12346:31;12371:5;12346:31;:::i;:::-;12396:5;-1:-1:-1;12453:2:15;12438:18;;12425:32;12466:33;12425:32;12466:33;:::i;12536:734::-;12640:6;12648;12656;12664;12672;12725:3;12713:9;12704:7;12700:23;12696:33;12693:53;;;12742:1;12739;12732:12;12693:53;12781:9;12768:23;12800:31;12825:5;12800:31;:::i;:::-;12850:5;-1:-1:-1;12907:2:15;12892:18;;12879:32;12920:33;12879:32;12920:33;:::i;:::-;12972:7;-1:-1:-1;13026:2:15;13011:18;;12998:32;;-1:-1:-1;13077:2:15;13062:18;;13049:32;;-1:-1:-1;13132:3:15;13117:19;;13104:33;-1:-1:-1;;;;;13149:30:15;;13146:50;;;13192:1;13189;13182:12;13146:50;13215:49;13256:7;13247:6;13236:9;13232:22;13215:49;:::i;13686:400::-;13888:2;13870:21;;;13927:2;13907:18;;;13900:30;13966:34;13961:2;13946:18;;13939:62;-1:-1:-1;;;14032:2:15;14017:18;;14010:34;14076:3;14061:19;;13686:400::o;14091:380::-;14170:1;14166:12;;;;14213;;;14234:61;;14288:4;14280:6;14276:17;14266:27;;14234:61;14341:2;14333:6;14330:14;14310:18;14307:38;14304:161;;14387:10;14382:3;14378:20;14375:1;14368:31;14422:4;14419:1;14412:15;14450:4;14447:1;14440:15;14304:161;;14091:380;;;:::o;14602:545::-;14704:2;14699:3;14696:11;14693:448;;;14740:1;14765:5;14761:2;14754:17;14810:4;14806:2;14796:19;14880:2;14868:10;14864:19;14861:1;14857:27;14851:4;14847:38;14916:4;14904:10;14901:20;14898:47;;;-1:-1:-1;14939:4:15;14898:47;14994:2;14989:3;14985:12;14982:1;14978:20;14972:4;14968:31;14958:41;;15049:82;15067:2;15060:5;15057:13;15049:82;;;15112:17;;;15093:1;15082:13;15049:82;;15323:1206;-1:-1:-1;;;;;15442:3:15;15439:27;15436:53;;;15469:18;;:::i;:::-;15498:94;15588:3;15548:38;15580:4;15574:11;15548:38;:::i;:::-;15542:4;15498:94;:::i;:::-;15618:1;15643:2;15638:3;15635:11;15660:1;15655:616;;;;16315:1;16332:3;16329:93;;;-1:-1:-1;16388:19:15;;;16375:33;16329:93;-1:-1:-1;;15280:1:15;15276:11;;;15272:24;15268:29;15258:40;15304:1;15300:11;;;15255:57;16435:78;;15628:895;;15655:616;14549:1;14542:14;;;14586:4;14573:18;;-1:-1:-1;;15691:17:15;;;15792:9;15814:229;15828:7;15825:1;15822:14;15814:229;;;15917:19;;;15904:33;15889:49;;16024:4;16009:20;;;;15977:1;15965:14;;;;15844:12;15814:229;;;15818:3;16071;16062:7;16059:16;16056:159;;;16195:1;16191:6;16185:3;16179;16176:1;16172:11;16168:21;16164:34;16160:39;16147:9;16142:3;16138:19;16125:33;16121:79;16113:6;16106:95;16056:159;;;16258:1;16252:3;16249:1;16245:11;16241:19;16235:4;16228:33;15628:895;;15323:1206;;;:::o;16534:1187::-;16811:3;16840:1;16873:6;16867:13;16903:36;16929:9;16903:36;:::i;:::-;16958:1;16975:18;;;17002:133;;;;17149:1;17144:356;;;;16968:532;;17002:133;-1:-1:-1;;17035:24:15;;17023:37;;17108:14;;17101:22;17089:35;;17080:45;;;-1:-1:-1;17002:133:15;;17144:356;17175:6;17172:1;17165:17;17205:4;17250:2;17247:1;17237:16;17275:1;17289:165;17303:6;17300:1;17297:13;17289:165;;;17381:14;;17368:11;;;17361:35;17424:16;;;;17318:10;;17289:165;;;17293:3;;;17483:6;17478:3;17474:16;17467:23;;16968:532;;;;;17531:6;17525:13;17547:68;17606:8;17601:3;17594:4;17586:6;17582:17;17547:68;:::i;:::-;-1:-1:-1;;;17637:18:15;;17664:22;;;17713:1;17702:13;;16534:1187;-1:-1:-1;;;;16534:1187:15:o;18839:411::-;19041:2;19023:21;;;19080:2;19060:18;;;19053:30;19119:34;19114:2;19099:18;;19092:62;-1:-1:-1;;;19185:2:15;19170:18;;19163:45;19240:3;19225:19;;18839:411::o;19255:127::-;19316:10;19311:3;19307:20;19304:1;19297:31;19347:4;19344:1;19337:15;19371:4;19368:1;19361:15;19387:127;19448:10;19443:3;19439:20;19436:1;19429:31;19479:4;19476:1;19469:15;19503:4;19500:1;19493:15;19519:135;19558:3;19579:17;;;19576:43;;19599:18;;:::i;:::-;-1:-1:-1;19646:1:15;19635:13;;19519:135::o;22312:168::-;22385:9;;;22416;;22433:15;;;22427:22;;22413:37;22403:71;;22454:18;;:::i;22485:127::-;22546:10;22541:3;22537:20;22534:1;22527:31;22577:4;22574:1;22567:15;22601:4;22598:1;22591:15;22617:120;22657:1;22683;22673:35;;22688:18;;:::i;:::-;-1:-1:-1;22722:9:15;;22617:120::o;23041:112::-;23073:1;23099;23089:35;;23104:18;;:::i;:::-;-1:-1:-1;23138:9:15;;23041:112::o;23158:128::-;23225:9;;;23246:11;;;23243:37;;;23260:18;;:::i;23291:125::-;23356:9;;;23377:10;;;23374:36;;;23390:18;;:::i;23421:136::-;23460:3;23488:5;23478:39;;23497:18;;:::i;:::-;-1:-1:-1;;;23533:18:15;;23421:136::o;23969:399::-;24171:2;24153:21;;;24210:2;24190:18;;;24183:30;24249:34;24244:2;24229:18;;24222:62;-1:-1:-1;;;24315:2:15;24300:18;;24293:33;24358:3;24343:19;;23969:399::o;24373:400::-;24575:2;24557:21;;;24614:2;24594:18;;;24587:30;24653:34;24648:2;24633:18;;24626:62;-1:-1:-1;;;24719:2:15;24704:18;;24697:34;24763:3;24748:19;;24373:400::o;25031:397::-;25233:2;25215:21;;;25272:2;25252:18;;;25245:30;25311:34;25306:2;25291:18;;25284:62;-1:-1:-1;;;25377:2:15;25362:18;;25355:31;25418:3;25403:19;;25031:397::o;25794:404::-;25996:2;25978:21;;;26035:2;26015:18;;;26008:30;26074:34;26069:2;26054:18;;26047:62;-1:-1:-1;;;26140:2:15;26125:18;;26118:38;26188:3;26173:19;;25794:404::o;26203:401::-;26405:2;26387:21;;;26444:2;26424:18;;;26417:30;26483:34;26478:2;26463:18;;26456:62;-1:-1:-1;;;26549:2:15;26534:18;;26527:35;26594:3;26579:19;;26203:401::o;26609:406::-;26811:2;26793:21;;;26850:2;26830:18;;;26823:30;26889:34;26884:2;26869:18;;26862:62;-1:-1:-1;;;26955:2:15;26940:18;;26933:40;27005:3;26990:19;;26609:406::o;27020:465::-;27277:2;27266:9;27259:21;27240:4;27303:56;27355:2;27344:9;27340:18;27332:6;27303:56;:::i;:::-;27407:9;27399:6;27395:22;27390:2;27379:9;27375:18;27368:50;27435:44;27472:6;27464;27435:44;:::i;:::-;27427:52;27020:465;-1:-1:-1;;;;;27020:465:15:o;27900:561::-;-1:-1:-1;;;;;28197:15:15;;;28179:34;;28249:15;;28244:2;28229:18;;28222:43;28296:2;28281:18;;28274:34;;;28339:2;28324:18;;28317:34;;;28159:3;28382;28367:19;;28360:32;;;28122:4;;28409:46;;28435:19;;28427:6;28409:46;:::i;:::-;28401:54;27900:561;-1:-1:-1;;;;;;;27900:561:15:o;28466:249::-;28535:6;28588:2;28576:9;28567:7;28563:23;28559:32;28556:52;;;28604:1;28601;28594:12;28556:52;28636:9;28630:16;28655:30;28679:5;28655:30;:::i;28720:179::-;28755:3;28797:1;28779:16;28776:23;28773:120;;;28843:1;28840;28837;28822:23;-1:-1:-1;28880:1:15;28874:8;28869:3;28865:18;28773:120;28720:179;:::o;28904:671::-;28943:3;28985:4;28967:16;28964:26;28961:39;;;28904:671;:::o;28961:39::-;29027:2;29021:9;-1:-1:-1;;29092:16:15;29088:25;;29085:1;29021:9;29064:50;29143:4;29137:11;29167:16;-1:-1:-1;;;;;29273:2:15;29266:4;29258:6;29254:17;29251:25;29246:2;29238:6;29235:14;29232:45;29229:58;;;29280:5;;;;;28904:671;:::o;29229:58::-;29317:6;29311:4;29307:17;29296:28;;29353:3;29347:10;29380:2;29372:6;29369:14;29366:27;;;29386:5;;;;;;28904:671;:::o;29366:27::-;29470:2;29451:16;29445:4;29441:27;29437:36;29430:4;29421:6;29416:3;29412:16;29408:27;29405:69;29402:82;;;29477:5;;;;;;28904:671;:::o;29402:82::-;29493:57;29544:4;29535:6;29527;29523:19;29519:30;29513:4;29493:57;:::i;:::-;-1:-1:-1;29566:3:15;;28904:671;-1:-1:-1;;;;;28904:671:15:o;30001:404::-;30203:2;30185:21;;;30242:2;30222:18;;;30215:30;30281:34;30276:2;30261:18;;30254:62;-1:-1:-1;;;30347:2:15;30332:18;;30325:38;30395:3;30380:19;;30001:404::o;30410:127::-;30471:10;30466:3;30462:20;30459:1;30452:31;30502:4;30499:1;30492:15;30526:4;30523:1;30516:15;30542:827;-1:-1:-1;;;;;30939:15:15;;;30921:34;;30991:15;;30986:2;30971:18;;30964:43;30901:3;31038:2;31023:18;;31016:31;;;30864:4;;31070:57;;31107:19;;31099:6;31070:57;:::i;:::-;31175:9;31167:6;31163:22;31158:2;31147:9;31143:18;31136:50;31209:44;31246:6;31238;31209:44;:::i;:::-;31195:58;;31302:9;31294:6;31290:22;31284:3;31273:9;31269:19;31262:51;31330:33;31356:6;31348;31330:33;:::i;:::-;31322:41;30542:827;-1:-1:-1;;;;;;;;30542:827:15:o

Swarm Source

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