ETH Price: $3,419.56 (+1.12%)
Gas: 5 Gwei

Token

PulsesOfImagination (POI)
 

Overview

Max Total Supply

1,024 POI

Holders

394

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
1 POI
0xa27be4084d7548d8019931877dd9bb75cc028696
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

The hash of every token will generate unique visions, put stains on them and pick one of the many color palettes.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
PulsesOfImagination

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-08-14
*/

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/contracts/utils/math/SafeMath.sol




pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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


//               __                   ___  _                 _           __  _         
//    ___  __ __/ /__ ___ ___   ___  / _/ (_)_ _  ___ ____ _(_)__  ___ _/ /_(_)__  ___ 
//   / _ \/ // / (_-</ -_|_-<  / _ \/ _/ / /  ' \/ _ `/ _ `/ / _ \/ _ `/ __/ / _ \/ _ \
//  / .__/\_,_/_/___/\__/___/  \___/_/  /_/_/_/_/\_,_/\_, /_/_//_/\_,_/\__/_/\___/_//_/
// /_/                                               /___/                             

pragma solidity ^0.8.0;


// SPDX-License-Identifier: MIT

contract PulsesOfImagination is ERC721, Ownable {
    using SafeMath for uint256;
    using Strings for uint256;
    uint public constant MAX_TOKENS = 1024;
    uint256 public constant TOKEN_PRICE = 10000000000000000; // 0.01 ETH
    uint public constant DEVELOPER_SHARE = 40;
    uint public constant ARTIST_SHARE = 40;
    uint public constant ADVISOR_SHARE = 20;
    uint public constant SHARE_SUM = 100;
    address public developerAddress = 0xf049ED4da9E12c6E2a0928fA6c975eBb60C872F3;
    address public artistAddress = 0xb7275Da969bCa3112D1fDBa03385eD2C02002642;
    address public constant ADVISOR_ADDRESS = 0x0b8F4C4E7626A91460dac057eB43e0de59d5b44F;
    string public script;
    string public scriptType = "p5js";
    bool public saleStarted = false;
    mapping (uint256 => uint256) public creationDates;

    constructor() ERC721("PulsesOfImagination","POI")  {
        setBaseURI("https://api.chromorphs.xyz/poi/json/");
    }
    
    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 mint(uint256 tokensNumber) public payable {
        require(saleStarted, "Sale is not active");
        require(totalSupply() < MAX_TOKENS, "Sale has already ended");
        require(tokensNumber > 0 && tokensNumber <= 20, "Tokens amount must be between 1 and 20");
        require(totalSupply().add(tokensNumber) <= MAX_TOKENS, "Exceeds MAX_TOKENS");
        require(msg.value == TOKEN_PRICE.mul(tokensNumber), "Ether value sent is not correct");

        for (uint i = 0; i < tokensNumber; i++) {
            uint mintIndex = totalSupply();
            _safeMint(msg.sender, mintIndex);
            creationDates[mintIndex] = block.number;
        }
    }
    
   function reserve(uint256 tokensNumber, address toAddress) public onlyOwner {
        require(totalSupply() < MAX_TOKENS, "There are no tokens left");
        require(totalSupply().add(tokensNumber) <= MAX_TOKENS, "Exceeds MAX_TOKENS");

        for (uint i = 0; i < tokensNumber; i++) {
            uint mintIndex = totalSupply();
            _safeMint(toAddress, mintIndex);
            creationDates[mintIndex] = block.number;
        }
    }
    
    function setScript(string memory _script) public onlyOwner {
        script = _script;
    }
    
    function setScriptType(string memory _scriptType) public onlyOwner {
        script = _scriptType;
    }
    
    function setDeveloperAddress(address _developerAddress) public onlyOwner {
        developerAddress = _developerAddress;
    }
    
    function setArtistAddress(address _artistAddress) public onlyOwner {
        artistAddress = _artistAddress;
    }
    
    function setBaseURI(string memory baseURI) public onlyOwner {
        _setBaseURI(baseURI);
    }
    
    function flipSaleState() public onlyOwner {
        saleStarted = !saleStarted;
    }
    
    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;
        uint toDeveloper = balance.mul(DEVELOPER_SHARE).div(SHARE_SUM);
        uint toArtist = balance.mul(ARTIST_SHARE).div(SHARE_SUM);
        uint toAdvisor = balance.mul(ADVISOR_SHARE).div(SHARE_SUM);
        payable(developerAddress).transfer(toDeveloper);
        payable(artistAddress).transfer(toArtist);
        payable(ADVISOR_ADDRESS).transfer(toAdvisor);
        assert(address(this).balance == 0);
    }
}

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":"ADVISOR_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ADVISOR_SHARE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ARTIST_SHARE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEVELOPER_SHARE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SHARE_SUM","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOKEN_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[],"name":"artistAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"creationDates","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"developerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipSaleState","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":[{"internalType":"uint256","name":"tokensNumber","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","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":"uint256","name":"tokensNumber","type":"uint256"},{"internalType":"address","name":"toAddress","type":"address"}],"name":"reserve","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":"saleStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"address","name":"_artistAddress","type":"address"}],"name":"setArtistAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_developerAddress","type":"address"}],"name":"setDeveloperAddress","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":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwner","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"}]

