ETH Price: $3,276.46 (-10.92%)

Token

Breathe (Breathe)
 

Overview

Max Total Supply

209 Breathe

Holders

89

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
3 Breathe
0x75b772f2bb4f47fbb31b14d6e034b81cb0a03730
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:
Breathe

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-12-04
*/

pragma solidity ^0.8.0;

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

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

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

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

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

}

// File: http://github.com/OpenZeppelin/openzeppelin-contracts/contracts/utils/EnumerableMap.sol




pragma solidity ^0.8.0;

/**
 * @dev Library for managing an enumerable variant of Solidity's
 * https://solidity.readthedocs.io/en/latest/types.html#mapping-types[`mapping`]
 * type.
 *
 * Maps have the following properties:
 *
 * - Entries are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Entries are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableMap for EnumerableMap.UintToAddressMap;
 *
 *     // Declare a set state variable
 *     EnumerableMap.UintToAddressMap private myMap;
 * }
 * ```
 *
 * As of v3.0.0, only maps of type `uint256 -> address` (`UintToAddressMap`) are
 * supported.
 */
library EnumerableMap {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Map type with
    // bytes32 keys and values.
    // The Map implementation uses private functions, and user-facing
    // implementations (such as Uint256ToAddressMap) are just wrappers around
    // the underlying Map.
    // This means that we can only create new EnumerableMaps for types that fit
    // in bytes32.

    struct MapEntry {
        bytes32 _key;
        bytes32 _value;
    }

    struct Map {
        // Storage of map keys and values
        MapEntry[] _entries;

        // Position of the entry defined by a key in the `entries` array, plus 1
        // because index 0 means a key is not in the map.
        mapping (bytes32 => uint256) _indexes;
    }

    /**
     * @dev Adds a key-value pair to a map, or updates the value for an existing
     * key. O(1).
     *
     * Returns true if the key was added to the map, that is if it was not
     * already present.
     */
    function _set(Map storage map, bytes32 key, bytes32 value) private returns (bool) {
        // We read and store the key's index to prevent multiple reads from the same storage slot
        uint256 keyIndex = map._indexes[key];

        if (keyIndex == 0) { // Equivalent to !contains(map, key)
            map._entries.push(MapEntry({ _key: key, _value: value }));
            // The entry is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            map._indexes[key] = map._entries.length;
            return true;
        } else {
            map._entries[keyIndex - 1]._value = value;
            return false;
        }
    }

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

        if (keyIndex != 0) { // Equivalent to contains(map, key)
            // To delete a key-value pair from the _entries array in O(1), we swap the entry to delete with the last one
            // in the array, and then remove the last entry (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = keyIndex - 1;
            uint256 lastIndex = map._entries.length - 1;

            // When the entry to delete is the last one, the swap operation is unnecessary. However, since this occurs
            // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.

            MapEntry storage lastEntry = map._entries[lastIndex];

            // Move the last entry to the index where the entry to delete is
            map._entries[toDeleteIndex] = lastEntry;
            // Update the index for the moved entry
            map._indexes[lastEntry._key] = toDeleteIndex + 1; // All indexes are 1-based

            // Delete the slot where the moved entry was stored
            map._entries.pop();

            // Delete the index for the deleted slot
            delete map._indexes[key];

            return true;
        } else {
            return false;
        }
    }

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

    /**
     * @dev Returns the number of key-value pairs in the map. O(1).
     */
    function _length(Map storage map) private view returns (uint256) {
        return map._entries.length;
    }

   /**
    * @dev Returns the key-value pair stored at position `index` in the map. O(1).
    *
    * Note that there are no guarantees on the ordering of entries inside the
    * array, and it may change when more entries are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function _at(Map storage map, uint256 index) private view returns (bytes32, bytes32) {
        require(map._entries.length > index, "EnumerableMap: index out of bounds");

        MapEntry storage entry = map._entries[index];
        return (entry._key, entry._value);
    }

    /**
     * @dev Tries to returns the value associated with `key`.  O(1).
     * Does not revert if `key` is not in the map.
     */
    function _tryGet(Map storage map, bytes32 key) private view returns (bool, bytes32) {
        uint256 keyIndex = map._indexes[key];
        if (keyIndex == 0) return (false, 0); // Equivalent to contains(map, key)
        return (true, map._entries[keyIndex - 1]._value); // All indexes are 1-based
    }

    /**
     * @dev Returns the value associated with `key`.  O(1).
     *
     * Requirements:
     *
     * - `key` must be in the map.
     */
    function _get(Map storage map, bytes32 key) private view returns (bytes32) {
        uint256 keyIndex = map._indexes[key];
        require(keyIndex != 0, "EnumerableMap: nonexistent key"); // Equivalent to contains(map, key)
        return map._entries[keyIndex - 1]._value; // All indexes are 1-based
    }

    /**
     * @dev Same as {_get}, with a custom error message when `key` is not in the map.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {_tryGet}.
     */
    function _get(Map storage map, bytes32 key, string memory errorMessage) private view returns (bytes32) {
        uint256 keyIndex = map._indexes[key];
        require(keyIndex != 0, errorMessage); // Equivalent to contains(map, key)
        return map._entries[keyIndex - 1]._value; // All indexes are 1-based
    }

    // UintToAddressMap

    struct UintToAddressMap {
        Map _inner;
    }

    /**
     * @dev Adds a key-value pair to a map, or updates the value for an existing
     * key. O(1).
     *
     * Returns true if the key was added to the map, that is if it was not
     * already present.
     */
    function set(UintToAddressMap storage map, uint256 key, address value) internal returns (bool) {
        return _set(map._inner, bytes32(key), bytes32(uint256(uint160(value))));
    }

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

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

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

   /**
    * @dev Returns the element 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(UintToAddressMap storage map, uint256 index) internal view returns (uint256, address) {
        (bytes32 key, bytes32 value) = _at(map._inner, index);
        return (uint256(key), address(uint160(uint256(value))));
    }

    /**
     * @dev Tries to returns the value associated with `key`.  O(1).
     * Does not revert if `key` is not in the map.
     *
     * _Available since v3.4._
     */
    function tryGet(UintToAddressMap storage map, uint256 key) internal view returns (bool, address) {
        (bool success, bytes32 value) = _tryGet(map._inner, bytes32(key));
        return (success, address(uint160(uint256(value))));
    }

    /**
     * @dev Returns the value associated with `key`.  O(1).
     *
     * Requirements:
     *
     * - `key` must be in the map.
     */
    function get(UintToAddressMap storage map, uint256 key) internal view returns (address) {
        return address(uint160(uint256(_get(map._inner, bytes32(key)))));
    }

    /**
     * @dev Same as {get}, with a custom error message when `key` is not in the map.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryGet}.
     */
    function get(UintToAddressMap storage map, uint256 key, string memory errorMessage) internal view returns (address) {
        return address(uint160(uint256(_get(map._inner, bytes32(key), errorMessage))));
    }
}

// File: http://github.com/OpenZeppelin/openzeppelin-contracts/contracts/utils/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;

            // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs
            // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.

            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] = toDeleteIndex + 1; // All indexes are 1-based

            // 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) {
        require(set._values.length > index, "EnumerableSet: index out of bounds");
        return set._values[index];
    }

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

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


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

// File: http://github.com/OpenZeppelin/openzeppelin-contracts/contracts/utils/Address.sol




pragma solidity ^0.8.0;

/**
 * @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
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 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");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private 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

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: http://github.com/OpenZeppelin/openzeppelin-contracts/contracts/introspection/ERC165.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: http://github.com/OpenZeppelin/openzeppelin-contracts/contracts/token/ERC721/IERC721.sol


pragma solidity ^0.8.0;


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts may inherit from this and call {_registerInterface} to declare
 * their support of an interface.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev Mapping of interface ids to whether or not it's supported.
     */
    mapping(bytes4 => bool) private _supportedInterfaces;

    constructor () {
        // Derived contracts need only register support for their own interfaces,
        // we register support for ERC165 itself here
        _registerInterface(type(IERC165).interfaceId);
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     *
     * Time complexity O(1), guaranteed to always use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return _supportedInterfaces[interfaceId];
    }

    /**
     * @dev Registers the contract as an implementer of the interface defined by
     * `interfaceId`. Support of the actual ERC165 interface is automatic and
     * registering its interface id is not required.
     *
     * See {IERC165-supportsInterface}.
     *
     * Requirements:
     *
     * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`).
     */
    function _registerInterface(bytes4 interfaceId) internal virtual {
        require(interfaceId != 0xffffffff, "ERC165: invalid interface id");
        _supportedInterfaces[interfaceId] = true;
    }
}

// File: http://github.com/OpenZeppelin/openzeppelin-contracts/contracts/token/ERC721/IERC721Receiver.sol




pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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


pragma solidity ^0.8.0;

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

// File: http://github.com/OpenZeppelin/openzeppelin-contracts/contracts/token/ERC721/IERC721Enumerable.sol




pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

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

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

// File: http://github.com/OpenZeppelin/openzeppelin-contracts/contracts/token/ERC721/IERC721Metadata.sol




pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {

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

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

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

// File: http://github.com/OpenZeppelin/openzeppelin-contracts/contracts/introspection/IERC165.sol



// File: http://github.com/OpenZeppelin/openzeppelin-contracts/contracts/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 GSN 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) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}



// File: http://github.com/OpenZeppelin/openzeppelin-contracts/contracts/token/ERC721/ERC721.sol




pragma solidity ^0.8.0;











/**
 * @title ERC721 Non-Fungible Token Standard basic implementation
 * @dev see https://eips.ethereum.org/EIPS/eip-721
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable {
    using Address for address;
    using EnumerableSet for EnumerableSet.UintSet;
    using EnumerableMap for EnumerableMap.UintToAddressMap;
    using Strings for uint256;
    
    // Mapping from holder address to their (enumerable) set of owned tokens
    mapping (address => EnumerableSet.UintSet) private _holderTokens;

    
    // Enumerable mapping from token ids to their owners
    EnumerableMap.UintToAddressMap private _tokenOwners;

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

    // Base URI
    string private _baseURI;

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

        // register the supported interfaces to conform to ERC721 via ERC165
        _registerInterface(type(IERC721).interfaceId);
        _registerInterface(type(IERC721Metadata).interfaceId);
        _registerInterface(type(IERC721Enumerable).interfaceId);
    }

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

    
 
    
    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        return _tokenOwners.get(tokenId, "ERC721: owner query for nonexistent token");
    }

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

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

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

        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = baseURI();

        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }
        // If there is a baseURI but no tokenURI, concatenate the tokenID to the baseURI.
        return string(abi.encodePacked(base, tokenId.toString()));
    }

    /**
    * @dev Returns the base URI set via {_setBaseURI}. This will be
    * automatically added as a prefix in {tokenURI} to each token's URI, or
    * to the token ID if no specific URI is set for that token ID.
    */
    function baseURI() public view virtual returns (string memory) {
        return _baseURI;
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        return _holderTokens[owner].at(index);
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        // _tokenOwners are indexed by tokenIds, so .length() returns the number of tokenIds
        return _tokenOwners.length();
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        (uint256 tokenId, ) = _tokenOwners.at(index);
        return tokenId;
    }

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

        _holderTokens[to].add(tokenId);

        _tokenOwners.set(tokenId, to);

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

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

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

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

        // Clear metadata (if any)
        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }

        _holderTokens[owner].remove(tokenId);

        _tokenOwners.remove(tokenId);

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

        _holderTokens[from].remove(tokenId);
        _holderTokens[to].add(tokenId);

        _tokenOwners.set(tokenId, to);
        emit Transfer(from, to, tokenId);
    }

    /**
     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721Metadata: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }

    /**
     * @dev Internal function to set the base URI for all token IDs. It is
     * automatically added as a prefix to the value returned in {tokenURI},
     * or to the token ID if {tokenURI} is empty.
     */
    function _setBaseURI(string memory baseURI_) internal virtual {
        _baseURI = baseURI_;
    }

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

    function _approve(address to, uint256 tokenId) private {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId); // internal owner
    }

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



// File: http://github.com/OpenZeppelin/openzeppelin-contracts/contracts/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 () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), 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 {
        emit OwnershipTransferred(_owner, address(0));
        _owner = 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");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

//  ___              _   _
// | _ )_ _ ___ __ _| |_| |_  ___ 
// | _ \ '_/ -_) _` |  _| ' \/ -_)
// |___/_| \___\__,_|\__|_||_\___|


pragma solidity ^0.8.0;


// SPDX-License-Identifier: MIT

contract Breathe is ERC721, Ownable {
    using Strings for uint256;
    uint public constant MAX_TOKENS = 1024;
    string public script;
    string public scriptType = "p5js";
    bool public claimStarted = false;
    bool public claimLocked = false;
    mapping (uint256 => uint256) public creationDates;
    mapping (uint256 => uint256) public wocClaimed;
    address public constant WOC_ADDRESS = 0xF65d8F4A5C7956F40BE2EAE8171d62a6C97FAB9C;

    constructor() ERC721("Breathe","Breathe")  {
        setBaseURI("https://api.chromorphs.xyz/breathe/json/");
    }
    
    function tokensClaimed() external view returns(uint256[] memory) {
        uint256[] memory ret = new uint256[](MAX_TOKENS);
        for (uint i = 0; i < MAX_TOKENS; i++) {
            ret[i] = wocClaimed[i];
        }
        return ret;
    }
    
    function tokensOfOwner(address _owner) external view returns(uint256[] memory ) {
        uint256 tokenCount = balanceOf(_owner);
        if (tokenCount == 0) {
            return new uint256[](0);
        } else {
            uint256[] memory result = new uint256[](tokenCount);
            uint256 index;
            for (index = 0; index < tokenCount; index++) {
                result[index] = tokenOfOwnerByIndex(_owner, index);
            }
            return result;
        }
    }
    
    function tokensOfOwnerWOC(address _owner) public view returns(uint256[] memory ) {
        uint256 tokenCount = IERC721(WOC_ADDRESS).balanceOf(_owner);
        if (tokenCount == 0) {
            return new uint256[](0);
        } else {
            uint256[] memory result = new uint256[](tokenCount);
            uint256 index;
            for (index = 0; index < tokenCount; index++) {
                result[index] = IERC721Enumerable(WOC_ADDRESS).tokenOfOwnerByIndex(_owner, index);
            }
            return result;
        }
    }
    
    function claimMultiple(uint256[] memory tokenIDs) public {
        require(claimStarted, "Claim is not possible now.");
        require(!claimLocked, "Claim is forever locked.");
        require(tokenIDs.length <= 20, "Cannot claim more than 20 at a time");
        require(totalSupply() + tokenIDs.length <= MAX_TOKENS, "Exceeds MAX_TOKENS");
        for (uint256 i = 0; i < tokenIDs.length; i++) {
            require(wocClaimed[tokenIDs[i]] == 0, "Already claimed this WOC");
            require(IERC721(WOC_ADDRESS).ownerOf(tokenIDs[i]) == msg.sender, "Not the owner of this WOC");
            _safeMint(msg.sender, tokenIDs[i]);
            wocClaimed[tokenIDs[i]] = 1;
            creationDates[tokenIDs[i]] = block.number;
        }
    }
    
    function lockClaim() public onlyOwner {
        claimLocked = true;
    }
    
    function setScript(string memory _script) public onlyOwner {
        script = _script;
    }
    
    function setScriptType(string memory _scriptType) public onlyOwner {
        script = _scriptType;
    }
    
    function setBaseURI(string memory baseURI) public onlyOwner {
        _setBaseURI(baseURI);
    }
    
    function flipClaimState() public onlyOwner {
        claimStarted = !claimStarted;
    }
    
    function tokenHash(uint256 tokenId) public view returns(bytes32){
        require(_exists(tokenId), "DOES NOT EXIST");
        return bytes32(keccak256(abi.encodePacked(address(this), creationDates[tokenId], tokenId)));
    }
    
    function withdraw() public payable onlyOwner {
        uint256 balance = address(this).balance;
        payable(msg.sender).transfer(balance);
    }
  
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WOC_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIDs","type":"uint256[]"}],"name":"claimMultiple","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"creationDates","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipClaimState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"script","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"scriptType","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_script","type":"string"}],"name":"setScript","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_scriptType","type":"string"}],"name":"setScriptType","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensClaimed","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwnerWOC","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"wocClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

