Token Cronos Gorilla Business

Overview CRC721

Total Supply:
6,100 CGB

Holders:
584 addresses
Balance
0 CGB
0xd156f87ea9f25b7820582b460553ee621eddc258
Loading
[ Download CSV Export  ] 
Loading
[ Download CSV Export  ] 
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
CronosGorillaBusiness

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at cronoscan.com on 2022-03-22
*/

// File: contracts/SafeMathLite.sol


pragma solidity ^0.8.4;
library SafeMathLite{

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }
}
// File: contracts/SafePct.sol


pragma solidity ^0.8.4;

/**
 * @dev Compute percentages safely without phantom overflows.
 *
 * Intermediate operations can overflow even when the result will always
 * fit into computed type. Developers usually
 * assume that overflows raise errors. `SafePct` restores this intuition by
 * reverting the transaction when such an operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 *
 * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing
 * all math on `uint256` and `int256` and then downcasting.
 */


library SafePct {
    using SafeMathLite for uint256;
    /**
     * Requirements:
     *
     * - intermediate operations must revert on overflow
     */
    function mulDiv(uint256 x, uint256 y, uint256 z) internal pure returns (uint256) {
        require(z > 0, "Division by zero");

        if (x == 0) return 0;
        uint256 xy = x * y;
        if (xy / x == y) { // no overflow happened - same as in SafeMath mul
            return xy / z;
        }

        //slither-disable-next-line divide-before-multiply
        uint256 a = x / z;
        uint256 b = x % z; // x = a * z + b

        //slither-disable-next-line divide-before-multiply
        uint256 c = y / z;
        uint256 d = y % z; // y = c * z + d

        return (a.mul(c).mul(z)).add(a.mul(d)).add(b.mul(c)).add(b.mul(d).div(z));
    }
}
// File: contracts/IDrop.sol



pragma solidity ^0.8.0;

interface IDrop {
    struct Info {
        uint256 regularCost;
        uint256 memberCost;
        uint256 whitelistCost;
        uint256 maxSupply;
        uint256 totalSupply;
        uint256 maxMintPerAddress;
        uint256 maxMintPerTx;
    }

    struct SupplyRemainingPerFaction {
        uint256 terraSupplyRemaining;
        uint256 aquaSupplyRemaining;
        uint256 ignisSupplyRemaining;
    }
    
    function mintCost(address _minter) external view returns(uint256);
    function canMint(address _minter) external view returns (uint256, uint256, uint256);
    function mint(uint256 _amount, bytes32 faction) external payable;
    function maxSupply() external view returns (uint256);
    function getInfo() external view returns (Info memory, SupplyRemainingPerFaction memory);
}
// File: @openzeppelin/contracts/utils/math/SafeMath.sol


// OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

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


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

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

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

// File: contracts/Withdraw.sol


pragma solidity ^0.8.0;



contract Withdraw is Ownable {
    using SafeMath for uint256;

    struct Part {
        address wallet;
        uint256 salePart;
    }

    Part[] public parts;

    constructor(){
        parts.push(Part(0xd2ace13fD5AdA4351a31Cd8a1206C2da3377634D, 400));
        parts.push(Part(0x9822e949A4193EA5442F640A2e3c92C31569ACec, 200));
        parts.push(Part(0x53B4bA1a81744A1C9920b341d6EFe6F7d366B583, 200));
        parts.push(Part(0x40ce05B67D50E114cfeE3F51c8250483b4A85fF9, 200));
    }

    function shareSalesPart() public onlyOwner {
        uint256 balance = address(this).balance;
        require(balance > 0, "Sales Balance = 0");

        for(uint8 i = 0; i < parts.length; i++){
            if(parts[i].salePart > 0){
                _withdraw(parts[i].wallet, balance.mul(parts[i].salePart).div(1000));
            }
        }

        _withdraw(owner(), address(this).balance);
    }

    function _withdraw(address _address, uint256 _amount) private {
        (bool success, ) = _address.call{value: _amount}("");
        require(success, "Transfer failed.");
    }

    receive() external payable {}

}
// File: @openzeppelin/contracts/utils/Address.sol


// OpenZeppelin Contracts (last updated v4.5.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

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: @openzeppelin/contracts/utils/escrow/Escrow.sol


// OpenZeppelin Contracts v4.4.1 (utils/escrow/Escrow.sol)

pragma solidity ^0.8.0;



/**
 * @title Escrow
 * @dev Base escrow contract, holds funds designated for a payee until they
 * withdraw them.
 *
 * Intended usage: This contract (and derived escrow contracts) should be a
 * standalone contract, that only interacts with the contract that instantiated
 * it. That way, it is guaranteed that all Ether will be handled according to
 * the `Escrow` rules, and there is no need to check for payable functions or
 * transfers in the inheritance tree. The contract that uses the escrow as its
 * payment method should be its owner, and provide public methods redirecting
 * to the escrow's deposit and withdraw.
 */
contract Escrow is Ownable {
    using Address for address payable;

    event Deposited(address indexed payee, uint256 weiAmount);
    event Withdrawn(address indexed payee, uint256 weiAmount);

    mapping(address => uint256) private _deposits;

    function depositsOf(address payee) public view returns (uint256) {
        return _deposits[payee];
    }

    /**
     * @dev Stores the sent amount as credit to be withdrawn.
     * @param payee The destination address of the funds.
     */
    function deposit(address payee) public payable virtual onlyOwner {
        uint256 amount = msg.value;
        _deposits[payee] += amount;
        emit Deposited(payee, amount);
    }

    /**
     * @dev Withdraw accumulated balance for a payee, forwarding all gas to the
     * recipient.
     *
     * WARNING: Forwarding all gas opens the door to reentrancy vulnerabilities.
     * Make sure you trust the recipient, or are either following the
     * checks-effects-interactions pattern or using {ReentrancyGuard}.
     *
     * @param payee The address whose funds will be withdrawn and transferred to.
     */
    function withdraw(address payable payee) public virtual onlyOwner {
        uint256 payment = _deposits[payee];

        _deposits[payee] = 0;

        payee.sendValue(payment);

        emit Withdrawn(payee, payment);
    }
}

// File: @openzeppelin/contracts/security/PullPayment.sol


// OpenZeppelin Contracts v4.4.1 (security/PullPayment.sol)

pragma solidity ^0.8.0;


/**
 * @dev Simple implementation of a
 * https://consensys.github.io/smart-contract-best-practices/recommendations/#favor-pull-over-push-for-external-calls[pull-payment]
 * strategy, where the paying contract doesn't interact directly with the
 * receiver account, which must withdraw its payments itself.
 *
 * Pull-payments are often considered the best practice when it comes to sending
 * Ether, security-wise. It prevents recipients from blocking execution, and
 * eliminates reentrancy concerns.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 *
 * To use, derive from the `PullPayment` contract, and use {_asyncTransfer}
 * instead of Solidity's `transfer` function. Payees can query their due
 * payments with {payments}, and retrieve them with {withdrawPayments}.
 */
