ETH Price: $3,458.22 (+0.51%)
Gas: 6 Gwei

Token

(0x87d193ab78697997d6d7779578298efb009981ea)
 

Overview

Max Total Supply

0

Holders

399

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
0xa75747d5bd207D4Cdb5D403502f39257a10804ea
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
LoveIsInTheAir

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/utils/structs/EnumerableSet.sol


// OpenZeppelin Contracts v4.4.1 (utils/structs/EnumerableSet.sol)

pragma solidity ^0.8.0;

/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
 * and `uint256` (`UintSet`) are supported.
 */
library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

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

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

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

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

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

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

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

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

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

            return true;
        } else {
            return false;
        }
    }

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

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

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

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

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

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

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

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

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

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

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

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

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

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

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

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

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

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

        assembly {
            result := store
        }

        return result;
    }

    // UintSet

    struct UintSet {
        Set _inner;
    }

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

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

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

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

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

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

        assembly {
            result := store
        }

        return result;
    }
}

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


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

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

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

        _;

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

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol


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

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

// 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: @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/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: @manifoldxyz/libraries-solidity/contracts/access/IAdminControl.sol



pragma solidity ^0.8.0;

/// @author: manifold.xyz


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

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

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

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

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

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

}
// File: @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: @manifoldxyz/libraries-solidity/contracts/access/AdminControl.sol



pragma solidity ^0.8.0;







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

    // Track registered admins
    EnumerableSet.AddressSet private _admins;

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

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

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

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

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

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

}
// File: @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/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: contracts/1_Storage.sol


pragma solidity >=0.7.0 <0.9.0;
                                                                          
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@&%%###%%@@@@@@@@@@@&%%%%%&@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@&#(//***,,,,,**//(#%#(//***,,,***//(#%@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@&#(/*,...         ..,,*,,..        ...,,*/(%@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@#/*,..       ..        .                 .,*/(%@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@%(/,..    .,,******,,..     ..,******,,..    .,*/#@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@&(/,.    .,*/(%@@@@%#(/*,...,*/(#&@@@%#(/,.    .,*(#@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@%(*,.   .,*(%@@@@@@@@@&#(**/(#@@@@@@@@@@#/*.    .,/(&@@@@@@@@@@@@@@
//@@@@@@@@@@@@@%(*,.   .,*/#@@@@@@@@@@@@%(%@@@@@@@@@@@@#/*.    .,/(@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@#/*..   .,*/(%@@@@@@@@@@@@@@@@@@@@@@@#(/,..   .,*(#@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@&(/*,.    .,,/(#&@@@@@@@@@@@@@@@@@%#/*,..    .,*/#@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@#(*,..    ..,*/(%@@@@@@@@@@@@@#(/*,.     .,*/(%@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@#(/*,.     .,*/(#&@@@@@@@%#/*,..     .,*/(#@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@%(/*,..    ..,*/(%@@@#(/*,.     .,,*/#&@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@#(/*,.     .,,/(#/*,..     .,*/(#@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@%(/*,..    ..,*,.     ..,*/#&@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@#(/*,.     .     .,*/(#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%(/*,..     .,,*(#&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#(/*,. .,*/(#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%(/*,*(#&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#(#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

// @creator: Y4SI
// @dev:CardoLove.eth 

contract LoveIsInTheAir is ERC1155, AdminControl, ReentrancyGuard {

    address public ASH_CONTRACT = 0x64D91f12Ece7362F91A6f8E7940Cd55F05060b92;
    
    address payable private _royaltyRecipient;
    uint256 private _royaltyBps;

    uint256 public PRICE = 7*10**18; // 7 ASH
    uint256 public MAX_MINTS = 333;
    uint256 public supply;
    uint256 public eventCounter;

    uint256[] public tokenIds = [1,2,3,4,5];

    bool public activeSale;
    bool public activeGift;
    bool public activeBurn;
    
    mapping(address => uint256) public mints;
    mapping(address => uint256) public GL;
    mapping(address => bool) public WL;
    mapping(uint256 => bool) private bonus;
    mapping(uint256 => string) private metadata;

    constructor() ERC1155("") {
        _royaltyRecipient = payable(msg.sender);
        _royaltyBps = 1000;
    }

    function supportsInterface(bytes4 interfaceId) 
        public 
        view 
        virtual 
        override(AdminControl, ERC1155) 
        returns (bool) 
    {
        return 
            ERC1155.supportsInterface(interfaceId) 
            || AdminControl.supportsInterface(interfaceId) 
            || interfaceId == 0x2a55205a 
            || super.supportsInterface(interfaceId);
    }
    
    function mintLove(uint256 amount, uint256 quantity) external {
        require(activeSale, "Sale is not active");
        require(quantity > 0, "Must mint more than zero");
        require((supply + quantity) <= MAX_MINTS, "The quantity of mints surpasses the max");
        require(amount == (quantity * PRICE), "Incorrect ASH amount for requested quantity");
        
        IERC20(ASH_CONTRACT).transferFrom(msg.sender, _royaltyRecipient, amount);

        mint(msg.sender, quantity);
    }

    function gift(address account, uint256 tokenId) external {
        require(activeGift, "Gifting is not active");
        require(balanceOf(msg.sender, tokenId) > 0, "Insuffienct token balance");
        require(account != msg.sender, "You can not gift to yourself");

        safeTransferFrom(msg.sender, account, tokenId, 1, "");

        if (tokenId == 1) {
            _mint(msg.sender, 2, 1, "");
        }

        checkBonus(msg.sender);
    }

    function burnToMint(uint256 quantity) external {
        require(activeBurn, "Burning is not active");
        require(balanceOf(msg.sender, 2) >= quantity, "Insuffienct token balance");

        _burn(msg.sender, 2, quantity);
        _mint(msg.sender, 4, quantity, ""); 

        checkBonus(msg.sender);
    }

    function merge() external {
        require(
            balanceOf(msg.sender, 1) >= 0 
            && balanceOf(msg.sender, 2) >= 0 
            && balanceOf(msg.sender, 3) >= 0 
            && balanceOf(msg.sender, 4) >= 0,
            "Insuffienct token balance"
        );

        uint256[] memory amounts = new uint256[](5);
        amounts[0] = 1;
        amounts[1] = 1;
        amounts[2] = 1;
        amounts[3] = 1;
        amounts[4] = 0;

        _burnBatch(msg.sender, tokenIds, amounts);
        _mint(msg.sender, 5, 1, "");
    }

    function loveInTheAir(address[] calldata accounts, uint256[] calldata amounts, uint256 tokenId) 
        external 
        adminRequired 
    {
        for (uint256 i; i < accounts.length; i++) {
            _mint(accounts[i], tokenId, amounts[i], "");
        }
    }

    function togglePhase(uint256 phase) external adminRequired {
        if (phase == 1) {
            activeSale = !activeSale;
        } else if (phase == 2) {
            activeGift = !activeGift;
        } else {
            activeBurn = !activeBurn;
        }
    }

    function addGL(address[] calldata accounts, uint256[] calldata amounts) external adminRequired {
        for (uint256 i; i < accounts.length; i++) {
            GL[accounts[i]] = amounts[i];
        }
    }

    function addWL(address[] calldata accounts) external adminRequired {
        for (uint256 i; i < accounts.length; i++) {
            WL[accounts[i]] = true;
        }
    }

    function updateBonus(uint256[] calldata bonusEvents) external adminRequired {
        for (uint256 i; i < bonusEvents.length; i++) {
            bonus[bonusEvents[i]] = true;
        }
    }

    function updateURI(uint256 tokenId, string calldata _uri) external adminRequired {
        metadata[tokenId] = _uri; 
    }

    function updateRoyalties(address payable recipient, uint256 bps) external adminRequired {
        _royaltyRecipient = recipient;
        _royaltyBps = bps;
    }

    function royaltyInfo(uint256, uint256 value) external view returns (address, uint256) {
        return (_royaltyRecipient, (value*_royaltyBps) / 10000);
    }

    function calcMints(address account, uint256 quantity) 
        public 
        view 
        returns (uint256 x, uint256 y, uint256 z) 
    {
        x = quantity;
        y = 0;
        z = 0;

        if (GL[account] > mints[account]) {
            uint256 remainingMints = GL[account] - mints[account];
            if (remainingMints >= quantity) {
                y = quantity;
                z = quantity;
            } else {
                y = remainingMints;
                z = remainingMints;
            }
        } else if (WL[account] && mints[account] < 2) {
            uint256 remainingMints = 2 - mints[account];
            if (remainingMints >= quantity) {
                y = quantity;
            } else {
                y = remainingMints;
            }
        }   
        return(x, y, z);
    }

    function uri(uint256 tokenId) public view virtual override returns (string memory) {
        return metadata[tokenId];
    }

    function mint(address account, uint256 quantity) internal {
        uint256[] memory amounts = new uint256[](5);
        (amounts[0], amounts[1], amounts[2]) = calcMints(account, quantity);

        _mintBatch(account, tokenIds, amounts, "");

        mints[account] += quantity;
        supply += quantity;
    }

    function checkBonus(address account) internal {
        if (bonus[eventCounter]) {
            _mint(account, 3, 1, "");
        }
        eventCounter++;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"AdminApproved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"AdminRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[],"name":"ASH_CONTRACT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"GL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_MINTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"WL","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"activeBurn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"activeGift","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"activeSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"addGL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"}],"name":"addWL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"name":"approveAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"burnToMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"calcMints","outputs":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"},{"internalType":"uint256","name":"z","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"eventCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAdmins","outputs":[{"internalType":"address[]","name":"admins","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"gift","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"name":"isAdmin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"loveInTheAir","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"merge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mintLove","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"name":"revokeAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"supply","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":[{"internalType":"uint256","name":"phase","type":"uint256"}],"name":"togglePhase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"bonusEvents","type":"uint256[]"}],"name":"updateBonus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"recipient","type":"address"},{"internalType":"uint256","name":"bps","type":"uint256"}],"name":"updateRoyalties","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"_uri","type":"string"}],"name":"updateURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