608060405273f049ed4da9e12c6e2a0928fa6c975ebb60c872f3600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073b7275da969bca3112d1fdba03385ed2c02002642600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040518060400160405280600481526020017f70356a7300000000000000000000000000000000000000000000000000000000815250600e9080519060200190620000fb92919062000533565b506000600f60006101000a81548160ff0219169083151502179055503480156200012457600080fd5b506040518060400160405280601381526020017f50756c7365734f66496d6167696e6174696f6e000000000000000000000000008152506040518060400160405280600381526020017f504f490000000000000000000000000000000000000000000000000000000000815250620001c27f01ffc9a7000000000000000000000000000000000000000000000000000000006200036a60201b60201c565b8160069080519060200190620001da92919062000533565b508060079080519060200190620001f392919062000533565b50620002257f80ac58cd000000000000000000000000000000000000000000000000000000006200036a60201b60201c565b620002567f5b5e139f000000000000000000000000000000000000000000000000000000006200036a60201b60201c565b620002877f780e9d63000000000000000000000000000000000000000000000000000000006200036a60201b60201c565b505060006200029b6200044260201b60201c565b905080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35062000364604051806060016040528060248152602001620053f5602491396200044a60201b60201c565b62000721565b63ffffffff60e01b817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415620003d6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003cd9062000667565b60405180910390fd5b6001600080837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600033905090565b6200045a6200044260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1662000480620004ed60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620004d9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004d09062000689565b60405180910390fd5b620004ea816200051760201b60201c565b50565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b80600990805190602001906200052f92919062000533565b5050565b8280546200054190620006bc565b90600052602060002090601f016020900481019282620005655760008555620005b1565b82601f106200058057805160ff1916838001178555620005b1565b82800160010185558215620005b1579182015b82811115620005b057825182559160200191906001019062000593565b5b509050620005c09190620005c4565b5090565b5b80821115620005df576000816000905550600101620005c5565b5090565b6000620005f2601c83620006ab565b91507f4552433136353a20696e76616c696420696e74657266616365206964000000006000830152602082019050919050565b600062000634602083620006ab565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b600060208201905081810360008301526200068281620005e3565b9050919050565b60006020820190508181036000830152620006a48162000625565b9050919050565b600082825260208201905092915050565b60006002820490506001821680620006d557607f821691505b60208210811415620006ec57620006eb620006f2565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b614cc480620007316000396000f3fe6080604052600436106102675760003560e01c80638462151c11610144578063c8a01226116100b6578063e406a6b91161007a578063e406a6b914610914578063e985e9c51461093f578063ebe9eb9f1461097c578063f069062a146109a7578063f2fde38b146109d2578063f47c84c5146109fb57610267565b8063c8a012261461082d578063caccd7f71461086a578063d2d8cb6714610895578063d7eb3f3a146108c0578063dcc345f2146108eb57610267565b8063a22cb46511610108578063a22cb4651461070d578063a22e4faa14610736578063a38643971461075f578063b88d4fde1461079c578063c623c543146107c5578063c87b56dd146107f057610267565b80638462151c146106335780638da5cb5b1461067057806394bc2ae71461069b57806395d89b41146106c6578063a0712d68146106f157610267565b806342842e0e116101dd57806362aee544116101a157806362aee544146105235780636352211e1461054e5780636c0360eb1461058b57806370a08231146105b6578063715018a6146105f357806378a4ab851461060a57610267565b806342842e0e1461043e5780634f6ccce71461046757806355f804b3146104a45780635c474f9e146104cd5780635d69dbdd146104f857610267565b8063171ce0941161022f578063171ce0941461036357806318160ddd1461038c57806323b872dd146103b75780632f745c59146103e057806334918dfd1461041d5780633ccfd60b1461043457610267565b806301ffc9a71461026c57806303339bcb146102a957806306fdde03146102d2578063081812fc146102fd578063095ea7b31461033a575b600080fd5b34801561027857600080fd5b50610293600480360381019061028e9190613878565b610a26565b6040516102a09190614400565b60405180910390f35b3480156102b557600080fd5b506102d060048036038101906102cb9190613934565b610a8d565b005b3480156102de57600080fd5b506102e7610c04565b6040516102f49190614436565b60405180910390f35b34801561030957600080fd5b50610324600480360381019061031f919061390b565b610c96565b6040516103319190614377565b60405180910390f35b34801561034657600080fd5b50610361600480360381019061035c919061383c565b610d1b565b005b34801561036f57600080fd5b5061038a600480360381019061038591906138ca565b610e33565b005b34801561039857600080fd5b506103a1610ec9565b6040516103ae9190614758565b60405180910390f35b3480156103c357600080fd5b506103de60048036038101906103d99190613736565b610eda565b005b3480156103ec57600080fd5b506104076004803603810190610402919061383c565b610f3a565b6040516104149190614758565b60405180910390f35b34801561042957600080fd5b50610432610f95565b005b61043c61103d565b005b34801561044a57600080fd5b5061046560048036038101906104609190613736565b6112a9565b005b34801561047357600080fd5b5061048e6004803603810190610489919061390b565b6112c9565b60405161049b9190614758565b60405180910390f35b3480156104b057600080fd5b506104cb60048036038101906104c691906138ca565b6112ec565b005b3480156104d957600080fd5b506104e2611374565b6040516104ef9190614400565b60405180910390f35b34801561050457600080fd5b5061050d611387565b60405161051a9190614436565b60405180910390f35b34801561052f57600080fd5b50610538611415565b6040516105459190614758565b60405180910390f35b34801561055a57600080fd5b506105756004803603810190610570919061390b565b61141a565b6040516105829190614377565b60405180910390f35b34801561059757600080fd5b506105a0611451565b6040516105ad9190614436565b60405180910390f35b3480156105c257600080fd5b506105dd60048036038101906105d891906136d1565b6114e3565b6040516105ea9190614758565b60405180910390f35b3480156105ff57600080fd5b506106086115a2565b005b34801561061657600080fd5b50610631600480360381019061062c91906138ca565b6116df565b005b34801561063f57600080fd5b5061065a600480360381019061065591906136d1565b611775565b60405161066791906143de565b60405180910390f35b34801561067c57600080fd5b506106856118f1565b6040516106929190614377565b60405180910390f35b3480156106a757600080fd5b506106b061191b565b6040516106bd9190614758565b60405180910390f35b3480156106d257600080fd5b506106db611920565b6040516106e89190614436565b60405180910390f35b61070b6004803603810190610706919061390b565b6119b2565b005b34801561071957600080fd5b50610734600480360381019061072f9190613800565b611ba6565b005b34801561074257600080fd5b5061075d600480360381019061075891906136d1565b611d27565b005b34801561076b57600080fd5b506107866004803603810190610781919061390b565b611de7565b604051610793919061441b565b60405180910390f35b3480156107a857600080fd5b506107c360048036038101906107be9190613785565b611e76565b005b3480156107d157600080fd5b506107da611ed8565b6040516107e79190614758565b60405180910390f35b3480156107fc57600080fd5b506108176004803603810190610812919061390b565b611edd565b6040516108249190614436565b60405180910390f35b34801561083957600080fd5b50610854600480360381019061084f919061390b565b612050565b6040516108619190614758565b60405180910390f35b34801561087657600080fd5b5061087f612068565b60405161088c9190614377565b60405180910390f35b3480156108a157600080fd5b506108aa61208e565b6040516108b79190614758565b60405180910390f35b3480156108cc57600080fd5b506108d5612099565b6040516108e29190614377565b60405180910390f35b3480156108f757600080fd5b50610912600480360381019061090d91906136d1565b6120bf565b005b34801561092057600080fd5b5061092961217f565b6040516109369190614758565b60405180910390f35b34801561094b57600080fd5b50610966600480360381019061096191906136fa565b612184565b6040516109739190614400565b60405180910390f35b34801561098857600080fd5b50610991612218565b60405161099e9190614436565b60405180910390f35b3480156109b357600080fd5b506109bc6122a6565b6040516109c99190614377565b60405180910390f35b3480156109de57600080fd5b506109f960048036038101906109f491906136d1565b6122be565b005b348015610a0757600080fd5b50610a1061246a565b604051610a1d9190614758565b60405180910390f35b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b610a95612470565b73ffffffffffffffffffffffffffffffffffffffff16610ab36118f1565b73ffffffffffffffffffffffffffffffffffffffff1614610b09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0090614618565b60405180910390fd5b610400610b14610ec9565b10610b54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4b90614718565b60405180910390fd5b610400610b7183610b63610ec9565b61247890919063ffffffff16565b1115610bb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba990614738565b60405180910390fd5b60005b82811015610bff576000610bc7610ec9565b9050610bd3838261248e565b436010600083815260200190815260200160002081905550508080610bf790614a87565b915050610bb5565b505050565b606060068054610c1390614a55565b80601f0160208091040260200160405190810160405280929190818152602001828054610c3f90614a55565b8015610c8c5780601f10610c6157610100808354040283529160200191610c8c565b820191906000526020600020905b815481529060010190602001808311610c6f57829003601f168201915b5050505050905090565b6000610ca1826124ac565b610ce0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd7906145f8565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d268261141a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8e90614678565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610db6612470565b73ffffffffffffffffffffffffffffffffffffffff161480610de55750610de481610ddf612470565b612184565b5b610e24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1b90614578565b60405180910390fd5b610e2e83836124c9565b505050565b610e3b612470565b73ffffffffffffffffffffffffffffffffffffffff16610e596118f1565b73ffffffffffffffffffffffffffffffffffffffff1614610eaf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea690614618565b60405180910390fd5b80600d9080519060200190610ec59291906134f5565b5050565b6000610ed56002612582565b905090565b610eeb610ee5612470565b82612597565b610f2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f21906146b8565b60405180910390fd5b610f35838383612675565b505050565b6000610f8d82600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061288c90919063ffffffff16565b905092915050565b610f9d612470565b73ffffffffffffffffffffffffffffffffffffffff16610fbb6118f1565b73ffffffffffffffffffffffffffffffffffffffff1614611011576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100890614618565b60405180910390fd5b600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550565b611045612470565b73ffffffffffffffffffffffffffffffffffffffff166110636118f1565b73ffffffffffffffffffffffffffffffffffffffff16146110b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b090614618565b60405180910390fd5b600047905060006110e760646110d96028856128a690919063ffffffff16565b6128bc90919063ffffffff16565b9050600061111260646111046028866128a690919063ffffffff16565b6128bc90919063ffffffff16565b9050600061113d606461112f6014876128a690919063ffffffff16565b6128bc90919063ffffffff16565b9050600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f193505050501580156111a7573d6000803e3d6000fd5b50600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015611210573d6000803e3d6000fd5b50730b8f4c4e7626a91460dac057eb43e0de59d5b44f73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561126b573d6000803e3d6000fd5b50600047146112a3577f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b50505050565b6112c483838360405180602001604052806000815250611e76565b505050565b6000806112e08360026128d290919063ffffffff16565b50905080915050919050565b6112f4612470565b73ffffffffffffffffffffffffffffffffffffffff166113126118f1565b73ffffffffffffffffffffffffffffffffffffffff1614611368576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135f90614618565b60405180910390fd5b611371816128fe565b50565b600f60009054906101000a900460ff1681565b600e805461139490614a55565b80601f01602080910402602001604051908101604052809291908181526020018280546113c090614a55565b801561140d5780601f106113e25761010080835404028352916020019161140d565b820191906000526020600020905b8154815290600101906020018083116113f057829003601f168201915b505050505081565b601481565b600061144a82604051806060016040528060298152602001614c666029913960026129189092919063ffffffff16565b9050919050565b60606009805461146090614a55565b80601f016020809104026020016040519081016040528092919081815260200182805461148c90614a55565b80156114d95780601f106114ae576101008083540402835291602001916114d9565b820191906000526020600020905b8154815290600101906020018083116114bc57829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611554576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154b90614598565b60405180910390fd5b61159b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612937565b9050919050565b6115aa612470565b73ffffffffffffffffffffffffffffffffffffffff166115c86118f1565b73ffffffffffffffffffffffffffffffffffffffff161461161e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161590614618565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6116e7612470565b73ffffffffffffffffffffffffffffffffffffffff166117056118f1565b73ffffffffffffffffffffffffffffffffffffffff161461175b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175290614618565b60405180910390fd5b80600d90805190602001906117719291906134f5565b5050565b60606000611782836114e3565b9050600081141561180557600067ffffffffffffffff8111156117ce577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156117fc5781602001602082028036833780820191505090505b509150506118ec565b60008167ffffffffffffffff811115611847577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156118755781602001602082028036833780820191505090505b50905060005b828110156118e55761188d8582610f3a565b8282815181106118c6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505080806118dd90614a87565b91505061187b565b8193505050505b919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606481565b60606007805461192f90614a55565b80601f016020809104026020016040519081016040528092919081815260200182805461195b90614a55565b80156119a85780601f1061197d576101008083540402835291602001916119a8565b820191906000526020600020905b81548152906001019060200180831161198b57829003601f168201915b5050505050905090565b600f60009054906101000a900460ff16611a01576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f890614518565b60405180910390fd5b610400611a0c610ec9565b10611a4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4390614698565b60405180910390fd5b600081118015611a5d575060148111155b611a9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a93906146d8565b60405180910390fd5b610400611ab982611aab610ec9565b61247890919063ffffffff16565b1115611afa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af190614738565b60405180910390fd5b611b1481662386f26fc100006128a690919063ffffffff16565b3414611b55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4c90614538565b60405180910390fd5b60005b81811015611ba2576000611b6a610ec9565b9050611b76338261248e565b436010600083815260200190815260200160002081905550508080611b9a90614a87565b915050611b58565b5050565b611bae612470565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c13906144f8565b60405180910390fd5b8060056000611c29612470565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611cd6612470565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611d1b9190614400565b60405180910390a35050565b611d2f612470565b73ffffffffffffffffffffffffffffffffffffffff16611d4d6118f1565b73ffffffffffffffffffffffffffffffffffffffff1614611da3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9a90614618565b60405180910390fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000611df2826124ac565b611e31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e28906146f8565b60405180910390fd5b30601060008481526020019081526020016000205483604051602001611e5993929190614316565b604051602081830303815290604052805190602001209050919050565b611e87611e81612470565b83612597565b611ec6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ebd906146b8565b60405180910390fd5b611ed28484848461294c565b50505050565b602881565b6060611ee8826124ac565b611f27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1e90614658565b60405180910390fd5b6000600860008481526020019081526020016000208054611f4790614a55565b80601f0160208091040260200160405190810160405280929190818152602001828054611f7390614a55565b8015611fc05780601f10611f9557610100808354040283529160200191611fc0565b820191906000526020600020905b815481529060010190602001808311611fa357829003601f168201915b505050505090506000611fd1611451565b9050600081511415611fe757819250505061204b565b60008251111561201c578082604051602001612004929190614353565b6040516020818303038152906040529250505061204b565b80612026856129a8565b604051602001612037929190614353565b604051602081830303815290604052925050505b919050565b60106020528060005260406000206000915090505481565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b662386f26fc1000081565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6120c7612470565b73ffffffffffffffffffffffffffffffffffffffff166120e56118f1565b73ffffffffffffffffffffffffffffffffffffffff161461213b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213290614618565b60405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b602881565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600d805461222590614a55565b80601f016020809104026020016040519081016040528092919081815260200182805461225190614a55565b801561229e5780601f106122735761010080835404028352916020019161229e565b820191906000526020600020905b81548152906001019060200180831161228157829003601f168201915b505050505081565b730b8f4c4e7626a91460dac057eb43e0de59d5b44f81565b6122c6612470565b73ffffffffffffffffffffffffffffffffffffffff166122e46118f1565b73ffffffffffffffffffffffffffffffffffffffff161461233a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233190614618565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156123aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a190614498565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61040081565b600033905090565b600081836124869190614880565b905092915050565b6124a8828260405180602001604052806000815250612b55565b5050565b60006124c2826002612bb090919063ffffffff16565b9050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661253c8361141a565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061259082600001612bca565b9050919050565b60006125a2826124ac565b6125e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125d890614558565b60405180910390fd5b60006125ec8361141a565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061265b57508373ffffffffffffffffffffffffffffffffffffffff1661264384610c96565b73ffffffffffffffffffffffffffffffffffffffff16145b8061266c575061266b8185612184565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166126958261141a565b73ffffffffffffffffffffffffffffffffffffffff16146126eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126e290614638565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561275b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612752906144d8565b60405180910390fd5b612766838383612bdb565b6127716000826124c9565b6127c281600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612be090919063ffffffff16565b5061281481600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612bfa90919063ffffffff16565b5061282b81836002612c149092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600061289b8360000183612c49565b60001c905092915050565b600081836128b49190614907565b905092915050565b600081836128ca91906148d6565b905092915050565b6000806000806128e58660000186612ce3565b915091508160001c8160001c9350935050509250929050565b80600990805190602001906129149291906134f5565b5050565b600061292b846000018460001b84612d93565b60001c90509392505050565b600061294582600001612e5a565b9050919050565b612957848484612675565b61296384848484612e6b565b6129a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299990614478565b60405180910390fd5b50505050565b606060008214156129f0576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612b50565b600082905060005b60008214612a22578080612a0b90614a87565b915050600a82612a1b91906148d6565b91506129f8565b60008167ffffffffffffffff811115612a64577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612a965781602001600182028036833780820191505090505b5090505b60008514612b4957600182612aaf9190614961565b9150600a85612abe9190614afe565b6030612aca9190614880565b60f81b818381518110612b06577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612b4291906148d6565b9450612a9a565b8093505050505b919050565b612b5f8383613002565b612b6c6000848484612e6b565b612bab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ba290614478565b60405180910390fd5b505050565b6000612bc2836000018360001b613190565b905092915050565b600081600001805490509050919050565b505050565b6000612bf2836000018360001b6131b3565b905092915050565b6000612c0c836000018360001b61333d565b905092915050565b6000612c40846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b6133ad565b90509392505050565b600081836000018054905011612c94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c8b90614458565b60405180910390fd5b826000018281548110612cd0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905092915050565b60008082846000018054905011612d2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d26906145b8565b60405180910390fd5b6000846000018481548110612d6d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906002020190508060000154816001015492509250509250929050565b60008084600101600085815260200190815260200160002054905060008114158390612df5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dec9190614436565b60405180910390fd5b5084600001600182612e079190614961565b81548110612e3e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060020201600101549150509392505050565b600081600001805490509050919050565b6000612e8c8473ffffffffffffffffffffffffffffffffffffffff166134bf565b15612ff5578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612eb5612470565b8786866040518563ffffffff1660e01b8152600401612ed79493929190614392565b602060405180830381600087803b158015612ef157600080fd5b505af1925050508015612f2257506040513d601f19601f82011682018060405250810190612f1f91906138a1565b60015b612fa5573d8060008114612f52576040519150601f19603f3d011682016040523d82523d6000602084013e612f57565b606091505b50600081511415612f9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f9490614478565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612ffa565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613072576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613069906145d8565b60405180910390fd5b61307b816124ac565b156130bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130b2906144b8565b60405180910390fd5b6130c760008383612bdb565b61311881600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612bfa90919063ffffffff16565b5061312f81836002612c149092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080836001016000848152602001908152602001600020541415905092915050565b600080836001016000848152602001908152602001600020549050600081146133315760006001826131e59190614961565b90506000600186600001805490506131fd9190614961565b9050600086600001828154811061323d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080876000018481548110613287577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055506001836132a29190614880565b87600101600083815260200190815260200160002081905550866000018054806132f5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050613337565b60009150505b92915050565b600061334983836134d2565b6133a25782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506133a7565b600090505b92915050565b6000808460010160008581526020019081526020016000205490506000811415613454578460000160405180604001604052808681526020018581525090806001815401808255809150506001900390600052602060002090600202016000909190919091506000820151816000015560208201518160010155505084600001805490508560010160008681526020019081526020016000208190555060019150506134b8565b82856000016001836134669190614961565b8154811061349d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600202016001018190555060009150505b9392505050565b600080823b905060008111915050919050565b600080836001016000848152602001908152602001600020541415905092915050565b82805461350190614a55565b90600052602060002090601f016020900481019282613523576000855561356a565b82601f1061353c57805160ff191683800117855561356a565b8280016001018555821561356a579182015b8281111561356957825182559160200191906001019061354e565b5b509050613577919061357b565b5090565b5b8082111561359457600081600090555060010161357c565b5090565b60006135ab6135a6846147a4565b614773565b9050828152602081018484840111156135c357600080fd5b6135ce848285614a13565b509392505050565b60006135e96135e4846147d4565b614773565b90508281526020810184848401111561360157600080fd5b61360c848285614a13565b509392505050565b60008135905061362381614c09565b92915050565b60008135905061363881614c20565b92915050565b60008135905061364d81614c37565b92915050565b60008151905061366281614c37565b92915050565b600082601f83011261367957600080fd5b8135613689848260208601613598565b91505092915050565b600082601f8301126136a357600080fd5b81356136b38482602086016135d6565b91505092915050565b6000813590506136cb81614c4e565b92915050565b6000602082840312156136e357600080fd5b60006136f184828501613614565b91505092915050565b6000806040838503121561370d57600080fd5b600061371b85828601613614565b925050602061372c85828601613614565b9150509250929050565b60008060006060848603121561374b57600080fd5b600061375986828701613614565b935050602061376a86828701613614565b925050604061377b868287016136bc565b9150509250925092565b6000806000806080858703121561379b57600080fd5b60006137a987828801613614565b94505060206137ba87828801613614565b93505060406137cb878288016136bc565b925050606085013567ffffffffffffffff8111156137e857600080fd5b6137f487828801613668565b91505092959194509250565b6000806040838503121561381357600080fd5b600061382185828601613614565b925050602061383285828601613629565b9150509250929050565b6000806040838503121561384f57600080fd5b600061385d85828601613614565b925050602061386e858286016136bc565b9150509250929050565b60006020828403121561388a57600080fd5b60006138988482850161363e565b91505092915050565b6000602082840312156138b357600080fd5b60006138c184828501613653565b91505092915050565b6000602082840312156138dc57600080fd5b600082013567ffffffffffffffff8111156138f657600080fd5b61390284828501613692565b91505092915050565b60006020828403121561391d57600080fd5b600061392b848285016136bc565b91505092915050565b6000806040838503121561394757600080fd5b6000613955858286016136bc565b925050602061396685828601613614565b9150509250929050565b600061397c83836142e1565b60208301905092915050565b61399181614995565b82525050565b6139a86139a382614995565b614ad0565b82525050565b60006139b982614814565b6139c38185614842565b93506139ce83614804565b8060005b838110156139ff5781516139e68882613970565b97506139f183614835565b9250506001810190506139d2565b5085935050505092915050565b613a15816149a7565b82525050565b613a24816149b3565b82525050565b6000613a358261481f565b613a3f8185614853565b9350613a4f818560208601614a22565b613a5881614beb565b840191505092915050565b6000613a6e8261482a565b613a788185614864565b9350613a88818560208601614a22565b613a9181614beb565b840191505092915050565b6000613aa78261482a565b613ab18185614875565b9350613ac1818560208601614a22565b80840191505092915050565b6000613ada602283614864565b91507f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613b40603283614864565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000613ba6602683614864565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613c0c601c83614864565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613c4c602483614864565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613cb2601983614864565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000613cf2601283614864565b91507f53616c65206973206e6f742061637469766500000000000000000000000000006000830152602082019050919050565b6000613d32601f83614864565b91507f45746865722076616c75652073656e74206973206e6f7420636f7272656374006000830152602082019050919050565b6000613d72602c83614864565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613dd8603883614864565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000613e3e602a83614864565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000613ea4602283614864565b91507f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613f0a602083614864565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000613f4a602c83614864565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613fb0602083614864565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613ff0602983614864565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614056602f83614864565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b60006140bc602183614864565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614122601683614864565b91507f53616c652068617320616c726561647920656e646564000000000000000000006000830152602082019050919050565b6000614162603183614864565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b60006141c8602683614864565b91507f546f6b656e7320616d6f756e74206d757374206265206265747765656e20312060008301527f616e6420323000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061422e600e83614864565b91507f444f4553204e4f542045584953540000000000000000000000000000000000006000830152602082019050919050565b600061426e601883614864565b91507f546865726520617265206e6f20746f6b656e73206c65667400000000000000006000830152602082019050919050565b60006142ae601283614864565b91507f45786365656473204d41585f544f4b454e5300000000000000000000000000006000830152602082019050919050565b6142ea81614a09565b82525050565b6142f981614a09565b82525050565b61431061430b82614a09565b614af4565b82525050565b60006143228286613997565b60148201915061433282856142ff565b60208201915061434282846142ff565b602082019150819050949350505050565b600061435f8285613a9c565b915061436b8284613a9c565b91508190509392505050565b600060208201905061438c6000830184613988565b92915050565b60006080820190506143a76000830187613988565b6143b46020830186613988565b6143c160408301856142f0565b81810360608301526143d38184613a2a565b905095945050505050565b600060208201905081810360008301526143f881846139ae565b905092915050565b60006020820190506144156000830184613a0c565b92915050565b60006020820190506144306000830184613a1b565b92915050565b600060208201905081810360008301526144508184613a63565b905092915050565b6000602082019050818103600083015261447181613acd565b9050919050565b6000602082019050818103600083015261449181613b33565b9050919050565b600060208201905081810360008301526144b181613b99565b9050919050565b600060208201905081810360008301526144d181613bff565b9050919050565b600060208201905081810360008301526144f181613c3f565b9050919050565b6000602082019050818103600083015261451181613ca5565b9050919050565b6000602082019050818103600083015261453181613ce5565b9050919050565b6000602082019050818103600083015261455181613d25565b9050919050565b6000602082019050818103600083015261457181613d65565b9050919050565b6000602082019050818103600083015261459181613dcb565b9050919050565b600060208201905081810360008301526145b181613e31565b9050919050565b600060208201905081810360008301526145d181613e97565b9050919050565b600060208201905081810360008301526145f181613efd565b9050919050565b6000602082019050818103600083015261461181613f3d565b9050919050565b6000602082019050818103600083015261463181613fa3565b9050919050565b6000602082019050818103600083015261465181613fe3565b9050919050565b6000602082019050818103600083015261467181614049565b9050919050565b60006020820190508181036000830152614691816140af565b9050919050565b600060208201905081810360008301526146b181614115565b9050919050565b600060208201905081810360008301526146d181614155565b9050919050565b600060208201905081810360008301526146f1816141bb565b9050919050565b6000602082019050818103600083015261471181614221565b9050919050565b6000602082019050818103600083015261473181614261565b9050919050565b60006020820190508181036000830152614751816142a1565b9050919050565b600060208201905061476d60008301846142f0565b92915050565b6000604051905081810181811067ffffffffffffffff8211171561479a57614799614bbc565b5b8060405250919050565b600067ffffffffffffffff8211156147bf576147be614bbc565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156147ef576147ee614bbc565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061488b82614a09565b915061489683614a09565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156148cb576148ca614b2f565b5b828201905092915050565b60006148e182614a09565b91506148ec83614a09565b9250826148fc576148fb614b5e565b5b828204905092915050565b600061491282614a09565b915061491d83614a09565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561495657614955614b2f565b5b828202905092915050565b600061496c82614a09565b915061497783614a09565b92508282101561498a57614989614b2f565b5b828203905092915050565b60006149a0826149e9565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614a40578082015181840152602081019050614a25565b83811115614a4f576000848401525b50505050565b60006002820490506001821680614a6d57607f821691505b60208210811415614a8157614a80614b8d565b5b50919050565b6000614a9282614a09565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614ac557614ac4614b2f565b5b600182019050919050565b6000614adb82614ae2565b9050919050565b6000614aed82614bfc565b9050919050565b6000819050919050565b6000614b0982614a09565b9150614b1483614a09565b925082614b2457614b23614b5e565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b614c1281614995565b8114614c1d57600080fd5b50565b614c29816149a7565b8114614c3457600080fd5b50565b614c40816149bd565b8114614c4b57600080fd5b50565b614c5781614a09565b8114614c6257600080fd5b5056fe4552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea2646970667358221220e2d7047d969ba02a50062113e11a4c8529be1f33dfe99d1e1503e3ea9f607b7664736f6c6343000800003368747470733a2f2f6170692e6368726f6d6f727068732e78797a2f706f692f6a736f6e2f