abstract contract PullPayment {
    Escrow private immutable _escrow;

    constructor() {
        _escrow = new Escrow();
    }

    /**
     * @dev Withdraw accumulated payments, forwarding all gas to the recipient.
     *
     * Note that _any_ account can call this function, not just the `payee`.
     * This means that contracts unaware of the `PullPayment` protocol can still
     * receive funds this way, by having a separate account call
     * {withdrawPayments}.
     *
     * WARNING: Forwarding all gas opens the door to reentrancy vulnerabilities.
     * Make sure you trust the recipient, or are either following the
     * checks-effects-interactions pattern or using {ReentrancyGuard}.
     *
     * @param payee Whose payments will be withdrawn.
     */
    function withdrawPayments(address payable payee) public virtual {
        _escrow.withdraw(payee);
    }

    /**
     * @dev Returns the payments owed to an address.
     * @param dest The creditor's address.
     */
    function payments(address dest) public view returns (uint256) {
        return _escrow.depositsOf(dest);
    }

    /**
     * @dev Called by the payer to store the sent amount as credit to be pulled.
     * Funds sent in this way are stored in an intermediate {Escrow} contract, so
     * there is no danger of them being spent before withdrawal.
     *
     * @param dest The destination address of the funds.
     * @param amount The amount to transfer.
     */
    function _asyncTransfer(address dest, uint256 amount) internal virtual {
        _escrow.deposit{value: amount}(dest);
    }
}

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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

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


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;







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

    // Mapping from token ID to account balances
    mapping(uint256 => mapping(address => uint256)) 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: balance query for the zero address");
        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 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: transfer caller is not 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();

        _beforeTokenTransfer(operator, from, to, _asSingletonArray(id), _asSingletonArray(amount), 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);

        _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);

        _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();

        _beforeTokenTransfer(operator, address(0), to, _asSingletonArray(id), _asSingletonArray(amount), data);

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

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

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.
     *
     * 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);

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

    /**
     * @dev Destroys `amount` tokens of token type `id` from `from`
     *
     * 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();

        _beforeTokenTransfer(operator, from, address(0), _asSingletonArray(id), _asSingletonArray(amount), "");

        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);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.
     *
     * 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);
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {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 `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 _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

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

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

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

        return array;
    }
}

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

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

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

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


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

pragma solidity ^0.8.0;








/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

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

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

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

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

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

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);

        _afterTokenTransfer(address(0), to, tokenId);
    }

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

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);

        _afterTokenTransfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

// File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol)

pragma solidity ^0.8.0;



/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

// File: contracts/CronosGorillaBusiness.sol


pragma solidity ^0.8.0;

// @author: Querty

////////////////////////////////////////////////////////////////////////////
//                                                                        //
//                                       @@.                              //       
//                                       @@@@@@@@@@                       //       
//                                       @@@@@@@@@@@@@                    //       
//                            @@@@@@@@@  @@@@@@@@@@@@@@                   //       
//                         @@@@@@@@@@@@  @@@@@@@@@@@@@@@@                 //       
//                       @@@@@@@@@@@@@@  @@@@@@@@@@@@@@@@@                //       
//                      @@@@@@@@@@@@@@@  @@@@@@@@@@@@@@@@@                //       
//                     @@@@@@@       @@  @@@@@  @@@@@@@@@@                //       
//              @@@@@  @@@@                          @@@@@                //       
//             @@@@@@@@@@    *@@@@           @@@@@     @@@@               //       
//             @@@@@@@@@@      @@@  @      @  @@@      @@@@@@             //       
//             @@@@@@@@@@                              @@@@@@@            //       
//              @@@@@@@@@@@                           @@@@@@@@            //       
//               @@@@@@@@@@@@@ @@@ @@@@      @@@    @@@@@@@               //       
//                    @@@@@@@@@@   /@    @@@  @@@@@@@@@@@@@@              //       
//                      @@@@@@@              @@  @@@@@@@@@@@@             //       
//                        @@@@@                   @@@@@@@@@@@             //       
//                          @@                    @@@@@@@@@@@             //       
//                          @@                    (@@@@@@@@@@             //       
//                          @@@ @@@@@@@@@@@@@@@%  @@@@@@@@@@              //       
//                           @@@                 @@@@@@@@@@               //       
//                             @@@@             @@@@@@@                   //       
//                                 @@@@    @@@@@@@@@                      //       
//                                       @@@@@@@                          //
//                                                                        //
////////////////////////////////////////////////////////////////////////////









contract CronosGorillaBusiness is ERC721Enumerable, Ownable, Withdraw, IDrop, PullPayment {
    using Strings for uint256;
    using SafePct for uint256;
    

    uint256 public supplyRemaining;
    uint128 constant MAX_SUPPLY = 6100;
    uint128 constant internal SCALE = 10000;
    uint128 constant internal FEE = 1000;
    int8 public constant MAX_PER_FACTION = 5;
    int8 public constant MAX_WL = 5;
    int8 public constant MAX_PUBLIC = 15;

    uint256 public FOUNDING_MEMBERS_PRICE = 350 ether;

    string public baseURI;

    address[] public eligibleAddresses;

    struct Sale {
        uint64 start;
        uint64 end;
        int16 maxPerWallet;
        uint8 maxPerTx;
        uint256 price;
        bool paused;
    }

    struct Faction {
        uint256 supply;
        uint256 supplyRemaining;
        uint256 firstTokenID;
        uint16 maxPerFaction;
    }

    ERC1155 memberships;

    mapping(string => Sale) public sales;
    mapping(bytes32 => Faction) public factions;
    mapping(address => bool) whitelistedAddresses;
    mapping(string => mapping(address => uint16)) balanceSale;
    mapping(bytes32 => mapping(address => uint16)) balanceFaction;
    mapping(uint256 => uint256) private assignOrders;

    event EventSaleChange(string _name, Sale _sale);
    event EventCGBMinted(uint[] tokenIds, address buyer);

    constructor(string memory _initBaseURI, ERC1155 _contract) ERC721 ("Cronos Gorilla Business", "CGB") {
        setBaseURI(_initBaseURI);
        supplyRemaining = MAX_SUPPLY;
        setFoundingMemberContract(_contract);
        setSale("PRESALES", Sale(1646424000, 1646431199, MAX_WL, 5, 325 ether, false));
        setSale("PUBLIC", Sale(1646431200, 1956776400, MAX_PUBLIC, 5, 390 ether, false));
        setFaction("MAFIA", Faction(1000, 1000, 1, 1));
        setFaction("AQUA", Faction(1700, 1700, 1001, 5));
        setFaction("IGNIS", Faction(1700, 1700, 2701, 5));
        setFaction("TERRA", Faction(1700, 1700, 4401, 5));
    }

    //**************************//
    //          MODIFIER        //
    //**************************//
    modifier isOpen(string memory _name, uint256 _count) {
        require(saleIsOpen(_name), "Sales not open");
        require(_count > 0, "Can not mint 0 NFT");
        require(_count <= supplyRemaining, "Exceeds maximum supply. Try to mint less NFTs");
        require(supplyRemaining > 0, "Collection is Sold Out");
        require(_count <= sales[_name].maxPerTx, "Max per tx limit");
        require(int16(balanceSale[_name][_msgSender()] + uint16(_count)) <= int16(sales[_name].maxPerWallet), "Max per wallet limit");
        if (block.timestamp > sales["PRESALES"].end && isMember(_msgSender())) {
            require(msg.value >= FOUNDING_MEMBERS_PRICE * _count, "Insuficient funds");
        } else {
            require(msg.value >= sales[_name].price * _count, "Insuficient funds");
        }
        balanceSale[_name][_msgSender()] += uint16(_count);
        _;
    }

    modifier isNotSoldOut(bytes32 _name, uint256 _count) {
        require(keccak256(abi.encodePacked((_name))) != keccak256(abi.encodePacked(bytes32(("MAFIA")))), "Can not mint Mafia Faction");
        require(_count > 0, "Can not mint 0 NFT");
        require(_count <= uint256(factions[_name].maxPerFaction), "Max per faction limit");
        require(factions[_name].supplyRemaining > 0, "Faction supply is Sold Out");
        require(factions[_name].supplyRemaining >= _count, "Exceeds maximum faction supply. Try to mint less NFTs");
        require(int16(balanceFaction[_name][_msgSender()] + uint16(_count)) <= int16(factions[_name].maxPerFaction), "Max per wallet limit (Faction)");
        balanceFaction[_name][_msgSender()] += uint16(_count);
        _;
    }

    //**************************//
    //          SALES           //
    //**************************//
    function setSale(string memory _name, Sale memory _sale) public onlyOwner {
        sales[_name] = _sale;
        emit EventSaleChange(_name, _sale);
    }

    function pauseSale(string memory _name, bool _pause) public onlyOwner {
        sales[_name].paused = _pause;
    }

    function saleIsOpen(string memory _name) public view returns (bool) {
        return sales[_name].start > 0 && block.timestamp >= sales[_name].start && block.timestamp <= sales[_name].end && !sales[_name].paused;
    }

    function setFoundingMemberContract(ERC1155 _contract) public onlyOwner {
        memberships = _contract;
    }

    //*****************************//
    //          FACTIONS           //
    //*****************************//
    function setFaction(bytes32 _name, Faction memory _factionName) public onlyOwner {
        factions[_name] = _factionName;
    }

    //**************************//
    //          GETTERS         //
    //**************************//
    function isWhitelisted(address _user) public view returns (bool) {
        bool userIsWhitelisted = whitelistedAddresses[_user];
        return userIsWhitelisted;
    }

    function isMember(address _address) public view returns (bool) {
        return memberships.balanceOf(_address, 1) > 0 || memberships.balanceOf(_address, 2) > 0;
    }

    function isEligibleAirdrop(address _user) public view returns (bool) {
        for (uint256 i = 0; i < eligibleAddresses.length; i++) {
            if (eligibleAddresses[i] == _user) {
                return true;
            }
        }
        return false;
    }

    function getWalletOfOwner(address _owner) public view returns (uint256[] memory) {
        uint256 ownerTokenCount = balanceOf(_owner);
        uint256[] memory tokenIds = new uint256[](ownerTokenCount);
        for (uint256 i; i < ownerTokenCount; i++) {
            tokenIds[i] = tokenOfOwnerByIndex(_owner, i);
        }
        return tokenIds;
    }

    function getBalanceOfOwner(address _owner) public view returns (uint256) {
        uint256[] memory tokenIds = getWalletOfOwner(_owner);
        uint256 numberOfGorillas = tokenIds.length;
        return numberOfGorillas;
    }

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

    function minted(string memory _name, address _wallet) public view returns (uint16) {
        return balanceSale[_name][_wallet];
    }

    function mintedFaction(bytes32 _factionName, address _wallet) public view returns (uint16) {
        return balanceFaction[_factionName][_wallet];
    }

    function getMafiaSupplyRemaining() public view returns (uint256) {
        return factions["MAFIA"].supplyRemaining;
    }

    function getAquaSupplyRemaining() public view returns (uint256) {
        return factions["AQUA"].supplyRemaining;
    }

    function getIgnisSupplyRemaining() public view returns (uint256) {
        return factions["IGNIS"].supplyRemaining;
    }

    function getTerraSupplyRemaining() public view returns (uint256) {
        return factions["TERRA"].supplyRemaining;
    }

    //**************************//
    //          SETTERS         //
    //**************************//
    function batchWhitelist(address[] memory _users) public onlyOwner {
        for(uint256 i=0; i < _users.length; i++){
            address user = _users[i];
            whitelistedAddresses[user] = true;
        }
    }

    function setBaseURI(string memory _newBaseURI) public onlyOwner {
        baseURI = _newBaseURI;
    }

    function tokenURI(uint256 tokenId) public view override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        return string(abi.encodePacked(_baseURI(), tokenId.toString(), ".json"));
    }

    function setEligibleAirdrop(address[] calldata _users) public onlyOwner {
        delete eligibleAddresses;
        eligibleAddresses = _users;
    }

    //**************************//
    //          MINT            //
    //**************************//

    function preSalesMint(uint256 _count, bytes32 _factionName) internal isOpen("PRESALES", _count) isNotSoldOut(_factionName, _count) {
        require(isWhitelisted(_msgSender()), "User not whitelisted");
        require(int16(balanceSale["PRESALES"][_msgSender()]) <= MAX_WL, "Max per wallet limit (PRESALES)");
        require(int16(balanceFaction[_factionName][_msgSender()]) <= MAX_PER_FACTION, "Max per faction limit");
        _mintCMB(_count, _factionName);
    }

    function publicSalesMint(uint256 _count, bytes32 _factionName) internal isOpen("PUBLIC", _count) isNotSoldOut(_factionName, _count) {
        if(isWhitelisted(_msgSender())) {
            require(int16(balanceSale["PRESALES"][_msgSender()] + balanceSale["PUBLIC"][_msgSender()]) <= MAX_PUBLIC, "Max per wallet limit");
        }
        _mintCMB(_count, _factionName);
    }

    function teamMint(uint256 _amount, bytes32 _factionName) public onlyOwner {
        uint[] memory tokenIdsBought = new uint[](_amount);
        uint256 gorillaIndex = factions[_factionName].firstTokenID;
        for (uint i = 0; i < _amount; i++) {
            _safeMint(_msgSender(), gorillaIndex);
            tokenIdsBought[i] = gorillaIndex;
            factions[_factionName].firstTokenID++;
            factions[_factionName].supplyRemaining--;
            supplyRemaining--;
            gorillaIndex++;
        }

        emit EventCGBMinted(tokenIdsBought, _msgSender());
    }

    function _mintCMB(uint256 _amount, bytes32 _factionName) private {
        uint[] memory tokenIdsBought = new uint[](_amount);
        uint256 gorillaIndex = factions[_factionName].firstTokenID;
        uint totalCost;
        if(saleIsOpen("PUBLIC") && isMember(_msgSender())) {
            totalCost = _amount * FOUNDING_MEMBERS_PRICE;
        } else if (saleIsOpen("PUBLIC") && !isMember(_msgSender())) {
            totalCost = _amount * sales["PUBLIC"].price;
        } else {
            totalCost = _amount * sales["PRESALES"].price;
        }
        uint mintFee = totalCost.mulDiv(FEE, SCALE);
        _asyncTransfer(0x454cfAa623A629CC0b4017aEb85d54C42e91479d, mintFee);

        for (uint i = 0; i < _amount; i++) {
            _safeMint(_msgSender(), gorillaIndex);
            tokenIdsBought[i] = gorillaIndex;
            factions[_factionName].firstTokenID++;
            factions[_factionName].supplyRemaining--;
            supplyRemaining--;
            gorillaIndex++;
        }

        emit EventCGBMinted(tokenIdsBought, _msgSender());
    }

    //*******************************//
    //          INTERFACE            //
    //*******************************//
    function mintCost(address _minter) external override view returns(uint256) {
        if(saleIsOpen("PRESALES") && isWhitelisted(_minter)) {
            return sales["PRESALES"].price;
        } else if (saleIsOpen("PUBLIC") && !isMember(_minter)) {
            return sales["PUBLIC"].price;
        } else if (saleIsOpen("PUBLIC") && isMember(_minter)) {
            return FOUNDING_MEMBERS_PRICE;
        }
    }

    function maxSupply() external override view returns (uint256) {
        return MAX_SUPPLY;
    }

    function canMint(address _minter) external override view returns (uint256, uint256, uint256) {
        if(saleIsOpen("PRESALES") && isWhitelisted(_minter)) {
            return(factions["AQUA"].maxPerFaction - balanceFaction["AQUA"][_minter], factions["IGNIS"].maxPerFaction - balanceFaction["IGNIS"][_minter], factions["TERRA"].maxPerFaction - balanceFaction["TERRA"][_minter]);
        } else if (saleIsOpen("PRESALES") && !isWhitelisted(_minter)) {
            return (0, 0, 0);
        } else if (saleIsOpen("PUBLIC")) {
            return(factions["AQUA"].maxPerFaction - balanceFaction["AQUA"][_minter], factions["IGNIS"].maxPerFaction - balanceFaction["IGNIS"][_minter], factions["TERRA"].maxPerFaction - balanceFaction["TERRA"][_minter]);
        }
    }

    function mint(uint256 _amount, bytes32 _faction) external override payable {
        require(saleIsOpen("PRESALES") || saleIsOpen("PUBLIC"),"Sales are not open");
        if(saleIsOpen("PRESALES")) {
            preSalesMint(_amount, _faction);
        } else if (saleIsOpen("PUBLIC")) {
            publicSalesMint(_amount, _faction);
        }
    }

    function getInfo() external override view returns (Info memory, SupplyRemainingPerFaction memory)  {
        return (Info(sales["PUBLIC"].price, FOUNDING_MEMBERS_PRICE, sales["PRESALES"].price, MAX_SUPPLY, totalSupply(), 15, 5), 
        SupplyRemainingPerFaction(factions["TERRA"].supplyRemaining, factions["AQUA"].supplyRemaining, factions["IGNIS"].supplyRemaining)); 
    }

    //*****************************************//
    //          AIRDROP MAFIA FACTION          //
    //*****************************************//
    function airdrop() public onlyOwner {
        uint256[] memory tokens = getWalletOfOwner(owner());
        require(tokens.length == eligibleAddresses.length, "Number of tokens is different than number of eligible addressses");
        for(uint256 i = 0; i < eligibleAddresses.length; i++) {
            safeTransferFrom(owner(), eligibleAddresses[i], tokens[i]);
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_initBaseURI","type":"string"},{"internalType":"contract ERC1155","name":"_contract","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"indexed":false,"internalType":"address","name":"buyer","type":"address"}],"name":"EventCGBMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"_name","type":"string"},{"components":[{"internalType":"uint64","name":"start","type":"uint64"},{"internalType":"uint64","name":"end","type":"uint64"},{"internalType":"int16","name":"maxPerWallet","type":"int16"},{"internalType":"uint8","name":"maxPerTx","type":"uint8"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"bool","name":"paused","type":"bool"}],"indexed":false,"internalType":"struct CronosGorillaBusiness.Sale","name":"_sale","type":"tuple"}],"name":"EventSaleChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"FOUNDING_MEMBERS_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PER_FACTION","outputs":[{"internalType":"int8","name":"","type":"int8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PUBLIC","outputs":[{"internalType":"int8","name":"","type":"int8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_WL","outputs":[{"internalType":"int8","name":"","type":"int8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"}],"name":"batchWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"canMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"eligibleAddresses","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"factions","outputs":[{"internalType":"uint256","name":"supply","type":"uint256"},{"internalType":"uint256","name":"supplyRemaining","type":"uint256"},{"internalType":"uint256","name":"firstTokenID","type":"uint256"},{"internalType":"uint16","name":"maxPerFaction","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAquaSupplyRemaining","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"getBalanceOfOwner","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getIgnisSupplyRemaining","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getInfo","outputs":[{"components":[{"internalType":"uint256","name":"regularCost","type":"uint256"},{"internalType":"uint256","name":"memberCost","type":"uint256"},{"internalType":"uint256","name":"whitelistCost","type":"uint256"},{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"uint256","name":"totalSupply","type":"uint256"},{"internalType":"uint256","name":"maxMintPerAddress","type":"uint256"},{"internalType":"uint256","name":"maxMintPerTx","type":"uint256"}],"internalType":"struct IDrop.Info","name":"","type":"tuple"},{"components":[{"internalType":"uint256","name":"terraSupplyRemaining","type":"uint256"},{"internalType":"uint256","name":"aquaSupplyRemaining","type":"uint256"},{"internalType":"uint256","name":"ignisSupplyRemaining","type":"uint256"}],"internalType":"struct IDrop.SupplyRemainingPerFaction","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMafiaSupplyRemaining","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTerraSupplyRemaining","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"getWalletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"isEligibleAirdrop","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"isMember","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes32","name":"_faction","type":"bytes32"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"mintCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"address","name":"_wallet","type":"address"}],"name":"minted","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_factionName","type":"bytes32"},{"internalType":"address","name":"_wallet","type":"address"}],"name":"mintedFaction","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"parts","outputs":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"uint256","name":"salePart","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"bool","name":"_pause","type":"bool"}],"name":"pauseSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"dest","type":"address"}],"name":"payments","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"}],"name":"saleIsOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"sales","outputs":[{"internalType":"uint64","name":"start","type":"uint64"},{"internalType":"uint64","name":"end","type":"uint64"},{"internalType":"int16","name":"maxPerWallet","type":"int16"},{"internalType":"uint8","name":"maxPerTx","type":"uint8"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"bool","name":"paused","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"}],"name":"setEligibleAirdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_name","type":"bytes32"},{"components":[{"internalType":"uint256","name":"supply","type":"uint256"},{"internalType":"uint256","name":"supplyRemaining","type":"uint256"},{"internalType":"uint256","name":"firstTokenID","type":"uint256"},{"internalType":"uint16","name":"maxPerFaction","type":"uint16"}],"internalType":"struct CronosGorillaBusiness.Faction","name":"_factionName","type":"tuple"}],"name":"setFaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract ERC1155","name":"_contract","type":"address"}],"name":"setFoundingMemberContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"components":[{"internalType":"uint64","name":"start","type":"uint64"},{"internalType":"uint64","name":"end","type":"uint64"},{"internalType":"int16","name":"maxPerWallet","type":"int16"},{"internalType":"uint8","name":"maxPerTx","type":"uint8"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"bool","name":"paused","type":"bool"}],"internalType":"struct CronosGorillaBusiness.Sale","name":"_sale","type":"tuple"}],"name":"setSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"shareSalesPart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"supplyRemaining","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes32","name":"_factionName","type":"bytes32"}],"name":"teamMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"payee","type":"address"}],"name":"withdrawPayments","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60a06040526812f939c99edab80000600d553480156200001e57600080fd5b50604051620062233803806200622383398101604081905262000041916200087c565b604080518082018252601781527f43726f6e6f7320476f72696c6c6120427573696e65737300000000000000000060208083019182528351808501909452600384526221a3a160e91b908401528151919291620000a191600091620007ab565b508051620000b7906001906020840190620007ab565b505050620000d4620000ce620004a760201b60201c565b620004ab565b60408051808201825273d2ace13fd5ada4351a31cd8a1206c2da3377634d81526101906020808301918252600b805460018082018355600083815295517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db9600293840281810180546001600160a01b03199081166001600160a01b039586161790915597517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dba918201558951808b018b52739822e949a4193ea5442f640a2e3c92c31569acec815260c881890181815288548088018a55898d52925192880280860180548d169488169490941790935551918301919091558a51808c018c527353b4ba1a81744a1c9920b341d6efe6f7d366b583815280890182815288548088018a55898d52915191880280860180548d169388169390931790925551908301558a51808c018c527340ce05b67d50e114cfee3f51c8250483b4a85ff981529788019081528654948501875595909852945191909202938401805490951691161790925590519101555162000269906200083a565b604051809103906000f08015801562000286573d6000803e3d6000fd5b5060601b6001600160601b031916608052620002a282620004fd565b6117d4600c55620002b38162000565565b604080518082018252600881526750524553414c455360c01b602080830191909152825160c0810184526362226fc081526362228bdf918101919091526005928101839052606081019290925268119e47f21381f400006080830152600060a08301526200032191620005d2565b60408051808201825260068152655055424c494360d01b602080830191909152825160c0810184526362228be081526374a209d091810191909152600f92810192909252600560608301526815245655b1025800006080830152600060a08301526200038d91620005d2565b620003d1644d4146494160d81b60405180608001604052806103e881526020016103e8815260200160018152602001600161ffff168152506200071a60201b60201c565b62000415634151554160e01b60405180608001604052806106a481526020016106a481526020016103e98152602001600561ffff168152506200071a60201b60201c565b6200045a6449474e495360d81b60405180608001604052806106a481526020016106a48152602001610a8d8152602001600561ffff168152506200071a60201b60201c565b6200049f64544552524160d81b60405180608001604052806106a481526020016106a481526020016111318152602001600561ffff168152506200071a60201b60201c565b505062000a74565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600a546001600160a01b031633146200054c5760405162461bcd60e51b815260206004820181905260248201526000805160206200620383398151915260448201526064015b60405180910390fd5b80516200056190600e906020840190620007ab565b5050565b600a546001600160a01b03163314620005b05760405162461bcd60e51b8152602060048201819052602482015260008051602062006203833981519152604482015260640162000543565b601080546001600160a01b0319166001600160a01b0392909216919091179055565b600a546001600160a01b031633146200061d5760405162461bcd60e51b8152602060048201819052602482015260008051602062006203833981519152604482015260640162000543565b8060118360405162000630919062000949565b908152604080516020928190038301812084518154948601519386015160608701516001600160401b039283166001600160801b0319909716969096176801000000000000000092909516919091029390931762ffffff60801b1916600160801b61ffff600195860b160260ff60901b191617600160901b60ff9095169490940293909317835560808401519183019190915560a0909201516002909101805460ff19169115159190911790557ffb31df2ce2b2b740f8fb39d618d9828a7cbe8ab00d233ac24e9b200d65b1c981906200070e908490849062000967565b60405180910390a15050565b600a546001600160a01b03163314620007655760405162461bcd60e51b8152602060048201819052602482015260008051602062006203833981519152604482015260640162000543565b60009182526012602090815260409283902082518155908201516001820155918101516002830155606001516003909101805461ffff191661ffff909216919091179055565b828054620007b99062000a21565b90600052602060002090601f016020900481019282620007dd576000855562000828565b82601f10620007f857805160ff191683800117855562000828565b8280016001018555821562000828579182015b82811115620008285782518255916020019190600101906200080b565b506200083692915062000848565b5090565b6105f28062005c1183390190565b5b8082111562000836576000815560010162000849565b80516001600160a01b03811681146200087757600080fd5b919050565b600080604083850312156200089057600080fd5b82516001600160401b0380821115620008a857600080fd5b818501915085601f830112620008bd57600080fd5b815181811115620008d257620008d262000a5e565b604051601f8201601f19908116603f01168101908382118183101715620008fd57620008fd62000a5e565b816040528281528860208487010111156200091757600080fd5b6200092a836020830160208801620009ee565b809650505050505062000940602084016200085f565b90509250929050565b600082516200095d818460208701620009ee565b9190910192915050565b60e08152600083518060e08401526101006200098a8282860160208901620009ee565b80601f19601f8401168501019250505060018060401b0380845116602084015280602085015116604084015250604083015160010b606083015260ff6060840151166080830152608083015160a083015260a0830151151560c08301529392505050565b60005b8381101562000a0b578181015183820152602001620009f1565b8381111562000a1b576000848401525b50505050565b600181811c9082168062000a3657607f821691505b6020821081141562000a5857634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b60805160601c61517062000aa16000396000818161148801528181612558015261407101526151706000f3fe6080604052600436106103855760003560e01c8063644f87e0116101d1578063c87b56dd11610102578063e2982c21116100a0578063ee1217d81161006f578063ee1217d814610bf9578063f2fde38b14610c19578063f77b589714610c39578063fbb37cf214610c5957600080fd5b8063e2982c2114610b29578063e3b7d3f014610b49578063e985e9c514610b90578063eda1d5fd14610bd957600080fd5b8063d052a17a116100dc578063d052a17a14610a90578063d5abeb0114610ab0578063d74f3cdd14610ac5578063e2310ef214610b0957600080fd5b8063c87b56dd14610a31578063c91d5f97146106d1578063c9eb466214610a5157600080fd5b806395d89b411161016f578063a230c52411610149578063a230c52414610996578063b88d4fde146109b6578063c2ba4744146109d6578063c629129114610a1157600080fd5b806395d89b411461094c5780639753eac014610961578063a22cb4651461097657600080fd5b8063715018a6116101ab578063715018a6146108a15780637aabc7ad146108b65780638b167178146108fb5780638da5cb5b1461092e57600080fd5b8063644f87e0146108025780636c0360eb1461086c57806370a082311461088157600080fd5b806331b3eb94116102b657806349708058116102545780635a9b0b89116102235780635a9b0b8914610719578063627fdeab1461079557806362a835d3146107c25780636352211e146107e257600080fd5b806349708058146106915780634f6ccce7146106b15780635447d6ab146106d157806355f804b3146106f957600080fd5b80633af32abf116102905780633af32abf1461060d5780633e38fe801461064657806340f9bbe21461065c57806342842e0e1461067157600080fd5b806331b3eb94146105b85780633884d635146105d857806339ee0661146105ed57600080fd5b80631801fbe5116103235780632168c7f3116102fd5780632168c7f31461051357806323b872dd146105585780632acc659e146105785780632f745c591461059857600080fd5b80631801fbe5146104cb57806318160ddd146104de578063194944db146104f357600080fd5b8063081812fc1161035f578063081812fc1461040a578063095ea7b3146104425780630bb083a3146104625780630df540771461048657600080fd5b806301cacbc81461039157806301ffc9a7146103b357806306fdde03146103e857600080fd5b3661038c57005b600080fd5b34801561039d57600080fd5b506103b16103ac3660046149d0565b610d14565b005b3480156103bf57600080fd5b506103d36103ce3660046148d8565b610e44565b60405190151581526020015b60405180910390f35b3480156103f457600080fd5b506103fd610e6f565b6040516103df9190614c26565b34801561041657600080fd5b5061042a610425366004614808565b610f01565b6040516001600160a01b0390911681526020016103df565b34801561044e57600080fd5b506103b161045d3660046146b0565b610f96565b34801561046e57600080fd5b50610478600d5481565b6040519081526020016103df565b34801561049257600080fd5b50644d4146494160d81b60005260126020527f8fc3ab03aed3ee5e1eed98e4d8237d0754b6a2de17a47398569d8970f509c13f54610478565b6103b16104d9366004614ab4565b6110ac565b3480156104ea57600080fd5b50600854610478565b3480156104ff57600080fd5b506103d361050e366004614912565b6111b5565b34801561051f57600080fd5b5064544552524160d81b60005260126020527ff61e0e1d233594d59b5059e484e59b11848f122502eab150a2fe7e696b60832654610478565b34801561056457600080fd5b506103b16105733660046145bb565b611286565b34801561058457600080fd5b50610478610593366004614565565b6112b7565b3480156105a457600080fd5b506104786105b33660046146b0565b6113d3565b3480156105c457600080fd5b506103b16105d3366004614565565b611469565b3480156105e457600080fd5b506103b16114e7565b3480156105f957600080fd5b506103b1610608366004614750565b611629565b34801561061957600080fd5b506103d3610628366004614565565b6001600160a01b031660009081526013602052604090205460ff1690565b34801561065257600080fd5b50610478600c5481565b34801561066857600080fd5b506103b16116b4565b34801561067d57600080fd5b506103b161068c3660046145bb565b61181a565b34801561069d57600080fd5b506103b16106ac366004614565565b611835565b3480156106bd57600080fd5b506104786106cc366004614808565b611881565b3480156106dd57600080fd5b506106e6600581565b60405160009190910b81526020016103df565b34801561070557600080fd5b506103b1610714366004614912565b611914565b34801561072557600080fd5b5061072e611951565b6040805183518152602080850151818301528483015182840152606080860151908301526080808601519083015260a0808601519083015260c09485015194820194909452825160e0820152928201516101008401520151610120820152610140016103df565b3480156107a157600080fd5b506107b56107b0366004614565565b611aec565b6040516103df9190614be9565b3480156107ce57600080fd5b506103b16107dd366004614846565b611b8d565b3480156107ee57600080fd5b5061042a6107fd366004614808565b611bfd565b34801561080e57600080fd5b5061084861081d366004614808565b60126020526000908152604090208054600182015460028301546003909301549192909161ffff1684565b6040805194855260208501939093529183015261ffff1660608201526080016103df565b34801561087857600080fd5b506103fd611c74565b34801561088d57600080fd5b5061047861089c366004614565565b611d02565b3480156108ad57600080fd5b506103b1611d89565b3480156108c257600080fd5b506449474e495360d81b60005260126020527f1aae87e584dedaeacca51cf1d93d8c0c01f36938a95ad4a5e3d0b0c77e3a36c854610478565b34801561090757600080fd5b5061091b610916366004614946565b611dbf565b60405161ffff90911681526020016103df565b34801561093a57600080fd5b50600a546001600160a01b031661042a565b34801561095857600080fd5b506103fd611e04565b34801561096d57600080fd5b506106e6600f81565b34801561098257600080fd5b506103b161099136600461467b565b611e13565b3480156109a257600080fd5b506103d36109b1366004614565565b611e1e565b3480156109c257600080fd5b506103b16109d13660046145fc565b611f35565b3480156109e257600080fd5b506109f66109f1366004614565565b611f6d565b604080519384526020840192909252908201526060016103df565b348015610a1d57600080fd5b506103b1610a2c366004614ab4565b61225f565b348015610a3d57600080fd5b506103fd610a4c366004614808565b6123d1565b348015610a5d57600080fd5b50610a71610a6c366004614808565b612488565b604080516001600160a01b0390931683526020830191909152016103df565b348015610a9c57600080fd5b506103b1610aab36600461498c565b6124c0565b348015610abc57600080fd5b506117d4610478565b348015610ad157600080fd5b50634151554160e01b60005260126020527f96563b19bcf08b1704e3677350af29cdaad4e842728f9637f400cb57f39496ec54610478565b348015610b1557600080fd5b50610478610b24366004614565565b612522565b348015610b3557600080fd5b50610478610b44366004614565565b612536565b348015610b5557600080fd5b5061091b610b64366004614821565b60009182526015602090815260408084206001600160a01b0393909316845291905290205461ffff1690565b348015610b9c57600080fd5b506103d3610bab366004614582565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b348015610be557600080fd5b5061042a610bf4366004614808565b6125d4565b348015610c0557600080fd5b506103d3610c14366004614565565b6125fe565b348015610c2557600080fd5b506103b1610c34366004614565565b612668565b348015610c4557600080fd5b506103b1610c543660046146dc565b612700565b348015610c6557600080fd5b50610cce610c74366004614912565b8051602081830181018051601182529282019190930120915280546001808301546002909301546001600160401b0380841694600160401b850490911693600160801b810490930b92600160901b900460ff908116921686565b604080516001600160401b03978816815296909516602087015260019390930b9385019390935260ff1660608401526080830191909152151560a082015260c0016103df565b600a546001600160a01b03163314610d475760405162461bcd60e51b8152600401610d3e90614e20565b60405180910390fd5b80601183604051610d589190614b3d565b908152604080516020928190038301812084518154948601519386015160608701516001600160401b039283166fffffffffffffffffffffffffffffffff1990971696909617600160401b92909516919091029390931762ffffff60801b1916600160801b61ffff600195860b160260ff60901b191617600160901b60ff9095169490940293909317835560808401519183019190915560a0909201516002909101805460ff19169115159190911790557ffb31df2ce2b2b740f8fb39d618d9828a7cbe8ab00d233ac24e9b200d65b1c98190610e389084908490614c39565b60405180910390a15050565b60006001600160e01b0319821663780e9d6360e01b1480610e695750610e6982612742565b92915050565b606060008054610e7e90615017565b80601f0160208091040260200160405190810160405280929190818152602001828054610eaa90615017565b8015610ef75780601f10610ecc57610100808354040283529160200191610ef7565b820191906000526020600020905b815481529060010190602001808311610eda57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610f7a5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610d3e565b506000908152600460205260409020546001600160a01b031690565b6000610fa182611bfd565b9050806001600160a01b0316836001600160a01b0316141561100f5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610d3e565b336001600160a01b038216148061102b575061102b8133610bab565b61109d5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610d3e565b6110a78383612792565b505050565b6110d56040518060400160405280600881526020016750524553414c455360c01b8152506111b5565b806111025750611102604051806040016040528060068152602001655055424c494360d01b8152506111b5565b6111435760405162461bcd60e51b815260206004820152601260248201527129b0b632b99030b932903737ba1037b832b760711b6044820152606401610d3e565b61116c6040518060400160405280600881526020016750524553414c455360c01b8152506111b5565b1561117f5761117b8282612800565b5050565b6111a6604051806040016040528060068152602001655055424c494360d01b8152506111b5565b1561117b5761117b8282612eca565b6000806011836040516111c89190614b3d565b908152604051908190036020019020546001600160401b031611801561121657506011826040516111f99190614b3d565b908152604051908190036020019020546001600160401b03164210155b8015611252575060118260405161122d9190614b3d565b908152604051908190036020019020546001600160401b03600160401b909104164211155b8015610e6957506011826040516112699190614b3d565b9081526040519081900360200190206002015460ff161592915050565b611290338261350e565b6112ac5760405162461bcd60e51b8152600401610d3e90614e55565b6110a7838383613605565b60006112e26040518060400160405280600881526020016750524553414c455360c01b8152506111b5565b801561130657506001600160a01b03821660009081526013602052604090205460ff165b1561133257601160405161131990614b98565b9081526020016040518091039020600101549050919050565b611359604051806040016040528060068152602001655055424c494360d01b8152506111b5565b801561136b575061136982611e1e565b155b1561138a57604051655055424c494360d01b8152601190600601611319565b6113b1604051806040016040528060068152602001655055424c494360d01b8152506111b5565b80156113c157506113c182611e1e565b156113ce575050600d5490565b919050565b60006113de83611d02565b82106114405760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610d3e565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6040516351cff8d960e01b81526001600160a01b0382811660048301527f000000000000000000000000000000000000000000000000000000000000000016906351cff8d990602401600060405180830381600087803b1580156114cc57600080fd5b505af11580156114e0573d6000803e3d6000fd5b5050505050565b600a546001600160a01b031633146115115760405162461bcd60e51b8152600401610d3e90614e20565b60006115286107b0600a546001600160a01b031690565b600f548151919250146115a5576040805162461bcd60e51b81526020600482015260248101919091527f4e756d626572206f6620746f6b656e7320697320646966666572656e7420746860448201527f616e206e756d626572206f6620656c696769626c6520616464726573737365736064820152608401610d3e565b60005b600f5481101561117b576116176115c7600a546001600160a01b031690565b600f83815481106115da576115da6150e3565b9060005260206000200160009054906101000a90046001600160a01b031684848151811061160a5761160a6150e3565b602002602001015161181a565b8061162181615052565b9150506115a8565b600a546001600160a01b031633146116535760405162461bcd60e51b8152600401610d3e90614e20565b60005b815181101561117b576000828281518110611673576116736150e3565b6020908102919091018101516001600160a01b03166000908152601390915260409020805460ff1916600117905550806116ac81615052565b915050611656565b600a546001600160a01b031633146116de5760405162461bcd60e51b8152600401610d3e90614e20565b47806117205760405162461bcd60e51b8152602060048201526011602482015270053616c65732042616c616e6365203d203607c1b6044820152606401610d3e565b60005b600b5460ff821610156117fb576000600b8260ff1681548110611748576117486150e3565b90600052602060002090600202016001015411156117e9576117e9600b8260ff1681548110611779576117796150e3565b906000526020600020906002020160000160009054906101000a90046001600160a01b03166117e46103e86117de600b8660ff16815481106117bd576117bd6150e3565b906000526020600020906002020160010154876137ac90919063ffffffff16565b906137bf565b6137cb565b806117f38161506d565b915050611723565b50611817611811600a546001600160a01b031690565b476137cb565b50565b6110a783838360405180602001604052806000815250611f35565b600a546001600160a01b0316331461185f5760405162461bcd60e51b8152600401610d3e90614e20565b601080546001600160a01b0319166001600160a01b0392909216919091179055565b600061188c60085490565b82106118ef5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610d3e565b60088281548110611902576119026150e3565b90600052602060002001549050919050565b600a546001600160a01b0316331461193e5760405162461bcd60e51b8152600401610d3e90614e20565b805161117b90600e9060208401906143bd565b6119916040518060e00160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6119b560405180606001604052806000815260200160008152602001600081525090565b6040518060e0016040528060116040516119db90655055424c494360d01b815260060190565b9081526020016040518091039020600101548152602001600d5481526020016011604051611a0890614b98565b90815260200160405180910390206001015481526020016117d46fffffffffffffffffffffffffffffffff168152602001611a4260085490565b8152600f602080830191909152600560409283015281516060810183527ff61e0e1d233594d59b5059e484e59b11848f122502eab150a2fe7e696b6083265481527f96563b19bcf08b1704e3677350af29cdaad4e842728f9637f400cb57f39496ec54818301526449474e495360d81b60005260129091527f1aae87e584dedaeacca51cf1d93d8c0c01f36938a95ad4a5e3d0b0c77e3a36c8549181019190915290939092509050565b60606000611af983611d02565b90506000816001600160401b03811115611b1557611b156150f9565b604051908082528060200260200182016040528015611b3e578160200160208202803683370190505b50905060005b82811015611b8557611b5685826113d3565b828281518110611b6857611b686150e3565b602090810291909101015280611b7d81615052565b915050611b44565b509392505050565b600a546001600160a01b03163314611bb75760405162461bcd60e51b8152600401610d3e90614e20565b60009182526012602090815260409283902082518155908201516001820155918101516002830155606001516003909101805461ffff191661ffff909216919091179055565b6000818152600260205260408120546001600160a01b031680610e695760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610d3e565b600e8054611c8190615017565b80601f0160208091040260200160405190810160405280929190818152602001828054611cad90615017565b8015611cfa5780601f10611ccf57610100808354040283529160200191611cfa565b820191906000526020600020905b815481529060010190602001808311611cdd57829003601f168201915b505050505081565b60006001600160a01b038216611d6d5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610d3e565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b03163314611db35760405162461bcd60e51b8152600401610d3e90614e20565b611dbd6000613861565b565b6000601483604051611dd19190614b3d565b908152604080519182900360209081019092206001600160a01b0385166000908152925290205461ffff16905092915050565b606060018054610e7e90615017565b61117b3383836138b3565b601054604051627eeac760e11b81526001600160a01b03838116600483015260016024830152600092839291169062fdd58e9060440160206040518083038186803b158015611e6c57600080fd5b505afa158015611e80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ea49190614a9b565b1180610e695750601054604051627eeac760e11b81526001600160a01b03848116600483015260026024830152600092169062fdd58e9060440160206040518083038186803b158015611ef657600080fd5b505afa158015611f0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f2e9190614a9b565b1192915050565b611f3f338361350e565b611f5b5760405162461bcd60e51b8152600401610d3e90614e55565b611f6784848484613982565b50505050565b6000806000611f9b6040518060400160405280600881526020016750524553414c455360c01b8152506111b5565b8015611fbf57506001600160a01b03841660009081526013602052604090205460ff165b1561214f576001600160a01b03841660009081527f7da2a6012ae29f3bbcb9e2ef9696e4ff93782787de0efa3d4dea99aeae32e93a60209081526040822054634151554160e01b909252601290527f96563b19bcf08b1704e3677350af29cdaad4e842728f9637f400cb57f39496ee546120409161ffff9081169116614f9a565b6001600160a01b03851660009081527ff87038c24676223112dc6723b0cf6825cc936dfc5d8d11b7a8e0c9b84057ca6f602090815260408220546449474e495360d81b909252601290527f1aae87e584dedaeacca51cf1d93d8c0c01f36938a95ad4a5e3d0b0c77e3a36ca546120bd9161ffff9081169116614f9a565b6001600160a01b03861660009081527f25898c31129ca3e71f92437e493585dfab87ff9672d5432b28892d5e6abf6cf06020908152604082205464544552524160d81b909252601290527ff61e0e1d233594d59b5059e484e59b11848f122502eab150a2fe7e696b6083285461213a9161ffff9081169116614f9a565b61ffff92831695509082169350169050612258565b6121786040518060400160405280600881526020016750524553414c455360c01b8152506111b5565b801561219d57506001600160a01b03841660009081526013602052604090205460ff16155b156121b057506000915081905080612258565b6121d7604051806040016040528060068152602001655055424c494360d01b8152506111b5565b15612258576001600160a01b03841660009081527f7da2a6012ae29f3bbcb9e2ef9696e4ff93782787de0efa3d4dea99aeae32e93a60209081526040822054634151554160e01b909252601290527f96563b19bcf08b1704e3677350af29cdaad4e842728f9637f400cb57f39496ee546120409161ffff9081169116614f9a565b9193909250565b600a546001600160a01b031633146122895760405162461bcd60e51b8152600401610d3e90614e20565b6000826001600160401b038111156122a3576122a36150f9565b6040519080825280602002602001820160405280156122cc578160200160208202803683370190505b506000838152601260205260408120600201549192505b84811015612391576122f533836139b5565b81838281518110612308576123086150e3565b602090810291909101810191909152600085815260129091526040812060020180549161233483615052565b9091555050600084815260126020526040812060010180549161235683615000565b9091555050600c805490600061236b83615000565b9190505550818061237b90615052565b925050808061238990615052565b9150506122e3565b507f6d49b7559536b5599481ddc561b6ddcbff7f7cf41288b9f8a77eaa13a247644e82336040516123c3929190614bfc565b60405180910390a150505050565b6000818152600260205260409020546060906001600160a01b03166124505760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610d3e565b6124586139cf565b612461836139de565b604051602001612472929190614b59565b6040516020818303038152906040529050919050565b600b818154811061249857600080fd5b6000918252602090912060029091020180546001909101546001600160a01b03909116915082565b600a546001600160a01b031633146124ea5760405162461bcd60e51b8152600401610d3e90614e20565b806011836040516124fb9190614b3d565b908152604051908190036020019020600201805491151560ff199092169190911790555050565b60008061252e83611aec565b519392505050565b6040516371d4ed8d60e11b81526001600160a01b0382811660048301526000917f00000000000000000000000000000000000000000000000000000000000000009091169063e3a9db1a9060240160206040518083038186803b15801561259c57600080fd5b505afa1580156125b0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e699190614a9b565b600f81815481106125e457600080fd5b6000918252602090912001546001600160a01b0316905081565b6000805b600f5481101561265f57826001600160a01b0316600f8281548110612629576126296150e3565b6000918252602090912001546001600160a01b0316141561264d5750600192915050565b8061265781615052565b915050612602565b50600092915050565b600a546001600160a01b031633146126925760405162461bcd60e51b8152600401610d3e90614e20565b6001600160a01b0381166126f75760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610d3e565b61181781613861565b600a546001600160a01b0316331461272a5760405162461bcd60e51b8152600401610d3e90614e20565b612736600f6000614441565b6110a7600f838361445f565b60006001600160e01b031982166380ac58cd60e01b148061277357506001600160e01b03198216635b5e139f60e01b145b80610e6957506301ffc9a760e01b6001600160e01b0319831614610e69565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906127c782611bfd565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6040518060400160405280600881526020016750524553414c455360c01b8152508261282b826111b5565b6128685760405162461bcd60e51b815260206004820152600e60248201526d29b0b632b9903737ba1037b832b760911b6044820152606401610d3e565b600081116128885760405162461bcd60e51b8152600401610d3e90614ca3565b600c548111156128aa5760405162461bcd60e51b8152600401610d3e90614dd3565b6000600c54116128f55760405162461bcd60e51b815260206004820152601660248201527510dbdb1b1958dd1a5bdb881a5cc814dbdb190813dd5d60521b6044820152606401610d3e565b6011826040516129059190614b3d565b9081526040519081900360200190205460ff600160901b909104168111156129625760405162461bcd60e51b815260206004820152601060248201526f13585e081c195c881d1e081b1a5b5a5d60821b6044820152606401610d3e565b6011826040516129729190614b3d565b90815260405190819003602001812054600160801b9004600190810b900b9082906014906129a1908690614b3d565b908152602001604051809103902060006129b83390565b6001600160a01b031681526020810191909152604001600020546129e0919061ffff16614f29565b60010b1315612a015760405162461bcd60e51b8152600401610d3e90614ccf565b6011604051612a0f90614b98565b908152604051908190036020019020546001600160401b03600160401b9091041642118015612a425750612a4233611e1e565b15612a795780600d54612a559190614f7b565b341015612a745760405162461bcd60e51b8152600401610d3e90614ea6565b612ac5565b80601183604051612a8a9190614b3d565b908152602001604051809103902060010154612aa69190614f7b565b341015612ac55760405162461bcd60e51b8152600401610d3e90614ea6565b80601483604051612ad69190614b3d565b90815260200160405180910390206000612aed3390565b6001600160a01b03168152602081019190915260400160009081208054909190612b1c90849061ffff16614f29565b92506101000a81548161ffff021916908361ffff1602179055508284644d4146494160d81b604051602001612b5391815260200190565b60408051601f1981840301815282825280516020918201209083018590529101604051602081830303815290604052805190602001201415612bd75760405162461bcd60e51b815260206004820152601a60248201527f43616e206e6f74206d696e74204d616669612046616374696f6e0000000000006044820152606401610d3e565b60008111612bf75760405162461bcd60e51b8152600401610d3e90614ca3565b60008281526012602052604090206003015461ffff16811115612c2c5760405162461bcd60e51b8152600401610d3e90614cfd565b600082815260126020526040902060010154612c8a5760405162461bcd60e51b815260206004820152601a60248201527f46616374696f6e20737570706c7920697320536f6c64204f75740000000000006044820152606401610d3e565b600082815260126020526040902060010154811115612cbb5760405162461bcd60e51b8152600401610d3e90614d7e565b600082815260126020908152604080832060030154601583528184203385529092529091205461ffff91821660010b91612cf791849116614f29565b60010b1315612d485760405162461bcd60e51b815260206004820152601e60248201527f4d6178207065722077616c6c6574206c696d6974202846616374696f6e2900006044820152606401610d3e565b600082815260156020908152604080832033845290915281208054839290612d7590849061ffff16614f29565b92506101000a81548161ffff021916908361ffff160217905550612d996106283390565b612ddc5760405162461bcd60e51b8152602060048201526014602482015273155cd95c881b9bdd081dda1a5d195b1a5cdd195960621b6044820152606401610d3e565b600560000b6014604051612def90614b98565b90815260200160405180910390206000612e063390565b6001600160a01b0316815260208101919091526040016000205461ffff1660010b1315612e755760405162461bcd60e51b815260206004820152601f60248201527f4d6178207065722077616c6c6574206c696d6974202850524553414c455329006044820152606401610d3e565b6000858152601560209081526040808320338452909152902054600561ffff90911660010b1315612eb85760405162461bcd60e51b8152600401610d3e90614cfd565b612ec28686613adb565b505050505050565b604051806040016040528060068152602001655055424c494360d01b81525082612ef3826111b5565b612f305760405162461bcd60e51b815260206004820152600e60248201526d29b0b632b9903737ba1037b832b760911b6044820152606401610d3e565b60008111612f505760405162461bcd60e51b8152600401610d3e90614ca3565b600c54811115612f725760405162461bcd60e51b8152600401610d3e90614dd3565b6000600c5411612fbd5760405162461bcd60e51b815260206004820152601660248201527510dbdb1b1958dd1a5bdb881a5cc814dbdb190813dd5d60521b6044820152606401610d3e565b601182604051612fcd9190614b3d565b9081526040519081900360200190205460ff600160901b9091041681111561302a5760405162461bcd60e51b815260206004820152601060248201526f13585e081c195c881d1e081b1a5b5a5d60821b6044820152606401610d3e565b60118260405161303a9190614b3d565b90815260405190819003602001812054600160801b9004600190810b900b908290601490613069908690614b3d565b908152602001604051809103902060006130803390565b6001600160a01b031681526020810191909152604001600020546130a8919061ffff16614f29565b60010b13156130c95760405162461bcd60e51b8152600401610d3e90614ccf565b60116040516130d790614b98565b908152604051908190036020019020546001600160401b03600160401b909104164211801561310a575061310a33611e1e565b156131415780600d5461311d9190614f7b565b34101561313c5760405162461bcd60e51b8152600401610d3e90614ea6565b61318d565b806011836040516131529190614b3d565b90815260200160405180910390206001015461316e9190614f7b565b34101561318d5760405162461bcd60e51b8152600401610d3e90614ea6565b8060148360405161319e9190614b3d565b908152602001604051809103902060006131b53390565b6001600160a01b031681526020810191909152604001600090812080549091906131e490849061ffff16614f29565b92506101000a81548161ffff021916908361ffff1602179055508284644d4146494160d81b60405160200161321b91815260200190565b60408051601f198184030181528282528051602091820120908301859052910160405160208183030381529060405280519060200120141561329f5760405162461bcd60e51b815260206004820152601a60248201527f43616e206e6f74206d696e74204d616669612046616374696f6e0000000000006044820152606401610d3e565b600081116132bf5760405162461bcd60e51b8152600401610d3e90614ca3565b60008281526012602052604090206003015461ffff168111156132f45760405162461bcd60e51b8152600401610d3e90614cfd565b6000828152601260205260409020600101546133525760405162461bcd60e51b815260206004820152601a60248201527f46616374696f6e20737570706c7920697320536f6c64204f75740000000000006044820152606401610d3e565b6000828152601260205260409020600101548111156133835760405162461bcd60e51b8152600401610d3e90614d7e565b600082815260126020908152604080832060030154601583528184203385529092529091205461ffff91821660010b916133bf91849116614f29565b60010b13156134105760405162461bcd60e51b815260206004820152601e60248201527f4d6178207065722077616c6c6574206c696d6974202846616374696f6e2900006044820152606401610d3e565b60008281526015602090815260408083203384529091528120805483929061343d90849061ffff16614f29565b92506101000a81548161ffff021916908361ffff1602179055506134616106283390565b15612eb85760408051655055424c494360d01b815260146006820181905282519182900360260182203360009081526020919091529290922054600f9261ffff909116916134ae90614b98565b908152602001604051809103902060006134c53390565b6001600160a01b031681526020810191909152604001600020546134ed919061ffff16614f29565b60010b1315612eb85760405162461bcd60e51b8152600401610d3e90614ccf565b6000818152600260205260408120546001600160a01b03166135875760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610d3e565b600061359283611bfd565b9050806001600160a01b0316846001600160a01b031614806135cd5750836001600160a01b03166135c284610f01565b6001600160a01b0316145b806135fd57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661361882611bfd565b6001600160a01b03161461367c5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610d3e565b6001600160a01b0382166136de5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610d3e565b6136e9838383613d4e565b6136f4600082612792565b6001600160a01b038316600090815260036020526040812080546001929061371d908490614fbd565b90915550506001600160a01b038216600090815260036020526040812080546001929061374b908490614f4f565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60006137b88284614f7b565b9392505050565b60006137b88284614f67565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114613818576040519150601f19603f3d011682016040523d82523d6000602084013e61381d565b606091505b50509050806110a75760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b6044820152606401610d3e565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031614156139155760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610d3e565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61398d848484613605565b61399984848484613e06565b611f675760405162461bcd60e51b8152600401610d3e90614d2c565b61117b828260405180602001604052806000815250613f13565b6060600e8054610e7e90615017565b606081613a025750506040805180820190915260018152600360fc1b602082015290565b8160005b8115613a2c5780613a1681615052565b9150613a259050600a83614f67565b9150613a06565b6000816001600160401b03811115613a4657613a466150f9565b6040519080825280601f01601f191660200182016040528015613a70576020820181803683370190505b5090505b84156135fd57613a85600183614fbd565b9150613a92600a8661508d565b613a9d906030614f4f565b60f81b818381518110613ab257613ab26150e3565b60200101906001600160f81b031916908160001a905350613ad4600a86614f67565b9450613a74565b6000826001600160401b03811115613af557613af56150f9565b604051908082528060200260200182016040528015613b1e578160200160208202803683370190505b5090506000601260008481526020019081526020016000206002015490506000613b65604051806040016040528060068152602001655055424c494360d01b8152506111b5565b8015613b755750613b7533611e1e565b15613b8e57600d54613b879086614f7b565b9050613c2a565b613bb5604051806040016040528060068152602001655055424c494360d01b8152506111b5565b8015613bc75750613bc533611e1e565b155b15613bfc5760408051655055424c494360d01b815260116006820152905190819003602601902060010154613b879086614f7b565b6011604051613c0a90614b98565b90815260200160405180910390206001015485613c279190614f7b565b90505b6000613c3b826103e8612710613f46565b9050613c5b73454cfaa623a629cc0b4017aeb85d54c42e91479d82614052565b60005b86811015613d0c57613c7033856139b5565b83858281518110613c8357613c836150e3565b6020908102919091018101919091526000878152601290915260408120600201805491613caf83615052565b90915550506000868152601260205260408120600101805491613cd183615000565b9091555050600c8054906000613ce683615000565b91905055508380613cf690615052565b9450508080613d0490615052565b915050613c5e565b507f6d49b7559536b5599481ddc561b6ddcbff7f7cf41288b9f8a77eaa13a247644e8433604051613d3e929190614bfc565b60405180910390a1505050505050565b6001600160a01b038316613da957613da481600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b613dcc565b816001600160a01b0316836001600160a01b031614613dcc57613dcc83826140d3565b6001600160a01b038216613de3576110a781614170565b826001600160a01b0316826001600160a01b0316146110a7576110a7828261421f565b60006001600160a01b0384163b15613f0857604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290613e4a903390899088908890600401614bac565b602060405180830381600087803b158015613e6457600080fd5b505af1925050508015613e94575060408051601f3d908101601f19168201909252613e91918101906148f5565b60015b613eee573d808015613ec2576040519150601f19603f3d011682016040523d82523d6000602084013e613ec7565b606091505b508051613ee65760405162461bcd60e51b8152600401610d3e90614d2c565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506135fd565b506001949350505050565b613f1d8383614263565b613f2a6000848484613e06565b6110a75760405162461bcd60e51b8152600401610d3e90614d2c565b6000808211613f8a5760405162461bcd60e51b815260206004820152601060248201526f4469766973696f6e206279207a65726f60801b6044820152606401610d3e565b83613f97575060006137b8565b6000613fa38486614f7b565b905083613fb08683614f67565b1415613fc857613fc08382614f67565b9150506137b8565b6000613fd48487614f67565b90506000613fe2858861508d565b90506000613ff08688614f67565b90506000613ffe878961508d565b9050614045614011886117de86856137ac565b61403f61401e86866137ac565b61403f61402b89876137ac565b61403f8d6140398c8b6137ac565b906137ac565b906143b1565b9998505050505050505050565b60405163f340fa0160e01b81526001600160a01b0383811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063f340fa019083906024016000604051808303818588803b1580156140b657600080fd5b505af11580156140ca573d6000803e3d6000fd5b50505050505050565b600060016140e084611d02565b6140ea9190614fbd565b60008381526007602052604090205490915080821461413d576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061418290600190614fbd565b600083815260096020526040812054600880549394509092849081106141aa576141aa6150e3565b9060005260206000200154905080600883815481106141cb576141cb6150e3565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480614203576142036150cd565b6001900381819060005260206000200160009055905550505050565b600061422a83611d02565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b0382166142b95760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610d3e565b6000818152600260205260409020546001600160a01b03161561431e5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610d3e565b61432a60008383613d4e565b6001600160a01b0382166000908152600360205260408120805460019290614353908490614f4f565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006137b88284614f4f565b8280546143c990615017565b90600052602060002090601f0160209004810192826143eb5760008555614431565b82601f1061440457805160ff1916838001178555614431565b82800160010185558215614431579182015b82811115614431578251825591602001919060010190614416565b5061443d9291506144b2565b5090565b508054600082559060005260206000209081019061181791906144b2565b828054828255906000526020600020908101928215614431579160200282015b828111156144315781546001600160a01b0319166001600160a01b0384351617825560209092019160019091019061447f565b5b8082111561443d57600081556001016144b3565b60006001600160401b038311156144e0576144e06150f9565b6144f3601f8401601f1916602001614ef9565b905082815283838301111561450757600080fd5b828260208301376000602084830101529392505050565b803580151581146113ce57600080fd5b600082601f83011261453f57600080fd5b6137b8838335602085016144c7565b80356001600160401b03811681146113ce57600080fd5b60006020828403121561457757600080fd5b81356137b88161510f565b6000806040838503121561459557600080fd5b82356145a08161510f565b915060208301356145b08161510f565b809150509250929050565b6000806000606084860312156145d057600080fd5b83356145db8161510f565b925060208401356145eb8161510f565b929592945050506040919091013590565b6000806000806080858703121561461257600080fd5b843561461d8161510f565b9350602085013561462d8161510f565b92506040850135915060608501356001600160401b0381111561464f57600080fd5b8501601f8101871361466057600080fd5b61466f878235602084016144c7565b91505092959194509250565b6000806040838503121561468e57600080fd5b82356146998161510f565b91506146a76020840161451e565b90509250929050565b600080604083850312156146c357600080fd5b82356146ce8161510f565b946020939093013593505050565b600080602083850312156146ef57600080fd5b82356001600160401b038082111561470657600080fd5b818501915085601f83011261471a57600080fd5b81358181111561472957600080fd5b8660208260051b850101111561473e57600080fd5b60209290920196919550909350505050565b6000602080838503121561476357600080fd5b82356001600160401b038082111561477a57600080fd5b818501915085601f83011261478e57600080fd5b8135818111156147a0576147a06150f9565b8060051b91506147b1848301614ef9565b8181528481019084860184860187018a10156147cc57600080fd5b600095505b838610156147fb57803594506147e68561510f565b848352600195909501949186019186016147d1565b5098975050505050505050565b60006020828403121561481a57600080fd5b5035919050565b6000806040838503121561483457600080fd5b8235915060208301356145b08161510f565b60008082840360a081121561485a57600080fd5b833592506080601f198201121561487057600080fd5b50604051608081018181106001600160401b0382111715614893576148936150f9565b8060405250602084013581526040840135602082015260608401356040820152608084013561ffff811681146148c857600080fd5b6060820152919491935090915050565b6000602082840312156148ea57600080fd5b81356137b881615124565b60006020828403121561490757600080fd5b81516137b881615124565b60006020828403121561492457600080fd5b81356001600160401b0381111561493a57600080fd5b6135fd8482850161452e565b6000806040838503121561495957600080fd5b82356001600160401b0381111561496f57600080fd5b61497b8582860161452e565b92505060208301356145b08161510f565b6000806040838503121561499f57600080fd5b82356001600160401b038111156149b557600080fd5b6149c18582860161452e565b9250506146a76020840161451e565b60008082840360e08112156149e457600080fd5b83356001600160401b038111156149fa57600080fd5b614a068682870161452e565b93505060c0601f1982011215614a1b57600080fd5b50614a24614ed1565b614a306020850161454e565b8152614a3e6040850161454e565b602082015260608401358060010b8114614a5757600080fd5b6040820152608084013560ff81168114614a7057600080fd5b606082015260a08401356080820152614a8b60c0850161451e565b60a0820152809150509250929050565b600060208284031215614aad57600080fd5b5051919050565b60008060408385031215614ac757600080fd5b50508035926020909101359150565b600081518084526020808501945080840160005b83811015614b0657815187529582019590820190600101614aea565b509495945050505050565b60008151808452614b29816020860160208601614fd4565b601f01601f19169290920160200192915050565b60008251614b4f818460208701614fd4565b9190910192915050565b60008351614b6b818460208801614fd4565b835190830190614b7f818360208801614fd4565b64173539b7b760d91b9101908152600501949350505050565b6750524553414c455360c01b815260080190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090614bdf90830184614b11565b9695505050505050565b6020815260006137b86020830184614ad6565b604081526000614c0f6040830185614ad6565b905060018060a01b03831660208301529392505050565b6020815260006137b86020830184614b11565b60e081526000614c4c60e0830185614b11565b90506001600160401b0380845116602084015280602085015116604084015250604083015160010b606083015260ff6060840151166080830152608083015160a083015260a0830151151560c08301529392505050565b60208082526012908201527110d85b881b9bdd081b5a5b9d080c0813919560721b604082015260600190565b60208082526014908201527313585e081c195c881dd85b1b195d081b1a5b5a5d60621b604082015260600190565b60208082526015908201527413585e081c195c88199858dd1a5bdb881b1a5b5a5d605a1b604082015260600190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526035908201527f45786365656473206d6178696d756d2066616374696f6e20737570706c792e2060408201527454727920746f206d696e74206c657373204e46547360581b606082015260800190565b6020808252602d908201527f45786365656473206d6178696d756d20737570706c792e2054727920746f206d60408201526c696e74206c657373204e46547360981b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b602080825260119082015270496e737566696369656e742066756e647360781b604082015260600190565b60405160c081016001600160401b0381118282101715614ef357614ef36150f9565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614f2157614f216150f9565b604052919050565b600061ffff808316818516808303821115614f4657614f466150a1565b01949350505050565b60008219821115614f6257614f626150a1565b500190565b600082614f7657614f766150b7565b500490565b6000816000190483118215151615614f9557614f956150a1565b500290565b600061ffff83811690831681811015614fb557614fb56150a1565b039392505050565b600082821015614fcf57614fcf6150a1565b500390565b60005b83811015614fef578181015183820152602001614fd7565b83811115611f675750506000910152565b60008161500f5761500f6150a1565b506000190190565b600181811c9082168061502b57607f821691505b6020821081141561504c57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415615066576150666150a1565b5060010190565b600060ff821660ff811415615084576150846150a1565b60010192915050565b60008261509c5761509c6150b7565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461181757600080fd5b6001600160e01b03198116811461181757600080fdfea26469706673582212205c1fc93e8a6159c6bd22e6a0c0541cdd82eebc38c9c82181ada738b0cc59037864736f6c63430008070033608060405234801561001057600080fd5b5061001a3361001f565b61006f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6105748061007e6000396000f3fe6080604052600436106100555760003560e01c806351cff8d91461005a578063715018a61461007c5780638da5cb5b14610091578063e3a9db1a146100be578063f2fde38b14610102578063f340fa0114610122575b600080fd5b34801561006657600080fd5b5061007a6100753660046104aa565b610135565b005b34801561008857600080fd5b5061007a6101d7565b34801561009d57600080fd5b506000546040516001600160a01b0390911681526020015b60405180910390f35b3480156100ca57600080fd5b506100f46100d93660046104aa565b6001600160a01b031660009081526001602052604090205490565b6040519081526020016100b5565b34801561010e57600080fd5b5061007a61011d3660046104aa565b61020d565b61007a6101303660046104aa565b6102a8565b6000546001600160a01b031633146101685760405162461bcd60e51b815260040161015f906104ce565b60405180910390fd5b6001600160a01b0381166000818152600160205260408120805491905590610190908261033c565b816001600160a01b03167f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5826040516101cb91815260200190565b60405180910390a25050565b6000546001600160a01b031633146102015760405162461bcd60e51b815260040161015f906104ce565b61020b600061045a565b565b6000546001600160a01b031633146102375760405162461bcd60e51b815260040161015f906104ce565b6001600160a01b03811661029c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161015f565b6102a58161045a565b50565b6000546001600160a01b031633146102d25760405162461bcd60e51b815260040161015f906104ce565b6001600160a01b0381166000908152600160205260408120805434928392916102fc908490610503565b90915550506040518181526001600160a01b038316907f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c4906020016101cb565b8047101561038c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604482015260640161015f565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146103d9576040519150601f19603f3d011682016040523d82523d6000602084013e6103de565b606091505b50509050806104555760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d61792068617665207265766572746564000000000000606482015260840161015f565b505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000602082840312156104bc57600080fd5b81356104c781610529565b9392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6000821982111561052457634e487b7160e01b600052601160045260246000fd5b500190565b6001600160a01b03811681146102a557600080fdfea26469706673582212201464ef5ea1e512fc2964c4be04b842d7e31b50876950d68c99bdbf0c1d48c12164736f6c634300080700334f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657200000000000000000000000000000000000000000000000000000000000000400000000000000000000000008d9232ebc4f06b7b8005ccff0ca401675ceb25f50000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d557236436a447559777735457779457835416361617762746b315a656b685178726d6333534d7432486831542f00000000000000000000