60806040527364d91f12ece7362f91a6f8e7940cd55f05060b92600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550676124fee993bc0000600a5561014d600b556040518060a00160405280600160ff168152602001600260ff168152602001600360ff168152602001600460ff168152602001600560ff16815250600e906005620000b892919062000249565b50348015620000c657600080fd5b5060405180602001604052806000815250620000f7620000eb6200016160201b60201c565b6200016960201b60201c565b62000108816200022d60201b60201c565b50600160068190555033600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506103e8600981905550620003b5565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b806003908051906020019062000245929190620002a0565b5050565b8280548282559060005260206000209081019282156200028d579160200282015b828111156200028c578251829060ff169055916020019190600101906200026a565b5b5090506200029c919062000331565b5090565b828054620002ae9062000350565b90600052602060002090601f016020900481019282620002d257600085556200031e565b82601f10620002ed57805160ff19168380011785556200031e565b828001600101855582156200031e579182015b828111156200031d57825182559160200191906001019062000300565b5b5090506200032d919062000331565b5090565b5b808211156200034c57600081600090555060010162000332565b5090565b600060028204905060018216806200036957607f821691505b6020821081141562000380576200037f62000386565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b615f2580620003c56000396000f3fe608060405234801561001057600080fd5b50600436106102475760003560e01c80636c2f5acd1161013b578063b8fc28cc116100b8578063ebea113e1161007c578063ebea113e146106ed578063f078fd9c14610709578063f242432a1461073b578063f2fde38b14610757578063fe1e30231461077357610247565b8063b8fc28cc14610623578063cbce4c9714610653578063cce132d11461066f578063d58778d61461068d578063e985e9c5146106bd57610247565b8063877816c0116100ff578063877816c01461057d5780638d859f3e146105ad5780638da5cb5b146105cb578063a22cb465146105e9578063a46b75da1461060557610247565b80636c2f5acd146104ff5780636d73e6691461051b578063715018a614610537578063838323bd14610541578063873d302a1461055f57610247565b80632eb2c2d6116101c957806352c55db91161018d57806352c55db91461045d578063557383441461047b5780635660f851146104975780635f4662b3146104c7578063679834e6146104e357610247565b80632eb2c2d6146103b957806331ae450b146103d557806331d41c69146103f35780634e1273f41461040f5780634e17700a1461043f57610247565b80630e89341c116102105780630e89341c146102f057806324d7806c146103205780632615d553146103505780632a55205a1461036c5780632d3456701461039d57610247565b8062fdd58e1461024c57806301ffc9a71461027c578063047fc9aa146102ac57806305737aae146102ca5780630b65108b146102e6575b600080fd5b610266600480360381019061026191906143cd565b61078f565b604051610273919061517e565b60405180910390f35b61029660048036038101906102919190614662565b610859565b6040516102a39190614e41565b60405180910390f35b6102b46108bb565b6040516102c1919061517e565b60405180910390f35b6102e460048036038101906102df91906146bc565b6108c1565b005b6102ee610991565b005b61030a600480360381019061030591906146bc565b610b97565b6040516103179190614e5c565b60405180910390f35b61033a6004803603810190610335919061417a565b610c3c565b6040516103479190614e41565b60405180910390f35b61036a600480360381019061036591906145e8565b610c96565b005b61038660048036038101906103819190614749565b610d91565b604051610394929190614d9d565b60405180910390f35b6103b760048036038101906103b2919061417a565b610ddd565b005b6103d360048036038101906103ce9190614227565b610ee5565b005b6103dd610f86565b6040516103ea9190614dc6565b60405180910390f35b61040d600480360381019061040891906146e9565b611068565b005b61042960048036038101906104249190614570565b611120565b6040516104369190614de8565b60405180910390f35b610447611239565b6040516104549190614e41565b60405180910390f35b61046561124c565b604051610472919061517e565b60405180910390f35b6104956004803603810190610490919061445a565b611252565b005b6104b160048036038101906104ac919061417a565b61138e565b6040516104be919061517e565b60405180910390f35b6104e160048036038101906104dc91906144db565b6113a6565b005b6104fd60048036038101906104f89190614749565b6114ba565b005b610519600480360381019061051491906141a7565b6116cf565b005b6105356004803603810190610530919061417a565b6117ab565b005b61053f6118b2565b005b61054961193a565b6040516105569190614c89565b60405180910390f35b610567611960565b6040516105749190614e41565b60405180910390f35b6105976004803603810190610592919061417a565b611973565b6040516105a49190614e41565b60405180910390f35b6105b5611993565b6040516105c2919061517e565b60405180910390f35b6105d3611999565b6040516105e09190614c89565b60405180910390f35b61060360048036038101906105fe919061438d565b6119c2565b005b61060d6119d8565b60405161061a9190614e41565b60405180910390f35b61063d6004803603810190610638919061417a565b6119eb565b60405161064a919061517e565b60405180910390f35b61066d600480360381019061066891906143cd565b611a03565b005b610677611b5e565b604051610684919061517e565b60405180910390f35b6106a760048036038101906106a291906146bc565b611b64565b6040516106b4919061517e565b60405180910390f35b6106d760048036038101906106d291906141e7565b611b88565b6040516106e49190614e41565b60405180910390f35b6107076004803603810190610702919061440d565b611c1c565b005b610723600480360381019061071e91906143cd565b611d51565b604051610732939291906151c2565b60405180910390f35b610755600480360381019061075091906142f6565b611f9e565b005b610771600480360381019061076c919061417a565b61203f565b005b61078d600480360381019061078891906146bc565b612137565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610800576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107f790614efe565b60405180910390fd5b6001600083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600061086482612266565b80610874575061087382612348565b5b806108a45750632a55205a60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108b457506108b382612348565b5b9050919050565b600c5481565b600f60029054906101000a900460ff16610910576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090790614ffe565b60405180910390fd5b8061091c33600261078f565b101561095d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095490614ebe565b60405180910390fd5b610969336002836123c2565b61098533600483604051806020016040528060008152506125e1565b61098e33612778565b50565b600061099e33600161078f565b101580156109b7575060006109b433600261078f565b10155b80156109ce575060006109cb33600361078f565b10155b80156109e5575060006109e233600461078f565b10155b610a24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1b90614ebe565b60405180910390fd5b6000600567ffffffffffffffff811115610a4157610a406156fb565b5b604051908082528060200260200182016040528015610a6f5781602001602082028036833780820191505090505b509050600181600081518110610a8857610a876156cc565b5b602002602001018181525050600181600181518110610aaa57610aa96156cc565b5b602002602001018181525050600181600281518110610acc57610acb6156cc565b5b602002602001018181525050600181600381518110610aee57610aed6156cc565b5b602002602001018181525050600081600481518110610b1057610b0f6156cc565b5b602002602001018181525050610b7733600e805480602002602001604051908101604052809291908181526020018280548015610b6c57602002820191906000526020600020905b815481526020019060010190808311610b58575b5050505050836127d9565b610b943360056001604051806020016040528060008152506125e1565b50565b6060601460008381526020019081526020016000208054610bb790615564565b80601f0160208091040260200160405190810160405280929190818152602001828054610be390615564565b8015610c305780601f10610c0557610100808354040283529160200191610c30565b820191906000526020600020905b815481529060010190602001808311610c1357829003601f168201915b50505050509050919050565b60008173ffffffffffffffffffffffffffffffffffffffff16610c5d611999565b73ffffffffffffffffffffffffffffffffffffffff161480610c8f5750610c8e826004612a8c90919063ffffffff16565b5b9050919050565b3373ffffffffffffffffffffffffffffffffffffffff16610cb5611999565b73ffffffffffffffffffffffffffffffffffffffff161480610ce75750610ce6336004612a8c90919063ffffffff16565b5b610d26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1d9061509e565b60405180910390fd5b60005b82829050811015610d8c57600160136000858585818110610d4d57610d4c6156cc565b5b90506020020135815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610d84906155c7565b915050610d29565b505050565b600080600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661271060095485610dc891906153d8565b610dd291906153a7565b915091509250929050565b610de5612abc565b73ffffffffffffffffffffffffffffffffffffffff16610e03611999565b73ffffffffffffffffffffffffffffffffffffffff1614610e59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e509061507e565b60405180910390fd5b610e6d816004612a8c90919063ffffffff16565b15610ee2573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f7c0c3c84c67c85fcac635147348bfe374c24a1a93d0366d1cfe9d8853cbf89d560405160405180910390a3610ee0816004612ac490919063ffffffff16565b505b50565b610eed612abc565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610f335750610f3285610f2d612abc565b611b88565b5b610f72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6990614fbe565b60405180910390fd5b610f7f8585858585612af4565b5050505050565b6060610f926004612e0b565b67ffffffffffffffff811115610fab57610faa6156fb565b5b604051908082528060200260200182016040528015610fd95781602001602082028036833780820191505090505b50905060005b610fe96004612e0b565b81101561106457611004816004612e2090919063ffffffff16565b828281518110611017576110166156cc565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050808061105c906155c7565b915050610fdf565b5090565b3373ffffffffffffffffffffffffffffffffffffffff16611087611999565b73ffffffffffffffffffffffffffffffffffffffff1614806110b957506110b8336004612a8c90919063ffffffff16565b5b6110f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ef9061509e565b60405180910390fd5b818160146000868152602001908152602001600020919061111a929190613d96565b50505050565b60608151835114611166576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115d906150fe565b60405180910390fd5b6000835167ffffffffffffffff811115611183576111826156fb565b5b6040519080825280602002602001820160405280156111b15781602001602082028036833780820191505090505b50905060005b845181101561122e576111fe8582815181106111d6576111d56156cc565b5b60200260200101518583815181106111f1576111f06156cc565b5b602002602001015161078f565b828281518110611211576112106156cc565b5b60200260200101818152505080611227906155c7565b90506111b7565b508091505092915050565b600f60009054906101000a900460ff1681565b600d5481565b3373ffffffffffffffffffffffffffffffffffffffff16611271611999565b73ffffffffffffffffffffffffffffffffffffffff1614806112a357506112a2336004612a8c90919063ffffffff16565b5b6112e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d99061509e565b60405180910390fd5b60005b8484905081101561138757828282818110611303576113026156cc565b5b9050602002013560116000878785818110611321576113206156cc565b5b9050602002016020810190611336919061417a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550808061137f906155c7565b9150506112e5565b5050505050565b60106020528060005260406000206000915090505481565b3373ffffffffffffffffffffffffffffffffffffffff166113c5611999565b73ffffffffffffffffffffffffffffffffffffffff1614806113f757506113f6336004612a8c90919063ffffffff16565b5b611436576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142d9061509e565b60405180910390fd5b60005b858590508110156114b25761149f86868381811061145a576114596156cc565b5b905060200201602081019061146f919061417a565b83868685818110611483576114826156cc565b5b90506020020135604051806020016040528060008152506125e1565b80806114aa906155c7565b915050611439565b505050505050565b600f60009054906101000a900460ff16611509576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150090614f7e565b60405180910390fd5b6000811161154c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154390614ede565b60405180910390fd5b600b5481600c5461155d9190615351565b111561159e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115959061515e565b60405180910390fd5b600a54816115ac91906153d8565b82146115ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e49061501e565b60405180910390fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd33600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16856040518463ffffffff1660e01b815260040161166e93929190614ca4565b602060405180830381600087803b15801561168857600080fd5b505af115801561169c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116c09190614635565b506116cb3382612e3a565b5050565b3373ffffffffffffffffffffffffffffffffffffffff166116ee611999565b73ffffffffffffffffffffffffffffffffffffffff161480611720575061171f336004612a8c90919063ffffffff16565b5b61175f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117569061509e565b60405180910390fd5b81600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550806009819055505050565b6117b3612abc565b73ffffffffffffffffffffffffffffffffffffffff166117d1611999565b73ffffffffffffffffffffffffffffffffffffffff1614611827576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181e9061507e565b60405180910390fd5b61183b816004612a8c90919063ffffffff16565b6118af573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f7e1a1a08d52e4ba0e21554733d66165fd5151f99460116223d9e3a608eec5cb160405160405180910390a36118ad816004612fd190919063ffffffff16565b505b50565b6118ba612abc565b73ffffffffffffffffffffffffffffffffffffffff166118d8611999565b73ffffffffffffffffffffffffffffffffffffffff161461192e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119259061507e565b60405180910390fd5b6119386000613001565b565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600f60019054906101000a900460ff1681565b60126020528060005260406000206000915054906101000a900460ff1681565b600a5481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6119d46119cd612abc565b83836130c5565b5050565b600f60029054906101000a900460ff1681565b60116020528060005260406000206000915090505481565b600f60019054906101000a900460ff16611a52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a49906150be565b60405180910390fd5b6000611a5e338361078f565b11611a9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9590614ebe565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0490614fde565b60405180910390fd5b611b2a338383600160405180602001604052806000815250611f9e565b6001811415611b5157611b503360026001604051806020016040528060008152506125e1565b5b611b5a33612778565b5050565b600b5481565b600e8181548110611b7457600080fd5b906000526020600020016000915090505481565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b3373ffffffffffffffffffffffffffffffffffffffff16611c3b611999565b73ffffffffffffffffffffffffffffffffffffffff161480611c6d5750611c6c336004612a8c90919063ffffffff16565b5b611cac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca39061509e565b60405180910390fd5b60005b82829050811015611d4c57600160126000858585818110611cd357611cd26156cc565b5b9050602002016020810190611ce8919061417a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611d44906155c7565b915050611caf565b505050565b60008060008392506000915060009050601060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054601160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115611e94576000601060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054601160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611e739190615432565b9050848110611e8757849250849150611e8e565b8092508091505b50611f97565b601260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168015611f2c57506002601060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054105b15611f96576000601060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546002611f7f9190615432565b9050848110611f9057849250611f94565b8092505b505b5b9250925092565b611fa6612abc565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480611fec5750611feb85611fe6612abc565b611b88565b5b61202b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202290614f5e565b60405180910390fd5b6120388585858585613232565b5050505050565b612047612abc565b73ffffffffffffffffffffffffffffffffffffffff16612065611999565b73ffffffffffffffffffffffffffffffffffffffff16146120bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b29061507e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561212b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212290614f1e565b60405180910390fd5b61213481613001565b50565b3373ffffffffffffffffffffffffffffffffffffffff16612156611999565b73ffffffffffffffffffffffffffffffffffffffff1614806121885750612187336004612a8c90919063ffffffff16565b5b6121c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121be9061509e565b60405180910390fd5b60018114156121ff57600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550612263565b600281141561223757600f60019054906101000a900460ff1615600f60016101000a81548160ff021916908315150217905550612262565b600f60029054906101000a900460ff1615600f60026101000a81548160ff0219169083151502179055505b5b50565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061233157507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806123415750612340826134b7565b5b9050919050565b60007f553e757e000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806123bb57506123ba82612266565b5b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612432576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124299061503e565b60405180910390fd5b600061243c612abc565b905061246c8185600061244e87613521565b61245787613521565b6040518060200160405280600081525061359b565b60006001600085815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015612504576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124fb90614f3e565b60405180910390fd5b8281036001600086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6287876040516125d2929190615199565b60405180910390a45050505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612651576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126489061513e565b60405180910390fd5b600061265b612abc565b905061267c8160008761266d88613521565b61267688613521565b8761359b565b826001600086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126dc9190615351565b925050819055508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62878760405161275a929190615199565b60405180910390a4612771816000878787876135a3565b5050505050565b60136000600d54815260200190815260200160002060009054906101000a900460ff16156127be576127bd8160036001604051806020016040528060008152506125e1565b5b600d60008154809291906127d1906155c7565b919050555050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612849576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128409061503e565b60405180910390fd5b805182511461288d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128849061511e565b60405180910390fd5b6000612897612abc565b90506128b78185600086866040518060200160405280600081525061359b565b60005b8351811015612a065760008482815181106128d8576128d76156cc565b5b6020026020010151905060008483815181106128f7576128f66156cc565b5b6020026020010151905060006001600084815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612999576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299090614f3e565b60405180910390fd5b8181036001600085815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050505080806129fe906155c7565b9150506128ba565b50600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051612a7e929190614e0a565b60405180910390a450505050565b6000612ab4836000018373ffffffffffffffffffffffffffffffffffffffff1660001b61378a565b905092915050565b600033905090565b6000612aec836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6137ad565b905092915050565b8151835114612b38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b2f9061511e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612ba8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b9f90614f9e565b60405180910390fd5b6000612bb2612abc565b9050612bc281878787878761359b565b60005b8451811015612d76576000858281518110612be357612be26156cc565b5b602002602001015190506000858381518110612c0257612c016156cc565b5b6020026020010151905060006001600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612ca4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c9b9061505e565b60405180910390fd5b8181036001600085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816001600085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d5b9190615351565b9250508190555050505080612d6f906155c7565b9050612bc5565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051612ded929190614e0a565b60405180910390a4612e038187878787876138c1565b505050505050565b6000612e1982600001613aa8565b9050919050565b6000612e2f8360000183613ab9565b60001c905092915050565b6000600567ffffffffffffffff811115612e5757612e566156fb565b5b604051908082528060200260200182016040528015612e855781602001602082028036833780820191505090505b509050612e928383611d51565b83600081518110612ea657612ea56156cc565b5b6020026020010184600181518110612ec157612ec06156cc565b5b6020026020010185600281518110612edc57612edb6156cc565b5b60200260200101838152508381525083815250505050612f5d83600e805480602002602001604051908101604052809291908181526020018280548015612f4257602002820191906000526020600020905b815481526020019060010190808311612f2e575b50505050508360405180602001604052806000815250613ae4565b81601060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612fac9190615351565b9250508190555081600c6000828254612fc59190615351565b92505081905550505050565b6000612ff9836000018373ffffffffffffffffffffffffffffffffffffffff1660001b613d03565b905092915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613134576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161312b906150de565b60405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516132259190614e41565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156132a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161329990614f9e565b60405180910390fd5b60006132ac612abc565b90506132cc8187876132bd88613521565b6132c688613521565b8761359b565b60006001600086815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905083811015613364576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161335b9061505e565b60405180910390fd5b8381036001600087815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550836001600087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461341b9190615351565b925050819055508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628888604051613498929190615199565b60405180910390a46134ae8288888888886135a3565b50505050505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60606000600167ffffffffffffffff8111156135405761353f6156fb565b5b60405190808252806020026020018201604052801561356e5781602001602082028036833780820191505090505b5090508281600081518110613586576135856156cc565b5b60200260200101818152505080915050919050565b505050505050565b6135c28473ffffffffffffffffffffffffffffffffffffffff16613d73565b15613782578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401613608959493929190614d43565b602060405180830381600087803b15801561362257600080fd5b505af192505050801561365357506040513d601f19601f82011682018060405250810190613650919061468f565b60015b6136f95761365f61572a565b806308c379a014156136bc5750613674615de6565b8061367f57506136be565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136b39190614e5c565b60405180910390fd5b505b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136f090614e7e565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614613780576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161377790614e9e565b60405180910390fd5b505b505050505050565b600080836001016000848152602001908152602001600020541415905092915050565b600080836001016000848152602001908152602001600020549050600081146138b55760006001826137df9190615432565b90506000600186600001805490506137f79190615432565b9050818114613866576000866000018281548110613818576138176156cc565b5b906000526020600020015490508087600001848154811061383c5761383b6156cc565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b8560000180548061387a5761387961569d565b5b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506138bb565b60009150505b92915050565b6138e08473ffffffffffffffffffffffffffffffffffffffff16613d73565b15613aa0578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b8152600401613926959493929190614cdb565b602060405180830381600087803b15801561394057600080fd5b505af192505050801561397157506040513d601f19601f8201168201806040525081019061396e919061468f565b60015b613a175761397d61572a565b806308c379a014156139da5750613992615de6565b8061399d57506139dc565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139d19190614e5c565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a0e90614e7e565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614613a9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a9590614e9e565b60405180910390fd5b505b505050505050565b600081600001805490509050919050565b6000826000018281548110613ad157613ad06156cc565b5b9060005260206000200154905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415613b54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b4b9061513e565b60405180910390fd5b8151835114613b98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b8f9061511e565b60405180910390fd5b6000613ba2612abc565b9050613bb38160008787878761359b565b60005b8451811015613c6d57838181518110613bd257613bd16156cc565b5b602002602001015160016000878481518110613bf157613bf06156cc565b5b6020026020010151815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613c539190615351565b925050819055508080613c65906155c7565b915050613bb6565b508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051613ce5929190614e0a565b60405180910390a4613cfc816000878787876138c1565b5050505050565b6000613d0f838361378a565b613d68578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050613d6d565b600090505b92915050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b828054613da290615564565b90600052602060002090601f016020900481019282613dc45760008555613e0b565b82601f10613ddd57803560ff1916838001178555613e0b565b82800160010185558215613e0b579182015b82811115613e0a578235825591602001919060010190613def565b5b509050613e189190613e1c565b5090565b5b80821115613e35576000816000905550600101613e1d565b5090565b6000613e4c613e478461521e565b6151f9565b90508083825260208201905082856020860282011115613e6f57613e6e615756565b5b60005b85811015613e9f5781613e858882613f5b565b845260208401935060208301925050600181019050613e72565b5050509392505050565b6000613ebc613eb78461524a565b6151f9565b90508083825260208201905082856020860282011115613edf57613ede615756565b5b60005b85811015613f0f5781613ef58882614165565b845260208401935060208301925050600181019050613ee2565b5050509392505050565b6000613f2c613f2784615276565b6151f9565b905082815260208101848484011115613f4857613f4761575b565b5b613f53848285615522565b509392505050565b600081359050613f6a81615e7c565b92915050565b600081359050613f7f81615e93565b92915050565b60008083601f840112613f9b57613f9a615751565b5b8235905067ffffffffffffffff811115613fb857613fb761574c565b5b602083019150836020820283011115613fd457613fd3615756565b5b9250929050565b600082601f830112613ff057613fef615751565b5b8135614000848260208601613e39565b91505092915050565b60008083601f84011261401f5761401e615751565b5b8235905067ffffffffffffffff81111561403c5761403b61574c565b5b60208301915083602082028301111561405857614057615756565b5b9250929050565b600082601f83011261407457614073615751565b5b8135614084848260208601613ea9565b91505092915050565b60008135905061409c81615eaa565b92915050565b6000815190506140b181615eaa565b92915050565b6000813590506140c681615ec1565b92915050565b6000815190506140db81615ec1565b92915050565b600082601f8301126140f6576140f5615751565b5b8135614106848260208601613f19565b91505092915050565b60008083601f84011261412557614124615751565b5b8235905067ffffffffffffffff8111156141425761414161574c565b5b60208301915083600182028301111561415e5761415d615756565b5b9250929050565b60008135905061417481615ed8565b92915050565b6000602082840312156141905761418f615765565b5b600061419e84828501613f5b565b91505092915050565b600080604083850312156141be576141bd615765565b5b60006141cc85828601613f70565b92505060206141dd85828601614165565b9150509250929050565b600080604083850312156141fe576141fd615765565b5b600061420c85828601613f5b565b925050602061421d85828601613f5b565b9150509250929050565b600080600080600060a0868803121561424357614242615765565b5b600061425188828901613f5b565b955050602061426288828901613f5b565b945050604086013567ffffffffffffffff81111561428357614282615760565b5b61428f8882890161405f565b935050606086013567ffffffffffffffff8111156142b0576142af615760565b5b6142bc8882890161405f565b925050608086013567ffffffffffffffff8111156142dd576142dc615760565b5b6142e9888289016140e1565b9150509295509295909350565b600080600080600060a0868803121561431257614311615765565b5b600061432088828901613f5b565b955050602061433188828901613f5b565b945050604061434288828901614165565b935050606061435388828901614165565b925050608086013567ffffffffffffffff81111561437457614373615760565b5b614380888289016140e1565b9150509295509295909350565b600080604083850312156143a4576143a3615765565b5b60006143b285828601613f5b565b92505060206143c38582860161408d565b9150509250929050565b600080604083850312156143e4576143e3615765565b5b60006143f285828601613f5b565b925050602061440385828601614165565b9150509250929050565b6000806020838503121561442457614423615765565b5b600083013567ffffffffffffffff81111561444257614441615760565b5b61444e85828601613f85565b92509250509250929050565b6000806000806040858703121561447457614473615765565b5b600085013567ffffffffffffffff81111561449257614491615760565b5b61449e87828801613f85565b9450945050602085013567ffffffffffffffff8111156144c1576144c0615760565b5b6144cd87828801614009565b925092505092959194509250565b6000806000806000606086880312156144f7576144f6615765565b5b600086013567ffffffffffffffff81111561451557614514615760565b5b61452188828901613f85565b9550955050602086013567ffffffffffffffff81111561454457614543615760565b5b61455088828901614009565b9350935050604061456388828901614165565b9150509295509295909350565b6000806040838503121561458757614586615765565b5b600083013567ffffffffffffffff8111156145a5576145a4615760565b5b6145b185828601613fdb565b925050602083013567ffffffffffffffff8111156145d2576145d1615760565b5b6145de8582860161405f565b9150509250929050565b600080602083850312156145ff576145fe615765565b5b600083013567ffffffffffffffff81111561461d5761461c615760565b5b61462985828601614009565b92509250509250929050565b60006020828403121561464b5761464a615765565b5b6000614659848285016140a2565b91505092915050565b60006020828403121561467857614677615765565b5b6000614686848285016140b7565b91505092915050565b6000602082840312156146a5576146a4615765565b5b60006146b3848285016140cc565b91505092915050565b6000602082840312156146d2576146d1615765565b5b60006146e084828501614165565b91505092915050565b60008060006040848603121561470257614701615765565b5b600061471086828701614165565b935050602084013567ffffffffffffffff81111561473157614730615760565b5b61473d8682870161410f565b92509250509250925092565b600080604083850312156147605761475f615765565b5b600061476e85828601614165565b925050602061477f85828601614165565b9150509250929050565b600061479583836147c8565b60208301905092915050565b60006147ad8383614c6b565b60208301905092915050565b6147c2816154ec565b82525050565b6147d181615466565b82525050565b6147e081615466565b82525050565b60006147f1826152c7565b6147fb818561530d565b9350614806836152a7565b8060005b8381101561483757815161481e8882614789565b9750614829836152f3565b92505060018101905061480a565b5085935050505092915050565b600061484f826152d2565b614859818561531e565b9350614864836152b7565b8060005b8381101561489557815161487c88826147a1565b975061488783615300565b925050600181019050614868565b5085935050505092915050565b6148ab8161548a565b82525050565b60006148bc826152dd565b6148c6818561532f565b93506148d6818560208601615531565b6148df8161576a565b840191505092915050565b60006148f5826152e8565b6148ff8185615340565b935061490f818560208601615531565b6149188161576a565b840191505092915050565b6000614930603483615340565b915061493b82615788565b604082019050919050565b6000614953602883615340565b915061495e826157d7565b604082019050919050565b6000614976601983615340565b915061498182615826565b602082019050919050565b6000614999601883615340565b91506149a48261584f565b602082019050919050565b60006149bc602b83615340565b91506149c782615878565b604082019050919050565b60006149df602683615340565b91506149ea826158c7565b604082019050919050565b6000614a02602483615340565b9150614a0d82615916565b604082019050919050565b6000614a25602983615340565b9150614a3082615965565b604082019050919050565b6000614a48601283615340565b9150614a53826159b4565b602082019050919050565b6000614a6b602583615340565b9150614a76826159dd565b604082019050919050565b6000614a8e603283615340565b9150614a9982615a2c565b604082019050919050565b6000614ab1601c83615340565b9150614abc82615a7b565b602082019050919050565b6000614ad4601583615340565b9150614adf82615aa4565b602082019050919050565b6000614af7602b83615340565b9150614b0282615acd565b604082019050919050565b6000614b1a602383615340565b9150614b2582615b1c565b604082019050919050565b6000614b3d602a83615340565b9150614b4882615b6b565b604082019050919050565b6000614b60602083615340565b9150614b6b82615bba565b602082019050919050565b6000614b83602483615340565b9150614b8e82615be3565b604082019050919050565b6000614ba6601583615340565b9150614bb182615c32565b602082019050919050565b6000614bc9602983615340565b9150614bd482615c5b565b604082019050919050565b6000614bec602983615340565b9150614bf782615caa565b604082019050919050565b6000614c0f602883615340565b9150614c1a82615cf9565b604082019050919050565b6000614c32602183615340565b9150614c3d82615d48565b604082019050919050565b6000614c55602783615340565b9150614c6082615d97565b604082019050919050565b614c74816154e2565b82525050565b614c83816154e2565b82525050565b6000602082019050614c9e60008301846147d7565b92915050565b6000606082019050614cb960008301866147d7565b614cc660208301856147b9565b614cd36040830184614c7a565b949350505050565b600060a082019050614cf060008301886147d7565b614cfd60208301876147d7565b8181036040830152614d0f8186614844565b90508181036060830152614d238185614844565b90508181036080830152614d3781846148b1565b90509695505050505050565b600060a082019050614d5860008301886147d7565b614d6560208301876147d7565b614d726040830186614c7a565b614d7f6060830185614c7a565b8181036080830152614d9181846148b1565b90509695505050505050565b6000604082019050614db260008301856147d7565b614dbf6020830184614c7a565b9392505050565b60006020820190508181036000830152614de081846147e6565b905092915050565b60006020820190508181036000830152614e028184614844565b905092915050565b60006040820190508181036000830152614e248185614844565b90508181036020830152614e388184614844565b90509392505050565b6000602082019050614e5660008301846148a2565b92915050565b60006020820190508181036000830152614e7681846148ea565b905092915050565b60006020820190508181036000830152614e9781614923565b9050919050565b60006020820190508181036000830152614eb781614946565b9050919050565b60006020820190508181036000830152614ed781614969565b9050919050565b60006020820190508181036000830152614ef78161498c565b9050919050565b60006020820190508181036000830152614f17816149af565b9050919050565b60006020820190508181036000830152614f37816149d2565b9050919050565b60006020820190508181036000830152614f57816149f5565b9050919050565b60006020820190508181036000830152614f7781614a18565b9050919050565b60006020820190508181036000830152614f9781614a3b565b9050919050565b60006020820190508181036000830152614fb781614a5e565b9050919050565b60006020820190508181036000830152614fd781614a81565b9050919050565b60006020820190508181036000830152614ff781614aa4565b9050919050565b6000602082019050818103600083015261501781614ac7565b9050919050565b6000602082019050818103600083015261503781614aea565b9050919050565b6000602082019050818103600083015261505781614b0d565b9050919050565b6000602082019050818103600083015261507781614b30565b9050919050565b6000602082019050818103600083015261509781614b53565b9050919050565b600060208201905081810360008301526150b781614b76565b9050919050565b600060208201905081810360008301526150d781614b99565b9050919050565b600060208201905081810360008301526150f781614bbc565b9050919050565b6000602082019050818103600083015261511781614bdf565b9050919050565b6000602082019050818103600083015261513781614c02565b9050919050565b6000602082019050818103600083015261515781614c25565b9050919050565b6000602082019050818103600083015261517781614c48565b9050919050565b60006020820190506151936000830184614c7a565b92915050565b60006040820190506151ae6000830185614c7a565b6151bb6020830184614c7a565b9392505050565b60006060820190506151d76000830186614c7a565b6151e46020830185614c7a565b6151f16040830184614c7a565b949350505050565b6000615203615214565b905061520f8282615596565b919050565b6000604051905090565b600067ffffffffffffffff821115615239576152386156fb565b5b602082029050602081019050919050565b600067ffffffffffffffff821115615265576152646156fb565b5b602082029050602081019050919050565b600067ffffffffffffffff821115615291576152906156fb565b5b61529a8261576a565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600061535c826154e2565b9150615367836154e2565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561539c5761539b615610565b5b828201905092915050565b60006153b2826154e2565b91506153bd836154e2565b9250826153cd576153cc61563f565b5b828204905092915050565b60006153e3826154e2565b91506153ee836154e2565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561542757615426615610565b5b828202905092915050565b600061543d826154e2565b9150615448836154e2565b92508282101561545b5761545a615610565b5b828203905092915050565b6000615471826154c2565b9050919050565b6000615483826154c2565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006154f7826154fe565b9050919050565b600061550982615510565b9050919050565b600061551b826154c2565b9050919050565b82818337600083830152505050565b60005b8381101561554f578082015181840152602081019050615534565b8381111561555e576000848401525b50505050565b6000600282049050600182168061557c57607f821691505b602082108114156155905761558f61566e565b5b50919050565b61559f8261576a565b810181811067ffffffffffffffff821117156155be576155bd6156fb565b5b80604052505050565b60006155d2826154e2565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561560557615604615610565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060033d11156157495760046000803e61574660005161577b565b90505b90565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160e01c9050919050565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b7f496e7375666669656e637420746f6b656e2062616c616e636500000000000000600082015250565b7f4d757374206d696e74206d6f7265207468616e207a65726f0000000000000000600082015250565b7f455243313135353a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206275726e20616d6f756e7420657863656564732062616c60008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260008201527f20617070726f7665640000000000000000000000000000000000000000000000602082015250565b7f53616c65206973206e6f74206163746976650000000000000000000000000000600082015250565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f596f752063616e206e6f74206769667420746f20796f757273656c6600000000600082015250565b7f4275726e696e67206973206e6f74206163746976650000000000000000000000600082015250565b7f496e636f72726563742041534820616d6f756e7420666f72207265717565737460008201527f6564207175616e74697479000000000000000000000000000000000000000000602082015250565b7f455243313135353a206275726e2066726f6d20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f41646d696e436f6e74726f6c3a204d757374206265206f776e6572206f72206160008201527f646d696e00000000000000000000000000000000000000000000000000000000602082015250565b7f47696674696e67206973206e6f74206163746976650000000000000000000000600082015250565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f546865207175616e74697479206f66206d696e7473207375727061737365732060008201527f746865206d617800000000000000000000000000000000000000000000000000602082015250565b600060443d1015615df657615e79565b615dfe615214565b60043d036004823e80513d602482011167ffffffffffffffff82111715615e26575050615e79565b808201805167ffffffffffffffff811115615e445750505050615e79565b80602083010160043d038501811115615e61575050505050615e79565b615e7082602001850186615596565b82955050505050505b90565b615e8581615466565b8114615e9057600080fd5b50565b615e9c81615478565b8114615ea757600080fd5b50565b615eb38161548a565b8114615ebe57600080fd5b50565b615eca81615496565b8114615ed557600080fd5b50565b615ee1816154e2565b8114615eec57600080fd5b5056fea26469706673582212205b1356f9806ff9e6a19ba2a062d71f318b1130ee32427dce9c3b06434aa6b47964736f6c63430008070033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102475760003560e01c80636c2f5acd1161013b578063b8fc28cc116100b8578063ebea113e1161007c578063ebea113e146106ed578063f078fd9c14610709578063f242432a1461073b578063f2fde38b14610757578063fe1e30231461077357610247565b8063b8fc28cc14610623578063cbce4c9714610653578063cce132d11461066f578063d58778d61461068d578063e985e9c5146106bd57610247565b8063877816c0116100ff578063877816c01461057d5780638d859f3e146105ad5780638da5cb5b146105cb578063a22cb465146105e9578063a46b75da1461060557610247565b80636c2f5acd146104ff5780636d73e6691461051b578063715018a614610537578063838323bd14610541578063873d302a1461055f57610247565b80632eb2c2d6116101c957806352c55db91161018d57806352c55db91461045d578063557383441461047b5780635660f851146104975780635f4662b3146104c7578063679834e6146104e357610247565b80632eb2c2d6146103b957806331ae450b146103d557806331d41c69146103f35780634e1273f41461040f5780634e17700a1461043f57610247565b80630e89341c116102105780630e89341c146102f057806324d7806c146103205780632615d553146103505780632a55205a1461036c5780632d3456701461039d57610247565b8062fdd58e1461024c57806301ffc9a71461027c578063047fc9aa146102ac57806305737aae146102ca5780630b65108b146102e6575b600080fd5b610266600480360381019061026191906143cd565b61078f565b604051610273919061517e565b60405180910390f35b61029660048036038101906102919190614662565b610859565b6040516102a39190614e41565b60405180910390f35b6102b46108bb565b6040516102c1919061517e565b60405180910390f35b6102e460048036038101906102df91906146bc565b6108c1565b005b6102ee610991565b005b61030a600480360381019061030591906146bc565b610b97565b6040516103179190614e5c565b60405180910390f35b61033a6004803603810190610335919061417a565b610c3c565b6040516103479190614e41565b60405180910390f35b61036a600480360381019061036591906145e8565b610c96565b005b61038660048036038101906103819190614749565b610d91565b604051610394929190614d9d565b60405180910390f35b6103b760048036038101906103b2919061417a565b610ddd565b005b6103d360048036038101906103ce9190614227565b610ee5565b005b6103dd610f86565b6040516103ea9190614dc6565b60405180910390f35b61040d600480360381019061040891906146e9565b611068565b005b61042960048036038101906104249190614570565b611120565b6040516104369190614de8565b60405180910390f35b610447611239565b6040516104549190614e41565b60405180910390f35b61046561124c565b604051610472919061517e565b60405180910390f35b6104956004803603810190610490919061445a565b611252565b005b6104b160048036038101906104ac919061417a565b61138e565b6040516104be919061517e565b60405180910390f35b6104e160048036038101906104dc91906144db565b6113a6565b005b6104fd60048036038101906104f89190614749565b6114ba565b005b610519600480360381019061051491906141a7565b6116cf565b005b6105356004803603810190610530919061417a565b6117ab565b005b61053f6118b2565b005b61054961193a565b6040516105569190614c89565b60405180910390f35b610567611960565b6040516105749190614e41565b60405180910390f35b6105976004803603810190610592919061417a565b611973565b6040516105a49190614e41565b60405180910390f35b6105b5611993565b6040516105c2919061517e565b60405180910390f35b6105d3611999565b6040516105e09190614c89565b60405180910390f35b61060360048036038101906105fe919061438d565b6119c2565b005b61060d6119d8565b60405161061a9190614e41565b60405180910390f35b61063d6004803603810190610638919061417a565b6119eb565b60405161064a919061517e565b60405180910390f35b61066d600480360381019061066891906143cd565b611a03565b005b610677611b5e565b604051610684919061517e565b60405180910390f35b6106a760048036038101906106a291906146bc565b611b64565b6040516106b4919061517e565b60405180910390f35b6106d760048036038101906106d291906141e7565b611b88565b6040516106e49190614e41565b60405180910390f35b6107076004803603810190610702919061440d565b611c1c565b005b610723600480360381019061071e91906143cd565b611d51565b604051610732939291906151c2565b60405180910390f35b610755600480360381019061075091906142f6565b611f9e565b005b610771600480360381019061076c919061417a565b61203f565b005b61078d600480360381019061078891906146bc565b612137565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610800576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107f790614efe565b60405180910390fd5b6001600083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600061086482612266565b80610874575061087382612348565b5b806108a45750632a55205a60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108b457506108b382612348565b5b9050919050565b600c5481565b600f60029054906101000a900460ff16610910576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090790614ffe565b60405180910390fd5b8061091c33600261078f565b101561095d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095490614ebe565b60405180910390fd5b610969336002836123c2565b61098533600483604051806020016040528060008152506125e1565b61098e33612778565b50565b600061099e33600161078f565b101580156109b7575060006109b433600261078f565b10155b80156109ce575060006109cb33600361078f565b10155b80156109e5575060006109e233600461078f565b10155b610a24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1b90614ebe565b60405180910390fd5b6000600567ffffffffffffffff811115610a4157610a406156fb565b5b604051908082528060200260200182016040528015610a6f5781602001602082028036833780820191505090505b509050600181600081518110610a8857610a876156cc565b5b602002602001018181525050600181600181518110610aaa57610aa96156cc565b5b602002602001018181525050600181600281518110610acc57610acb6156cc565b5b602002602001018181525050600181600381518110610aee57610aed6156cc565b5b602002602001018181525050600081600481518110610b1057610b0f6156cc565b5b602002602001018181525050610b7733600e805480602002602001604051908101604052809291908181526020018280548015610b6c57602002820191906000526020600020905b815481526020019060010190808311610b58575b5050505050836127d9565b610b943360056001604051806020016040528060008152506125e1565b50565b6060601460008381526020019081526020016000208054610bb790615564565b80601f0160208091040260200160405190810160405280929190818152602001828054610be390615564565b8015610c305780601f10610c0557610100808354040283529160200191610c30565b820191906000526020600020905b815481529060010190602001808311610c1357829003601f168201915b50505050509050919050565b60008173ffffffffffffffffffffffffffffffffffffffff16610c5d611999565b73ffffffffffffffffffffffffffffffffffffffff161480610c8f5750610c8e826004612a8c90919063ffffffff16565b5b9050919050565b3373ffffffffffffffffffffffffffffffffffffffff16610cb5611999565b73ffffffffffffffffffffffffffffffffffffffff161480610ce75750610ce6336004612a8c90919063ffffffff16565b5b610d26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1d9061509e565b60405180910390fd5b60005b82829050811015610d8c57600160136000858585818110610d4d57610d4c6156cc565b5b90506020020135815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610d84906155c7565b915050610d29565b505050565b600080600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661271060095485610dc891906153d8565b610dd291906153a7565b915091509250929050565b610de5612abc565b73ffffffffffffffffffffffffffffffffffffffff16610e03611999565b73ffffffffffffffffffffffffffffffffffffffff1614610e59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e509061507e565b60405180910390fd5b610e6d816004612a8c90919063ffffffff16565b15610ee2573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f7c0c3c84c67c85fcac635147348bfe374c24a1a93d0366d1cfe9d8853cbf89d560405160405180910390a3610ee0816004612ac490919063ffffffff16565b505b50565b610eed612abc565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610f335750610f3285610f2d612abc565b611b88565b5b610f72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6990614fbe565b60405180910390fd5b610f7f8585858585612af4565b5050505050565b6060610f926004612e0b565b67ffffffffffffffff811115610fab57610faa6156fb565b5b604051908082528060200260200182016040528015610fd95781602001602082028036833780820191505090505b50905060005b610fe96004612e0b565b81101561106457611004816004612e2090919063ffffffff16565b828281518110611017576110166156cc565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050808061105c906155c7565b915050610fdf565b5090565b3373ffffffffffffffffffffffffffffffffffffffff16611087611999565b73ffffffffffffffffffffffffffffffffffffffff1614806110b957506110b8336004612a8c90919063ffffffff16565b5b6110f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ef9061509e565b60405180910390fd5b818160146000868152602001908152602001600020919061111a929190613d96565b50505050565b60608151835114611166576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115d906150fe565b60405180910390fd5b6000835167ffffffffffffffff811115611183576111826156fb565b5b6040519080825280602002602001820160405280156111b15781602001602082028036833780820191505090505b50905060005b845181101561122e576111fe8582815181106111d6576111d56156cc565b5b60200260200101518583815181106111f1576111f06156cc565b5b602002602001015161078f565b828281518110611211576112106156cc565b5b60200260200101818152505080611227906155c7565b90506111b7565b508091505092915050565b600f60009054906101000a900460ff1681565b600d5481565b3373ffffffffffffffffffffffffffffffffffffffff16611271611999565b73ffffffffffffffffffffffffffffffffffffffff1614806112a357506112a2336004612a8c90919063ffffffff16565b5b6112e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d99061509e565b60405180910390fd5b60005b8484905081101561138757828282818110611303576113026156cc565b5b9050602002013560116000878785818110611321576113206156cc565b5b9050602002016020810190611336919061417a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550808061137f906155c7565b9150506112e5565b5050505050565b60106020528060005260406000206000915090505481565b3373ffffffffffffffffffffffffffffffffffffffff166113c5611999565b73ffffffffffffffffffffffffffffffffffffffff1614806113f757506113f6336004612a8c90919063ffffffff16565b5b611436576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142d9061509e565b60405180910390fd5b60005b858590508110156114b25761149f86868381811061145a576114596156cc565b5b905060200201602081019061146f919061417a565b83868685818110611483576114826156cc565b5b90506020020135604051806020016040528060008152506125e1565b80806114aa906155c7565b915050611439565b505050505050565b600f60009054906101000a900460ff16611509576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150090614f7e565b60405180910390fd5b6000811161154c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154390614ede565b60405180910390fd5b600b5481600c5461155d9190615351565b111561159e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115959061515e565b60405180910390fd5b600a54816115ac91906153d8565b82146115ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e49061501e565b60405180910390fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd33600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16856040518463ffffffff1660e01b815260040161166e93929190614ca4565b602060405180830381600087803b15801561168857600080fd5b505af115801561169c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116c09190614635565b506116cb3382612e3a565b5050565b3373ffffffffffffffffffffffffffffffffffffffff166116ee611999565b73ffffffffffffffffffffffffffffffffffffffff161480611720575061171f336004612a8c90919063ffffffff16565b5b61175f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117569061509e565b60405180910390fd5b81600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550806009819055505050565b6117b3612abc565b73ffffffffffffffffffffffffffffffffffffffff166117d1611999565b73ffffffffffffffffffffffffffffffffffffffff1614611827576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181e9061507e565b60405180910390fd5b61183b816004612a8c90919063ffffffff16565b6118af573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f7e1a1a08d52e4ba0e21554733d66165fd5151f99460116223d9e3a608eec5cb160405160405180910390a36118ad816004612fd190919063ffffffff16565b505b50565b6118ba612abc565b73ffffffffffffffffffffffffffffffffffffffff166118d8611999565b73ffffffffffffffffffffffffffffffffffffffff161461192e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119259061507e565b60405180910390fd5b6119386000613001565b565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600f60019054906101000a900460ff1681565b60126020528060005260406000206000915054906101000a900460ff1681565b600a5481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6119d46119cd612abc565b83836130c5565b5050565b600f60029054906101000a900460ff1681565b60116020528060005260406000206000915090505481565b600f60019054906101000a900460ff16611a52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a49906150be565b60405180910390fd5b6000611a5e338361078f565b11611a9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9590614ebe565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0490614fde565b60405180910390fd5b611b2a338383600160405180602001604052806000815250611f9e565b6001811415611b5157611b503360026001604051806020016040528060008152506125e1565b5b611b5a33612778565b5050565b600b5481565b600e8181548110611b7457600080fd5b906000526020600020016000915090505481565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b3373ffffffffffffffffffffffffffffffffffffffff16611c3b611999565b73ffffffffffffffffffffffffffffffffffffffff161480611c6d5750611c6c336004612a8c90919063ffffffff16565b5b611cac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca39061509e565b60405180910390fd5b60005b82829050811015611d4c57600160126000858585818110611cd357611cd26156cc565b5b9050602002016020810190611ce8919061417a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611d44906155c7565b915050611caf565b505050565b60008060008392506000915060009050601060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054601160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115611e94576000601060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054601160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611e739190615432565b9050848110611e8757849250849150611e8e565b8092508091505b50611f97565b601260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168015611f2c57506002601060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054105b15611f96576000601060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546002611f7f9190615432565b9050848110611f9057849250611f94565b8092505b505b5b9250925092565b611fa6612abc565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480611fec5750611feb85611fe6612abc565b611b88565b5b61202b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202290614f5e565b60405180910390fd5b6120388585858585613232565b5050505050565b612047612abc565b73ffffffffffffffffffffffffffffffffffffffff16612065611999565b73ffffffffffffffffffffffffffffffffffffffff16146120bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b29061507e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561212b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212290614f1e565b60405180910390fd5b61213481613001565b50565b3373ffffffffffffffffffffffffffffffffffffffff16612156611999565b73ffffffffffffffffffffffffffffffffffffffff1614806121885750612187336004612a8c90919063ffffffff16565b5b6121c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121be9061509e565b60405180910390fd5b60018114156121ff57600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550612263565b600281141561223757600f60019054906101000a900460ff1615600f60016101000a81548160ff021916908315150217905550612262565b600f60029054906101000a900460ff1615600f60026101000a81548160ff0219169083151502179055505b5b50565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061233157507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806123415750612340826134b7565b5b9050919050565b60007f553e757e000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806123bb57506123ba82612266565b5b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612432576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124299061503e565b60405180910390fd5b600061243c612abc565b905061246c8185600061244e87613521565b61245787613521565b6040518060200160405280600081525061359b565b60006001600085815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015612504576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124fb90614f3e565b60405180910390fd5b8281036001600086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6287876040516125d2929190615199565b60405180910390a45050505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612651576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126489061513e565b60405180910390fd5b600061265b612abc565b905061267c8160008761266d88613521565b61267688613521565b8761359b565b826001600086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126dc9190615351565b925050819055508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62878760405161275a929190615199565b60405180910390a4612771816000878787876135a3565b5050505050565b60136000600d54815260200190815260200160002060009054906101000a900460ff16156127be576127bd8160036001604051806020016040528060008152506125e1565b5b600d60008154809291906127d1906155c7565b919050555050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612849576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128409061503e565b60405180910390fd5b805182511461288d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128849061511e565b60405180910390fd5b6000612897612abc565b90506128b78185600086866040518060200160405280600081525061359b565b60005b8351811015612a065760008482815181106128d8576128d76156cc565b5b6020026020010151905060008483815181106128f7576128f66156cc565b5b6020026020010151905060006001600084815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612999576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299090614f3e565b60405180910390fd5b8181036001600085815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050505080806129fe906155c7565b9150506128ba565b50600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051612a7e929190614e0a565b60405180910390a450505050565b6000612ab4836000018373ffffffffffffffffffffffffffffffffffffffff1660001b61378a565b905092915050565b600033905090565b6000612aec836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6137ad565b905092915050565b8151835114612b38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b2f9061511e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612ba8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b9f90614f9e565b60405180910390fd5b6000612bb2612abc565b9050612bc281878787878761359b565b60005b8451811015612d76576000858281518110612be357612be26156cc565b5b602002602001015190506000858381518110612c0257612c016156cc565b5b6020026020010151905060006001600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612ca4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c9b9061505e565b60405180910390fd5b8181036001600085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816001600085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d5b9190615351565b9250508190555050505080612d6f906155c7565b9050612bc5565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051612ded929190614e0a565b60405180910390a4612e038187878787876138c1565b505050505050565b6000612e1982600001613aa8565b9050919050565b6000612e2f8360000183613ab9565b60001c905092915050565b6000600567ffffffffffffffff811115612e5757612e566156fb565b5b604051908082528060200260200182016040528015612e855781602001602082028036833780820191505090505b509050612e928383611d51565b83600081518110612ea657612ea56156cc565b5b6020026020010184600181518110612ec157612ec06156cc565b5b6020026020010185600281518110612edc57612edb6156cc565b5b60200260200101838152508381525083815250505050612f5d83600e805480602002602001604051908101604052809291908181526020018280548015612f4257602002820191906000526020600020905b815481526020019060010190808311612f2e575b50505050508360405180602001604052806000815250613ae4565b81601060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612fac9190615351565b9250508190555081600c6000828254612fc59190615351565b92505081905550505050565b6000612ff9836000018373ffffffffffffffffffffffffffffffffffffffff1660001b613d03565b905092915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613134576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161312b906150de565b60405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516132259190614e41565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156132a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161329990614f9e565b60405180910390fd5b60006132ac612abc565b90506132cc8187876132bd88613521565b6132c688613521565b8761359b565b60006001600086815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905083811015613364576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161335b9061505e565b60405180910390fd5b8381036001600087815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550836001600087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461341b9190615351565b925050819055508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628888604051613498929190615199565b60405180910390a46134ae8288888888886135a3565b50505050505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60606000600167ffffffffffffffff8111156135405761353f6156fb565b5b60405190808252806020026020018201604052801561356e5781602001602082028036833780820191505090505b5090508281600081518110613586576135856156cc565b5b60200260200101818152505080915050919050565b505050505050565b6135c28473ffffffffffffffffffffffffffffffffffffffff16613d73565b15613782578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401613608959493929190614d43565b602060405180830381600087803b15801561362257600080fd5b505af192505050801561365357506040513d601f19601f82011682018060405250810190613650919061468f565b60015b6136f95761365f61572a565b806308c379a014156136bc5750613674615de6565b8061367f57506136be565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136b39190614e5c565b60405180910390fd5b505b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136f090614e7e565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614613780576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161377790614e9e565b60405180910390fd5b505b505050505050565b600080836001016000848152602001908152602001600020541415905092915050565b600080836001016000848152602001908152602001600020549050600081146138b55760006001826137df9190615432565b90506000600186600001805490506137f79190615432565b9050818114613866576000866000018281548110613818576138176156cc565b5b906000526020600020015490508087600001848154811061383c5761383b6156cc565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b8560000180548061387a5761387961569d565b5b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506138bb565b60009150505b92915050565b6138e08473ffffffffffffffffffffffffffffffffffffffff16613d73565b15613aa0578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b8152600401613926959493929190614cdb565b602060405180830381600087803b15801561394057600080fd5b505af192505050801561397157506040513d601f19601f8201168201806040525081019061396e919061468f565b60015b613a175761397d61572a565b806308c379a014156139da5750613992615de6565b8061399d57506139dc565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139d19190614e5c565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a0e90614e7e565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614613a9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a9590614e9e565b60405180910390fd5b505b505050505050565b600081600001805490509050919050565b6000826000018281548110613ad157613ad06156cc565b5b9060005260206000200154905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415613b54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b4b9061513e565b60405180910390fd5b8151835114613b98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b8f9061511e565b60405180910390fd5b6000613ba2612abc565b9050613bb38160008787878761359b565b60005b8451811015613c6d57838181518110613bd257613bd16156cc565b5b602002602001015160016000878481518110613bf157613bf06156cc565b5b6020026020010151815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613c539190615351565b925050819055508080613c65906155c7565b915050613bb6565b508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051613ce5929190614e0a565b60405180910390a4613cfc816000878787876138c1565b5050505050565b6000613d0f838361378a565b613d68578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050613d6d565b600090505b92915050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b828054613da290615564565b90600052602060002090601f016020900481019282613dc45760008555613e0b565b82601f10613ddd57803560ff1916838001178555613e0b565b82800160010185558215613e0b579182015b82811115613e0a578235825591602001919060010190613def565b5b509050613e189190613e1c565b5090565b5b80821115613e35576000816000905550600101613e1d565b5090565b6000613e4c613e478461521e565b6151f9565b90508083825260208201905082856020860282011115613e6f57613e6e615756565b5b60005b85811015613e9f5781613e858882613f5b565b845260208401935060208301925050600181019050613e72565b5050509392505050565b6000613ebc613eb78461524a565b6151f9565b90508083825260208201905082856020860282011115613edf57613ede615756565b5b60005b85811015613f0f5781613ef58882614165565b845260208401935060208301925050600181019050613ee2565b5050509392505050565b6000613f2c613f2784615276565b6151f9565b905082815260208101848484011115613f4857613f4761575b565b5b613f53848285615522565b509392505050565b600081359050613f6a81615e7c565b92915050565b600081359050613f7f81615e93565b92915050565b60008083601f840112613f9b57613f9a615751565b5b8235905067ffffffffffffffff811115613fb857613fb761574c565b5b602083019150836020820283011115613fd457613fd3615756565b5b9250929050565b600082601f830112613ff057613fef615751565b5b8135614000848260208601613e39565b91505092915050565b60008083601f84011261401f5761401e615751565b5b8235905067ffffffffffffffff81111561403c5761403b61574c565b5b60208301915083602082028301111561405857614057615756565b5b9250929050565b600082601f83011261407457614073615751565b5b8135614084848260208601613ea9565b91505092915050565b60008135905061409c81615eaa565b92915050565b6000815190506140b181615eaa565b92915050565b6000813590506140c681615ec1565b92915050565b6000815190506140db81615ec1565b92915050565b600082601f8301126140f6576140f5615751565b5b8135614106848260208601613f19565b91505092915050565b60008083601f84011261412557614124615751565b5b8235905067ffffffffffffffff8111156141425761414161574c565b5b60208301915083600182028301111561415e5761415d615756565b5b9250929050565b60008135905061417481615ed8565b92915050565b6000602082840312156141905761418f615765565b5b600061419e84828501613f5b565b91505092915050565b600080604083850312156141be576141bd615765565b5b60006141cc85828601613f70565b92505060206141dd85828601614165565b9150509250929050565b600080604083850312156141fe576141fd615765565b5b600061420c85828601613f5b565b925050602061421d85828601613f5b565b9150509250929050565b600080600080600060a0868803121561424357614242615765565b5b600061425188828901613f5b565b955050602061426288828901613f5b565b945050604086013567ffffffffffffffff81111561428357614282615760565b5b61428f8882890161405f565b935050606086013567ffffffffffffffff8111156142b0576142af615760565b5b6142bc8882890161405f565b925050608086013567ffffffffffffffff8111156142dd576142dc615760565b5b6142e9888289016140e1565b9150509295509295909350565b600080600080600060a0868803121561431257614311615765565b5b600061432088828901613f5b565b955050602061433188828901613f5b565b945050604061434288828901614165565b935050606061435388828901614165565b925050608086013567ffffffffffffffff81111561437457614373615760565b5b614380888289016140e1565b9150509295509295909350565b600080604083850312156143a4576143a3615765565b5b60006143b285828601613f5b565b92505060206143c38582860161408d565b9150509250929050565b600080604083850312156143e4576143e3615765565b5b60006143f285828601613f5b565b925050602061440385828601614165565b9150509250929050565b6000806020838503121561442457614423615765565b5b600083013567ffffffffffffffff81111561444257614441615760565b5b61444e85828601613f85565b92509250509250929050565b6000806000806040858703121561447457614473615765565b5b600085013567ffffffffffffffff81111561449257614491615760565b5b61449e87828801613f85565b9450945050602085013567ffffffffffffffff8111156144c1576144c0615760565b5b6144cd87828801614009565b925092505092959194509250565b6000806000806000606086880312156144f7576144f6615765565b5b600086013567ffffffffffffffff81111561451557614514615760565b5b61452188828901613f85565b9550955050602086013567ffffffffffffffff81111561454457614543615760565b5b61455088828901614009565b9350935050604061456388828901614165565b9150509295509295909350565b6000806040838503121561458757614586615765565b5b600083013567ffffffffffffffff8111156145a5576145a4615760565b5b6145b185828601613fdb565b925050602083013567ffffffffffffffff8111156145d2576145d1615760565b5b6145de8582860161405f565b9150509250929050565b600080602083850312156145ff576145fe615765565b5b600083013567ffffffffffffffff81111561461d5761461c615760565b5b61462985828601614009565b92509250509250929050565b60006020828403121561464b5761464a615765565b5b6000614659848285016140a2565b91505092915050565b60006020828403121561467857614677615765565b5b6000614686848285016140b7565b91505092915050565b6000602082840312156146a5576146a4615765565b5b60006146b3848285016140cc565b91505092915050565b6000602082840312156146d2576146d1615765565b5b60006146e084828501614165565b91505092915050565b60008060006040848603121561470257614701615765565b5b600061471086828701614165565b935050602084013567ffffffffffffffff81111561473157614730615760565b5b61473d8682870161410f565b92509250509250925092565b600080604083850312156147605761475f615765565b5b600061476e85828601614165565b925050602061477f85828601614165565b9150509250929050565b600061479583836147c8565b60208301905092915050565b60006147ad8383614c6b565b60208301905092915050565b6147c2816154ec565b82525050565b6147d181615466565b82525050565b6147e081615466565b82525050565b60006147f1826152c7565b6147fb818561530d565b9350614806836152a7565b8060005b8381101561483757815161481e8882614789565b9750614829836152f3565b92505060018101905061480a565b5085935050505092915050565b600061484f826152d2565b614859818561531e565b9350614864836152b7565b8060005b8381101561489557815161487c88826147a1565b975061488783615300565b925050600181019050614868565b5085935050505092915050565b6148ab8161548a565b82525050565b60006148bc826152dd565b6148c6818561532f565b93506148d6818560208601615531565b6148df8161576a565b840191505092915050565b60006148f5826152e8565b6148ff8185615340565b935061490f818560208601615531565b6149188161576a565b840191505092915050565b6000614930603483615340565b915061493b82615788565b604082019050919050565b6000614953602883615340565b915061495e826157d7565b604082019050919050565b6000614976601983615340565b915061498182615826565b602082019050919050565b6000614999601883615340565b91506149a48261584f565b602082019050919050565b60006149bc602b83615340565b91506149c782615878565b604082019050919050565b60006149df602683615340565b91506149ea826158c7565b604082019050919050565b6000614a02602483615340565b9150614a0d82615916565b604082019050919050565b6000614a25602983615340565b9150614a3082615965565b604082019050919050565b6000614a48601283615340565b9150614a53826159b4565b602082019050919050565b6000614a6b602583615340565b9150614a76826159dd565b604082019050919050565b6000614a8e603283615340565b9150614a9982615a2c565b604082019050919050565b6000614ab1601c83615340565b9150614abc82615a7b565b602082019050919050565b6000614ad4601583615340565b9150614adf82615aa4565b602082019050919050565b6000614af7602b83615340565b9150614b0282615acd565b604082019050919050565b6000614b1a602383615340565b9150614b2582615b1c565b604082019050919050565b6000614b3d602a83615340565b9150614b4882615b6b565b604082019050919050565b6000614b60602083615340565b9150614b6b82615bba565b602082019050919050565b6000614b83602483615340565b9150614b8e82615be3565b604082019050919050565b6000614ba6601583615340565b9150614bb182615c32565b602082019050919050565b6000614bc9602983615340565b9150614bd482615c5b565b604082019050919050565b6000614bec602983615340565b9150614bf782615caa565b604082019050919050565b6000614c0f602883615340565b9150614c1a82615cf9565b604082019050919050565b6000614c32602183615340565b9150614c3d82615d48565b604082019050919050565b6000614c55602783615340565b9150614c6082615d97565b604082019050919050565b614c74816154e2565b82525050565b614c83816154e2565b82525050565b6000602082019050614c9e60008301846147d7565b92915050565b6000606082019050614cb960008301866147d7565b614cc660208301856147b9565b614cd36040830184614c7a565b949350505050565b600060a082019050614cf060008301886147d7565b614cfd60208301876147d7565b8181036040830152614d0f8186614844565b90508181036060830152614d238185614844565b90508181036080830152614d3781846148b1565b90509695505050505050565b600060a082019050614d5860008301886147d7565b614d6560208301876147d7565b614d726040830186614c7a565b614d7f6060830185614c7a565b8181036080830152614d9181846148b1565b90509695505050505050565b6000604082019050614db260008301856147d7565b614dbf6020830184614c7a565b9392505050565b60006020820190508181036000830152614de081846147e6565b905092915050565b60006020820190508181036000830152614e028184614844565b905092915050565b60006040820190508181036000830152614e248185614844565b90508181036020830152614e388184614844565b90509392505050565b6000602082019050614e5660008301846148a2565b92915050565b60006020820190508181036000830152614e7681846148ea565b905092915050565b60006020820190508181036000830152614e9781614923565b9050919050565b60006020820190508181036000830152614eb781614946565b9050919050565b60006020820190508181036000830152614ed781614969565b9050919050565b60006020820190508181036000830152614ef78161498c565b9050919050565b60006020820190508181036000830152614f17816149af565b9050919050565b60006020820190508181036000830152614f37816149d2565b9050919050565b60006020820190508181036000830152614f57816149f5565b9050919050565b60006020820190508181036000830152614f7781614a18565b9050919050565b60006020820190508181036000830152614f9781614a3b565b9050919050565b60006020820190508181036000830152614fb781614a5e565b9050919050565b60006020820190508181036000830152614fd781614a81565b9050919050565b60006020820190508181036000830152614ff781614aa4565b9050919050565b6000602082019050818103600083015261501781614ac7565b9050919050565b6000602082019050818103600083015261503781614aea565b9050919050565b6000602082019050818103600083015261505781614b0d565b9050919050565b6000602082019050818103600083015261507781614b30565b9050919050565b6000602082019050818103600083015261509781614b53565b9050919050565b600060208201905081810360008301526150b781614b76565b9050919050565b600060208201905081810360008301526150d781614b99565b9050919050565b600060208201905081810360008301526150f781614bbc565b9050919050565b6000602082019050818103600083015261511781614bdf565b9050919050565b6000602082019050818103600083015261513781614c02565b9050919050565b6000602082019050818103600083015261515781614c25565b9050919050565b6000602082019050818103600083015261517781614c48565b9050919050565b60006020820190506151936000830184614c7a565b92915050565b60006040820190506151ae6000830185614c7a565b6151bb6020830184614c7a565b9392505050565b60006060820190506151d76000830186614c7a565b6151e46020830185614c7a565b6151f16040830184614c7a565b949350505050565b6000615203615214565b905061520f8282615596565b919050565b6000604051905090565b600067ffffffffffffffff821115615239576152386156fb565b5b602082029050602081019050919050565b600067ffffffffffffffff821115615265576152646156fb565b5b602082029050602081019050919050565b600067ffffffffffffffff821115615291576152906156fb565b5b61529a8261576a565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600061535c826154e2565b9150615367836154e2565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561539c5761539b615610565b5b828201905092915050565b60006153b2826154e2565b91506153bd836154e2565b9250826153cd576153cc61563f565b5b828204905092915050565b60006153e3826154e2565b91506153ee836154e2565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561542757615426615610565b5b828202905092915050565b600061543d826154e2565b9150615448836154e2565b92508282101561545b5761545a615610565b5b828203905092915050565b6000615471826154c2565b9050919050565b6000615483826154c2565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006154f7826154fe565b9050919050565b600061550982615510565b9050919050565b600061551b826154c2565b9050919050565b82818337600083830152505050565b60005b8381101561554f578082015181840152602081019050615534565b8381111561555e576000848401525b50505050565b6000600282049050600182168061557c57607f821691505b602082108114156155905761558f61566e565b5b50919050565b61559f8261576a565b810181811067ffffffffffffffff821117156155be576155bd6156fb565b5b80604052505050565b60006155d2826154e2565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561560557615604615610565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060033d11156157495760046000803e61574660005161577b565b90505b90565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160e01c9050919050565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b7f496e7375666669656e637420746f6b656e2062616c616e636500000000000000600082015250565b7f4d757374206d696e74206d6f7265207468616e207a65726f0000000000000000600082015250565b7f455243313135353a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206275726e20616d6f756e7420657863656564732062616c60008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260008201527f20617070726f7665640000000000000000000000000000000000000000000000602082015250565b7f53616c65206973206e6f74206163746976650000000000000000000000000000600082015250565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f596f752063616e206e6f74206769667420746f20796f757273656c6600000000600082015250565b7f4275726e696e67206973206e6f74206163746976650000000000000000000000600082015250565b7f496e636f72726563742041534820616d6f756e7420666f72207265717565737460008201527f6564207175616e74697479000000000000000000000000000000000000000000602082015250565b7f455243313135353a206275726e2066726f6d20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f41646d696e436f6e74726f6c3a204d757374206265206f776e6572206f72206160008201527f646d696e00000000000000000000000000000000000000000000000000000000602082015250565b7f47696674696e67206973206e6f74206163746976650000000000000000000000600082015250565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f546865207175616e74697479206f66206d696e7473207375727061737365732060008201527f746865206d617800000000000000000000000000000000000000000000000000602082015250565b600060443d1015615df657615e79565b615dfe615214565b60043d036004823e80513d602482011167ffffffffffffffff82111715615e26575050615e79565b808201805167ffffffffffffffff811115615e445750505050615e79565b80602083010160043d038501811115615e61575050505050615e79565b615e7082602001850186615596565b82955050505050505b90565b615e8581615466565b8114615e9057600080fd5b50565b615e9c81615478565b8114615ea757600080fd5b50565b615eb38161548a565b8114615ebe57600080fd5b50565b615eca81615496565b8114615ed557600080fd5b50565b615ee1816154e2565b8114615eec57600080fd5b5056fea26469706673582212205b1356f9806ff9e6a19ba2a062d71f318b1130ee32427dce9c3b06434aa6b47964736f6c63430008070033