60806040526040518060400160405280600481526020017f70356a7300000000000000000000000000000000000000000000000000000000815250600c908051906020019062000051929190620004a4565b506000600d60006101000a81548160ff0219169083151502179055506000600d60016101000a81548160ff0219169083151502179055503480156200009557600080fd5b506040518060400160405280600781526020017f42726561746865000000000000000000000000000000000000000000000000008152506040518060400160405280600781526020017f4272656174686500000000000000000000000000000000000000000000000000815250620001337f01ffc9a700000000000000000000000000000000000000000000000000000000620002db60201b60201c565b81600690805190602001906200014b929190620004a4565b50806007908051906020019062000164929190620004a4565b50620001967f80ac58cd00000000000000000000000000000000000000000000000000000000620002db60201b60201c565b620001c77f5b5e139f00000000000000000000000000000000000000000000000000000000620002db60201b60201c565b620001f87f780e9d6300000000000000000000000000000000000000000000000000000000620002db60201b60201c565b505060006200020c620003b360201b60201c565b905080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350620002d5604051806060016040528060288152602001620054ef60289139620003bb60201b60201c565b62000692565b63ffffffff60e01b817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141562000347576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200033e90620005d8565b60405180910390fd5b6001600080837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600033905090565b620003cb620003b360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620003f16200045e60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200044a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200044190620005fa565b60405180910390fd5b6200045b816200048860201b60201c565b50565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8060099080519060200190620004a0929190620004a4565b5050565b828054620004b2906200062d565b90600052602060002090601f016020900481019282620004d6576000855562000522565b82601f10620004f157805160ff191683800117855562000522565b8280016001018555821562000522579182015b828111156200052157825182559160200191906001019062000504565b5b50905062000531919062000535565b5090565b5b808211156200055057600081600090555060010162000536565b5090565b600062000563601c836200061c565b91507f4552433136353a20696e76616c696420696e74657266616365206964000000006000830152602082019050919050565b6000620005a56020836200061c565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006020820190508181036000830152620005f38162000554565b9050919050565b60006020820190508181036000830152620006158162000596565b9050919050565b600082825260208201905092915050565b600060028204905060018216806200064657607f821691505b602082108114156200065d576200065c62000663565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b614e4d80620006a26000396000f3fe6080604052600436106102305760003560e01c8063715018a61161012e578063b85554ac116100ab578063d423d6081161006f578063d423d60814610854578063e985e9c51461087f578063ebe9eb9f146108bc578063f2fde38b146108e7578063f47c84c51461091057610230565b8063b85554ac14610749578063b88d4fde14610786578063c1664b13146107af578063c87b56dd146107da578063c8a012261461081757610230565b806395d89b41116100f257806395d89b41146106625780639a0626641461068d578063a22cb465146106b8578063a3864397146106e1578063b44df72d1461071e57610230565b8063715018a61461059157806378a4ab85146105a85780638462151c146105d15780638da5cb5b1461060e5780639051cce91461063957610230565b806342842e0e116101bc57806367deb5cf1161018057806367deb5cf146104be57806369d8a608146104fb5780636c0360eb146105125780636d60e6c11461053d57806370a082311461055457610230565b806342842e0e146103c75780634f6ccce7146103f057806355f804b31461042d5780635d69dbdd146104565780636352211e1461048157610230565b8063171ce09411610203578063171ce0941461030357806318160ddd1461032c57806323b872dd146103575780632f745c59146103805780633ccfd60b146103bd57610230565b806301ffc9a71461023557806306fdde0314610272578063081812fc1461029d578063095ea7b3146102da575b600080fd5b34801561024157600080fd5b5061025c60048036038101906102579190613a19565b61093b565b60405161026991906145b7565b60405180910390f35b34801561027e57600080fd5b506102876109a2565b60405161029491906145ed565b60405180910390f35b3480156102a957600080fd5b506102c460048036038101906102bf9190613aac565b610a34565b6040516102d19190614505565b60405180910390f35b3480156102e657600080fd5b5061030160048036038101906102fc919061399c565b610ab9565b005b34801561030f57600080fd5b5061032a60048036038101906103259190613a6b565b610bd1565b005b34801561033857600080fd5b50610341610c67565b60405161034e919061490f565b60405180910390f35b34801561036357600080fd5b5061037e60048036038101906103799190613896565b610c78565b005b34801561038c57600080fd5b506103a760048036038101906103a2919061399c565b610cd8565b6040516103b4919061490f565b60405180910390f35b6103c5610d33565b005b3480156103d357600080fd5b506103ee60048036038101906103e99190613896565b610dfe565b005b3480156103fc57600080fd5b5061041760048036038101906104129190613aac565b610e1e565b604051610424919061490f565b60405180910390f35b34801561043957600080fd5b50610454600480360381019061044f9190613a6b565b610e41565b005b34801561046257600080fd5b5061046b610ec9565b60405161047891906145ed565b60405180910390f35b34801561048d57600080fd5b506104a860048036038101906104a39190613aac565b610f57565b6040516104b59190614505565b60405180910390f35b3480156104ca57600080fd5b506104e560048036038101906104e09190613808565b610f8e565b6040516104f29190614595565b60405180910390f35b34801561050757600080fd5b50610510611233565b005b34801561051e57600080fd5b506105276112cc565b60405161053491906145ed565b60405180910390f35b34801561054957600080fd5b5061055261135e565b005b34801561056057600080fd5b5061057b60048036038101906105769190613808565b611406565b604051610588919061490f565b60405180910390f35b34801561059d57600080fd5b506105a66114c5565b005b3480156105b457600080fd5b506105cf60048036038101906105ca9190613a6b565b611602565b005b3480156105dd57600080fd5b506105f860048036038101906105f39190613808565b611698565b6040516106059190614595565b60405180910390f35b34801561061a57600080fd5b50610623611814565b6040516106309190614505565b60405180910390f35b34801561064557600080fd5b50610660600480360381019061065b91906139d8565b61183e565b005b34801561066e57600080fd5b50610677611c78565b60405161068491906145ed565b60405180910390f35b34801561069957600080fd5b506106a2611d0a565b6040516106af9190614505565b60405180910390f35b3480156106c457600080fd5b506106df60048036038101906106da9190613960565b611d22565b005b3480156106ed57600080fd5b5061070860048036038101906107039190613aac565b611ea3565b60405161071591906145d2565b60405180910390f35b34801561072a57600080fd5b50610733611f32565b6040516107409190614595565b60405180910390f35b34801561075557600080fd5b50610770600480360381019061076b9190613aac565b61202a565b60405161077d919061490f565b60405180910390f35b34801561079257600080fd5b506107ad60048036038101906107a891906138e5565b612042565b005b3480156107bb57600080fd5b506107c46120a4565b6040516107d191906145b7565b60405180910390f35b3480156107e657600080fd5b5061080160048036038101906107fc9190613aac565b6120b7565b60405161080e91906145ed565b60405180910390f35b34801561082357600080fd5b5061083e60048036038101906108399190613aac565b61222a565b60405161084b919061490f565b60405180910390f35b34801561086057600080fd5b50610869612242565b60405161087691906145b7565b60405180910390f35b34801561088b57600080fd5b506108a660048036038101906108a1919061385a565b612255565b6040516108b391906145b7565b60405180910390f35b3480156108c857600080fd5b506108d16122e9565b6040516108de91906145ed565b60405180910390f35b3480156108f357600080fd5b5061090e60048036038101906109099190613808565b612377565b005b34801561091c57600080fd5b50610925612523565b604051610932919061490f565b60405180910390f35b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b6060600680546109b190614bde565b80601f01602080910402602001604051908101604052809291908181526020018280546109dd90614bde565b8015610a2a5780601f106109ff57610100808354040283529160200191610a2a565b820191906000526020600020905b815481529060010190602001808311610a0d57829003601f168201915b5050505050905090565b6000610a3f82612529565b610a7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a75906147cf565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ac482610f57565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2c9061484f565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b54612546565b73ffffffffffffffffffffffffffffffffffffffff161480610b835750610b8281610b7d612546565b612255565b5b610bc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb99061472f565b60405180910390fd5b610bcc838361254e565b505050565b610bd9612546565b73ffffffffffffffffffffffffffffffffffffffff16610bf7611814565b73ffffffffffffffffffffffffffffffffffffffff1614610c4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c44906147ef565b60405180910390fd5b80600b9080519060200190610c6392919061356c565b5050565b6000610c736002612607565b905090565b610c89610c83612546565b8261261c565b610cc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbf9061486f565b60405180910390fd5b610cd38383836126fa565b505050565b6000610d2b82600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061291190919063ffffffff16565b905092915050565b610d3b612546565b73ffffffffffffffffffffffffffffffffffffffff16610d59611814565b73ffffffffffffffffffffffffffffffffffffffff1614610daf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da6906147ef565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610dfa573d6000803e3d6000fd5b5050565b610e1983838360405180602001604052806000815250612042565b505050565b600080610e3583600261292b90919063ffffffff16565b50905080915050919050565b610e49612546565b73ffffffffffffffffffffffffffffffffffffffff16610e67611814565b73ffffffffffffffffffffffffffffffffffffffff1614610ebd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb4906147ef565b60405180910390fd5b610ec681612957565b50565b600c8054610ed690614bde565b80601f0160208091040260200160405190810160405280929190818152602001828054610f0290614bde565b8015610f4f5780601f10610f2457610100808354040283529160200191610f4f565b820191906000526020600020905b815481529060010190602001808311610f3257829003601f168201915b505050505081565b6000610f8782604051806060016040528060298152602001614def6029913960026129719092919063ffffffff16565b9050919050565b6060600073f65d8f4a5c7956f40be2eae8171d62a6c97fab9c73ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b8152600401610fdf9190614505565b60206040518083038186803b158015610ff757600080fd5b505afa15801561100b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061102f9190613ad5565b905060008114156110b257600067ffffffffffffffff81111561107b577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156110a95781602001602082028036833780820191505090505b5091505061122e565b60008167ffffffffffffffff8111156110f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156111225781602001602082028036833780820191505090505b50905060005b828110156112275773f65d8f4a5c7956f40be2eae8171d62a6c97fab9c73ffffffffffffffffffffffffffffffffffffffff16632f745c5986836040518363ffffffff1660e01b815260040161117f92919061456c565b60206040518083038186803b15801561119757600080fd5b505afa1580156111ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111cf9190613ad5565b828281518110611208577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018181525050808061121f90614c10565b915050611128565b8193505050505b919050565b61123b612546565b73ffffffffffffffffffffffffffffffffffffffff16611259611814565b73ffffffffffffffffffffffffffffffffffffffff16146112af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a6906147ef565b60405180910390fd5b6001600d60016101000a81548160ff021916908315150217905550565b6060600980546112db90614bde565b80601f016020809104026020016040519081016040528092919081815260200182805461130790614bde565b80156113545780601f1061132957610100808354040283529160200191611354565b820191906000526020600020905b81548152906001019060200180831161133757829003601f168201915b5050505050905090565b611366612546565b73ffffffffffffffffffffffffffffffffffffffff16611384611814565b73ffffffffffffffffffffffffffffffffffffffff16146113da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d1906147ef565b60405180910390fd5b600d60009054906101000a900460ff1615600d60006101000a81548160ff021916908315150217905550565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611477576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146e9061474f565b60405180910390fd5b6114be600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612990565b9050919050565b6114cd612546565b73ffffffffffffffffffffffffffffffffffffffff166114eb611814565b73ffffffffffffffffffffffffffffffffffffffff1614611541576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611538906147ef565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b61160a612546565b73ffffffffffffffffffffffffffffffffffffffff16611628611814565b73ffffffffffffffffffffffffffffffffffffffff161461167e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611675906147ef565b60405180910390fd5b80600b908051906020019061169492919061356c565b5050565b606060006116a583611406565b9050600081141561172857600067ffffffffffffffff8111156116f1577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405190808252806020026020018201604052801561171f5781602001602082028036833780820191505090505b5091505061180f565b60008167ffffffffffffffff81111561176a577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156117985781602001602082028036833780820191505090505b50905060005b82811015611808576117b08582610cd8565b8282815181106117e9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018181525050808061180090614c10565b91505061179e565b8193505050505b919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600d60009054906101000a900460ff1661188d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118849061476f565b60405180910390fd5b600d60019054906101000a900460ff16156118dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d4906148ef565b60405180910390fd5b601481511115611922576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119199061488f565b60405180910390fd5b610400815161192f610c67565b6119399190614a63565b111561197a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611971906148cf565b60405180910390fd5b60005b8151811015611c74576000600f60008484815181106119c5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015181526020019081526020016000205414611a1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a13906146cf565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff1673f65d8f4a5c7956f40be2eae8171d62a6c97fab9c73ffffffffffffffffffffffffffffffffffffffff16636352211e848481518110611a9c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b8152600401611ac0919061490f565b60206040518083038186803b158015611ad857600080fd5b505afa158015611aec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b109190613831565b73ffffffffffffffffffffffffffffffffffffffff1614611b66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5d906146ef565b60405180910390fd5b611bb033838381518110611ba3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516129a5565b6001600f6000848481518110611bef577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015181526020019081526020016000208190555043600e6000848481518110611c47577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101518152602001908152602001600020819055508080611c6c90614c10565b91505061197d565b5050565b606060078054611c8790614bde565b80601f0160208091040260200160405190810160405280929190818152602001828054611cb390614bde565b8015611d005780601f10611cd557610100808354040283529160200191611d00565b820191906000526020600020905b815481529060010190602001808311611ce357829003601f168201915b5050505050905090565b73f65d8f4a5c7956f40be2eae8171d62a6c97fab9c81565b611d2a612546565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8f906146af565b60405180910390fd5b8060056000611da5612546565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611e52612546565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611e9791906145b7565b60405180910390a35050565b6000611eae82612529565b611eed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee4906148af565b60405180910390fd5b30600e60008481526020019081526020016000205483604051602001611f15939291906144a4565b604051602081830303815290604052805190602001209050919050565b6060600061040067ffffffffffffffff811115611f78577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015611fa65781602001602082028036833780820191505090505b50905060005b61040081101561202257600f600082815260200190815260200160002054828281518110612003577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018181525050808061201a90614c10565b915050611fac565b508091505090565b600f6020528060005260406000206000915090505481565b61205361204d612546565b8361261c565b612092576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120899061486f565b60405180910390fd5b61209e848484846129c3565b50505050565b600d60009054906101000a900460ff1681565b60606120c282612529565b612101576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f89061482f565b60405180910390fd5b600060086000848152602001908152602001600020805461212190614bde565b80601f016020809104026020016040519081016040528092919081815260200182805461214d90614bde565b801561219a5780601f1061216f5761010080835404028352916020019161219a565b820191906000526020600020905b81548152906001019060200180831161217d57829003601f168201915b5050505050905060006121ab6112cc565b90506000815114156121c1578192505050612225565b6000825111156121f65780826040516020016121de9291906144e1565b60405160208183030381529060405292505050612225565b8061220085612a1f565b6040516020016122119291906144e1565b604051602081830303815290604052925050505b919050565b600e6020528060005260406000206000915090505481565b600d60019054906101000a900460ff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600b80546122f690614bde565b80601f016020809104026020016040519081016040528092919081815260200182805461232290614bde565b801561236f5780601f106123445761010080835404028352916020019161236f565b820191906000526020600020905b81548152906001019060200180831161235257829003601f168201915b505050505081565b61237f612546565b73ffffffffffffffffffffffffffffffffffffffff1661239d611814565b73ffffffffffffffffffffffffffffffffffffffff16146123f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ea906147ef565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612463576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245a9061464f565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61040081565b600061253f826002612bcc90919063ffffffff16565b9050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166125c183610f57565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061261582600001612be6565b9050919050565b600061262782612529565b612666576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265d9061470f565b60405180910390fd5b600061267183610f57565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806126e057508373ffffffffffffffffffffffffffffffffffffffff166126c884610a34565b73ffffffffffffffffffffffffffffffffffffffff16145b806126f157506126f08185612255565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661271a82610f57565b73ffffffffffffffffffffffffffffffffffffffff1614612770576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127679061480f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127d79061468f565b60405180910390fd5b6127eb838383612bf7565b6127f660008261254e565b61284781600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612bfc90919063ffffffff16565b5061289981600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612c1690919063ffffffff16565b506128b081836002612c309092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60006129208360000183612c65565b60001c905092915050565b60008060008061293e8660000186612cff565b915091508160001c8160001c9350935050509250929050565b806009908051906020019061296d92919061356c565b5050565b6000612984846000018460001b84612daf565b60001c90509392505050565b600061299e82600001612e76565b9050919050565b6129bf828260405180602001604052806000815250612e87565b5050565b6129ce8484846126fa565b6129da84848484612ee2565b612a19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a109061462f565b60405180910390fd5b50505050565b60606000821415612a67576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612bc7565b600082905060005b60008214612a99578080612a8290614c10565b915050600a82612a929190614ab9565b9150612a6f565b60008167ffffffffffffffff811115612adb577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612b0d5781602001600182028036833780820191505090505b5090505b60008514612bc057600182612b269190614aea565b9150600a85612b359190614c87565b6030612b419190614a63565b60f81b818381518110612b7d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612bb99190614ab9565b9450612b11565b8093505050505b919050565b6000612bde836000018360001b613079565b905092915050565b600081600001805490509050919050565b505050565b6000612c0e836000018360001b61309c565b905092915050565b6000612c28836000018360001b613226565b905092915050565b6000612c5c846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b613296565b90509392505050565b600081836000018054905011612cb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ca79061460f565b60405180910390fd5b826000018281548110612cec577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905092915050565b60008082846000018054905011612d4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d429061478f565b60405180910390fd5b6000846000018481548110612d89577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906002020190508060000154816001015492509250509250929050565b60008084600101600085815260200190815260200160002054905060008114158390612e11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e0891906145ed565b60405180910390fd5b5084600001600182612e239190614aea565b81548110612e5a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060020201600101549150509392505050565b600081600001805490509050919050565b612e9183836133a8565b612e9e6000848484612ee2565b612edd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ed49061462f565b60405180910390fd5b505050565b6000612f038473ffffffffffffffffffffffffffffffffffffffff16613536565b1561306c578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612f2c612546565b8786866040518563ffffffff1660e01b8152600401612f4e9493929190614520565b602060405180830381600087803b158015612f6857600080fd5b505af1925050508015612f9957506040513d601f19601f82011682018060405250810190612f969190613a42565b60015b61301c573d8060008114612fc9576040519150601f19603f3d011682016040523d82523d6000602084013e612fce565b606091505b50600081511415613014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161300b9061462f565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613071565b600190505b949350505050565b600080836001016000848152602001908152602001600020541415905092915050565b6000808360010160008481526020019081526020016000205490506000811461321a5760006001826130ce9190614aea565b90506000600186600001805490506130e69190614aea565b90506000866000018281548110613126577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080876000018481548110613170577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555060018361318b9190614a63565b87600101600083815260200190815260200160002081905550866000018054806131de577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050613220565b60009150505b92915050565b60006132328383613549565b61328b578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050613290565b600090505b92915050565b600080846001016000858152602001908152602001600020549050600081141561333d578460000160405180604001604052808681526020018581525090806001815401808255809150506001900390600052602060002090600202016000909190919091506000820151816000015560208201518160010155505084600001805490508560010160008681526020019081526020016000208190555060019150506133a1565b828560000160018361334f9190614aea565b81548110613386577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600202016001018190555060009150505b9392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613418576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161340f906147af565b60405180910390fd5b61342181612529565b15613461576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134589061466f565b60405180910390fd5b61346d60008383612bf7565b6134be81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612c1690919063ffffffff16565b506134d581836002612c309092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b600080836001016000848152602001908152602001600020541415905092915050565b82805461357890614bde565b90600052602060002090601f01602090048101928261359a57600085556135e1565b82601f106135b357805160ff19168380011785556135e1565b828001600101855582156135e1579182015b828111156135e05782518255916020019190600101906135c5565b5b5090506135ee91906135f2565b5090565b5b8082111561360b5760008160009055506001016135f3565b5090565b600061362261361d8461495b565b61492a565b9050808382526020820190508285602086028201111561364157600080fd5b60005b85811015613671578161365788826137de565b845260208401935060208301925050600181019050613644565b5050509392505050565b600061368e61368984614987565b61492a565b9050828152602081018484840111156136a657600080fd5b6136b1848285614b9c565b509392505050565b60006136cc6136c7846149b7565b61492a565b9050828152602081018484840111156136e457600080fd5b6136ef848285614b9c565b509392505050565b60008135905061370681614d92565b92915050565b60008151905061371b81614d92565b92915050565b600082601f83011261373257600080fd5b813561374284826020860161360f565b91505092915050565b60008135905061375a81614da9565b92915050565b60008135905061376f81614dc0565b92915050565b60008151905061378481614dc0565b92915050565b600082601f83011261379b57600080fd5b81356137ab84826020860161367b565b91505092915050565b600082601f8301126137c557600080fd5b81356137d58482602086016136b9565b91505092915050565b6000813590506137ed81614dd7565b92915050565b60008151905061380281614dd7565b92915050565b60006020828403121561381a57600080fd5b6000613828848285016136f7565b91505092915050565b60006020828403121561384357600080fd5b60006138518482850161370c565b91505092915050565b6000806040838503121561386d57600080fd5b600061387b858286016136f7565b925050602061388c858286016136f7565b9150509250929050565b6000806000606084860312156138ab57600080fd5b60006138b9868287016136f7565b93505060206138ca868287016136f7565b92505060406138db868287016137de565b9150509250925092565b600080600080608085870312156138fb57600080fd5b6000613909878288016136f7565b945050602061391a878288016136f7565b935050604061392b878288016137de565b925050606085013567ffffffffffffffff81111561394857600080fd5b6139548782880161378a565b91505092959194509250565b6000806040838503121561397357600080fd5b6000613981858286016136f7565b92505060206139928582860161374b565b9150509250929050565b600080604083850312156139af57600080fd5b60006139bd858286016136f7565b92505060206139ce858286016137de565b9150509250929050565b6000602082840312156139ea57600080fd5b600082013567ffffffffffffffff811115613a0457600080fd5b613a1084828501613721565b91505092915050565b600060208284031215613a2b57600080fd5b6000613a3984828501613760565b91505092915050565b600060208284031215613a5457600080fd5b6000613a6284828501613775565b91505092915050565b600060208284031215613a7d57600080fd5b600082013567ffffffffffffffff811115613a9757600080fd5b613aa3848285016137b4565b91505092915050565b600060208284031215613abe57600080fd5b6000613acc848285016137de565b91505092915050565b600060208284031215613ae757600080fd5b6000613af5848285016137f3565b91505092915050565b6000613b0a838361446f565b60208301905092915050565b613b1f81614b1e565b82525050565b613b36613b3182614b1e565b614c59565b82525050565b6000613b47826149f7565b613b518185614a25565b9350613b5c836149e7565b8060005b83811015613b8d578151613b748882613afe565b9750613b7f83614a18565b925050600181019050613b60565b5085935050505092915050565b613ba381614b30565b82525050565b613bb281614b3c565b82525050565b6000613bc382614a02565b613bcd8185614a36565b9350613bdd818560208601614bab565b613be681614d74565b840191505092915050565b6000613bfc82614a0d565b613c068185614a47565b9350613c16818560208601614bab565b613c1f81614d74565b840191505092915050565b6000613c3582614a0d565b613c3f8185614a58565b9350613c4f818560208601614bab565b80840191505092915050565b6000613c68602283614a47565b91507f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613cce603283614a47565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000613d34602683614a47565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613d9a601c83614a47565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613dda602483614a47565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613e40601983614a47565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000613e80601883614a47565b91507f416c726561647920636c61696d6564207468697320574f4300000000000000006000830152602082019050919050565b6000613ec0601983614a47565b91507f4e6f7420746865206f776e6572206f66207468697320574f43000000000000006000830152602082019050919050565b6000613f00602c83614a47565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613f66603883614a47565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000613fcc602a83614a47565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000614032601a83614a47565b91507f436c61696d206973206e6f7420706f737369626c65206e6f772e0000000000006000830152602082019050919050565b6000614072602283614a47565b91507f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006140d8602083614a47565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000614118602c83614a47565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061417e602083614a47565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006141be602983614a47565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614224602f83614a47565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b600061428a602183614a47565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006142f0603183614a47565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000614356602383614a47565b91507f43616e6e6f7420636c61696d206d6f7265207468616e2032302061742061207460008301527f696d6500000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006143bc600e83614a47565b91507f444f4553204e4f542045584953540000000000000000000000000000000000006000830152602082019050919050565b60006143fc601283614a47565b91507f45786365656473204d41585f544f4b454e5300000000000000000000000000006000830152602082019050919050565b600061443c601883614a47565b91507f436c61696d20697320666f7265766572206c6f636b65642e00000000000000006000830152602082019050919050565b61447881614b92565b82525050565b61448781614b92565b82525050565b61449e61449982614b92565b614c7d565b82525050565b60006144b08286613b25565b6014820191506144c0828561448d565b6020820191506144d0828461448d565b602082019150819050949350505050565b60006144ed8285613c2a565b91506144f98284613c2a565b91508190509392505050565b600060208201905061451a6000830184613b16565b92915050565b60006080820190506145356000830187613b16565b6145426020830186613b16565b61454f604083018561447e565b81810360608301526145618184613bb8565b905095945050505050565b60006040820190506145816000830185613b16565b61458e602083018461447e565b9392505050565b600060208201905081810360008301526145af8184613b3c565b905092915050565b60006020820190506145cc6000830184613b9a565b92915050565b60006020820190506145e76000830184613ba9565b92915050565b600060208201905081810360008301526146078184613bf1565b905092915050565b6000602082019050818103600083015261462881613c5b565b9050919050565b6000602082019050818103600083015261464881613cc1565b9050919050565b6000602082019050818103600083015261466881613d27565b9050919050565b6000602082019050818103600083015261468881613d8d565b9050919050565b600060208201905081810360008301526146a881613dcd565b9050919050565b600060208201905081810360008301526146c881613e33565b9050919050565b600060208201905081810360008301526146e881613e73565b9050919050565b6000602082019050818103600083015261470881613eb3565b9050919050565b6000602082019050818103600083015261472881613ef3565b9050919050565b6000602082019050818103600083015261474881613f59565b9050919050565b6000602082019050818103600083015261476881613fbf565b9050919050565b6000602082019050818103600083015261478881614025565b9050919050565b600060208201905081810360008301526147a881614065565b9050919050565b600060208201905081810360008301526147c8816140cb565b9050919050565b600060208201905081810360008301526147e88161410b565b9050919050565b6000602082019050818103600083015261480881614171565b9050919050565b60006020820190508181036000830152614828816141b1565b9050919050565b6000602082019050818103600083015261484881614217565b9050919050565b600060208201905081810360008301526148688161427d565b9050919050565b60006020820190508181036000830152614888816142e3565b9050919050565b600060208201905081810360008301526148a881614349565b9050919050565b600060208201905081810360008301526148c8816143af565b9050919050565b600060208201905081810360008301526148e8816143ef565b9050919050565b600060208201905081810360008301526149088161442f565b9050919050565b6000602082019050614924600083018461447e565b92915050565b6000604051905081810181811067ffffffffffffffff8211171561495157614950614d45565b5b8060405250919050565b600067ffffffffffffffff82111561497657614975614d45565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156149a2576149a1614d45565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156149d2576149d1614d45565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614a6e82614b92565b9150614a7983614b92565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614aae57614aad614cb8565b5b828201905092915050565b6000614ac482614b92565b9150614acf83614b92565b925082614adf57614ade614ce7565b5b828204905092915050565b6000614af582614b92565b9150614b0083614b92565b925082821015614b1357614b12614cb8565b5b828203905092915050565b6000614b2982614b72565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614bc9578082015181840152602081019050614bae565b83811115614bd8576000848401525b50505050565b60006002820490506001821680614bf657607f821691505b60208210811415614c0a57614c09614d16565b5b50919050565b6000614c1b82614b92565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614c4e57614c4d614cb8565b5b600182019050919050565b6000614c6482614c6b565b9050919050565b6000614c7682614d85565b9050919050565b6000819050919050565b6000614c9282614b92565b9150614c9d83614b92565b925082614cad57614cac614ce7565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b614d9b81614b1e565b8114614da657600080fd5b50565b614db281614b30565b8114614dbd57600080fd5b50565b614dc981614b46565b8114614dd457600080fd5b50565b614de081614b92565b8114614deb57600080fd5b5056fe4552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea264697066735822122012a3f0c3839db3ed524807f1db6bce4799452e8d5fcca4fc08439eb56e4b20c764736f6c6343000800003368747470733a2f2f6170692e6368726f6d6f727068732e78797a2f627265617468652f6a736f6e2f