Deployed Bytecode

0x6080604052600436106102675760003560e01c80638462151c11610144578063c8a01226116100b6578063e406a6b91161007a578063e406a6b914610914578063e985e9c51461093f578063ebe9eb9f1461097c578063f069062a146109a7578063f2fde38b146109d2578063f47c84c5146109fb57610267565b8063c8a012261461082d578063caccd7f71461086a578063d2d8cb6714610895578063d7eb3f3a146108c0578063dcc345f2146108eb57610267565b8063a22cb46511610108578063a22cb4651461070d578063a22e4faa14610736578063a38643971461075f578063b88d4fde1461079c578063c623c543146107c5578063c87b56dd146107f057610267565b80638462151c146106335780638da5cb5b1461067057806394bc2ae71461069b57806395d89b41146106c6578063a0712d68146106f157610267565b806342842e0e116101dd57806362aee544116101a157806362aee544146105235780636352211e1461054e5780636c0360eb1461058b57806370a08231146105b6578063715018a6146105f357806378a4ab851461060a57610267565b806342842e0e1461043e5780634f6ccce71461046757806355f804b3146104a45780635c474f9e146104cd5780635d69dbdd146104f857610267565b8063171ce0941161022f578063171ce0941461036357806318160ddd1461038c57806323b872dd146103b75780632f745c59146103e057806334918dfd1461041d5780633ccfd60b1461043457610267565b806301ffc9a71461026c57806303339bcb146102a957806306fdde03146102d2578063081812fc146102fd578063095ea7b31461033a575b600080fd5b34801561027857600080fd5b50610293600480360381019061028e9190613878565b610a26565b6040516102a09190614400565b60405180910390f35b3480156102b557600080fd5b506102d060048036038101906102cb9190613934565b610a8d565b005b3480156102de57600080fd5b506102e7610c04565b6040516102f49190614436565b60405180910390f35b34801561030957600080fd5b50610324600480360381019061031f919061390b565b610c96565b6040516103319190614377565b60405180910390f35b34801561034657600080fd5b50610361600480360381019061035c919061383c565b610d1b565b005b34801561036f57600080fd5b5061038a600480360381019061038591906138ca565b610e33565b005b34801561039857600080fd5b506103a1610ec9565b6040516103ae9190614758565b60405180910390f35b3480156103c357600080fd5b506103de60048036038101906103d99190613736565b610eda565b005b3480156103ec57600080fd5b506104076004803603810190610402919061383c565b610f3a565b6040516104149190614758565b60405180910390f35b34801561042957600080fd5b50610432610f95565b005b61043c61103d565b005b34801561044a57600080fd5b5061046560048036038101906104609190613736565b6112a9565b005b34801561047357600080fd5b5061048e6004803603810190610489919061390b565b6112c9565b60405161049b9190614758565b60405180910390f35b3480156104b057600080fd5b506104cb60048036038101906104c691906138ca565b6112ec565b005b3480156104d957600080fd5b506104e2611374565b6040516104ef9190614400565b60405180910390f35b34801561050457600080fd5b5061050d611387565b60405161051a9190614436565b60405180910390f35b34801561052f57600080fd5b50610538611415565b6040516105459190614758565b60405180910390f35b34801561055a57600080fd5b506105756004803603810190610570919061390b565b61141a565b6040516105829190614377565b60405180910390f35b34801561059757600080fd5b506105a0611451565b6040516105ad9190614436565b60405180910390f35b3480156105c257600080fd5b506105dd60048036038101906105d891906136d1565b6114e3565b6040516105ea9190614758565b60405180910390f35b3480156105ff57600080fd5b506106086115a2565b005b34801561061657600080fd5b50610631600480360381019061062c91906138ca565b6116df565b005b34801561063f57600080fd5b5061065a600480360381019061065591906136d1565b611775565b60405161066791906143de565b60405180910390f35b34801561067c57600080fd5b506106856118f1565b6040516106929190614377565b60405180910390f35b3480156106a757600080fd5b506106b061191b565b6040516106bd9190614758565b60405180910390f35b3480156106d257600080fd5b506106db611920565b6040516106e89190614436565b60405180910390f35b61070b6004803603810190610706919061390b565b6119b2565b005b34801561071957600080fd5b50610734600480360381019061072f9190613800565b611ba6565b005b34801561074257600080fd5b5061075d600480360381019061075891906136d1565b611d27565b005b34801561076b57600080fd5b506107866004803603810190610781919061390b565b611de7565b604051610793919061441b565b60405180910390f35b3480156107a857600080fd5b506107c360048036038101906107be9190613785565b611e76565b005b3480156107d157600080fd5b506107da611ed8565b6040516107e79190614758565b60405180910390f35b3480156107fc57600080fd5b506108176004803603810190610812919061390b565b611edd565b6040516108249190614436565b60405180910390f35b34801561083957600080fd5b50610854600480360381019061084f919061390b565b612050565b6040516108619190614758565b60405180910390f35b34801561087657600080fd5b5061087f612068565b60405161088c9190614377565b60405180910390f35b3480156108a157600080fd5b506108aa61208e565b6040516108b79190614758565b60405180910390f35b3480156108cc57600080fd5b506108d5612099565b6040516108e29190614377565b60405180910390f35b3480156108f757600080fd5b50610912600480360381019061090d91906136d1565b6120bf565b005b34801561092057600080fd5b5061092961217f565b6040516109369190614758565b60405180910390f35b34801561094b57600080fd5b50610966600480360381019061096191906136fa565b612184565b6040516109739190614400565b60405180910390f35b34801561098857600080fd5b50610991612218565b60405161099e9190614436565b60405180910390f35b3480156109b357600080fd5b506109bc6122a6565b6040516109c99190614377565b60405180910390f35b3480156109de57600080fd5b506109f960048036038101906109f491906136d1565b6122be565b005b348015610a0757600080fd5b50610a1061246a565b604051610a1d9190614758565b60405180910390f35b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b610a95612470565b73ffffffffffffffffffffffffffffffffffffffff16610ab36118f1565b73ffffffffffffffffffffffffffffffffffffffff1614610b09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0090614618565b60405180910390fd5b610400610b14610ec9565b10610b54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4b90614718565b60405180910390fd5b610400610b7183610b63610ec9565b61247890919063ffffffff16565b1115610bb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba990614738565b60405180910390fd5b60005b82811015610bff576000610bc7610ec9565b9050610bd3838261248e565b436010600083815260200190815260200160002081905550508080610bf790614a87565b915050610bb5565b505050565b606060068054610c1390614a55565b80601f0160208091040260200160405190810160405280929190818152602001828054610c3f90614a55565b8015610c8c5780601f10610c6157610100808354040283529160200191610c8c565b820191906000526020600020905b815481529060010190602001808311610c6f57829003601f168201915b5050505050905090565b6000610ca1826124ac565b610ce0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd7906145f8565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d268261141a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8e90614678565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610db6612470565b73ffffffffffffffffffffffffffffffffffffffff161480610de55750610de481610ddf612470565b612184565b5b610e24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1b90614578565b60405180910390fd5b610e2e83836124c9565b505050565b610e3b612470565b73ffffffffffffffffffffffffffffffffffffffff16610e596118f1565b73ffffffffffffffffffffffffffffffffffffffff1614610eaf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea690614618565b60405180910390fd5b80600d9080519060200190610ec59291906134f5565b5050565b6000610ed56002612582565b905090565b610eeb610ee5612470565b82612597565b610f2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f21906146b8565b60405180910390fd5b610f35838383612675565b505050565b6000610f8d82600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061288c90919063ffffffff16565b905092915050565b610f9d612470565b73ffffffffffffffffffffffffffffffffffffffff16610fbb6118f1565b73ffffffffffffffffffffffffffffffffffffffff1614611011576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100890614618565b60405180910390fd5b600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550565b611045612470565b73ffffffffffffffffffffffffffffffffffffffff166110636118f1565b73ffffffffffffffffffffffffffffffffffffffff16146110b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b090614618565b60405180910390fd5b600047905060006110e760646110d96028856128a690919063ffffffff16565b6128bc90919063ffffffff16565b9050600061111260646111046028866128a690919063ffffffff16565b6128bc90919063ffffffff16565b9050600061113d606461112f6014876128a690919063ffffffff16565b6128bc90919063ffffffff16565b9050600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f193505050501580156111a7573d6000803e3d6000fd5b50600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015611210573d6000803e3d6000fd5b50730b8f4c4e7626a91460dac057eb43e0de59d5b44f73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561126b573d6000803e3d6000fd5b50600047146112a3577f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b50505050565b6112c483838360405180602001604052806000815250611e76565b505050565b6000806112e08360026128d290919063ffffffff16565b50905080915050919050565b6112f4612470565b73ffffffffffffffffffffffffffffffffffffffff166113126118f1565b73ffffffffffffffffffffffffffffffffffffffff1614611368576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135f90614618565b60405180910390fd5b611371816128fe565b50565b600f60009054906101000a900460ff1681565b600e805461139490614a55565b80601f01602080910402602001604051908101604052809291908181526020018280546113c090614a55565b801561140d5780601f106113e25761010080835404028352916020019161140d565b820191906000526020600020905b8154815290600101906020018083116113f057829003601f168201915b505050505081565b601481565b600061144a82604051806060016040528060298152602001614c666029913960026129189092919063ffffffff16565b9050919050565b60606009805461146090614a55565b80601f016020809104026020016040519081016040528092919081815260200182805461148c90614a55565b80156114d95780601f106114ae576101008083540402835291602001916114d9565b820191906000526020600020905b8154815290600101906020018083116114bc57829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611554576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154b90614598565b60405180910390fd5b61159b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612937565b9050919050565b6115aa612470565b73ffffffffffffffffffffffffffffffffffffffff166115c86118f1565b73ffffffffffffffffffffffffffffffffffffffff161461161e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161590614618565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6116e7612470565b73ffffffffffffffffffffffffffffffffffffffff166117056118f1565b73ffffffffffffffffffffffffffffffffffffffff161461175b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175290614618565b60405180910390fd5b80600d90805190602001906117719291906134f5565b5050565b60606000611782836114e3565b9050600081141561180557600067ffffffffffffffff8111156117ce577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156117fc5781602001602082028036833780820191505090505b509150506118ec565b60008167ffffffffffffffff811115611847577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156118755781602001602082028036833780820191505090505b50905060005b828110156118e55761188d8582610f3a565b8282815181106118c6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505080806118dd90614a87565b91505061187b565b8193505050505b919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606481565b60606007805461192f90614a55565b80601f016020809104026020016040519081016040528092919081815260200182805461195b90614a55565b80156119a85780601f1061197d576101008083540402835291602001916119a8565b820191906000526020600020905b81548152906001019060200180831161198b57829003601f168201915b5050505050905090565b600f60009054906101000a900460ff16611a01576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f890614518565b60405180910390fd5b610400611a0c610ec9565b10611a4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4390614698565b60405180910390fd5b600081118015611a5d575060148111155b611a9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a93906146d8565b60405180910390fd5b610400611ab982611aab610ec9565b61247890919063ffffffff16565b1115611afa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af190614738565b60405180910390fd5b611b1481662386f26fc100006128a690919063ffffffff16565b3414611b55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4c90614538565b60405180910390fd5b60005b81811015611ba2576000611b6a610ec9565b9050611b76338261248e565b436010600083815260200190815260200160002081905550508080611b9a90614a87565b915050611b58565b5050565b611bae612470565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c13906144f8565b60405180910390fd5b8060056000611c29612470565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611cd6612470565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611d1b9190614400565b60405180910390a35050565b611d2f612470565b73ffffffffffffffffffffffffffffffffffffffff16611d4d6118f1565b73ffffffffffffffffffffffffffffffffffffffff1614611da3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9a90614618565b60405180910390fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000611df2826124ac565b611e31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e28906146f8565b60405180910390fd5b30601060008481526020019081526020016000205483604051602001611e5993929190614316565b604051602081830303815290604052805190602001209050919050565b611e87611e81612470565b83612597565b611ec6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ebd906146b8565b60405180910390fd5b611ed28484848461294c565b50505050565b602881565b6060611ee8826124ac565b611f27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1e90614658565b60405180910390fd5b6000600860008481526020019081526020016000208054611f4790614a55565b80601f0160208091040260200160405190810160405280929190818152602001828054611f7390614a55565b8015611fc05780601f10611f9557610100808354040283529160200191611fc0565b820191906000526020600020905b815481529060010190602001808311611fa357829003601f168201915b505050505090506000611fd1611451565b9050600081511415611fe757819250505061204b565b60008251111561201c578082604051602001612004929190614353565b6040516020818303038152906040529250505061204b565b80612026856129a8565b604051602001612037929190614353565b604051602081830303815290604052925050505b919050565b60106020528060005260406000206000915090505481565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b662386f26fc1000081565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6120c7612470565b73ffffffffffffffffffffffffffffffffffffffff166120e56118f1565b73ffffffffffffffffffffffffffffffffffffffff161461213b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213290614618565b60405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b602881565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600d805461222590614a55565b80601f016020809104026020016040519081016040528092919081815260200182805461225190614a55565b801561229e5780601f106122735761010080835404028352916020019161229e565b820191906000526020600020905b81548152906001019060200180831161228157829003601f168201915b505050505081565b730b8f4c4e7626a91460dac057eb43e0de59d5b44f81565b6122c6612470565b73ffffffffffffffffffffffffffffffffffffffff166122e46118f1565b73ffffffffffffffffffffffffffffffffffffffff161461233a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233190614618565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156123aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a190614498565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61040081565b600033905090565b600081836124869190614880565b905092915050565b6124a8828260405180602001604052806000815250612b55565b5050565b60006124c2826002612bb090919063ffffffff16565b9050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661253c8361141a565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061259082600001612bca565b9050919050565b60006125a2826124ac565b6125e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125d890614558565b60405180910390fd5b60006125ec8361141a565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061265b57508373ffffffffffffffffffffffffffffffffffffffff1661264384610c96565b73ffffffffffffffffffffffffffffffffffffffff16145b8061266c575061266b8185612184565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166126958261141a565b73ffffffffffffffffffffffffffffffffffffffff16146126eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126e290614638565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561275b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612752906144d8565b60405180910390fd5b612766838383612bdb565b6127716000826124c9565b6127c281600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612be090919063ffffffff16565b5061281481600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612bfa90919063ffffffff16565b5061282b81836002612c149092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600061289b8360000183612c49565b60001c905092915050565b600081836128b49190614907565b905092915050565b600081836128ca91906148d6565b905092915050565b6000806000806128e58660000186612ce3565b915091508160001c8160001c9350935050509250929050565b80600990805190602001906129149291906134f5565b5050565b600061292b846000018460001b84612d93565b60001c90509392505050565b600061294582600001612e5a565b9050919050565b612957848484612675565b61296384848484612e6b565b6129a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299990614478565b60405180910390fd5b50505050565b606060008214156129f0576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612b50565b600082905060005b60008214612a22578080612a0b90614a87565b915050600a82612a1b91906148d6565b91506129f8565b60008167ffffffffffffffff811115612a64577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612a965781602001600182028036833780820191505090505b5090505b60008514612b4957600182612aaf9190614961565b9150600a85612abe9190614afe565b6030612aca9190614880565b60f81b818381518110612b06577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612b4291906148d6565b9450612a9a565b8093505050505b919050565b612b5f8383613002565b612b6c6000848484612e6b565b612bab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ba290614478565b60405180910390fd5b505050565b6000612bc2836000018360001b613190565b905092915050565b600081600001805490509050919050565b505050565b6000612bf2836000018360001b6131b3565b905092915050565b6000612c0c836000018360001b61333d565b905092915050565b6000612c40846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b6133ad565b90509392505050565b600081836000018054905011612c94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c8b90614458565b60405180910390fd5b826000018281548110612cd0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905092915050565b60008082846000018054905011612d2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d26906145b8565b60405180910390fd5b6000846000018481548110612d6d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906002020190508060000154816001015492509250509250929050565b60008084600101600085815260200190815260200160002054905060008114158390612df5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dec9190614436565b60405180910390fd5b5084600001600182612e079190614961565b81548110612e3e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060020201600101549150509392505050565b600081600001805490509050919050565b6000612e8c8473ffffffffffffffffffffffffffffffffffffffff166134bf565b15612ff5578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612eb5612470565b8786866040518563ffffffff1660e01b8152600401612ed79493929190614392565b602060405180830381600087803b158015612ef157600080fd5b505af1925050508015612f2257506040513d601f19601f82011682018060405250810190612f1f91906138a1565b60015b612fa5573d8060008114612f52576040519150601f19603f3d011682016040523d82523d6000602084013e612f57565b606091505b50600081511415612f9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f9490614478565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612ffa565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613072576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613069906145d8565b60405180910390fd5b61307b816124ac565b156130bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130b2906144b8565b60405180910390fd5b6130c760008383612bdb565b61311881600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612bfa90919063ffffffff16565b5061312f81836002612c149092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080836001016000848152602001908152602001600020541415905092915050565b600080836001016000848152602001908152602001600020549050600081146133315760006001826131e59190614961565b90506000600186600001805490506131fd9190614961565b9050600086600001828154811061323d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080876000018481548110613287577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055506001836132a29190614880565b87600101600083815260200190815260200160002081905550866000018054806132f5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050613337565b60009150505b92915050565b600061334983836134d2565b6133a25782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506133a7565b600090505b92915050565b6000808460010160008581526020019081526020016000205490506000811415613454578460000160405180604001604052808681526020018581525090806001815401808255809150506001900390600052602060002090600202016000909190919091506000820151816000015560208201518160010155505084600001805490508560010160008681526020019081526020016000208190555060019150506134b8565b82856000016001836134669190614961565b8154811061349d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600202016001018190555060009150505b9392505050565b600080823b905060008111915050919050565b600080836001016000848152602001908152602001600020541415905092915050565b82805461350190614a55565b90600052602060002090601f016020900481019282613523576000855561356a565b82601f1061353c57805160ff191683800117855561356a565b8280016001018555821561356a579182015b8281111561356957825182559160200191906001019061354e565b5b509050613577919061357b565b5090565b5b8082111561359457600081600090555060010161357c565b5090565b60006135ab6135a6846147a4565b614773565b9050828152602081018484840111156135c357600080fd5b6135ce848285614a13565b509392505050565b60006135e96135e4846147d4565b614773565b90508281526020810184848401111561360157600080fd5b61360c848285614a13565b509392505050565b60008135905061362381614c09565b92915050565b60008135905061363881614c20565b92915050565b60008135905061364d81614c37565b92915050565b60008151905061366281614c37565b92915050565b600082601f83011261367957600080fd5b8135613689848260208601613598565b91505092915050565b600082601f8301126136a357600080fd5b81356136b38482602086016135d6565b91505092915050565b6000813590506136cb81614c4e565b92915050565b6000602082840312156136e357600080fd5b60006136f184828501613614565b91505092915050565b6000806040838503121561370d57600080fd5b600061371b85828601613614565b925050602061372c85828601613614565b9150509250929050565b60008060006060848603121561374b57600080fd5b600061375986828701613614565b935050602061376a86828701613614565b925050604061377b868287016136bc565b9150509250925092565b6000806000806080858703121561379b57600080fd5b60006137a987828801613614565b94505060206137ba87828801613614565b93505060406137cb878288016136bc565b925050606085013567ffffffffffffffff8111156137e857600080fd5b6137f487828801613668565b91505092959194509250565b6000806040838503121561381357600080fd5b600061382185828601613614565b925050602061383285828601613629565b9150509250929050565b6000806040838503121561384f57600080fd5b600061385d85828601613614565b925050602061386e858286016136bc565b9150509250929050565b60006020828403121561388a57600080fd5b60006138988482850161363e565b91505092915050565b6000602082840312156138b357600080fd5b60006138c184828501613653565b91505092915050565b6000602082840312156138dc57600080fd5b600082013567ffffffffffffffff8111156138f657600080fd5b61390284828501613692565b91505092915050565b60006020828403121561391d57600080fd5b600061392b848285016136bc565b91505092915050565b6000806040838503121561394757600080fd5b6000613955858286016136bc565b925050602061396685828601613614565b9150509250929050565b600061397c83836142e1565b60208301905092915050565b61399181614995565b82525050565b6139a86139a382614995565b614ad0565b82525050565b60006139b982614814565b6139c38185614842565b93506139ce83614804565b8060005b838110156139ff5781516139e68882613970565b97506139f183614835565b9250506001810190506139d2565b5085935050505092915050565b613a15816149a7565b82525050565b613a24816149b3565b82525050565b6000613a358261481f565b613a3f8185614853565b9350613a4f818560208601614a22565b613a5881614beb565b840191505092915050565b6000613a6e8261482a565b613a788185614864565b9350613a88818560208601614a22565b613a9181614beb565b840191505092915050565b6000613aa78261482a565b613ab18185614875565b9350613ac1818560208601614a22565b80840191505092915050565b6000613ada602283614864565b91507f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613b40603283614864565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000613ba6602683614864565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613c0c601c83614864565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613c4c602483614864565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613cb2601983614864565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000613cf2601283614864565b91507f53616c65206973206e6f742061637469766500000000000000000000000000006000830152602082019050919050565b6000613d32601f83614864565b91507f45746865722076616c75652073656e74206973206e6f7420636f7272656374006000830152602082019050919050565b6000613d72602c83614864565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613dd8603883614864565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000613e3e602a83614864565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000613ea4602283614864565b91507f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613f0a602083614864565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000613f4a602c83614864565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613fb0602083614864565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613ff0602983614864565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614056602f83614864565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b60006140bc602183614864565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614122601683614864565b91507f53616c652068617320616c726561647920656e646564000000000000000000006000830152602082019050919050565b6000614162603183614864565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b60006141c8602683614864565b91507f546f6b656e7320616d6f756e74206d757374206265206265747765656e20312060008301527f616e6420323000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061422e600e83614864565b91507f444f4553204e4f542045584953540000000000000000000000000000000000006000830152602082019050919050565b600061426e601883614864565b91507f546865726520617265206e6f20746f6b656e73206c65667400000000000000006000830152602082019050919050565b60006142ae601283614864565b91507f45786365656473204d41585f544f4b454e5300000000000000000000000000006000830152602082019050919050565b6142ea81614a09565b82525050565b6142f981614a09565b82525050565b61431061430b82614a09565b614af4565b82525050565b60006143228286613997565b60148201915061433282856142ff565b60208201915061434282846142ff565b602082019150819050949350505050565b600061435f8285613a9c565b915061436b8284613a9c565b91508190509392505050565b600060208201905061438c6000830184613988565b92915050565b60006080820190506143a76000830187613988565b6143b46020830186613988565b6143c160408301856142f0565b81810360608301526143d38184613a2a565b905095945050505050565b600060208201905081810360008301526143f881846139ae565b905092915050565b60006020820190506144156000830184613a0c565b92915050565b60006020820190506144306000830184613a1b565b92915050565b600060208201905081810360008301526144508184613a63565b905092915050565b6000602082019050818103600083015261447181613acd565b9050919050565b6000602082019050818103600083015261449181613b33565b9050919050565b600060208201905081810360008301526144b181613b99565b9050919050565b600060208201905081810360008301526144d181613bff565b9050919050565b600060208201905081810360008301526144f181613c3f565b9050919050565b6000602082019050818103600083015261451181613ca5565b9050919050565b6000602082019050818103600083015261453181613ce5565b9050919050565b6000602082019050818103600083015261455181613d25565b9050919050565b6000602082019050818103600083015261457181613d65565b9050919050565b6000602082019050818103600083015261459181613dcb565b9050919050565b600060208201905081810360008301526145b181613e31565b9050919050565b600060208201905081810360008301526145d181613e97565b9050919050565b600060208201905081810360008301526145f181613efd565b9050919050565b6000602082019050818103600083015261461181613f3d565b9050919050565b6000602082019050818103600083015261463181613fa3565b9050919050565b6000602082019050818103600083015261465181613fe3565b9050919050565b6000602082019050818103600083015261467181614049565b9050919050565b60006020820190508181036000830152614691816140af565b9050919050565b600060208201905081810360008301526146b181614115565b9050919050565b600060208201905081810360008301526146d181614155565b9050919050565b600060208201905081810360008301526146f1816141bb565b9050919050565b6000602082019050818103600083015261471181614221565b9050919050565b6000602082019050818103600083015261473181614261565b9050919050565b60006020820190508181036000830152614751816142a1565b9050919050565b600060208201905061476d60008301846142f0565b92915050565b6000604051905081810181811067ffffffffffffffff8211171561479a57614799614bbc565b5b8060405250919050565b600067ffffffffffffffff8211156147bf576147be614bbc565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156147ef576147ee614bbc565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061488b82614a09565b915061489683614a09565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156148cb576148ca614b2f565b5b828201905092915050565b60006148e182614a09565b91506148ec83614a09565b9250826148fc576148fb614b5e565b5b828204905092915050565b600061491282614a09565b915061491d83614a09565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561495657614955614b2f565b5b828202905092915050565b600061496c82614a09565b915061497783614a09565b92508282101561498a57614989614b2f565b5b828203905092915050565b60006149a0826149e9565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614a40578082015181840152602081019050614a25565b83811115614a4f576000848401525b50505050565b60006002820490506001821680614a6d57607f821691505b60208210811415614a8157614a80614b8d565b5b50919050565b6000614a9282614a09565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614ac557614ac4614b2f565b5b600182019050919050565b6000614adb82614ae2565b9050919050565b6000614aed82614bfc565b9050919050565b6000819050919050565b6000614b0982614a09565b9150614b1483614a09565b925082614b2457614b23614b5e565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b614c1281614995565b8114614c1d57600080fd5b50565b614c29816149a7565b8114614c3457600080fd5b50565b614c40816149bd565b8114614c4b57600080fd5b50565b614c5781614a09565b8114614c6257600080fd5b5056fe4552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea2646970667358221220e2d7047d969ba02a50062113e11a4c8529be1f33dfe99d1e1503e3ea9f607b7664736f6c63430008000033