Deployed Bytecode Sourcemap

60982:6309:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44597:231;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61865:406;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61310:21;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63263:319;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63590:563;;;:::i;:::-;;66660:126;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34946:139;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65128:194;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65635:160;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;34668:210;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46536:442;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34046:267;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65330:125;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44994:524;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61422:22;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61338:27;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64726:210;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61515:40;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64161:275;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62283:503;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65463:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34386:210;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20854:103;;;:::i;:::-;;61057:72;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61451:22;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61606:34;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61226:31;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20203:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45591:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61480:22;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61562:37;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62794:461;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61273:30;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61374:39;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45818:168;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64944:176;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65803:849;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;46058:401;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21112:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64444:274;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44597:231;44683:7;44730:1;44711:21;;:7;:21;;;;44703:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;44798:9;:13;44808:2;44798:13;;;;;;;;;;;:22;44812:7;44798:22;;;;;;;;;;;;;;;;44791:29;;44597:231;;;;:::o;61865:406::-;62023:4;62067:38;62093:11;62067:25;:38::i;:::-;:99;;;;62123:43;62154:11;62123:30;:43::i;:::-;62067:99;:142;;;;62199:10;62184:25;;:11;:25;;;;62067:142;:196;;;;62227:36;62251:11;62227:23;:36::i;:::-;62067:196;62046:217;;61865:406;;;:::o;61310:21::-;;;;:::o;63263:319::-;63329:10;;;;;;;;;;;63321:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;63412:8;63384:24;63394:10;63406:1;63384:9;:24::i;:::-;:36;;63376:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;63463:30;63469:10;63481:1;63484:8;63463:5;:30::i;:::-;63504:34;63510:10;63522:1;63525:8;63504:34;;;;;;;;;;;;:5;:34::i;:::-;63552:22;63563:10;63552;:22::i;:::-;63263:319;:::o;63590:563::-;63677:1;63649:24;63659:10;63671:1;63649:9;:24::i;:::-;:29;;:76;;;;;63724:1;63696:24;63706:10;63718:1;63696:9;:24::i;:::-;:29;;63649:76;:123;;;;;63771:1;63743:24;63753:10;63765:1;63743:9;:24::i;:::-;:29;;63649:123;:170;;;;;63818:1;63790:24;63800:10;63812:1;63790:9;:24::i;:::-;:29;;63649:170;63627:245;;;;;;;;;;;;:::i;:::-;;;;;;;;;63885:24;63926:1;63912:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63885:43;;63952:1;63939:7;63947:1;63939:10;;;;;;;;:::i;:::-;;;;;;;:14;;;;;63977:1;63964:7;63972:1;63964:10;;;;;;;;:::i;:::-;;;;;;;:14;;;;;64002:1;63989:7;63997:1;63989:10;;;;;;;;:::i;:::-;;;;;;;:14;;;;;64027:1;64014:7;64022:1;64014:10;;;;;;;;:::i;:::-;;;;;;;:14;;;;;64052:1;64039:7;64047:1;64039:10;;;;;;;;:::i;:::-;;;;;;;:14;;;;;64066:41;64077:10;64089:8;64066:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64099:7;64066:10;:41::i;:::-;64118:27;64124:10;64136:1;64139;64118:27;;;;;;;;;;;;:5;:27::i;:::-;63616:537;63590:563::o;66660:126::-;66728:13;66761:8;:17;66770:7;66761:17;;;;;;;;;;;66754:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66660:126;;;:::o;34946:139::-;35008:4;35044:5;35033:16;;:7;:5;:7::i;:::-;:16;;;:43;;;;35053:23;35070:5;35053:7;:16;;:23;;;;:::i;:::-;35033:43;35025:52;;34946:139;;;:::o;65128:194::-;33870:10;33859:21;;:7;:5;:7::i;:::-;:21;;;:53;;;;33884:28;33901:10;33884:7;:16;;:28;;;;:::i;:::-;33859:53;33851:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;65220:9:::1;65215:100;65235:11;;:18;;65231:1;:22;65215:100;;;65299:4;65275:5;:21;65281:11;;65293:1;65281:14;;;;;;;:::i;:::-;;;;;;;;65275:21;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;65255:3;;;;;:::i;:::-;;;;65215:100;;;;65128:194:::0;;:::o;65635:160::-;65703:7;65712;65740:17;;;;;;;;;;;65781:5;65766:11;;65760:5;:17;;;;:::i;:::-;65759:27;;;;:::i;:::-;65732:55;;;;65635:160;;;;;:::o;34668:210::-;20434:12;:10;:12::i;:::-;20423:23;;:7;:5;:7::i;:::-;:23;;;20415:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;34747:23:::1;34764:5;34747:7;:16;;:23;;;;:::i;:::-;34743:128;;;34812:10;34792:31;;34805:5;34792:31;;;;;;;;;;;;34838:21;34853:5;34838:7;:14;;:21;;;;:::i;:::-;;34743:128;34668:210:::0;:::o;46536:442::-;46777:12;:10;:12::i;:::-;46769:20;;:4;:20;;;:60;;;;46793:36;46810:4;46816:12;:10;:12::i;:::-;46793:16;:36::i;:::-;46769:60;46747:160;;;;;;;;;;;;:::i;:::-;;;;;;;;;46918:52;46941:4;46947:2;46951:3;46956:7;46965:4;46918:22;:52::i;:::-;46536:442;;;;;:::o;34046:267::-;34099:23;34158:16;:7;:14;:16::i;:::-;34144:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34135:40;;34191:6;34186:96;34207:16;:7;:14;:16::i;:::-;34203:1;:20;34186:96;;;34257:13;34268:1;34257:7;:10;;:13;;;;:::i;:::-;34245:6;34252:1;34245:9;;;;;;;;:::i;:::-;;;;;;;:25;;;;;;;;;;;34225:3;;;;;:::i;:::-;;;;34186:96;;;;34046:267;:::o;65330:125::-;33870:10;33859:21;;:7;:5;:7::i;:::-;:21;;;:53;;;;33884:28;33901:10;33884:7;:16;;:28;;;;:::i;:::-;33859:53;33851:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;65442:4:::1;;65422:8;:17;65431:7;65422:17;;;;;;;;;;;:24;;;;;;;:::i;:::-;;65330:125:::0;;;:::o;44994:524::-;45150:16;45211:3;:10;45192:8;:15;:29;45184:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;45280:30;45327:8;:15;45313:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45280:63;;45361:9;45356:122;45380:8;:15;45376:1;:19;45356:122;;;45436:30;45446:8;45455:1;45446:11;;;;;;;;:::i;:::-;;;;;;;;45459:3;45463:1;45459:6;;;;;;;;:::i;:::-;;;;;;;;45436:9;:30::i;:::-;45417:13;45431:1;45417:16;;;;;;;;:::i;:::-;;;;;;;:49;;;;;45397:3;;;;:::i;:::-;;;45356:122;;;;45497:13;45490:20;;;44994:524;;;;:::o;61422:22::-;;;;;;;;;;;;;:::o;61338:27::-;;;;:::o;64726:210::-;33870:10;33859:21;;:7;:5;:7::i;:::-;:21;;;:53;;;;33884:28;33901:10;33884:7;:16;;:28;;;;:::i;:::-;33859:53;33851:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;64837:9:::1;64832:97;64852:8;;:15;;64848:1;:19;64832:97;;;64907:7;;64915:1;64907:10;;;;;;;:::i;:::-;;;;;;;;64889:2;:15;64892:8;;64901:1;64892:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;64889:15;;;;;;;;;;;;;;;:28;;;;64869:3;;;;;:::i;:::-;;;;64832:97;;;;64726:210:::0;;;;:::o;61515:40::-;;;;;;;;;;;;;;;;;:::o;64161:275::-;33870:10;33859:21;;:7;:5;:7::i;:::-;:21;;;:53;;;;33884:28;33901:10;33884:7;:16;;:28;;;;:::i;:::-;33859:53;33851:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;64322:9:::1;64317:112;64337:8;;:15;;64333:1;:19;64317:112;;;64374:43;64380:8;;64389:1;64380:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;64393:7;64402;;64410:1;64402:10;;;;;;;:::i;:::-;;;;;;;;64374:43;;;;;;;;;;;::::0;:5:::1;:43::i;:::-;64354:3;;;;;:::i;:::-;;;;64317:112;;;;64161:275:::0;;;;;:::o;62283:503::-;62363:10;;;;;;;;;;;62355:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;62426:1;62415:8;:12;62407:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;62498:9;;62485:8;62476:6;;:17;;;;:::i;:::-;62475:32;;62467:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;62592:5;;62581:8;:16;;;;:::i;:::-;62570:6;:28;62562:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;62674:12;;;;;;;;;;;62667:33;;;62701:10;62713:17;;;;;;;;;;;62732:6;62667:72;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;62752:26;62757:10;62769:8;62752:4;:26::i;:::-;62283:503;;:::o;65463:164::-;33870:10;33859:21;;:7;:5;:7::i;:::-;:21;;;:53;;;;33884:28;33901:10;33884:7;:16;;:28;;;;:::i;:::-;33859:53;33851:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;65582:9:::1;65562:17;;:29;;;;;;;;;;;;;;;;;;65616:3;65602:11;:17;;;;65463:164:::0;;:::o;34386:210::-;20434:12;:10;:12::i;:::-;20423:23;;:7;:5;:7::i;:::-;:23;;;20415:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;34467:23:::1;34484:5;34467:7;:16;;:23;;;;:::i;:::-;34462:127;;34533:10;34512:32;;34526:5;34512:32;;;;;;;;;;;;34559:18;34571:5;34559:7;:11;;:18;;;;:::i;:::-;;34462:127;34386:210:::0;:::o;20854:103::-;20434:12;:10;:12::i;:::-;20423:23;;:7;:5;:7::i;:::-;:23;;;20415:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;20919:30:::1;20946:1;20919:18;:30::i;:::-;20854:103::o:0;61057:72::-;;;;;;;;;;;;;:::o;61451:22::-;;;;;;;;;;;;;:::o;61606:34::-;;;;;;;;;;;;;;;;;;;;;;:::o;61226:31::-;;;;:::o;20203:87::-;20249:7;20276:6;;;;;;;;;;;20269:13;;20203:87;:::o;45591:155::-;45686:52;45705:12;:10;:12::i;:::-;45719:8;45729;45686:18;:52::i;:::-;45591:155;;:::o;61480:22::-;;;;;;;;;;;;;:::o;61562:37::-;;;;;;;;;;;;;;;;;:::o;62794:461::-;62870:10;;;;;;;;;;;62862:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;62958:1;62925:30;62935:10;62947:7;62925:9;:30::i;:::-;:34;62917:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;63019:10;63008:21;;:7;:21;;;;63000:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;63075:53;63092:10;63104:7;63113;63122:1;63075:53;;;;;;;;;;;;:16;:53::i;:::-;63156:1;63145:7;:12;63141:72;;;63174:27;63180:10;63192:1;63195;63174:27;;;;;;;;;;;;:5;:27::i;:::-;63141:72;63225:22;63236:10;63225;:22::i;:::-;62794:461;;:::o;61273:30::-;;;;:::o;61374:39::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;45818:168::-;45917:4;45941:18;:27;45960:7;45941:27;;;;;;;;;;;;;;;:37;45969:8;45941:37;;;;;;;;;;;;;;;;;;;;;;;;;45934:44;;45818:168;;;;:::o;64944:176::-;33870:10;33859:21;;:7;:5;:7::i;:::-;:21;;;:53;;;;33884:28;33901:10;33884:7;:16;;:28;;;;:::i;:::-;33859:53;33851:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;65027:9:::1;65022:91;65042:8;;:15;;65038:1;:19;65022:91;;;65097:4;65079:2;:15;65082:8;;65091:1;65082:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;65079:15;;;;;;;;;;;;;;;;:22;;;;;;;;;;;;;;;;;;65059:3;;;;;:::i;:::-;;;;65022:91;;;;64944:176:::0;;:::o;65803:849::-;65908:9;65919;65930;65962:8;65958:12;;65985:1;65981:5;;66001:1;65997:5;;66033;:14;66039:7;66033:14;;;;;;;;;;;;;;;;66019:2;:11;66022:7;66019:11;;;;;;;;;;;;;;;;:28;66015:601;;;66064:22;66103:5;:14;66109:7;66103:14;;;;;;;;;;;;;;;;66089:2;:11;66092:7;66089:11;;;;;;;;;;;;;;;;:28;;;;:::i;:::-;66064:53;;66154:8;66136:14;:26;66132:206;;66187:8;66183:12;;66218:8;66214:12;;66132:206;;;66271:14;66267:18;;66308:14;66304:18;;66132:206;66049:300;66015:601;;;66359:2;:11;66362:7;66359:11;;;;;;;;;;;;;;;;;;;;;;;;;:33;;;;;66391:1;66374:5;:14;66380:7;66374:14;;;;;;;;;;;;;;;;:18;66359:33;66355:261;;;66409:22;66438:5;:14;66444:7;66438:14;;;;;;;;;;;;;;;;66434:1;:18;;;;:::i;:::-;66409:43;;66489:8;66471:14;:26;66467:138;;66522:8;66518:12;;66467:138;;;66575:14;66571:18;;66467:138;66394:222;66355:261;66015:601;65803:849;;;;;:::o;46058:401::-;46274:12;:10;:12::i;:::-;46266:20;;:4;:20;;;:60;;;;46290:36;46307:4;46313:12;:10;:12::i;:::-;46290:16;:36::i;:::-;46266:60;46244:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;46406:45;46424:4;46430:2;46434;46438:6;46446:4;46406:17;:45::i;:::-;46058:401;;;;;:::o;21112:201::-;20434:12;:10;:12::i;:::-;20423:23;;:7;:5;:7::i;:::-;:23;;;20415:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;21221:1:::1;21201:22;;:8;:22;;;;21193:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21277:28;21296:8;21277:18;:28::i;:::-;21112:201:::0;:::o;64444:274::-;33870:10;33859:21;;:7;:5;:7::i;:::-;:21;;;:53;;;;33884:28;33901:10;33884:7;:16;;:28;;;;:::i;:::-;33859:53;33851:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;64527:1:::1;64518:5;:10;64514:197;;;64559:10;;;;;;;;;;;64558:11;64545:10;;:24;;;;;;;;;;;;;;;;;;64514:197;;;64600:1;64591:5;:10;64587:124;;;64632:10;;;;;;;;;;;64631:11;64618:10;;:24;;;;;;;;;;;;;;;;;;64587:124;;;64689:10;;;;;;;;;;;64688:11;64675:10;;:24;;;;;;;;;;;;;;;;;;64587:124;64514:197;64444:274:::0;:::o;43620:310::-;43722:4;43774:26;43759:41;;;:11;:41;;;;:110;;;;43832:37;43817:52;;;:11;:52;;;;43759:110;:163;;;;43886:36;43910:11;43886:23;:36::i;:::-;43759:163;43739:183;;43620:310;;;:::o;33484:233::-;33586:4;33625:31;33610:46;;;:11;:46;;;;:99;;;;33673:36;33697:11;33673:23;:36::i;:::-;33610:99;33603:106;;33484:233;;;:::o;52922:648::-;53065:1;53049:18;;:4;:18;;;;53041:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;53120:16;53139:12;:10;:12::i;:::-;53120:31;;53164:102;53185:8;53195:4;53209:1;53213:21;53231:2;53213:17;:21::i;:::-;53236:25;53254:6;53236:17;:25::i;:::-;53164:102;;;;;;;;;;;;:20;:102::i;:::-;53279:19;53301:9;:13;53311:2;53301:13;;;;;;;;;;;:19;53315:4;53301:19;;;;;;;;;;;;;;;;53279:41;;53354:6;53339:11;:21;;53331:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;53473:6;53459:11;:20;53437:9;:13;53447:2;53437:13;;;;;;;;;;;:19;53451:4;53437:19;;;;;;;;;;;;;;;:42;;;;53547:1;53508:54;;53533:4;53508:54;;53523:8;53508:54;;;53551:2;53555:6;53508:54;;;;;;;:::i;:::-;;;;;;;;53030:540;;52922:648;;;:::o;51012:569::-;51179:1;51165:16;;:2;:16;;;;51157:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;51232:16;51251:12;:10;:12::i;:::-;51232:31;;51276:102;51297:8;51315:1;51319:2;51323:21;51341:2;51323:17;:21::i;:::-;51346:25;51364:6;51346:17;:25::i;:::-;51373:4;51276:20;:102::i;:::-;51412:6;51391:9;:13;51401:2;51391:13;;;;;;;;;;;:17;51405:2;51391:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;51471:2;51434:52;;51467:1;51434:52;;51449:8;51434:52;;;51475:2;51479:6;51434:52;;;;;;;:::i;:::-;;;;;;;;51499:74;51530:8;51548:1;51552:2;51556;51560:6;51568:4;51499:30;:74::i;:::-;51146:435;51012:569;;;;:::o;67123:165::-;67184:5;:19;67190:12;;67184:19;;;;;;;;;;;;;;;;;;;;;67180:76;;;67220:24;67226:7;67235:1;67238;67220:24;;;;;;;;;;;;:5;:24::i;:::-;67180:76;67266:12;;:14;;;;;;;;;:::i;:::-;;;;;;67123:165;:::o;53773:891::-;53941:1;53925:18;;:4;:18;;;;53917:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;54016:7;:14;54002:3;:10;:28;53994:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;54088:16;54107:12;:10;:12::i;:::-;54088:31;;54132:66;54153:8;54163:4;54177:1;54181:3;54186:7;54132:66;;;;;;;;;;;;:20;:66::i;:::-;54216:9;54211:373;54235:3;:10;54231:1;:14;54211:373;;;54267:10;54280:3;54284:1;54280:6;;;;;;;;:::i;:::-;;;;;;;;54267:19;;54301:14;54318:7;54326:1;54318:10;;;;;;;;:::i;:::-;;;;;;;;54301:27;;54345:19;54367:9;:13;54377:2;54367:13;;;;;;;;;;;:19;54381:4;54367:19;;;;;;;;;;;;;;;;54345:41;;54424:6;54409:11;:21;;54401:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;54551:6;54537:11;:20;54515:9;:13;54525:2;54515:13;;;;;;;;;;;:19;54529:4;54515:19;;;;;;;;;;;;;;;:42;;;;54252:332;;;54247:3;;;;;:::i;:::-;;;;54211:373;;;;54639:1;54601:55;;54625:4;54601:55;;54615:8;54601:55;;;54643:3;54648:7;54601:55;;;;;;;:::i;:::-;;;;;;;;53906:758;53773:891;;;:::o;8477:167::-;8557:4;8581:55;8591:3;:10;;8627:5;8611:23;;8603:32;;8581:9;:55::i;:::-;8574:62;;8477:167;;;;:::o;18927:98::-;18980:7;19007:10;19000:17;;18927:98;:::o;8233:158::-;8306:4;8330:53;8338:3;:10;;8374:5;8358:23;;8350:32;;8330:7;:53::i;:::-;8323:60;;8233:158;;;;:::o;48620:1074::-;48847:7;:14;48833:3;:10;:28;48825:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;48939:1;48925:16;;:2;:16;;;;48917:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;48996:16;49015:12;:10;:12::i;:::-;48996:31;;49040:60;49061:8;49071:4;49077:2;49081:3;49086:7;49095:4;49040:20;:60::i;:::-;49118:9;49113:421;49137:3;:10;49133:1;:14;49113:421;;;49169:10;49182:3;49186:1;49182:6;;;;;;;;:::i;:::-;;;;;;;;49169:19;;49203:14;49220:7;49228:1;49220:10;;;;;;;;:::i;:::-;;;;;;;;49203:27;;49247:19;49269:9;:13;49279:2;49269:13;;;;;;;;;;;:19;49283:4;49269:19;;;;;;;;;;;;;;;;49247:41;;49326:6;49311:11;:21;;49303:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;49459:6;49445:11;:20;49423:9;:13;49433:2;49423:13;;;;;;;;;;;:19;49437:4;49423:19;;;;;;;;;;;;;;;:42;;;;49516:6;49495:9;:13;49505:2;49495:13;;;;;;;;;;;:17;49509:2;49495:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;49154:380;;;49149:3;;;;:::i;:::-;;;49113:421;;;;49581:2;49551:47;;49575:4;49551:47;;49565:8;49551:47;;;49585:3;49590:7;49551:47;;;;;;;:::i;:::-;;;;;;;;49611:75;49647:8;49657:4;49663:2;49667:3;49672:7;49681:4;49611:35;:75::i;:::-;48814:880;48620:1074;;;;;:::o;8730:117::-;8793:7;8820:19;8828:3;:10;;8820:7;:19::i;:::-;8813:26;;8730:117;;;:::o;9201:158::-;9275:7;9326:22;9330:3;:10;;9342:5;9326:3;:22::i;:::-;9318:31;;9295:56;;9201:158;;;;:::o;66794:321::-;66863:24;66904:1;66890:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66863:43;;66956:28;66966:7;66975:8;66956:9;:28::i;:::-;66918:7;66926:1;66918:10;;;;;;;;:::i;:::-;;;;;;;66930:7;66938:1;66930:10;;;;;;;;:::i;:::-;;;;;;;66942:7;66950:1;66942:10;;;;;;;;:::i;:::-;;;;;;;66917:67;;;;;;;;;;;;;;;66997:42;67008:7;67017:8;66997:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67027:7;66997:42;;;;;;;;;;;;:10;:42::i;:::-;67070:8;67052:5;:14;67058:7;67052:14;;;;;;;;;;;;;;;;:26;;;;;;;:::i;:::-;;;;;;;;67099:8;67089:6;;:18;;;;;;;:::i;:::-;;;;;;;;66852:263;66794:321;;:::o;7905:152::-;7975:4;7999:50;8004:3;:10;;8040:5;8024:23;;8016:32;;7999:4;:50::i;:::-;7992:57;;7905:152;;;;:::o;21473:191::-;21547:16;21566:6;;;;;;;;;;;21547:25;;21592:8;21583:6;;:17;;;;;;;;;;;;;;;;;;21647:8;21616:40;;21637:8;21616:40;;;;;;;;;;;;21536:128;21473:191;:::o;54806:331::-;54961:8;54952:17;;:5;:17;;;;54944:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;55064:8;55026:18;:25;55045:5;55026:25;;;;;;;;;;;;;;;:35;55052:8;55026:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;55110:8;55088:41;;55103:5;55088:41;;;55120:8;55088:41;;;;;;:::i;:::-;;;;;;;;54806:331;;;:::o;47442:820::-;47644:1;47630:16;;:2;:16;;;;47622:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;47701:16;47720:12;:10;:12::i;:::-;47701:31;;47745:96;47766:8;47776:4;47782:2;47786:21;47804:2;47786:17;:21::i;:::-;47809:25;47827:6;47809:17;:25::i;:::-;47836:4;47745:20;:96::i;:::-;47854:19;47876:9;:13;47886:2;47876:13;;;;;;;;;;;:19;47890:4;47876:19;;;;;;;;;;;;;;;;47854:41;;47929:6;47914:11;:21;;47906:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;48054:6;48040:11;:20;48018:9;:13;48028:2;48018:13;;;;;;;;;;;:19;48032:4;48018:19;;;;;;;;;;;;;;;:42;;;;48103:6;48082:9;:13;48092:2;48082:13;;;;;;;;;;;:17;48096:2;48082:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;48158:2;48127:46;;48152:4;48127:46;;48142:8;48127:46;;;48162:2;48166:6;48127:46;;;;;;;:::i;:::-;;;;;;;;48186:68;48217:8;48227:4;48233:2;48237;48241:6;48249:4;48186:30;:68::i;:::-;47611:651;;47442:820;;;;;:::o;32925:157::-;33010:4;33049:25;33034:40;;;:11;:40;;;;33027:47;;32925:157;;;:::o;57895:198::-;57961:16;57990:22;58029:1;58015:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57990:41;;58053:7;58042:5;58048:1;58042:8;;;;;;;;:::i;:::-;;;;;;;:18;;;;;58080:5;58073:12;;;57895:198;;;:::o;56093:221::-;;;;;;;:::o;56322:744::-;56537:15;:2;:13;;;:15::i;:::-;56533:526;;;56590:2;56573:38;;;56612:8;56622:4;56628:2;56632:6;56640:4;56573:72;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;56569:479;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;56921:6;56914:14;;;;;;;;;;;:::i;:::-;;;;;;;;56569:479;;;56970:62;;;;;;;;;;:::i;:::-;;;;;;;;56569:479;56707:43;;;56695:55;;;:8;:55;;;;56691:154;;56775:50;;;;;;;;;;:::i;:::-;;;;;;;;56691:154;56646:214;56533:526;56322:744;;;;;;:::o;3916:129::-;3989:4;4036:1;4013:3;:12;;:19;4026:5;4013:19;;;;;;;;;;;;:24;;4006:31;;3916:129;;;;:::o;2410:1420::-;2476:4;2594:18;2615:3;:12;;:19;2628:5;2615:19;;;;;;;;;;;;2594:40;;2665:1;2651:10;:15;2647:1176;;3026:21;3063:1;3050:10;:14;;;;:::i;:::-;3026:38;;3079:17;3120:1;3099:3;:11;;:18;;;;:22;;;;:::i;:::-;3079:42;;3155:13;3142:9;:26;3138:405;;3189:17;3209:3;:11;;3221:9;3209:22;;;;;;;;:::i;:::-;;;;;;;;;;3189:42;;3363:9;3334:3;:11;;3346:13;3334:26;;;;;;;;:::i;:::-;;;;;;;;;:38;;;;3474:10;3448:3;:12;;:23;3461:9;3448:23;;;;;;;;;;;:36;;;;3170:373;3138:405;3624:3;:11;;:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;3719:3;:12;;:19;3732:5;3719:19;;;;;;;;;;;3712:26;;;3762:4;3755:11;;;;;;;2647:1176;3806:5;3799:12;;;2410:1420;;;;;:::o;57074:813::-;57314:15;:2;:13;;;:15::i;:::-;57310:570;;;57367:2;57350:43;;;57394:8;57404:4;57410:3;57415:7;57424:4;57350:79;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;57346:523;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;57742:6;57735:14;;;;;;;;;;;:::i;:::-;;;;;;;;57346:523;;;57791:62;;;;;;;;;;:::i;:::-;;;;;;;;57346:523;57523:48;;;57511:60;;;:8;:60;;;;57507:159;;57596:50;;;;;;;;;;:::i;:::-;;;;;;;;57507:159;57430:251;57310:570;57074:813;;;;;;:::o;4131:109::-;4187:7;4214:3;:11;;:18;;;;4207:25;;4131:109;;;:::o;4594:120::-;4661:7;4688:3;:11;;4700:5;4688:18;;;;;;;;:::i;:::-;;;;;;;;;;4681:25;;4594:120;;;;:::o;51937:735::-;52129:1;52115:16;;:2;:16;;;;52107:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;52202:7;:14;52188:3;:10;:28;52180:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;52274:16;52293:12;:10;:12::i;:::-;52274:31;;52318:66;52339:8;52357:1;52361:2;52365:3;52370:7;52379:4;52318:20;:66::i;:::-;52402:9;52397:103;52421:3;:10;52417:1;:14;52397:103;;;52478:7;52486:1;52478:10;;;;;;;;:::i;:::-;;;;;;;;52453:9;:17;52463:3;52467:1;52463:6;;;;;;;;:::i;:::-;;;;;;;;52453:17;;;;;;;;;;;:21;52471:2;52453:21;;;;;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;;;;;52433:3;;;;;:::i;:::-;;;;52397:103;;;;52553:2;52517:53;;52549:1;52517:53;;52531:8;52517:53;;;52557:3;52562:7;52517:53;;;;;;;:::i;:::-;;;;;;;;52583:81;52619:8;52637:1;52641:2;52645:3;52650:7;52659:4;52583:35;:81::i;:::-;52096:576;51937:735;;;;:::o;1820:414::-;1883:4;1905:21;1915:3;1920:5;1905:9;:21::i;:::-;1900:327;;1943:3;:11;;1960:5;1943:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2126:3;:11;;:18;;;;2104:3;:12;;:19;2117:5;2104:19;;;;;;;;;;;:40;;;;2166:4;2159:11;;;;1900:327;2210:5;2203:12;;1820:414;;;;;:::o;22904:326::-;22964:4;23221:1;23199:7;:19;;;:23;23192:30;;22904:326;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;769:::-;865:5;890:81;906:64;963:6;906:64;:::i;:::-;890:81;:::i;:::-;881:90;;991:5;1020:6;1013:5;1006:21;1054:4;1047:5;1043:16;1036:23;;1080:6;1130:3;1122:4;1114:6;1110:17;1105:3;1101:27;1098:36;1095:143;;;1149:79;;:::i;:::-;1095:143;1262:1;1247:238;1272:6;1269:1;1266:13;1247:238;;;1340:3;1369:37;1402:3;1390:10;1369:37;:::i;:::-;1364:3;1357:50;1436:4;1431:3;1427:14;1420:21;;1470:4;1465:3;1461:14;1454:21;;1307:178;1294:1;1291;1287:9;1282:14;;1247:238;;;1251:14;871:620;;769:722;;;;;:::o;1497:410::-;1574:5;1599:65;1615:48;1656:6;1615:48;:::i;:::-;1599:65;:::i;:::-;1590:74;;1687:6;1680:5;1673:21;1725:4;1718:5;1714:16;1763:3;1754:6;1749:3;1745:16;1742:25;1739:112;;;1770:79;;:::i;:::-;1739:112;1860:41;1894:6;1889:3;1884;1860:41;:::i;:::-;1580:327;1497:410;;;;;:::o;1913:139::-;1959:5;1997:6;1984:20;1975:29;;2013:33;2040:5;2013:33;:::i;:::-;1913:139;;;;:::o;2058:155::-;2112:5;2150:6;2137:20;2128:29;;2166:41;2201:5;2166:41;:::i;:::-;2058:155;;;;:::o;2236:568::-;2309:8;2319:6;2369:3;2362:4;2354:6;2350:17;2346:27;2336:122;;2377:79;;:::i;:::-;2336:122;2490:6;2477:20;2467:30;;2520:18;2512:6;2509:30;2506:117;;;2542:79;;:::i;:::-;2506:117;2656:4;2648:6;2644:17;2632:29;;2710:3;2702:4;2694:6;2690:17;2680:8;2676:32;2673:41;2670:128;;;2717:79;;:::i;:::-;2670:128;2236:568;;;;;:::o;2827:370::-;2898:5;2947:3;2940:4;2932:6;2928:17;2924:27;2914:122;;2955:79;;:::i;:::-;2914:122;3072:6;3059:20;3097:94;3187:3;3179:6;3172:4;3164:6;3160:17;3097:94;:::i;:::-;3088:103;;2904:293;2827:370;;;;:::o;3220:568::-;3293:8;3303:6;3353:3;3346:4;3338:6;3334:17;3330:27;3320:122;;3361:79;;:::i;:::-;3320:122;3474:6;3461:20;3451:30;;3504:18;3496:6;3493:30;3490:117;;;3526:79;;:::i;:::-;3490:117;3640:4;3632:6;3628:17;3616:29;;3694:3;3686:4;3678:6;3674:17;3664:8;3660:32;3657:41;3654:128;;;3701:79;;:::i;:::-;3654:128;3220:568;;;;;:::o;3811:370::-;3882:5;3931:3;3924:4;3916:6;3912:17;3908:27;3898:122;;3939:79;;:::i;:::-;3898:122;4056:6;4043:20;4081:94;4171:3;4163:6;4156:4;4148:6;4144:17;4081:94;:::i;:::-;4072:103;;3888:293;3811:370;;;;:::o;4187:133::-;4230:5;4268:6;4255:20;4246:29;;4284:30;4308:5;4284:30;:::i;:::-;4187:133;;;;:::o;4326:137::-;4380:5;4411:6;4405:13;4396:22;;4427:30;4451:5;4427:30;:::i;:::-;4326:137;;;;:::o;4469:::-;4514:5;4552:6;4539:20;4530:29;;4568:32;4594:5;4568:32;:::i;:::-;4469:137;;;;:::o;4612:141::-;4668:5;4699:6;4693:13;4684:22;;4715:32;4741:5;4715:32;:::i;:::-;4612:141;;;;:::o;4772:338::-;4827:5;4876:3;4869:4;4861:6;4857:17;4853:27;4843:122;;4884:79;;:::i;:::-;4843:122;5001:6;4988:20;5026:78;5100:3;5092:6;5085:4;5077:6;5073:17;5026:78;:::i;:::-;5017:87;;4833:277;4772:338;;;;:::o;5130:553::-;5188:8;5198:6;5248:3;5241:4;5233:6;5229:17;5225:27;5215:122;;5256:79;;:::i;:::-;5215:122;5369:6;5356:20;5346:30;;5399:18;5391:6;5388:30;5385:117;;;5421:79;;:::i;:::-;5385:117;5535:4;5527:6;5523:17;5511:29;;5589:3;5581:4;5573:6;5569:17;5559:8;5555:32;5552:41;5549:128;;;5596:79;;:::i;:::-;5549:128;5130:553;;;;;:::o;5689:139::-;5735:5;5773:6;5760:20;5751:29;;5789:33;5816:5;5789:33;:::i;:::-;5689:139;;;;:::o;5834:329::-;5893:6;5942:2;5930:9;5921:7;5917:23;5913:32;5910:119;;;5948:79;;:::i;:::-;5910:119;6068:1;6093:53;6138:7;6129:6;6118:9;6114:22;6093:53;:::i;:::-;6083:63;;6039:117;5834:329;;;;:::o;6169:490::-;6245:6;6253;6302:2;6290:9;6281:7;6277:23;6273:32;6270:119;;;6308:79;;:::i;:::-;6270:119;6428:1;6453:61;6506:7;6497:6;6486:9;6482:22;6453:61;:::i;:::-;6443:71;;6399:125;6563:2;6589:53;6634:7;6625:6;6614:9;6610:22;6589:53;:::i;:::-;6579:63;;6534:118;6169:490;;;;;:::o;6665:474::-;6733:6;6741;6790:2;6778:9;6769:7;6765:23;6761:32;6758:119;;;6796:79;;:::i;:::-;6758:119;6916:1;6941:53;6986:7;6977:6;6966:9;6962:22;6941:53;:::i;:::-;6931:63;;6887:117;7043:2;7069:53;7114:7;7105:6;7094:9;7090:22;7069:53;:::i;:::-;7059:63;;7014:118;6665:474;;;;;:::o;7145:1509::-;7299:6;7307;7315;7323;7331;7380:3;7368:9;7359:7;7355:23;7351:33;7348:120;;;7387:79;;:::i;:::-;7348:120;7507:1;7532:53;7577:7;7568:6;7557:9;7553:22;7532:53;:::i;:::-;7522:63;;7478:117;7634:2;7660:53;7705:7;7696:6;7685:9;7681:22;7660:53;:::i;:::-;7650:63;;7605:118;7790:2;7779:9;7775:18;7762:32;7821:18;7813:6;7810:30;7807:117;;;7843:79;;:::i;:::-;7807:117;7948:78;8018:7;8009:6;7998:9;7994:22;7948:78;:::i;:::-;7938:88;;7733:303;8103:2;8092:9;8088:18;8075:32;8134:18;8126:6;8123:30;8120:117;;;8156:79;;:::i;:::-;8120:117;8261:78;8331:7;8322:6;8311:9;8307:22;8261:78;:::i;:::-;8251:88;;8046:303;8416:3;8405:9;8401:19;8388:33;8448:18;8440:6;8437:30;8434:117;;;8470:79;;:::i;:::-;8434:117;8575:62;8629:7;8620:6;8609:9;8605:22;8575:62;:::i;:::-;8565:72;;8359:288;7145:1509;;;;;;;;:::o;8660:1089::-;8764:6;8772;8780;8788;8796;8845:3;8833:9;8824:7;8820:23;8816:33;8813:120;;;8852:79;;:::i;:::-;8813:120;8972:1;8997:53;9042:7;9033:6;9022:9;9018:22;8997:53;:::i;:::-;8987:63;;8943:117;9099:2;9125:53;9170:7;9161:6;9150:9;9146:22;9125:53;:::i;:::-;9115:63;;9070:118;9227:2;9253:53;9298:7;9289:6;9278:9;9274:22;9253:53;:::i;:::-;9243:63;;9198:118;9355:2;9381:53;9426:7;9417:6;9406:9;9402:22;9381:53;:::i;:::-;9371:63;;9326:118;9511:3;9500:9;9496:19;9483:33;9543:18;9535:6;9532:30;9529:117;;;9565:79;;:::i;:::-;9529:117;9670:62;9724:7;9715:6;9704:9;9700:22;9670:62;:::i;:::-;9660:72;;9454:288;8660:1089;;;;;;;;:::o;9755:468::-;9820:6;9828;9877:2;9865:9;9856:7;9852:23;9848:32;9845:119;;;9883:79;;:::i;:::-;9845:119;10003:1;10028:53;10073:7;10064:6;10053:9;10049:22;10028:53;:::i;:::-;10018:63;;9974:117;10130:2;10156:50;10198:7;10189:6;10178:9;10174:22;10156:50;:::i;:::-;10146:60;;10101:115;9755:468;;;;;:::o;10229:474::-;10297:6;10305;10354:2;10342:9;10333:7;10329:23;10325:32;10322:119;;;10360:79;;:::i;:::-;10322:119;10480:1;10505:53;10550:7;10541:6;10530:9;10526:22;10505:53;:::i;:::-;10495:63;;10451:117;10607:2;10633:53;10678:7;10669:6;10658:9;10654:22;10633:53;:::i;:::-;10623:63;;10578:118;10229:474;;;;;:::o;10709:559::-;10795:6;10803;10852:2;10840:9;10831:7;10827:23;10823:32;10820:119;;;10858:79;;:::i;:::-;10820:119;11006:1;10995:9;10991:17;10978:31;11036:18;11028:6;11025:30;11022:117;;;11058:79;;:::i;:::-;11022:117;11171:80;11243:7;11234:6;11223:9;11219:22;11171:80;:::i;:::-;11153:98;;;;10949:312;10709:559;;;;;:::o;11274:934::-;11396:6;11404;11412;11420;11469:2;11457:9;11448:7;11444:23;11440:32;11437:119;;;11475:79;;:::i;:::-;11437:119;11623:1;11612:9;11608:17;11595:31;11653:18;11645:6;11642:30;11639:117;;;11675:79;;:::i;:::-;11639:117;11788:80;11860:7;11851:6;11840:9;11836:22;11788:80;:::i;:::-;11770:98;;;;11566:312;11945:2;11934:9;11930:18;11917:32;11976:18;11968:6;11965:30;11962:117;;;11998:79;;:::i;:::-;11962:117;12111:80;12183:7;12174:6;12163:9;12159:22;12111:80;:::i;:::-;12093:98;;;;11888:313;11274:934;;;;;;;:::o;12214:1079::-;12345:6;12353;12361;12369;12377;12426:2;12414:9;12405:7;12401:23;12397:32;12394:119;;;12432:79;;:::i;:::-;12394:119;12580:1;12569:9;12565:17;12552:31;12610:18;12602:6;12599:30;12596:117;;;12632:79;;:::i;:::-;12596:117;12745:80;12817:7;12808:6;12797:9;12793:22;12745:80;:::i;:::-;12727:98;;;;12523:312;12902:2;12891:9;12887:18;12874:32;12933:18;12925:6;12922:30;12919:117;;;12955:79;;:::i;:::-;12919:117;13068:80;13140:7;13131:6;13120:9;13116:22;13068:80;:::i;:::-;13050:98;;;;12845:313;13197:2;13223:53;13268:7;13259:6;13248:9;13244:22;13223:53;:::i;:::-;13213:63;;13168:118;12214:1079;;;;;;;;:::o;13299:894::-;13417:6;13425;13474:2;13462:9;13453:7;13449:23;13445:32;13442:119;;;13480:79;;:::i;:::-;13442:119;13628:1;13617:9;13613:17;13600:31;13658:18;13650:6;13647:30;13644:117;;;13680:79;;:::i;:::-;13644:117;13785:78;13855:7;13846:6;13835:9;13831:22;13785:78;:::i;:::-;13775:88;;13571:302;13940:2;13929:9;13925:18;13912:32;13971:18;13963:6;13960:30;13957:117;;;13993:79;;:::i;:::-;13957:117;14098:78;14168:7;14159:6;14148:9;14144:22;14098:78;:::i;:::-;14088:88;;13883:303;13299:894;;;;;:::o;14199:559::-;14285:6;14293;14342:2;14330:9;14321:7;14317:23;14313:32;14310:119;;;14348:79;;:::i;:::-;14310:119;14496:1;14485:9;14481:17;14468:31;14526:18;14518:6;14515:30;14512:117;;;14548:79;;:::i;:::-;14512:117;14661:80;14733:7;14724:6;14713:9;14709:22;14661:80;:::i;:::-;14643:98;;;;14439:312;14199:559;;;;;:::o;14764:345::-;14831:6;14880:2;14868:9;14859:7;14855:23;14851:32;14848:119;;;14886:79;;:::i;:::-;14848:119;15006:1;15031:61;15084:7;15075:6;15064:9;15060:22;15031:61;:::i;:::-;15021:71;;14977:125;14764:345;;;;:::o;15115:327::-;15173:6;15222:2;15210:9;15201:7;15197:23;15193:32;15190:119;;;15228:79;;:::i;:::-;15190:119;15348:1;15373:52;15417:7;15408:6;15397:9;15393:22;15373:52;:::i;:::-;15363:62;;15319:116;15115:327;;;;:::o;15448:349::-;15517:6;15566:2;15554:9;15545:7;15541:23;15537:32;15534:119;;;15572:79;;:::i;:::-;15534:119;15692:1;15717:63;15772:7;15763:6;15752:9;15748:22;15717:63;:::i;:::-;15707:73;;15663:127;15448:349;;;;:::o;15803:329::-;15862:6;15911:2;15899:9;15890:7;15886:23;15882:32;15879:119;;;15917:79;;:::i;:::-;15879:119;16037:1;16062:53;16107:7;16098:6;16087:9;16083:22;16062:53;:::i;:::-;16052:63;;16008:117;15803:329;;;;:::o;16138:674::-;16218:6;16226;16234;16283:2;16271:9;16262:7;16258:23;16254:32;16251:119;;;16289:79;;:::i;:::-;16251:119;16409:1;16434:53;16479:7;16470:6;16459:9;16455:22;16434:53;:::i;:::-;16424:63;;16380:117;16564:2;16553:9;16549:18;16536:32;16595:18;16587:6;16584:30;16581:117;;;16617:79;;:::i;:::-;16581:117;16730:65;16787:7;16778:6;16767:9;16763:22;16730:65;:::i;:::-;16712:83;;;;16507:298;16138:674;;;;;:::o;16818:474::-;16886:6;16894;16943:2;16931:9;16922:7;16918:23;16914:32;16911:119;;;16949:79;;:::i;:::-;16911:119;17069:1;17094:53;17139:7;17130:6;17119:9;17115:22;17094:53;:::i;:::-;17084:63;;17040:117;17196:2;17222:53;17267:7;17258:6;17247:9;17243:22;17222:53;:::i;:::-;17212:63;;17167:118;16818:474;;;;;:::o;17298:179::-;17367:10;17388:46;17430:3;17422:6;17388:46;:::i;:::-;17466:4;17461:3;17457:14;17443:28;;17298:179;;;;:::o;17483:::-;17552:10;17573:46;17615:3;17607:6;17573:46;:::i;:::-;17651:4;17646:3;17642:14;17628:28;;17483:179;;;;:::o;17668:147::-;17763:45;17802:5;17763:45;:::i;:::-;17758:3;17751:58;17668:147;;:::o;17821:108::-;17898:24;17916:5;17898:24;:::i;:::-;17893:3;17886:37;17821:108;;:::o;17935:118::-;18022:24;18040:5;18022:24;:::i;:::-;18017:3;18010:37;17935:118;;:::o;18089:732::-;18208:3;18237:54;18285:5;18237:54;:::i;:::-;18307:86;18386:6;18381:3;18307:86;:::i;:::-;18300:93;;18417:56;18467:5;18417:56;:::i;:::-;18496:7;18527:1;18512:284;18537:6;18534:1;18531:13;18512:284;;;18613:6;18607:13;18640:63;18699:3;18684:13;18640:63;:::i;:::-;18633:70;;18726:60;18779:6;18726:60;:::i;:::-;18716:70;;18572:224;18559:1;18556;18552:9;18547:14;;18512:284;;;18516:14;18812:3;18805:10;;18213:608;;;18089:732;;;;:::o;18857:::-;18976:3;19005:54;19053:5;19005:54;:::i;:::-;19075:86;19154:6;19149:3;19075:86;:::i;:::-;19068:93;;19185:56;19235:5;19185:56;:::i;:::-;19264:7;19295:1;19280:284;19305:6;19302:1;19299:13;19280:284;;;19381:6;19375:13;19408:63;19467:3;19452:13;19408:63;:::i;:::-;19401:70;;19494:60;19547:6;19494:60;:::i;:::-;19484:70;;19340:224;19327:1;19324;19320:9;19315:14;;19280:284;;;19284:14;19580:3;19573:10;;18981:608;;;18857:732;;;;:::o;19595:109::-;19676:21;19691:5;19676:21;:::i;:::-;19671:3;19664:34;19595:109;;:::o;19710:360::-;19796:3;19824:38;19856:5;19824:38;:::i;:::-;19878:70;19941:6;19936:3;19878:70;:::i;:::-;19871:77;;19957:52;20002:6;19997:3;19990:4;19983:5;19979:16;19957:52;:::i;:::-;20034:29;20056:6;20034:29;:::i;:::-;20029:3;20025:39;20018:46;;19800:270;19710:360;;;;:::o;20076:364::-;20164:3;20192:39;20225:5;20192:39;:::i;:::-;20247:71;20311:6;20306:3;20247:71;:::i;:::-;20240:78;;20327:52;20372:6;20367:3;20360:4;20353:5;20349:16;20327:52;:::i;:::-;20404:29;20426:6;20404:29;:::i;:::-;20399:3;20395:39;20388:46;;20168:272;20076:364;;;;:::o;20446:366::-;20588:3;20609:67;20673:2;20668:3;20609:67;:::i;:::-;20602:74;;20685:93;20774:3;20685:93;:::i;:::-;20803:2;20798:3;20794:12;20787:19;;20446:366;;;:::o;20818:::-;20960:3;20981:67;21045:2;21040:3;20981:67;:::i;:::-;20974:74;;21057:93;21146:3;21057:93;:::i;:::-;21175:2;21170:3;21166:12;21159:19;;20818:366;;;:::o;21190:::-;21332:3;21353:67;21417:2;21412:3;21353:67;:::i;:::-;21346:74;;21429:93;21518:3;21429:93;:::i;:::-;21547:2;21542:3;21538:12;21531:19;;21190:366;;;:::o;21562:::-;21704:3;21725:67;21789:2;21784:3;21725:67;:::i;:::-;21718:74;;21801:93;21890:3;21801:93;:::i;:::-;21919:2;21914:3;21910:12;21903:19;;21562:366;;;:::o;21934:::-;22076:3;22097:67;22161:2;22156:3;22097:67;:::i;:::-;22090:74;;22173:93;22262:3;22173:93;:::i;:::-;22291:2;22286:3;22282:12;22275:19;;21934:366;;;:::o;22306:::-;22448:3;22469:67;22533:2;22528:3;22469:67;:::i;:::-;22462:74;;22545:93;22634:3;22545:93;:::i;:::-;22663:2;22658:3;22654:12;22647:19;;22306:366;;;:::o;22678:::-;22820:3;22841:67;22905:2;22900:3;22841:67;:::i;:::-;22834:74;;22917:93;23006:3;22917:93;:::i;:::-;23035:2;23030:3;23026:12;23019:19;;22678:366;;;:::o;23050:::-;23192:3;23213:67;23277:2;23272:3;23213:67;:::i;:::-;23206:74;;23289:93;23378:3;23289:93;:::i;:::-;23407:2;23402:3;23398:12;23391:19;;23050:366;;;:::o;23422:::-;23564:3;23585:67;23649:2;23644:3;23585:67;:::i;:::-;23578:74;;23661:93;23750:3;23661:93;:::i;:::-;23779:2;23774:3;23770:12;23763:19;;23422:366;;;:::o;23794:::-;23936:3;23957:67;24021:2;24016:3;23957:67;:::i;:::-;23950:74;;24033:93;24122:3;24033:93;:::i;:::-;24151:2;24146:3;24142:12;24135:19;;23794:366;;;:::o;24166:::-;24308:3;24329:67;24393:2;24388:3;24329:67;:::i;:::-;24322:74;;24405:93;24494:3;24405:93;:::i;:::-;24523:2;24518:3;24514:12;24507:19;;24166:366;;;:::o;24538:::-;24680:3;24701:67;24765:2;24760:3;24701:67;:::i;:::-;24694:74;;24777:93;24866:3;24777:93;:::i;:::-;24895:2;24890:3;24886:12;24879:19;;24538:366;;;:::o;24910:::-;25052:3;25073:67;25137:2;25132:3;25073:67;:::i;:::-;25066:74;;25149:93;25238:3;25149:93;:::i;:::-;25267:2;25262:3;25258:12;25251:19;;24910:366;;;:::o;25282:::-;25424:3;25445:67;25509:2;25504:3;25445:67;:::i;:::-;25438:74;;25521:93;25610:3;25521:93;:::i;:::-;25639:2;25634:3;25630:12;25623:19;;25282:366;;;:::o;25654:::-;25796:3;25817:67;25881:2;25876:3;25817:67;:::i;:::-;25810:74;;25893:93;25982:3;25893:93;:::i;:::-;26011:2;26006:3;26002:12;25995:19;;25654:366;;;:::o;26026:::-;26168:3;26189:67;26253:2;26248:3;26189:67;:::i;:::-;26182:74;;26265:93;26354:3;26265:93;:::i;:::-;26383:2;26378:3;26374:12;26367:19;;26026:366;;;:::o;26398:::-;26540:3;26561:67;26625:2;26620:3;26561:67;:::i;:::-;26554:74;;26637:93;26726:3;26637:93;:::i;:::-;26755:2;26750:3;26746:12;26739:19;;26398:366;;;:::o;26770:::-;26912:3;26933:67;26997:2;26992:3;26933:67;:::i;:::-;26926:74;;27009:93;27098:3;27009:93;:::i;:::-;27127:2;27122:3;27118:12;27111:19;;26770:366;;;:::o;27142:::-;27284:3;27305:67;27369:2;27364:3;27305:67;:::i;:::-;27298:74;;27381:93;27470:3;27381:93;:::i;:::-;27499:2;27494:3;27490:12;27483:19;;27142:366;;;:::o;27514:::-;27656:3;27677:67;27741:2;27736:3;27677:67;:::i;:::-;27670:74;;27753:93;27842:3;27753:93;:::i;:::-;27871:2;27866:3;27862:12;27855:19;;27514:366;;;:::o;27886:::-;28028:3;28049:67;28113:2;28108:3;28049:67;:::i;:::-;28042:74;;28125:93;28214:3;28125:93;:::i;:::-;28243:2;28238:3;28234:12;28227:19;;27886:366;;;:::o;28258:::-;28400:3;28421:67;28485:2;28480:3;28421:67;:::i;:::-;28414:74;;28497:93;28586:3;28497:93;:::i;:::-;28615:2;28610:3;28606:12;28599:19;;28258:366;;;:::o;28630:::-;28772:3;28793:67;28857:2;28852:3;28793:67;:::i;:::-;28786:74;;28869:93;28958:3;28869:93;:::i;:::-;28987:2;28982:3;28978:12;28971:19;;28630:366;;;:::o;29002:::-;29144:3;29165:67;29229:2;29224:3;29165:67;:::i;:::-;29158:74;;29241:93;29330:3;29241:93;:::i;:::-;29359:2;29354:3;29350:12;29343:19;;29002:366;;;:::o;29374:108::-;29451:24;29469:5;29451:24;:::i;:::-;29446:3;29439:37;29374:108;;:::o;29488:118::-;29575:24;29593:5;29575:24;:::i;:::-;29570:3;29563:37;29488:118;;:::o;29612:222::-;29705:4;29743:2;29732:9;29728:18;29720:26;;29756:71;29824:1;29813:9;29809:17;29800:6;29756:71;:::i;:::-;29612:222;;;;:::o;29840:458::-;29997:4;30035:2;30024:9;30020:18;30012:26;;30048:71;30116:1;30105:9;30101:17;30092:6;30048:71;:::i;:::-;30129:80;30205:2;30194:9;30190:18;30181:6;30129:80;:::i;:::-;30219:72;30287:2;30276:9;30272:18;30263:6;30219:72;:::i;:::-;29840:458;;;;;;:::o;30304:1053::-;30627:4;30665:3;30654:9;30650:19;30642:27;;30679:71;30747:1;30736:9;30732:17;30723:6;30679:71;:::i;:::-;30760:72;30828:2;30817:9;30813:18;30804:6;30760:72;:::i;:::-;30879:9;30873:4;30869:20;30864:2;30853:9;30849:18;30842:48;30907:108;31010:4;31001:6;30907:108;:::i;:::-;30899:116;;31062:9;31056:4;31052:20;31047:2;31036:9;31032:18;31025:48;31090:108;31193:4;31184:6;31090:108;:::i;:::-;31082:116;;31246:9;31240:4;31236:20;31230:3;31219:9;31215:19;31208:49;31274:76;31345:4;31336:6;31274:76;:::i;:::-;31266:84;;30304:1053;;;;;;;;:::o;31363:751::-;31586:4;31624:3;31613:9;31609:19;31601:27;;31638:71;31706:1;31695:9;31691:17;31682:6;31638:71;:::i;:::-;31719:72;31787:2;31776:9;31772:18;31763:6;31719:72;:::i;:::-;31801;31869:2;31858:9;31854:18;31845:6;31801:72;:::i;:::-;31883;31951:2;31940:9;31936:18;31927:6;31883:72;:::i;:::-;32003:9;31997:4;31993:20;31987:3;31976:9;31972:19;31965:49;32031:76;32102:4;32093:6;32031:76;:::i;:::-;32023:84;;31363:751;;;;;;;;:::o;32120:332::-;32241:4;32279:2;32268:9;32264:18;32256:26;;32292:71;32360:1;32349:9;32345:17;32336:6;32292:71;:::i;:::-;32373:72;32441:2;32430:9;32426:18;32417:6;32373:72;:::i;:::-;32120:332;;;;;:::o;32458:373::-;32601:4;32639:2;32628:9;32624:18;32616:26;;32688:9;32682:4;32678:20;32674:1;32663:9;32659:17;32652:47;32716:108;32819:4;32810:6;32716:108;:::i;:::-;32708:116;;32458:373;;;;:::o;32837:::-;32980:4;33018:2;33007:9;33003:18;32995:26;;33067:9;33061:4;33057:20;33053:1;33042:9;33038:17;33031:47;33095:108;33198:4;33189:6;33095:108;:::i;:::-;33087:116;;32837:373;;;;:::o;33216:634::-;33437:4;33475:2;33464:9;33460:18;33452:26;;33524:9;33518:4;33514:20;33510:1;33499:9;33495:17;33488:47;33552:108;33655:4;33646:6;33552:108;:::i;:::-;33544:116;;33707:9;33701:4;33697:20;33692:2;33681:9;33677:18;33670:48;33735:108;33838:4;33829:6;33735:108;:::i;:::-;33727:116;;33216:634;;;;;:::o;33856:210::-;33943:4;33981:2;33970:9;33966:18;33958:26;;33994:65;34056:1;34045:9;34041:17;34032:6;33994:65;:::i;:::-;33856:210;;;;:::o;34072:313::-;34185:4;34223:2;34212:9;34208:18;34200:26;;34272:9;34266:4;34262:20;34258:1;34247:9;34243:17;34236:47;34300:78;34373:4;34364:6;34300:78;:::i;:::-;34292:86;;34072:313;;;;:::o;34391:419::-;34557:4;34595:2;34584:9;34580:18;34572:26;;34644:9;34638:4;34634:20;34630:1;34619:9;34615:17;34608:47;34672:131;34798:4;34672:131;:::i;:::-;34664:139;;34391:419;;;:::o;34816:::-;34982:4;35020:2;35009:9;35005:18;34997:26;;35069:9;35063:4;35059:20;35055:1;35044:9;35040:17;35033:47;35097:131;35223:4;35097:131;:::i;:::-;35089:139;;34816:419;;;:::o;35241:::-;35407:4;35445:2;35434:9;35430:18;35422:26;;35494:9;35488:4;35484:20;35480:1;35469:9;35465:17;35458:47;35522:131;35648:4;35522:131;:::i;:::-;35514:139;;35241:419;;;:::o;35666:::-;35832:4;35870:2;35859:9;35855:18;35847:26;;35919:9;35913:4;35909:20;35905:1;35894:9;35890:17;35883:47;35947:131;36073:4;35947:131;:::i;:::-;35939:139;;35666:419;;;:::o;36091:::-;36257:4;36295:2;36284:9;36280:18;36272:26;;36344:9;36338:4;36334:20;36330:1;36319:9;36315:17;36308:47;36372:131;36498:4;36372:131;:::i;:::-;36364:139;;36091:419;;;:::o;36516:::-;36682:4;36720:2;36709:9;36705:18;36697:26;;36769:9;36763:4;36759:20;36755:1;36744:9;36740:17;36733:47;36797:131;36923:4;36797:131;:::i;:::-;36789:139;;36516:419;;;:::o;36941:::-;37107:4;37145:2;37134:9;37130:18;37122:26;;37194:9;37188:4;37184:20;37180:1;37169:9;37165:17;37158:47;37222:131;37348:4;37222:131;:::i;:::-;37214:139;;36941:419;;;:::o;37366:::-;37532:4;37570:2;37559:9;37555:18;37547:26;;37619:9;37613:4;37609:20;37605:1;37594:9;37590:17;37583:47;37647:131;37773:4;37647:131;:::i;:::-;37639:139;;37366:419;;;:::o;37791:::-;37957:4;37995:2;37984:9;37980:18;37972:26;;38044:9;38038:4;38034:20;38030:1;38019:9;38015:17;38008:47;38072:131;38198:4;38072:131;:::i;:::-;38064:139;;37791:419;;;:::o;38216:::-;38382:4;38420:2;38409:9;38405:18;38397:26;;38469:9;38463:4;38459:20;38455:1;38444:9;38440:17;38433:47;38497:131;38623:4;38497:131;:::i;:::-;38489:139;;38216:419;;;:::o;38641:::-;38807:4;38845:2;38834:9;38830:18;38822:26;;38894:9;38888:4;38884:20;38880:1;38869:9;38865:17;38858:47;38922:131;39048:4;38922:131;:::i;:::-;38914:139;;38641:419;;;:::o;39066:::-;39232:4;39270:2;39259:9;39255:18;39247:26;;39319:9;39313:4;39309:20;39305:1;39294:9;39290:17;39283:47;39347:131;39473:4;39347:131;:::i;:::-;39339:139;;39066:419;;;:::o;39491:::-;39657:4;39695:2;39684:9;39680:18;39672:26;;39744:9;39738:4;39734:20;39730:1;39719:9;39715:17;39708:47;39772:131;39898:4;39772:131;:::i;:::-;39764:139;;39491:419;;;:::o;39916:::-;40082:4;40120:2;40109:9;40105:18;40097:26;;40169:9;40163:4;40159:20;40155:1;40144:9;40140:17;40133:47;40197:131;40323:4;40197:131;:::i;:::-;40189:139;;39916:419;;;:::o;40341:::-;40507:4;40545:2;40534:9;40530:18;40522:26;;40594:9;40588:4;40584:20;40580:1;40569:9;40565:17;40558:47;40622:131;40748:4;40622:131;:::i;:::-;40614:139;;40341:419;;;:::o;40766:::-;40932:4;40970:2;40959:9;40955:18;40947:26;;41019:9;41013:4;41009:20;41005:1;40994:9;40990:17;40983:47;41047:131;41173:4;41047:131;:::i;:::-;41039:139;;40766:419;;;:::o;41191:::-;41357:4;41395:2;41384:9;41380:18;41372:26;;41444:9;41438:4;41434:20;41430:1;41419:9;41415:17;41408:47;41472:131;41598:4;41472:131;:::i;:::-;41464:139;;41191:419;;;:::o;41616:::-;41782:4;41820:2;41809:9;41805:18;41797:26;;41869:9;41863:4;41859:20;41855:1;41844:9;41840:17;41833:47;41897:131;42023:4;41897:131;:::i;:::-;41889:139;;41616:419;;;:::o;42041:::-;42207:4;42245:2;42234:9;42230:18;42222:26;;42294:9;42288:4;42284:20;42280:1;42269:9;42265:17;42258:47;42322:131;42448:4;42322:131;:::i;:::-;42314:139;;42041:419;;;:::o;42466:::-;42632:4;42670:2;42659:9;42655:18;42647:26;;42719:9;42713:4;42709:20;42705:1;42694:9;42690:17;42683:47;42747:131;42873:4;42747:131;:::i;:::-;42739:139;;42466:419;;;:::o;42891:::-;43057:4;43095:2;43084:9;43080:18;43072:26;;43144:9;43138:4;43134:20;43130:1;43119:9;43115:17;43108:47;43172:131;43298:4;43172:131;:::i;:::-;43164:139;;42891:419;;;:::o;43316:::-;43482:4;43520:2;43509:9;43505:18;43497:26;;43569:9;43563:4;43559:20;43555:1;43544:9;43540:17;43533:47;43597:131;43723:4;43597:131;:::i;:::-;43589:139;;43316:419;;;:::o;43741:::-;43907:4;43945:2;43934:9;43930:18;43922:26;;43994:9;43988:4;43984:20;43980:1;43969:9;43965:17;43958:47;44022:131;44148:4;44022:131;:::i;:::-;44014:139;;43741:419;;;:::o;44166:::-;44332:4;44370:2;44359:9;44355:18;44347:26;;44419:9;44413:4;44409:20;44405:1;44394:9;44390:17;44383:47;44447:131;44573:4;44447:131;:::i;:::-;44439:139;;44166:419;;;:::o;44591:222::-;44684:4;44722:2;44711:9;44707:18;44699:26;;44735:71;44803:1;44792:9;44788:17;44779:6;44735:71;:::i;:::-;44591:222;;;;:::o;44819:332::-;44940:4;44978:2;44967:9;44963:18;44955:26;;44991:71;45059:1;45048:9;45044:17;45035:6;44991:71;:::i;:::-;45072:72;45140:2;45129:9;45125:18;45116:6;45072:72;:::i;:::-;44819:332;;;;;:::o;45157:442::-;45306:4;45344:2;45333:9;45329:18;45321:26;;45357:71;45425:1;45414:9;45410:17;45401:6;45357:71;:::i;:::-;45438:72;45506:2;45495:9;45491:18;45482:6;45438:72;:::i;:::-;45520;45588:2;45577:9;45573:18;45564:6;45520:72;:::i;:::-;45157:442;;;;;;:::o;45605:129::-;45639:6;45666:20;;:::i;:::-;45656:30;;45695:33;45723:4;45715:6;45695:33;:::i;:::-;45605:129;;;:::o;45740:75::-;45773:6;45806:2;45800:9;45790:19;;45740:75;:::o;45821:311::-;45898:4;45988:18;45980:6;45977:30;45974:56;;;46010:18;;:::i;:::-;45974:56;46060:4;46052:6;46048:17;46040:25;;46120:4;46114;46110:15;46102:23;;45821:311;;;:::o;46138:::-;46215:4;46305:18;46297:6;46294:30;46291:56;;;46327:18;;:::i;:::-;46291:56;46377:4;46369:6;46365:17;46357:25;;46437:4;46431;46427:15;46419:23;;46138:311;;;:::o;46455:307::-;46516:4;46606:18;46598:6;46595:30;46592:56;;;46628:18;;:::i;:::-;46592:56;46666:29;46688:6;46666:29;:::i;:::-;46658:37;;46750:4;46744;46740:15;46732:23;;46455:307;;;:::o;46768:132::-;46835:4;46858:3;46850:11;;46888:4;46883:3;46879:14;46871:22;;46768:132;;;:::o;46906:::-;46973:4;46996:3;46988:11;;47026:4;47021:3;47017:14;47009:22;;46906:132;;;:::o;47044:114::-;47111:6;47145:5;47139:12;47129:22;;47044:114;;;:::o;47164:::-;47231:6;47265:5;47259:12;47249:22;;47164:114;;;:::o;47284:98::-;47335:6;47369:5;47363:12;47353:22;;47284:98;;;:::o;47388:99::-;47440:6;47474:5;47468:12;47458:22;;47388:99;;;:::o;47493:113::-;47563:4;47595;47590:3;47586:14;47578:22;;47493:113;;;:::o;47612:::-;47682:4;47714;47709:3;47705:14;47697:22;;47612:113;;;:::o;47731:184::-;47830:11;47864:6;47859:3;47852:19;47904:4;47899:3;47895:14;47880:29;;47731:184;;;;:::o;47921:::-;48020:11;48054:6;48049:3;48042:19;48094:4;48089:3;48085:14;48070:29;;47921:184;;;;:::o;48111:168::-;48194:11;48228:6;48223:3;48216:19;48268:4;48263:3;48259:14;48244:29;;48111:168;;;;:::o;48285:169::-;48369:11;48403:6;48398:3;48391:19;48443:4;48438:3;48434:14;48419:29;;48285:169;;;;:::o;48460:305::-;48500:3;48519:20;48537:1;48519:20;:::i;:::-;48514:25;;48553:20;48571:1;48553:20;:::i;:::-;48548:25;;48707:1;48639:66;48635:74;48632:1;48629:81;48626:107;;;48713:18;;:::i;:::-;48626:107;48757:1;48754;48750:9;48743:16;;48460:305;;;;:::o;48771:185::-;48811:1;48828:20;48846:1;48828:20;:::i;:::-;48823:25;;48862:20;48880:1;48862:20;:::i;:::-;48857:25;;48901:1;48891:35;;48906:18;;:::i;:::-;48891:35;48948:1;48945;48941:9;48936:14;;48771:185;;;;:::o;48962:348::-;49002:7;49025:20;49043:1;49025:20;:::i;:::-;49020:25;;49059:20;49077:1;49059:20;:::i;:::-;49054:25;;49247:1;49179:66;49175:74;49172:1;49169:81;49164:1;49157:9;49150:17;49146:105;49143:131;;;49254:18;;:::i;:::-;49143:131;49302:1;49299;49295:9;49284:20;;48962:348;;;;:::o;49316:191::-;49356:4;49376:20;49394:1;49376:20;:::i;:::-;49371:25;;49410:20;49428:1;49410:20;:::i;:::-;49405:25;;49449:1;49446;49443:8;49440:34;;;49454:18;;:::i;:::-;49440:34;49499:1;49496;49492:9;49484:17;;49316:191;;;;:::o;49513:96::-;49550:7;49579:24;49597:5;49579:24;:::i;:::-;49568:35;;49513:96;;;:::o;49615:104::-;49660:7;49689:24;49707:5;49689:24;:::i;:::-;49678:35;;49615:104;;;:::o;49725:90::-;49759:7;49802:5;49795:13;49788:21;49777:32;;49725:90;;;:::o;49821:149::-;49857:7;49897:66;49890:5;49886:78;49875:89;;49821:149;;;:::o;49976:126::-;50013:7;50053:42;50046:5;50042:54;50031:65;;49976:126;;;:::o;50108:77::-;50145:7;50174:5;50163:16;;50108:77;;;:::o;50191:134::-;50249:9;50282:37;50313:5;50282:37;:::i;:::-;50269:50;;50191:134;;;:::o;50331:126::-;50381:9;50414:37;50445:5;50414:37;:::i;:::-;50401:50;;50331:126;;;:::o;50463:113::-;50513:9;50546:24;50564:5;50546:24;:::i;:::-;50533:37;;50463:113;;;:::o;50582:154::-;50666:6;50661:3;50656;50643:30;50728:1;50719:6;50714:3;50710:16;50703:27;50582:154;;;:::o;50742:307::-;50810:1;50820:113;50834:6;50831:1;50828:13;50820:113;;;50919:1;50914:3;50910:11;50904:18;50900:1;50895:3;50891:11;50884:39;50856:2;50853:1;50849:10;50844:15;;50820:113;;;50951:6;50948:1;50945:13;50942:101;;;51031:1;51022:6;51017:3;51013:16;51006:27;50942:101;50791:258;50742:307;;;:::o;51055:320::-;51099:6;51136:1;51130:4;51126:12;51116:22;;51183:1;51177:4;51173:12;51204:18;51194:81;;51260:4;51252:6;51248:17;51238:27;;51194:81;51322:2;51314:6;51311:14;51291:18;51288:38;51285:84;;;51341:18;;:::i;:::-;51285:84;51106:269;51055:320;;;:::o;51381:281::-;51464:27;51486:4;51464:27;:::i;:::-;51456:6;51452:40;51594:6;51582:10;51579:22;51558:18;51546:10;51543:34;51540:62;51537:88;;;51605:18;;:::i;:::-;51537:88;51645:10;51641:2;51634:22;51424:238;51381:281;;:::o;51668:233::-;51707:3;51730:24;51748:5;51730:24;:::i;:::-;51721:33;;51776:66;51769:5;51766:77;51763:103;;;51846:18;;:::i;:::-;51763:103;51893:1;51886:5;51882:13;51875:20;;51668:233;;;:::o;51907:180::-;51955:77;51952:1;51945:88;52052:4;52049:1;52042:15;52076:4;52073:1;52066:15;52093:180;52141:77;52138:1;52131:88;52238:4;52235:1;52228:15;52262:4;52259:1;52252:15;52279:180;52327:77;52324:1;52317:88;52424:4;52421:1;52414:15;52448:4;52445:1;52438:15;52465:180;52513:77;52510:1;52503:88;52610:4;52607:1;52600:15;52634:4;52631:1;52624:15;52651:180;52699:77;52696:1;52689:88;52796:4;52793:1;52786:15;52820:4;52817:1;52810:15;52837:180;52885:77;52882:1;52875:88;52982:4;52979:1;52972:15;53006:4;53003:1;52996:15;53023:183;53058:3;53096:1;53078:16;53075:23;53072:128;;;53134:1;53131;53128;53113:23;53156:34;53187:1;53181:8;53156:34;:::i;:::-;53149:41;;53072:128;53023:183;:::o;53212:117::-;53321:1;53318;53311:12;53335:117;53444:1;53441;53434:12;53458:117;53567:1;53564;53557:12;53581:117;53690:1;53687;53680:12;53704:117;53813:1;53810;53803:12;53827:117;53936:1;53933;53926:12;53950:102;53991:6;54042:2;54038:7;54033:2;54026:5;54022:14;54018:28;54008:38;;53950:102;;;:::o;54058:106::-;54102:8;54151:5;54146:3;54142:15;54121:36;;54058:106;;;:::o;54170:239::-;54310:34;54306:1;54298:6;54294:14;54287:58;54379:22;54374:2;54366:6;54362:15;54355:47;54170:239;:::o;54415:227::-;54555:34;54551:1;54543:6;54539:14;54532:58;54624:10;54619:2;54611:6;54607:15;54600:35;54415:227;:::o;54648:175::-;54788:27;54784:1;54776:6;54772:14;54765:51;54648:175;:::o;54829:174::-;54969:26;54965:1;54957:6;54953:14;54946:50;54829:174;:::o;55009:230::-;55149:34;55145:1;55137:6;55133:14;55126:58;55218:13;55213:2;55205:6;55201:15;55194:38;55009:230;:::o;55245:225::-;55385:34;55381:1;55373:6;55369:14;55362:58;55454:8;55449:2;55441:6;55437:15;55430:33;55245:225;:::o;55476:223::-;55616:34;55612:1;55604:6;55600:14;55593:58;55685:6;55680:2;55672:6;55668:15;55661:31;55476:223;:::o;55705:228::-;55845:34;55841:1;55833:6;55829:14;55822:58;55914:11;55909:2;55901:6;55897:15;55890:36;55705:228;:::o;55939:168::-;56079:20;56075:1;56067:6;56063:14;56056:44;55939:168;:::o;56113:224::-;56253:34;56249:1;56241:6;56237:14;56230:58;56322:7;56317:2;56309:6;56305:15;56298:32;56113:224;:::o;56343:237::-;56483:34;56479:1;56471:6;56467:14;56460:58;56552:20;56547:2;56539:6;56535:15;56528:45;56343:237;:::o;56586:178::-;56726:30;56722:1;56714:6;56710:14;56703:54;56586:178;:::o;56770:171::-;56910:23;56906:1;56898:6;56894:14;56887:47;56770:171;:::o;56947:230::-;57087:34;57083:1;57075:6;57071:14;57064:58;57156:13;57151:2;57143:6;57139:15;57132:38;56947:230;:::o;57183:222::-;57323:34;57319:1;57311:6;57307:14;57300:58;57392:5;57387:2;57379:6;57375:15;57368:30;57183:222;:::o;57411:229::-;57551:34;57547:1;57539:6;57535:14;57528:58;57620:12;57615:2;57607:6;57603:15;57596:37;57411:229;:::o;57646:182::-;57786:34;57782:1;57774:6;57770:14;57763:58;57646:182;:::o;57834:223::-;57974:34;57970:1;57962:6;57958:14;57951:58;58043:6;58038:2;58030:6;58026:15;58019:31;57834:223;:::o;58063:171::-;58203:23;58199:1;58191:6;58187:14;58180:47;58063:171;:::o;58240:228::-;58380:34;58376:1;58368:6;58364:14;58357:58;58449:11;58444:2;58436:6;58432:15;58425:36;58240:228;:::o;58474:::-;58614:34;58610:1;58602:6;58598:14;58591:58;58683:11;58678:2;58670:6;58666:15;58659:36;58474:228;:::o;58708:227::-;58848:34;58844:1;58836:6;58832:14;58825:58;58917:10;58912:2;58904:6;58900:15;58893:35;58708:227;:::o;58941:220::-;59081:34;59077:1;59069:6;59065:14;59058:58;59150:3;59145:2;59137:6;59133:15;59126:28;58941:220;:::o;59167:226::-;59307:34;59303:1;59295:6;59291:14;59284:58;59376:9;59371:2;59363:6;59359:15;59352:34;59167:226;:::o;59399:711::-;59438:3;59476:4;59458:16;59455:26;59452:39;;;59484:5;;59452:39;59513:20;;:::i;:::-;59588:1;59570:16;59566:24;59563:1;59557:4;59542:49;59621:4;59615:11;59720:16;59713:4;59705:6;59701:17;59698:39;59665:18;59657:6;59654:30;59638:113;59635:146;;;59766:5;;;;59635:146;59812:6;59806:4;59802:17;59848:3;59842:10;59875:18;59867:6;59864:30;59861:43;;;59897:5;;;;;;59861:43;59945:6;59938:4;59933:3;59929:14;59925:27;60004:1;59986:16;59982:24;59976:4;59972:35;59967:3;59964:44;59961:57;;;60011:5;;;;;;;59961:57;60028;60076:6;60070:4;60066:17;60058:6;60054:30;60048:4;60028:57;:::i;:::-;60101:3;60094:10;;59442:668;;;;;59399:711;;:::o;60116:122::-;60189:24;60207:5;60189:24;:::i;:::-;60182:5;60179:35;60169:63;;60228:1;60225;60218:12;60169:63;60116:122;:::o;60244:138::-;60325:32;60351:5;60325:32;:::i;:::-;60318:5;60315:43;60305:71;;60372:1;60369;60362:12;60305:71;60244:138;:::o;60388:116::-;60458:21;60473:5;60458:21;:::i;:::-;60451:5;60448:32;60438:60;;60494:1;60491;60484:12;60438:60;60388:116;:::o;60510:120::-;60582:23;60599:5;60582:23;:::i;:::-;60575:5;60572:34;60562:62;;60620:1;60617;60610:12;60562:62;60510:120;:::o;60636:122::-;60709:24;60727:5;60709:24;:::i;:::-;60702:5;60699:35;60689:63;;60748:1;60745;60738:12;60689:63;60636:122;:::o

Swarm Source

ipfs://5b1356f9806ff9e6a19ba2a062d71f318b1130ee32427dce9c3b06434aa6b479
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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