Deployed Bytecode

0x6080604052600436106102305760003560e01c8063715018a61161012e578063b85554ac116100ab578063d423d6081161006f578063d423d60814610854578063e985e9c51461087f578063ebe9eb9f146108bc578063f2fde38b146108e7578063f47c84c51461091057610230565b8063b85554ac14610749578063b88d4fde14610786578063c1664b13146107af578063c87b56dd146107da578063c8a012261461081757610230565b806395d89b41116100f257806395d89b41146106625780639a0626641461068d578063a22cb465146106b8578063a3864397146106e1578063b44df72d1461071e57610230565b8063715018a61461059157806378a4ab85146105a85780638462151c146105d15780638da5cb5b1461060e5780639051cce91461063957610230565b806342842e0e116101bc57806367deb5cf1161018057806367deb5cf146104be57806369d8a608146104fb5780636c0360eb146105125780636d60e6c11461053d57806370a082311461055457610230565b806342842e0e146103c75780634f6ccce7146103f057806355f804b31461042d5780635d69dbdd146104565780636352211e1461048157610230565b8063171ce09411610203578063171ce0941461030357806318160ddd1461032c57806323b872dd146103575780632f745c59146103805780633ccfd60b146103bd57610230565b806301ffc9a71461023557806306fdde0314610272578063081812fc1461029d578063095ea7b3146102da575b600080fd5b34801561024157600080fd5b5061025c60048036038101906102579190613a19565b61093b565b60405161026991906145b7565b60405180910390f35b34801561027e57600080fd5b506102876109a2565b60405161029491906145ed565b60405180910390f35b3480156102a957600080fd5b506102c460048036038101906102bf9190613aac565b610a34565b6040516102d19190614505565b60405180910390f35b3480156102e657600080fd5b5061030160048036038101906102fc919061399c565b610ab9565b005b34801561030f57600080fd5b5061032a60048036038101906103259190613a6b565b610bd1565b005b34801561033857600080fd5b50610341610c67565b60405161034e919061490f565b60405180910390f35b34801561036357600080fd5b5061037e60048036038101906103799190613896565b610c78565b005b34801561038c57600080fd5b506103a760048036038101906103a2919061399c565b610cd8565b6040516103b4919061490f565b60405180910390f35b6103c5610d33565b005b3480156103d357600080fd5b506103ee60048036038101906103e99190613896565b610dfe565b005b3480156103fc57600080fd5b5061041760048036038101906104129190613aac565b610e1e565b604051610424919061490f565b60405180910390f35b34801561043957600080fd5b50610454600480360381019061044f9190613a6b565b610e41565b005b34801561046257600080fd5b5061046b610ec9565b60405161047891906145ed565b60405180910390f35b34801561048d57600080fd5b506104a860048036038101906104a39190613aac565b610f57565b6040516104b59190614505565b60405180910390f35b3480156104ca57600080fd5b506104e560048036038101906104e09190613808565b610f8e565b6040516104f29190614595565b60405180910390f35b34801561050757600080fd5b50610510611233565b005b34801561051e57600080fd5b506105276112cc565b60405161053491906145ed565b60405180910390f35b34801561054957600080fd5b5061055261135e565b005b34801561056057600080fd5b5061057b60048036038101906105769190613808565b611406565b604051610588919061490f565b60405180910390f35b34801561059d57600080fd5b506105a66114c5565b005b3480156105b457600080fd5b506105cf60048036038101906105ca9190613a6b565b611602565b005b3480156105dd57600080fd5b506105f860048036038101906105f39190613808565b611698565b6040516106059190614595565b60405180910390f35b34801561061a57600080fd5b50610623611814565b6040516106309190614505565b60405180910390f35b34801561064557600080fd5b50610660600480360381019061065b91906139d8565b61183e565b005b34801561066e57600080fd5b50610677611c78565b60405161068491906145ed565b60405180910390f35b34801561069957600080fd5b506106a2611d0a565b6040516106af9190614505565b60405180910390f35b3480156106c457600080fd5b506106df60048036038101906106da9190613960565b611d22565b005b3480156106ed57600080fd5b5061070860048036038101906107039190613aac565b611ea3565b60405161071591906145d2565b60405180910390f35b34801561072a57600080fd5b50610733611f32565b6040516107409190614595565b60405180910390f35b34801561075557600080fd5b50610770600480360381019061076b9190613aac565b61202a565b60405161077d919061490f565b60405180910390f35b34801561079257600080fd5b506107ad60048036038101906107a891906138e5565b612042565b005b3480156107bb57600080fd5b506107c46120a4565b6040516107d191906145b7565b60405180910390f35b3480156107e657600080fd5b5061080160048036038101906107fc9190613aac565b6120b7565b60405161080e91906145ed565b60405180910390f35b34801561082357600080fd5b5061083e60048036038101906108399190613aac565b61222a565b60405161084b919061490f565b60405180910390f35b34801561086057600080fd5b50610869612242565b60405161087691906145b7565b60405180910390f35b34801561088b57600080fd5b506108a660048036038101906108a1919061385a565b612255565b6040516108b391906145b7565b60405180910390f35b3480156108c857600080fd5b506108d16122e9565b6040516108de91906145ed565b60405180910390f35b3480156108f357600080fd5b5061090e60048036038101906109099190613808565b612377565b005b34801561091c57600080fd5b50610925612523565b604051610932919061490f565b60405180910390f35b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b6060600680546109b190614bde565b80601f01602080910402602001604051908101604052809291908181526020018280546109dd90614bde565b8015610a2a5780601f106109ff57610100808354040283529160200191610a2a565b820191906000526020600020905b815481529060010190602001808311610a0d57829003601f168201915b5050505050905090565b6000610a3f82612529565b610a7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a75906147cf565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ac482610f57565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2c9061484f565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b54612546565b73ffffffffffffffffffffffffffffffffffffffff161480610b835750610b8281610b7d612546565b612255565b5b610bc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb99061472f565b60405180910390fd5b610bcc838361254e565b505050565b610bd9612546565b73ffffffffffffffffffffffffffffffffffffffff16610bf7611814565b73ffffffffffffffffffffffffffffffffffffffff1614610c4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c44906147ef565b60405180910390fd5b80600b9080519060200190610c6392919061356c565b5050565b6000610c736002612607565b905090565b610c89610c83612546565b8261261c565b610cc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbf9061486f565b60405180910390fd5b610cd38383836126fa565b505050565b6000610d2b82600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061291190919063ffffffff16565b905092915050565b610d3b612546565b73ffffffffffffffffffffffffffffffffffffffff16610d59611814565b73ffffffffffffffffffffffffffffffffffffffff1614610daf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da6906147ef565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610dfa573d6000803e3d6000fd5b5050565b610e1983838360405180602001604052806000815250612042565b505050565b600080610e3583600261292b90919063ffffffff16565b50905080915050919050565b610e49612546565b73ffffffffffffffffffffffffffffffffffffffff16610e67611814565b73ffffffffffffffffffffffffffffffffffffffff1614610ebd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb4906147ef565b60405180910390fd5b610ec681612957565b50565b600c8054610ed690614bde565b80601f0160208091040260200160405190810160405280929190818152602001828054610f0290614bde565b8015610f4f5780601f10610f2457610100808354040283529160200191610f4f565b820191906000526020600020905b815481529060010190602001808311610f3257829003601f168201915b505050505081565b6000610f8782604051806060016040528060298152602001614def6029913960026129719092919063ffffffff16565b9050919050565b6060600073f65d8f4a5c7956f40be2eae8171d62a6c97fab9c73ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b8152600401610fdf9190614505565b60206040518083038186803b158015610ff757600080fd5b505afa15801561100b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061102f9190613ad5565b905060008114156110b257600067ffffffffffffffff81111561107b577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156110a95781602001602082028036833780820191505090505b5091505061122e565b60008167ffffffffffffffff8111156110f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156111225781602001602082028036833780820191505090505b50905060005b828110156112275773f65d8f4a5c7956f40be2eae8171d62a6c97fab9c73ffffffffffffffffffffffffffffffffffffffff16632f745c5986836040518363ffffffff1660e01b815260040161117f92919061456c565b60206040518083038186803b15801561119757600080fd5b505afa1580156111ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111cf9190613ad5565b828281518110611208577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018181525050808061121f90614c10565b915050611128565b8193505050505b919050565b61123b612546565b73ffffffffffffffffffffffffffffffffffffffff16611259611814565b73ffffffffffffffffffffffffffffffffffffffff16146112af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a6906147ef565b60405180910390fd5b6001600d60016101000a81548160ff021916908315150217905550565b6060600980546112db90614bde565b80601f016020809104026020016040519081016040528092919081815260200182805461130790614bde565b80156113545780601f1061132957610100808354040283529160200191611354565b820191906000526020600020905b81548152906001019060200180831161133757829003601f168201915b5050505050905090565b611366612546565b73ffffffffffffffffffffffffffffffffffffffff16611384611814565b73ffffffffffffffffffffffffffffffffffffffff16146113da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d1906147ef565b60405180910390fd5b600d60009054906101000a900460ff1615600d60006101000a81548160ff021916908315150217905550565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611477576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146e9061474f565b60405180910390fd5b6114be600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612990565b9050919050565b6114cd612546565b73ffffffffffffffffffffffffffffffffffffffff166114eb611814565b73ffffffffffffffffffffffffffffffffffffffff1614611541576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611538906147ef565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b61160a612546565b73ffffffffffffffffffffffffffffffffffffffff16611628611814565b73ffffffffffffffffffffffffffffffffffffffff161461167e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611675906147ef565b60405180910390fd5b80600b908051906020019061169492919061356c565b5050565b606060006116a583611406565b9050600081141561172857600067ffffffffffffffff8111156116f1577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405190808252806020026020018201604052801561171f5781602001602082028036833780820191505090505b5091505061180f565b60008167ffffffffffffffff81111561176a577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156117985781602001602082028036833780820191505090505b50905060005b82811015611808576117b08582610cd8565b8282815181106117e9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018181525050808061180090614c10565b91505061179e565b8193505050505b919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600d60009054906101000a900460ff1661188d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118849061476f565b60405180910390fd5b600d60019054906101000a900460ff16156118dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d4906148ef565b60405180910390fd5b601481511115611922576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119199061488f565b60405180910390fd5b610400815161192f610c67565b6119399190614a63565b111561197a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611971906148cf565b60405180910390fd5b60005b8151811015611c74576000600f60008484815181106119c5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015181526020019081526020016000205414611a1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a13906146cf565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff1673f65d8f4a5c7956f40be2eae8171d62a6c97fab9c73ffffffffffffffffffffffffffffffffffffffff16636352211e848481518110611a9c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b8152600401611ac0919061490f565b60206040518083038186803b158015611ad857600080fd5b505afa158015611aec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b109190613831565b73ffffffffffffffffffffffffffffffffffffffff1614611b66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5d906146ef565b60405180910390fd5b611bb033838381518110611ba3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516129a5565b6001600f6000848481518110611bef577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015181526020019081526020016000208190555043600e6000848481518110611c47577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101518152602001908152602001600020819055508080611c6c90614c10565b91505061197d565b5050565b606060078054611c8790614bde565b80601f0160208091040260200160405190810160405280929190818152602001828054611cb390614bde565b8015611d005780601f10611cd557610100808354040283529160200191611d00565b820191906000526020600020905b815481529060010190602001808311611ce357829003601f168201915b5050505050905090565b73f65d8f4a5c7956f40be2eae8171d62a6c97fab9c81565b611d2a612546565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8f906146af565b60405180910390fd5b8060056000611da5612546565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611e52612546565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611e9791906145b7565b60405180910390a35050565b6000611eae82612529565b611eed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee4906148af565b60405180910390fd5b30600e60008481526020019081526020016000205483604051602001611f15939291906144a4565b604051602081830303815290604052805190602001209050919050565b6060600061040067ffffffffffffffff811115611f78577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015611fa65781602001602082028036833780820191505090505b50905060005b61040081101561202257600f600082815260200190815260200160002054828281518110612003577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018181525050808061201a90614c10565b915050611fac565b508091505090565b600f6020528060005260406000206000915090505481565b61205361204d612546565b8361261c565b612092576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120899061486f565b60405180910390fd5b61209e848484846129c3565b50505050565b600d60009054906101000a900460ff1681565b60606120c282612529565b612101576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f89061482f565b60405180910390fd5b600060086000848152602001908152602001600020805461212190614bde565b80601f016020809104026020016040519081016040528092919081815260200182805461214d90614bde565b801561219a5780601f1061216f5761010080835404028352916020019161219a565b820191906000526020600020905b81548152906001019060200180831161217d57829003601f168201915b5050505050905060006121ab6112cc565b90506000815114156121c1578192505050612225565b6000825111156121f65780826040516020016121de9291906144e1565b60405160208183030381529060405292505050612225565b8061220085612a1f565b6040516020016122119291906144e1565b604051602081830303815290604052925050505b919050565b600e6020528060005260406000206000915090505481565b600d60019054906101000a900460ff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600b80546122f690614bde565b80601f016020809104026020016040519081016040528092919081815260200182805461232290614bde565b801561236f5780601f106123445761010080835404028352916020019161236f565b820191906000526020600020905b81548152906001019060200180831161235257829003601f168201915b505050505081565b61237f612546565b73ffffffffffffffffffffffffffffffffffffffff1661239d611814565b73ffffffffffffffffffffffffffffffffffffffff16146123f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ea906147ef565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612463576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245a9061464f565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61040081565b600061253f826002612bcc90919063ffffffff16565b9050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166125c183610f57565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061261582600001612be6565b9050919050565b600061262782612529565b612666576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265d9061470f565b60405180910390fd5b600061267183610f57565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806126e057508373ffffffffffffffffffffffffffffffffffffffff166126c884610a34565b73ffffffffffffffffffffffffffffffffffffffff16145b806126f157506126f08185612255565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661271a82610f57565b73ffffffffffffffffffffffffffffffffffffffff1614612770576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127679061480f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127d79061468f565b60405180910390fd5b6127eb838383612bf7565b6127f660008261254e565b61284781600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612bfc90919063ffffffff16565b5061289981600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612c1690919063ffffffff16565b506128b081836002612c309092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60006129208360000183612c65565b60001c905092915050565b60008060008061293e8660000186612cff565b915091508160001c8160001c9350935050509250929050565b806009908051906020019061296d92919061356c565b5050565b6000612984846000018460001b84612daf565b60001c90509392505050565b600061299e82600001612e76565b9050919050565b6129bf828260405180602001604052806000815250612e87565b5050565b6129ce8484846126fa565b6129da84848484612ee2565b612a19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a109061462f565b60405180910390fd5b50505050565b60606000821415612a67576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612bc7565b600082905060005b60008214612a99578080612a8290614c10565b915050600a82612a929190614ab9565b9150612a6f565b60008167ffffffffffffffff811115612adb577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612b0d5781602001600182028036833780820191505090505b5090505b60008514612bc057600182612b269190614aea565b9150600a85612b359190614c87565b6030612b419190614a63565b60f81b818381518110612b7d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612bb99190614ab9565b9450612b11565b8093505050505b919050565b6000612bde836000018360001b613079565b905092915050565b600081600001805490509050919050565b505050565b6000612c0e836000018360001b61309c565b905092915050565b6000612c28836000018360001b613226565b905092915050565b6000612c5c846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b613296565b90509392505050565b600081836000018054905011612cb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ca79061460f565b60405180910390fd5b826000018281548110612cec577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905092915050565b60008082846000018054905011612d4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d429061478f565b60405180910390fd5b6000846000018481548110612d89577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906002020190508060000154816001015492509250509250929050565b60008084600101600085815260200190815260200160002054905060008114158390612e11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e0891906145ed565b60405180910390fd5b5084600001600182612e239190614aea565b81548110612e5a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060020201600101549150509392505050565b600081600001805490509050919050565b612e9183836133a8565b612e9e6000848484612ee2565b612edd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ed49061462f565b60405180910390fd5b505050565b6000612f038473ffffffffffffffffffffffffffffffffffffffff16613536565b1561306c578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612f2c612546565b8786866040518563ffffffff1660e01b8152600401612f4e9493929190614520565b602060405180830381600087803b158015612f6857600080fd5b505af1925050508015612f9957506040513d601f19601f82011682018060405250810190612f969190613a42565b60015b61301c573d8060008114612fc9576040519150601f19603f3d011682016040523d82523d6000602084013e612fce565b606091505b50600081511415613014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161300b9061462f565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613071565b600190505b949350505050565b600080836001016000848152602001908152602001600020541415905092915050565b6000808360010160008481526020019081526020016000205490506000811461321a5760006001826130ce9190614aea565b90506000600186600001805490506130e69190614aea565b90506000866000018281548110613126577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080876000018481548110613170577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555060018361318b9190614a63565b87600101600083815260200190815260200160002081905550866000018054806131de577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050613220565b60009150505b92915050565b60006132328383613549565b61328b578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050613290565b600090505b92915050565b600080846001016000858152602001908152602001600020549050600081141561333d578460000160405180604001604052808681526020018581525090806001815401808255809150506001900390600052602060002090600202016000909190919091506000820151816000015560208201518160010155505084600001805490508560010160008681526020019081526020016000208190555060019150506133a1565b828560000160018361334f9190614aea565b81548110613386577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600202016001018190555060009150505b9392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613418576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161340f906147af565b60405180910390fd5b61342181612529565b15613461576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134589061466f565b60405180910390fd5b61346d60008383612bf7565b6134be81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612c1690919063ffffffff16565b506134d581836002612c309092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b600080836001016000848152602001908152602001600020541415905092915050565b82805461357890614bde565b90600052602060002090601f01602090048101928261359a57600085556135e1565b82601f106135b357805160ff19168380011785556135e1565b828001600101855582156135e1579182015b828111156135e05782518255916020019190600101906135c5565b5b5090506135ee91906135f2565b5090565b5b8082111561360b5760008160009055506001016135f3565b5090565b600061362261361d8461495b565b61492a565b9050808382526020820190508285602086028201111561364157600080fd5b60005b85811015613671578161365788826137de565b845260208401935060208301925050600181019050613644565b5050509392505050565b600061368e61368984614987565b61492a565b9050828152602081018484840111156136a657600080fd5b6136b1848285614b9c565b509392505050565b60006136cc6136c7846149b7565b61492a565b9050828152602081018484840111156136e457600080fd5b6136ef848285614b9c565b509392505050565b60008135905061370681614d92565b92915050565b60008151905061371b81614d92565b92915050565b600082601f83011261373257600080fd5b813561374284826020860161360f565b91505092915050565b60008135905061375a81614da9565b92915050565b60008135905061376f81614dc0565b92915050565b60008151905061378481614dc0565b92915050565b600082601f83011261379b57600080fd5b81356137ab84826020860161367b565b91505092915050565b600082601f8301126137c557600080fd5b81356137d58482602086016136b9565b91505092915050565b6000813590506137ed81614dd7565b92915050565b60008151905061380281614dd7565b92915050565b60006020828403121561381a57600080fd5b6000613828848285016136f7565b91505092915050565b60006020828403121561384357600080fd5b60006138518482850161370c565b91505092915050565b6000806040838503121561386d57600080fd5b600061387b858286016136f7565b925050602061388c858286016136f7565b9150509250929050565b6000806000606084860312156138ab57600080fd5b60006138b9868287016136f7565b93505060206138ca868287016136f7565b92505060406138db868287016137de565b9150509250925092565b600080600080608085870312156138fb57600080fd5b6000613909878288016136f7565b945050602061391a878288016136f7565b935050604061392b878288016137de565b925050606085013567ffffffffffffffff81111561394857600080fd5b6139548782880161378a565b91505092959194509250565b6000806040838503121561397357600080fd5b6000613981858286016136f7565b92505060206139928582860161374b565b9150509250929050565b600080604083850312156139af57600080fd5b60006139bd858286016136f7565b92505060206139ce858286016137de565b9150509250929050565b6000602082840312156139ea57600080fd5b600082013567ffffffffffffffff811115613a0457600080fd5b613a1084828501613721565b91505092915050565b600060208284031215613a2b57600080fd5b6000613a3984828501613760565b91505092915050565b600060208284031215613a5457600080fd5b6000613a6284828501613775565b91505092915050565b600060208284031215613a7d57600080fd5b600082013567ffffffffffffffff811115613a9757600080fd5b613aa3848285016137b4565b91505092915050565b600060208284031215613abe57600080fd5b6000613acc848285016137de565b91505092915050565b600060208284031215613ae757600080fd5b6000613af5848285016137f3565b91505092915050565b6000613b0a838361446f565b60208301905092915050565b613b1f81614b1e565b82525050565b613b36613b3182614b1e565b614c59565b82525050565b6000613b47826149f7565b613b518185614a25565b9350613b5c836149e7565b8060005b83811015613b8d578151613b748882613afe565b9750613b7f83614a18565b925050600181019050613b60565b5085935050505092915050565b613ba381614b30565b82525050565b613bb281614b3c565b82525050565b6000613bc382614a02565b613bcd8185614a36565b9350613bdd818560208601614bab565b613be681614d74565b840191505092915050565b6000613bfc82614a0d565b613c068185614a47565b9350613c16818560208601614bab565b613c1f81614d74565b840191505092915050565b6000613c3582614a0d565b613c3f8185614a58565b9350613c4f818560208601614bab565b80840191505092915050565b6000613c68602283614a47565b91507f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613cce603283614a47565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000613d34602683614a47565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613d9a601c83614a47565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613dda602483614a47565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613e40601983614a47565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000613e80601883614a47565b91507f416c726561647920636c61696d6564207468697320574f4300000000000000006000830152602082019050919050565b6000613ec0601983614a47565b91507f4e6f7420746865206f776e6572206f66207468697320574f43000000000000006000830152602082019050919050565b6000613f00602c83614a47565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613f66603883614a47565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000613fcc602a83614a47565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000614032601a83614a47565b91507f436c61696d206973206e6f7420706f737369626c65206e6f772e0000000000006000830152602082019050919050565b6000614072602283614a47565b91507f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006140d8602083614a47565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000614118602c83614a47565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061417e602083614a47565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006141be602983614a47565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614224602f83614a47565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b600061428a602183614a47565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006142f0603183614a47565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000614356602383614a47565b91507f43616e6e6f7420636c61696d206d6f7265207468616e2032302061742061207460008301527f696d6500000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006143bc600e83614a47565b91507f444f4553204e4f542045584953540000000000000000000000000000000000006000830152602082019050919050565b60006143fc601283614a47565b91507f45786365656473204d41585f544f4b454e5300000000000000000000000000006000830152602082019050919050565b600061443c601883614a47565b91507f436c61696d20697320666f7265766572206c6f636b65642e00000000000000006000830152602082019050919050565b61447881614b92565b82525050565b61448781614b92565b82525050565b61449e61449982614b92565b614c7d565b82525050565b60006144b08286613b25565b6014820191506144c0828561448d565b6020820191506144d0828461448d565b602082019150819050949350505050565b60006144ed8285613c2a565b91506144f98284613c2a565b91508190509392505050565b600060208201905061451a6000830184613b16565b92915050565b60006080820190506145356000830187613b16565b6145426020830186613b16565b61454f604083018561447e565b81810360608301526145618184613bb8565b905095945050505050565b60006040820190506145816000830185613b16565b61458e602083018461447e565b9392505050565b600060208201905081810360008301526145af8184613b3c565b905092915050565b60006020820190506145cc6000830184613b9a565b92915050565b60006020820190506145e76000830184613ba9565b92915050565b600060208201905081810360008301526146078184613bf1565b905092915050565b6000602082019050818103600083015261462881613c5b565b9050919050565b6000602082019050818103600083015261464881613cc1565b9050919050565b6000602082019050818103600083015261466881613d27565b9050919050565b6000602082019050818103600083015261468881613d8d565b9050919050565b600060208201905081810360008301526146a881613dcd565b9050919050565b600060208201905081810360008301526146c881613e33565b9050919050565b600060208201905081810360008301526146e881613e73565b9050919050565b6000602082019050818103600083015261470881613eb3565b9050919050565b6000602082019050818103600083015261472881613ef3565b9050919050565b6000602082019050818103600083015261474881613f59565b9050919050565b6000602082019050818103600083015261476881613fbf565b9050919050565b6000602082019050818103600083015261478881614025565b9050919050565b600060208201905081810360008301526147a881614065565b9050919050565b600060208201905081810360008301526147c8816140cb565b9050919050565b600060208201905081810360008301526147e88161410b565b9050919050565b6000602082019050818103600083015261480881614171565b9050919050565b60006020820190508181036000830152614828816141b1565b9050919050565b6000602082019050818103600083015261484881614217565b9050919050565b600060208201905081810360008301526148688161427d565b9050919050565b60006020820190508181036000830152614888816142e3565b9050919050565b600060208201905081810360008301526148a881614349565b9050919050565b600060208201905081810360008301526148c8816143af565b9050919050565b600060208201905081810360008301526148e8816143ef565b9050919050565b600060208201905081810360008301526149088161442f565b9050919050565b6000602082019050614924600083018461447e565b92915050565b6000604051905081810181811067ffffffffffffffff8211171561495157614950614d45565b5b8060405250919050565b600067ffffffffffffffff82111561497657614975614d45565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156149a2576149a1614d45565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156149d2576149d1614d45565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614a6e82614b92565b9150614a7983614b92565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614aae57614aad614cb8565b5b828201905092915050565b6000614ac482614b92565b9150614acf83614b92565b925082614adf57614ade614ce7565b5b828204905092915050565b6000614af582614b92565b9150614b0083614b92565b925082821015614b1357614b12614cb8565b5b828203905092915050565b6000614b2982614b72565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614bc9578082015181840152602081019050614bae565b83811115614bd8576000848401525b50505050565b60006002820490506001821680614bf657607f821691505b60208210811415614c0a57614c09614d16565b5b50919050565b6000614c1b82614b92565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614c4e57614c4d614cb8565b5b600182019050919050565b6000614c6482614c6b565b9050919050565b6000614c7682614d85565b9050919050565b6000819050919050565b6000614c9282614b92565b9150614c9d83614b92565b925082614cad57614cac614ce7565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b614d9b81614b1e565b8114614da657600080fd5b50565b614db281614b30565b8114614dbd57600080fd5b50565b614dc981614b46565b8114614dd457600080fd5b50565b614de081614b92565b8114614deb57600080fd5b5056fe4552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea264697066735822122012a3f0c3839db3ed524807f1db6bce4799452e8d5fcca4fc08439eb56e4b20c764736f6c63430008000033