Deployed Bytecode Sourcemap

66414:4104:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31648:150;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68586:453;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43361:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46147:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45677:404;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69157:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45155:211;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47037:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44917:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69654:87;;;;;;;;;;;;;:::i;:::-;;69993:522;;;:::i;:::-;;47413:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45443:172;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69543:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67156:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67116:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66746:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43117:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44736:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42807:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58222:148;;;;;;;;;;;;;:::i;:::-;;69051:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67384:502;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57571:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66792:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43530:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67897:678;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46440:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69415:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69753:228;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47635:285;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66653:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43705:792;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67194:49;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66835:76;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66579:55;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66918:73;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69275:128;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66701:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46806:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67089:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66998:84;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58525:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66534:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31648:150;31733:4;31757:20;:33;31778:11;31757:33;;;;;;;;;;;;;;;;;;;;;;;;;;;31750:40;;31648:150;;;:::o;68586:453::-;57802:12;:10;:12::i;:::-;57791:23;;:7;:5;:7::i;:::-;:23;;;57783:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66568:4:::1;68680:13;:11;:13::i;:::-;:26;68672:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;66568:4;68754:31;68772:12;68754:13;:11;:13::i;:::-;:17;;:31;;;;:::i;:::-;:45;;68746:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;68840:6;68835:197;68856:12;68852:1;:16;68835:197;;;68890:14;68907:13;:11;:13::i;:::-;68890:30;;68935:31;68945:9;68956;68935;:31::i;:::-;69008:12;68981:13;:24;68995:9;68981:24;;;;;;;;;;;:39;;;;68835:197;68870:3;;;;;:::i;:::-;;;;68835:197;;;;68586:453:::0;;:::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;69157:106::-;57802:12;:10;:12::i;:::-;57791:23;;:7;:5;:7::i;:::-;:23;;;57783:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;69244:11:::1;69235:6;:20;;;;;;;;;;;;:::i;:::-;;69157: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;69654:87::-;57802:12;:10;:12::i;:::-;57791:23;;:7;:5;:7::i;:::-;:23;;;57783:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;69722:11:::1;;;;;;;;;;;69721:12;69707:11;;:26;;;;;;;;;;;;;;;;;;69654:87::o:0;69993:522::-;57802:12;:10;:12::i;:::-;57791:23;;:7;:5;:7::i;:::-;:23;;;57783:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;70049:15:::1;70067:21;70049:39;;70099:16;70118:43;66825:3;70118:28;66692:2;70118:7;:11;;:28;;;;:::i;:::-;:32;;:43;;;;:::i;:::-;70099:62;;70172:13;70188:40;66825:3;70188:25;66737:2;70188:7;:11;;:25;;;;:::i;:::-;:29;;:40;;;;:::i;:::-;70172:56;;70239:14;70256:41;66825:3;70256:26;66783:2;70256:7;:11;;:26;;;;:::i;:::-;:30;;:41;;;;:::i;:::-;70239:58;;70316:16;;;;;;;;;;;70308:34;;:47;70343:11;70308:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;70374:13;;;;;;;;;;;70366:31;;:41;70398:8;70366:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;67040:42;70418:33;;:44;70452:9;70418:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;70505:1;70480:21;:26;70473:34;;;;;;;;;;;;57862:1;;;;69993:522::o:0;47413:151::-;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;69543:99::-;57802:12;:10;:12::i;:::-;57791:23;;:7;:5;:7::i;:::-;:23;;;57783:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;69614:20:::1;69626:7;69614:11;:20::i;:::-;69543:99:::0;:::o;67156:31::-;;;;;;;;;;;;;:::o;67116:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;66746:39::-;66783:2;66746:39;:::o;43117:177::-;43189:7;43216:70;43233:7;43216:70;;;;;;;;;;;;;;;;;:12;:16;;:70;;;;;:::i;:::-;43209:77;;43117:177;;;:::o;44736:97::-;44784:13;44817:8;44810:15;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44736:97;:::o;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;69051:94::-;57802:12;:10;:12::i;:::-;57791:23;;:7;:5;:7::i;:::-;:23;;;57783:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;69130:7:::1;69121:6;:16;;;;;;;;;;;;:::i;:::-;;69051:94:::0;:::o;67384:502::-;67445:16;67475:18;67496:17;67506:6;67496:9;:17::i;:::-;67475:38;;67542:1;67528:10;:15;67524:355;;;67581:1;67567:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67560:23;;;;;67524:355;67616:23;67656:10;67642:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67616:51;;67682:13;67710:130;67734:10;67726:5;:18;67710:130;;;67790:34;67810:6;67818:5;67790:19;:34::i;:::-;67774:6;67781:5;67774:13;;;;;;;;;;;;;;;;;;;;;:50;;;;;67746:7;;;;;:::i;:::-;;;;67710:130;;;67861:6;67854:13;;;;;67384:502;;;;:::o;57571:87::-;57617:7;57644:6;;;;;;;;;;;57637:13;;57571:87;:::o;66792:36::-;66825:3;66792:36;:::o;43530:104::-;43586:13;43619:7;43612:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43530:104;:::o;67897:678::-;67967:11;;;;;;;;;;;67959:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;66568:4;68020:13;:11;:13::i;:::-;:26;68012:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;68107:1;68092:12;:16;:38;;;;;68128:2;68112:12;:18;;68092:38;68084:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;66568:4;68192:31;68210:12;68192:13;:11;:13::i;:::-;:17;;:31;;;;:::i;:::-;:45;;68184:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;68292:29;68308:12;66617:17;68292:15;;:29;;;;:::i;:::-;68279:9;:42;68271:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;68375:6;68370:198;68391:12;68387:1;:16;68370:198;;;68425:14;68442:13;:11;:13::i;:::-;68425:30;;68470:32;68480:10;68492:9;68470;:32::i;:::-;68544:12;68517:13;:24;68531:9;68517:24;;;;;;;;;;;:39;;;;68370:198;68405:3;;;;;:::i;:::-;;;;68370:198;;;;67897:678;:::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;69415:116::-;57802:12;:10;:12::i;:::-;57791:23;;:7;:5;:7::i;:::-;:23;;;57783:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;69509:14:::1;69493:13;;:30;;;;;;;;;;;;;;;;;;69415:116:::0;:::o;69753:228::-;69809:7;69836:16;69844:7;69836;:16::i;:::-;69828:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;69932:4;69939:13;:22;69953:7;69939:22;;;;;;;;;;;;69963:7;69907:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;69897:75;;;;;;69882:91;;69753:228;;;:::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;66653:41::-;66692:2;66653:41;:::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;67194:49::-;;;;;;;;;;;;;;;;;:::o;66835:76::-;;;;;;;;;;;;;:::o;66579:55::-;66617:17;66579:55;:::o;66918:73::-;;;;;;;;;;;;;:::o;69275:128::-;57802:12;:10;:12::i;:::-;57791:23;;:7;:5;:7::i;:::-;:23;;;57783:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;69378:17:::1;69359:16;;:36;;;;;;;;;;;;;;;;;;69275:128:::0;:::o;66701:38::-;66737:2;66701:38;:::o;46806:164::-;46903:4;46927:18;:25;46946:5;46927:25;;;;;;;;;;;;;;;:35;46953:8;46927:35;;;;;;;;;;;;;;;;;;;;;;;;;46920:42;;46806:164;;;;:::o;67089:20::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;66998:84::-;67040:42;66998:84;:::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;66534:38::-;66568:4;66534:38;:::o;40579:98::-;40632:7;40659:10;40652:17;;40579:98;:::o;61611:::-;61669:7;61700:1;61696;:5;;;;:::i;:::-;61689:12;;61611:98;;;;:::o;50379:110::-;50455:26;50465:2;50469:7;50455:26;;;;;;;;;;;;:9;:26::i;:::-;50379:110;;:::o;49387:127::-;49452:4;49476:30;49498:7;49476:12;:21;;:30;;;;:::i;:::-;49469:37;;49387:127;;;:::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;62349:98::-;62407:7;62438:1;62434;:5;;;;:::i;:::-;62427:12;;62349:98;;;;:::o;62748:::-;62806:7;62837:1;62833;:5;;;;:::i;:::-;62826:12;;62748:98;;;;:::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;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;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;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;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;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;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;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;7:342:1:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:344::-;;458:65;473:49;515:6;473:49;:::i;:::-;458:65;:::i;:::-;449:74;;546:6;539:5;532:21;584:4;577:5;573:16;622:3;613:6;608:3;604:16;601:25;598:2;;;639:1;636;629:12;598:2;652:41;686:6;681:3;676;652:41;:::i;:::-;439:260;;;;;;:::o;705:139::-;;789:6;776:20;767:29;;805:33;832:5;805:33;:::i;:::-;757:87;;;;:::o;850:133::-;;931:6;918:20;909:29;;947:30;971:5;947:30;:::i;:::-;899:84;;;;:::o;989:137::-;;1072:6;1059:20;1050:29;;1088:32;1114:5;1088:32;:::i;:::-;1040:86;;;;:::o;1132:141::-;;1219:6;1213:13;1204:22;;1235:32;1261:5;1235:32;:::i;:::-;1194:79;;;;:::o;1292:271::-;;1396:3;1389:4;1381:6;1377:17;1373:27;1363:2;;1414:1;1411;1404:12;1363:2;1454:6;1441:20;1479:78;1553:3;1545:6;1538:4;1530:6;1526:17;1479:78;:::i;:::-;1470:87;;1353:210;;;;;:::o;1583:273::-;;1688:3;1681:4;1673:6;1669:17;1665:27;1655:2;;1706:1;1703;1696:12;1655:2;1746:6;1733:20;1771:79;1846:3;1838:6;1831:4;1823:6;1819:17;1771:79;:::i;:::-;1762:88;;1645:211;;;;;:::o;1862:139::-;;1946:6;1933:20;1924:29;;1962:33;1989:5;1962:33;:::i;:::-;1914:87;;;;:::o;2007:262::-;;2115:2;2103:9;2094:7;2090:23;2086:32;2083:2;;;2131:1;2128;2121:12;2083:2;2174:1;2199:53;2244:7;2235:6;2224:9;2220:22;2199:53;:::i;:::-;2189:63;;2145:117;2073:196;;;;:::o;2275:407::-;;;2400:2;2388:9;2379:7;2375:23;2371:32;2368:2;;;2416:1;2413;2406:12;2368:2;2459:1;2484:53;2529:7;2520:6;2509:9;2505:22;2484:53;:::i;:::-;2474:63;;2430:117;2586:2;2612:53;2657:7;2648:6;2637:9;2633:22;2612:53;:::i;:::-;2602:63;;2557:118;2358:324;;;;;:::o;2688:552::-;;;;2830:2;2818:9;2809:7;2805:23;2801:32;2798:2;;;2846:1;2843;2836:12;2798:2;2889:1;2914:53;2959:7;2950:6;2939:9;2935:22;2914:53;:::i;:::-;2904:63;;2860:117;3016:2;3042:53;3087:7;3078:6;3067:9;3063:22;3042:53;:::i;:::-;3032:63;;2987:118;3144:2;3170:53;3215:7;3206:6;3195:9;3191:22;3170:53;:::i;:::-;3160:63;;3115:118;2788:452;;;;;:::o;3246:809::-;;;;;3414:3;3402:9;3393:7;3389:23;3385:33;3382:2;;;3431:1;3428;3421:12;3382:2;3474:1;3499:53;3544:7;3535:6;3524:9;3520:22;3499:53;:::i;:::-;3489:63;;3445:117;3601:2;3627:53;3672:7;3663:6;3652:9;3648:22;3627:53;:::i;:::-;3617:63;;3572:118;3729:2;3755:53;3800:7;3791:6;3780:9;3776:22;3755:53;:::i;:::-;3745:63;;3700:118;3885:2;3874:9;3870:18;3857:32;3916:18;3908:6;3905:30;3902:2;;;3948:1;3945;3938:12;3902:2;3976:62;4030:7;4021:6;4010:9;4006:22;3976:62;:::i;:::-;3966:72;;3828:220;3372:683;;;;;;;:::o;4061:401::-;;;4183:2;4171:9;4162:7;4158:23;4154:32;4151:2;;;4199:1;4196;4189:12;4151:2;4242:1;4267:53;4312:7;4303:6;4292:9;4288:22;4267:53;:::i;:::-;4257:63;;4213:117;4369:2;4395:50;4437:7;4428:6;4417:9;4413:22;4395:50;:::i;:::-;4385:60;;4340:115;4141:321;;;;;:::o;4468:407::-;;;4593:2;4581:9;4572:7;4568:23;4564:32;4561:2;;;4609:1;4606;4599:12;4561:2;4652:1;4677:53;4722:7;4713:6;4702:9;4698:22;4677:53;:::i;:::-;4667:63;;4623:117;4779:2;4805:53;4850:7;4841:6;4830:9;4826:22;4805:53;:::i;:::-;4795:63;;4750:118;4551:324;;;;;:::o;4881:260::-;;4988:2;4976:9;4967:7;4963:23;4959:32;4956:2;;;5004:1;5001;4994:12;4956:2;5047:1;5072:52;5116:7;5107:6;5096:9;5092:22;5072:52;:::i;:::-;5062:62;;5018:116;4946:195;;;;:::o;5147:282::-;;5265:2;5253:9;5244:7;5240:23;5236:32;5233:2;;;5281:1;5278;5271:12;5233:2;5324:1;5349:63;5404:7;5395:6;5384:9;5380:22;5349:63;:::i;:::-;5339:73;;5295:127;5223:206;;;;:::o;5435:375::-;;5553:2;5541:9;5532:7;5528:23;5524:32;5521:2;;;5569:1;5566;5559:12;5521:2;5640:1;5629:9;5625:17;5612:31;5670:18;5662:6;5659:30;5656:2;;;5702:1;5699;5692:12;5656:2;5730:63;5785:7;5776:6;5765:9;5761:22;5730:63;:::i;:::-;5720:73;;5583:220;5511:299;;;;:::o;5816:262::-;;5924:2;5912:9;5903:7;5899:23;5895:32;5892:2;;;5940:1;5937;5930:12;5892:2;5983:1;6008:53;6053:7;6044:6;6033:9;6029:22;6008:53;:::i;:::-;5998:63;;5954:117;5882:196;;;;:::o;6084:407::-;;;6209:2;6197:9;6188:7;6184:23;6180:32;6177:2;;;6225:1;6222;6215:12;6177:2;6268:1;6293:53;6338:7;6329:6;6318:9;6314:22;6293:53;:::i;:::-;6283:63;;6239:117;6395:2;6421:53;6466:7;6457:6;6446:9;6442:22;6421:53;:::i;:::-;6411:63;;6366:118;6167:324;;;;;:::o;6497:179::-;;6587:46;6629:3;6621:6;6587:46;:::i;:::-;6665:4;6660:3;6656:14;6642:28;;6577:99;;;;:::o;6682:118::-;6769:24;6787:5;6769:24;:::i;:::-;6764:3;6757:37;6747:53;;:::o;6806:157::-;6911:45;6931:24;6949:5;6931:24;:::i;:::-;6911:45;:::i;:::-;6906:3;6899:58;6889:74;;:::o;6999:732::-;;7147:54;7195:5;7147:54;:::i;:::-;7217:86;7296:6;7291:3;7217:86;:::i;:::-;7210:93;;7327:56;7377:5;7327:56;:::i;:::-;7406:7;7437:1;7422:284;7447:6;7444:1;7441:13;7422:284;;;7523:6;7517:13;7550:63;7609:3;7594:13;7550:63;:::i;:::-;7543:70;;7636:60;7689:6;7636:60;:::i;:::-;7626:70;;7482:224;7469:1;7466;7462:9;7457:14;;7422:284;;;7426:14;7722:3;7715:10;;7123:608;;;;;;;:::o;7737:109::-;7818:21;7833:5;7818:21;:::i;:::-;7813:3;7806:34;7796:50;;:::o;7852:118::-;7939:24;7957:5;7939:24;:::i;:::-;7934:3;7927:37;7917:53;;:::o;7976:360::-;;8090:38;8122:5;8090:38;:::i;:::-;8144:70;8207:6;8202:3;8144:70;:::i;:::-;8137:77;;8223:52;8268:6;8263:3;8256:4;8249:5;8245:16;8223:52;:::i;:::-;8300:29;8322:6;8300:29;:::i;:::-;8295:3;8291:39;8284:46;;8066:270;;;;;:::o;8342:364::-;;8458:39;8491:5;8458:39;:::i;:::-;8513:71;8577:6;8572:3;8513:71;:::i;:::-;8506:78;;8593:52;8638:6;8633:3;8626:4;8619:5;8615:16;8593:52;:::i;:::-;8670:29;8692:6;8670:29;:::i;:::-;8665:3;8661:39;8654:46;;8434:272;;;;;:::o;8712:377::-;;8846:39;8879:5;8846:39;:::i;:::-;8901:89;8983:6;8978:3;8901:89;:::i;:::-;8894:96;;8999:52;9044:6;9039:3;9032:4;9025:5;9021:16;8999:52;:::i;:::-;9076:6;9071:3;9067:16;9060:23;;8822:267;;;;;:::o;9095:366::-;;9258:67;9322:2;9317:3;9258:67;:::i;:::-;9251:74;;9355:34;9351:1;9346:3;9342:11;9335:55;9421:4;9416:2;9411:3;9407:12;9400:26;9452:2;9447:3;9443:12;9436:19;;9241:220;;;:::o;9467:382::-;;9630:67;9694:2;9689:3;9630:67;:::i;:::-;9623:74;;9727:34;9723:1;9718:3;9714:11;9707:55;9793:20;9788:2;9783:3;9779:12;9772:42;9840:2;9835:3;9831:12;9824:19;;9613:236;;;:::o;9855:370::-;;10018:67;10082:2;10077:3;10018:67;:::i;:::-;10011:74;;10115:34;10111:1;10106:3;10102:11;10095:55;10181:8;10176:2;10171:3;10167:12;10160:30;10216:2;10211:3;10207:12;10200:19;;10001:224;;;:::o;10231:326::-;;10394:67;10458:2;10453:3;10394:67;:::i;:::-;10387:74;;10491:30;10487:1;10482:3;10478:11;10471:51;10548:2;10543:3;10539:12;10532:19;;10377:180;;;:::o;10563:368::-;;10726:67;10790:2;10785:3;10726:67;:::i;:::-;10719:74;;10823:34;10819:1;10814:3;10810:11;10803:55;10889:6;10884:2;10879:3;10875:12;10868:28;10922:2;10917:3;10913:12;10906:19;;10709:222;;;:::o;10937:323::-;;11100:67;11164:2;11159:3;11100:67;:::i;:::-;11093:74;;11197:27;11193:1;11188:3;11184:11;11177:48;11251:2;11246:3;11242:12;11235:19;;11083:177;;;:::o;11266:316::-;;11429:67;11493:2;11488:3;11429:67;:::i;:::-;11422:74;;11526:20;11522:1;11517:3;11513:11;11506:41;11573:2;11568:3;11564:12;11557:19;;11412:170;;;:::o;11588:329::-;;11751:67;11815:2;11810:3;11751:67;:::i;:::-;11744:74;;11848:33;11844:1;11839:3;11835:11;11828:54;11908:2;11903:3;11899:12;11892:19;;11734:183;;;:::o;11923:376::-;;12086:67;12150:2;12145:3;12086:67;:::i;:::-;12079:74;;12183:34;12179:1;12174:3;12170:11;12163:55;12249:14;12244:2;12239:3;12235:12;12228:36;12290:2;12285:3;12281:12;12274:19;;12069:230;;;:::o;12305:388::-;;12468:67;12532:2;12527:3;12468:67;:::i;:::-;12461:74;;12565:34;12561:1;12556:3;12552:11;12545:55;12631:26;12626:2;12621:3;12617:12;12610:48;12684:2;12679:3;12675:12;12668:19;;12451:242;;;:::o;12699:374::-;;12862:67;12926:2;12921:3;12862:67;:::i;:::-;12855:74;;12959:34;12955:1;12950:3;12946:11;12939:55;13025:12;13020:2;13015:3;13011:12;13004:34;13064:2;13059:3;13055:12;13048:19;;12845:228;;;:::o;13079:366::-;;13242:67;13306:2;13301:3;13242:67;:::i;:::-;13235:74;;13339:34;13335:1;13330:3;13326:11;13319:55;13405:4;13400:2;13395:3;13391:12;13384:26;13436:2;13431:3;13427:12;13420:19;;13225:220;;;:::o;13451:330::-;;13614:67;13678:2;13673:3;13614:67;:::i;:::-;13607:74;;13711:34;13707:1;13702:3;13698:11;13691:55;13772:2;13767:3;13763:12;13756:19;;13597:184;;;:::o;13787:376::-;;13950:67;14014:2;14009:3;13950:67;:::i;:::-;13943:74;;14047:34;14043:1;14038:3;14034:11;14027:55;14113:14;14108:2;14103:3;14099:12;14092:36;14154:2;14149:3;14145:12;14138:19;;13933:230;;;:::o;14169:330::-;;14332:67;14396:2;14391:3;14332:67;:::i;:::-;14325:74;;14429:34;14425:1;14420:3;14416:11;14409:55;14490:2;14485:3;14481:12;14474:19;;14315:184;;;:::o;14505:373::-;;14668:67;14732:2;14727:3;14668:67;:::i;:::-;14661:74;;14765:34;14761:1;14756:3;14752:11;14745:55;14831:11;14826:2;14821:3;14817:12;14810:33;14869:2;14864:3;14860:12;14853:19;;14651:227;;;:::o;14884:379::-;;15047:67;15111:2;15106:3;15047:67;:::i;:::-;15040:74;;15144:34;15140:1;15135:3;15131:11;15124:55;15210:17;15205:2;15200:3;15196:12;15189:39;15254:2;15249:3;15245:12;15238:19;;15030:233;;;:::o;15269:365::-;;15432:67;15496:2;15491:3;15432:67;:::i;:::-;15425:74;;15529:34;15525:1;15520:3;15516:11;15509:55;15595:3;15590:2;15585:3;15581:12;15574:25;15625:2;15620:3;15616:12;15609:19;;15415:219;;;:::o;15640:320::-;;15803:67;15867:2;15862:3;15803:67;:::i;:::-;15796:74;;15900:24;15896:1;15891:3;15887:11;15880:45;15951:2;15946:3;15942:12;15935:19;;15786:174;;;:::o;15966:381::-;;16129:67;16193:2;16188:3;16129:67;:::i;:::-;16122:74;;16226:34;16222:1;16217:3;16213:11;16206:55;16292:19;16287:2;16282:3;16278:12;16271:41;16338:2;16333:3;16329:12;16322:19;;16112:235;;;:::o;16353:370::-;;16516:67;16580:2;16575:3;16516:67;:::i;:::-;16509:74;;16613:34;16609:1;16604:3;16600:11;16593:55;16679:8;16674:2;16669:3;16665:12;16658:30;16714:2;16709:3;16705:12;16698:19;;16499:224;;;:::o;16729:312::-;;16892:67;16956:2;16951:3;16892:67;:::i;:::-;16885:74;;16989:16;16985:1;16980:3;16976:11;16969:37;17032:2;17027:3;17023:12;17016:19;;16875:166;;;:::o;17047:322::-;;17210:67;17274:2;17269:3;17210:67;:::i;:::-;17203:74;;17307:26;17303:1;17298:3;17294:11;17287:47;17360:2;17355:3;17351:12;17344:19;;17193:176;;;:::o;17375:316::-;;17538:67;17602:2;17597:3;17538:67;:::i;:::-;17531:74;;17635:20;17631:1;17626:3;17622:11;17615:41;17682:2;17677:3;17673:12;17666:19;;17521:170;;;:::o;17697:108::-;17774:24;17792:5;17774:24;:::i;:::-;17769:3;17762:37;17752:53;;:::o;17811:118::-;17898:24;17916:5;17898:24;:::i;:::-;17893:3;17886:37;17876:53;;:::o;17935:157::-;18040:45;18060:24;18078:5;18060:24;:::i;:::-;18040:45;:::i;:::-;18035:3;18028:58;18018:74;;:::o;18098:538::-;;18281:75;18352:3;18343:6;18281:75;:::i;:::-;18381:2;18376:3;18372:12;18365:19;;18394:75;18465:3;18456:6;18394:75;:::i;:::-;18494:2;18489:3;18485:12;18478:19;;18507:75;18578:3;18569:6;18507:75;:::i;:::-;18607:2;18602:3;18598:12;18591:19;;18627:3;18620:10;;18270:366;;;;;;:::o;18642:435::-;;18844:95;18935:3;18926:6;18844:95;:::i;:::-;18837:102;;18956:95;19047:3;19038:6;18956:95;:::i;:::-;18949:102;;19068:3;19061:10;;18826:251;;;;;:::o;19083:222::-;;19214:2;19203:9;19199:18;19191:26;;19227:71;19295:1;19284:9;19280:17;19271:6;19227:71;:::i;:::-;19181:124;;;;:::o;19311:640::-;;19544:3;19533:9;19529:19;19521:27;;19558:71;19626:1;19615:9;19611:17;19602:6;19558:71;:::i;:::-;19639:72;19707:2;19696:9;19692:18;19683:6;19639:72;:::i;:::-;19721;19789:2;19778:9;19774:18;19765:6;19721:72;:::i;:::-;19840:9;19834:4;19830:20;19825:2;19814:9;19810:18;19803:48;19868:76;19939:4;19930:6;19868:76;:::i;:::-;19860:84;;19511:440;;;;;;;:::o;19957:373::-;;20138:2;20127:9;20123:18;20115:26;;20187:9;20181:4;20177:20;20173:1;20162:9;20158:17;20151:47;20215:108;20318:4;20309:6;20215:108;:::i;:::-;20207:116;;20105:225;;;;:::o;20336:210::-;;20461:2;20450:9;20446:18;20438:26;;20474:65;20536:1;20525:9;20521:17;20512:6;20474:65;:::i;:::-;20428:118;;;;:::o;20552:222::-;;20683:2;20672:9;20668:18;20660:26;;20696:71;20764:1;20753:9;20749:17;20740:6;20696:71;:::i;:::-;20650:124;;;;:::o;20780:313::-;;20931:2;20920:9;20916:18;20908:26;;20980:9;20974:4;20970:20;20966:1;20955:9;20951:17;20944:47;21008:78;21081:4;21072:6;21008:78;:::i;:::-;21000:86;;20898:195;;;;:::o;21099:419::-;;21303:2;21292:9;21288:18;21280:26;;21352:9;21346:4;21342:20;21338:1;21327:9;21323:17;21316:47;21380:131;21506:4;21380:131;:::i;:::-;21372:139;;21270:248;;;:::o;21524:419::-;;21728:2;21717:9;21713:18;21705:26;;21777:9;21771:4;21767:20;21763:1;21752:9;21748:17;21741:47;21805:131;21931:4;21805:131;:::i;:::-;21797:139;;21695:248;;;:::o;21949:419::-;;22153:2;22142:9;22138:18;22130:26;;22202:9;22196:4;22192:20;22188:1;22177:9;22173:17;22166:47;22230:131;22356:4;22230:131;:::i;:::-;22222:139;;22120:248;;;:::o;22374:419::-;;22578:2;22567:9;22563:18;22555:26;;22627:9;22621:4;22617:20;22613:1;22602:9;22598:17;22591:47;22655:131;22781:4;22655:131;:::i;:::-;22647:139;;22545:248;;;:::o;22799:419::-;;23003:2;22992:9;22988:18;22980:26;;23052:9;23046:4;23042:20;23038:1;23027:9;23023:17;23016:47;23080:131;23206:4;23080:131;:::i;:::-;23072:139;;22970:248;;;:::o;23224:419::-;;23428:2;23417:9;23413:18;23405:26;;23477:9;23471:4;23467:20;23463:1;23452:9;23448:17;23441:47;23505:131;23631:4;23505:131;:::i;:::-;23497:139;;23395:248;;;:::o;23649:419::-;;23853:2;23842:9;23838:18;23830:26;;23902:9;23896:4;23892:20;23888:1;23877:9;23873:17;23866:47;23930:131;24056:4;23930:131;:::i;:::-;23922:139;;23820:248;;;:::o;24074:419::-;;24278:2;24267:9;24263:18;24255:26;;24327:9;24321:4;24317:20;24313:1;24302:9;24298:17;24291:47;24355:131;24481:4;24355:131;:::i;:::-;24347:139;;24245:248;;;:::o;24499:419::-;;24703:2;24692:9;24688:18;24680:26;;24752:9;24746:4;24742:20;24738:1;24727:9;24723:17;24716:47;24780:131;24906:4;24780:131;:::i;:::-;24772:139;;24670:248;;;:::o;24924:419::-;;25128:2;25117:9;25113:18;25105:26;;25177:9;25171:4;25167:20;25163:1;25152:9;25148:17;25141:47;25205:131;25331:4;25205:131;:::i;:::-;25197:139;;25095:248;;;:::o;25349:419::-;;25553:2;25542:9;25538:18;25530:26;;25602:9;25596:4;25592:20;25588:1;25577:9;25573:17;25566:47;25630:131;25756:4;25630:131;:::i;:::-;25622:139;;25520:248;;;:::o;25774:419::-;;25978:2;25967:9;25963:18;25955:26;;26027:9;26021:4;26017:20;26013:1;26002:9;25998:17;25991:47;26055:131;26181:4;26055:131;:::i;:::-;26047:139;;25945:248;;;:::o;26199:419::-;;26403:2;26392:9;26388:18;26380:26;;26452:9;26446:4;26442:20;26438:1;26427:9;26423:17;26416:47;26480:131;26606:4;26480:131;:::i;:::-;26472:139;;26370:248;;;:::o;26624:419::-;;26828:2;26817:9;26813:18;26805:26;;26877:9;26871:4;26867:20;26863:1;26852:9;26848:17;26841:47;26905:131;27031:4;26905:131;:::i;:::-;26897:139;;26795:248;;;:::o;27049:419::-;;27253:2;27242:9;27238:18;27230:26;;27302:9;27296:4;27292:20;27288:1;27277:9;27273:17;27266:47;27330:131;27456:4;27330:131;:::i;:::-;27322:139;;27220:248;;;:::o;27474:419::-;;27678:2;27667:9;27663:18;27655:26;;27727:9;27721:4;27717:20;27713:1;27702:9;27698:17;27691:47;27755:131;27881:4;27755:131;:::i;:::-;27747:139;;27645:248;;;:::o;27899:419::-;;28103:2;28092:9;28088:18;28080:26;;28152:9;28146:4;28142:20;28138:1;28127:9;28123:17;28116:47;28180:131;28306:4;28180:131;:::i;:::-;28172:139;;28070:248;;;:::o;28324:419::-;;28528:2;28517:9;28513:18;28505:26;;28577:9;28571:4;28567:20;28563:1;28552:9;28548:17;28541:47;28605:131;28731:4;28605:131;:::i;:::-;28597:139;;28495:248;;;:::o;28749:419::-;;28953:2;28942:9;28938:18;28930:26;;29002:9;28996:4;28992:20;28988:1;28977:9;28973:17;28966:47;29030:131;29156:4;29030:131;:::i;:::-;29022:139;;28920:248;;;:::o;29174:419::-;;29378:2;29367:9;29363:18;29355:26;;29427:9;29421:4;29417:20;29413:1;29402:9;29398:17;29391:47;29455:131;29581:4;29455:131;:::i;:::-;29447:139;;29345:248;;;:::o;29599:419::-;;29803:2;29792:9;29788:18;29780:26;;29852:9;29846:4;29842:20;29838:1;29827:9;29823:17;29816:47;29880:131;30006:4;29880:131;:::i;:::-;29872:139;;29770:248;;;:::o;30024:419::-;;30228:2;30217:9;30213:18;30205:26;;30277:9;30271:4;30267:20;30263:1;30252:9;30248:17;30241:47;30305:131;30431:4;30305:131;:::i;:::-;30297:139;;30195:248;;;:::o;30449:419::-;;30653:2;30642:9;30638:18;30630:26;;30702:9;30696:4;30692:20;30688:1;30677:9;30673:17;30666:47;30730:131;30856:4;30730:131;:::i;:::-;30722:139;;30620:248;;;:::o;30874:419::-;;31078:2;31067:9;31063:18;31055:26;;31127:9;31121:4;31117:20;31113:1;31102:9;31098:17;31091:47;31155:131;31281:4;31155:131;:::i;:::-;31147:139;;31045:248;;;:::o;31299:222::-;;31430:2;31419:9;31415:18;31407:26;;31443:71;31511:1;31500:9;31496:17;31487:6;31443:71;:::i;:::-;31397:124;;;;:::o;31527:283::-;;31593:2;31587:9;31577:19;;31635:4;31627:6;31623:17;31742:6;31730:10;31727:22;31706:18;31694:10;31691:34;31688:62;31685:2;;;31753:18;;:::i;:::-;31685:2;31793:10;31789:2;31782:22;31567:243;;;;:::o;31816:331::-;;31967:18;31959:6;31956:30;31953:2;;;31989:18;;:::i;:::-;31953:2;32074:4;32070:9;32063:4;32055:6;32051:17;32047:33;32039:41;;32135:4;32129;32125:15;32117:23;;31882:265;;;:::o;32153:332::-;;32305:18;32297:6;32294:30;32291:2;;;32327:18;;:::i;:::-;32291:2;32412:4;32408:9;32401:4;32393:6;32389:17;32385:33;32377:41;;32473:4;32467;32463:15;32455:23;;32220:265;;;:::o;32491:132::-;;32581:3;32573:11;;32611:4;32606:3;32602:14;32594:22;;32563:60;;;:::o;32629:114::-;;32730:5;32724:12;32714:22;;32703:40;;;:::o;32749:98::-;;32834:5;32828:12;32818:22;;32807:40;;;:::o;32853:99::-;;32939:5;32933:12;32923:22;;32912:40;;;:::o;32958:113::-;;33060:4;33055:3;33051:14;33043:22;;33033:38;;;:::o;33077:184::-;;33210:6;33205:3;33198:19;33250:4;33245:3;33241:14;33226:29;;33188:73;;;;:::o;33267:168::-;;33384:6;33379:3;33372:19;33424:4;33419:3;33415:14;33400:29;;33362:73;;;;:::o;33441:169::-;;33559:6;33554:3;33547:19;33599:4;33594:3;33590:14;33575:29;;33537:73;;;;:::o;33616:148::-;;33755:3;33740:18;;33730:34;;;;:::o;33770:305::-;;33829:20;33847:1;33829:20;:::i;:::-;33824:25;;33863:20;33881:1;33863:20;:::i;:::-;33858:25;;34017:1;33949:66;33945:74;33942:1;33939:81;33936:2;;;34023:18;;:::i;:::-;33936:2;34067:1;34064;34060:9;34053:16;;33814:261;;;;:::o;34081:185::-;;34138:20;34156:1;34138:20;:::i;:::-;34133:25;;34172:20;34190:1;34172:20;:::i;:::-;34167:25;;34211:1;34201:2;;34216:18;;:::i;:::-;34201:2;34258:1;34255;34251:9;34246:14;;34123:143;;;;:::o;34272:348::-;;34335:20;34353:1;34335:20;:::i;:::-;34330:25;;34369:20;34387:1;34369:20;:::i;:::-;34364:25;;34557:1;34489:66;34485:74;34482:1;34479:81;34474:1;34467:9;34460:17;34456:105;34453:2;;;34564:18;;:::i;:::-;34453:2;34612:1;34609;34605:9;34594:20;;34320:300;;;;:::o;34626:191::-;;34686:20;34704:1;34686:20;:::i;:::-;34681:25;;34720:20;34738:1;34720:20;:::i;:::-;34715:25;;34759:1;34756;34753:8;34750:2;;;34764:18;;:::i;:::-;34750:2;34809:1;34806;34802:9;34794:17;;34671:146;;;;:::o;34823:96::-;;34889:24;34907:5;34889:24;:::i;:::-;34878:35;;34868:51;;;:::o;34925:90::-;;35002:5;34995:13;34988:21;34977:32;;34967:48;;;:::o;35021:77::-;;35087:5;35076:16;;35066:32;;;:::o;35104:149::-;;35180:66;35173:5;35169:78;35158:89;;35148:105;;;:::o;35259:126::-;;35336:42;35329:5;35325:54;35314:65;;35304:81;;;:::o;35391:77::-;;35457:5;35446:16;;35436:32;;;:::o;35474:154::-;35558:6;35553:3;35548;35535:30;35620:1;35611:6;35606:3;35602:16;35595:27;35525:103;;;:::o;35634:307::-;35702:1;35712:113;35726:6;35723:1;35720:13;35712:113;;;35811:1;35806:3;35802:11;35796:18;35792:1;35787:3;35783:11;35776:39;35748:2;35745:1;35741:10;35736:15;;35712:113;;;35843:6;35840:1;35837:13;35834:2;;;35923:1;35914:6;35909:3;35905:16;35898:27;35834:2;35683:258;;;;:::o;35947:320::-;;36028:1;36022:4;36018:12;36008:22;;36075:1;36069:4;36065:12;36096:18;36086:2;;36152:4;36144:6;36140:17;36130:27;;36086:2;36214;36206:6;36203:14;36183:18;36180:38;36177:2;;;36233:18;;:::i;:::-;36177:2;35998:269;;;;:::o;36273:233::-;;36335:24;36353:5;36335:24;:::i;:::-;36326:33;;36381:66;36374:5;36371:77;36368:2;;;36451:18;;:::i;:::-;36368:2;36498:1;36491:5;36487:13;36480:20;;36316:190;;;:::o;36512:100::-;;36580:26;36600:5;36580:26;:::i;:::-;36569:37;;36559:53;;;:::o;36618:94::-;;36686:20;36700:5;36686:20;:::i;:::-;36675:31;;36665:47;;;:::o;36718:79::-;;36786:5;36775:16;;36765:32;;;:::o;36803:176::-;;36852:20;36870:1;36852:20;:::i;:::-;36847:25;;36886:20;36904:1;36886:20;:::i;:::-;36881:25;;36925:1;36915:2;;36930:18;;:::i;:::-;36915:2;36971:1;36968;36964:9;36959:14;;36837:142;;;;:::o;36985:180::-;37033:77;37030:1;37023:88;37130:4;37127:1;37120:15;37154:4;37151:1;37144:15;37171:180;37219:77;37216:1;37209:88;37316:4;37313:1;37306:15;37340:4;37337:1;37330:15;37357:180;37405:77;37402:1;37395:88;37502:4;37499:1;37492:15;37526:4;37523:1;37516:15;37543:180;37591:77;37588:1;37581:88;37688:4;37685:1;37678:15;37712:4;37709:1;37702:15;37729:102;;37821:2;37817:7;37812:2;37805:5;37801:14;37797:28;37787:38;;37777:54;;;:::o;37837:94::-;;37918:5;37914:2;37910:14;37889:35;;37879:52;;;:::o;37937:122::-;38010:24;38028:5;38010:24;:::i;:::-;38003:5;38000:35;37990:2;;38049:1;38046;38039:12;37990:2;37980:79;:::o;38065:116::-;38135:21;38150:5;38135:21;:::i;:::-;38128:5;38125:32;38115:2;;38171:1;38168;38161:12;38115:2;38105:76;:::o;38187:120::-;38259:23;38276:5;38259:23;:::i;:::-;38252:5;38249:34;38239:2;;38297:1;38294;38287:12;38239:2;38229:78;:::o;38313:122::-;38386:24;38404:5;38386:24;:::i;:::-;38379:5;38376:35;38366:2;;38425:1;38422;38415:12;38366:2;38356:79;:::o

Swarm Source

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