Deployed Bytecode

0x6080604052600436106103855760003560e01c8063644f87e0116101d1578063c87b56dd11610102578063e2982c21116100a0578063ee1217d81161006f578063ee1217d814610bf9578063f2fde38b14610c19578063f77b589714610c39578063fbb37cf214610c5957600080fd5b8063e2982c2114610b29578063e3b7d3f014610b49578063e985e9c514610b90578063eda1d5fd14610bd957600080fd5b8063d052a17a116100dc578063d052a17a14610a90578063d5abeb0114610ab0578063d74f3cdd14610ac5578063e2310ef214610b0957600080fd5b8063c87b56dd14610a31578063c91d5f97146106d1578063c9eb466214610a5157600080fd5b806395d89b411161016f578063a230c52411610149578063a230c52414610996578063b88d4fde146109b6578063c2ba4744146109d6578063c629129114610a1157600080fd5b806395d89b411461094c5780639753eac014610961578063a22cb4651461097657600080fd5b8063715018a6116101ab578063715018a6146108a15780637aabc7ad146108b65780638b167178146108fb5780638da5cb5b1461092e57600080fd5b8063644f87e0146108025780636c0360eb1461086c57806370a082311461088157600080fd5b806331b3eb94116102b657806349708058116102545780635a9b0b89116102235780635a9b0b8914610719578063627fdeab1461079557806362a835d3146107c25780636352211e146107e257600080fd5b806349708058146106915780634f6ccce7146106b15780635447d6ab146106d157806355f804b3146106f957600080fd5b80633af32abf116102905780633af32abf1461060d5780633e38fe801461064657806340f9bbe21461065c57806342842e0e1461067157600080fd5b806331b3eb94146105b85780633884d635146105d857806339ee0661146105ed57600080fd5b80631801fbe5116103235780632168c7f3116102fd5780632168c7f31461051357806323b872dd146105585780632acc659e146105785780632f745c591461059857600080fd5b80631801fbe5146104cb57806318160ddd146104de578063194944db146104f357600080fd5b8063081812fc1161035f578063081812fc1461040a578063095ea7b3146104425780630bb083a3146104625780630df540771461048657600080fd5b806301cacbc81461039157806301ffc9a7146103b357806306fdde03146103e857600080fd5b3661038c57005b600080fd5b34801561039d57600080fd5b506103b16103ac3660046149d0565b610d14565b005b3480156103bf57600080fd5b506103d36103ce3660046148d8565b610e44565b60405190151581526020015b60405180910390f35b3480156103f457600080fd5b506103fd610e6f565b6040516103df9190614c26565b34801561041657600080fd5b5061042a610425366004614808565b610f01565b6040516001600160a01b0390911681526020016103df565b34801561044e57600080fd5b506103b161045d3660046146b0565b610f96565b34801561046e57600080fd5b50610478600d5481565b6040519081526020016103df565b34801561049257600080fd5b50644d4146494160d81b60005260126020527f8fc3ab03aed3ee5e1eed98e4d8237d0754b6a2de17a47398569d8970f509c13f54610478565b6103b16104d9366004614ab4565b6110ac565b3480156104ea57600080fd5b50600854610478565b3480156104ff57600080fd5b506103d361050e366004614912565b6111b5565b34801561051f57600080fd5b5064544552524160d81b60005260126020527ff61e0e1d233594d59b5059e484e59b11848f122502eab150a2fe7e696b60832654610478565b34801561056457600080fd5b506103b16105733660046145bb565b611286565b34801561058457600080fd5b50610478610593366004614565565b6112b7565b3480156105a457600080fd5b506104786105b33660046146b0565b6113d3565b3480156105c457600080fd5b506103b16105d3366004614565565b611469565b3480156105e457600080fd5b506103b16114e7565b3480156105f957600080fd5b506103b1610608366004614750565b611629565b34801561061957600080fd5b506103d3610628366004614565565b6001600160a01b031660009081526013602052604090205460ff1690565b34801561065257600080fd5b50610478600c5481565b34801561066857600080fd5b506103b16116b4565b34801561067d57600080fd5b506103b161068c3660046145bb565b61181a565b34801561069d57600080fd5b506103b16106ac366004614565565b611835565b3480156106bd57600080fd5b506104786106cc366004614808565b611881565b3480156106dd57600080fd5b506106e6600581565b60405160009190910b81526020016103df565b34801561070557600080fd5b506103b1610714366004614912565b611914565b34801561072557600080fd5b5061072e611951565b6040805183518152602080850151818301528483015182840152606080860151908301526080808601519083015260a0808601519083015260c09485015194820194909452825160e0820152928201516101008401520151610120820152610140016103df565b3480156107a157600080fd5b506107b56107b0366004614565565b611aec565b6040516103df9190614be9565b3480156107ce57600080fd5b506103b16107dd366004614846565b611b8d565b3480156107ee57600080fd5b5061042a6107fd366004614808565b611bfd565b34801561080e57600080fd5b5061084861081d366004614808565b60126020526000908152604090208054600182015460028301546003909301549192909161ffff1684565b6040805194855260208501939093529183015261ffff1660608201526080016103df565b34801561087857600080fd5b506103fd611c74565b34801561088d57600080fd5b5061047861089c366004614565565b611d02565b3480156108ad57600080fd5b506103b1611d89565b3480156108c257600080fd5b506449474e495360d81b60005260126020527f1aae87e584dedaeacca51cf1d93d8c0c01f36938a95ad4a5e3d0b0c77e3a36c854610478565b34801561090757600080fd5b5061091b610916366004614946565b611dbf565b60405161ffff90911681526020016103df565b34801561093a57600080fd5b50600a546001600160a01b031661042a565b34801561095857600080fd5b506103fd611e04565b34801561096d57600080fd5b506106e6600f81565b34801561098257600080fd5b506103b161099136600461467b565b611e13565b3480156109a257600080fd5b506103d36109b1366004614565565b611e1e565b3480156109c257600080fd5b506103b16109d13660046145fc565b611f35565b3480156109e257600080fd5b506109f66109f1366004614565565b611f6d565b604080519384526020840192909252908201526060016103df565b348015610a1d57600080fd5b506103b1610a2c366004614ab4565b61225f565b348015610a3d57600080fd5b506103fd610a4c366004614808565b6123d1565b348015610a5d57600080fd5b50610a71610a6c366004614808565b612488565b604080516001600160a01b0390931683526020830191909152016103df565b348015610a9c57600080fd5b506103b1610aab36600461498c565b6124c0565b348015610abc57600080fd5b506117d4610478565b348015610ad157600080fd5b50634151554160e01b60005260126020527f96563b19bcf08b1704e3677350af29cdaad4e842728f9637f400cb57f39496ec54610478565b348015610b1557600080fd5b50610478610b24366004614565565b612522565b348015610b3557600080fd5b50610478610b44366004614565565b612536565b348015610b5557600080fd5b5061091b610b64366004614821565b60009182526015602090815260408084206001600160a01b0393909316845291905290205461ffff1690565b348015610b9c57600080fd5b506103d3610bab366004614582565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b348015610be557600080fd5b5061042a610bf4366004614808565b6125d4565b348015610c0557600080fd5b506103d3610c14366004614565565b6125fe565b348015610c2557600080fd5b506103b1610c34366004614565565b612668565b348015610c4557600080fd5b506103b1610c543660046146dc565b612700565b348015610c6557600080fd5b50610cce610c74366004614912565b8051602081830181018051601182529282019190930120915280546001808301546002909301546001600160401b0380841694600160401b850490911693600160801b810490930b92600160901b900460ff908116921686565b604080516001600160401b03978816815296909516602087015260019390930b9385019390935260ff1660608401526080830191909152151560a082015260c0016103df565b600a546001600160a01b03163314610d475760405162461bcd60e51b8152600401610d3e90614e20565b60405180910390fd5b80601183604051610d589190614b3d565b908152604080516020928190038301812084518154948601519386015160608701516001600160401b039283166fffffffffffffffffffffffffffffffff1990971696909617600160401b92909516919091029390931762ffffff60801b1916600160801b61ffff600195860b160260ff60901b191617600160901b60ff9095169490940293909317835560808401519183019190915560a0909201516002909101805460ff19169115159190911790557ffb31df2ce2b2b740f8fb39d618d9828a7cbe8ab00d233ac24e9b200d65b1c98190610e389084908490614c39565b60405180910390a15050565b60006001600160e01b0319821663780e9d6360e01b1480610e695750610e6982612742565b92915050565b606060008054610e7e90615017565b80601f0160208091040260200160405190810160405280929190818152602001828054610eaa90615017565b8015610ef75780601f10610ecc57610100808354040283529160200191610ef7565b820191906000526020600020905b815481529060010190602001808311610eda57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610f7a5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610d3e565b506000908152600460205260409020546001600160a01b031690565b6000610fa182611bfd565b9050806001600160a01b0316836001600160a01b0316141561100f5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610d3e565b336001600160a01b038216148061102b575061102b8133610bab565b61109d5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610d3e565b6110a78383612792565b505050565b6110d56040518060400160405280600881526020016750524553414c455360c01b8152506111b5565b806111025750611102604051806040016040528060068152602001655055424c494360d01b8152506111b5565b6111435760405162461bcd60e51b815260206004820152601260248201527129b0b632b99030b932903737ba1037b832b760711b6044820152606401610d3e565b61116c6040518060400160405280600881526020016750524553414c455360c01b8152506111b5565b1561117f5761117b8282612800565b5050565b6111a6604051806040016040528060068152602001655055424c494360d01b8152506111b5565b1561117b5761117b8282612eca565b6000806011836040516111c89190614b3d565b908152604051908190036020019020546001600160401b031611801561121657506011826040516111f99190614b3d565b908152604051908190036020019020546001600160401b03164210155b8015611252575060118260405161122d9190614b3d565b908152604051908190036020019020546001600160401b03600160401b909104164211155b8015610e6957506011826040516112699190614b3d565b9081526040519081900360200190206002015460ff161592915050565b611290338261350e565b6112ac5760405162461bcd60e51b8152600401610d3e90614e55565b6110a7838383613605565b60006112e26040518060400160405280600881526020016750524553414c455360c01b8152506111b5565b801561130657506001600160a01b03821660009081526013602052604090205460ff165b1561133257601160405161131990614b98565b9081526020016040518091039020600101549050919050565b611359604051806040016040528060068152602001655055424c494360d01b8152506111b5565b801561136b575061136982611e1e565b155b1561138a57604051655055424c494360d01b8152601190600601611319565b6113b1604051806040016040528060068152602001655055424c494360d01b8152506111b5565b80156113c157506113c182611e1e565b156113ce575050600d5490565b919050565b60006113de83611d02565b82106114405760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610d3e565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6040516351cff8d960e01b81526001600160a01b0382811660048301527f0000000000000000000000008c2096047b5aac9fcf6732de807e9cd9ef6dbe4a16906351cff8d990602401600060405180830381600087803b1580156114cc57600080fd5b505af11580156114e0573d6000803e3d6000fd5b5050505050565b600a546001600160a01b031633146115115760405162461bcd60e51b8152600401610d3e90614e20565b60006115286107b0600a546001600160a01b031690565b600f548151919250146115a5576040805162461bcd60e51b81526020600482015260248101919091527f4e756d626572206f6620746f6b656e7320697320646966666572656e7420746860448201527f616e206e756d626572206f6620656c696769626c6520616464726573737365736064820152608401610d3e565b60005b600f5481101561117b576116176115c7600a546001600160a01b031690565b600f83815481106115da576115da6150e3565b9060005260206000200160009054906101000a90046001600160a01b031684848151811061160a5761160a6150e3565b602002602001015161181a565b8061162181615052565b9150506115a8565b600a546001600160a01b031633146116535760405162461bcd60e51b8152600401610d3e90614e20565b60005b815181101561117b576000828281518110611673576116736150e3565b6020908102919091018101516001600160a01b03166000908152601390915260409020805460ff1916600117905550806116ac81615052565b915050611656565b600a546001600160a01b031633146116de5760405162461bcd60e51b8152600401610d3e90614e20565b47806117205760405162461bcd60e51b8152602060048201526011602482015270053616c65732042616c616e6365203d203607c1b6044820152606401610d3e565b60005b600b5460ff821610156117fb576000600b8260ff1681548110611748576117486150e3565b90600052602060002090600202016001015411156117e9576117e9600b8260ff1681548110611779576117796150e3565b906000526020600020906002020160000160009054906101000a90046001600160a01b03166117e46103e86117de600b8660ff16815481106117bd576117bd6150e3565b906000526020600020906002020160010154876137ac90919063ffffffff16565b906137bf565b6137cb565b806117f38161506d565b915050611723565b50611817611811600a546001600160a01b031690565b476137cb565b50565b6110a783838360405180602001604052806000815250611f35565b600a546001600160a01b0316331461185f5760405162461bcd60e51b8152600401610d3e90614e20565b601080546001600160a01b0319166001600160a01b0392909216919091179055565b600061188c60085490565b82106118ef5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610d3e565b60088281548110611902576119026150e3565b90600052602060002001549050919050565b600a546001600160a01b0316331461193e5760405162461bcd60e51b8152600401610d3e90614e20565b805161117b90600e9060208401906143bd565b6119916040518060e00160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6119b560405180606001604052806000815260200160008152602001600081525090565b6040518060e0016040528060116040516119db90655055424c494360d01b815260060190565b9081526020016040518091039020600101548152602001600d5481526020016011604051611a0890614b98565b90815260200160405180910390206001015481526020016117d46fffffffffffffffffffffffffffffffff168152602001611a4260085490565b8152600f602080830191909152600560409283015281516060810183527ff61e0e1d233594d59b5059e484e59b11848f122502eab150a2fe7e696b6083265481527f96563b19bcf08b1704e3677350af29cdaad4e842728f9637f400cb57f39496ec54818301526449474e495360d81b60005260129091527f1aae87e584dedaeacca51cf1d93d8c0c01f36938a95ad4a5e3d0b0c77e3a36c8549181019190915290939092509050565b60606000611af983611d02565b90506000816001600160401b03811115611b1557611b156150f9565b604051908082528060200260200182016040528015611b3e578160200160208202803683370190505b50905060005b82811015611b8557611b5685826113d3565b828281518110611b6857611b686150e3565b602090810291909101015280611b7d81615052565b915050611b44565b509392505050565b600a546001600160a01b03163314611bb75760405162461bcd60e51b8152600401610d3e90614e20565b60009182526012602090815260409283902082518155908201516001820155918101516002830155606001516003909101805461ffff191661ffff909216919091179055565b6000818152600260205260408120546001600160a01b031680610e695760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610d3e565b600e8054611c8190615017565b80601f0160208091040260200160405190810160405280929190818152602001828054611cad90615017565b8015611cfa5780601f10611ccf57610100808354040283529160200191611cfa565b820191906000526020600020905b815481529060010190602001808311611cdd57829003601f168201915b505050505081565b60006001600160a01b038216611d6d5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610d3e565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b03163314611db35760405162461bcd60e51b8152600401610d3e90614e20565b611dbd6000613861565b565b6000601483604051611dd19190614b3d565b908152604080519182900360209081019092206001600160a01b0385166000908152925290205461ffff16905092915050565b606060018054610e7e90615017565b61117b3383836138b3565b601054604051627eeac760e11b81526001600160a01b03838116600483015260016024830152600092839291169062fdd58e9060440160206040518083038186803b158015611e6c57600080fd5b505afa158015611e80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ea49190614a9b565b1180610e695750601054604051627eeac760e11b81526001600160a01b03848116600483015260026024830152600092169062fdd58e9060440160206040518083038186803b158015611ef657600080fd5b505afa158015611f0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f2e9190614a9b565b1192915050565b611f3f338361350e565b611f5b5760405162461bcd60e51b8152600401610d3e90614e55565b611f6784848484613982565b50505050565b6000806000611f9b6040518060400160405280600881526020016750524553414c455360c01b8152506111b5565b8015611fbf57506001600160a01b03841660009081526013602052604090205460ff165b1561214f576001600160a01b03841660009081527f7da2a6012ae29f3bbcb9e2ef9696e4ff93782787de0efa3d4dea99aeae32e93a60209081526040822054634151554160e01b909252601290527f96563b19bcf08b1704e3677350af29cdaad4e842728f9637f400cb57f39496ee546120409161ffff9081169116614f9a565b6001600160a01b03851660009081527ff87038c24676223112dc6723b0cf6825cc936dfc5d8d11b7a8e0c9b84057ca6f602090815260408220546449474e495360d81b909252601290527f1aae87e584dedaeacca51cf1d93d8c0c01f36938a95ad4a5e3d0b0c77e3a36ca546120bd9161ffff9081169116614f9a565b6001600160a01b03861660009081527f25898c31129ca3e71f92437e493585dfab87ff9672d5432b28892d5e6abf6cf06020908152604082205464544552524160d81b909252601290527ff61e0e1d233594d59b5059e484e59b11848f122502eab150a2fe7e696b6083285461213a9161ffff9081169116614f9a565b61ffff92831695509082169350169050612258565b6121786040518060400160405280600881526020016750524553414c455360c01b8152506111b5565b801561219d57506001600160a01b03841660009081526013602052604090205460ff16155b156121b057506000915081905080612258565b6121d7604051806040016040528060068152602001655055424c494360d01b8152506111b5565b15612258576001600160a01b03841660009081527f7da2a6012ae29f3bbcb9e2ef9696e4ff93782787de0efa3d4dea99aeae32e93a60209081526040822054634151554160e01b909252601290527f96563b19bcf08b1704e3677350af29cdaad4e842728f9637f400cb57f39496ee546120409161ffff9081169116614f9a565b9193909250565b600a546001600160a01b031633146122895760405162461bcd60e51b8152600401610d3e90614e20565b6000826001600160401b038111156122a3576122a36150f9565b6040519080825280602002602001820160405280156122cc578160200160208202803683370190505b506000838152601260205260408120600201549192505b84811015612391576122f533836139b5565b81838281518110612308576123086150e3565b602090810291909101810191909152600085815260129091526040812060020180549161233483615052565b9091555050600084815260126020526040812060010180549161235683615000565b9091555050600c805490600061236b83615000565b9190505550818061237b90615052565b925050808061238990615052565b9150506122e3565b507f6d49b7559536b5599481ddc561b6ddcbff7f7cf41288b9f8a77eaa13a247644e82336040516123c3929190614bfc565b60405180910390a150505050565b6000818152600260205260409020546060906001600160a01b03166124505760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610d3e565b6124586139cf565b612461836139de565b604051602001612472929190614b59565b6040516020818303038152906040529050919050565b600b818154811061249857600080fd5b6000918252602090912060029091020180546001909101546001600160a01b03909116915082565b600a546001600160a01b031633146124ea5760405162461bcd60e51b8152600401610d3e90614e20565b806011836040516124fb9190614b3d565b908152604051908190036020019020600201805491151560ff199092169190911790555050565b60008061252e83611aec565b519392505050565b6040516371d4ed8d60e11b81526001600160a01b0382811660048301526000917f0000000000000000000000008c2096047b5aac9fcf6732de807e9cd9ef6dbe4a9091169063e3a9db1a9060240160206040518083038186803b15801561259c57600080fd5b505afa1580156125b0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e699190614a9b565b600f81815481106125e457600080fd5b6000918252602090912001546001600160a01b0316905081565b6000805b600f5481101561265f57826001600160a01b0316600f8281548110612629576126296150e3565b6000918252602090912001546001600160a01b0316141561264d5750600192915050565b8061265781615052565b915050612602565b50600092915050565b600a546001600160a01b031633146126925760405162461bcd60e51b8152600401610d3e90614e20565b6001600160a01b0381166126f75760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610d3e565b61181781613861565b600a546001600160a01b0316331461272a5760405162461bcd60e51b8152600401610d3e90614e20565b612736600f6000614441565b6110a7600f838361445f565b60006001600160e01b031982166380ac58cd60e01b148061277357506001600160e01b03198216635b5e139f60e01b145b80610e6957506301ffc9a760e01b6001600160e01b0319831614610e69565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906127c782611bfd565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6040518060400160405280600881526020016750524553414c455360c01b8152508261282b826111b5565b6128685760405162461bcd60e51b815260206004820152600e60248201526d29b0b632b9903737ba1037b832b760911b6044820152606401610d3e565b600081116128885760405162461bcd60e51b8152600401610d3e90614ca3565b600c548111156128aa5760405162461bcd60e51b8152600401610d3e90614dd3565b6000600c54116128f55760405162461bcd60e51b815260206004820152601660248201527510dbdb1b1958dd1a5bdb881a5cc814dbdb190813dd5d60521b6044820152606401610d3e565b6011826040516129059190614b3d565b9081526040519081900360200190205460ff600160901b909104168111156129625760405162461bcd60e51b815260206004820152601060248201526f13585e081c195c881d1e081b1a5b5a5d60821b6044820152606401610d3e565b6011826040516129729190614b3d565b90815260405190819003602001812054600160801b9004600190810b900b9082906014906129a1908690614b3d565b908152602001604051809103902060006129b83390565b6001600160a01b031681526020810191909152604001600020546129e0919061ffff16614f29565b60010b1315612a015760405162461bcd60e51b8152600401610d3e90614ccf565b6011604051612a0f90614b98565b908152604051908190036020019020546001600160401b03600160401b9091041642118015612a425750612a4233611e1e565b15612a795780600d54612a559190614f7b565b341015612a745760405162461bcd60e51b8152600401610d3e90614ea6565b612ac5565b80601183604051612a8a9190614b3d565b908152602001604051809103902060010154612aa69190614f7b565b341015612ac55760405162461bcd60e51b8152600401610d3e90614ea6565b80601483604051612ad69190614b3d565b90815260200160405180910390206000612aed3390565b6001600160a01b03168152602081019190915260400160009081208054909190612b1c90849061ffff16614f29565b92506101000a81548161ffff021916908361ffff1602179055508284644d4146494160d81b604051602001612b5391815260200190565b60408051601f1981840301815282825280516020918201209083018590529101604051602081830303815290604052805190602001201415612bd75760405162461bcd60e51b815260206004820152601a60248201527f43616e206e6f74206d696e74204d616669612046616374696f6e0000000000006044820152606401610d3e565b60008111612bf75760405162461bcd60e51b8152600401610d3e90614ca3565b60008281526012602052604090206003015461ffff16811115612c2c5760405162461bcd60e51b8152600401610d3e90614cfd565b600082815260126020526040902060010154612c8a5760405162461bcd60e51b815260206004820152601a60248201527f46616374696f6e20737570706c7920697320536f6c64204f75740000000000006044820152606401610d3e565b600082815260126020526040902060010154811115612cbb5760405162461bcd60e51b8152600401610d3e90614d7e565b600082815260126020908152604080832060030154601583528184203385529092529091205461ffff91821660010b91612cf791849116614f29565b60010b1315612d485760405162461bcd60e51b815260206004820152601e60248201527f4d6178207065722077616c6c6574206c696d6974202846616374696f6e2900006044820152606401610d3e565b600082815260156020908152604080832033845290915281208054839290612d7590849061ffff16614f29565b92506101000a81548161ffff021916908361ffff160217905550612d996106283390565b612ddc5760405162461bcd60e51b8152602060048201526014602482015273155cd95c881b9bdd081dda1a5d195b1a5cdd195960621b6044820152606401610d3e565b600560000b6014604051612def90614b98565b90815260200160405180910390206000612e063390565b6001600160a01b0316815260208101919091526040016000205461ffff1660010b1315612e755760405162461bcd60e51b815260206004820152601f60248201527f4d6178207065722077616c6c6574206c696d6974202850524553414c455329006044820152606401610d3e565b6000858152601560209081526040808320338452909152902054600561ffff90911660010b1315612eb85760405162461bcd60e51b8152600401610d3e90614cfd565b612ec28686613adb565b505050505050565b604051806040016040528060068152602001655055424c494360d01b81525082612ef3826111b5565b612f305760405162461bcd60e51b815260206004820152600e60248201526d29b0b632b9903737ba1037b832b760911b6044820152606401610d3e565b60008111612f505760405162461bcd60e51b8152600401610d3e90614ca3565b600c54811115612f725760405162461bcd60e51b8152600401610d3e90614dd3565b6000600c5411612fbd5760405162461bcd60e51b815260206004820152601660248201527510dbdb1b1958dd1a5bdb881a5cc814dbdb190813dd5d60521b6044820152606401610d3e565b601182604051612fcd9190614b3d565b9081526040519081900360200190205460ff600160901b9091041681111561302a5760405162461bcd60e51b815260206004820152601060248201526f13585e081c195c881d1e081b1a5b5a5d60821b6044820152606401610d3e565b60118260405161303a9190614b3d565b90815260405190819003602001812054600160801b9004600190810b900b908290601490613069908690614b3d565b908152602001604051809103902060006130803390565b6001600160a01b031681526020810191909152604001600020546130a8919061ffff16614f29565b60010b13156130c95760405162461bcd60e51b8152600401610d3e90614ccf565b60116040516130d790614b98565b908152604051908190036020019020546001600160401b03600160401b909104164211801561310a575061310a33611e1e565b156131415780600d5461311d9190614f7b565b34101561313c5760405162461bcd60e51b8152600401610d3e90614ea6565b61318d565b806011836040516131529190614b3d565b90815260200160405180910390206001015461316e9190614f7b565b34101561318d5760405162461bcd60e51b8152600401610d3e90614ea6565b8060148360405161319e9190614b3d565b908152602001604051809103902060006131b53390565b6001600160a01b031681526020810191909152604001600090812080549091906131e490849061ffff16614f29565b92506101000a81548161ffff021916908361ffff1602179055508284644d4146494160d81b60405160200161321b91815260200190565b60408051601f198184030181528282528051602091820120908301859052910160405160208183030381529060405280519060200120141561329f5760405162461bcd60e51b815260206004820152601a60248201527f43616e206e6f74206d696e74204d616669612046616374696f6e0000000000006044820152606401610d3e565b600081116132bf5760405162461bcd60e51b8152600401610d3e90614ca3565b60008281526012602052604090206003015461ffff168111156132f45760405162461bcd60e51b8152600401610d3e90614cfd565b6000828152601260205260409020600101546133525760405162461bcd60e51b815260206004820152601a60248201527f46616374696f6e20737570706c7920697320536f6c64204f75740000000000006044820152606401610d3e565b6000828152601260205260409020600101548111156133835760405162461bcd60e51b8152600401610d3e90614d7e565b600082815260126020908152604080832060030154601583528184203385529092529091205461ffff91821660010b916133bf91849116614f29565b60010b13156134105760405162461bcd60e51b815260206004820152601e60248201527f4d6178207065722077616c6c6574206c696d6974202846616374696f6e2900006044820152606401610d3e565b60008281526015602090815260408083203384529091528120805483929061343d90849061ffff16614f29565b92506101000a81548161ffff021916908361ffff1602179055506134616106283390565b15612eb85760408051655055424c494360d01b815260146006820181905282519182900360260182203360009081526020919091529290922054600f9261ffff909116916134ae90614b98565b908152602001604051809103902060006134c53390565b6001600160a01b031681526020810191909152604001600020546134ed919061ffff16614f29565b60010b1315612eb85760405162461bcd60e51b8152600401610d3e90614ccf565b6000818152600260205260408120546001600160a01b03166135875760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610d3e565b600061359283611bfd565b9050806001600160a01b0316846001600160a01b031614806135cd5750836001600160a01b03166135c284610f01565b6001600160a01b0316145b806135fd57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661361882611bfd565b6001600160a01b03161461367c5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610d3e565b6001600160a01b0382166136de5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610d3e565b6136e9838383613d4e565b6136f4600082612792565b6001600160a01b038316600090815260036020526040812080546001929061371d908490614fbd565b90915550506001600160a01b038216600090815260036020526040812080546001929061374b908490614f4f565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60006137b88284614f7b565b9392505050565b60006137b88284614f67565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114613818576040519150601f19603f3d011682016040523d82523d6000602084013e61381d565b606091505b50509050806110a75760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b6044820152606401610d3e565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031614156139155760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610d3e565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61398d848484613605565b61399984848484613e06565b611f675760405162461bcd60e51b8152600401610d3e90614d2c565b61117b828260405180602001604052806000815250613f13565b6060600e8054610e7e90615017565b606081613a025750506040805180820190915260018152600360fc1b602082015290565b8160005b8115613a2c5780613a1681615052565b9150613a259050600a83614f67565b9150613a06565b6000816001600160401b03811115613a4657613a466150f9565b6040519080825280601f01601f191660200182016040528015613a70576020820181803683370190505b5090505b84156135fd57613a85600183614fbd565b9150613a92600a8661508d565b613a9d906030614f4f565b60f81b818381518110613ab257613ab26150e3565b60200101906001600160f81b031916908160001a905350613ad4600a86614f67565b9450613a74565b6000826001600160401b03811115613af557613af56150f9565b604051908082528060200260200182016040528015613b1e578160200160208202803683370190505b5090506000601260008481526020019081526020016000206002015490506000613b65604051806040016040528060068152602001655055424c494360d01b8152506111b5565b8015613b755750613b7533611e1e565b15613b8e57600d54613b879086614f7b565b9050613c2a565b613bb5604051806040016040528060068152602001655055424c494360d01b8152506111b5565b8015613bc75750613bc533611e1e565b155b15613bfc5760408051655055424c494360d01b815260116006820152905190819003602601902060010154613b879086614f7b565b6011604051613c0a90614b98565b90815260200160405180910390206001015485613c279190614f7b565b90505b6000613c3b826103e8612710613f46565b9050613c5b73454cfaa623a629cc0b4017aeb85d54c42e91479d82614052565b60005b86811015613d0c57613c7033856139b5565b83858281518110613c8357613c836150e3565b6020908102919091018101919091526000878152601290915260408120600201805491613caf83615052565b90915550506000868152601260205260408120600101805491613cd183615000565b9091555050600c8054906000613ce683615000565b91905055508380613cf690615052565b9450508080613d0490615052565b915050613c5e565b507f6d49b7559536b5599481ddc561b6ddcbff7f7cf41288b9f8a77eaa13a247644e8433604051613d3e929190614bfc565b60405180910390a1505050505050565b6001600160a01b038316613da957613da481600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b613dcc565b816001600160a01b0316836001600160a01b031614613dcc57613dcc83826140d3565b6001600160a01b038216613de3576110a781614170565b826001600160a01b0316826001600160a01b0316146110a7576110a7828261421f565b60006001600160a01b0384163b15613f0857604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290613e4a903390899088908890600401614bac565b602060405180830381600087803b158015613e6457600080fd5b505af1925050508015613e94575060408051601f3d908101601f19168201909252613e91918101906148f5565b60015b613eee573d808015613ec2576040519150601f19603f3d011682016040523d82523d6000602084013e613ec7565b606091505b508051613ee65760405162461bcd60e51b8152600401610d3e90614d2c565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506135fd565b506001949350505050565b613f1d8383614263565b613f2a6000848484613e06565b6110a75760405162461bcd60e51b8152600401610d3e90614d2c565b6000808211613f8a5760405162461bcd60e51b815260206004820152601060248201526f4469766973696f6e206279207a65726f60801b6044820152606401610d3e565b83613f97575060006137b8565b6000613fa38486614f7b565b905083613fb08683614f67565b1415613fc857613fc08382614f67565b9150506137b8565b6000613fd48487614f67565b90506000613fe2858861508d565b90506000613ff08688614f67565b90506000613ffe878961508d565b9050614045614011886117de86856137ac565b61403f61401e86866137ac565b61403f61402b89876137ac565b61403f8d6140398c8b6137ac565b906137ac565b906143b1565b9998505050505050505050565b60405163f340fa0160e01b81526001600160a01b0383811660048301527f0000000000000000000000008c2096047b5aac9fcf6732de807e9cd9ef6dbe4a169063f340fa019083906024016000604051808303818588803b1580156140b657600080fd5b505af11580156140ca573d6000803e3d6000fd5b50505050505050565b600060016140e084611d02565b6140ea9190614fbd565b60008381526007602052604090205490915080821461413d576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061418290600190614fbd565b600083815260096020526040812054600880549394509092849081106141aa576141aa6150e3565b9060005260206000200154905080600883815481106141cb576141cb6150e3565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480614203576142036150cd565b6001900381819060005260206000200160009055905550505050565b600061422a83611d02565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b0382166142b95760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610d3e565b6000818152600260205260409020546001600160a01b03161561431e5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610d3e565b61432a60008383613d4e565b6001600160a01b0382166000908152600360205260408120805460019290614353908490614f4f565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006137b88284614f4f565b8280546143c990615017565b90600052602060002090601f0160209004810192826143eb5760008555614431565b82601f1061440457805160ff1916838001178555614431565b82800160010185558215614431579182015b82811115614431578251825591602001919060010190614416565b5061443d9291506144b2565b5090565b508054600082559060005260206000209081019061181791906144b2565b828054828255906000526020600020908101928215614431579160200282015b828111156144315781546001600160a01b0319166001600160a01b0384351617825560209092019160019091019061447f565b5b8082111561443d57600081556001016144b3565b60006001600160401b038311156144e0576144e06150f9565b6144f3601f8401601f1916602001614ef9565b905082815283838301111561450757600080fd5b828260208301376000602084830101529392505050565b803580151581146113ce57600080fd5b600082601f83011261453f57600080fd5b6137b8838335602085016144c7565b80356001600160401b03811681146113ce57600080fd5b60006020828403121561457757600080fd5b81356137b88161510f565b6000806040838503121561459557600080fd5b82356145a08161510f565b915060208301356145b08161510f565b809150509250929050565b6000806000606084860312156145d057600080fd5b83356145db8161510f565b925060208401356145eb8161510f565b929592945050506040919091013590565b6000806000806080858703121561461257600080fd5b843561461d8161510f565b9350602085013561462d8161510f565b92506040850135915060608501356001600160401b0381111561464f57600080fd5b8501601f8101871361466057600080fd5b61466f878235602084016144c7565b91505092959194509250565b6000806040838503121561468e57600080fd5b82356146998161510f565b91506146a76020840161451e565b90509250929050565b600080604083850312156146c357600080fd5b82356146ce8161510f565b946020939093013593505050565b600080602083850312156146ef57600080fd5b82356001600160401b038082111561470657600080fd5b818501915085601f83011261471a57600080fd5b81358181111561472957600080fd5b8660208260051b850101111561473e57600080fd5b60209290920196919550909350505050565b6000602080838503121561476357600080fd5b82356001600160401b038082111561477a57600080fd5b818501915085601f83011261478e57600080fd5b8135818111156147a0576147a06150f9565b8060051b91506147b1848301614ef9565b8181528481019084860184860187018a10156147cc57600080fd5b600095505b838610156147fb57803594506147e68561510f565b848352600195909501949186019186016147d1565b5098975050505050505050565b60006020828403121561481a57600080fd5b5035919050565b6000806040838503121561483457600080fd5b8235915060208301356145b08161510f565b60008082840360a081121561485a57600080fd5b833592506080601f198201121561487057600080fd5b50604051608081018181106001600160401b0382111715614893576148936150f9565b8060405250602084013581526040840135602082015260608401356040820152608084013561ffff811681146148c857600080fd5b6060820152919491935090915050565b6000602082840312156148ea57600080fd5b81356137b881615124565b60006020828403121561490757600080fd5b81516137b881615124565b60006020828403121561492457600080fd5b81356001600160401b0381111561493a57600080fd5b6135fd8482850161452e565b6000806040838503121561495957600080fd5b82356001600160401b0381111561496f57600080fd5b61497b8582860161452e565b92505060208301356145b08161510f565b6000806040838503121561499f57600080fd5b82356001600160401b038111156149b557600080fd5b6149c18582860161452e565b9250506146a76020840161451e565b60008082840360e08112156149e457600080fd5b83356001600160401b038111156149fa57600080fd5b614a068682870161452e565b93505060c0601f1982011215614a1b57600080fd5b50614a24614ed1565b614a306020850161454e565b8152614a3e6040850161454e565b602082015260608401358060010b8114614a5757600080fd5b6040820152608084013560ff81168114614a7057600080fd5b606082015260a08401356080820152614a8b60c0850161451e565b60a0820152809150509250929050565b600060208284031215614aad57600080fd5b5051919050565b60008060408385031215614ac757600080fd5b50508035926020909101359150565b600081518084526020808501945080840160005b83811015614b0657815187529582019590820190600101614aea565b509495945050505050565b60008151808452614b29816020860160208601614fd4565b601f01601f19169290920160200192915050565b60008251614b4f818460208701614fd4565b9190910192915050565b60008351614b6b818460208801614fd4565b835190830190614b7f818360208801614fd4565b64173539b7b760d91b9101908152600501949350505050565b6750524553414c455360c01b815260080190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090614bdf90830184614b11565b9695505050505050565b6020815260006137b86020830184614ad6565b604081526000614c0f6040830185614ad6565b905060018060a01b03831660208301529392505050565b6020815260006137b86020830184614b11565b60e081526000614c4c60e0830185614b11565b90506001600160401b0380845116602084015280602085015116604084015250604083015160010b606083015260ff6060840151166080830152608083015160a083015260a0830151151560c08301529392505050565b60208082526012908201527110d85b881b9bdd081b5a5b9d080c0813919560721b604082015260600190565b60208082526014908201527313585e081c195c881dd85b1b195d081b1a5b5a5d60621b604082015260600190565b60208082526015908201527413585e081c195c88199858dd1a5bdb881b1a5b5a5d605a1b604082015260600190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526035908201527f45786365656473206d6178696d756d2066616374696f6e20737570706c792e2060408201527454727920746f206d696e74206c657373204e46547360581b606082015260800190565b6020808252602d908201527f45786365656473206d6178696d756d20737570706c792e2054727920746f206d60408201526c696e74206c657373204e46547360981b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b602080825260119082015270496e737566696369656e742066756e647360781b604082015260600190565b60405160c081016001600160401b0381118282101715614ef357614ef36150f9565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614f2157614f216150f9565b604052919050565b600061ffff808316818516808303821115614f4657614f466150a1565b01949350505050565b60008219821115614f6257614f626150a1565b500190565b600082614f7657614f766150b7565b500490565b6000816000190483118215151615614f9557614f956150a1565b500290565b600061ffff83811690831681811015614fb557614fb56150a1565b039392505050565b600082821015614fcf57614fcf6150a1565b500390565b60005b83811015614fef578181015183820152602001614fd7565b83811115611f675750506000910152565b60008161500f5761500f6150a1565b506000190190565b600181811c9082168061502b57607f821691505b6020821081141561504c57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415615066576150666150a1565b5060010190565b600060ff821660ff811415615084576150846150a1565b60010192915050565b60008261509c5761509c6150b7565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461181757600080fd5b6001600160e01b03198116811461181757600080fdfea26469706673582212205c1fc93e8a6159c6bd22e6a0c0541cdd82eebc38c9c82181ada738b0cc59037864736f6c63430008070033

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