Deployed Bytecode Sourcemap

58980:3624:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31648:150;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43361:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46147:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45677:404;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61875:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45155:211;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47037:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44917:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62446:151;;;:::i;:::-;;47413;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45443:172;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61993:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59127:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43117:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60346:555;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61682:75;;;;;;;;;;;;;:::i;:::-;;44736:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62104:90;;;;;;;;;;;;;:::i;:::-;;42807:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58222:148;;;;;;;;;;;;;:::i;:::-;;61769:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59832:502;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57571:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60913:757;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43530:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59353:80;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46440:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62206:228;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59570:250;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59300:46;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47635:285;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59167:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43705:792;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59244:49;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59206:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46806:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59100:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58525:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59055:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31648:150;31733:4;31757:20;:33;31778:11;31757:33;;;;;;;;;;;;;;;;;;;;;;;;;;;31750:40;;31648:150;;;:::o;43361:100::-;43415:13;43448:5;43441:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43361:100;:::o;46147:221::-;46223:7;46251:16;46259:7;46251;:16::i;:::-;46243:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;46336:15;:24;46352:7;46336:24;;;;;;;;;;;;;;;;;;;;;46329:31;;46147:221;;;:::o;45677:404::-;45758:13;45774:23;45789:7;45774:14;:23::i;:::-;45758:39;;45822:5;45816:11;;:2;:11;;;;45808:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;45902:5;45886:21;;:12;:10;:12::i;:::-;:21;;;:69;;;;45911:44;45935:5;45942:12;:10;:12::i;:::-;45911:23;:44::i;:::-;45886:69;45878:161;;;;;;;;;;;;:::i;:::-;;;;;;;;;46052:21;46061:2;46065:7;46052:8;:21::i;:::-;45677:404;;;:::o;61875:106::-;57802:12;:10;:12::i;:::-;57791:23;;:7;:5;:7::i;:::-;:23;;;57783:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61962:11:::1;61953:6;:20;;;;;;;;;;;;:::i;:::-;;61875:106:::0;:::o;45155:211::-;45216:7;45337:21;:12;:19;:21::i;:::-;45330:28;;45155:211;:::o;47037:305::-;47198:41;47217:12;:10;:12::i;:::-;47231:7;47198:18;:41::i;:::-;47190:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;47306:28;47316:4;47322:2;47326:7;47306:9;:28::i;:::-;47037:305;;;:::o;44917:162::-;45014:7;45041:30;45065:5;45041:13;:20;45055:5;45041:20;;;;;;;;;;;;;;;:23;;:30;;;;:::i;:::-;45034:37;;44917:162;;;;:::o;62446:151::-;57802:12;:10;:12::i;:::-;57791:23;;:7;:5;:7::i;:::-;:23;;;57783:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62502:15:::1;62520:21;62502:39;;62560:10;62552:28;;:37;62581:7;62552:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;57862:1;62446:151::o:0;47413:::-;47517:39;47534:4;47540:2;47544:7;47517:39;;;;;;;;;;;;:16;:39::i;:::-;47413:151;;;:::o;45443:172::-;45518:7;45539:15;45560:22;45576:5;45560:12;:15;;:22;;;;:::i;:::-;45538:44;;;45600:7;45593:14;;;45443:172;;;:::o;61993:99::-;57802:12;:10;:12::i;:::-;57791:23;;:7;:5;:7::i;:::-;:23;;;57783:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62064:20:::1;62076:7;62064:11;:20::i;:::-;61993:99:::0;:::o;59127:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;43117:177::-;43189:7;43216:70;43233:7;43216:70;;;;;;;;;;;;;;;;;:12;:16;;:70;;;;;:::i;:::-;43209:77;;43117:177;;;:::o;60346:555::-;60408:16;60438:18;59391:42;60459:30;;;60490:6;60459:38;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60438:59;;60526:1;60512:10;:15;60508:386;;;60565:1;60551:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60544:23;;;;;60508:386;60600:23;60640:10;60626:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60600:51;;60666:13;60694:161;60718:10;60710:5;:18;60694:161;;;59391:42;60774:50;;;60825:6;60833:5;60774:65;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60758:6;60765:5;60758:13;;;;;;;;;;;;;;;;;;;;;:81;;;;;60730:7;;;;;:::i;:::-;;;;60694:161;;;60876:6;60869:13;;;;;60346:555;;;;:::o;61682:75::-;57802:12;:10;:12::i;:::-;57791:23;;:7;:5;:7::i;:::-;:23;;;57783:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61745:4:::1;61731:11;;:18;;;;;;;;;;;;;;;;;;61682:75::o:0;44736:97::-;44784:13;44817:8;44810:15;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44736:97;:::o;62104:90::-;57802:12;:10;:12::i;:::-;57791:23;;:7;:5;:7::i;:::-;:23;;;57783:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62174:12:::1;;;;;;;;;;;62173:13;62158:12;;:28;;;;;;;;;;;;;;;;;;62104:90::o:0;42807:221::-;42879:7;42924:1;42907:19;;:5;:19;;;;42899:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;42991:29;:13;:20;43005:5;42991:20;;;;;;;;;;;;;;;:27;:29::i;:::-;42984:36;;42807:221;;;:::o;58222:148::-;57802:12;:10;:12::i;:::-;57791:23;;:7;:5;:7::i;:::-;:23;;;57783:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58329:1:::1;58292:40;;58313:6;;;;;;;;;;;58292:40;;;;;;;;;;;;58360:1;58343:6;;:19;;;;;;;;;;;;;;;;;;58222:148::o:0;61769:94::-;57802:12;:10;:12::i;:::-;57791:23;;:7;:5;:7::i;:::-;:23;;;57783:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61848:7:::1;61839:6;:16;;;;;;;;;;;;:::i;:::-;;61769:94:::0;:::o;59832:502::-;59893:16;59923:18;59944:17;59954:6;59944:9;:17::i;:::-;59923:38;;59990:1;59976:10;:15;59972:355;;;60029:1;60015:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60008:23;;;;;59972:355;60064:23;60104:10;60090:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60064:51;;60130:13;60158:130;60182:10;60174:5;:18;60158:130;;;60238:34;60258:6;60266:5;60238:19;:34::i;:::-;60222:6;60229:5;60222:13;;;;;;;;;;;;;;;;;;;;;:50;;;;;60194:7;;;;;:::i;:::-;;;;60158:130;;;60309:6;60302:13;;;;;59832:502;;;;:::o;57571:87::-;57617:7;57644:6;;;;;;;;;;;57637:13;;57571:87;:::o;60913:757::-;60989:12;;;;;;;;;;;60981:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;61052:11;;;;;;;;;;;61051:12;61043:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;61130:2;61111:8;:15;:21;;61103:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;59089:4;61207:8;:15;61191:13;:11;:13::i;:::-;:31;;;;:::i;:::-;:45;;61183:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;61275:9;61270:393;61294:8;:15;61290:1;:19;61270:393;;;61366:1;61339:10;:23;61350:8;61359:1;61350:11;;;;;;;;;;;;;;;;;;;;;;61339:23;;;;;;;;;;;;:28;61331:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;61464:10;61419:55;;59391:42;61419:28;;;61448:8;61457:1;61448:11;;;;;;;;;;;;;;;;;;;;;;61419:41;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:55;;;61411:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;61519:34;61529:10;61541:8;61550:1;61541:11;;;;;;;;;;;;;;;;;;;;;;61519:9;:34::i;:::-;61594:1;61568:10;:23;61579:8;61588:1;61579:11;;;;;;;;;;;;;;;;;;;;;;61568:23;;;;;;;;;;;:27;;;;61639:12;61610:13;:26;61624:8;61633:1;61624:11;;;;;;;;;;;;;;;;;;;;;;61610:26;;;;;;;;;;;:41;;;;61311:3;;;;;:::i;:::-;;;;61270:393;;;;60913:757;:::o;43530:104::-;43586:13;43619:7;43612:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43530:104;:::o;59353:80::-;59391:42;59353:80;:::o;46440:295::-;46555:12;:10;:12::i;:::-;46543:24;;:8;:24;;;;46535:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;46655:8;46610:18;:32;46629:12;:10;:12::i;:::-;46610:32;;;;;;;;;;;;;;;:42;46643:8;46610:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;46708:8;46679:48;;46694:12;:10;:12::i;:::-;46679:48;;;46718:8;46679:48;;;;;;:::i;:::-;;;;;;;;46440:295;;:::o;62206:228::-;62262:7;62289:16;62297:7;62289;:16::i;:::-;62281:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;62385:4;62392:13;:22;62406:7;62392:22;;;;;;;;;;;;62416:7;62360:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;62350:75;;;;;;62335:91;;62206:228;;;:::o;59570:250::-;59617:16;59646:20;59089:4;59669:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59646:48;;59710:6;59705:87;59089:4;59722:1;:14;59705:87;;;59767:10;:13;59778:1;59767:13;;;;;;;;;;;;59758:3;59762:1;59758:6;;;;;;;;;;;;;;;;;;;;;:22;;;;;59738:3;;;;;:::i;:::-;;;;59705:87;;;;59809:3;59802:10;;;59570:250;:::o;59300:46::-;;;;;;;;;;;;;;;;;:::o;47635:285::-;47767:41;47786:12;:10;:12::i;:::-;47800:7;47767:18;:41::i;:::-;47759:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;47873:39;47887:4;47893:2;47897:7;47906:5;47873:13;:39::i;:::-;47635:285;;;;:::o;59167:32::-;;;;;;;;;;;;;:::o;43705:792::-;43778:13;43812:16;43820:7;43812;:16::i;:::-;43804:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;43893:23;43919:10;:19;43930:7;43919:19;;;;;;;;;;;43893:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43949:18;43970:9;:7;:9::i;:::-;43949:30;;44077:1;44061:4;44055:18;:23;44051:72;;;44102:9;44095:16;;;;;;44051:72;44253:1;44233:9;44227:23;:27;44223:108;;;44302:4;44308:9;44285:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;44271:48;;;;;;44223:108;44463:4;44469:18;:7;:16;:18::i;:::-;44446:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;44432:57;;;;43705:792;;;;:::o;59244:49::-;;;;;;;;;;;;;;;;;:::o;59206:31::-;;;;;;;;;;;;;:::o;46806:164::-;46903:4;46927:18;:25;46946:5;46927:25;;;;;;;;;;;;;;;:35;46953:8;46927:35;;;;;;;;;;;;;;;;;;;;;;;;;46920:42;;46806:164;;;;:::o;59100:20::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;58525:244::-;57802:12;:10;:12::i;:::-;57791:23;;:7;:5;:7::i;:::-;:23;;;57783:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58634:1:::1;58614:22;;:8;:22;;;;58606:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;58724:8;58695:38;;58716:6;;;;;;;;;;;58695:38;;;;;;;;;;;;58753:8;58744:6;;:17;;;;;;;;;;;;;;;;;;58525:244:::0;:::o;59055:38::-;59089:4;59055:38;:::o;49387:127::-;49452:4;49476:30;49498:7;49476:12;:21;;:30;;;;:::i;:::-;49469:37;;49387:127;;;:::o;40579:98::-;40632:7;40659:10;40652:17;;40579:98;:::o;55531:183::-;55624:2;55597:15;:24;55613:7;55597:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;55680:7;55676:2;55642:46;;55651:23;55666:7;55651:14;:23::i;:::-;55642:46;;;;;;;;;;;;55531:183;;:::o;10105:123::-;10174:7;10201:19;10209:3;:10;;10201:7;:19::i;:::-;10194:26;;10105:123;;;:::o;49681:355::-;49774:4;49799:16;49807:7;49799;:16::i;:::-;49791:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;49875:13;49891:23;49906:7;49891:14;:23::i;:::-;49875:39;;49944:5;49933:16;;:7;:16;;;:51;;;;49977:7;49953:31;;:20;49965:7;49953:11;:20::i;:::-;:31;;;49933:51;:94;;;;49988:39;50012:5;50019:7;49988:23;:39::i;:::-;49933:94;49925:103;;;49681:355;;;;:::o;52817:597::-;52942:4;52915:31;;:23;52930:7;52915:14;:23::i;:::-;:31;;;52907:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;53043:1;53029:16;;:2;:16;;;;53021:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;53099:39;53120:4;53126:2;53130:7;53099:20;:39::i;:::-;53203:29;53220:1;53224:7;53203:8;:29::i;:::-;53245:35;53272:7;53245:13;:19;53259:4;53245:19;;;;;;;;;;;;;;;:26;;:35;;;;:::i;:::-;;53291:30;53313:7;53291:13;:17;53305:2;53291:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;53334:29;53351:7;53360:2;53334:12;:16;;:29;;;;;:::i;:::-;;53398:7;53394:2;53379:27;;53388:4;53379:27;;;;;;;;;;;;52817:597;;;:::o;21679:137::-;21750:7;21785:22;21789:3;:10;;21801:5;21785:3;:22::i;:::-;21777:31;;21770:38;;21679:137;;;;:::o;10567:236::-;10647:7;10656;10677:11;10690:13;10707:22;10711:3;:10;;10723:5;10707:3;:22::i;:::-;10676:53;;;;10756:3;10748:12;;10786:5;10778:14;;10740:55;;;;;;10567:236;;;;;:::o;54015:100::-;54099:8;54088;:19;;;;;;;;;;;;:::i;:::-;;54015:100;:::o;11853:213::-;11960:7;12011:44;12016:3;:10;;12036:3;12028:12;;12042;12011:4;:44::i;:::-;12003:53;;11980:78;;11853:213;;;;;:::o;21221:114::-;21281:7;21308:19;21316:3;:10;;21308:7;:19::i;:::-;21301:26;;21221:114;;;:::o;50379:110::-;50455:26;50465:2;50469:7;50455:26;;;;;;;;;;;;:9;:26::i;:::-;50379:110;;:::o;48802:272::-;48916:28;48926:4;48932:2;48936:7;48916:9;:28::i;:::-;48963:48;48986:4;48992:2;48996:7;49005:5;48963:22;:48::i;:::-;48955:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;48802:272;;;;:::o;249:723::-;305:13;535:1;526:5;:10;522:53;;;553:10;;;;;;;;;;;;;;;;;;;;;522:53;585:12;600:5;585:20;;616:14;641:78;656:1;648:4;:9;641:78;;674:8;;;;;:::i;:::-;;;;705:2;697:10;;;;;:::i;:::-;;;641:78;;;729:19;761:6;751:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;729:39;;779:154;795:1;786:5;:10;779:154;;823:1;813:11;;;;;:::i;:::-;;;890:2;882:5;:10;;;;:::i;:::-;869:2;:24;;;;:::i;:::-;856:39;;839:6;846;839:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;919:2;910:11;;;;;:::i;:::-;;;779:154;;;957:6;943:21;;;;;249:723;;;;:::o;9866:151::-;9950:4;9974:35;9984:3;:10;;10004:3;9996:12;;9974:9;:35::i;:::-;9967:42;;9866:151;;;;:::o;6684:110::-;6740:7;6767:3;:12;;:19;;;;6760:26;;6684:110;;;:::o;56327:93::-;;;;:::o;20766:137::-;20836:4;20860:35;20868:3;:10;;20888:5;20880:14;;20860:7;:35::i;:::-;20853:42;;20766:137;;;;:::o;20459:131::-;20526:4;20550:32;20555:3;:10;;20575:5;20567:14;;20550:4;:32::i;:::-;20543:39;;20459:131;;;;:::o;9289:185::-;9378:4;9402:64;9407:3;:10;;9427:3;9419:12;;9457:5;9441:23;;9433:32;;9402:4;:64::i;:::-;9395:71;;9289:185;;;;;:::o;16717:204::-;16784:7;16833:5;16812:3;:11;;:18;;;;:26;16804:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;16895:3;:11;;16907:5;16895:18;;;;;;;;;;;;;;;;;;;;;;;;16888:25;;16717:204;;;;:::o;7149:279::-;7216:7;7225;7275:5;7253:3;:12;;:19;;;;:27;7245:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;7332:22;7357:3;:12;;7370:5;7357:19;;;;;;;;;;;;;;;;;;;;;;;;;;7332:44;;7395:5;:10;;;7407:5;:12;;;7387:33;;;;;7149:279;;;;;:::o;8646:319::-;8740:7;8760:16;8779:3;:12;;:17;8792:3;8779:17;;;;;;;;;;;;8760:36;;8827:1;8815:8;:13;;8830:12;8807:36;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;8897:3;:12;;8921:1;8910:8;:12;;;;:::i;:::-;8897:26;;;;;;;;;;;;;;;;;;;;;;;;;;:33;;;8890:40;;;8646:319;;;;;:::o;16264:109::-;16320:7;16347:3;:11;;:18;;;;16340:25;;16264:109;;;:::o;50716:250::-;50812:18;50818:2;50822:7;50812:5;:18::i;:::-;50849:54;50880:1;50884:2;50888:7;50897:5;50849:22;:54::i;:::-;50841:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;50716:250;;;:::o;54680:843::-;54801:4;54827:15;:2;:13;;;:15::i;:::-;54823:693;;;54879:2;54863:36;;;54900:12;:10;:12::i;:::-;54914:4;54920:7;54929:5;54863:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;54859:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55126:1;55109:6;:13;:18;55105:341;;;55152:60;;;;;;;;;;:::i;:::-;;;;;;;;55105:341;55396:6;55390:13;55381:6;55377:2;55373:15;55366:38;54859:602;54996:45;;;54986:55;;;:6;:55;;;;54979:62;;;;;54823:693;55500:4;55493:11;;54680:843;;;;;;;:::o;6464:125::-;6535:4;6580:1;6559:3;:12;;:17;6572:3;6559:17;;;;;;;;;;;;:22;;6552:29;;6464:125;;;;:::o;14419:1544::-;14485:4;14603:18;14624:3;:12;;:19;14637:5;14624:19;;;;;;;;;;;;14603:40;;14674:1;14660:10;:15;14656:1300;;15022:21;15059:1;15046:10;:14;;;;:::i;:::-;15022:38;;15075:17;15116:1;15095:3;:11;;:18;;;;:22;;;;:::i;:::-;15075:42;;15362:17;15382:3;:11;;15394:9;15382:22;;;;;;;;;;;;;;;;;;;;;;;;15362:42;;15528:9;15499:3;:11;;15511:13;15499:26;;;;;;;;;;;;;;;;;;;;;;;:38;;;;15647:1;15631:13;:17;;;;:::i;:::-;15605:3;:12;;:23;15618:9;15605:23;;;;;;;;;;;:43;;;;15757:3;:11;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15852:3;:12;;:19;15865:5;15852:19;;;;;;;;;;;15845:26;;;15895:4;15888:11;;;;;;;;14656:1300;15939:5;15932:12;;;14419:1544;;;;;:::o;13829:414::-;13892:4;13914:21;13924:3;13929:5;13914:9;:21::i;:::-;13909:327;;13952:3;:11;;13969:5;13952:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14135:3;:11;;:18;;;;14113:3;:12;;:19;14126:5;14113:19;;;;;;;;;;;:40;;;;14175:4;14168:11;;;;13909:327;14219:5;14212:12;;13829:414;;;;;:::o;3964:692::-;4040:4;4156:16;4175:3;:12;;:17;4188:3;4175:17;;;;;;;;;;;;4156:36;;4221:1;4209:8;:13;4205:444;;;4276:3;:12;;4294:38;;;;;;;;4311:3;4294:38;;;;4324:5;4294:38;;;4276:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4491:3;:12;;:19;;;;4471:3;:12;;:17;4484:3;4471:17;;;;;;;;;;;:39;;;;4532:4;4525:11;;;;;4205:444;4605:5;4569:3;:12;;4593:1;4582:8;:12;;;;:::i;:::-;4569:26;;;;;;;;;;;;;;;;;;;;;;;;;;:33;;:41;;;;4632:5;4625:12;;;3964:692;;;;;;:::o;51302:404::-;51396:1;51382:16;;:2;:16;;;;51374:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;51455:16;51463:7;51455;:16::i;:::-;51454:17;51446:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;51517:45;51546:1;51550:2;51554:7;51517:20;:45::i;:::-;51575:30;51597:7;51575:13;:17;51589:2;51575:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;51618:29;51635:7;51644:2;51618:12;:16;;:29;;;;;:::i;:::-;;51690:7;51686:2;51665:33;;51682:1;51665:33;;;;;;;;;;;;51302:404;;:::o;22631:422::-;22691:4;22899:12;23010:7;22998:20;22990:28;;23044:1;23037:4;:8;23030:15;;;22631:422;;;:::o;16049:129::-;16122:4;16169:1;16146:3;:12;;:19;16159:5;16146:19;;;;;;;;;;;;:24;;16139:31;;16049:129;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:622:1:-;;145:80;160:64;217:6;160:64;:::i;:::-;145:80;:::i;:::-;136:89;;245:5;273:6;266:5;259:21;299:4;292:5;288:16;281:23;;324:6;374:3;366:4;358:6;354:17;349:3;345:27;342:36;339:2;;;391:1;388;381:12;339:2;419:1;404:236;429:6;426:1;423:13;404:236;;;496:3;524:37;557:3;545:10;524:37;:::i;:::-;519:3;512:50;591:4;586:3;582:14;575:21;;625:4;620:3;616:14;609:21;;464:176;451:1;448;444:9;439:14;;404:236;;;408:14;126:520;;;;;;;:::o;652:342::-;;754:64;769:48;810:6;769:48;:::i;:::-;754:64;:::i;:::-;745:73;;841:6;834:5;827:21;879:4;872:5;868:16;917:3;908:6;903:3;899:16;896:25;893:2;;;934:1;931;924:12;893:2;947:41;981:6;976:3;971;947:41;:::i;:::-;735:259;;;;;;:::o;1000:344::-;;1103:65;1118:49;1160:6;1118:49;:::i;:::-;1103:65;:::i;:::-;1094:74;;1191:6;1184:5;1177:21;1229:4;1222:5;1218:16;1267:3;1258:6;1253:3;1249:16;1246:25;1243:2;;;1284:1;1281;1274:12;1243:2;1297:41;1331:6;1326:3;1321;1297:41;:::i;:::-;1084:260;;;;;;:::o;1350:139::-;;1434:6;1421:20;1412:29;;1450:33;1477:5;1450:33;:::i;:::-;1402:87;;;;:::o;1495:143::-;;1583:6;1577:13;1568:22;;1599:33;1626:5;1599:33;:::i;:::-;1558:80;;;;:::o;1661:303::-;;1781:3;1774:4;1766:6;1762:17;1758:27;1748:2;;1799:1;1796;1789:12;1748:2;1839:6;1826:20;1864:94;1954:3;1946:6;1939:4;1931:6;1927:17;1864:94;:::i;:::-;1855:103;;1738:226;;;;;:::o;1970:133::-;;2051:6;2038:20;2029:29;;2067:30;2091:5;2067:30;:::i;:::-;2019:84;;;;:::o;2109:137::-;;2192:6;2179:20;2170:29;;2208:32;2234:5;2208:32;:::i;:::-;2160:86;;;;:::o;2252:141::-;;2339:6;2333:13;2324:22;;2355:32;2381:5;2355:32;:::i;:::-;2314:79;;;;:::o;2412:271::-;;2516:3;2509:4;2501:6;2497:17;2493:27;2483:2;;2534:1;2531;2524:12;2483:2;2574:6;2561:20;2599:78;2673:3;2665:6;2658:4;2650:6;2646:17;2599:78;:::i;:::-;2590:87;;2473:210;;;;;:::o;2703:273::-;;2808:3;2801:4;2793:6;2789:17;2785:27;2775:2;;2826:1;2823;2816:12;2775:2;2866:6;2853:20;2891:79;2966:3;2958:6;2951:4;2943:6;2939:17;2891:79;:::i;:::-;2882:88;;2765:211;;;;;:::o;2982:139::-;;3066:6;3053:20;3044:29;;3082:33;3109:5;3082:33;:::i;:::-;3034:87;;;;:::o;3127:143::-;;3215:6;3209:13;3200:22;;3231:33;3258:5;3231:33;:::i;:::-;3190:80;;;;:::o;3276:262::-;;3384:2;3372:9;3363:7;3359:23;3355:32;3352:2;;;3400:1;3397;3390:12;3352:2;3443:1;3468:53;3513:7;3504:6;3493:9;3489:22;3468:53;:::i;:::-;3458:63;;3414:117;3342:196;;;;:::o;3544:284::-;;3663:2;3651:9;3642:7;3638:23;3634:32;3631:2;;;3679:1;3676;3669:12;3631:2;3722:1;3747:64;3803:7;3794:6;3783:9;3779:22;3747:64;:::i;:::-;3737:74;;3693:128;3621:207;;;;:::o;3834:407::-;;;3959:2;3947:9;3938:7;3934:23;3930:32;3927:2;;;3975:1;3972;3965:12;3927:2;4018:1;4043:53;4088:7;4079:6;4068:9;4064:22;4043:53;:::i;:::-;4033:63;;3989:117;4145:2;4171:53;4216:7;4207:6;4196:9;4192:22;4171:53;:::i;:::-;4161:63;;4116:118;3917:324;;;;;:::o;4247:552::-;;;;4389:2;4377:9;4368:7;4364:23;4360:32;4357:2;;;4405:1;4402;4395:12;4357:2;4448:1;4473:53;4518:7;4509:6;4498:9;4494:22;4473:53;:::i;:::-;4463:63;;4419:117;4575:2;4601:53;4646:7;4637:6;4626:9;4622:22;4601:53;:::i;:::-;4591:63;;4546:118;4703:2;4729:53;4774:7;4765:6;4754:9;4750:22;4729:53;:::i;:::-;4719:63;;4674:118;4347:452;;;;;:::o;4805:809::-;;;;;4973:3;4961:9;4952:7;4948:23;4944:33;4941:2;;;4990:1;4987;4980:12;4941:2;5033:1;5058:53;5103:7;5094:6;5083:9;5079:22;5058:53;:::i;:::-;5048:63;;5004:117;5160:2;5186:53;5231:7;5222:6;5211:9;5207:22;5186:53;:::i;:::-;5176:63;;5131:118;5288:2;5314:53;5359:7;5350:6;5339:9;5335:22;5314:53;:::i;:::-;5304:63;;5259:118;5444:2;5433:9;5429:18;5416:32;5475:18;5467:6;5464:30;5461:2;;;5507:1;5504;5497:12;5461:2;5535:62;5589:7;5580:6;5569:9;5565:22;5535:62;:::i;:::-;5525:72;;5387:220;4931:683;;;;;;;:::o;5620:401::-;;;5742:2;5730:9;5721:7;5717:23;5713:32;5710:2;;;5758:1;5755;5748:12;5710:2;5801:1;5826:53;5871:7;5862:6;5851:9;5847:22;5826:53;:::i;:::-;5816:63;;5772:117;5928:2;5954:50;5996:7;5987:6;5976:9;5972:22;5954:50;:::i;:::-;5944:60;;5899:115;5700:321;;;;;:::o;6027:407::-;;;6152:2;6140:9;6131:7;6127:23;6123:32;6120:2;;;6168:1;6165;6158:12;6120:2;6211:1;6236:53;6281:7;6272:6;6261:9;6257:22;6236:53;:::i;:::-;6226:63;;6182:117;6338:2;6364:53;6409:7;6400:6;6389:9;6385:22;6364:53;:::i;:::-;6354:63;;6309:118;6110:324;;;;;:::o;6440:405::-;;6573:2;6561:9;6552:7;6548:23;6544:32;6541:2;;;6589:1;6586;6579:12;6541:2;6660:1;6649:9;6645:17;6632:31;6690:18;6682:6;6679:30;6676:2;;;6722:1;6719;6712:12;6676:2;6750:78;6820:7;6811:6;6800:9;6796:22;6750:78;:::i;:::-;6740:88;;6603:235;6531:314;;;;:::o;6851:260::-;;6958:2;6946:9;6937:7;6933:23;6929:32;6926:2;;;6974:1;6971;6964:12;6926:2;7017:1;7042:52;7086:7;7077:6;7066:9;7062:22;7042:52;:::i;:::-;7032:62;;6988:116;6916:195;;;;:::o;7117:282::-;;7235:2;7223:9;7214:7;7210:23;7206:32;7203:2;;;7251:1;7248;7241:12;7203:2;7294:1;7319:63;7374:7;7365:6;7354:9;7350:22;7319:63;:::i;:::-;7309:73;;7265:127;7193:206;;;;:::o;7405:375::-;;7523:2;7511:9;7502:7;7498:23;7494:32;7491:2;;;7539:1;7536;7529:12;7491:2;7610:1;7599:9;7595:17;7582:31;7640:18;7632:6;7629:30;7626:2;;;7672:1;7669;7662:12;7626:2;7700:63;7755:7;7746:6;7735:9;7731:22;7700:63;:::i;:::-;7690:73;;7553:220;7481:299;;;;:::o;7786:262::-;;7894:2;7882:9;7873:7;7869:23;7865:32;7862:2;;;7910:1;7907;7900:12;7862:2;7953:1;7978:53;8023:7;8014:6;8003:9;7999:22;7978:53;:::i;:::-;7968:63;;7924:117;7852:196;;;;:::o;8054:284::-;;8173:2;8161:9;8152:7;8148:23;8144:32;8141:2;;;8189:1;8186;8179:12;8141:2;8232:1;8257:64;8313:7;8304:6;8293:9;8289:22;8257:64;:::i;:::-;8247:74;;8203:128;8131:207;;;;:::o;8344:179::-;;8434:46;8476:3;8468:6;8434:46;:::i;:::-;8512:4;8507:3;8503:14;8489:28;;8424:99;;;;:::o;8529:118::-;8616:24;8634:5;8616:24;:::i;:::-;8611:3;8604:37;8594:53;;:::o;8653:157::-;8758:45;8778:24;8796:5;8778:24;:::i;:::-;8758:45;:::i;:::-;8753:3;8746:58;8736:74;;:::o;8846:732::-;;8994:54;9042:5;8994:54;:::i;:::-;9064:86;9143:6;9138:3;9064:86;:::i;:::-;9057:93;;9174:56;9224:5;9174:56;:::i;:::-;9253:7;9284:1;9269:284;9294:6;9291:1;9288:13;9269:284;;;9370:6;9364:13;9397:63;9456:3;9441:13;9397:63;:::i;:::-;9390:70;;9483:60;9536:6;9483:60;:::i;:::-;9473:70;;9329:224;9316:1;9313;9309:9;9304:14;;9269:284;;;9273:14;9569:3;9562:10;;8970:608;;;;;;;:::o;9584:109::-;9665:21;9680:5;9665:21;:::i;:::-;9660:3;9653:34;9643:50;;:::o;9699:118::-;9786:24;9804:5;9786:24;:::i;:::-;9781:3;9774:37;9764:53;;:::o;9823:360::-;;9937:38;9969:5;9937:38;:::i;:::-;9991:70;10054:6;10049:3;9991:70;:::i;:::-;9984:77;;10070:52;10115:6;10110:3;10103:4;10096:5;10092:16;10070:52;:::i;:::-;10147:29;10169:6;10147:29;:::i;:::-;10142:3;10138:39;10131:46;;9913:270;;;;;:::o;10189:364::-;;10305:39;10338:5;10305:39;:::i;:::-;10360:71;10424:6;10419:3;10360:71;:::i;:::-;10353:78;;10440:52;10485:6;10480:3;10473:4;10466:5;10462:16;10440:52;:::i;:::-;10517:29;10539:6;10517:29;:::i;:::-;10512:3;10508:39;10501:46;;10281:272;;;;;:::o;10559:377::-;;10693:39;10726:5;10693:39;:::i;:::-;10748:89;10830:6;10825:3;10748:89;:::i;:::-;10741:96;;10846:52;10891:6;10886:3;10879:4;10872:5;10868:16;10846:52;:::i;:::-;10923:6;10918:3;10914:16;10907:23;;10669:267;;;;;:::o;10942:366::-;;11105:67;11169:2;11164:3;11105:67;:::i;:::-;11098:74;;11202:34;11198:1;11193:3;11189:11;11182:55;11268:4;11263:2;11258:3;11254:12;11247:26;11299:2;11294:3;11290:12;11283:19;;11088:220;;;:::o;11314:382::-;;11477:67;11541:2;11536:3;11477:67;:::i;:::-;11470:74;;11574:34;11570:1;11565:3;11561:11;11554:55;11640:20;11635:2;11630:3;11626:12;11619:42;11687:2;11682:3;11678:12;11671:19;;11460:236;;;:::o;11702:370::-;;11865:67;11929:2;11924:3;11865:67;:::i;:::-;11858:74;;11962:34;11958:1;11953:3;11949:11;11942:55;12028:8;12023:2;12018:3;12014:12;12007:30;12063:2;12058:3;12054:12;12047:19;;11848:224;;;:::o;12078:326::-;;12241:67;12305:2;12300:3;12241:67;:::i;:::-;12234:74;;12338:30;12334:1;12329:3;12325:11;12318:51;12395:2;12390:3;12386:12;12379:19;;12224:180;;;:::o;12410:368::-;;12573:67;12637:2;12632:3;12573:67;:::i;:::-;12566:74;;12670:34;12666:1;12661:3;12657:11;12650:55;12736:6;12731:2;12726:3;12722:12;12715:28;12769:2;12764:3;12760:12;12753:19;;12556:222;;;:::o;12784:323::-;;12947:67;13011:2;13006:3;12947:67;:::i;:::-;12940:74;;13044:27;13040:1;13035:3;13031:11;13024:48;13098:2;13093:3;13089:12;13082:19;;12930:177;;;:::o;13113:322::-;;13276:67;13340:2;13335:3;13276:67;:::i;:::-;13269:74;;13373:26;13369:1;13364:3;13360:11;13353:47;13426:2;13421:3;13417:12;13410:19;;13259:176;;;:::o;13441:323::-;;13604:67;13668:2;13663:3;13604:67;:::i;:::-;13597:74;;13701:27;13697:1;13692:3;13688:11;13681:48;13755:2;13750:3;13746:12;13739:19;;13587:177;;;:::o;13770:376::-;;13933:67;13997:2;13992:3;13933:67;:::i;:::-;13926:74;;14030:34;14026:1;14021:3;14017:11;14010:55;14096:14;14091:2;14086:3;14082:12;14075:36;14137:2;14132:3;14128:12;14121:19;;13916:230;;;:::o;14152:388::-;;14315:67;14379:2;14374:3;14315:67;:::i;:::-;14308:74;;14412:34;14408:1;14403:3;14399:11;14392:55;14478:26;14473:2;14468:3;14464:12;14457:48;14531:2;14526:3;14522:12;14515:19;;14298:242;;;:::o;14546:374::-;;14709:67;14773:2;14768:3;14709:67;:::i;:::-;14702:74;;14806:34;14802:1;14797:3;14793:11;14786:55;14872:12;14867:2;14862:3;14858:12;14851:34;14911:2;14906:3;14902:12;14895:19;;14692:228;;;:::o;14926:324::-;;15089:67;15153:2;15148:3;15089:67;:::i;:::-;15082:74;;15186:28;15182:1;15177:3;15173:11;15166:49;15241:2;15236:3;15232:12;15225:19;;15072:178;;;:::o;15256:366::-;;15419:67;15483:2;15478:3;15419:67;:::i;:::-;15412:74;;15516:34;15512:1;15507:3;15503:11;15496:55;15582:4;15577:2;15572:3;15568:12;15561:26;15613:2;15608:3;15604:12;15597:19;;15402:220;;;:::o;15628:330::-;;15791:67;15855:2;15850:3;15791:67;:::i;:::-;15784:74;;15888:34;15884:1;15879:3;15875:11;15868:55;15949:2;15944:3;15940:12;15933:19;;15774:184;;;:::o;15964:376::-;;16127:67;16191:2;16186:3;16127:67;:::i;:::-;16120:74;;16224:34;16220:1;16215:3;16211:11;16204:55;16290:14;16285:2;16280:3;16276:12;16269:36;16331:2;16326:3;16322:12;16315:19;;16110:230;;;:::o;16346:330::-;;16509:67;16573:2;16568:3;16509:67;:::i;:::-;16502:74;;16606:34;16602:1;16597:3;16593:11;16586:55;16667:2;16662:3;16658:12;16651:19;;16492:184;;;:::o;16682:373::-;;16845:67;16909:2;16904:3;16845:67;:::i;:::-;16838:74;;16942:34;16938:1;16933:3;16929:11;16922:55;17008:11;17003:2;16998:3;16994:12;16987:33;17046:2;17041:3;17037:12;17030:19;;16828:227;;;:::o;17061:379::-;;17224:67;17288:2;17283:3;17224:67;:::i;:::-;17217:74;;17321:34;17317:1;17312:3;17308:11;17301:55;17387:17;17382:2;17377:3;17373:12;17366:39;17431:2;17426:3;17422:12;17415:19;;17207:233;;;:::o;17446:365::-;;17609:67;17673:2;17668:3;17609:67;:::i;:::-;17602:74;;17706:34;17702:1;17697:3;17693:11;17686:55;17772:3;17767:2;17762:3;17758:12;17751:25;17802:2;17797:3;17793:12;17786:19;;17592:219;;;:::o;17817:381::-;;17980:67;18044:2;18039:3;17980:67;:::i;:::-;17973:74;;18077:34;18073:1;18068:3;18064:11;18057:55;18143:19;18138:2;18133:3;18129:12;18122:41;18189:2;18184:3;18180:12;18173:19;;17963:235;;;:::o;18204:367::-;;18367:67;18431:2;18426:3;18367:67;:::i;:::-;18360:74;;18464:34;18460:1;18455:3;18451:11;18444:55;18530:5;18525:2;18520:3;18516:12;18509:27;18562:2;18557:3;18553:12;18546:19;;18350:221;;;:::o;18577:312::-;;18740:67;18804:2;18799:3;18740:67;:::i;:::-;18733:74;;18837:16;18833:1;18828:3;18824:11;18817:37;18880:2;18875:3;18871:12;18864:19;;18723:166;;;:::o;18895:316::-;;19058:67;19122:2;19117:3;19058:67;:::i;:::-;19051:74;;19155:20;19151:1;19146:3;19142:11;19135:41;19202:2;19197:3;19193:12;19186:19;;19041:170;;;:::o;19217:322::-;;19380:67;19444:2;19439:3;19380:67;:::i;:::-;19373:74;;19477:26;19473:1;19468:3;19464:11;19457:47;19530:2;19525:3;19521:12;19514:19;;19363:176;;;:::o;19545:108::-;19622:24;19640:5;19622:24;:::i;:::-;19617:3;19610:37;19600:53;;:::o;19659:118::-;19746:24;19764:5;19746:24;:::i;:::-;19741:3;19734:37;19724:53;;:::o;19783:157::-;19888:45;19908:24;19926:5;19908:24;:::i;:::-;19888:45;:::i;:::-;19883:3;19876:58;19866:74;;:::o;19946:538::-;;20129:75;20200:3;20191:6;20129:75;:::i;:::-;20229:2;20224:3;20220:12;20213:19;;20242:75;20313:3;20304:6;20242:75;:::i;:::-;20342:2;20337:3;20333:12;20326:19;;20355:75;20426:3;20417:6;20355:75;:::i;:::-;20455:2;20450:3;20446:12;20439:19;;20475:3;20468:10;;20118:366;;;;;;:::o;20490:435::-;;20692:95;20783:3;20774:6;20692:95;:::i;:::-;20685:102;;20804:95;20895:3;20886:6;20804:95;:::i;:::-;20797:102;;20916:3;20909:10;;20674:251;;;;;:::o;20931:222::-;;21062:2;21051:9;21047:18;21039:26;;21075:71;21143:1;21132:9;21128:17;21119:6;21075:71;:::i;:::-;21029:124;;;;:::o;21159:640::-;;21392:3;21381:9;21377:19;21369:27;;21406:71;21474:1;21463:9;21459:17;21450:6;21406:71;:::i;:::-;21487:72;21555:2;21544:9;21540:18;21531:6;21487:72;:::i;:::-;21569;21637:2;21626:9;21622:18;21613:6;21569:72;:::i;:::-;21688:9;21682:4;21678:20;21673:2;21662:9;21658:18;21651:48;21716:76;21787:4;21778:6;21716:76;:::i;:::-;21708:84;;21359:440;;;;;;;:::o;21805:332::-;;21964:2;21953:9;21949:18;21941:26;;21977:71;22045:1;22034:9;22030:17;22021:6;21977:71;:::i;:::-;22058:72;22126:2;22115:9;22111:18;22102:6;22058:72;:::i;:::-;21931:206;;;;;:::o;22143:373::-;;22324:2;22313:9;22309:18;22301:26;;22373:9;22367:4;22363:20;22359:1;22348:9;22344:17;22337:47;22401:108;22504:4;22495:6;22401:108;:::i;:::-;22393:116;;22291:225;;;;:::o;22522:210::-;;22647:2;22636:9;22632:18;22624:26;;22660:65;22722:1;22711:9;22707:17;22698:6;22660:65;:::i;:::-;22614:118;;;;:::o;22738:222::-;;22869:2;22858:9;22854:18;22846:26;;22882:71;22950:1;22939:9;22935:17;22926:6;22882:71;:::i;:::-;22836:124;;;;:::o;22966:313::-;;23117:2;23106:9;23102:18;23094:26;;23166:9;23160:4;23156:20;23152:1;23141:9;23137:17;23130:47;23194:78;23267:4;23258:6;23194:78;:::i;:::-;23186:86;;23084:195;;;;:::o;23285:419::-;;23489:2;23478:9;23474:18;23466:26;;23538:9;23532:4;23528:20;23524:1;23513:9;23509:17;23502:47;23566:131;23692:4;23566:131;:::i;:::-;23558:139;;23456:248;;;:::o;23710:419::-;;23914:2;23903:9;23899:18;23891:26;;23963:9;23957:4;23953:20;23949:1;23938:9;23934:17;23927:47;23991:131;24117:4;23991:131;:::i;:::-;23983:139;;23881:248;;;:::o;24135:419::-;;24339:2;24328:9;24324:18;24316:26;;24388:9;24382:4;24378:20;24374:1;24363:9;24359:17;24352:47;24416:131;24542:4;24416:131;:::i;:::-;24408:139;;24306:248;;;:::o;24560:419::-;;24764:2;24753:9;24749:18;24741:26;;24813:9;24807:4;24803:20;24799:1;24788:9;24784:17;24777:47;24841:131;24967:4;24841:131;:::i;:::-;24833:139;;24731:248;;;:::o;24985:419::-;;25189:2;25178:9;25174:18;25166:26;;25238:9;25232:4;25228:20;25224:1;25213:9;25209:17;25202:47;25266:131;25392:4;25266:131;:::i;:::-;25258:139;;25156:248;;;:::o;25410:419::-;;25614:2;25603:9;25599:18;25591:26;;25663:9;25657:4;25653:20;25649:1;25638:9;25634:17;25627:47;25691:131;25817:4;25691:131;:::i;:::-;25683:139;;25581:248;;;:::o;25835:419::-;;26039:2;26028:9;26024:18;26016:26;;26088:9;26082:4;26078:20;26074:1;26063:9;26059:17;26052:47;26116:131;26242:4;26116:131;:::i;:::-;26108:139;;26006:248;;;:::o;26260:419::-;;26464:2;26453:9;26449:18;26441:26;;26513:9;26507:4;26503:20;26499:1;26488:9;26484:17;26477:47;26541:131;26667:4;26541:131;:::i;:::-;26533:139;;26431:248;;;:::o;26685:419::-;;26889:2;26878:9;26874:18;26866:26;;26938:9;26932:4;26928:20;26924:1;26913:9;26909:17;26902:47;26966:131;27092:4;26966:131;:::i;:::-;26958:139;;26856:248;;;:::o;27110:419::-;;27314:2;27303:9;27299:18;27291:26;;27363:9;27357:4;27353:20;27349:1;27338:9;27334:17;27327:47;27391:131;27517:4;27391:131;:::i;:::-;27383:139;;27281:248;;;:::o;27535:419::-;;27739:2;27728:9;27724:18;27716:26;;27788:9;27782:4;27778:20;27774:1;27763:9;27759:17;27752:47;27816:131;27942:4;27816:131;:::i;:::-;27808:139;;27706:248;;;:::o;27960:419::-;;28164:2;28153:9;28149:18;28141:26;;28213:9;28207:4;28203:20;28199:1;28188:9;28184:17;28177:47;28241:131;28367:4;28241:131;:::i;:::-;28233:139;;28131:248;;;:::o;28385:419::-;;28589:2;28578:9;28574:18;28566:26;;28638:9;28632:4;28628:20;28624:1;28613:9;28609:17;28602:47;28666:131;28792:4;28666:131;:::i;:::-;28658:139;;28556:248;;;:::o;28810:419::-;;29014:2;29003:9;28999:18;28991:26;;29063:9;29057:4;29053:20;29049:1;29038:9;29034:17;29027:47;29091:131;29217:4;29091:131;:::i;:::-;29083:139;;28981:248;;;:::o;29235:419::-;;29439:2;29428:9;29424:18;29416:26;;29488:9;29482:4;29478:20;29474:1;29463:9;29459:17;29452:47;29516:131;29642:4;29516:131;:::i;:::-;29508:139;;29406:248;;;:::o;29660:419::-;;29864:2;29853:9;29849:18;29841:26;;29913:9;29907:4;29903:20;29899:1;29888:9;29884:17;29877:47;29941:131;30067:4;29941:131;:::i;:::-;29933:139;;29831:248;;;:::o;30085:419::-;;30289:2;30278:9;30274:18;30266:26;;30338:9;30332:4;30328:20;30324:1;30313:9;30309:17;30302:47;30366:131;30492:4;30366:131;:::i;:::-;30358:139;;30256:248;;;:::o;30510:419::-;;30714:2;30703:9;30699:18;30691:26;;30763:9;30757:4;30753:20;30749:1;30738:9;30734:17;30727:47;30791:131;30917:4;30791:131;:::i;:::-;30783:139;;30681:248;;;:::o;30935:419::-;;31139:2;31128:9;31124:18;31116:26;;31188:9;31182:4;31178:20;31174:1;31163:9;31159:17;31152:47;31216:131;31342:4;31216:131;:::i;:::-;31208:139;;31106:248;;;:::o;31360:419::-;;31564:2;31553:9;31549:18;31541:26;;31613:9;31607:4;31603:20;31599:1;31588:9;31584:17;31577:47;31641:131;31767:4;31641:131;:::i;:::-;31633:139;;31531:248;;;:::o;31785:419::-;;31989:2;31978:9;31974:18;31966:26;;32038:9;32032:4;32028:20;32024:1;32013:9;32009:17;32002:47;32066:131;32192:4;32066:131;:::i;:::-;32058:139;;31956:248;;;:::o;32210:419::-;;32414:2;32403:9;32399:18;32391:26;;32463:9;32457:4;32453:20;32449:1;32438:9;32434:17;32427:47;32491:131;32617:4;32491:131;:::i;:::-;32483:139;;32381:248;;;:::o;32635:419::-;;32839:2;32828:9;32824:18;32816:26;;32888:9;32882:4;32878:20;32874:1;32863:9;32859:17;32852:47;32916:131;33042:4;32916:131;:::i;:::-;32908:139;;32806:248;;;:::o;33060:419::-;;33264:2;33253:9;33249:18;33241:26;;33313:9;33307:4;33303:20;33299:1;33288:9;33284:17;33277:47;33341:131;33467:4;33341:131;:::i;:::-;33333:139;;33231:248;;;:::o;33485:222::-;;33616:2;33605:9;33601:18;33593:26;;33629:71;33697:1;33686:9;33682:17;33673:6;33629:71;:::i;:::-;33583:124;;;;:::o;33713:283::-;;33779:2;33773:9;33763:19;;33821:4;33813:6;33809:17;33928:6;33916:10;33913:22;33892:18;33880:10;33877:34;33874:62;33871:2;;;33939:18;;:::i;:::-;33871:2;33979:10;33975:2;33968:22;33753:243;;;;:::o;34002:311::-;;34169:18;34161:6;34158:30;34155:2;;;34191:18;;:::i;:::-;34155:2;34241:4;34233:6;34229:17;34221:25;;34301:4;34295;34291:15;34283:23;;34084:229;;;:::o;34319:331::-;;34470:18;34462:6;34459:30;34456:2;;;34492:18;;:::i;:::-;34456:2;34577:4;34573:9;34566:4;34558:6;34554:17;34550:33;34542:41;;34638:4;34632;34628:15;34620:23;;34385:265;;;:::o;34656:332::-;;34808:18;34800:6;34797:30;34794:2;;;34830:18;;:::i;:::-;34794:2;34915:4;34911:9;34904:4;34896:6;34892:17;34888:33;34880:41;;34976:4;34970;34966:15;34958:23;;34723:265;;;:::o;34994:132::-;;35084:3;35076:11;;35114:4;35109:3;35105:14;35097:22;;35066:60;;;:::o;35132:114::-;;35233:5;35227:12;35217:22;;35206:40;;;:::o;35252:98::-;;35337:5;35331:12;35321:22;;35310:40;;;:::o;35356:99::-;;35442:5;35436:12;35426:22;;35415:40;;;:::o;35461:113::-;;35563:4;35558:3;35554:14;35546:22;;35536:38;;;:::o;35580:184::-;;35713:6;35708:3;35701:19;35753:4;35748:3;35744:14;35729:29;;35691:73;;;;:::o;35770:168::-;;35887:6;35882:3;35875:19;35927:4;35922:3;35918:14;35903:29;;35865:73;;;;:::o;35944:169::-;;36062:6;36057:3;36050:19;36102:4;36097:3;36093:14;36078:29;;36040:73;;;;:::o;36119:148::-;;36258:3;36243:18;;36233:34;;;;:::o;36273:305::-;;36332:20;36350:1;36332:20;:::i;:::-;36327:25;;36366:20;36384:1;36366:20;:::i;:::-;36361:25;;36520:1;36452:66;36448:74;36445:1;36442:81;36439:2;;;36526:18;;:::i;:::-;36439:2;36570:1;36567;36563:9;36556:16;;36317:261;;;;:::o;36584:185::-;;36641:20;36659:1;36641:20;:::i;:::-;36636:25;;36675:20;36693:1;36675:20;:::i;:::-;36670:25;;36714:1;36704:2;;36719:18;;:::i;:::-;36704:2;36761:1;36758;36754:9;36749:14;;36626:143;;;;:::o;36775:191::-;;36835:20;36853:1;36835:20;:::i;:::-;36830:25;;36869:20;36887:1;36869:20;:::i;:::-;36864:25;;36908:1;36905;36902:8;36899:2;;;36913:18;;:::i;:::-;36899:2;36958:1;36955;36951:9;36943:17;;36820:146;;;;:::o;36972:96::-;;37038:24;37056:5;37038:24;:::i;:::-;37027:35;;37017:51;;;:::o;37074:90::-;;37151:5;37144:13;37137:21;37126:32;;37116:48;;;:::o;37170:77::-;;37236:5;37225:16;;37215:32;;;:::o;37253:149::-;;37329:66;37322:5;37318:78;37307:89;;37297:105;;;:::o;37408:126::-;;37485:42;37478:5;37474:54;37463:65;;37453:81;;;:::o;37540:77::-;;37606:5;37595:16;;37585:32;;;:::o;37623:154::-;37707:6;37702:3;37697;37684:30;37769:1;37760:6;37755:3;37751:16;37744:27;37674:103;;;:::o;37783:307::-;37851:1;37861:113;37875:6;37872:1;37869:13;37861:113;;;37960:1;37955:3;37951:11;37945:18;37941:1;37936:3;37932:11;37925:39;37897:2;37894:1;37890:10;37885:15;;37861:113;;;37992:6;37989:1;37986:13;37983:2;;;38072:1;38063:6;38058:3;38054:16;38047:27;37983:2;37832:258;;;;:::o;38096:320::-;;38177:1;38171:4;38167:12;38157:22;;38224:1;38218:4;38214:12;38245:18;38235:2;;38301:4;38293:6;38289:17;38279:27;;38235:2;38363;38355:6;38352:14;38332:18;38329:38;38326:2;;;38382:18;;:::i;:::-;38326:2;38147:269;;;;:::o;38422:233::-;;38484:24;38502:5;38484:24;:::i;:::-;38475:33;;38530:66;38523:5;38520:77;38517:2;;;38600:18;;:::i;:::-;38517:2;38647:1;38640:5;38636:13;38629:20;;38465:190;;;:::o;38661:100::-;;38729:26;38749:5;38729:26;:::i;:::-;38718:37;;38708:53;;;:::o;38767:94::-;;38835:20;38849:5;38835:20;:::i;:::-;38824:31;;38814:47;;;:::o;38867:79::-;;38935:5;38924:16;;38914:32;;;:::o;38952:176::-;;39001:20;39019:1;39001:20;:::i;:::-;38996:25;;39035:20;39053:1;39035:20;:::i;:::-;39030:25;;39074:1;39064:2;;39079:18;;:::i;:::-;39064:2;39120:1;39117;39113:9;39108:14;;38986:142;;;;:::o;39134:180::-;39182:77;39179:1;39172:88;39279:4;39276:1;39269:15;39303:4;39300:1;39293:15;39320:180;39368:77;39365:1;39358:88;39465:4;39462:1;39455:15;39489:4;39486:1;39479:15;39506:180;39554:77;39551:1;39544:88;39651:4;39648:1;39641:15;39675:4;39672:1;39665:15;39692:180;39740:77;39737:1;39730:88;39837:4;39834:1;39827:15;39861:4;39858:1;39851:15;39878:102;;39970:2;39966:7;39961:2;39954:5;39950:14;39946:28;39936:38;;39926:54;;;:::o;39986:94::-;;40067:5;40063:2;40059:14;40038:35;;40028:52;;;:::o;40086:122::-;40159:24;40177:5;40159:24;:::i;:::-;40152:5;40149:35;40139:2;;40198:1;40195;40188:12;40139:2;40129:79;:::o;40214:116::-;40284:21;40299:5;40284:21;:::i;:::-;40277:5;40274:32;40264:2;;40320:1;40317;40310:12;40264:2;40254:76;:::o;40336:120::-;40408:23;40425:5;40408:23;:::i;:::-;40401:5;40398:34;40388:2;;40446:1;40443;40436:12;40388:2;40378:78;:::o;40462:122::-;40535:24;40553:5;40535:24;:::i;:::-;40528:5;40525:35;40515:2;;40574:1;40571;40564:12;40515:2;40505:79;:::o

Swarm Source

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