00000000000000000000000000000000000000000000000000000000000000400000000000000000000000008d9232ebc4f06b7b8005ccff0ca401675ceb25f50000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d557236436a447559777735457779457835416361617762746b315a656b685178726d6333534d7432486831542f00000000000000000000

-----Decoded View---------------
Arg [0] : _initBaseURI (string): ipfs://QmUr6CjDuYww5EwyEx5Acaawbtk1ZekhQxrmc3SMt2Hh1T/
Arg [1] : _contract (address): 0x8d9232ebc4f06b7b8005ccff0ca401675ceb25f5

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000008d9232ebc4f06b7b8005ccff0ca401675ceb25f5
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [3] : 697066733a2f2f516d557236436a447559777735457779457835416361617762
Arg [4] : 746b315a656b685178726d6333534d7432486831542f00000000000000000000


Deployed ByteCode Sourcemap

88152:13431:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;92103:158;;;;;;;;;;-1:-1:-1;92103:158:0;;;;;:::i;:::-;;:::i;:::-;;79542:224;;;;;;;;;;-1:-1:-1;79542:224:0;;;;;:::i;:::-;;:::i;:::-;;;15658:14:1;;15651:22;15633:41;;15621:2;15606:18;79542:224:0;;;;;;;;66362:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;67921:221::-;;;;;;;;;;-1:-1:-1;67921:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;13250:32:1;;;13232:51;;13220:2;13205:18;67921:221:0;13086:203:1;67444:411:0;;;;;;;;;;-1:-1:-1;67444:411:0;;;;;:::i;:::-;;:::i;88618:49::-;;;;;;;;;;;;;;;;;;;32145:25:1;;;32133:2;32118:18;88618:49:0;31999:177:1;94772:124:0;;;;;;;;;;-1:-1:-1;;;;94828:7:0;94855:17;:8;:17;;:33;;94772:124;;100290:358;;;;;;:::i;:::-;;:::i;80182:113::-;;;;;;;;;;-1:-1:-1;80270:10:0;:17;80182:113;;92394:220;;;;;;;;;;-1:-1:-1;92394:220:0;;;;;:::i;:::-;;:::i;95166:124::-;;;;;;;;;;-1:-1:-1;;;;95222:7:0;95249:17;:8;:17;;:33;;95166:124;;68671:339;;;;;;;;;;-1:-1:-1;68671:339:0;;;;;:::i;:::-;;:::i;98977:421::-;;;;;;;;;;-1:-1:-1;98977:421:0;;;;;:::i;:::-;;:::i;79850:256::-;;;;;;;;;;-1:-1:-1;79850:256:0;;;;;:::i;:::-;;:::i;30426:106::-;;;;;;;;;;-1:-1:-1;30426:106:0;;;;;:::i;:::-;;:::i;101196:384::-;;;;;;;;;;;;;:::i;95406:223::-;;;;;;;;;;-1:-1:-1;95406:223:0;;;;;:::i;:::-;;:::i;93106:171::-;;;;;;;;;;-1:-1:-1;93106:171:0;;;;;:::i;:::-;-1:-1:-1;;;;;93207:27:0;93165:4;93207:27;;;:20;:27;;;;;;;;;93106:171;88321:30;;;;;;;;;;;;;;;;17167:412;;;;;;;;;;;;;:::i;69081:185::-;;;;;;;;;;-1:-1:-1;69081:185:0;;;;;:::i;:::-;;:::i;92622:113::-;;;;;;;;;;-1:-1:-1;92622:113:0;;;;;:::i;:::-;;:::i;80372:233::-;;;;;;;;;;-1:-1:-1;80372:233:0;;;;;:::i;:::-;;:::i;88488:40::-;;;;;;;;;;;;88527:1;88488:40;;;;;15771:4:1;15843:21;;;;15825:40;;15813:2;15798:18;88488:40:0;15685:186:1;95637:104:0;;;;;;;;;;-1:-1:-1;95637:104:0;;;;;:::i;:::-;;:::i;100656:379::-;;;;;;;;;;;;;:::i;:::-;;;;31228:13:1;;31210:32;;31298:4;31286:17;;;31280:24;31258:20;;;31251:54;31349:17;;;31343:24;31321:20;;;31314:54;31424:4;31412:17;;;31406:24;31384:20;;;31377:54;31487:4;31475:17;;;31469:24;31447:20;;;31440:54;31550:4;31538:17;;;31532:24;31510:20;;;31503:54;31613:4;31601:17;;;31595:24;31573:20;;;31566:54;;;;31657:13;;31651:3;31636:19;;31629:42;31714:17;;;31708:24;31702:3;31687:19;;31680:53;31776:17;31770:24;31764:3;31749:19;;31742:53;31197:3;31182:19;100656:379:0;30909:892:1;93742:361:0;;;;;;;;;;-1:-1:-1;93742:361:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;92860:130::-;;;;;;;;;;-1:-1:-1;92860:130:0;;;;;:::i;:::-;;:::i;66056:239::-;;;;;;;;;;-1:-1:-1;66056:239:0;;;;;:::i;:::-;;:::i;89144:43::-;;;;;;;;;;-1:-1:-1;89144:43:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32734:25:1;;;32790:2;32775:18;;32768:34;;;;32818:18;;;32811:34;32893:6;32881:19;32876:2;32861:18;;32854:47;32721:3;32706:19;89144:43:0;32505:402:1;88676:21:0;;;;;;;;;;;;;:::i;65786:208::-;;;;;;;;;;-1:-1:-1;65786:208:0;;;;;:::i;:::-;;:::i;15770:103::-;;;;;;;;;;;;;:::i;95034:124::-;;;;;;;;;;-1:-1:-1;;;;95090:7:0;95117:17;:8;:17;;:33;;95034:124;;94466:136;;;;;;;;;;-1:-1:-1;94466:136:0;;;;;:::i;:::-;;:::i;:::-;;;31980:6:1;31968:19;;;31950:38;;31938:2;31923:18;94466:136:0;31806:188:1;15119:87:0;;;;;;;;;;-1:-1:-1;15192:6:0;;-1:-1:-1;;;;;15192:6:0;15119:87;;66531:104;;;;;;;;;;;;;:::i;88573:36::-;;;;;;;;;;;;88607:2;88573:36;;68214:155;;;;;;;;;;-1:-1:-1;68214:155:0;;;;;:::i;:::-;;:::i;93285:169::-;;;;;;;;;;-1:-1:-1;93285:169:0;;;;;:::i;:::-;;:::i;69337:328::-;;;;;;;;;;-1:-1:-1;69337:328:0;;;;;:::i;:::-;;:::i;99512:770::-;;;;;;;;;;-1:-1:-1;99512:770:0;;;;;:::i;:::-;;:::i;:::-;;;;32383:25:1;;;32439:2;32424:18;;32417:34;;;;32467:18;;;32460:34;32371:2;32356:18;99512:770:0;32181:319:1;97153:598:0;;;;;;;;;;-1:-1:-1;97153:598:0;;;;;:::i;:::-;;:::i;95749:258::-;;;;;;;;;;-1:-1:-1;95749:258:0;;;;;:::i;:::-;;:::i;16806:19::-;;;;;;;;;;-1:-1:-1;16806:19:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;14211:32:1;;;14193:51;;14275:2;14260:18;;14253:34;;;;14166:18;16806:19:0;14011:282:1;92269:117:0;;;;;;;;;;-1:-1:-1;92269:117:0;;;;;:::i;:::-;;:::i;99406:98::-;;;;;;;;;;-1:-1:-1;88388:4:0;99406:98;;94904:122;;;;;;;;;;-1:-1:-1;;;;94959:7:0;94986:16;:8;:16;;:32;;94904:122;;94111:231;;;;;;;;;;-1:-1:-1;94111:231:0;;;;;:::i;:::-;;:::i;30656:112::-;;;;;;;;;;-1:-1:-1;30656:112:0;;;;;:::i;:::-;;:::i;94610:154::-;;;;;;;;;;-1:-1:-1;94610:154:0;;;;;:::i;:::-;94693:6;94719:28;;;:14;:28;;;;;;;;-1:-1:-1;;;;;94719:37:0;;;;;;;;;;;;;;;94610:154;68440:164;;;;;;;;;;-1:-1:-1;68440:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;68561:25:0;;;68537:4;68561:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;68440:164;88706:34;;;;;;;;;;-1:-1:-1;88706:34:0;;;;;:::i;:::-;;:::i;93462:272::-;;;;;;;;;;-1:-1:-1;93462:272:0;;;;;:::i;:::-;;:::i;16028:201::-;;;;;;;;;;-1:-1:-1;16028:201:0;;;;;:::i;:::-;;:::i;96015:152::-;;;;;;;;;;-1:-1:-1;96015:152:0;;;;;:::i;:::-;;:::i;89101:36::-;;;;;;;;;;-1:-1:-1;89101:36:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;89101:36:0;;;;-1:-1:-1;;;89101:36:0;;;;;;-1:-1:-1;;;89101:36:0;;;;;;-1:-1:-1;;;89101:36:0;;;;;;;;;;;;;;-1:-1:-1;;;;;33236:15:1;;;33218:34;;33288:15;;;;33283:2;33268:18;;33261:43;33351:1;33340:21;;;;33320:18;;;33313:49;;;;33410:4;33398:17;33393:2;33378:18;;33371:45;33447:3;33432:19;;33425:35;;;;33504:14;33497:22;33491:3;33476:19;;33469:51;33168:3;33153:19;89101:36:0;32912:614:1;92103:158:0;15192:6;;-1:-1:-1;;;;;15192:6:0;13923:10;15339:23;15331:68;;;;-1:-1:-1;;;15331:68:0;;;;;;;:::i;:::-;;;;;;;;;92203:5:::1;92188;92194;92188:12;;;;;;:::i;:::-;::::0;;;::::1;::::0;;::::1;::::0;;;;;;;;:20;;;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;-1:-1:-1;;;;;92188:20:0;;::::1;-1:-1:-1::0;;92188:20:0;;;;;;;-1:-1:-1;;;92188:20:0;;;::::1;::::0;;;::::1;::::0;;;::::1;-1:-1:-1::0;;;;92188:20:0;-1:-1:-1;;;92188:20:0::1;::::0;;;::::1;;;-1:-1:-1::0;;;;92188:20:0;;-1:-1:-1;;;92188:20:0::1;::::0;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;-1:-1:-1;;92188:20:0::1;::::0;::::1;;::::0;;;::::1;::::0;;92224:29:::1;::::0;::::1;::::0;92240:5;;92247;;92224:29:::1;:::i;:::-;;;;;;;;92103:158:::0;;:::o;79542:224::-;79644:4;-1:-1:-1;;;;;;79668:50:0;;-1:-1:-1;;;79668:50:0;;:90;;;79722:36;79746:11;79722:23;:36::i;:::-;79661:97;79542:224;-1:-1:-1;;79542:224:0:o;66362:100::-;66416:13;66449:5;66442:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66362:100;:::o;67921:221::-;67997:7;71264:16;;;:7;:16;;;;;;-1:-1:-1;;;;;71264:16:0;68017:73;;;;-1:-1:-1;;;68017:73:0;;25540:2:1;68017:73:0;;;25522:21:1;25579:2;25559:18;;;25552:30;25618:34;25598:18;;;25591:62;-1:-1:-1;;;25669:18:1;;;25662:42;25721:19;;68017:73:0;25338:408:1;68017:73:0;-1:-1:-1;68110:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;68110:24:0;;67921:221::o;67444:411::-;67525:13;67541:23;67556:7;67541:14;:23::i;:::-;67525:39;;67589:5;-1:-1:-1;;;;;67583:11:0;:2;-1:-1:-1;;;;;67583:11:0;;;67575:57;;;;-1:-1:-1;;;67575:57:0;;27075:2:1;67575:57:0;;;27057:21:1;27114:2;27094:18;;;27087:30;27153:34;27133:18;;;27126:62;-1:-1:-1;;;27204:18:1;;;27197:31;27245:19;;67575:57:0;26873:397:1;67575:57:0;13923:10;-1:-1:-1;;;;;67667:21:0;;;;:62;;-1:-1:-1;67692:37:0;67709:5;13923:10;68440:164;:::i;67692:37::-;67645:168;;;;-1:-1:-1;;;67645:168:0;;23153:2:1;67645:168:0;;;23135:21:1;23192:2;23172:18;;;23165:30;23231:34;23211:18;;;23204:62;23302:26;23282:18;;;23275:54;23346:19;;67645:168:0;22951:420:1;67645:168:0;67826:21;67835:2;67839:7;67826:8;:21::i;:::-;67514:341;67444:411;;:::o;100290:358::-;100384:22;;;;;;;;;;;;;;-1:-1:-1;;;100384:22:0;;;:10;:22::i;:::-;:46;;;;100410:20;;;;;;;;;;;;;;-1:-1:-1;;;100410:20:0;;;:10;:20::i;:::-;100376:76;;;;-1:-1:-1;;;100376:76:0;;24399:2:1;100376:76:0;;;24381:21:1;24438:2;24418:18;;;24411:30;-1:-1:-1;;;24457:18:1;;;24450:48;24515:18;;100376:76:0;24197:342:1;100376:76:0;100466:22;;;;;;;;;;;;;;-1:-1:-1;;;100466:22:0;;;:10;:22::i;:::-;100463:178;;;100505:31;100518:7;100527:8;100505:12;:31::i;:::-;100290:358;;:::o;100463:178::-;100558:20;;;;;;;;;;;;;;-1:-1:-1;;;100558:20:0;;;:10;:20::i;:::-;100554:87;;;100595:34;100611:7;100620:8;100595:15;:34::i;92394:220::-;92456:4;92501:1;92480:5;92486;92480:12;;;;;;:::i;:::-;;;;;;;;;;;;;;:18;-1:-1:-1;;;;;92480:18:0;:22;:63;;;;;92525:5;92531;92525:12;;;;;;:::i;:::-;;;;;;;;;;;;;;:18;-1:-1:-1;;;;;92525:18:0;92506:15;:37;;92480:63;:102;;;;;92566:5;92572;92566:12;;;;;;:::i;:::-;;;;;;;;;;;;;;:16;-1:-1:-1;;;;;;;;92566:16:0;;;;92547:15;:35;;92480:102;:126;;;;;92587:5;92593;92587:12;;;;;;:::i;:::-;;;;;;;;;;;;;;:19;;;;;92586:20;92473:133;92394:220;-1:-1:-1;;92394:220:0:o;68671:339::-;68866:41;13923:10;68899:7;68866:18;:41::i;:::-;68858:103;;;;-1:-1:-1;;;68858:103:0;;;;;;;:::i;:::-;68974:28;68984:4;68990:2;68994:7;68974:9;:28::i;98977:421::-;99043:7;99066:22;;;;;;;;;;;;;;-1:-1:-1;;;99066:22:0;;;:10;:22::i;:::-;:48;;;;-1:-1:-1;;;;;;93207:27:0;;93165:4;93207:27;;;:20;:27;;;;;;;;99092:22;99063:328;;;99138:5;:17;;;;;:::i;:::-;;;;;;;;;;;;;:23;;;99131:30;;98977:421;;;:::o;99063:328::-;99183:20;;;;;;;;;;;;;;-1:-1:-1;;;99183:20:0;;;:10;:20::i;:::-;:42;;;;;99208:17;99217:7;99208:8;:17::i;:::-;99207:18;99183:42;99179:212;;;99249:15;;-1:-1:-1;;;12554:21:1;;99249:5:0;;12600:1:1;12591:11;99249:15:0;12352:256:1;99179:212:0;99292:20;;;;;;;;;;;;;;-1:-1:-1;;;99292:20:0;;;:10;:20::i;:::-;:41;;;;;99316:17;99325:7;99316:8;:17::i;:::-;99288:103;;;-1:-1:-1;;99357:22:0;;;98977:421::o;99288:103::-;98977:421;;;:::o;79850:256::-;79947:7;79983:23;80000:5;79983:16;:23::i;:::-;79975:5;:31;79967:87;;;;-1:-1:-1;;;79967:87:0;;18093:2:1;79967:87:0;;;18075:21:1;18132:2;18112:18;;;18105:30;18171:34;18151:18;;;18144:62;-1:-1:-1;;;18222:18:1;;;18215:41;18273:19;;79967:87:0;17891:407:1;79967:87:0;-1:-1:-1;;;;;;80072:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;79850:256::o;30426:106::-;30501:23;;-1:-1:-1;;;30501:23:0;;-1:-1:-1;;;;;13250:32:1;;;30501:23:0;;;13232:51:1;30501:7:0;:16;;;;13205:18:1;;30501:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30426:106;:::o;101196:384::-;15192:6;;-1:-1:-1;;;;;15192:6:0;13923:10;15339:23;15331:68;;;;-1:-1:-1;;;15331:68:0;;;;;;;:::i;:::-;101243:23:::1;101269:25;101286:7;15192:6:::0;;-1:-1:-1;;;;;15192:6:0;;15119:87;101269:25:::1;101330:17;:24:::0;101313:13;;101243:51;;-1:-1:-1;101313:41:0::1;101305:118;;;::::0;;-1:-1:-1;;;101305:118:0;;24746:2:1;101305:118:0::1;::::0;::::1;24728:21:1::0;24765:18;;;24758:30;;;;24824:34;24804:18;;;24797:62;24895:34;24875:18;;;24868:62;24947:19;;101305:118:0::1;24544:428:1::0;101305:118:0::1;101438:9;101434:139;101457:17;:24:::0;101453:28;::::1;101434:139;;;101503:58;101520:7;15192:6:::0;;-1:-1:-1;;;;;15192:6:0;;15119:87;101520:7:::1;101529:17;101547:1;101529:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;101529:20:0::1;101551:6;101558:1;101551:9;;;;;;;;:::i;:::-;;;;;;;101503:16;:58::i;:::-;101483:3:::0;::::1;::::0;::::1;:::i;:::-;;;;101434:139;;95406:223:::0;15192:6;;-1:-1:-1;;;;;15192:6:0;13923:10;15339:23;15331:68;;;;-1:-1:-1;;;15331:68:0;;;;;;;:::i;:::-;95487:9:::1;95483:139;95504:6;:13;95500:1;:17;95483:139;;;95538:12;95553:6;95560:1;95553:9;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;95577:26:0::1;;::::0;;;:20:::1;:26:::0;;;;;;:33;;-1:-1:-1;;95577:33:0::1;95606:4;95577:33;::::0;;-1:-1:-1;95519:3:0;::::1;::::0;::::1;:::i;:::-;;;;95483:139;;17167:412:::0;15192:6;;-1:-1:-1;;;;;15192:6:0;13923:10;15339:23;15331:68;;;;-1:-1:-1;;;15331:68:0;;;;;;;:::i;:::-;17239:21:::1;17279:11:::0;17271:41:::1;;;::::0;-1:-1:-1;;;17271:41:0;;30405:2:1;17271:41:0::1;::::0;::::1;30387:21:1::0;30444:2;30424:18;;;30417:30;-1:-1:-1;;;30463:18:1;;;30456:47;30520:18;;17271:41:0::1;30203:341:1::0;17271:41:0::1;17329:7;17325:193;17346:5;:12:::0;17342:16:::1;::::0;::::1;;17325:193;;;17402:1;17382:5;17388:1;17382:8;;;;;;;;;;:::i;:::-;;;;;;;;;;;:17;;;:21;17379:128;;;17423:68;17433:5;17439:1;17433:8;;;;;;;;;;:::i;:::-;;;;;;;;;;;:15;;;;;;;;;;-1:-1:-1::0;;;;;17433:15:0::1;17450:40;17485:4;17450:30;17462:5;17468:1;17462:8;;;;;;;;;;:::i;:::-;;;;;;;;;;;:17;;;17450:7;:11;;:30;;;;:::i;:::-;:34:::0;::::1;:40::i;:::-;17423:9;:68::i;:::-;17360:3:::0;::::1;::::0;::::1;:::i;:::-;;;;17325:193;;;;17530:41;17540:7;15192:6:::0;;-1:-1:-1;;;;;15192:6:0;;15119:87;17540:7:::1;17549:21;17530:9;:41::i;:::-;17210:369;17167:412::o:0;69081:185::-;69219:39;69236:4;69242:2;69246:7;69219:39;;;;;;;;;;;;:16;:39::i;92622:113::-;15192:6;;-1:-1:-1;;;;;15192:6:0;13923:10;15339:23;15331:68;;;;-1:-1:-1;;;15331:68:0;;;;;;;:::i;:::-;92704:11:::1;:23:::0;;-1:-1:-1;;;;;;92704:23:0::1;-1:-1:-1::0;;;;;92704:23:0;;;::::1;::::0;;;::::1;::::0;;92622:113::o;80372:233::-;80447:7;80483:30;80270:10;:17;;80182:113;80483:30;80475:5;:38;80467:95;;;;-1:-1:-1;;;80467:95:0;;29284:2:1;80467:95:0;;;29266:21:1;29323:2;29303:18;;;29296:30;29362:34;29342:18;;;29335:62;-1:-1:-1;;;29413:18:1;;;29406:42;29465:19;;80467:95:0;29082:408:1;80467:95:0;80580:10;80591:5;80580:17;;;;;;;;:::i;:::-;;;;;;;;;80573:24;;80372:233;;;:::o;95637:104::-;15192:6;;-1:-1:-1;;;;;15192:6:0;13923:10;15339:23;15331:68;;;;-1:-1:-1;;;15331:68:0;;;;;;;:::i;:::-;95712:21;;::::1;::::0;:7:::1;::::0;:21:::1;::::0;::::1;::::0;::::1;:::i;100656:379::-:0;100707:11;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;100707:11:0;100720:32;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;100720:32:0;100774:110;;;;;;;;100779:5;:15;;;;-1:-1:-1;;;12554:21:1;;12600:1;12591:11;;12352:256;100779:15:0;;;;;;;;;;;;;:21;;;100774:110;;;;100802:22;;100774:110;;;;100826:5;:17;;;;;:::i;:::-;;;;;;;;;;;;;:23;;;100774:110;;;;88388:4;100774:110;;;;;;100863:13;80270:10;:17;;80182:113;100863:13;100774:110;;100878:2;100774:110;;;;;;;;100882:1;100774:110;;;;;100896:129;;;;;;;100922:33;;100896:129;;100957:32;;100896:129;;;;-1:-1:-1;;;;100991:17:0;100922:8;100991:17;;;:33;;100896:129;;;;;;;100766:260;;100896:129;;-1:-1:-1;100656:379:0;-1:-1:-1;100656:379:0:o;93742:361::-;93805:16;93834:23;93860:17;93870:6;93860:9;:17::i;:::-;93834:43;;93888:25;93930:15;-1:-1:-1;;;;;93916:30:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;93916:30:0;;93888:58;;93962:9;93957:113;93977:15;93973:1;:19;93957:113;;;94028:30;94048:6;94056:1;94028:19;:30::i;:::-;94014:8;94023:1;94014:11;;;;;;;;:::i;:::-;;;;;;;;;;:44;93994:3;;;;:::i;:::-;;;;93957:113;;;-1:-1:-1;94087:8:0;93742:361;-1:-1:-1;;;93742:361:0:o;92860:130::-;15192:6;;-1:-1:-1;;;;;15192:6:0;13923:10;15339:23;15331:68;;;;-1:-1:-1;;;15331:68:0;;;;;;;:::i;:::-;92952:15:::1;::::0;;;:8:::1;:15;::::0;;;;;;;;:30;;;;;;::::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;;::::0;::::1;::::0;;::::1;::::0;;-1:-1:-1;;92952:30:0::1;;::::0;;::::1;::::0;;;::::1;::::0;;92860:130::o;66056:239::-;66128:7;66164:16;;;:7;:16;;;;;;-1:-1:-1;;;;;66164:16:0;66199:19;66191:73;;;;-1:-1:-1;;;66191:73:0;;23989:2:1;66191:73:0;;;23971:21:1;24028:2;24008:18;;;24001:30;24067:34;24047:18;;;24040:62;-1:-1:-1;;;24118:18:1;;;24111:39;24167:19;;66191:73:0;23787:405:1;88676:21:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;65786:208::-;65858:7;-1:-1:-1;;;;;65886:19:0;;65878:74;;;;-1:-1:-1;;;65878:74:0;;23578:2:1;65878:74:0;;;23560:21:1;23617:2;23597:18;;;23590:30;23656:34;23636:18;;;23629:62;-1:-1:-1;;;23707:18:1;;;23700:40;23757:19;;65878:74:0;23376:406:1;65878:74:0;-1:-1:-1;;;;;;65970:16:0;;;;;:9;:16;;;;;;;65786:208::o;15770:103::-;15192:6;;-1:-1:-1;;;;;15192:6:0;13923:10;15339:23;15331:68;;;;-1:-1:-1;;;15331:68:0;;;;;;;:::i;:::-;15835:30:::1;15862:1;15835:18;:30::i;:::-;15770:103::o:0;94466:136::-;94541:6;94567:11;94579:5;94567:18;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;94567:27:0;;;;;;;;;;;;;;-1:-1:-1;94466:136:0;;;;:::o;66531:104::-;66587:13;66620:7;66613:14;;;;;:::i;68214:155::-;68309:52;13923:10;68342:8;68352;68309:18;:52::i;93285:169::-;93366:11;;:34;;-1:-1:-1;;;93366:34:0;;-1:-1:-1;;;;;14211:32:1;;;93366:34:0;;;14193:51:1;93366:11:0;14260:18:1;;;14253:34;93342:4:0;;;;93366:11;;;:21;;14166:18:1;;93366:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:38;:80;;;-1:-1:-1;93408:11:0;;:34;;-1:-1:-1;;;93408:34:0;;-1:-1:-1;;;;;14211:32:1;;;93408:34:0;;;14193:51:1;93440:1:0;14260:18:1;;;14253:34;93445:1:0;;93408:11;;:21;;14166:18:1;;93408:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:38;93359:87;93285:169;-1:-1:-1;;93285:169:0:o;69337:328::-;69512:41;13923:10;69545:7;69512:18;:41::i;:::-;69504:103;;;;-1:-1:-1;;;69504:103:0;;;;;;;:::i;:::-;69618:39;69632:4;69638:2;69642:7;69651:5;69618:13;:39::i;:::-;69337:328;;;;:::o;99512:770::-;99578:7;99587;99596;99619:22;;;;;;;;;;;;;;-1:-1:-1;;;99619:22:0;;;:10;:22::i;:::-;:48;;;;-1:-1:-1;;;;;;93207:27:0;;93165:4;93207:27;;;:20;:27;;;;;;;;99645:22;99616:659;;;-1:-1:-1;;;;;99724:31:0;;:22;:31;;;:22;;:31;;;:22;:31;;;-1:-1:-1;;;99691:16:0;;;:8;:16;;:30;;:64;;99724:31;;;;;99691:30;:64;:::i;:::-;-1:-1:-1;;;;;99791:32:0;;:23;:32;;;:23;;:32;;;:23;:32;;;-1:-1:-1;;;99757:17:0;;;:8;:17;;:31;;:66;;99791:32;;;;;99757:31;:66;:::i;:::-;-1:-1:-1;;;;;99859:32:0;;:23;:32;;;:23;;:32;;;:23;:32;;;-1:-1:-1;;;99825:17:0;;;:8;:17;;:31;;:66;;99859:32;;;;;99825:31;:66;:::i;:::-;99684:208;;;;;-1:-1:-1;99684:208:0;;;;-1:-1:-1;99684:208:0;;-1:-1:-1;99684:208:0;;99616:659;99914:22;;;;;;;;;;;;;;-1:-1:-1;;;99914:22:0;;;:10;:22::i;:::-;:49;;;;-1:-1:-1;;;;;;93207:27:0;;93165:4;93207:27;;;:20;:27;;;;;;;;99940:23;99914:49;99910:365;;;-1:-1:-1;99988:1:0;;-1:-1:-1;99988:1:0;;-1:-1:-1;99988:1:0;99980:16;;99910:365;100018:20;;;;;;;;;;;;;;-1:-1:-1;;;100018:20:0;;;:10;:20::i;:::-;100014:261;;;-1:-1:-1;;;;;100095:31:0;;:22;:31;;;:22;;:31;;;:22;:31;;;-1:-1:-1;;;100062:16:0;;;:8;:16;;:30;;:64;;100095:31;;;;;100062:30;:64;:::i;100014:261::-;99512:770;;;;;:::o;97153:598::-;15192:6;;-1:-1:-1;;;;;15192:6:0;13923:10;15339:23;15331:68;;;;-1:-1:-1;;;15331:68:0;;;;;;;:::i;:::-;97238:28:::1;97280:7;-1:-1:-1::0;;;;;97269:19:0::1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;97269:19:0::1;-1:-1:-1::0;97299:20:0::1;97322:22:::0;;;:8:::1;:22;::::0;;;;:35:::1;;::::0;97238:50;;-1:-1:-1;97368:314:0::1;97389:7;97385:1;:11;97368:314;;;97418:37;13923:10:::0;97442:12:::1;97418:9;:37::i;:::-;97490:12;97470:14;97485:1;97470:17;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;:32;;;;97517:22:::1;::::0;;;:8:::1;:22:::0;;;;;;:35:::1;;:37:::0;;;::::1;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;97569:22:0::1;::::0;;;:8:::1;:22;::::0;;;;:38:::1;;:40:::0;;;::::1;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;97624:15:0::1;:17:::0;;;:15:::1;:17;::::0;::::1;:::i;:::-;;;;;;97656:14;;;;;:::i;:::-;;;;97398:3;;;;;:::i;:::-;;;;97368:314;;;-1:-1:-1::0;97699:44:0::1;97714:14:::0;13923:10;97699:44:::1;;;;;;;:::i;:::-;;;;;;;;97227:524;;97153:598:::0;;:::o;95749:258::-;71240:4;71264:16;;;:7;:16;;;;;;95814:13;;-1:-1:-1;;;;;71264:16:0;95840:76;;;;-1:-1:-1;;;95840:76:0;;26659:2:1;95840:76:0;;;26641:21:1;26698:2;26678:18;;;26671:30;26737:34;26717:18;;;26710:62;-1:-1:-1;;;26788:18:1;;;26781:45;26843:19;;95840:76:0;26457:411:1;95840:76:0;95958:10;:8;:10::i;:::-;95970:18;:7;:16;:18::i;:::-;95941:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;95927:72;;95749:258;;;:::o;16806:19::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16806:19:0;;;;-1:-1:-1;16806:19:0;:::o;92269:117::-;15192:6;;-1:-1:-1;;;;;15192:6:0;13923:10;15339:23;15331:68;;;;-1:-1:-1;;;15331:68:0;;;;;;;:::i;:::-;92372:6:::1;92350:5;92356;92350:12;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:19:::1;;:28:::0;;;::::1;;-1:-1:-1::0;;92350:28:0;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;92269:117:0:o;94111:231::-;94175:7;94195:25;94223:24;94240:6;94223:16;:24::i;:::-;94285:15;;94111:231;-1:-1:-1;;;94111:231:0:o;30656:112::-;30736:24;;-1:-1:-1;;;30736:24:0;;-1:-1:-1;;;;;13250:32:1;;;30736:24:0;;;13232:51:1;30709:7:0;;30736;:18;;;;;;13205::1;;30736:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;88706:34::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;88706:34:0;;-1:-1:-1;88706:34:0;:::o;93462:272::-;93525:4;;93542:162;93566:17;:24;93562:28;;93542:162;;;93640:5;-1:-1:-1;;;;;93616:29:0;:17;93634:1;93616:20;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;93616:20:0;:29;93612:81;;;-1:-1:-1;93673:4:0;;93462:272;-1:-1:-1;;93462:272:0:o;93612:81::-;93592:3;;;;:::i;:::-;;;;93542:162;;;-1:-1:-1;93721:5:0;;93462:272;-1:-1:-1;;93462:272:0:o;16028:201::-;15192:6;;-1:-1:-1;;;;;15192:6:0;13923:10;15339:23;15331:68;;;;-1:-1:-1;;;15331:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;16117:22:0;::::1;16109:73;;;::::0;-1:-1:-1;;;16109:73:0;;18924:2:1;16109:73:0::1;::::0;::::1;18906:21:1::0;18963:2;18943:18;;;18936:30;19002:34;18982:18;;;18975:62;-1:-1:-1;;;19053:18:1;;;19046:36;19099:19;;16109:73:0::1;18722:402:1::0;16109:73:0::1;16193:28;16212:8;16193:18;:28::i;96015:152::-:0;15192:6;;-1:-1:-1;;;;;15192:6:0;13923:10;15339:23;15331:68;;;;-1:-1:-1;;;15331:68:0;;;;;;;:::i;:::-;96098:24:::1;96105:17;;96098:24;:::i;:::-;96133:26;:17;96153:6:::0;;96133:26:::1;:::i;65417:305::-:0;65519:4;-1:-1:-1;;;;;;65556:40:0;;-1:-1:-1;;;65556:40:0;;:105;;-1:-1:-1;;;;;;;65613:48:0;;-1:-1:-1;;;65613:48:0;65556:105;:158;;;-1:-1:-1;;;;;;;;;;41643:40:0;;;65678:36;41534:157;75321:174;75396:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;75396:29:0;-1:-1:-1;;;;;75396:29:0;;;;;;;;:24;;75450:23;75396:24;75450:14;:23::i;:::-;-1:-1:-1;;;;;75441:46:0;;;;;;;;;;;75321:174;;:::o;96285:473::-;90312:892;;;;;;;;;;;;;-1:-1:-1;;;90312:892:0;;;96373:6;90384:17;90395:5;90384:10;:17::i;:::-;90376:44;;;;-1:-1:-1;;;90376:44:0;;27477:2:1;90376:44:0;;;27459:21:1;27516:2;27496:18;;;27489:30;-1:-1:-1;;;27535:18:1;;;27528:44;27589:18;;90376:44:0;27275:338:1;90376:44:0;90448:1;90439:6;:10;90431:41;;;;-1:-1:-1;;;90431:41:0;;;;;;;:::i;:::-;90501:15;;90491:6;:25;;90483:83;;;;-1:-1:-1;;;90483:83:0;;;;;;;:::i;:::-;90603:1;90585:15;;:19;90577:54;;;;-1:-1:-1;;;90577:54:0;;20449:2:1;90577:54:0;;;20431:21:1;20488:2;20468:18;;;20461:30;-1:-1:-1;;;20507:18:1;;;20500:52;20569:18;;90577:54:0;20247:346:1;90577:54:0;90660:5;90666;90660:12;;;;;;:::i;:::-;;;;;;;;;;;;;;:21;;-1:-1:-1;;;90660:21:0;;;;90650:31;;;90642:60;;;;-1:-1:-1;;;90642:60:0;;21981:2:1;90642:60:0;;;21963:21:1;22020:2;22000:18;;;21993:30;-1:-1:-1;;;22039:18:1;;;22032:46;22095:18;;90642:60:0;21779:340:1;90642:60:0;90787:5;90793;90787:12;;;;;;:::i;:::-;;;;;;;;;;;;;;:25;-1:-1:-1;;;90787:25:0;;;;;;90721:92;;;90769:6;;90727:11;;:18;;90739:5;;90727:18;:::i;:::-;;;;;;;;;;;;;:32;90746:12;13923:10;;13843:98;90746:12;-1:-1:-1;;;;;90727:32:0;;;;;;;;;;;;-1:-1:-1;90727:32:0;;:49;;;:32;;:49;:::i;:::-;90721:92;;;;90713:125;;;;-1:-1:-1;;;90713:125:0;;;;;;;:::i;:::-;90871:5;:17;;;;;:::i;:::-;;;;;;;;;;;;;;:21;-1:-1:-1;;;;;;;;90871:21:0;;;;90853:15;:39;:65;;;;-1:-1:-1;90896:22:0;13923:10;93285:169;:::i;90896:22::-;90849:275;;;90981:6;90956:22;;:31;;;;:::i;:::-;90943:9;:44;;90935:74;;;;-1:-1:-1;;;90935:74:0;;;;;;;:::i;:::-;90849:275;;;91084:6;91063:5;91069;91063:12;;;;;;:::i;:::-;;;;;;;;;;;;;:18;;;:27;;;;:::i;:::-;91050:9;:40;;91042:70;;;;-1:-1:-1;;;91042:70:0;;;;;;;:::i;:::-;91177:6;91134:11;91146:5;91134:18;;;;;;:::i;:::-;;;;;;;;;;;;;:32;91153:12;13923:10;;13843:98;91153:12;-1:-1:-1;;;;;91134:32:0;;;;;;;;;;;;-1:-1:-1;91134:32:0;;;:50;;:32;;-1:-1:-1;91134:50:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;96394:12:::1;96408:6;-1:-1:-1::0;;;91334:36:0::1;;;;;;11371:19:1::0;;11415:2;11406:12;;11242:182;91334:36:0::1;;::::0;;-1:-1:-1;;91334:36:0;;::::1;::::0;;;;;;91324:47;;91334:36:::1;91324:47:::0;;::::1;::::0;91294:25;;::::1;11371:19:1::0;;;91324:47:0;11406:12:1;91294:25:0::1;;;;;;;;;;;;91284:36;;;;;;:87;;91276:126;;;::::0;-1:-1:-1;;;91276:126:0;;20094:2:1;91276:126:0::1;::::0;::::1;20076:21:1::0;20133:2;20113:18;;;20106:30;20172:28;20152:18;;;20145:56;20218:18;;91276:126:0::1;19892:350:1::0;91276:126:0::1;91430:1;91421:6;:10;91413:41;;;;-1:-1:-1::0;;;91413:41:0::1;;;;;;;:::i;:::-;91491:15;::::0;;;:8:::1;:15;::::0;;;;:29:::1;;::::0;::::1;;91473:48:::0;::::1;;91465:82;;;;-1:-1:-1::0;;;91465:82:0::1;;;;;;;:::i;:::-;91600:1;91566:15:::0;;;:8:::1;:15;::::0;;;;:31:::1;;::::0;91558:74:::1;;;::::0;-1:-1:-1;;;91558:74:0;;27820:2:1;91558:74:0::1;::::0;::::1;27802:21:1::0;27859:2;27839:18;;;27832:30;27898:28;27878:18;;;27871:56;27944:18;;91558:74:0::1;27618:350:1::0;91558:74:0::1;91651:15;::::0;;;:8:::1;:15;::::0;;;;:31:::1;;::::0;:41;-1:-1:-1;91651:41:0::1;91643:107;;;;-1:-1:-1::0;;;91643:107:0::1;;;;;;;:::i;:::-;91838:15;::::0;;;:8:::1;:15;::::0;;;;;;;:29:::1;;::::0;91775:14:::1;:21:::0;;;;;13923:10;91775:35;;;;;;;;;91838:29:::1;::::0;;::::1;::::0;91769:99:::1;::::0;91775:52:::1;::::0;91820:6;;91775:35:::1;:52;:::i;:::-;91769:99;;;;91761:142;;;::::0;-1:-1:-1;;;91761:142:0;;29697:2:1;91761:142:0::1;::::0;::::1;29679:21:1::0;29736:2;29716:18;;;29709:30;29775:32;29755:18;;;29748:60;29825:18;;91761:142:0::1;29495:354:1::0;91761:142:0::1;91914:21;::::0;;;:14:::1;:21;::::0;;;;;;;13923:10;91914:35;;;;;;;:53;;91960:6;;91914:21;:53:::1;::::0;91960:6;;91914:53:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;96435:27:::2;96449:12;13923:10:::0;;13843:98;96435:27:::2;96427:60;;;::::0;-1:-1:-1;;;96427:60:0;;30056:2:1;96427:60:0::2;::::0;::::2;30038:21:1::0;30095:2;30075:18;;;30068:30;-1:-1:-1;;;30114:18:1;;;30107:50;30174:18;;96427:60:0::2;29854:344:1::0;96427:60:0::2;88565:1;96506:54;;96512:11;:23;;;;;:::i;:::-;;;;;;;;;;;;;:37;96536:12;13923:10:::0;;13843:98;96536:12:::2;-1:-1:-1::0;;;;;96512:37:0::2;::::0;;::::2;::::0;::::2;::::0;;;;;;-1:-1:-1;96512:37:0;;::::2;;::::0;96506:54:::2;;;96498:98;;;::::0;-1:-1:-1;;;96498:98:0;;30751:2:1;96498:98:0::2;::::0;::::2;30733:21:1::0;30790:2;30770:18;;;30763:30;30829:33;30809:18;;;30802:61;30880:18;;96498:98:0::2;30549:355:1::0;96498:98:0::2;96615:68;96621:28:::0;;;:14:::2;:28;::::0;;;;;;;13923:10;96621:42;;;;;;;;88527:1:::2;96621:42;::::0;;::::2;::::0;96615:68:::2;;;96607:102;;;;-1:-1:-1::0;;;96607:102:0::2;;;;;;;:::i;:::-;96720:30;96729:6;96737:12;96720:8;:30::i;:::-;91195:1:::1;;96285:473:::0;;;;:::o;96766:379::-;90312:892;;;;;;;;;;;;;-1:-1:-1;;;90312:892:0;;;96855:6;90384:17;90395:5;90384:10;:17::i;:::-;90376:44;;;;-1:-1:-1;;;90376:44:0;;27477:2:1;90376:44:0;;;27459:21:1;27516:2;27496:18;;;27489:30;-1:-1:-1;;;27535:18:1;;;27528:44;27589:18;;90376:44:0;27275:338:1;90376:44:0;90448:1;90439:6;:10;90431:41;;;;-1:-1:-1;;;90431:41:0;;;;;;;:::i;:::-;90501:15;;90491:6;:25;;90483:83;;;;-1:-1:-1;;;90483:83:0;;;;;;;:::i;:::-;90603:1;90585:15;;:19;90577:54;;;;-1:-1:-1;;;90577:54:0;;20449:2:1;90577:54:0;;;20431:21:1;20488:2;20468:18;;;20461:30;-1:-1:-1;;;20507:18:1;;;20500:52;20569:18;;90577:54:0;20247:346:1;90577:54:0;90660:5;90666;90660:12;;;;;;:::i;:::-;;;;;;;;;;;;;;:21;;-1:-1:-1;;;90660:21:0;;;;90650:31;;;90642:60;;;;-1:-1:-1;;;90642:60:0;;21981:2:1;90642:60:0;;;21963:21:1;22020:2;22000:18;;;21993:30;-1:-1:-1;;;22039:18:1;;;22032:46;22095:18;;90642:60:0;21779:340:1;90642:60:0;90787:5;90793;90787:12;;;;;;:::i;:::-;;;;;;;;;;;;;;:25;-1:-1:-1;;;90787:25:0;;;;;;90721:92;;;90769:6;;90727:11;;:18;;90739:5;;90727:18;:::i;:::-;;;;;;;;;;;;;:32;90746:12;13923:10;;13843:98;90746:12;-1:-1:-1;;;;;90727:32:0;;;;;;;;;;;;-1:-1:-1;90727:32:0;;:49;;;:32;;:49;:::i;:::-;90721:92;;;;90713:125;;;;-1:-1:-1;;;90713:125:0;;;;;;;:::i;:::-;90871:5;:17;;;;;:::i;:::-;;;;;;;;;;;;;;:21;-1:-1:-1;;;;;;;;90871:21:0;;;;90853:15;:39;:65;;;;-1:-1:-1;90896:22:0;13923:10;93285:169;:::i;90896:22::-;90849:275;;;90981:6;90956:22;;:31;;;;:::i;:::-;90943:9;:44;;90935:74;;;;-1:-1:-1;;;90935:74:0;;;;;;;:::i;:::-;90849:275;;;91084:6;91063:5;91069;91063:12;;;;;;:::i;:::-;;;;;;;;;;;;;:18;;;:27;;;;:::i;:::-;91050:9;:40;;91042:70;;;;-1:-1:-1;;;91042:70:0;;;;;;;:::i;:::-;91177:6;91134:11;91146:5;91134:18;;;;;;:::i;:::-;;;;;;;;;;;;;:32;91153:12;13923:10;;13843:98;91153:12;-1:-1:-1;;;;;91134:32:0;;;;;;;;;;;;-1:-1:-1;91134:32:0;;;:50;;:32;;-1:-1:-1;91134:50:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;96876:12:::1;96890:6;-1:-1:-1::0;;;91334:36:0::1;;;;;;11371:19:1::0;;11415:2;11406:12;;11242:182;91334:36:0::1;;::::0;;-1:-1:-1;;91334:36:0;;::::1;::::0;;;;;;91324:47;;91334:36:::1;91324:47:::0;;::::1;::::0;91294:25;;::::1;11371:19:1::0;;;91324:47:0;11406:12:1;91294:25:0::1;;;;;;;;;;;;91284:36;;;;;;:87;;91276:126;;;::::0;-1:-1:-1;;;91276:126:0;;20094:2:1;91276:126:0::1;::::0;::::1;20076:21:1::0;20133:2;20113:18;;;20106:30;20172:28;20152:18;;;20145:56;20218:18;;91276:126:0::1;19892:350:1::0;91276:126:0::1;91430:1;91421:6;:10;91413:41;;;;-1:-1:-1::0;;;91413:41:0::1;;;;;;;:::i;:::-;91491:15;::::0;;;:8:::1;:15;::::0;;;;:29:::1;;::::0;::::1;;91473:48:::0;::::1;;91465:82;;;;-1:-1:-1::0;;;91465:82:0::1;;;;;;;:::i;:::-;91600:1;91566:15:::0;;;:8:::1;:15;::::0;;;;:31:::1;;::::0;91558:74:::1;;;::::0;-1:-1:-1;;;91558:74:0;;27820:2:1;91558:74:0::1;::::0;::::1;27802:21:1::0;27859:2;27839:18;;;27832:30;27898:28;27878:18;;;27871:56;27944:18;;91558:74:0::1;27618:350:1::0;91558:74:0::1;91651:15;::::0;;;:8:::1;:15;::::0;;;;:31:::1;;::::0;:41;-1:-1:-1;91651:41:0::1;91643:107;;;;-1:-1:-1::0;;;91643:107:0::1;;;;;;;:::i;:::-;91838:15;::::0;;;:8:::1;:15;::::0;;;;;;;:29:::1;;::::0;91775:14:::1;:21:::0;;;;;13923:10;91775:35;;;;;;;;;91838:29:::1;::::0;;::::1;::::0;91769:99:::1;::::0;91775:52:::1;::::0;91820:6;;91775:35:::1;:52;:::i;:::-;91769:99;;;;91761:142;;;::::0;-1:-1:-1;;;91761:142:0;;29697:2:1;91761:142:0::1;::::0;::::1;29679:21:1::0;29736:2;29716:18;;;29709:30;29775:32;29755:18;;;29748:60;29825:18;;91761:142:0::1;29495:354:1::0;91761:142:0::1;91914:21;::::0;;;:14:::1;:21;::::0;;;;;;;13923:10;91914:35;;;;;;;:53;;91960:6;;91914:21;:53:::1;::::0;91960:6;;91914:53:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;96912:27:::2;96926:12;13923:10:::0;;13843:98;96912:27:::2;96909:188;;;97010:21;::::0;;-1:-1:-1;;;12554:21:1;;97010:11:0::2;12600:1:1::0;12591:11;;97010:21:0;;;;;;;;;;;;;13923:10;-1:-1:-1;97010:35:0;;;::::2;::::0;;;;;;;;;88607:2:::2;::::0;97010:35:::2;::::0;;::::2;::::0;96970:23:::2;::::0;::::2;:::i;:::-;;;;;;;;;;;;;:37;96994:12;13923:10:::0;;13843:98;96994:12:::2;-1:-1:-1::0;;;;;96970:37:0::2;::::0;;::::2;::::0;::::2;::::0;;;;;;-1:-1:-1;96970:37:0;;:75:::2;::::0;;:37:::2;;:75;:::i;:::-;96964:96;;;;96956:129;;;;-1:-1:-1::0;;;96956:129:0::2;;;;;;;:::i;71469:348::-:0;71562:4;71264:16;;;:7;:16;;;;;;-1:-1:-1;;;;;71264:16:0;71579:73;;;;-1:-1:-1;;;71579:73:0;;22740:2:1;71579:73:0;;;22722:21:1;22779:2;22759:18;;;22752:30;22818:34;22798:18;;;22791:62;-1:-1:-1;;;22869:18:1;;;22862:42;22921:19;;71579:73:0;22538:408:1;71579:73:0;71663:13;71679:23;71694:7;71679:14;:23::i;:::-;71663:39;;71732:5;-1:-1:-1;;;;;71721:16:0;:7;-1:-1:-1;;;;;71721:16:0;;:51;;;;71765:7;-1:-1:-1;;;;;71741:31:0;:20;71753:7;71741:11;:20::i;:::-;-1:-1:-1;;;;;71741:31:0;;71721:51;:87;;;-1:-1:-1;;;;;;68561:25:0;;;68537:4;68561:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;71776:32;71713:96;71469:348;-1:-1:-1;;;;71469:348:0:o;74578:625::-;74737:4;-1:-1:-1;;;;;74710:31:0;:23;74725:7;74710:14;:23::i;:::-;-1:-1:-1;;;;;74710:31:0;;74702:81;;;;-1:-1:-1;;;74702:81:0;;19331:2:1;74702:81:0;;;19313:21:1;19370:2;19350:18;;;19343:30;19409:34;19389:18;;;19382:62;-1:-1:-1;;;19460:18:1;;;19453:35;19505:19;;74702:81:0;19129:401:1;74702:81:0;-1:-1:-1;;;;;74802:16:0;;74794:65;;;;-1:-1:-1;;;74794:65:0;;20800:2:1;74794:65:0;;;20782:21:1;20839:2;20819:18;;;20812:30;20878:34;20858:18;;;20851:62;-1:-1:-1;;;20929:18:1;;;20922:34;20973:19;;74794:65:0;20598:400:1;74794:65:0;74872:39;74893:4;74899:2;74903:7;74872:20;:39::i;:::-;74976:29;74993:1;74997:7;74976:8;:29::i;:::-;-1:-1:-1;;;;;75018:15:0;;;;;;:9;:15;;;;;:20;;75037:1;;75018:15;:20;;75037:1;;75018:20;:::i;:::-;;;;-1:-1:-1;;;;;;;75049:13:0;;;;;;:9;:13;;;;;:18;;75066:1;;75049:13;:18;;75066:1;;75049:18;:::i;:::-;;;;-1:-1:-1;;75078:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;75078:21:0;-1:-1:-1;;;;;75078:21:0;;;;;;;;;75117:27;;75078:16;;75117:27;;;;;;;67514:341;67444:411;;:::o;7613:98::-;7671:7;7698:5;7702:1;7698;:5;:::i;:::-;7691:12;7613:98;-1:-1:-1;;;7613:98:0:o;8012:::-;8070:7;8097:5;8101:1;8097;:5;:::i;17587:180::-;17661:12;17679:8;-1:-1:-1;;;;;17679:13:0;17700:7;17679:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17660:52;;;17731:7;17723:36;;;;-1:-1:-1;;;17723:36:0;;28175:2:1;17723:36:0;;;28157:21:1;28214:2;28194:18;;;28187:30;-1:-1:-1;;;28233:18:1;;;28226:46;28289:18;;17723:36:0;27973:340:1;16389:191:0;16482:6;;;-1:-1:-1;;;;;16499:17:0;;;-1:-1:-1;;;;;;16499:17:0;;;;;;;16532:40;;16482:6;;;16499:17;16482:6;;16532:40;;16463:16;;16532:40;16452:128;16389:191;:::o;75637:315::-;75792:8;-1:-1:-1;;;;;75783:17:0;:5;-1:-1:-1;;;;;75783:17:0;;;75775:55;;;;-1:-1:-1;;;75775:55:0;;21205:2:1;75775:55:0;;;21187:21:1;21244:2;21224:18;;;21217:30;21283:27;21263:18;;;21256:55;21328:18;;75775:55:0;21003:349:1;75775:55:0;-1:-1:-1;;;;;75841:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;75841:46:0;;;;;;;;;;75903:41;;15633::1;;;75903::0;;15606:18:1;75903:41:0;;;;;;;75637:315;;;:::o;70547:::-;70704:28;70714:4;70720:2;70724:7;70704:9;:28::i;:::-;70751:48;70774:4;70780:2;70784:7;70793:5;70751:22;:48::i;:::-;70743:111;;;;-1:-1:-1;;;70743:111:0;;;;;;;:::i;72159:110::-;72235:26;72245:2;72249:7;72235:26;;;;;;;;;;;;:9;:26::i;94350:108::-;94410:13;94443:7;94436:14;;;;;:::i;11405:723::-;11461:13;11682:10;11678:53;;-1:-1:-1;;11709:10:0;;;;;;;;;;;;-1:-1:-1;;;11709:10:0;;;;;11405:723::o;11678:53::-;11756:5;11741:12;11797:78;11804:9;;11797:78;;11830:8;;;;:::i;:::-;;-1:-1:-1;11853:10:0;;-1:-1:-1;11861:2:0;11853:10;;:::i;:::-;;;11797:78;;;11885:19;11917:6;-1:-1:-1;;;;;11907:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11907:17:0;;11885:39;;11935:154;11942:10;;11935:154;;11969:11;11979:1;11969:11;;:::i;:::-;;-1:-1:-1;12038:10:0;12046:2;12038:5;:10;:::i;:::-;12025:24;;:2;:24;:::i;:::-;12012:39;;11995:6;12002;11995:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;11995:56:0;;;;;;;;-1:-1:-1;12066:11:0;12075:2;12066:11;;:::i;:::-;;;11935:154;;97759:1087;97835:28;97877:7;-1:-1:-1;;;;;97866:19:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;97866:19:0;;97835:50;;97896:20;97919:8;:22;97928:12;97919:22;;;;;;;;;;;:35;;;97896:58;;97965:14;97993:20;;;;;;;;;;;;;;-1:-1:-1;;;97993:20:0;;;:10;:20::i;:::-;:46;;;;-1:-1:-1;98017:22:0;13923:10;93285:169;:::i;98017:22::-;97990:329;;;98078:22;;98068:32;;:7;:32;:::i;:::-;98056:44;;97990:329;;;98122:20;;;;;;;;;;;;;;-1:-1:-1;;;98122:20:0;;;:10;:20::i;:::-;:47;;;;-1:-1:-1;98147:22:0;13923:10;93285:169;:::i;98147:22::-;98146:23;98122:47;98118:201;;;98208:15;;;-1:-1:-1;;;12554:21:1;;98208:5:0;12600:1:1;12591:11;;98208:15:0;;;;;;;;;;;:21;;;98198:31;;:7;:31;:::i;98118:201::-;98284:5;:17;;;;;:::i;:::-;;;;;;;;;;;;;:23;;;98274:7;:33;;;;:::i;:::-;98262:45;;98118:201;98329:12;98344:28;:9;88477:4;88433:5;98344:16;:28::i;:::-;98329:43;;98383:67;98398:42;98442:7;98383:14;:67::i;:::-;98468:6;98463:314;98484:7;98480:1;:11;98463:314;;;98513:37;13923:10;98537:12;98513:9;:37::i;:::-;98585:12;98565:14;98580:1;98565:17;;;;;;;;:::i;:::-;;;;;;;;;;;:32;;;;98612:22;;;;:8;:22;;;;;;:35;;:37;;;;;;:::i;:::-;;;;-1:-1:-1;;98664:22:0;;;;:8;:22;;;;;:38;;:40;;;;;;:::i;:::-;;;;-1:-1:-1;;98719:15:0;:17;;;:15;:17;;;:::i;:::-;;;;;;98751:14;;;;;:::i;:::-;;;;98493:3;;;;;:::i;:::-;;;;98463:314;;;-1:-1:-1;98794:44:0;98809:14;13923:10;98794:44;;;;;;;:::i;:::-;;;;;;;;97824:1022;;;;97759:1087;;:::o;81218:589::-;-1:-1:-1;;;;;81424:18:0;;81420:187;;81459:40;81491:7;82634:10;:17;;82607:24;;;;:15;:24;;;;;:44;;;82662:24;;;;;;;;;;;;82530:164;81459:40;81420:187;;;81529:2;-1:-1:-1;;;;;81521:10:0;:4;-1:-1:-1;;;;;81521:10:0;;81517:90;;81548:47;81581:4;81587:7;81548:32;:47::i;:::-;-1:-1:-1;;;;;81621:16:0;;81617:183;;81654:45;81691:7;81654:36;:45::i;81617:183::-;81727:4;-1:-1:-1;;;;;81721:10:0;:2;-1:-1:-1;;;;;81721:10:0;;81717:83;;81748:40;81776:2;81780:7;81748:27;:40::i;76517:799::-;76672:4;-1:-1:-1;;;;;76693:13:0;;19339:19;:23;76689:620;;76729:72;;-1:-1:-1;;;76729:72:0;;-1:-1:-1;;;;;76729:36:0;;;;;:72;;13923:10;;76780:4;;76786:7;;76795:5;;76729:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;76729:72:0;;;;;;;;-1:-1:-1;;76729:72:0;;;;;;;;;;;;:::i;:::-;;;76725:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;76971:13:0;;76967:272;;77014:60;;-1:-1:-1;;;77014:60:0;;;;;;;:::i;76967:272::-;77189:6;77183:13;77174:6;77170:2;77166:15;77159:38;76725:529;-1:-1:-1;;;;;;76852:51:0;-1:-1:-1;;;76852:51:0;;-1:-1:-1;76845:58:0;;76689:620;-1:-1:-1;77293:4:0;76517:799;;;;;;:::o;72496:321::-;72626:18;72632:2;72636:7;72626:5;:18::i;:::-;72677:54;72708:1;72712:2;72716:7;72725:5;72677:22;:54::i;:::-;72655:154;;;;-1:-1:-1;;;72655:154:0;;;;;;;:::i;2454:669::-;2526:7;2558:1;2554;:5;2546:34;;;;-1:-1:-1;;;2546:34:0;;25953:2:1;2546:34:0;;;25935:21:1;25992:2;25972:18;;;25965:30;-1:-1:-1;;;26011:18:1;;;26004:46;26067:18;;2546:34:0;25751:340:1;2546:34:0;2597:6;2593:20;;-1:-1:-1;2612:1:0;2605:8;;2593:20;2624:10;2637:5;2641:1;2637;:5;:::i;:::-;2624:18;-1:-1:-1;2667:1:0;2657:6;2662:1;2624:18;2657:6;:::i;:::-;:11;2653:107;;;2742:6;2747:1;2742:2;:6;:::i;:::-;2735:13;;;;;2653:107;2832:9;2844:5;2848:1;2844;:5;:::i;:::-;2832:17;-1:-1:-1;2860:9:0;2872:5;2876:1;2872;:5;:::i;:::-;2860:17;-1:-1:-1;2967:9:0;2979:5;2983:1;2979;:5;:::i;:::-;2967:17;-1:-1:-1;2995:9:0;3007:5;3011:1;3007;:5;:::i;:::-;2995:17;-1:-1:-1;3049:66:0;3099:15;3112:1;3099:8;:1;2995:17;3099:5;:8::i;:15::-;3049:45;3085:8;:1;3091;3085:5;:8::i;:::-;3049:31;3071:8;:1;3077;3071:5;:8::i;:::-;3050:15;3063:1;3050:8;:1;3056;3050:5;:8::i;:::-;:12;;:15::i;:::-;3049:21;;:31::i;:66::-;3042:73;2454:669;-1:-1:-1;;;;;;;;;2454:669:0:o;31137:126::-;31219:36;;-1:-1:-1;;;31219:36:0;;-1:-1:-1;;;;;13250:32:1;;;31219:36:0;;;13232:51:1;31219:7:0;:15;;;;31242:6;;13205:18:1;;31219:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31137:126;;:::o;83321:988::-;83587:22;83637:1;83612:22;83629:4;83612:16;:22::i;:::-;:26;;;;:::i;:::-;83649:18;83670:26;;;:17;:26;;;;;;83587:51;;-1:-1:-1;83803:28:0;;;83799:328;;-1:-1:-1;;;;;83870:18:0;;83848:19;83870:18;;;:12;:18;;;;;;;;:34;;;;;;;;;83921:30;;;;;;:44;;;84038:30;;:17;:30;;;;;:43;;;83799:328;-1:-1:-1;84223:26:0;;;;:17;:26;;;;;;;;84216:33;;;-1:-1:-1;;;;;84267:18:0;;;;;:12;:18;;;;;:34;;;;;;;84260:41;83321:988::o;84604:1079::-;84882:10;:17;84857:22;;84882:21;;84902:1;;84882:21;:::i;:::-;84914:18;84935:24;;;:15;:24;;;;;;85308:10;:26;;84857:46;;-1:-1:-1;84935:24:0;;84857:46;;85308:26;;;;;;:::i;:::-;;;;;;;;;85286:48;;85372:11;85347:10;85358;85347:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;85452:28;;;:15;:28;;;;;;;:41;;;85624:24;;;;;85617:31;85659:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;84675:1008;;;84604:1079;:::o;82108:221::-;82193:14;82210:20;82227:2;82210:16;:20::i;:::-;-1:-1:-1;;;;;82241:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;82286:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;82108:221:0:o;73153:439::-;-1:-1:-1;;;;;73233:16:0;;73225:61;;;;-1:-1:-1;;;73225:61:0;;25179:2:1;73225:61:0;;;25161:21:1;;;25198:18;;;25191:30;25257:34;25237:18;;;25230:62;25309:18;;73225:61:0;24977:356:1;73225:61:0;71240:4;71264:16;;;:7;:16;;;;;;-1:-1:-1;;;;;71264:16:0;:30;73297:58;;;;-1:-1:-1;;;73297:58:0;;19737:2:1;73297:58:0;;;19719:21:1;19776:2;19756:18;;;19749:30;19815;19795:18;;;19788:58;19863:18;;73297:58:0;19535:352:1;73297:58:0;73368:45;73397:1;73401:2;73405:7;73368:20;:45::i;:::-;-1:-1:-1;;;;;73426:13:0;;;;;;:9;:13;;;;;:18;;73443:1;;73426:13;:18;;73443:1;;73426:18;:::i;:::-;;;;-1:-1:-1;;73455:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;73455:21:0;-1:-1:-1;;;;;73455:21:0;;;;;;;;73494:33;;73455:16;;;73494:33;;73455:16;;73494:33;100290:358;;:::o;334:98::-;392:7;419:5;423:1;419;:5;:::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:406:1;78:5;-1:-1:-1;;;;;104:6:1;101:30;98:56;;;134:18;;:::i;:::-;172:57;217:2;196:15;;-1:-1:-1;;192:29:1;223:4;188:40;172:57;:::i;:::-;163:66;;252:6;245:5;238:21;292:3;283:6;278:3;274:16;271:25;268:45;;;309:1;306;299:12;268:45;358:6;353:3;346:4;339:5;335:16;322:43;412:1;405:4;396:6;389:5;385:18;381:29;374:40;14:406;;;;;:::o;425:160::-;490:20;;546:13;;539:21;529:32;;519:60;;575:1;572;565:12;590:221;633:5;686:3;679:4;671:6;667:17;663:27;653:55;;704:1;701;694:12;653:55;726:79;801:3;792:6;779:20;772:4;764:6;760:17;726:79;:::i;816:171::-;883:20;;-1:-1:-1;;;;;932:30:1;;922:41;;912:69;;977:1;974;967:12;992:247;1051:6;1104:2;1092:9;1083:7;1079:23;1075:32;1072:52;;;1120:1;1117;1110:12;1072:52;1159:9;1146:23;1178:31;1203:5;1178:31;:::i;1504:388::-;1572:6;1580;1633:2;1621:9;1612:7;1608:23;1604:32;1601:52;;;1649:1;1646;1639:12;1601:52;1688:9;1675:23;1707:31;1732:5;1707:31;:::i;:::-;1757:5;-1:-1:-1;1814:2:1;1799:18;;1786:32;1827:33;1786:32;1827:33;:::i;:::-;1879:7;1869:17;;;1504:388;;;;;:::o;1897:456::-;1974:6;1982;1990;2043:2;2031:9;2022:7;2018:23;2014:32;2011:52;;;2059:1;2056;2049:12;2011:52;2098:9;2085:23;2117:31;2142:5;2117:31;:::i;:::-;2167:5;-1:-1:-1;2224:2:1;2209:18;;2196:32;2237:33;2196:32;2237:33;:::i;:::-;1897:456;;2289:7;;-1:-1:-1;;;2343:2:1;2328:18;;;;2315:32;;1897:456::o;2358:794::-;2453:6;2461;2469;2477;2530:3;2518:9;2509:7;2505:23;2501:33;2498:53;;;2547:1;2544;2537:12;2498:53;2586:9;2573:23;2605:31;2630:5;2605:31;:::i;:::-;2655:5;-1:-1:-1;2712:2:1;2697:18;;2684:32;2725:33;2684:32;2725:33;:::i;:::-;2777:7;-1:-1:-1;2831:2:1;2816:18;;2803:32;;-1:-1:-1;2886:2:1;2871:18;;2858:32;-1:-1:-1;;;;;2902:30:1;;2899:50;;;2945:1;2942;2935:12;2899:50;2968:22;;3021:4;3013:13;;3009:27;-1:-1:-1;2999:55:1;;3050:1;3047;3040:12;2999:55;3073:73;3138:7;3133:2;3120:16;3115:2;3111;3107:11;3073:73;:::i;:::-;3063:83;;;2358:794;;;;;;;:::o;3157:315::-;3222:6;3230;3283:2;3271:9;3262:7;3258:23;3254:32;3251:52;;;3299:1;3296;3289:12;3251:52;3338:9;3325:23;3357:31;3382:5;3357:31;:::i;:::-;3407:5;-1:-1:-1;3431:35:1;3462:2;3447:18;;3431:35;:::i;:::-;3421:45;;3157:315;;;;;:::o;3477:::-;3545:6;3553;3606:2;3594:9;3585:7;3581:23;3577:32;3574:52;;;3622:1;3619;3612:12;3574:52;3661:9;3648:23;3680:31;3705:5;3680:31;:::i;:::-;3730:5;3782:2;3767:18;;;;3754:32;;-1:-1:-1;;;3477:315:1:o;3797:615::-;3883:6;3891;3944:2;3932:9;3923:7;3919:23;3915:32;3912:52;;;3960:1;3957;3950:12;3912:52;4000:9;3987:23;-1:-1:-1;;;;;4070:2:1;4062:6;4059:14;4056:34;;;4086:1;4083;4076:12;4056:34;4124:6;4113:9;4109:22;4099:32;;4169:7;4162:4;4158:2;4154:13;4150:27;4140:55;;4191:1;4188;4181:12;4140:55;4231:2;4218:16;4257:2;4249:6;4246:14;4243:34;;;4273:1;4270;4263:12;4243:34;4326:7;4321:2;4311:6;4308:1;4304:14;4300:2;4296:23;4292:32;4289:45;4286:65;;;4347:1;4344;4337:12;4286:65;4378:2;4370:11;;;;;4400:6;;-1:-1:-1;3797:615:1;;-1:-1:-1;;;;3797:615:1:o;4417:1032::-;4501:6;4532:2;4575;4563:9;4554:7;4550:23;4546:32;4543:52;;;4591:1;4588;4581:12;4543:52;4631:9;4618:23;-1:-1:-1;;;;;4701:2:1;4693:6;4690:14;4687:34;;;4717:1;4714;4707:12;4687:34;4755:6;4744:9;4740:22;4730:32;;4800:7;4793:4;4789:2;4785:13;4781:27;4771:55;;4822:1;4819;4812:12;4771:55;4858:2;4845:16;4880:2;4876;4873:10;4870:36;;;4886:18;;:::i;:::-;4932:2;4929:1;4925:10;4915:20;;4955:28;4979:2;4975;4971:11;4955:28;:::i;:::-;5017:15;;;5048:12;;;;5080:11;;;5110;;;5106:20;;5103:33;-1:-1:-1;5100:53:1;;;5149:1;5146;5139:12;5100:53;5171:1;5162:10;;5181:238;5195:2;5192:1;5189:9;5181:238;;;5266:3;5253:17;5240:30;;5283:31;5308:5;5283:31;:::i;:::-;5327:18;;;5213:1;5206:9;;;;;5365:12;;;;5397;;5181:238;;;-1:-1:-1;5438:5:1;4417:1032;-1:-1:-1;;;;;;;;4417:1032:1:o;5454:180::-;5513:6;5566:2;5554:9;5545:7;5541:23;5537:32;5534:52;;;5582:1;5579;5572:12;5534:52;-1:-1:-1;5605:23:1;;5454:180;-1:-1:-1;5454:180:1:o;5639:315::-;5707:6;5715;5768:2;5756:9;5747:7;5743:23;5739:32;5736:52;;;5784:1;5781;5774:12;5736:52;5820:9;5807:23;5797:33;;5880:2;5869:9;5865:18;5852:32;5893:31;5918:5;5893:31;:::i;5959:879::-;6052:6;6060;6104:9;6095:7;6091:23;6134:3;6130:2;6126:12;6123:32;;;6151:1;6148;6141:12;6123:32;6174:23;;;-1:-1:-1;6231:4:1;-1:-1:-1;;6213:16:1;;6209:27;6206:47;;;6249:1;6246;6239:12;6206:47;;6282:2;6276:9;6324:4;6316:6;6312:17;6395:6;6383:10;6380:22;-1:-1:-1;;;;;6347:10:1;6344:34;6341:62;6338:88;;;6406:18;;:::i;:::-;6446:10;6442:2;6435:22;;6509:2;6498:9;6494:18;6481:32;6473:6;6466:48;6575:2;6564:9;6560:18;6547:32;6542:2;6534:6;6530:15;6523:57;6641:2;6630:9;6626:18;6613:32;6608:2;6600:6;6596:15;6589:57;6696:4;6685:9;6681:20;6668:34;6742:6;6735:5;6731:18;6724:5;6721:29;6711:57;;6764:1;6761;6754:12;6711:57;6796:2;6784:15;;6777:30;5959:879;;6788:6;;-1:-1:-1;5959:879:1;;-1:-1:-1;;5959:879:1:o;6843:245::-;6901:6;6954:2;6942:9;6933:7;6929:23;6925:32;6922:52;;;6970:1;6967;6960:12;6922:52;7009:9;6996:23;7028:30;7052:5;7028:30;:::i;7093:249::-;7162:6;7215:2;7203:9;7194:7;7190:23;7186:32;7183:52;;;7231:1;7228;7221:12;7183:52;7263:9;7257:16;7282:30;7306:5;7282:30;:::i;7615:322::-;7684:6;7737:2;7725:9;7716:7;7712:23;7708:32;7705:52;;;7753:1;7750;7743:12;7705:52;7793:9;7780:23;-1:-1:-1;;;;;7818:6:1;7815:30;7812:50;;;7858:1;7855;7848:12;7812:50;7881;7923:7;7914:6;7903:9;7899:22;7881:50;:::i;7942:457::-;8020:6;8028;8081:2;8069:9;8060:7;8056:23;8052:32;8049:52;;;8097:1;8094;8087:12;8049:52;8137:9;8124:23;-1:-1:-1;;;;;8162:6:1;8159:30;8156:50;;;8202:1;8199;8192:12;8156:50;8225;8267:7;8258:6;8247:9;8243:22;8225:50;:::i;:::-;8215:60;;;8325:2;8314:9;8310:18;8297:32;8338:31;8363:5;8338:31;:::i;8404:390::-;8479:6;8487;8540:2;8528:9;8519:7;8515:23;8511:32;8508:52;;;8556:1;8553;8546:12;8508:52;8596:9;8583:23;-1:-1:-1;;;;;8621:6:1;8618:30;8615:50;;;8661:1;8658;8651:12;8615:50;8684;8726:7;8717:6;8706:9;8702:22;8684:50;:::i;:::-;8674:60;;;8753:35;8784:2;8773:9;8769:18;8753:35;:::i;8799:1109::-;8899:6;8907;8951:9;8942:7;8938:23;8981:3;8977:2;8973:12;8970:32;;;8998:1;8995;8988:12;8970:32;9038:9;9025:23;-1:-1:-1;;;;;9063:6:1;9060:30;9057:50;;;9103:1;9100;9093:12;9057:50;9126;9168:7;9159:6;9148:9;9144:22;9126:50;:::i;:::-;9116:60;-1:-1:-1;;9210:4:1;-1:-1:-1;;9192:16:1;;9188:27;9185:47;;;9228:1;9225;9218:12;9185:47;;9254:22;;:::i;:::-;9299:37;9332:2;9321:9;9317:18;9299:37;:::i;:::-;9292:5;9285:52;9369:37;9402:2;9391:9;9387:18;9369:37;:::i;:::-;9364:2;9357:5;9353:14;9346:61;9459:2;9448:9;9444:18;9431:32;9508:7;9505:1;9494:22;9485:7;9482:35;9472:63;;9531:1;9528;9521:12;9472:63;9562:2;9551:14;;9544:31;9627:3;9612:19;;9599:33;9676:4;9663:18;;9651:31;;9641:59;;9696:1;9693;9686:12;9641:59;9727:2;9716:14;;9709:31;9801:3;9786:19;;9773:33;9767:3;9756:15;;9749:58;9840:37;9871:4;9856:20;;9840:37;:::i;:::-;9834:3;9827:5;9823:15;9816:62;9897:5;9887:15;;;8799:1109;;;;;:::o;10098:184::-;10168:6;10221:2;10209:9;10200:7;10196:23;10192:32;10189:52;;;10237:1;10234;10227:12;10189:52;-1:-1:-1;10260:16:1;;10098:184;-1:-1:-1;10098:184:1:o;10287:248::-;10355:6;10363;10416:2;10404:9;10395:7;10391:23;10387:32;10384:52;;;10432:1;10429;10422:12;10384:52;-1:-1:-1;;10455:23:1;;;10525:2;10510:18;;;10497:32;;-1:-1:-1;10287:248:1:o;10540:435::-;10593:3;10631:5;10625:12;10658:6;10653:3;10646:19;10684:4;10713:2;10708:3;10704:12;10697:19;;10750:2;10743:5;10739:14;10771:1;10781:169;10795:6;10792:1;10789:13;10781:169;;;10856:13;;10844:26;;10890:12;;;;10925:15;;;;10817:1;10810:9;10781:169;;;-1:-1:-1;10966:3:1;;10540:435;-1:-1:-1;;;;;10540:435:1:o;10980:257::-;11021:3;11059:5;11053:12;11086:6;11081:3;11074:19;11102:63;11158:6;11151:4;11146:3;11142:14;11135:4;11128:5;11124:16;11102:63;:::i;:::-;11219:2;11198:15;-1:-1:-1;;11194:29:1;11185:39;;;;11226:4;11181:50;;10980:257;-1:-1:-1;;10980:257:1:o;11429:276::-;11560:3;11598:6;11592:13;11614:53;11660:6;11655:3;11648:4;11640:6;11636:17;11614:53;:::i;:::-;11683:16;;;;;11429:276;-1:-1:-1;;11429:276:1:o;11710:637::-;11990:3;12028:6;12022:13;12044:53;12090:6;12085:3;12078:4;12070:6;12066:17;12044:53;:::i;:::-;12160:13;;12119:16;;;;12182:57;12160:13;12119:16;12216:4;12204:17;;12182:57;:::i;:::-;-1:-1:-1;;;12261:20:1;;12290:22;;;12339:1;12328:13;;11710:637;-1:-1:-1;;;;11710:637:1:o;12613:258::-;-1:-1:-1;;;12815:23:1;;12863:1;12854:11;;12613:258::o;13518:488::-;-1:-1:-1;;;;;13787:15:1;;;13769:34;;13839:15;;13834:2;13819:18;;13812:43;13886:2;13871:18;;13864:34;;;13934:3;13929:2;13914:18;;13907:31;;;13712:4;;13955:45;;13980:19;;13972:6;13955:45;:::i;:::-;13947:53;13518:488;-1:-1:-1;;;;;;13518:488:1:o;14864:261::-;15043:2;15032:9;15025:21;15006:4;15063:56;15115:2;15104:9;15100:18;15092:6;15063:56;:::i;15130:358::-;15337:2;15326:9;15319:21;15300:4;15357:56;15409:2;15398:9;15394:18;15386:6;15357:56;:::i;:::-;15349:64;;15478:1;15474;15469:3;15465:11;15461:19;15453:6;15449:32;15444:2;15433:9;15429:18;15422:60;15130:358;;;;;:::o;15876:219::-;16025:2;16014:9;16007:21;15988:4;16045:44;16085:2;16074:9;16070:18;16062:6;16045:44;:::i;16100:740::-;16321:3;16310:9;16303:22;16284:4;16342:45;16382:3;16371:9;16367:19;16359:6;16342:45;:::i;:::-;16334:53;;-1:-1:-1;;;;;16479:2:1;16470:6;16464:13;16460:22;16455:2;16444:9;16440:18;16433:50;16547:2;16541;16533:6;16529:15;16523:22;16519:31;16514:2;16503:9;16499:18;16492:59;;16619:2;16611:6;16607:15;16601:22;16598:1;16587:37;16582:2;16571:9;16567:18;16560:65;16690:4;16684:2;16676:6;16672:15;16666:22;16662:33;16656:3;16645:9;16641:19;16634:62;16751:3;16743:6;16739:16;16733:23;16727:3;16716:9;16712:19;16705:52;16826:3;16818:6;16814:16;16808:23;16801:31;16794:39;16788:3;16777:9;16773:19;16766:68;16100:740;;;;;:::o;16845:342::-;17047:2;17029:21;;;17086:2;17066:18;;;17059:30;-1:-1:-1;;;17120:2:1;17105:18;;17098:48;17178:2;17163:18;;16845:342::o;17192:344::-;17394:2;17376:21;;;17433:2;17413:18;;;17406:30;-1:-1:-1;;;17467:2:1;17452:18;;17445:50;17527:2;17512:18;;17192:344::o;17541:345::-;17743:2;17725:21;;;17782:2;17762:18;;;17755:30;-1:-1:-1;;;17816:2:1;17801:18;;17794:51;17877:2;17862:18;;17541:345::o;18303:414::-;18505:2;18487:21;;;18544:2;18524:18;;;18517:30;18583:34;18578:2;18563:18;;18556:62;-1:-1:-1;;;18649:2:1;18634:18;;18627:48;18707:3;18692:19;;18303:414::o;21357:417::-;21559:2;21541:21;;;21598:2;21578:18;;;21571:30;21637:34;21632:2;21617:18;;21610:62;-1:-1:-1;;;21703:2:1;21688:18;;21681:51;21764:3;21749:19;;21357:417::o;22124:409::-;22326:2;22308:21;;;22365:2;22345:18;;;22338:30;22404:34;22399:2;22384:18;;22377:62;-1:-1:-1;;;22470:2:1;22455:18;;22448:43;22523:3;22508:19;;22124:409::o;26096:356::-;26298:2;26280:21;;;26317:18;;;26310:30;26376:34;26371:2;26356:18;;26349:62;26443:2;26428:18;;26096:356::o;28318:413::-;28520:2;28502:21;;;28559:2;28539:18;;;28532:30;28598:34;28593:2;28578:18;;28571:62;-1:-1:-1;;;28664:2:1;28649:18;;28642:47;28721:3;28706:19;;28318:413::o;28736:341::-;28938:2;28920:21;;;28977:2;28957:18;;;28950:30;-1:-1:-1;;;29011:2:1;28996:18;;28989:47;29068:2;29053:18;;28736:341::o;33531:253::-;33603:2;33597:9;33645:4;33633:17;;-1:-1:-1;;;;;33665:34:1;;33701:22;;;33662:62;33659:88;;;33727:18;;:::i;:::-;33763:2;33756:22;33531:253;:::o;33789:275::-;33860:2;33854:9;33925:2;33906:13;;-1:-1:-1;;33902:27:1;33890:40;;-1:-1:-1;;;;;33945:34:1;;33981:22;;;33942:62;33939:88;;;34007:18;;:::i;:::-;34043:2;34036:22;33789:275;;-1:-1:-1;33789:275:1:o;34069:224::-;34108:3;34136:6;34169:2;34166:1;34162:10;34199:2;34196:1;34192:10;34230:3;34226:2;34222:12;34217:3;34214:21;34211:47;;;34238:18;;:::i;:::-;34274:13;;34069:224;-1:-1:-1;;;;34069:224:1:o;34298:128::-;34338:3;34369:1;34365:6;34362:1;34359:13;34356:39;;;34375:18;;:::i;:::-;-1:-1:-1;34411:9:1;;34298:128::o;34431:120::-;34471:1;34497;34487:35;;34502:18;;:::i;:::-;-1:-1:-1;34536:9:1;;34431:120::o;34556:168::-;34596:7;34662:1;34658;34654:6;34650:14;34647:1;34644:21;34639:1;34632:9;34625:17;34621:45;34618:71;;;34669:18;;:::i;:::-;-1:-1:-1;34709:9:1;;34556:168::o;34729:217::-;34768:4;34797:6;34853:10;;;;34823;;34875:12;;;34872:38;;;34890:18;;:::i;:::-;34927:13;;34729:217;-1:-1:-1;;;34729:217:1:o;34951:125::-;34991:4;35019:1;35016;35013:8;35010:34;;;35024:18;;:::i;:::-;-1:-1:-1;35061:9:1;;34951:125::o;35081:258::-;35153:1;35163:113;35177:6;35174:1;35171:13;35163:113;;;35253:11;;;35247:18;35234:11;;;35227:39;35199:2;35192:10;35163:113;;;35294:6;35291:1;35288:13;35285:48;;;-1:-1:-1;;35329:1:1;35311:16;;35304:27;35081:258::o;35344:136::-;35383:3;35411:5;35401:39;;35420:18;;:::i;:::-;-1:-1:-1;;;35456:18:1;;35344:136::o;35485:380::-;35564:1;35560:12;;;;35607;;;35628:61;;35682:4;35674:6;35670:17;35660:27;;35628:61;35735:2;35727:6;35724:14;35704:18;35701:38;35698:161;;;35781:10;35776:3;35772:20;35769:1;35762:31;35816:4;35813:1;35806:15;35844:4;35841:1;35834:15;35698:161;;35485:380;;;:::o;35870:135::-;35909:3;-1:-1:-1;;35930:17:1;;35927:43;;;35950:18;;:::i;:::-;-1:-1:-1;35997:1:1;35986:13;;35870:135::o;36010:175::-;36047:3;36091:4;36084:5;36080:16;36120:4;36111:7;36108:17;36105:43;;;36128:18;;:::i;:::-;36177:1;36164:15;;36010:175;-1:-1:-1;;36010:175:1:o;36190:112::-;36222:1;36248;36238:35;;36253:18;;:::i;:::-;-1:-1:-1;36287:9:1;;36190:112::o;36307:127::-;36368:10;36363:3;36359:20;36356:1;36349:31;36399:4;36396:1;36389:15;36423:4;36420:1;36413:15;36439:127;36500:10;36495:3;36491:20;36488:1;36481:31;36531:4;36528:1;36521:15;36555:4;36552:1;36545:15;36571:127;36632:10;36627:3;36623:20;36620:1;36613:31;36663:4;36660:1;36653:15;36687:4;36684:1;36677:15;36703:127;36764:10;36759:3;36755:20;36752:1;36745:31;36795:4;36792:1;36785:15;36819:4;36816:1;36809:15;36835:127;36896:10;36891:3;36887:20;36884:1;36877:31;36927:4;36924:1;36917:15;36951:4;36948:1;36941:15;36967:131;-1:-1:-1;;;;;37042:31:1;;37032:42;;37022:70;;37088:1;37085;37078:12;37103:131;-1:-1:-1;;;;;;37177:32:1;;37167:43;;37157:71;;37224:1;37221;37214:12

Swarm Source

ipfs://1464ef5ea1e512fc2964c4be04b842d7e31b50876950d68c99bdbf0c1d48c121
Loading