ETH Price: $2,661.21 (+1.34%)

Token

ORBITSNFT (ORBITS)
 

Overview

Max Total Supply

363 ORBITS

Holders

234

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 ORBITS
0x1ee4aec751ab97a6f1f60b87c48e52387eee91de
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
Orbits

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: UNLICENSED

// ørß1t$
// generative art nft project by berk aka princesscamel
// @berkozdemir - berkozdemir.com
// forked from RedemptionNFT.art by @memoryc0llector - 0x399AA4e3A65282eEe090EB58aedD787431C4aF2D

// In 2019, I was heavily influenced by Alexai Shulgin's "Form Art", and one of my first generative visual works using p5.js was making orbiting html radio buttons on browser. 
// The live sketch can be viewed at my website "https://berkozdemir.com/", and SuperRare (as radiOrbit #1 and #2). 
// "ørß1t$” is the updated version, rewritten for on-chain generative art purposes; which displays a unique combination of varying object shapes, color palettes & distribution, orbit directions & speeds for every mint.
// You can click on canvas and move in x-axis to change the overall spinning speed.

//                                .`           :/`                                 
//                               `hy.          os-                                 
//                                ``                        -.                     
//                   `--                                   -ys                     
//                   `::                                    ``                     
//                                                                           
//                             oh/                                     `           
//                             `/`                                   -yh           
//          -:.                                                      `:/           
//          `-`                      ..    `/-                                     
//                                   yd:   .hs`   ..                               
//                             +o.   .-     `     ::`                              
//                             /y.                      .                          
//                         ``             `            -:.        `:/       :+.    
//    `oo                 ./:         `/::ho.-```                 .++       .-     
//    -oy`                 ``       -:-o+.o:.--os``       `.:                      
//                       `        /y/-`        .-/+`      -so                      
//                     `ym-      .o+-            `oy/                              
//                      .-`      oo-              :s:                              
//                              -Nd`              `--      .ss`                    
//                      //`      +s-              :+/       ``               .yy`  
//    sy.               +/.      /oo.            `./`                         ``   
//    /:.                         .y+-.        ./..`      -o+                      
//                        .:.      `.+:oh::+.ys/o:        `+-                      
//              `dy.      /s:        ` :s-+o.//`                                   
//               o:`       `                           ys.                         
//                            .dy`                     ::`                .+:`     
//        ..`                  +:   `..     `    `/-                      .y+      
//        ++-                       .o/    od:   `..                               
//        `                          ``    .:.                                     
//                                                                             
//                                                  `:`            ``              
//                ```                               /s:            yh-             
//                /ds                                              --`             
//                `:`                                                              
//                                                      `.                         
//                            `.                        sy.                        
//                            ``           +y.           `                         
//                                         /s.                                     
                                                                                
// File: http://github.com/OpenZeppelin/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol


pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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



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;

interface IAMABASTARD {
    function balanceOf(address _address) external view returns (uint256);
}

contract Orbits is ERC721, Ownable {

    using SafeMath for uint256;
    using Strings for uint256;

    uint public constant MAX_TOKENS = 1024;
    uint public constant MAX_SALES = 815;
    uint public constant MAX_FREE_MINT = 200;

    uint public SALE_COUNT;
    uint public FREE_MINT_COUNT;

    bool public hasSaleStarted = false;

    mapping (uint256 => uint256) public creationDates;
    mapping (uint256 => address) public creators;

    mapping(uint => string) public GENERATOR_SCRIPT_CODE;

    string public GENERATOR_ADDRESS;

    string public constant ORBITS_LICENSE = "YOUR orbit, YOUR CALL. If you own an NFT from this collection, you are fully permitted to do whatever you want with it (including both non-commercial/commercial uses). You can even do paid fortune telling with it lol. Also, creative derivative works are highly encouraged.";

    uint public constant PRICE = 77700000000000000; // 0.0777 ETH
    uint public constant SOS_PRICE = 42069420694206942069420690; // 42069420.694206942069420690 SOS

    mapping (address => bool) public didWalletFreeClaim;

    address private BGANPUNKSV2ADDRESS = 0x31385d3520bCED94f77AaE104b406994D8F2168C;

    address private BERK = 0xc5E08104c19DAfd00Fe40737490Da9552Db5bfE5;
    address private MEMORYCOLLECTOR = 0xEbbCF9D8576376765dba9d883145cEeeE243ad44;
    address private BASTARDDAO = 0x15D0F64FFCf91c39810529F805Cc3595Dc3EF83f;

    IERC20 SOSTOKEN = IERC20(0x3b484b82567a09e2588A13D54D032153f0c0aEe0);

    constructor() ERC721("ORBITSNFT","ORBITS")  {
        
        GENERATOR_SCRIPT_CODE[0] = "https://berk.mypinata.cloud/ipfs/QmTCfmKEeLsLSVAnmhUa1H96A5brNr1RQx8QAfiCbAMRMs"; // p5.min.js (IPFS)
        GENERATOR_SCRIPT_CODE[3] = "https://arweave.net/0LIfIHnzQMW5sgyxDV2BSioNuud-KPkd7dHpcD8GskY"; // p5.min.js (ARWEAVE)
        GENERATOR_SCRIPT_CODE[1] = "https://berk.mypinata.cloud/ipfs/QmYeLy8QMqq4Zp4A2zBBtgGT23574G8cDCtpu51TL7XCMB"; // slightly edited chroma.min.js (IPFS)
        GENERATOR_SCRIPT_CODE[4] = "https://arweave.net/LC2IBFq_Vol-8t-ZHRm9slgU8Wag-EXQdg2-vF_qllI"; // slightly edited chroma.min.js (ARWEAVE)
        GENERATOR_SCRIPT_CODE[2] = "https://berk.mypinata.cloud/ipfs/QmYxCmfpfu8zqvr1CKcG29pAGGLutTi4Nxju4RaX7Rnc3f"; // ørß1t$ sketch code (IPFS)
        GENERATOR_SCRIPT_CODE[5] = "https://arweave.net/qA_hQ7Q8976FJb7KEg1IZO8GyVJWP1V0xcRJrJs2dWw"; // ørß1t$ sketch code (ARWEAVE)

        setBaseURI("https://orbitsnft.art/api/token/");
        setGeneratorAddress("https://orbitsnft.art/generator/");

        _safeMint(BERK, 0); // I DESERVE THE #0
        creationDates[0] = block.number;
        creators[0] = BERK;

        _safeMint(MEMORYCOLLECTOR, 1); // TO MEMORYCOLLECTOR FOR HELPING
        creationDates[1] = block.number;
        creators[1] = MEMORYCOLLECTOR;

        _safeMint(BERK, 2); // I DESERVE THE #2
        creationDates[2] = block.number;
        creators[2] = BERK;

        _safeMint(MEMORYCOLLECTOR, 3); // TO MEMORYCOLLECTOR FOR HELPING
        creationDates[3] = block.number;
        creators[3] = MEMORYCOLLECTOR;

        _safeMint(BASTARDDAO, 4); // TO BASTARDDAO, BECAUSE WE LOVE THE BASTARDS
        creationDates[4] = block.number;
        creators[4] = BASTARDDAO;

        _safeMint(BASTARDDAO, 5); // TO BASTARDDAO, BECAUSE WE LOVE THE BASTARDS
        creationDates[5] = block.number;
        creators[5] = BASTARDDAO;

        _safeMint(BASTARDDAO, 6); // TO BASTARDDAO, BECAUSE WE LOVE THE BASTARDS
        creationDates[6] = block.number;
        creators[6] = BASTARDDAO;

        _safeMint(BASTARDDAO, 7); // TO BASTARDDAO, BECAUSE WE LOVE THE BASTARDS
        creationDates[7] = block.number;
        creators[7] = BASTARDDAO;

        _safeMint(BASTARDDAO, 8); // TO BASTARDDAO, BECAUSE WE LOVE THE BASTARDS
        creationDates[8] = block.number;
        creators[8] = BASTARDDAO;

    }
    
    function tokenLicense(uint _id) public view returns(string memory) {
        require(_id < totalSupply(), "wrong id");
        return ORBITS_LICENSE;
    }

    function tokensOfOwner(address _owner) external view returns(uint256[] memory ) {
        uint256 tokenCount = balanceOf(_owner);
        if (tokenCount == 0) {
            // Return an empty array
            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 tokenHash(uint256 tokenId) public view returns(bytes32){
        require(_exists(tokenId), "DOES NOT EXIST");
        return bytes32(keccak256(abi.encodePacked(address(this), creationDates[tokenId], creators[tokenId], tokenId)));
    }
    
    function generatorAddress(uint256 tokenId) public view returns (string memory) {
        require(_exists(tokenId), "DOES NOT EXIST");
        return string(abi.encodePacked(GENERATOR_ADDRESS, tokenId.toString()));
    }

    function freeOrbitForBastard() public {
        require(hasSaleStarted == true, "Minting isn't open");
        require(FREE_MINT_COUNT < MAX_FREE_MINT, "No more free mints dear bastard :(");
        uint mintIndex = totalSupply();
        require(mintIndex < MAX_TOKENS, "No more orbit left to mint");
        require(IAMABASTARD(BGANPUNKSV2ADDRESS).balanceOf(msg.sender) > 0, "Wallet has no bastards!");
        require(didWalletFreeClaim[msg.sender] == false, "Wallet already used for free mint");
        didWalletFreeClaim[msg.sender] = true;
        _safeMint(msg.sender, mintIndex);
        creationDates[mintIndex] = block.number;
        creators[mintIndex] = msg.sender;
        FREE_MINT_COUNT++;
    }

    function mintOrbit() public payable {
        require(hasSaleStarted == true, "Minting isn't open");
        require(SALE_COUNT < MAX_SALES, "Sale has already ended");
        uint mintIndex = totalSupply();
        require(mintIndex < MAX_TOKENS, "No more orbit left to mint");
        require(msg.value >= PRICE, "Ether value sent is below the price");
        _safeMint(msg.sender, mintIndex);
        creationDates[mintIndex] = block.number;
        creators[mintIndex] = msg.sender;
        SALE_COUNT++;
    }

    function mintOrbitWithSOS() public payable {
        require(hasSaleStarted == true, "Minting isn't open");
        require(SALE_COUNT < MAX_SALES, "Sale has already ended");
        uint mintIndex = totalSupply();
        require(mintIndex < MAX_TOKENS, "No more orbit left to mint");
        require(SOSTOKEN.allowance(msg.sender, address(this)) >= SOS_PRICE,"Insuficient Allowance");
        require(SOSTOKEN.transferFrom(msg.sender,address(this),SOS_PRICE),"transfer Failed");
        _safeMint(msg.sender, mintIndex);
        creationDates[mintIndex] = block.number;
        creators[mintIndex] = msg.sender;
        SALE_COUNT++;
    }
    
    // ONLYOWNER FUNCTIONS

    function modifyScript(uint _index, string memory _code) public onlyOwner {
        GENERATOR_SCRIPT_CODE[_index] = _code;
    }
        
    function setGeneratorAddress(string memory _address) public onlyOwner {
        GENERATOR_ADDRESS = _address;
    }

    function setBaseURI(string memory baseURI) public onlyOwner {
        _setBaseURI(baseURI);
    }
    
    function startMint() public onlyOwner {
        hasSaleStarted = true;
    }
    
    function pauseMint() public onlyOwner {
        hasSaleStarted = false;
    }

    function withdrawAll() public payable onlyOwner {
        require(payable(msg.sender).send(address(this).balance));
        require(SOSTOKEN.transfer(msg.sender, SOSTOKEN.balanceOf(address(this))));
    }
    
    
}

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":"FREE_MINT_COUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GENERATOR_ADDRESS","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"GENERATOR_SCRIPT_CODE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_FREE_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SALES","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":"ORBITS_LICENSE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SALE_COUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SOS_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":[{"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":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"creators","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"didWalletFreeClaim","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freeOrbitForBastard","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"generatorAddress","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hasSaleStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintOrbit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintOrbitWithSOS","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"},{"internalType":"string","name":"_code","type":"string"}],"name":"modifyScript","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pauseMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_address","type":"string"}],"name":"setGeneratorAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startMint","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":"uint256","name":"_id","type":"uint256"}],"name":"tokenLicense","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"withdrawAll","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526000600d60006101000a81548160ff0219169083151502179055507331385d3520bced94f77aae104b406994d8f2168c601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073c5e08104c19dafd00fe40737490da9552db5bfe5601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073ebbcf9d8576376765dba9d883145ceeee243ad44601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507315d0f64ffcf91c39810529f805cc3595dc3ef83f601660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550733b484b82567a09e2588a13d54d032153f0c0aee0601760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620001d557600080fd5b506040518060400160405280600981526020017f4f52424954534e465400000000000000000000000000000000000000000000008152506040518060400160405280600681526020017f4f52424954530000000000000000000000000000000000000000000000000000815250620002737f01ffc9a70000000000000000000000000000000000000000000000000000000062000ced60201b60201c565b81600690805190602001906200028b929190620015d1565b508060079080519060200190620002a4929190620015d1565b50620002d67f80ac58cd0000000000000000000000000000000000000000000000000000000062000ced60201b60201c565b620003077f5b5e139f0000000000000000000000000000000000000000000000000000000062000ced60201b60201c565b620003387f780e9d630000000000000000000000000000000000000000000000000000000062000ced60201b60201c565b505060006200034c62000dc560201b60201c565b905080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3506040518060800160405280604f815260200162007437604f91396010600080815260200190815260200160002090805190602001906200042d929190620015d1565b506040518060600160405280603f8152602001620073b9603f91396010600060038152602001908152602001600020908051906020019062000471929190620015d1565b506040518060800160405280604f815260200162007486604f913960106000600181526020019081526020016000209080519060200190620004b5929190620015d1565b506040518060600160405280603f81526020016200737a603f913960106000600481526020019081526020016000209080519060200190620004f9929190620015d1565b506040518060800160405280604f81526020016200732b604f9139601060006002815260200190815260200160002090805190602001906200053d929190620015d1565b506040518060600160405280603f8152602001620073f8603f91396010600060058152602001908152602001600020908051906020019062000581929190620015d1565b50620005c86040518060400160405280602081526020017f68747470733a2f2f6f72626974736e66742e6172742f6170692f746f6b656e2f81525062000dcd60201b60201c565b6200060e6040518060400160405280602081526020017f68747470733a2f2f6f72626974736e66742e6172742f67656e657261746f722f81525062000e7060201b60201c565b62000643601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600062000f1b60201b60201c565b43600e600080815260200190815260200160002081905550601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600f600080815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062000704601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600162000f1b60201b60201c565b43600e60006001815260200190815260200160002081905550601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600f60006001815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620007c7601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600262000f1b60201b60201c565b43600e60006002815260200190815260200160002081905550601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600f60006002815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200088a601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600362000f1b60201b60201c565b43600e60006003815260200190815260200160002081905550601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600f60006003815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200094d601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600462000f1b60201b60201c565b43600e60006004815260200190815260200160002081905550601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600f60006004815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062000a10601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600562000f1b60201b60201c565b43600e60006005815260200190815260200160002081905550601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600f60006005815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062000ad3601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600662000f1b60201b60201c565b43600e60006006815260200190815260200160002081905550601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600f60006006815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062000b96601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600762000f1b60201b60201c565b43600e60006007815260200190815260200160002081905550601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600f60006007815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062000c59601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600862000f1b60201b60201c565b43600e60006008815260200190815260200160002081905550601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600f60006008815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062001bdc565b63ffffffff60e01b817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141562000d59576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000d509062001866565b60405180910390fd5b6001600080837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600033905090565b62000ddd62000dc560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1662000e0362000f4160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000e5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000e5390620018cc565b60405180910390fd5b62000e6d8162000f6b60201b60201c565b50565b62000e8062000dc560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1662000ea662000f4160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000eff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000ef690620018cc565b60405180910390fd5b806011908051906020019062000f17929190620015d1565b5050565b62000f3d82826040518060200160405280600081525062000f8760201b60201c565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b806009908051906020019062000f83929190620015d1565b5050565b62000f99838362000ff560201b60201c565b62000fae6000848484620011a760201b60201c565b62000ff0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000fe79062001844565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562001068576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200105f90620018aa565b60405180910390fd5b62001079816200136160201b60201c565b15620010bc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620010b39062001888565b60405180910390fd5b620010d0600083836200138560201b60201c565b6200112881600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206200138a60201b620029e21790919060201c565b506200114681836002620013ac60201b620029fc179092919060201c565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000620011d58473ffffffffffffffffffffffffffffffffffffffff16620013e960201b62002a311760201c565b1562001354578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026200120762000dc560201b60201c565b8786866040518563ffffffff1660e01b81526004016200122b9493929190620017f0565b602060405180830381600087803b1580156200124657600080fd5b505af19250505080156200127a57506040513d601f19601f8201168201806040525081019062001277919062001698565b60015b62001303573d8060008114620012ad576040519150601f19603f3d011682016040523d82523d6000602084013e620012b2565b606091505b50600081511415620012fb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620012f29062001844565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505062001359565b600190505b949350505050565b60006200137e826002620013fc60201b62002a441790919060201c565b9050919050565b505050565b6000620013a4836000018360001b6200141e60201b60201c565b905092915050565b6000620013e0846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b6200149860201b60201c565b90509392505050565b600080823b905060008111915050919050565b600062001416836000018360001b6200158b60201b60201c565b905092915050565b6000620014328383620015ae60201b60201c565b6200148d57826000018290806001815401808255809150506001900390600052602060002001600090919091909150558260000180549050836001016000848152602001908152602001600020819055506001905062001492565b600090505b92915050565b6000808460010160008581526020019081526020016000205490506000811415620015415784600001604051806040016040528086815260200185815250908060018154018082558091505060019003906000526020600020906002020160009091909190915060008201518160000155602082015181600101555050846000018054905085600101600086815260200190815260200160002081905550600191505062001584565b82856000016001836200155591906200191b565b8154811062001569576200156862001a8a565b5b90600052602060002090600202016001018190555060009150505b9392505050565b600080836001016000848152602001908152602001600020541415905092915050565b600080836001016000848152602001908152602001600020541415905092915050565b828054620015df90620019f6565b90600052602060002090601f0160209004810192826200160357600085556200164f565b82601f106200161e57805160ff19168380011785556200164f565b828001600101855582156200164f579182015b828111156200164e57825182559160200191906001019062001631565b5b5090506200165e919062001662565b5090565b5b808211156200167d57600081600090555060010162001663565b5090565b600081519050620016928162001bc2565b92915050565b600060208284031215620016b157620016b062001ab9565b5b6000620016c18482850162001681565b91505092915050565b620016d58162001956565b82525050565b6000620016e882620018ee565b620016f48185620018f9565b935062001706818560208601620019c0565b620017118162001abe565b840191505092915050565b60006200172b6032836200190a565b9150620017388262001acf565b604082019050919050565b600062001752601c836200190a565b91506200175f8262001b1e565b602082019050919050565b600062001779601c836200190a565b9150620017868262001b47565b602082019050919050565b6000620017a06020836200190a565b9150620017ad8262001b70565b602082019050919050565b6000620017c76020836200190a565b9150620017d48262001b99565b602082019050919050565b620017ea81620019b6565b82525050565b6000608082019050620018076000830187620016ca565b620018166020830186620016ca565b620018256040830185620017df565b8181036060830152620018398184620016db565b905095945050505050565b600060208201905081810360008301526200185f816200171c565b9050919050565b60006020820190508181036000830152620018818162001743565b9050919050565b60006020820190508181036000830152620018a3816200176a565b9050919050565b60006020820190508181036000830152620018c58162001791565b9050919050565b60006020820190508181036000830152620018e781620017b8565b9050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b60006200192882620019b6565b91506200193583620019b6565b9250828210156200194b576200194a62001a2c565b5b828203905092915050565b6000620019638262001996565b9050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b83811015620019e0578082015181840152602081019050620019c3565b83811115620019f0576000848401525b50505050565b6000600282049050600182168062001a0f57607f821691505b6020821081141562001a265762001a2562001a5b565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4552433136353a20696e76616c696420696e7465726661636520696400000000600082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b62001bcd816200196a565b811462001bd957600080fd5b50565b61573f8062001bec6000396000f3fe6080604052600436106102885760003560e01c806376496eae1161015a578063ae64c92e116100c1578063d9b137b21161007a578063d9b137b214610997578063dfb4463e146109d4578063e985e9c514610a11578063f2fde38b14610a4e578063f47c84c514610a77578063ff53f81b14610aa257610288565b8063ae64c92e14610875578063b88d4fde146108a0578063c87b56dd146108c9578063c8a0122614610906578063cd53d08e14610943578063cd85cdb51461098057610288565b80638da5cb5b116101135780638da5cb5b146107795780639405950e146107a457806395d89b41146107bb578063a22cb465146107e6578063a38643971461080f578063a8f14af61461084c57610288565b806376496eae146106c85780637bf71170146106d257806383f84d4d146106fd5780638462151c14610707578063853828b6146107445780638d859f3e1461074e57610288565b80632f745c59116101fe5780636352211e116101b75780636352211e146105a657806363d96941146105e35780636c0360eb146106205780636ebc2b231461064b57806370a0823114610674578063715018a6146106b157610288565b80632f745c591461047257806341cda203146104af57806342842e0e146104da5780634ce91906146105035780634f6ccce71461054057806355f804b31461057d57610288565b806318160ddd1161025057806318160ddd146103865780631c8b232d146103b1578063221dc1e5146103dc57806323b872dd146104075780632be09561146104305780632ee2ac361461044757610288565b806301ffc9a71461028d57806306fdde03146102ca578063081812fc146102f5578063081f183d14610332578063095ea7b31461035d575b600080fd5b34801561029957600080fd5b506102b460048036038101906102af9190613cd5565b610acd565b6040516102c191906145bb565b60405180910390f35b3480156102d657600080fd5b506102df610b34565b6040516102ec91906145f1565b60405180910390f35b34801561030157600080fd5b5061031c60048036038101906103179190613d78565b610bc6565b60405161032991906144a9565b60405180910390f35b34801561033e57600080fd5b50610347610c4b565b60405161035491906145f1565b60405180910390f35b34801561036957600080fd5b50610384600480360381019061037f9190613c68565b610c6a565b005b34801561039257600080fd5b5061039b610d82565b6040516103a89190614993565b60405180910390f35b3480156103bd57600080fd5b506103c6610d93565b6040516103d391906145bb565b60405180910390f35b3480156103e857600080fd5b506103f1610da6565b6040516103fe9190614993565b60405180910390f35b34801561041357600080fd5b5061042e60048036038101906104299190613b52565b610dac565b005b34801561043c57600080fd5b50610445610e0c565b005b34801561045357600080fd5b5061045c610ea5565b60405161046991906145f1565b60405180910390f35b34801561047e57600080fd5b5061049960048036038101906104949190613c68565b610f33565b6040516104a69190614993565b60405180910390f35b3480156104bb57600080fd5b506104c4610f8e565b6040516104d19190614993565b60405180910390f35b3480156104e657600080fd5b5061050160048036038101906104fc9190613b52565b610f93565b005b34801561050f57600080fd5b5061052a60048036038101906105259190613d78565b610fb3565b60405161053791906145f1565b60405180910390f35b34801561054c57600080fd5b5061056760048036038101906105629190613d78565b611053565b6040516105749190614993565b60405180910390f35b34801561058957600080fd5b506105a4600480360381019061059f9190613d2f565b611076565b005b3480156105b257600080fd5b506105cd60048036038101906105c89190613d78565b6110fe565b6040516105da91906144a9565b60405180910390f35b3480156105ef57600080fd5b5061060a60048036038101906106059190613d78565b611135565b60405161061791906145f1565b60405180910390f35b34801561062c57600080fd5b506106356111b1565b60405161064291906145f1565b60405180910390f35b34801561065757600080fd5b50610672600480360381019061066d9190613dd2565b611243565b005b34801561068057600080fd5b5061069b60048036038101906106969190613ae5565b6112eb565b6040516106a89190614993565b60405180910390f35b3480156106bd57600080fd5b506106c66113aa565b005b6106d06114e7565b005b3480156106de57600080fd5b506106e76116ad565b6040516106f49190614993565b60405180910390f35b6107056116bc565b005b34801561071357600080fd5b5061072e60048036038101906107299190613ae5565b611a2c565b60405161073b9190614599565b60405180910390f35b61074c611b36565b005b34801561075a57600080fd5b50610763611d54565b6040516107709190614993565b60405180910390f35b34801561078557600080fd5b5061078e611d60565b60405161079b91906144a9565b60405180910390f35b3480156107b057600080fd5b506107b9611d8a565b005b3480156107c757600080fd5b506107d06120dc565b6040516107dd91906145f1565b60405180910390f35b3480156107f257600080fd5b5061080d60048036038101906108089190613c28565b61216e565b005b34801561081b57600080fd5b5061083660048036038101906108319190613d78565b6122ef565b60405161084391906145d6565b60405180910390f35b34801561085857600080fd5b50610873600480360381019061086e9190613d2f565b6123b3565b005b34801561088157600080fd5b5061088a612449565b6040516108979190614993565b60405180910390f35b3480156108ac57600080fd5b506108c760048036038101906108c29190613ba5565b61244f565b005b3480156108d557600080fd5b506108f060048036038101906108eb9190613d78565b6124b1565b6040516108fd91906145f1565b60405180910390f35b34801561091257600080fd5b5061092d60048036038101906109289190613d78565b612624565b60405161093a9190614993565b60405180910390f35b34801561094f57600080fd5b5061096a60048036038101906109659190613d78565b61263c565b60405161097791906144a9565b60405180910390f35b34801561098c57600080fd5b5061099561266f565b005b3480156109a357600080fd5b506109be60048036038101906109b99190613d78565b612708565b6040516109cb91906145f1565b60405180910390f35b3480156109e057600080fd5b506109fb60048036038101906109f69190613ae5565b612776565b604051610a0891906145bb565b60405180910390f35b348015610a1d57600080fd5b50610a386004803603810190610a339190613b12565b612796565b604051610a4591906145bb565b60405180910390f35b348015610a5a57600080fd5b50610a756004803603810190610a709190613ae5565b61282a565b005b348015610a8357600080fd5b50610a8c6129d6565b604051610a999190614993565b60405180910390f35b348015610aae57600080fd5b50610ab76129dc565b604051610ac49190614993565b60405180910390f35b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060068054610b4390614c41565b80601f0160208091040260200160405190810160405280929190818152602001828054610b6f90614c41565b8015610bbc5780601f10610b9157610100808354040283529160200191610bbc565b820191906000526020600020905b815481529060010190602001808311610b9f57829003601f168201915b5050505050905090565b6000610bd182612a5e565b610c10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0790614853565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60405180610140016040528061011081526020016155d1610110913981565b6000610c75826110fe565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ce6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cdd906148d3565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d05612a7b565b73ffffffffffffffffffffffffffffffffffffffff161480610d345750610d3381610d2e612a7b565b612796565b5b610d73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6a90614793565b60405180910390fd5b610d7d8383612a83565b505050565b6000610d8e6002612b3c565b905090565b600d60009054906101000a900460ff1681565b61032f81565b610dbd610db7612a7b565b82612b51565b610dfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df390614913565b60405180910390fd5b610e07838383612c2f565b505050565b610e14612a7b565b73ffffffffffffffffffffffffffffffffffffffff16610e32611d60565b73ffffffffffffffffffffffffffffffffffffffff1614610e88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7f90614873565b60405180910390fd5b6001600d60006101000a81548160ff021916908315150217905550565b60118054610eb290614c41565b80601f0160208091040260200160405190810160405280929190818152602001828054610ede90614c41565b8015610f2b5780601f10610f0057610100808354040283529160200191610f2b565b820191906000526020600020905b815481529060010190602001808311610f0e57829003601f168201915b505050505081565b6000610f8682600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612e4690919063ffffffff16565b905092915050565b60c881565b610fae8383836040518060200160405280600081525061244f565b505050565b60106020528060005260406000206000915090508054610fd290614c41565b80601f0160208091040260200160405190810160405280929190818152602001828054610ffe90614c41565b801561104b5780601f106110205761010080835404028352916020019161104b565b820191906000526020600020905b81548152906001019060200180831161102e57829003601f168201915b505050505081565b60008061106a836002612e6090919063ffffffff16565b50905080915050919050565b61107e612a7b565b73ffffffffffffffffffffffffffffffffffffffff1661109c611d60565b73ffffffffffffffffffffffffffffffffffffffff16146110f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e990614873565b60405180910390fd5b6110fb81612e8c565b50565b600061112e826040518060600160405280602981526020016156e1602991396002612ea69092919063ffffffff16565b9050919050565b606061114082612a5e565b61117f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117690614953565b60405180910390fd5b601161118a83612ec5565b60405160200161119b929190614485565b6040516020818303038152906040529050919050565b6060600980546111c090614c41565b80601f01602080910402602001604051908101604052809291908181526020018280546111ec90614c41565b80156112395780601f1061120e57610100808354040283529160200191611239565b820191906000526020600020905b81548152906001019060200180831161121c57829003601f168201915b5050505050905090565b61124b612a7b565b73ffffffffffffffffffffffffffffffffffffffff16611269611d60565b73ffffffffffffffffffffffffffffffffffffffff16146112bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b690614873565b60405180910390fd5b806010600084815260200190815260200160002090805190602001906112e69291906138cf565b505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561135c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611353906147b3565b60405180910390fd5b6113a3600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020613026565b9050919050565b6113b2612a7b565b73ffffffffffffffffffffffffffffffffffffffff166113d0611d60565b73ffffffffffffffffffffffffffffffffffffffff1614611426576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141d90614873565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60011515600d60009054906101000a900460ff1615151461153d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153490614933565b60405180910390fd5b61032f600b5410611583576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157a906148f3565b60405180910390fd5b600061158d610d82565b905061040081106115d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ca90614973565b60405180910390fd5b6701140bbd030c400034101561161e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611615906147f3565b60405180910390fd5b611628338261303b565b43600e60008381526020019081526020016000208190555033600f600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600b60008154809291906116a590614ca4565b919050555050565b6a22cc8bdd97859931d8729281565b60011515600d60009054906101000a900460ff16151514611712576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170990614933565b60405180910390fd5b61032f600b5410611758576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174f906148f3565b60405180910390fd5b6000611762610d82565b905061040081106117a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179f90614973565b60405180910390fd5b6a22cc8bdd97859931d87292601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b81526004016118119291906144c4565b60206040518083038186803b15801561182957600080fd5b505afa15801561183d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118619190613da5565b10156118a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611899906147d3565b60405180910390fd5b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd33306a22cc8bdd97859931d872926040518463ffffffff1660e01b815260040161190c939291906144ed565b602060405180830381600087803b15801561192657600080fd5b505af115801561193a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061195e9190613ca8565b61199d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199490614713565b60405180910390fd5b6119a7338261303b565b43600e60008381526020019081526020016000208190555033600f600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600b6000815480929190611a2490614ca4565b919050555050565b60606000611a39836112eb565b90506000811415611a9657600067ffffffffffffffff811115611a5f57611a5e614e37565b5b604051908082528060200260200182016040528015611a8d5781602001602082028036833780820191505090505b50915050611b31565b60008167ffffffffffffffff811115611ab257611ab1614e37565b5b604051908082528060200260200182016040528015611ae05781602001602082028036833780820191505090505b50905060005b82811015611b2a57611af88582610f33565b828281518110611b0b57611b0a614e08565b5b6020026020010181815250508080611b2290614ca4565b915050611ae6565b8193505050505b919050565b611b3e612a7b565b73ffffffffffffffffffffffffffffffffffffffff16611b5c611d60565b73ffffffffffffffffffffffffffffffffffffffff1614611bb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba990614873565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050611bf057600080fd5b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611c8a91906144a9565b60206040518083038186803b158015611ca257600080fd5b505afa158015611cb6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cda9190613da5565b6040518363ffffffff1660e01b8152600401611cf7929190614570565b602060405180830381600087803b158015611d1157600080fd5b505af1158015611d25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d499190613ca8565b611d5257600080fd5b565b6701140bbd030c400081565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60011515600d60009054906101000a900460ff16151514611de0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd790614933565b60405180910390fd5b60c8600c5410611e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1c90614693565b60405180910390fd5b6000611e2f610d82565b90506104008110611e75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6c90614973565b60405180910390fd5b6000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401611ed291906144a9565b60206040518083038186803b158015611eea57600080fd5b505afa158015611efe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f229190613da5565b11611f62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5990614773565b60405180910390fd5b60001515601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611ff5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fec90614633565b60405180910390fd5b6001601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550612057338261303b565b43600e60008381526020019081526020016000208190555033600f600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600c60008154809291906120d490614ca4565b919050555050565b6060600780546120eb90614c41565b80601f016020809104026020016040519081016040528092919081815260200182805461211790614c41565b80156121645780601f1061213957610100808354040283529160200191612164565b820191906000526020600020905b81548152906001019060200180831161214757829003601f168201915b5050505050905090565b612176612a7b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156121e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121db906146f3565b60405180910390fd5b80600560006121f1612a7b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661229e612a7b565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516122e391906145bb565b60405180910390a35050565b60006122fa82612a5e565b612339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233090614953565b60405180910390fd5b30600e600084815260200190815260200160002054600f600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040516020016123969493929190614413565b604051602081830303815290604052805190602001209050919050565b6123bb612a7b565b73ffffffffffffffffffffffffffffffffffffffff166123d9611d60565b73ffffffffffffffffffffffffffffffffffffffff161461242f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242690614873565b60405180910390fd5b80601190805190602001906124459291906138cf565b5050565b600c5481565b61246061245a612a7b565b83612b51565b61249f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249690614913565b60405180910390fd5b6124ab84848484613059565b50505050565b60606124bc82612a5e565b6124fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f2906148b3565b60405180910390fd5b600060086000848152602001908152602001600020805461251b90614c41565b80601f016020809104026020016040519081016040528092919081815260200182805461254790614c41565b80156125945780601f1061256957610100808354040283529160200191612594565b820191906000526020600020905b81548152906001019060200180831161257757829003601f168201915b5050505050905060006125a56111b1565b90506000815114156125bb57819250505061261f565b6000825111156125f05780826040516020016125d8929190614461565b6040516020818303038152906040529250505061261f565b806125fa85612ec5565b60405160200161260b929190614461565b604051602081830303815290604052925050505b919050565b600e6020528060005260406000206000915090505481565b600f6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b612677612a7b565b73ffffffffffffffffffffffffffffffffffffffff16612695611d60565b73ffffffffffffffffffffffffffffffffffffffff16146126eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126e290614873565b60405180910390fd5b6000600d60006101000a81548160ff021916908315150217905550565b6060612712610d82565b8210612753576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161274a90614733565b60405180910390fd5b60405180610140016040528061011081526020016155d161011091399050919050565b60126020528060005260406000206000915054906101000a900460ff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612832612a7b565b73ffffffffffffffffffffffffffffffffffffffff16612850611d60565b73ffffffffffffffffffffffffffffffffffffffff16146128a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289d90614873565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612916576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161290d90614673565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61040081565b600b5481565b60006129f4836000018360001b6130b5565b905092915050565b6000612a28846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b613125565b90509392505050565b600080823b905060008111915050919050565b6000612a56836000018360001b613211565b905092915050565b6000612a74826002612a4490919063ffffffff16565b9050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612af6836110fe565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612b4a82600001613234565b9050919050565b6000612b5c82612a5e565b612b9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b9290614753565b60405180910390fd5b6000612ba6836110fe565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612c1557508373ffffffffffffffffffffffffffffffffffffffff16612bfd84610bc6565b73ffffffffffffffffffffffffffffffffffffffff16145b80612c265750612c258185612796565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612c4f826110fe565b73ffffffffffffffffffffffffffffffffffffffff1614612ca5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c9c90614893565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d0c906146d3565b60405180910390fd5b612d20838383613245565b612d2b600082612a83565b612d7c81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061324a90919063ffffffff16565b50612dce81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206129e290919063ffffffff16565b50612de5818360026129fc9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000612e558360000183613264565b60001c905092915050565b600080600080612e7386600001866132d8565b915091508160001c8160001c9350935050509250929050565b8060099080519060200190612ea29291906138cf565b5050565b6000612eb9846000018460001b84613362565b60001c90509392505050565b60606000821415612f0d576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613021565b600082905060005b60008214612f3f578080612f2890614ca4565b915050600a82612f389190614b1c565b9150612f15565b60008167ffffffffffffffff811115612f5b57612f5a614e37565b5b6040519080825280601f01601f191660200182016040528015612f8d5781602001600182028036833780820191505090505b5090505b6000851461301a57600182612fa69190614b4d565b9150600a85612fb59190614d1b565b6030612fc19190614ac6565b60f81b818381518110612fd757612fd6614e08565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856130139190614b1c565b9450612f91565b8093505050505b919050565b600061303482600001613403565b9050919050565b613055828260405180602001604052806000815250613414565b5050565b613064848484612c2f565b6130708484848461346f565b6130af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130a690614653565b60405180910390fd5b50505050565b60006130c18383613606565b61311a57826000018290806001815401808255809150506001900390600052602060002001600090919091909150558260000180549050836001016000848152602001908152602001600020819055506001905061311f565b600090505b92915050565b60008084600101600085815260200190815260200160002054905060008114156131cc5784600001604051806040016040528086815260200185815250908060018154018082558091505060019003906000526020600020906002020160009091909190915060008201518160000155602082015181600101555050846000018054905085600101600086815260200190815260200160002081905550600191505061320a565b82856000016001836131de9190614b4d565b815481106131ef576131ee614e08565b5b90600052602060002090600202016001018190555060009150505b9392505050565b600080836001016000848152602001908152602001600020541415905092915050565b600081600001805490509050919050565b505050565b600061325c836000018360001b613629565b905092915050565b6000818360000180549050116132af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132a690614613565b60405180910390fd5b8260000182815481106132c5576132c4614e08565b5b9060005260206000200154905092915050565b60008082846000018054905011613324576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161331b90614813565b60405180910390fd5b600084600001848154811061333c5761333b614e08565b5b906000526020600020906002020190508060000154816001015492509250509250929050565b600080846001016000858152602001908152602001600020549050600081141583906133c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133bb91906145f1565b60405180910390fd5b50846000016001826133d69190614b4d565b815481106133e7576133e6614e08565b5b9060005260206000209060020201600101549150509392505050565b600081600001805490509050919050565b61341e8383613741565b61342b600084848461346f565b61346a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161346190614653565b60405180910390fd5b505050565b60006134908473ffffffffffffffffffffffffffffffffffffffff16612a31565b156135f9578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026134b9612a7b565b8786866040518563ffffffff1660e01b81526004016134db9493929190614524565b602060405180830381600087803b1580156134f557600080fd5b505af192505050801561352657506040513d601f19601f820116820180604052508101906135239190613d02565b60015b6135a9573d8060008114613556576040519150601f19603f3d011682016040523d82523d6000602084013e61355b565b606091505b506000815114156135a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161359890614653565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506135fe565b600190505b949350505050565b600080836001016000848152602001908152602001600020541415905092915050565b6000808360010160008481526020019081526020016000205490506000811461373557600060018261365b9190614b4d565b90506000600186600001805490506136739190614b4d565b9050600086600001828154811061368d5761368c614e08565b5b90600052602060002001549050808760000184815481106136b1576136b0614e08565b5b90600052602060002001819055506001836136cc9190614ac6565b87600101600083815260200190815260200160002081905550866000018054806136f9576136f8614dd9565b5b6001900381819060005260206000200160009055905586600101600087815260200190815260200160002060009055600194505050505061373b565b60009150505b92915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156137b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137a890614833565b60405180910390fd5b6137ba81612a5e565b156137fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137f1906146b3565b60405180910390fd5b61380660008383613245565b61385781600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206129e290919063ffffffff16565b5061386e818360026129fc9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b8280546138db90614c41565b90600052602060002090601f0160209004810192826138fd5760008555613944565b82601f1061391657805160ff1916838001178555613944565b82800160010185558215613944579182015b82811115613943578251825591602001919060010190613928565b5b5090506139519190613955565b5090565b5b8082111561396e576000816000905550600101613956565b5090565b6000613985613980846149d3565b6149ae565b9050828152602081018484840111156139a1576139a0614e6b565b5b6139ac848285614bff565b509392505050565b60006139c76139c284614a04565b6149ae565b9050828152602081018484840111156139e3576139e2614e6b565b5b6139ee848285614bff565b509392505050565b600081359050613a0581615574565b92915050565b600081359050613a1a8161558b565b92915050565b600081519050613a2f8161558b565b92915050565b600081359050613a44816155a2565b92915050565b600081519050613a59816155a2565b92915050565b600082601f830112613a7457613a73614e66565b5b8135613a84848260208601613972565b91505092915050565b600082601f830112613aa257613aa1614e66565b5b8135613ab28482602086016139b4565b91505092915050565b600081359050613aca816155b9565b92915050565b600081519050613adf816155b9565b92915050565b600060208284031215613afb57613afa614e75565b5b6000613b09848285016139f6565b91505092915050565b60008060408385031215613b2957613b28614e75565b5b6000613b37858286016139f6565b9250506020613b48858286016139f6565b9150509250929050565b600080600060608486031215613b6b57613b6a614e75565b5b6000613b79868287016139f6565b9350506020613b8a868287016139f6565b9250506040613b9b86828701613abb565b9150509250925092565b60008060008060808587031215613bbf57613bbe614e75565b5b6000613bcd878288016139f6565b9450506020613bde878288016139f6565b9350506040613bef87828801613abb565b925050606085013567ffffffffffffffff811115613c1057613c0f614e70565b5b613c1c87828801613a5f565b91505092959194509250565b60008060408385031215613c3f57613c3e614e75565b5b6000613c4d858286016139f6565b9250506020613c5e85828601613a0b565b9150509250929050565b60008060408385031215613c7f57613c7e614e75565b5b6000613c8d858286016139f6565b9250506020613c9e85828601613abb565b9150509250929050565b600060208284031215613cbe57613cbd614e75565b5b6000613ccc84828501613a20565b91505092915050565b600060208284031215613ceb57613cea614e75565b5b6000613cf984828501613a35565b91505092915050565b600060208284031215613d1857613d17614e75565b5b6000613d2684828501613a4a565b91505092915050565b600060208284031215613d4557613d44614e75565b5b600082013567ffffffffffffffff811115613d6357613d62614e70565b5b613d6f84828501613a8d565b91505092915050565b600060208284031215613d8e57613d8d614e75565b5b6000613d9c84828501613abb565b91505092915050565b600060208284031215613dbb57613dba614e75565b5b6000613dc984828501613ad0565b91505092915050565b60008060408385031215613de957613de8614e75565b5b6000613df785828601613abb565b925050602083013567ffffffffffffffff811115613e1857613e17614e70565b5b613e2485828601613a8d565b9150509250929050565b6000613e3a83836143de565b60208301905092915050565b613e4f81614b81565b82525050565b613e66613e6182614b81565b614ced565b82525050565b6000613e7782614a5a565b613e818185614a88565b9350613e8c83614a35565b8060005b83811015613ebd578151613ea48882613e2e565b9750613eaf83614a7b565b925050600181019050613e90565b5085935050505092915050565b613ed381614b93565b82525050565b613ee281614b9f565b82525050565b6000613ef382614a65565b613efd8185614a99565b9350613f0d818560208601614c0e565b613f1681614e7a565b840191505092915050565b6000613f2c82614a70565b613f368185614aaa565b9350613f46818560208601614c0e565b613f4f81614e7a565b840191505092915050565b6000613f6582614a70565b613f6f8185614abb565b9350613f7f818560208601614c0e565b80840191505092915050565b60008154613f9881614c41565b613fa28186614abb565b94506001821660008114613fbd5760018114613fce57614001565b60ff19831686528186019350614001565b613fd785614a45565b60005b83811015613ff957815481890152600182019150602081019050613fda565b838801955050505b50505092915050565b6000614017602283614aaa565b915061402282614e98565b604082019050919050565b600061403a602183614aaa565b915061404582614ee7565b604082019050919050565b600061405d603283614aaa565b915061406882614f36565b604082019050919050565b6000614080602683614aaa565b915061408b82614f85565b604082019050919050565b60006140a3602283614aaa565b91506140ae82614fd4565b604082019050919050565b60006140c6601c83614aaa565b91506140d182615023565b602082019050919050565b60006140e9602483614aaa565b91506140f48261504c565b604082019050919050565b600061410c601983614aaa565b91506141178261509b565b602082019050919050565b600061412f600f83614aaa565b915061413a826150c4565b602082019050919050565b6000614152600883614aaa565b915061415d826150ed565b602082019050919050565b6000614175602c83614aaa565b915061418082615116565b604082019050919050565b6000614198601783614aaa565b91506141a382615165565b602082019050919050565b60006141bb603883614aaa565b91506141c68261518e565b604082019050919050565b60006141de602a83614aaa565b91506141e9826151dd565b604082019050919050565b6000614201601583614aaa565b915061420c8261522c565b602082019050919050565b6000614224602383614aaa565b915061422f82615255565b604082019050919050565b6000614247602283614aaa565b9150614252826152a4565b604082019050919050565b600061426a602083614aaa565b9150614275826152f3565b602082019050919050565b600061428d602c83614aaa565b91506142988261531c565b604082019050919050565b60006142b0602083614aaa565b91506142bb8261536b565b602082019050919050565b60006142d3602983614aaa565b91506142de82615394565b604082019050919050565b60006142f6602f83614aaa565b9150614301826153e3565b604082019050919050565b6000614319602183614aaa565b915061432482615432565b604082019050919050565b600061433c601683614aaa565b915061434782615481565b602082019050919050565b600061435f603183614aaa565b915061436a826154aa565b604082019050919050565b6000614382601283614aaa565b915061438d826154f9565b602082019050919050565b60006143a5600e83614aaa565b91506143b082615522565b602082019050919050565b60006143c8601a83614aaa565b91506143d38261554b565b602082019050919050565b6143e781614bf5565b82525050565b6143f681614bf5565b82525050565b61440d61440882614bf5565b614d11565b82525050565b600061441f8287613e55565b60148201915061442f82866143fc565b60208201915061443f8285613e55565b60148201915061444f82846143fc565b60208201915081905095945050505050565b600061446d8285613f5a565b91506144798284613f5a565b91508190509392505050565b60006144918285613f8b565b915061449d8284613f5a565b91508190509392505050565b60006020820190506144be6000830184613e46565b92915050565b60006040820190506144d96000830185613e46565b6144e66020830184613e46565b9392505050565b60006060820190506145026000830186613e46565b61450f6020830185613e46565b61451c60408301846143ed565b949350505050565b60006080820190506145396000830187613e46565b6145466020830186613e46565b61455360408301856143ed565b81810360608301526145658184613ee8565b905095945050505050565b60006040820190506145856000830185613e46565b61459260208301846143ed565b9392505050565b600060208201905081810360008301526145b38184613e6c565b905092915050565b60006020820190506145d06000830184613eca565b92915050565b60006020820190506145eb6000830184613ed9565b92915050565b6000602082019050818103600083015261460b8184613f21565b905092915050565b6000602082019050818103600083015261462c8161400a565b9050919050565b6000602082019050818103600083015261464c8161402d565b9050919050565b6000602082019050818103600083015261466c81614050565b9050919050565b6000602082019050818103600083015261468c81614073565b9050919050565b600060208201905081810360008301526146ac81614096565b9050919050565b600060208201905081810360008301526146cc816140b9565b9050919050565b600060208201905081810360008301526146ec816140dc565b9050919050565b6000602082019050818103600083015261470c816140ff565b9050919050565b6000602082019050818103600083015261472c81614122565b9050919050565b6000602082019050818103600083015261474c81614145565b9050919050565b6000602082019050818103600083015261476c81614168565b9050919050565b6000602082019050818103600083015261478c8161418b565b9050919050565b600060208201905081810360008301526147ac816141ae565b9050919050565b600060208201905081810360008301526147cc816141d1565b9050919050565b600060208201905081810360008301526147ec816141f4565b9050919050565b6000602082019050818103600083015261480c81614217565b9050919050565b6000602082019050818103600083015261482c8161423a565b9050919050565b6000602082019050818103600083015261484c8161425d565b9050919050565b6000602082019050818103600083015261486c81614280565b9050919050565b6000602082019050818103600083015261488c816142a3565b9050919050565b600060208201905081810360008301526148ac816142c6565b9050919050565b600060208201905081810360008301526148cc816142e9565b9050919050565b600060208201905081810360008301526148ec8161430c565b9050919050565b6000602082019050818103600083015261490c8161432f565b9050919050565b6000602082019050818103600083015261492c81614352565b9050919050565b6000602082019050818103600083015261494c81614375565b9050919050565b6000602082019050818103600083015261496c81614398565b9050919050565b6000602082019050818103600083015261498c816143bb565b9050919050565b60006020820190506149a860008301846143ed565b92915050565b60006149b86149c9565b90506149c48282614c73565b919050565b6000604051905090565b600067ffffffffffffffff8211156149ee576149ed614e37565b5b6149f782614e7a565b9050602081019050919050565b600067ffffffffffffffff821115614a1f57614a1e614e37565b5b614a2882614e7a565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614ad182614bf5565b9150614adc83614bf5565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614b1157614b10614d4c565b5b828201905092915050565b6000614b2782614bf5565b9150614b3283614bf5565b925082614b4257614b41614d7b565b5b828204905092915050565b6000614b5882614bf5565b9150614b6383614bf5565b925082821015614b7657614b75614d4c565b5b828203905092915050565b6000614b8c82614bd5565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614c2c578082015181840152602081019050614c11565b83811115614c3b576000848401525b50505050565b60006002820490506001821680614c5957607f821691505b60208210811415614c6d57614c6c614daa565b5b50919050565b614c7c82614e7a565b810181811067ffffffffffffffff82111715614c9b57614c9a614e37565b5b80604052505050565b6000614caf82614bf5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614ce257614ce1614d4c565b5b600182019050919050565b6000614cf882614cff565b9050919050565b6000614d0a82614e8b565b9050919050565b6000819050919050565b6000614d2682614bf5565b9150614d3183614bf5565b925082614d4157614d40614d7b565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f57616c6c657420616c7265616479207573656420666f722066726565206d696e60008201527f7400000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4e6f206d6f72652066726565206d696e7473206465617220626173746172642060008201527f3a28000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f7472616e73666572204661696c65640000000000000000000000000000000000600082015250565b7f77726f6e67206964000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f57616c6c657420686173206e6f20626173746172647321000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f496e737566696369656e7420416c6c6f77616e63650000000000000000000000600082015250565b7f45746865722076616c75652073656e742069732062656c6f772074686520707260008201527f6963650000000000000000000000000000000000000000000000000000000000602082015250565b7f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f53616c652068617320616c726561647920656e64656400000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f4d696e74696e672069736e2774206f70656e0000000000000000000000000000600082015250565b7f444f4553204e4f54204558495354000000000000000000000000000000000000600082015250565b7f4e6f206d6f7265206f72626974206c65667420746f206d696e74000000000000600082015250565b61557d81614b81565b811461558857600080fd5b50565b61559481614b93565b811461559f57600080fd5b50565b6155ab81614ba9565b81146155b657600080fd5b50565b6155c281614bf5565b81146155cd57600080fd5b5056fe594f5552206f726269742c20594f55522043414c4c2e20496620796f75206f776e20616e204e46542066726f6d207468697320636f6c6c656374696f6e2c20796f75206172652066756c6c79207065726d697474656420746f20646f20776861746576657220796f752077616e7420776974682069742028696e636c7564696e6720626f7468206e6f6e2d636f6d6d65726369616c2f636f6d6d65726369616c2075736573292e20596f752063616e206576656e20646f207061696420666f7274756e652074656c6c696e672077697468206974206c6f6c2e20416c736f2c206372656174697665206465726976617469766520776f726b732061726520686967686c7920656e636f7572616765642e4552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea2646970667358221220b55c3a77588ac0795cd169fa848de695e9d5fba907d20ea7a0ec8eba8c193e2264736f6c6343000807003368747470733a2f2f6265726b2e6d7970696e6174612e636c6f75642f697066732f516d5978436d66706675387a71767231434b63473239704147474c75745469344e786a753452615837526e63336668747470733a2f2f617277656176652e6e65742f4c4332494246715f566f6c2d38742d5a48526d39736c6755385761672d4558516467322d76465f716c6c4968747470733a2f2f617277656176652e6e65742f304c496649486e7a514d5735736779784456324253696f4e7575642d4b506b643764487063443847736b5968747470733a2f2f617277656176652e6e65742f71415f6851375138393736464a62374b456731495a4f384779564a57503156307863524a724a733264577768747470733a2f2f6265726b2e6d7970696e6174612e636c6f75642f697066732f516d5443666d4b45654c734c5356416e6d68556131483936413562724e723152517838514166694362414d524d7368747470733a2f2f6265726b2e6d7970696e6174612e636c6f75642f697066732f516d59654c7938514d7171345a703441327a424274674754323335373447386344437470753531544c3758434d42

Deployed Bytecode

0x6080604052600436106102885760003560e01c806376496eae1161015a578063ae64c92e116100c1578063d9b137b21161007a578063d9b137b214610997578063dfb4463e146109d4578063e985e9c514610a11578063f2fde38b14610a4e578063f47c84c514610a77578063ff53f81b14610aa257610288565b8063ae64c92e14610875578063b88d4fde146108a0578063c87b56dd146108c9578063c8a0122614610906578063cd53d08e14610943578063cd85cdb51461098057610288565b80638da5cb5b116101135780638da5cb5b146107795780639405950e146107a457806395d89b41146107bb578063a22cb465146107e6578063a38643971461080f578063a8f14af61461084c57610288565b806376496eae146106c85780637bf71170146106d257806383f84d4d146106fd5780638462151c14610707578063853828b6146107445780638d859f3e1461074e57610288565b80632f745c59116101fe5780636352211e116101b75780636352211e146105a657806363d96941146105e35780636c0360eb146106205780636ebc2b231461064b57806370a0823114610674578063715018a6146106b157610288565b80632f745c591461047257806341cda203146104af57806342842e0e146104da5780634ce91906146105035780634f6ccce71461054057806355f804b31461057d57610288565b806318160ddd1161025057806318160ddd146103865780631c8b232d146103b1578063221dc1e5146103dc57806323b872dd146104075780632be09561146104305780632ee2ac361461044757610288565b806301ffc9a71461028d57806306fdde03146102ca578063081812fc146102f5578063081f183d14610332578063095ea7b31461035d575b600080fd5b34801561029957600080fd5b506102b460048036038101906102af9190613cd5565b610acd565b6040516102c191906145bb565b60405180910390f35b3480156102d657600080fd5b506102df610b34565b6040516102ec91906145f1565b60405180910390f35b34801561030157600080fd5b5061031c60048036038101906103179190613d78565b610bc6565b60405161032991906144a9565b60405180910390f35b34801561033e57600080fd5b50610347610c4b565b60405161035491906145f1565b60405180910390f35b34801561036957600080fd5b50610384600480360381019061037f9190613c68565b610c6a565b005b34801561039257600080fd5b5061039b610d82565b6040516103a89190614993565b60405180910390f35b3480156103bd57600080fd5b506103c6610d93565b6040516103d391906145bb565b60405180910390f35b3480156103e857600080fd5b506103f1610da6565b6040516103fe9190614993565b60405180910390f35b34801561041357600080fd5b5061042e60048036038101906104299190613b52565b610dac565b005b34801561043c57600080fd5b50610445610e0c565b005b34801561045357600080fd5b5061045c610ea5565b60405161046991906145f1565b60405180910390f35b34801561047e57600080fd5b5061049960048036038101906104949190613c68565b610f33565b6040516104a69190614993565b60405180910390f35b3480156104bb57600080fd5b506104c4610f8e565b6040516104d19190614993565b60405180910390f35b3480156104e657600080fd5b5061050160048036038101906104fc9190613b52565b610f93565b005b34801561050f57600080fd5b5061052a60048036038101906105259190613d78565b610fb3565b60405161053791906145f1565b60405180910390f35b34801561054c57600080fd5b5061056760048036038101906105629190613d78565b611053565b6040516105749190614993565b60405180910390f35b34801561058957600080fd5b506105a4600480360381019061059f9190613d2f565b611076565b005b3480156105b257600080fd5b506105cd60048036038101906105c89190613d78565b6110fe565b6040516105da91906144a9565b60405180910390f35b3480156105ef57600080fd5b5061060a60048036038101906106059190613d78565b611135565b60405161061791906145f1565b60405180910390f35b34801561062c57600080fd5b506106356111b1565b60405161064291906145f1565b60405180910390f35b34801561065757600080fd5b50610672600480360381019061066d9190613dd2565b611243565b005b34801561068057600080fd5b5061069b60048036038101906106969190613ae5565b6112eb565b6040516106a89190614993565b60405180910390f35b3480156106bd57600080fd5b506106c66113aa565b005b6106d06114e7565b005b3480156106de57600080fd5b506106e76116ad565b6040516106f49190614993565b60405180910390f35b6107056116bc565b005b34801561071357600080fd5b5061072e60048036038101906107299190613ae5565b611a2c565b60405161073b9190614599565b60405180910390f35b61074c611b36565b005b34801561075a57600080fd5b50610763611d54565b6040516107709190614993565b60405180910390f35b34801561078557600080fd5b5061078e611d60565b60405161079b91906144a9565b60405180910390f35b3480156107b057600080fd5b506107b9611d8a565b005b3480156107c757600080fd5b506107d06120dc565b6040516107dd91906145f1565b60405180910390f35b3480156107f257600080fd5b5061080d60048036038101906108089190613c28565b61216e565b005b34801561081b57600080fd5b5061083660048036038101906108319190613d78565b6122ef565b60405161084391906145d6565b60405180910390f35b34801561085857600080fd5b50610873600480360381019061086e9190613d2f565b6123b3565b005b34801561088157600080fd5b5061088a612449565b6040516108979190614993565b60405180910390f35b3480156108ac57600080fd5b506108c760048036038101906108c29190613ba5565b61244f565b005b3480156108d557600080fd5b506108f060048036038101906108eb9190613d78565b6124b1565b6040516108fd91906145f1565b60405180910390f35b34801561091257600080fd5b5061092d60048036038101906109289190613d78565b612624565b60405161093a9190614993565b60405180910390f35b34801561094f57600080fd5b5061096a60048036038101906109659190613d78565b61263c565b60405161097791906144a9565b60405180910390f35b34801561098c57600080fd5b5061099561266f565b005b3480156109a357600080fd5b506109be60048036038101906109b99190613d78565b612708565b6040516109cb91906145f1565b60405180910390f35b3480156109e057600080fd5b506109fb60048036038101906109f69190613ae5565b612776565b604051610a0891906145bb565b60405180910390f35b348015610a1d57600080fd5b50610a386004803603810190610a339190613b12565b612796565b604051610a4591906145bb565b60405180910390f35b348015610a5a57600080fd5b50610a756004803603810190610a709190613ae5565b61282a565b005b348015610a8357600080fd5b50610a8c6129d6565b604051610a999190614993565b60405180910390f35b348015610aae57600080fd5b50610ab76129dc565b604051610ac49190614993565b60405180910390f35b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060068054610b4390614c41565b80601f0160208091040260200160405190810160405280929190818152602001828054610b6f90614c41565b8015610bbc5780601f10610b9157610100808354040283529160200191610bbc565b820191906000526020600020905b815481529060010190602001808311610b9f57829003601f168201915b5050505050905090565b6000610bd182612a5e565b610c10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0790614853565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60405180610140016040528061011081526020016155d1610110913981565b6000610c75826110fe565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ce6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cdd906148d3565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d05612a7b565b73ffffffffffffffffffffffffffffffffffffffff161480610d345750610d3381610d2e612a7b565b612796565b5b610d73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6a90614793565b60405180910390fd5b610d7d8383612a83565b505050565b6000610d8e6002612b3c565b905090565b600d60009054906101000a900460ff1681565b61032f81565b610dbd610db7612a7b565b82612b51565b610dfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df390614913565b60405180910390fd5b610e07838383612c2f565b505050565b610e14612a7b565b73ffffffffffffffffffffffffffffffffffffffff16610e32611d60565b73ffffffffffffffffffffffffffffffffffffffff1614610e88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7f90614873565b60405180910390fd5b6001600d60006101000a81548160ff021916908315150217905550565b60118054610eb290614c41565b80601f0160208091040260200160405190810160405280929190818152602001828054610ede90614c41565b8015610f2b5780601f10610f0057610100808354040283529160200191610f2b565b820191906000526020600020905b815481529060010190602001808311610f0e57829003601f168201915b505050505081565b6000610f8682600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612e4690919063ffffffff16565b905092915050565b60c881565b610fae8383836040518060200160405280600081525061244f565b505050565b60106020528060005260406000206000915090508054610fd290614c41565b80601f0160208091040260200160405190810160405280929190818152602001828054610ffe90614c41565b801561104b5780601f106110205761010080835404028352916020019161104b565b820191906000526020600020905b81548152906001019060200180831161102e57829003601f168201915b505050505081565b60008061106a836002612e6090919063ffffffff16565b50905080915050919050565b61107e612a7b565b73ffffffffffffffffffffffffffffffffffffffff1661109c611d60565b73ffffffffffffffffffffffffffffffffffffffff16146110f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e990614873565b60405180910390fd5b6110fb81612e8c565b50565b600061112e826040518060600160405280602981526020016156e1602991396002612ea69092919063ffffffff16565b9050919050565b606061114082612a5e565b61117f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117690614953565b60405180910390fd5b601161118a83612ec5565b60405160200161119b929190614485565b6040516020818303038152906040529050919050565b6060600980546111c090614c41565b80601f01602080910402602001604051908101604052809291908181526020018280546111ec90614c41565b80156112395780601f1061120e57610100808354040283529160200191611239565b820191906000526020600020905b81548152906001019060200180831161121c57829003601f168201915b5050505050905090565b61124b612a7b565b73ffffffffffffffffffffffffffffffffffffffff16611269611d60565b73ffffffffffffffffffffffffffffffffffffffff16146112bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b690614873565b60405180910390fd5b806010600084815260200190815260200160002090805190602001906112e69291906138cf565b505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561135c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611353906147b3565b60405180910390fd5b6113a3600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020613026565b9050919050565b6113b2612a7b565b73ffffffffffffffffffffffffffffffffffffffff166113d0611d60565b73ffffffffffffffffffffffffffffffffffffffff1614611426576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141d90614873565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60011515600d60009054906101000a900460ff1615151461153d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153490614933565b60405180910390fd5b61032f600b5410611583576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157a906148f3565b60405180910390fd5b600061158d610d82565b905061040081106115d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ca90614973565b60405180910390fd5b6701140bbd030c400034101561161e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611615906147f3565b60405180910390fd5b611628338261303b565b43600e60008381526020019081526020016000208190555033600f600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600b60008154809291906116a590614ca4565b919050555050565b6a22cc8bdd97859931d8729281565b60011515600d60009054906101000a900460ff16151514611712576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170990614933565b60405180910390fd5b61032f600b5410611758576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174f906148f3565b60405180910390fd5b6000611762610d82565b905061040081106117a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179f90614973565b60405180910390fd5b6a22cc8bdd97859931d87292601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b81526004016118119291906144c4565b60206040518083038186803b15801561182957600080fd5b505afa15801561183d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118619190613da5565b10156118a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611899906147d3565b60405180910390fd5b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd33306a22cc8bdd97859931d872926040518463ffffffff1660e01b815260040161190c939291906144ed565b602060405180830381600087803b15801561192657600080fd5b505af115801561193a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061195e9190613ca8565b61199d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199490614713565b60405180910390fd5b6119a7338261303b565b43600e60008381526020019081526020016000208190555033600f600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600b6000815480929190611a2490614ca4565b919050555050565b60606000611a39836112eb565b90506000811415611a9657600067ffffffffffffffff811115611a5f57611a5e614e37565b5b604051908082528060200260200182016040528015611a8d5781602001602082028036833780820191505090505b50915050611b31565b60008167ffffffffffffffff811115611ab257611ab1614e37565b5b604051908082528060200260200182016040528015611ae05781602001602082028036833780820191505090505b50905060005b82811015611b2a57611af88582610f33565b828281518110611b0b57611b0a614e08565b5b6020026020010181815250508080611b2290614ca4565b915050611ae6565b8193505050505b919050565b611b3e612a7b565b73ffffffffffffffffffffffffffffffffffffffff16611b5c611d60565b73ffffffffffffffffffffffffffffffffffffffff1614611bb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba990614873565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050611bf057600080fd5b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611c8a91906144a9565b60206040518083038186803b158015611ca257600080fd5b505afa158015611cb6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cda9190613da5565b6040518363ffffffff1660e01b8152600401611cf7929190614570565b602060405180830381600087803b158015611d1157600080fd5b505af1158015611d25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d499190613ca8565b611d5257600080fd5b565b6701140bbd030c400081565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60011515600d60009054906101000a900460ff16151514611de0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd790614933565b60405180910390fd5b60c8600c5410611e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1c90614693565b60405180910390fd5b6000611e2f610d82565b90506104008110611e75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6c90614973565b60405180910390fd5b6000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401611ed291906144a9565b60206040518083038186803b158015611eea57600080fd5b505afa158015611efe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f229190613da5565b11611f62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5990614773565b60405180910390fd5b60001515601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611ff5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fec90614633565b60405180910390fd5b6001601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550612057338261303b565b43600e60008381526020019081526020016000208190555033600f600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600c60008154809291906120d490614ca4565b919050555050565b6060600780546120eb90614c41565b80601f016020809104026020016040519081016040528092919081815260200182805461211790614c41565b80156121645780601f1061213957610100808354040283529160200191612164565b820191906000526020600020905b81548152906001019060200180831161214757829003601f168201915b5050505050905090565b612176612a7b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156121e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121db906146f3565b60405180910390fd5b80600560006121f1612a7b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661229e612a7b565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516122e391906145bb565b60405180910390a35050565b60006122fa82612a5e565b612339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233090614953565b60405180910390fd5b30600e600084815260200190815260200160002054600f600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040516020016123969493929190614413565b604051602081830303815290604052805190602001209050919050565b6123bb612a7b565b73ffffffffffffffffffffffffffffffffffffffff166123d9611d60565b73ffffffffffffffffffffffffffffffffffffffff161461242f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242690614873565b60405180910390fd5b80601190805190602001906124459291906138cf565b5050565b600c5481565b61246061245a612a7b565b83612b51565b61249f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249690614913565b60405180910390fd5b6124ab84848484613059565b50505050565b60606124bc82612a5e565b6124fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f2906148b3565b60405180910390fd5b600060086000848152602001908152602001600020805461251b90614c41565b80601f016020809104026020016040519081016040528092919081815260200182805461254790614c41565b80156125945780601f1061256957610100808354040283529160200191612594565b820191906000526020600020905b81548152906001019060200180831161257757829003601f168201915b5050505050905060006125a56111b1565b90506000815114156125bb57819250505061261f565b6000825111156125f05780826040516020016125d8929190614461565b6040516020818303038152906040529250505061261f565b806125fa85612ec5565b60405160200161260b929190614461565b604051602081830303815290604052925050505b919050565b600e6020528060005260406000206000915090505481565b600f6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b612677612a7b565b73ffffffffffffffffffffffffffffffffffffffff16612695611d60565b73ffffffffffffffffffffffffffffffffffffffff16146126eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126e290614873565b60405180910390fd5b6000600d60006101000a81548160ff021916908315150217905550565b6060612712610d82565b8210612753576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161274a90614733565b60405180910390fd5b60405180610140016040528061011081526020016155d161011091399050919050565b60126020528060005260406000206000915054906101000a900460ff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612832612a7b565b73ffffffffffffffffffffffffffffffffffffffff16612850611d60565b73ffffffffffffffffffffffffffffffffffffffff16146128a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289d90614873565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612916576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161290d90614673565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61040081565b600b5481565b60006129f4836000018360001b6130b5565b905092915050565b6000612a28846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b613125565b90509392505050565b600080823b905060008111915050919050565b6000612a56836000018360001b613211565b905092915050565b6000612a74826002612a4490919063ffffffff16565b9050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612af6836110fe565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612b4a82600001613234565b9050919050565b6000612b5c82612a5e565b612b9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b9290614753565b60405180910390fd5b6000612ba6836110fe565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612c1557508373ffffffffffffffffffffffffffffffffffffffff16612bfd84610bc6565b73ffffffffffffffffffffffffffffffffffffffff16145b80612c265750612c258185612796565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612c4f826110fe565b73ffffffffffffffffffffffffffffffffffffffff1614612ca5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c9c90614893565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d0c906146d3565b60405180910390fd5b612d20838383613245565b612d2b600082612a83565b612d7c81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061324a90919063ffffffff16565b50612dce81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206129e290919063ffffffff16565b50612de5818360026129fc9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000612e558360000183613264565b60001c905092915050565b600080600080612e7386600001866132d8565b915091508160001c8160001c9350935050509250929050565b8060099080519060200190612ea29291906138cf565b5050565b6000612eb9846000018460001b84613362565b60001c90509392505050565b60606000821415612f0d576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613021565b600082905060005b60008214612f3f578080612f2890614ca4565b915050600a82612f389190614b1c565b9150612f15565b60008167ffffffffffffffff811115612f5b57612f5a614e37565b5b6040519080825280601f01601f191660200182016040528015612f8d5781602001600182028036833780820191505090505b5090505b6000851461301a57600182612fa69190614b4d565b9150600a85612fb59190614d1b565b6030612fc19190614ac6565b60f81b818381518110612fd757612fd6614e08565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856130139190614b1c565b9450612f91565b8093505050505b919050565b600061303482600001613403565b9050919050565b613055828260405180602001604052806000815250613414565b5050565b613064848484612c2f565b6130708484848461346f565b6130af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130a690614653565b60405180910390fd5b50505050565b60006130c18383613606565b61311a57826000018290806001815401808255809150506001900390600052602060002001600090919091909150558260000180549050836001016000848152602001908152602001600020819055506001905061311f565b600090505b92915050565b60008084600101600085815260200190815260200160002054905060008114156131cc5784600001604051806040016040528086815260200185815250908060018154018082558091505060019003906000526020600020906002020160009091909190915060008201518160000155602082015181600101555050846000018054905085600101600086815260200190815260200160002081905550600191505061320a565b82856000016001836131de9190614b4d565b815481106131ef576131ee614e08565b5b90600052602060002090600202016001018190555060009150505b9392505050565b600080836001016000848152602001908152602001600020541415905092915050565b600081600001805490509050919050565b505050565b600061325c836000018360001b613629565b905092915050565b6000818360000180549050116132af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132a690614613565b60405180910390fd5b8260000182815481106132c5576132c4614e08565b5b9060005260206000200154905092915050565b60008082846000018054905011613324576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161331b90614813565b60405180910390fd5b600084600001848154811061333c5761333b614e08565b5b906000526020600020906002020190508060000154816001015492509250509250929050565b600080846001016000858152602001908152602001600020549050600081141583906133c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133bb91906145f1565b60405180910390fd5b50846000016001826133d69190614b4d565b815481106133e7576133e6614e08565b5b9060005260206000209060020201600101549150509392505050565b600081600001805490509050919050565b61341e8383613741565b61342b600084848461346f565b61346a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161346190614653565b60405180910390fd5b505050565b60006134908473ffffffffffffffffffffffffffffffffffffffff16612a31565b156135f9578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026134b9612a7b565b8786866040518563ffffffff1660e01b81526004016134db9493929190614524565b602060405180830381600087803b1580156134f557600080fd5b505af192505050801561352657506040513d601f19601f820116820180604052508101906135239190613d02565b60015b6135a9573d8060008114613556576040519150601f19603f3d011682016040523d82523d6000602084013e61355b565b606091505b506000815114156135a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161359890614653565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506135fe565b600190505b949350505050565b600080836001016000848152602001908152602001600020541415905092915050565b6000808360010160008481526020019081526020016000205490506000811461373557600060018261365b9190614b4d565b90506000600186600001805490506136739190614b4d565b9050600086600001828154811061368d5761368c614e08565b5b90600052602060002001549050808760000184815481106136b1576136b0614e08565b5b90600052602060002001819055506001836136cc9190614ac6565b87600101600083815260200190815260200160002081905550866000018054806136f9576136f8614dd9565b5b6001900381819060005260206000200160009055905586600101600087815260200190815260200160002060009055600194505050505061373b565b60009150505b92915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156137b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137a890614833565b60405180910390fd5b6137ba81612a5e565b156137fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137f1906146b3565b60405180910390fd5b61380660008383613245565b61385781600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206129e290919063ffffffff16565b5061386e818360026129fc9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b8280546138db90614c41565b90600052602060002090601f0160209004810192826138fd5760008555613944565b82601f1061391657805160ff1916838001178555613944565b82800160010185558215613944579182015b82811115613943578251825591602001919060010190613928565b5b5090506139519190613955565b5090565b5b8082111561396e576000816000905550600101613956565b5090565b6000613985613980846149d3565b6149ae565b9050828152602081018484840111156139a1576139a0614e6b565b5b6139ac848285614bff565b509392505050565b60006139c76139c284614a04565b6149ae565b9050828152602081018484840111156139e3576139e2614e6b565b5b6139ee848285614bff565b509392505050565b600081359050613a0581615574565b92915050565b600081359050613a1a8161558b565b92915050565b600081519050613a2f8161558b565b92915050565b600081359050613a44816155a2565b92915050565b600081519050613a59816155a2565b92915050565b600082601f830112613a7457613a73614e66565b5b8135613a84848260208601613972565b91505092915050565b600082601f830112613aa257613aa1614e66565b5b8135613ab28482602086016139b4565b91505092915050565b600081359050613aca816155b9565b92915050565b600081519050613adf816155b9565b92915050565b600060208284031215613afb57613afa614e75565b5b6000613b09848285016139f6565b91505092915050565b60008060408385031215613b2957613b28614e75565b5b6000613b37858286016139f6565b9250506020613b48858286016139f6565b9150509250929050565b600080600060608486031215613b6b57613b6a614e75565b5b6000613b79868287016139f6565b9350506020613b8a868287016139f6565b9250506040613b9b86828701613abb565b9150509250925092565b60008060008060808587031215613bbf57613bbe614e75565b5b6000613bcd878288016139f6565b9450506020613bde878288016139f6565b9350506040613bef87828801613abb565b925050606085013567ffffffffffffffff811115613c1057613c0f614e70565b5b613c1c87828801613a5f565b91505092959194509250565b60008060408385031215613c3f57613c3e614e75565b5b6000613c4d858286016139f6565b9250506020613c5e85828601613a0b565b9150509250929050565b60008060408385031215613c7f57613c7e614e75565b5b6000613c8d858286016139f6565b9250506020613c9e85828601613abb565b9150509250929050565b600060208284031215613cbe57613cbd614e75565b5b6000613ccc84828501613a20565b91505092915050565b600060208284031215613ceb57613cea614e75565b5b6000613cf984828501613a35565b91505092915050565b600060208284031215613d1857613d17614e75565b5b6000613d2684828501613a4a565b91505092915050565b600060208284031215613d4557613d44614e75565b5b600082013567ffffffffffffffff811115613d6357613d62614e70565b5b613d6f84828501613a8d565b91505092915050565b600060208284031215613d8e57613d8d614e75565b5b6000613d9c84828501613abb565b91505092915050565b600060208284031215613dbb57613dba614e75565b5b6000613dc984828501613ad0565b91505092915050565b60008060408385031215613de957613de8614e75565b5b6000613df785828601613abb565b925050602083013567ffffffffffffffff811115613e1857613e17614e70565b5b613e2485828601613a8d565b9150509250929050565b6000613e3a83836143de565b60208301905092915050565b613e4f81614b81565b82525050565b613e66613e6182614b81565b614ced565b82525050565b6000613e7782614a5a565b613e818185614a88565b9350613e8c83614a35565b8060005b83811015613ebd578151613ea48882613e2e565b9750613eaf83614a7b565b925050600181019050613e90565b5085935050505092915050565b613ed381614b93565b82525050565b613ee281614b9f565b82525050565b6000613ef382614a65565b613efd8185614a99565b9350613f0d818560208601614c0e565b613f1681614e7a565b840191505092915050565b6000613f2c82614a70565b613f368185614aaa565b9350613f46818560208601614c0e565b613f4f81614e7a565b840191505092915050565b6000613f6582614a70565b613f6f8185614abb565b9350613f7f818560208601614c0e565b80840191505092915050565b60008154613f9881614c41565b613fa28186614abb565b94506001821660008114613fbd5760018114613fce57614001565b60ff19831686528186019350614001565b613fd785614a45565b60005b83811015613ff957815481890152600182019150602081019050613fda565b838801955050505b50505092915050565b6000614017602283614aaa565b915061402282614e98565b604082019050919050565b600061403a602183614aaa565b915061404582614ee7565b604082019050919050565b600061405d603283614aaa565b915061406882614f36565b604082019050919050565b6000614080602683614aaa565b915061408b82614f85565b604082019050919050565b60006140a3602283614aaa565b91506140ae82614fd4565b604082019050919050565b60006140c6601c83614aaa565b91506140d182615023565b602082019050919050565b60006140e9602483614aaa565b91506140f48261504c565b604082019050919050565b600061410c601983614aaa565b91506141178261509b565b602082019050919050565b600061412f600f83614aaa565b915061413a826150c4565b602082019050919050565b6000614152600883614aaa565b915061415d826150ed565b602082019050919050565b6000614175602c83614aaa565b915061418082615116565b604082019050919050565b6000614198601783614aaa565b91506141a382615165565b602082019050919050565b60006141bb603883614aaa565b91506141c68261518e565b604082019050919050565b60006141de602a83614aaa565b91506141e9826151dd565b604082019050919050565b6000614201601583614aaa565b915061420c8261522c565b602082019050919050565b6000614224602383614aaa565b915061422f82615255565b604082019050919050565b6000614247602283614aaa565b9150614252826152a4565b604082019050919050565b600061426a602083614aaa565b9150614275826152f3565b602082019050919050565b600061428d602c83614aaa565b91506142988261531c565b604082019050919050565b60006142b0602083614aaa565b91506142bb8261536b565b602082019050919050565b60006142d3602983614aaa565b91506142de82615394565b604082019050919050565b60006142f6602f83614aaa565b9150614301826153e3565b604082019050919050565b6000614319602183614aaa565b915061432482615432565b604082019050919050565b600061433c601683614aaa565b915061434782615481565b602082019050919050565b600061435f603183614aaa565b915061436a826154aa565b604082019050919050565b6000614382601283614aaa565b915061438d826154f9565b602082019050919050565b60006143a5600e83614aaa565b91506143b082615522565b602082019050919050565b60006143c8601a83614aaa565b91506143d38261554b565b602082019050919050565b6143e781614bf5565b82525050565b6143f681614bf5565b82525050565b61440d61440882614bf5565b614d11565b82525050565b600061441f8287613e55565b60148201915061442f82866143fc565b60208201915061443f8285613e55565b60148201915061444f82846143fc565b60208201915081905095945050505050565b600061446d8285613f5a565b91506144798284613f5a565b91508190509392505050565b60006144918285613f8b565b915061449d8284613f5a565b91508190509392505050565b60006020820190506144be6000830184613e46565b92915050565b60006040820190506144d96000830185613e46565b6144e66020830184613e46565b9392505050565b60006060820190506145026000830186613e46565b61450f6020830185613e46565b61451c60408301846143ed565b949350505050565b60006080820190506145396000830187613e46565b6145466020830186613e46565b61455360408301856143ed565b81810360608301526145658184613ee8565b905095945050505050565b60006040820190506145856000830185613e46565b61459260208301846143ed565b9392505050565b600060208201905081810360008301526145b38184613e6c565b905092915050565b60006020820190506145d06000830184613eca565b92915050565b60006020820190506145eb6000830184613ed9565b92915050565b6000602082019050818103600083015261460b8184613f21565b905092915050565b6000602082019050818103600083015261462c8161400a565b9050919050565b6000602082019050818103600083015261464c8161402d565b9050919050565b6000602082019050818103600083015261466c81614050565b9050919050565b6000602082019050818103600083015261468c81614073565b9050919050565b600060208201905081810360008301526146ac81614096565b9050919050565b600060208201905081810360008301526146cc816140b9565b9050919050565b600060208201905081810360008301526146ec816140dc565b9050919050565b6000602082019050818103600083015261470c816140ff565b9050919050565b6000602082019050818103600083015261472c81614122565b9050919050565b6000602082019050818103600083015261474c81614145565b9050919050565b6000602082019050818103600083015261476c81614168565b9050919050565b6000602082019050818103600083015261478c8161418b565b9050919050565b600060208201905081810360008301526147ac816141ae565b9050919050565b600060208201905081810360008301526147cc816141d1565b9050919050565b600060208201905081810360008301526147ec816141f4565b9050919050565b6000602082019050818103600083015261480c81614217565b9050919050565b6000602082019050818103600083015261482c8161423a565b9050919050565b6000602082019050818103600083015261484c8161425d565b9050919050565b6000602082019050818103600083015261486c81614280565b9050919050565b6000602082019050818103600083015261488c816142a3565b9050919050565b600060208201905081810360008301526148ac816142c6565b9050919050565b600060208201905081810360008301526148cc816142e9565b9050919050565b600060208201905081810360008301526148ec8161430c565b9050919050565b6000602082019050818103600083015261490c8161432f565b9050919050565b6000602082019050818103600083015261492c81614352565b9050919050565b6000602082019050818103600083015261494c81614375565b9050919050565b6000602082019050818103600083015261496c81614398565b9050919050565b6000602082019050818103600083015261498c816143bb565b9050919050565b60006020820190506149a860008301846143ed565b92915050565b60006149b86149c9565b90506149c48282614c73565b919050565b6000604051905090565b600067ffffffffffffffff8211156149ee576149ed614e37565b5b6149f782614e7a565b9050602081019050919050565b600067ffffffffffffffff821115614a1f57614a1e614e37565b5b614a2882614e7a565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614ad182614bf5565b9150614adc83614bf5565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614b1157614b10614d4c565b5b828201905092915050565b6000614b2782614bf5565b9150614b3283614bf5565b925082614b4257614b41614d7b565b5b828204905092915050565b6000614b5882614bf5565b9150614b6383614bf5565b925082821015614b7657614b75614d4c565b5b828203905092915050565b6000614b8c82614bd5565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614c2c578082015181840152602081019050614c11565b83811115614c3b576000848401525b50505050565b60006002820490506001821680614c5957607f821691505b60208210811415614c6d57614c6c614daa565b5b50919050565b614c7c82614e7a565b810181811067ffffffffffffffff82111715614c9b57614c9a614e37565b5b80604052505050565b6000614caf82614bf5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614ce257614ce1614d4c565b5b600182019050919050565b6000614cf882614cff565b9050919050565b6000614d0a82614e8b565b9050919050565b6000819050919050565b6000614d2682614bf5565b9150614d3183614bf5565b925082614d4157614d40614d7b565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f57616c6c657420616c7265616479207573656420666f722066726565206d696e60008201527f7400000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4e6f206d6f72652066726565206d696e7473206465617220626173746172642060008201527f3a28000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f7472616e73666572204661696c65640000000000000000000000000000000000600082015250565b7f77726f6e67206964000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f57616c6c657420686173206e6f20626173746172647321000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f496e737566696369656e7420416c6c6f77616e63650000000000000000000000600082015250565b7f45746865722076616c75652073656e742069732062656c6f772074686520707260008201527f6963650000000000000000000000000000000000000000000000000000000000602082015250565b7f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f53616c652068617320616c726561647920656e64656400000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f4d696e74696e672069736e2774206f70656e0000000000000000000000000000600082015250565b7f444f4553204e4f54204558495354000000000000000000000000000000000000600082015250565b7f4e6f206d6f7265206f72626974206c65667420746f206d696e74000000000000600082015250565b61557d81614b81565b811461558857600080fd5b50565b61559481614b93565b811461559f57600080fd5b50565b6155ab81614ba9565b81146155b657600080fd5b50565b6155c281614bf5565b81146155cd57600080fd5b5056fe594f5552206f726269742c20594f55522043414c4c2e20496620796f75206f776e20616e204e46542066726f6d207468697320636f6c6c656374696f6e2c20796f75206172652066756c6c79207065726d697474656420746f20646f20776861746576657220796f752077616e7420776974682069742028696e636c7564696e6720626f7468206e6f6e2d636f6d6d65726369616c2f636f6d6d65726369616c2075736573292e20596f752063616e206576656e20646f207061696420666f7274756e652074656c6c696e672077697468206974206c6f6c2e20416c736f2c206372656174697665206465726976617469766520776f726b732061726520686967686c7920656e636f7572616765642e4552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea2646970667358221220b55c3a77588ac0795cd169fa848de695e9d5fba907d20ea7a0ec8eba8c193e2264736f6c63430008070033

Deployed Bytecode Sourcemap

73249:7884:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38862:150;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50575:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53361:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73815:314;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52891:404;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52369:211;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73562:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73405:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54251:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80734:78;;;;;;;;;;;;;:::i;:::-;;73775:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52131:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73448:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54627:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73714:52;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52657:172;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80623:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50331:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78164:222;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51950:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80353:129;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50021:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65436:148;;;;;;;;;;;;;:::i;:::-;;79126:525;;;:::i;:::-;;74205:59;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;79659:652;;;:::i;:::-;;77357:540;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80911:207;;;:::i;:::-;;74138:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64785:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78394:724;;;;;;;;;;;;;:::i;:::-;;50744:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53654:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77905:247;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80498:117;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73526:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54849:285;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50919:792;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73605:49;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73661:44;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80824:79;;;;;;;;;;;;;:::i;:::-;;77191:158;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74308:51;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54020:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65739:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73360:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73497:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38862:150;38947:4;38971:20;:33;38992:11;38971:33;;;;;;;;;;;;;;;;;;;;;;;;;;;38964:40;;38862:150;;;:::o;50575:100::-;50629:13;50662:5;50655:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50575:100;:::o;53361:221::-;53437:7;53465:16;53473:7;53465;:16::i;:::-;53457:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;53550:15;:24;53566:7;53550:24;;;;;;;;;;;;;;;;;;;;;53543:31;;53361:221;;;:::o;73815:314::-;;;;;;;;;;;;;;;;;;;:::o;52891:404::-;52972:13;52988:23;53003:7;52988:14;:23::i;:::-;52972:39;;53036:5;53030:11;;:2;:11;;;;53022:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;53116:5;53100:21;;:12;:10;:12::i;:::-;:21;;;:69;;;;53125:44;53149:5;53156:12;:10;:12::i;:::-;53125:23;:44::i;:::-;53100:69;53092:161;;;;;;;;;;;;:::i;:::-;;;;;;;;;53266:21;53275:2;53279:7;53266:8;:21::i;:::-;52961:334;52891:404;;:::o;52369:211::-;52430:7;52551:21;:12;:19;:21::i;:::-;52544:28;;52369:211;:::o;73562:34::-;;;;;;;;;;;;;:::o;73405:36::-;73438:3;73405:36;:::o;54251:305::-;54412:41;54431:12;:10;:12::i;:::-;54445:7;54412:18;:41::i;:::-;54404:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;54520:28;54530:4;54536:2;54540:7;54520:9;:28::i;:::-;54251:305;;;:::o;80734:78::-;65016:12;:10;:12::i;:::-;65005:23;;:7;:5;:7::i;:::-;:23;;;64997:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;80800:4:::1;80783:14;;:21;;;;;;;;;;;;;;;;;;80734:78::o:0;73775:31::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;52131:162::-;52228:7;52255:30;52279:5;52255:13;:20;52269:5;52255:20;;;;;;;;;;;;;;;:23;;:30;;;;:::i;:::-;52248:37;;52131:162;;;;:::o;73448:40::-;73485:3;73448:40;:::o;54627:151::-;54731:39;54748:4;54754:2;54758:7;54731:39;;;;;;;;;;;;:16;:39::i;:::-;54627:151;;;:::o;73714:52::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;52657:172::-;52732:7;52753:15;52774:22;52790:5;52774:12;:15;;:22;;;;:::i;:::-;52752:44;;;52814:7;52807:14;;;52657:172;;;:::o;80623:99::-;65016:12;:10;:12::i;:::-;65005:23;;:7;:5;:7::i;:::-;:23;;;64997:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;80694:20:::1;80706:7;80694:11;:20::i;:::-;80623:99:::0;:::o;50331:177::-;50403:7;50430:70;50447:7;50430:70;;;;;;;;;;;;;;;;;:12;:16;;:70;;;;;:::i;:::-;50423:77;;50331:177;;;:::o;78164:222::-;78228:13;78262:16;78270:7;78262;:16::i;:::-;78254:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;78339:17;78358:18;:7;:16;:18::i;:::-;78322:55;;;;;;;;;:::i;:::-;;;;;;;;;;;;;78308:70;;78164:222;;;:::o;51950:97::-;51998:13;52031:8;52024:15;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51950:97;:::o;80353:129::-;65016:12;:10;:12::i;:::-;65005:23;;:7;:5;:7::i;:::-;:23;;;64997:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;80469:5:::1;80437:21;:29;80459:6;80437:29;;;;;;;;;;;:37;;;;;;;;;;;;:::i;:::-;;80353:129:::0;;:::o;50021:221::-;50093:7;50138:1;50121:19;;:5;:19;;;;50113:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;50205:29;:13;:20;50219:5;50205:20;;;;;;;;;;;;;;;:27;:29::i;:::-;50198:36;;50021:221;;;:::o;65436:148::-;65016:12;:10;:12::i;:::-;65005:23;;:7;:5;:7::i;:::-;:23;;;64997:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65543:1:::1;65506:40;;65527:6;;;;;;;;;;;65506:40;;;;;;;;;;;;65574:1;65557:6;;:19;;;;;;;;;;;;;;;;;;65436:148::o:0;79126:525::-;79199:4;79181:22;;:14;;;;;;;;;;;:22;;;79173:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;73438:3;79245:10;;:22;79237:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;79305:14;79322:13;:11;:13::i;:::-;79305:30;;73394:4;79354:9;:22;79346:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;74167:17;79426:9;:18;;79418:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;79495:32;79505:10;79517:9;79495;:32::i;:::-;79565:12;79538:13;:24;79552:9;79538:24;;;;;;;;;;;:39;;;;79610:10;79588:8;:19;79597:9;79588:19;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;79631:10;;:12;;;;;;;;;:::i;:::-;;;;;;79162:489;79126:525::o;74205:59::-;74238:26;74205:59;:::o;79659:652::-;79739:4;79721:22;;:14;;;;;;;;;;;:22;;;79713:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;73438:3;79785:10;;:22;79777:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;79845:14;79862:13;:11;:13::i;:::-;79845:30;;73394:4;79894:9;:22;79886:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;74238:26;79966:8;;;;;;;;;;;:18;;;79985:10;80005:4;79966:45;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:58;;79958:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;80068:8;;;;;;;;;;;:21;;;80090:10;80109:4;74238:26;80068:57;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;80060:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;80155:32;80165:10;80177:9;80155;:32::i;:::-;80225:12;80198:13;:24;80212:9;80198:24;;;;;;;;;;;:39;;;;80270:10;80248:8;:19;80257:9;80248:19;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;80291:10;;:12;;;;;;;;;:::i;:::-;;;;;;79702:609;79659:652::o;77357:540::-;77418:16;77448:18;77469:17;77479:6;77469:9;:17::i;:::-;77448:38;;77515:1;77501:10;:15;77497:393;;;77592:1;77578:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77571:23;;;;;77497:393;77627:23;77667:10;77653:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77627:51;;77693:13;77721:130;77745:10;77737:5;:18;77721:130;;;77801:34;77821:6;77829:5;77801:19;:34::i;:::-;77785:6;77792:5;77785:13;;;;;;;;:::i;:::-;;;;;;;:50;;;;;77757:7;;;;;:::i;:::-;;;;77721:130;;;77872:6;77865:13;;;;;77357:540;;;;:::o;80911:207::-;65016:12;:10;:12::i;:::-;65005:23;;:7;:5;:7::i;:::-;:23;;;64997:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;80986:10:::1;80978:24;;:47;81003:21;80978:47;;;;;;;;;;;;;;;;;;;;;;;80970:56;;;::::0;::::1;;81045:8;;;;;;;;;;;:17;;;81063:10;81075:8;;;;;;;;;;;:18;;;81102:4;81075:33;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;81045:64;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;81037:73;;;::::0;::::1;;80911:207::o:0;74138:46::-;74167:17;74138:46;:::o;64785:87::-;64831:7;64858:6;;;;;;;;;;;64851:13;;64785:87;:::o;78394:724::-;78469:4;78451:22;;:14;;;;;;;;;;;:22;;;78443:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;73485:3;78515:15;;:31;78507:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;78596:14;78613:13;:11;:13::i;:::-;78596:30;;73394:4;78645:9;:22;78637:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;78773:1;78729:18;;;;;;;;;;;78717:41;;;78759:10;78717:53;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:57;78709:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;78855:5;78821:39;;:18;:30;78840:10;78821:30;;;;;;;;;;;;;;;;;;;;;;;;;:39;;;78813:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;78942:4;78909:18;:30;78928:10;78909:30;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;78957:32;78967:10;78979:9;78957;:32::i;:::-;79027:12;79000:13;:24;79014:9;79000:24;;;;;;;;;;;:39;;;;79072:10;79050:8;:19;79059:9;79050:19;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;79093:15;;:17;;;;;;;;;:::i;:::-;;;;;;78432:686;78394:724::o;50744:104::-;50800:13;50833:7;50826:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50744:104;:::o;53654:295::-;53769:12;:10;:12::i;:::-;53757:24;;:8;:24;;;;53749:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;53869:8;53824:18;:32;53843:12;:10;:12::i;:::-;53824:32;;;;;;;;;;;;;;;:42;53857:8;53824:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;53922:8;53893:48;;53908:12;:10;:12::i;:::-;53893:48;;;53932:8;53893:48;;;;;;:::i;:::-;;;;;;;;53654:295;;:::o;77905:247::-;77961:7;77988:16;77996:7;77988;:16::i;:::-;77980:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;78084:4;78091:13;:22;78105:7;78091:22;;;;;;;;;;;;78115:8;:17;78124:7;78115:17;;;;;;;;;;;;;;;;;;;;;78134:7;78059:83;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;78049:94;;;;;;78034:110;;77905:247;;;:::o;80498:117::-;65016:12;:10;:12::i;:::-;65005:23;;:7;:5;:7::i;:::-;:23;;;64997:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;80599:8:::1;80579:17;:28;;;;;;;;;;;;:::i;:::-;;80498:117:::0;:::o;73526:27::-;;;;:::o;54849:285::-;54981:41;55000:12;:10;:12::i;:::-;55014:7;54981:18;:41::i;:::-;54973:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;55087:39;55101:4;55107:2;55111:7;55120:5;55087:13;:39::i;:::-;54849:285;;;;:::o;50919:792::-;50992:13;51026:16;51034:7;51026;:16::i;:::-;51018:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;51107:23;51133:10;:19;51144:7;51133:19;;;;;;;;;;;51107:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51163:18;51184:9;:7;:9::i;:::-;51163:30;;51291:1;51275:4;51269:18;:23;51265:72;;;51316:9;51309:16;;;;;;51265:72;51467:1;51447:9;51441:23;:27;51437:108;;;51516:4;51522:9;51499:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51485:48;;;;;;51437:108;51677:4;51683:18;:7;:16;:18::i;:::-;51660:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51646:57;;;;50919:792;;;;:::o;73605:49::-;;;;;;;;;;;;;;;;;:::o;73661:44::-;;;;;;;;;;;;;;;;;;;;;;:::o;80824:79::-;65016:12;:10;:12::i;:::-;65005:23;;:7;:5;:7::i;:::-;:23;;;64997:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;80890:5:::1;80873:14;;:22;;;;;;;;;;;;;;;;;;80824:79::o:0;77191:158::-;77243:13;77283;:11;:13::i;:::-;77277:3;:19;77269:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;77327:14;;;;;;;;;;;;;;;;;77320:21;;77191:158;;;:::o;74308:51::-;;;;;;;;;;;;;;;;;;;;;;:::o;54020:164::-;54117:4;54141:18;:25;54160:5;54141:25;;;;;;;;;;;;;;;:35;54167:8;54141:35;;;;;;;;;;;;;;;;;;;;;;;;;54134:42;;54020:164;;;;:::o;65739:244::-;65016:12;:10;:12::i;:::-;65005:23;;:7;:5;:7::i;:::-;:23;;;64997:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65848:1:::1;65828:22;;:8;:22;;;;65820:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;65938:8;65909:38;;65930:6;;;;;;;;;;;65909:38;;;;;;;;;;;;65967:8;65958:6;;:17;;;;;;;;;;;;;;;;;;65739:244:::0;:::o;73360:38::-;73394:4;73360:38;:::o;73497:22::-;;;;:::o;27673:131::-;27740:4;27764:32;27769:3;:10;;27789:5;27781:14;;27764:4;:32::i;:::-;27757:39;;27673:131;;;;:::o;16503:185::-;16592:4;16616:64;16621:3;:10;;16641:3;16633:12;;16671:5;16655:23;;16647:32;;16616:4;:64::i;:::-;16609:71;;16503:185;;;;;:::o;29845:422::-;29905:4;30113:12;30224:7;30212:20;30204:28;;30258:1;30251:4;:8;30244:15;;;29845:422;;;:::o;17080:151::-;17164:4;17188:35;17198:3;:10;;17218:3;17210:12;;17188:9;:35::i;:::-;17181:42;;17080:151;;;;:::o;56601:127::-;56666:4;56690:30;56712:7;56690:12;:21;;:30;;;;:::i;:::-;56683:37;;56601:127;;;:::o;47793:98::-;47846:7;47873:10;47866:17;;47793:98;:::o;62745:183::-;62838:2;62811:15;:24;62827:7;62811:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;62894:7;62890:2;62856:46;;62865:23;62880:7;62865:14;:23::i;:::-;62856:46;;;;;;;;;;;;62745:183;;:::o;17319:123::-;17388:7;17415:19;17423:3;:10;;17415:7;:19::i;:::-;17408:26;;17319:123;;;:::o;56895:355::-;56988:4;57013:16;57021:7;57013;:16::i;:::-;57005:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;57089:13;57105:23;57120:7;57105:14;:23::i;:::-;57089:39;;57158:5;57147:16;;:7;:16;;;:51;;;;57191:7;57167:31;;:20;57179:7;57167:11;:20::i;:::-;:31;;;57147:51;:94;;;;57202:39;57226:5;57233:7;57202:23;:39::i;:::-;57147:94;57139:103;;;56895:355;;;;:::o;60031:597::-;60156:4;60129:31;;:23;60144:7;60129:14;:23::i;:::-;:31;;;60121:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;60257:1;60243:16;;:2;:16;;;;60235:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;60313:39;60334:4;60340:2;60344:7;60313:20;:39::i;:::-;60417:29;60434:1;60438:7;60417:8;:29::i;:::-;60459:35;60486:7;60459:13;:19;60473:4;60459:19;;;;;;;;;;;;;;;:26;;:35;;;;:::i;:::-;;60505:30;60527:7;60505:13;:17;60519:2;60505:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;60548:29;60565:7;60574:2;60548:12;:16;;:29;;;;;:::i;:::-;;60612:7;60608:2;60593:27;;60602:4;60593:27;;;;;;;;;;;;60031:597;;;:::o;28893:137::-;28964:7;28999:22;29003:3;:10;;29015:5;28999:3;:22::i;:::-;28991:31;;28984:38;;28893:137;;;;:::o;17781:236::-;17861:7;17870;17891:11;17904:13;17921:22;17925:3;:10;;17937:5;17921:3;:22::i;:::-;17890:53;;;;17970:3;17962:12;;18000:5;17992:14;;17954:55;;;;;;17781:236;;;;;:::o;61229:100::-;61313:8;61302;:19;;;;;;;;;;;;:::i;:::-;;61229:100;:::o;19067:213::-;19174:7;19225:44;19230:3;:10;;19250:3;19242:12;;19256;19225:4;:44::i;:::-;19217:53;;19194:78;;19067:213;;;;;:::o;7463:723::-;7519:13;7749:1;7740:5;:10;7736:53;;;7767:10;;;;;;;;;;;;;;;;;;;;;7736:53;7799:12;7814:5;7799:20;;7830:14;7855:78;7870:1;7862:4;:9;7855:78;;7888:8;;;;;:::i;:::-;;;;7919:2;7911:10;;;;;:::i;:::-;;;7855:78;;;7943:19;7975:6;7965:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7943:39;;7993:154;8009:1;8000:5;:10;7993:154;;8037:1;8027:11;;;;;:::i;:::-;;;8104:2;8096:5;:10;;;;:::i;:::-;8083:2;:24;;;;:::i;:::-;8070:39;;8053:6;8060;8053:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;8133:2;8124:11;;;;;:::i;:::-;;;7993:154;;;8171:6;8157:21;;;;;7463:723;;;;:::o;28435:114::-;28495:7;28522:19;28530:3;:10;;28522:7;:19::i;:::-;28515:26;;28435:114;;;:::o;57593:110::-;57669:26;57679:2;57683:7;57669:26;;;;;;;;;;;;:9;:26::i;:::-;57593:110;;:::o;56016:272::-;56130:28;56140:4;56146:2;56150:7;56130:9;:28::i;:::-;56177:48;56200:4;56206:2;56210:7;56219:5;56177:22;:48::i;:::-;56169:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;56016:272;;;;:::o;21043:414::-;21106:4;21128:21;21138:3;21143:5;21128:9;:21::i;:::-;21123:327;;21166:3;:11;;21183:5;21166:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21349:3;:11;;:18;;;;21327:3;:12;;:19;21340:5;21327:19;;;;;;;;;;;:40;;;;21389:4;21382:11;;;;21123:327;21433:5;21426:12;;21043:414;;;;;:::o;11178:692::-;11254:4;11370:16;11389:3;:12;;:17;11402:3;11389:17;;;;;;;;;;;;11370:36;;11435:1;11423:8;:13;11419:444;;;11490:3;:12;;11508:38;;;;;;;;11525:3;11508:38;;;;11538:5;11508:38;;;11490:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11705:3;:12;;:19;;;;11685:3;:12;;:17;11698:3;11685:17;;;;;;;;;;;:39;;;;11746:4;11739:11;;;;;11419:444;11819:5;11783:3;:12;;11807:1;11796:8;:12;;;;:::i;:::-;11783:26;;;;;;;;:::i;:::-;;;;;;;;;;;;:33;;:41;;;;11846:5;11839:12;;;11178:692;;;;;;:::o;13678:125::-;13749:4;13794:1;13773:3;:12;;:17;13786:3;13773:17;;;;;;;;;;;;:22;;13766:29;;13678:125;;;;:::o;13898:110::-;13954:7;13981:3;:12;;:19;;;;13974:26;;13898:110;;;:::o;63541:93::-;;;;:::o;27980:137::-;28050:4;28074:35;28082:3;:10;;28102:5;28094:14;;28074:7;:35::i;:::-;28067:42;;27980:137;;;;:::o;23931:204::-;23998:7;24047:5;24026:3;:11;;:18;;;;:26;24018:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;24109:3;:11;;24121:5;24109:18;;;;;;;;:::i;:::-;;;;;;;;;;24102:25;;23931:204;;;;:::o;14363:279::-;14430:7;14439;14489:5;14467:3;:12;;:19;;;;:27;14459:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;14546:22;14571:3;:12;;14584:5;14571:19;;;;;;;;:::i;:::-;;;;;;;;;;;;14546:44;;14609:5;:10;;;14621:5;:12;;;14601:33;;;;;14363:279;;;;;:::o;15860:319::-;15954:7;15974:16;15993:3;:12;;:17;16006:3;15993:17;;;;;;;;;;;;15974:36;;16041:1;16029:8;:13;;16044:12;16021:36;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;16111:3;:12;;16135:1;16124:8;:12;;;;:::i;:::-;16111:26;;;;;;;;:::i;:::-;;;;;;;;;;;;:33;;;16104:40;;;15860:319;;;;;:::o;23478:109::-;23534:7;23561:3;:11;;:18;;;;23554:25;;23478:109;;;:::o;57930:250::-;58026:18;58032:2;58036:7;58026:5;:18::i;:::-;58063:54;58094:1;58098:2;58102:7;58111:5;58063:22;:54::i;:::-;58055:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;57930:250;;;:::o;61894:843::-;62015:4;62041:15;:2;:13;;;:15::i;:::-;62037:693;;;62093:2;62077:36;;;62114:12;:10;:12::i;:::-;62128:4;62134:7;62143:5;62077:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;62073:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62340:1;62323:6;:13;:18;62319:341;;;62366:60;;;;;;;;;;:::i;:::-;;;;;;;;62319:341;62610:6;62604:13;62595:6;62591:2;62587:15;62580:38;62073:602;62210:45;;;62200:55;;;:6;:55;;;;62193:62;;;;;62037:693;62714:4;62707:11;;61894:843;;;;;;;:::o;23263:129::-;23336:4;23383:1;23360:3;:12;;:19;23373:5;23360:19;;;;;;;;;;;;:24;;23353:31;;23263:129;;;;:::o;21633:1544::-;21699:4;21817:18;21838:3;:12;;:19;21851:5;21838:19;;;;;;;;;;;;21817:40;;21888:1;21874:10;:15;21870:1300;;22236:21;22273:1;22260:10;:14;;;;:::i;:::-;22236:38;;22289:17;22330:1;22309:3;:11;;:18;;;;:22;;;;:::i;:::-;22289:42;;22576:17;22596:3;:11;;22608:9;22596:22;;;;;;;;:::i;:::-;;;;;;;;;;22576:42;;22742:9;22713:3;:11;;22725:13;22713:26;;;;;;;;:::i;:::-;;;;;;;;;:38;;;;22861:1;22845:13;:17;;;;:::i;:::-;22819:3;:12;;:23;22832:9;22819:23;;;;;;;;;;;:43;;;;22971:3;:11;;:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;23066:3;:12;;:19;23079:5;23066:19;;;;;;;;;;;23059:26;;;23109:4;23102:11;;;;;;;;21870:1300;23153:5;23146:12;;;21633:1544;;;;;:::o;58516:404::-;58610:1;58596:16;;:2;:16;;;;58588:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;58669:16;58677:7;58669;:16::i;:::-;58668:17;58660:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;58731:45;58760:1;58764:2;58768:7;58731:20;:45::i;:::-;58789:30;58811:7;58789:13;:17;58803:2;58789:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;58832:29;58849:7;58858:2;58832:12;:16;;:29;;;;;:::i;:::-;;58904:7;58900:2;58879:33;;58896:1;58879:33;;;;;;;;;;;;58516:404;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1179:5;1210:6;1204:13;1195:22;;1226:30;1250:5;1226:30;:::i;:::-;1125:137;;;;:::o;1268:::-;1313:5;1351:6;1338:20;1329:29;;1367:32;1393:5;1367:32;:::i;:::-;1268:137;;;;:::o;1411:141::-;1467:5;1498:6;1492:13;1483:22;;1514:32;1540:5;1514:32;:::i;:::-;1411:141;;;;:::o;1571:338::-;1626:5;1675:3;1668:4;1660:6;1656:17;1652:27;1642:122;;1683:79;;:::i;:::-;1642:122;1800:6;1787:20;1825:78;1899:3;1891:6;1884:4;1876:6;1872:17;1825:78;:::i;:::-;1816:87;;1632:277;1571:338;;;;:::o;1929:340::-;1985:5;2034:3;2027:4;2019:6;2015:17;2011:27;2001:122;;2042:79;;:::i;:::-;2001:122;2159:6;2146:20;2184:79;2259:3;2251:6;2244:4;2236:6;2232:17;2184:79;:::i;:::-;2175:88;;1991:278;1929:340;;;;:::o;2275:139::-;2321:5;2359:6;2346:20;2337:29;;2375:33;2402:5;2375:33;:::i;:::-;2275:139;;;;:::o;2420:143::-;2477:5;2508:6;2502:13;2493:22;;2524:33;2551:5;2524:33;:::i;:::-;2420:143;;;;:::o;2569:329::-;2628:6;2677:2;2665:9;2656:7;2652:23;2648:32;2645:119;;;2683:79;;:::i;:::-;2645:119;2803:1;2828:53;2873:7;2864:6;2853:9;2849:22;2828:53;:::i;:::-;2818:63;;2774:117;2569:329;;;;:::o;2904:474::-;2972:6;2980;3029:2;3017:9;3008:7;3004:23;3000:32;2997:119;;;3035:79;;:::i;:::-;2997:119;3155:1;3180:53;3225:7;3216:6;3205:9;3201:22;3180:53;:::i;:::-;3170:63;;3126:117;3282:2;3308:53;3353:7;3344:6;3333:9;3329:22;3308:53;:::i;:::-;3298:63;;3253:118;2904:474;;;;;:::o;3384:619::-;3461:6;3469;3477;3526:2;3514:9;3505:7;3501:23;3497:32;3494:119;;;3532:79;;:::i;:::-;3494:119;3652:1;3677:53;3722:7;3713:6;3702:9;3698:22;3677:53;:::i;:::-;3667:63;;3623:117;3779:2;3805:53;3850:7;3841:6;3830:9;3826:22;3805:53;:::i;:::-;3795:63;;3750:118;3907:2;3933:53;3978:7;3969:6;3958:9;3954:22;3933:53;:::i;:::-;3923:63;;3878:118;3384:619;;;;;:::o;4009:943::-;4104:6;4112;4120;4128;4177:3;4165:9;4156:7;4152:23;4148:33;4145:120;;;4184:79;;:::i;:::-;4145:120;4304:1;4329:53;4374:7;4365:6;4354:9;4350:22;4329:53;:::i;:::-;4319:63;;4275:117;4431:2;4457:53;4502:7;4493:6;4482:9;4478:22;4457:53;:::i;:::-;4447:63;;4402:118;4559:2;4585:53;4630:7;4621:6;4610:9;4606:22;4585:53;:::i;:::-;4575:63;;4530:118;4715:2;4704:9;4700:18;4687:32;4746:18;4738:6;4735:30;4732:117;;;4768:79;;:::i;:::-;4732:117;4873:62;4927:7;4918:6;4907:9;4903:22;4873:62;:::i;:::-;4863:72;;4658:287;4009:943;;;;;;;:::o;4958:468::-;5023:6;5031;5080:2;5068:9;5059:7;5055:23;5051:32;5048:119;;;5086:79;;:::i;:::-;5048:119;5206:1;5231:53;5276:7;5267:6;5256:9;5252:22;5231:53;:::i;:::-;5221:63;;5177:117;5333:2;5359:50;5401:7;5392:6;5381:9;5377:22;5359:50;:::i;:::-;5349:60;;5304:115;4958:468;;;;;:::o;5432:474::-;5500:6;5508;5557:2;5545:9;5536:7;5532:23;5528:32;5525:119;;;5563:79;;:::i;:::-;5525:119;5683:1;5708:53;5753:7;5744:6;5733:9;5729:22;5708:53;:::i;:::-;5698:63;;5654:117;5810:2;5836:53;5881:7;5872:6;5861:9;5857:22;5836:53;:::i;:::-;5826:63;;5781:118;5432:474;;;;;:::o;5912:345::-;5979:6;6028:2;6016:9;6007:7;6003:23;5999:32;5996:119;;;6034:79;;:::i;:::-;5996:119;6154:1;6179:61;6232:7;6223:6;6212:9;6208:22;6179:61;:::i;:::-;6169:71;;6125:125;5912:345;;;;:::o;6263:327::-;6321:6;6370:2;6358:9;6349:7;6345:23;6341:32;6338:119;;;6376:79;;:::i;:::-;6338:119;6496:1;6521:52;6565:7;6556:6;6545:9;6541:22;6521:52;:::i;:::-;6511:62;;6467:116;6263:327;;;;:::o;6596:349::-;6665:6;6714:2;6702:9;6693:7;6689:23;6685:32;6682:119;;;6720:79;;:::i;:::-;6682:119;6840:1;6865:63;6920:7;6911:6;6900:9;6896:22;6865:63;:::i;:::-;6855:73;;6811:127;6596:349;;;;:::o;6951:509::-;7020:6;7069:2;7057:9;7048:7;7044:23;7040:32;7037:119;;;7075:79;;:::i;:::-;7037:119;7223:1;7212:9;7208:17;7195:31;7253:18;7245:6;7242:30;7239:117;;;7275:79;;:::i;:::-;7239:117;7380:63;7435:7;7426:6;7415:9;7411:22;7380:63;:::i;:::-;7370:73;;7166:287;6951:509;;;;:::o;7466:329::-;7525:6;7574:2;7562:9;7553:7;7549:23;7545:32;7542:119;;;7580:79;;:::i;:::-;7542:119;7700:1;7725:53;7770:7;7761:6;7750:9;7746:22;7725:53;:::i;:::-;7715:63;;7671:117;7466:329;;;;:::o;7801:351::-;7871:6;7920:2;7908:9;7899:7;7895:23;7891:32;7888:119;;;7926:79;;:::i;:::-;7888:119;8046:1;8071:64;8127:7;8118:6;8107:9;8103:22;8071:64;:::i;:::-;8061:74;;8017:128;7801:351;;;;:::o;8158:654::-;8236:6;8244;8293:2;8281:9;8272:7;8268:23;8264:32;8261:119;;;8299:79;;:::i;:::-;8261:119;8419:1;8444:53;8489:7;8480:6;8469:9;8465:22;8444:53;:::i;:::-;8434:63;;8390:117;8574:2;8563:9;8559:18;8546:32;8605:18;8597:6;8594:30;8591:117;;;8627:79;;:::i;:::-;8591:117;8732:63;8787:7;8778:6;8767:9;8763:22;8732:63;:::i;:::-;8722:73;;8517:288;8158:654;;;;;:::o;8818:179::-;8887:10;8908:46;8950:3;8942:6;8908:46;:::i;:::-;8986:4;8981:3;8977:14;8963:28;;8818:179;;;;:::o;9003:118::-;9090:24;9108:5;9090:24;:::i;:::-;9085:3;9078:37;9003:118;;:::o;9127:157::-;9232:45;9252:24;9270:5;9252:24;:::i;:::-;9232:45;:::i;:::-;9227:3;9220:58;9127:157;;:::o;9320:732::-;9439:3;9468:54;9516:5;9468:54;:::i;:::-;9538:86;9617:6;9612:3;9538:86;:::i;:::-;9531:93;;9648:56;9698:5;9648:56;:::i;:::-;9727:7;9758:1;9743:284;9768:6;9765:1;9762:13;9743:284;;;9844:6;9838:13;9871:63;9930:3;9915:13;9871:63;:::i;:::-;9864:70;;9957:60;10010:6;9957:60;:::i;:::-;9947:70;;9803:224;9790:1;9787;9783:9;9778:14;;9743:284;;;9747:14;10043:3;10036:10;;9444:608;;;9320:732;;;;:::o;10058:109::-;10139:21;10154:5;10139:21;:::i;:::-;10134:3;10127:34;10058:109;;:::o;10173:118::-;10260:24;10278:5;10260:24;:::i;:::-;10255:3;10248:37;10173:118;;:::o;10297:360::-;10383:3;10411:38;10443:5;10411:38;:::i;:::-;10465:70;10528:6;10523:3;10465:70;:::i;:::-;10458:77;;10544:52;10589:6;10584:3;10577:4;10570:5;10566:16;10544:52;:::i;:::-;10621:29;10643:6;10621:29;:::i;:::-;10616:3;10612:39;10605:46;;10387:270;10297:360;;;;:::o;10663:364::-;10751:3;10779:39;10812:5;10779:39;:::i;:::-;10834:71;10898:6;10893:3;10834:71;:::i;:::-;10827:78;;10914:52;10959:6;10954:3;10947:4;10940:5;10936:16;10914:52;:::i;:::-;10991:29;11013:6;10991:29;:::i;:::-;10986:3;10982:39;10975:46;;10755:272;10663:364;;;;:::o;11033:377::-;11139:3;11167:39;11200:5;11167:39;:::i;:::-;11222:89;11304:6;11299:3;11222:89;:::i;:::-;11215:96;;11320:52;11365:6;11360:3;11353:4;11346:5;11342:16;11320:52;:::i;:::-;11397:6;11392:3;11388:16;11381:23;;11143:267;11033:377;;;;:::o;11440:845::-;11543:3;11580:5;11574:12;11609:36;11635:9;11609:36;:::i;:::-;11661:89;11743:6;11738:3;11661:89;:::i;:::-;11654:96;;11781:1;11770:9;11766:17;11797:1;11792:137;;;;11943:1;11938:341;;;;11759:520;;11792:137;11876:4;11872:9;11861;11857:25;11852:3;11845:38;11912:6;11907:3;11903:16;11896:23;;11792:137;;11938:341;12005:38;12037:5;12005:38;:::i;:::-;12065:1;12079:154;12093:6;12090:1;12087:13;12079:154;;;12167:7;12161:14;12157:1;12152:3;12148:11;12141:35;12217:1;12208:7;12204:15;12193:26;;12115:4;12112:1;12108:12;12103:17;;12079:154;;;12262:6;12257:3;12253:16;12246:23;;11945:334;;11759:520;;11547:738;;11440:845;;;;:::o;12291:366::-;12433:3;12454:67;12518:2;12513:3;12454:67;:::i;:::-;12447:74;;12530:93;12619:3;12530:93;:::i;:::-;12648:2;12643:3;12639:12;12632:19;;12291:366;;;:::o;12663:::-;12805:3;12826:67;12890:2;12885:3;12826:67;:::i;:::-;12819:74;;12902:93;12991:3;12902:93;:::i;:::-;13020:2;13015:3;13011:12;13004:19;;12663:366;;;:::o;13035:::-;13177:3;13198:67;13262:2;13257:3;13198:67;:::i;:::-;13191:74;;13274:93;13363:3;13274:93;:::i;:::-;13392:2;13387:3;13383:12;13376:19;;13035:366;;;:::o;13407:::-;13549:3;13570:67;13634:2;13629:3;13570:67;:::i;:::-;13563:74;;13646:93;13735:3;13646:93;:::i;:::-;13764:2;13759:3;13755:12;13748:19;;13407:366;;;:::o;13779:::-;13921:3;13942:67;14006:2;14001:3;13942:67;:::i;:::-;13935:74;;14018:93;14107:3;14018:93;:::i;:::-;14136:2;14131:3;14127:12;14120:19;;13779:366;;;:::o;14151:::-;14293:3;14314:67;14378:2;14373:3;14314:67;:::i;:::-;14307:74;;14390:93;14479:3;14390:93;:::i;:::-;14508:2;14503:3;14499:12;14492:19;;14151:366;;;:::o;14523:::-;14665:3;14686:67;14750:2;14745:3;14686:67;:::i;:::-;14679:74;;14762:93;14851:3;14762:93;:::i;:::-;14880:2;14875:3;14871:12;14864:19;;14523:366;;;:::o;14895:::-;15037:3;15058:67;15122:2;15117:3;15058:67;:::i;:::-;15051:74;;15134:93;15223:3;15134:93;:::i;:::-;15252:2;15247:3;15243:12;15236:19;;14895:366;;;:::o;15267:::-;15409:3;15430:67;15494:2;15489:3;15430:67;:::i;:::-;15423:74;;15506:93;15595:3;15506:93;:::i;:::-;15624:2;15619:3;15615:12;15608:19;;15267:366;;;:::o;15639:365::-;15781:3;15802:66;15866:1;15861:3;15802:66;:::i;:::-;15795:73;;15877:93;15966:3;15877:93;:::i;:::-;15995:2;15990:3;15986:12;15979:19;;15639:365;;;:::o;16010:366::-;16152:3;16173:67;16237:2;16232:3;16173:67;:::i;:::-;16166:74;;16249:93;16338:3;16249:93;:::i;:::-;16367:2;16362:3;16358:12;16351:19;;16010:366;;;:::o;16382:::-;16524:3;16545:67;16609:2;16604:3;16545:67;:::i;:::-;16538:74;;16621:93;16710:3;16621:93;:::i;:::-;16739:2;16734:3;16730:12;16723:19;;16382:366;;;:::o;16754:::-;16896:3;16917:67;16981:2;16976:3;16917:67;:::i;:::-;16910:74;;16993:93;17082:3;16993:93;:::i;:::-;17111:2;17106:3;17102:12;17095:19;;16754:366;;;:::o;17126:::-;17268:3;17289:67;17353:2;17348:3;17289:67;:::i;:::-;17282:74;;17365:93;17454:3;17365:93;:::i;:::-;17483:2;17478:3;17474:12;17467:19;;17126:366;;;:::o;17498:::-;17640:3;17661:67;17725:2;17720:3;17661:67;:::i;:::-;17654:74;;17737:93;17826:3;17737:93;:::i;:::-;17855:2;17850:3;17846:12;17839:19;;17498:366;;;:::o;17870:::-;18012:3;18033:67;18097:2;18092:3;18033:67;:::i;:::-;18026:74;;18109:93;18198:3;18109:93;:::i;:::-;18227:2;18222:3;18218:12;18211:19;;17870:366;;;:::o;18242:::-;18384:3;18405:67;18469:2;18464:3;18405:67;:::i;:::-;18398:74;;18481:93;18570:3;18481:93;:::i;:::-;18599:2;18594:3;18590:12;18583:19;;18242:366;;;:::o;18614:::-;18756:3;18777:67;18841:2;18836:3;18777:67;:::i;:::-;18770:74;;18853:93;18942:3;18853:93;:::i;:::-;18971:2;18966:3;18962:12;18955:19;;18614:366;;;:::o;18986:::-;19128:3;19149:67;19213:2;19208:3;19149:67;:::i;:::-;19142:74;;19225:93;19314:3;19225:93;:::i;:::-;19343:2;19338:3;19334:12;19327:19;;18986:366;;;:::o;19358:::-;19500:3;19521:67;19585:2;19580:3;19521:67;:::i;:::-;19514:74;;19597:93;19686:3;19597:93;:::i;:::-;19715:2;19710:3;19706:12;19699:19;;19358:366;;;:::o;19730:::-;19872:3;19893:67;19957:2;19952:3;19893:67;:::i;:::-;19886:74;;19969:93;20058:3;19969:93;:::i;:::-;20087:2;20082:3;20078:12;20071:19;;19730:366;;;:::o;20102:::-;20244:3;20265:67;20329:2;20324:3;20265:67;:::i;:::-;20258:74;;20341:93;20430:3;20341:93;:::i;:::-;20459:2;20454:3;20450:12;20443:19;;20102:366;;;:::o;20474:::-;20616:3;20637:67;20701:2;20696:3;20637:67;:::i;:::-;20630:74;;20713:93;20802:3;20713:93;:::i;:::-;20831:2;20826:3;20822:12;20815:19;;20474:366;;;:::o;20846:::-;20988:3;21009:67;21073:2;21068:3;21009:67;:::i;:::-;21002:74;;21085:93;21174:3;21085:93;:::i;:::-;21203:2;21198:3;21194:12;21187:19;;20846:366;;;:::o;21218:::-;21360:3;21381:67;21445:2;21440:3;21381:67;:::i;:::-;21374:74;;21457:93;21546:3;21457:93;:::i;:::-;21575:2;21570:3;21566:12;21559:19;;21218:366;;;:::o;21590:::-;21732:3;21753:67;21817:2;21812:3;21753:67;:::i;:::-;21746:74;;21829:93;21918:3;21829:93;:::i;:::-;21947:2;21942:3;21938:12;21931:19;;21590:366;;;:::o;21962:::-;22104:3;22125:67;22189:2;22184:3;22125:67;:::i;:::-;22118:74;;22201:93;22290:3;22201:93;:::i;:::-;22319:2;22314:3;22310:12;22303:19;;21962:366;;;:::o;22334:::-;22476:3;22497:67;22561:2;22556:3;22497:67;:::i;:::-;22490:74;;22573:93;22662:3;22573:93;:::i;:::-;22691:2;22686:3;22682:12;22675:19;;22334:366;;;:::o;22706:108::-;22783:24;22801:5;22783:24;:::i;:::-;22778:3;22771:37;22706:108;;:::o;22820:118::-;22907:24;22925:5;22907:24;:::i;:::-;22902:3;22895:37;22820:118;;:::o;22944:157::-;23049:45;23069:24;23087:5;23069:24;:::i;:::-;23049:45;:::i;:::-;23044:3;23037:58;22944:157;;:::o;23107:679::-;23303:3;23318:75;23389:3;23380:6;23318:75;:::i;:::-;23418:2;23413:3;23409:12;23402:19;;23431:75;23502:3;23493:6;23431:75;:::i;:::-;23531:2;23526:3;23522:12;23515:19;;23544:75;23615:3;23606:6;23544:75;:::i;:::-;23644:2;23639:3;23635:12;23628:19;;23657:75;23728:3;23719:6;23657:75;:::i;:::-;23757:2;23752:3;23748:12;23741:19;;23777:3;23770:10;;23107:679;;;;;;;:::o;23792:435::-;23972:3;23994:95;24085:3;24076:6;23994:95;:::i;:::-;23987:102;;24106:95;24197:3;24188:6;24106:95;:::i;:::-;24099:102;;24218:3;24211:10;;23792:435;;;;;:::o;24233:429::-;24410:3;24432:92;24520:3;24511:6;24432:92;:::i;:::-;24425:99;;24541:95;24632:3;24623:6;24541:95;:::i;:::-;24534:102;;24653:3;24646:10;;24233:429;;;;;:::o;24668:222::-;24761:4;24799:2;24788:9;24784:18;24776:26;;24812:71;24880:1;24869:9;24865:17;24856:6;24812:71;:::i;:::-;24668:222;;;;:::o;24896:332::-;25017:4;25055:2;25044:9;25040:18;25032:26;;25068:71;25136:1;25125:9;25121:17;25112:6;25068:71;:::i;:::-;25149:72;25217:2;25206:9;25202:18;25193:6;25149:72;:::i;:::-;24896:332;;;;;:::o;25234:442::-;25383:4;25421:2;25410:9;25406:18;25398:26;;25434:71;25502:1;25491:9;25487:17;25478:6;25434:71;:::i;:::-;25515:72;25583:2;25572:9;25568:18;25559:6;25515:72;:::i;:::-;25597;25665:2;25654:9;25650:18;25641:6;25597:72;:::i;:::-;25234:442;;;;;;:::o;25682:640::-;25877:4;25915:3;25904:9;25900:19;25892:27;;25929:71;25997:1;25986:9;25982:17;25973:6;25929:71;:::i;:::-;26010:72;26078:2;26067:9;26063:18;26054:6;26010:72;:::i;:::-;26092;26160:2;26149:9;26145:18;26136:6;26092:72;:::i;:::-;26211:9;26205:4;26201:20;26196:2;26185:9;26181:18;26174:48;26239:76;26310:4;26301:6;26239:76;:::i;:::-;26231:84;;25682:640;;;;;;;:::o;26328:332::-;26449:4;26487:2;26476:9;26472:18;26464:26;;26500:71;26568:1;26557:9;26553:17;26544:6;26500:71;:::i;:::-;26581:72;26649:2;26638:9;26634:18;26625:6;26581:72;:::i;:::-;26328:332;;;;;:::o;26666:373::-;26809:4;26847:2;26836:9;26832:18;26824:26;;26896:9;26890:4;26886:20;26882:1;26871:9;26867:17;26860:47;26924:108;27027:4;27018:6;26924:108;:::i;:::-;26916:116;;26666:373;;;;:::o;27045:210::-;27132:4;27170:2;27159:9;27155:18;27147:26;;27183:65;27245:1;27234:9;27230:17;27221:6;27183:65;:::i;:::-;27045:210;;;;:::o;27261:222::-;27354:4;27392:2;27381:9;27377:18;27369:26;;27405:71;27473:1;27462:9;27458:17;27449:6;27405:71;:::i;:::-;27261:222;;;;:::o;27489:313::-;27602:4;27640:2;27629:9;27625:18;27617:26;;27689:9;27683:4;27679:20;27675:1;27664:9;27660:17;27653:47;27717:78;27790:4;27781:6;27717:78;:::i;:::-;27709:86;;27489:313;;;;:::o;27808:419::-;27974:4;28012:2;28001:9;27997:18;27989:26;;28061:9;28055:4;28051:20;28047:1;28036:9;28032:17;28025:47;28089:131;28215:4;28089:131;:::i;:::-;28081:139;;27808:419;;;:::o;28233:::-;28399:4;28437:2;28426:9;28422:18;28414:26;;28486:9;28480:4;28476:20;28472:1;28461:9;28457:17;28450:47;28514:131;28640:4;28514:131;:::i;:::-;28506:139;;28233:419;;;:::o;28658:::-;28824:4;28862:2;28851:9;28847:18;28839:26;;28911:9;28905:4;28901:20;28897:1;28886:9;28882:17;28875:47;28939:131;29065:4;28939:131;:::i;:::-;28931:139;;28658:419;;;:::o;29083:::-;29249:4;29287:2;29276:9;29272:18;29264:26;;29336:9;29330:4;29326:20;29322:1;29311:9;29307:17;29300:47;29364:131;29490:4;29364:131;:::i;:::-;29356:139;;29083:419;;;:::o;29508:::-;29674:4;29712:2;29701:9;29697:18;29689:26;;29761:9;29755:4;29751:20;29747:1;29736:9;29732:17;29725:47;29789:131;29915:4;29789:131;:::i;:::-;29781:139;;29508:419;;;:::o;29933:::-;30099:4;30137:2;30126:9;30122:18;30114:26;;30186:9;30180:4;30176:20;30172:1;30161:9;30157:17;30150:47;30214:131;30340:4;30214:131;:::i;:::-;30206:139;;29933:419;;;:::o;30358:::-;30524:4;30562:2;30551:9;30547:18;30539:26;;30611:9;30605:4;30601:20;30597:1;30586:9;30582:17;30575:47;30639:131;30765:4;30639:131;:::i;:::-;30631:139;;30358:419;;;:::o;30783:::-;30949:4;30987:2;30976:9;30972:18;30964:26;;31036:9;31030:4;31026:20;31022:1;31011:9;31007:17;31000:47;31064:131;31190:4;31064:131;:::i;:::-;31056:139;;30783:419;;;:::o;31208:::-;31374:4;31412:2;31401:9;31397:18;31389:26;;31461:9;31455:4;31451:20;31447:1;31436:9;31432:17;31425:47;31489:131;31615:4;31489:131;:::i;:::-;31481:139;;31208:419;;;:::o;31633:::-;31799:4;31837:2;31826:9;31822:18;31814:26;;31886:9;31880:4;31876:20;31872:1;31861:9;31857:17;31850:47;31914:131;32040:4;31914:131;:::i;:::-;31906:139;;31633:419;;;:::o;32058:::-;32224:4;32262:2;32251:9;32247:18;32239:26;;32311:9;32305:4;32301:20;32297:1;32286:9;32282:17;32275:47;32339:131;32465:4;32339:131;:::i;:::-;32331:139;;32058:419;;;:::o;32483:::-;32649:4;32687:2;32676:9;32672:18;32664:26;;32736:9;32730:4;32726:20;32722:1;32711:9;32707:17;32700:47;32764:131;32890:4;32764:131;:::i;:::-;32756:139;;32483:419;;;:::o;32908:::-;33074:4;33112:2;33101:9;33097:18;33089:26;;33161:9;33155:4;33151:20;33147:1;33136:9;33132:17;33125:47;33189:131;33315:4;33189:131;:::i;:::-;33181:139;;32908:419;;;:::o;33333:::-;33499:4;33537:2;33526:9;33522:18;33514:26;;33586:9;33580:4;33576:20;33572:1;33561:9;33557:17;33550:47;33614:131;33740:4;33614:131;:::i;:::-;33606:139;;33333:419;;;:::o;33758:::-;33924:4;33962:2;33951:9;33947:18;33939:26;;34011:9;34005:4;34001:20;33997:1;33986:9;33982:17;33975:47;34039:131;34165:4;34039:131;:::i;:::-;34031:139;;33758:419;;;:::o;34183:::-;34349:4;34387:2;34376:9;34372:18;34364:26;;34436:9;34430:4;34426:20;34422:1;34411:9;34407:17;34400:47;34464:131;34590:4;34464:131;:::i;:::-;34456:139;;34183:419;;;:::o;34608:::-;34774:4;34812:2;34801:9;34797:18;34789:26;;34861:9;34855:4;34851:20;34847:1;34836:9;34832:17;34825:47;34889:131;35015:4;34889:131;:::i;:::-;34881:139;;34608:419;;;:::o;35033:::-;35199:4;35237:2;35226:9;35222:18;35214:26;;35286:9;35280:4;35276:20;35272:1;35261:9;35257:17;35250:47;35314:131;35440:4;35314:131;:::i;:::-;35306:139;;35033:419;;;:::o;35458:::-;35624:4;35662:2;35651:9;35647:18;35639:26;;35711:9;35705:4;35701:20;35697:1;35686:9;35682:17;35675:47;35739:131;35865:4;35739:131;:::i;:::-;35731:139;;35458:419;;;:::o;35883:::-;36049:4;36087:2;36076:9;36072:18;36064:26;;36136:9;36130:4;36126:20;36122:1;36111:9;36107:17;36100:47;36164:131;36290:4;36164:131;:::i;:::-;36156:139;;35883:419;;;:::o;36308:::-;36474:4;36512:2;36501:9;36497:18;36489:26;;36561:9;36555:4;36551:20;36547:1;36536:9;36532:17;36525:47;36589:131;36715:4;36589:131;:::i;:::-;36581:139;;36308:419;;;:::o;36733:::-;36899:4;36937:2;36926:9;36922:18;36914:26;;36986:9;36980:4;36976:20;36972:1;36961:9;36957:17;36950:47;37014:131;37140:4;37014:131;:::i;:::-;37006:139;;36733:419;;;:::o;37158:::-;37324:4;37362:2;37351:9;37347:18;37339:26;;37411:9;37405:4;37401:20;37397:1;37386:9;37382:17;37375:47;37439:131;37565:4;37439:131;:::i;:::-;37431:139;;37158:419;;;:::o;37583:::-;37749:4;37787:2;37776:9;37772:18;37764:26;;37836:9;37830:4;37826:20;37822:1;37811:9;37807:17;37800:47;37864:131;37990:4;37864:131;:::i;:::-;37856:139;;37583:419;;;:::o;38008:::-;38174:4;38212:2;38201:9;38197:18;38189:26;;38261:9;38255:4;38251:20;38247:1;38236:9;38232:17;38225:47;38289:131;38415:4;38289:131;:::i;:::-;38281:139;;38008:419;;;:::o;38433:::-;38599:4;38637:2;38626:9;38622:18;38614:26;;38686:9;38680:4;38676:20;38672:1;38661:9;38657:17;38650:47;38714:131;38840:4;38714:131;:::i;:::-;38706:139;;38433:419;;;:::o;38858:::-;39024:4;39062:2;39051:9;39047:18;39039:26;;39111:9;39105:4;39101:20;39097:1;39086:9;39082:17;39075:47;39139:131;39265:4;39139:131;:::i;:::-;39131:139;;38858:419;;;:::o;39283:::-;39449:4;39487:2;39476:9;39472:18;39464:26;;39536:9;39530:4;39526:20;39522:1;39511:9;39507:17;39500:47;39564:131;39690:4;39564:131;:::i;:::-;39556:139;;39283:419;;;:::o;39708:222::-;39801:4;39839:2;39828:9;39824:18;39816:26;;39852:71;39920:1;39909:9;39905:17;39896:6;39852:71;:::i;:::-;39708:222;;;;:::o;39936:129::-;39970:6;39997:20;;:::i;:::-;39987:30;;40026:33;40054:4;40046:6;40026:33;:::i;:::-;39936:129;;;:::o;40071:75::-;40104:6;40137:2;40131:9;40121:19;;40071:75;:::o;40152:307::-;40213:4;40303:18;40295:6;40292:30;40289:56;;;40325:18;;:::i;:::-;40289:56;40363:29;40385:6;40363:29;:::i;:::-;40355:37;;40447:4;40441;40437:15;40429:23;;40152:307;;;:::o;40465:308::-;40527:4;40617:18;40609:6;40606:30;40603:56;;;40639:18;;:::i;:::-;40603:56;40677:29;40699:6;40677:29;:::i;:::-;40669:37;;40761:4;40755;40751:15;40743:23;;40465:308;;;:::o;40779:132::-;40846:4;40869:3;40861:11;;40899:4;40894:3;40890:14;40882:22;;40779:132;;;:::o;40917:141::-;40966:4;40989:3;40981:11;;41012:3;41009:1;41002:14;41046:4;41043:1;41033:18;41025:26;;40917:141;;;:::o;41064:114::-;41131:6;41165:5;41159:12;41149:22;;41064:114;;;:::o;41184:98::-;41235:6;41269:5;41263:12;41253:22;;41184:98;;;:::o;41288:99::-;41340:6;41374:5;41368:12;41358:22;;41288:99;;;:::o;41393:113::-;41463:4;41495;41490:3;41486:14;41478:22;;41393:113;;;:::o;41512:184::-;41611:11;41645:6;41640:3;41633:19;41685:4;41680:3;41676:14;41661:29;;41512:184;;;;:::o;41702:168::-;41785:11;41819:6;41814:3;41807:19;41859:4;41854:3;41850:14;41835:29;;41702:168;;;;:::o;41876:169::-;41960:11;41994:6;41989:3;41982:19;42034:4;42029:3;42025:14;42010:29;;41876:169;;;;:::o;42051:148::-;42153:11;42190:3;42175:18;;42051:148;;;;:::o;42205:305::-;42245:3;42264:20;42282:1;42264:20;:::i;:::-;42259:25;;42298:20;42316:1;42298:20;:::i;:::-;42293:25;;42452:1;42384:66;42380:74;42377:1;42374:81;42371:107;;;42458:18;;:::i;:::-;42371:107;42502:1;42499;42495:9;42488:16;;42205:305;;;;:::o;42516:185::-;42556:1;42573:20;42591:1;42573:20;:::i;:::-;42568:25;;42607:20;42625:1;42607:20;:::i;:::-;42602:25;;42646:1;42636:35;;42651:18;;:::i;:::-;42636:35;42693:1;42690;42686:9;42681:14;;42516:185;;;;:::o;42707:191::-;42747:4;42767:20;42785:1;42767:20;:::i;:::-;42762:25;;42801:20;42819:1;42801:20;:::i;:::-;42796:25;;42840:1;42837;42834:8;42831:34;;;42845:18;;:::i;:::-;42831:34;42890:1;42887;42883:9;42875:17;;42707:191;;;;:::o;42904:96::-;42941:7;42970:24;42988:5;42970:24;:::i;:::-;42959:35;;42904:96;;;:::o;43006:90::-;43040:7;43083:5;43076:13;43069:21;43058:32;;43006:90;;;:::o;43102:77::-;43139:7;43168:5;43157:16;;43102:77;;;:::o;43185:149::-;43221:7;43261:66;43254:5;43250:78;43239:89;;43185:149;;;:::o;43340:126::-;43377:7;43417:42;43410:5;43406:54;43395:65;;43340:126;;;:::o;43472:77::-;43509:7;43538:5;43527:16;;43472:77;;;:::o;43555:154::-;43639:6;43634:3;43629;43616:30;43701:1;43692:6;43687:3;43683:16;43676:27;43555:154;;;:::o;43715:307::-;43783:1;43793:113;43807:6;43804:1;43801:13;43793:113;;;43892:1;43887:3;43883:11;43877:18;43873:1;43868:3;43864:11;43857:39;43829:2;43826:1;43822:10;43817:15;;43793:113;;;43924:6;43921:1;43918:13;43915:101;;;44004:1;43995:6;43990:3;43986:16;43979:27;43915:101;43764:258;43715:307;;;:::o;44028:320::-;44072:6;44109:1;44103:4;44099:12;44089:22;;44156:1;44150:4;44146:12;44177:18;44167:81;;44233:4;44225:6;44221:17;44211:27;;44167:81;44295:2;44287:6;44284:14;44264:18;44261:38;44258:84;;;44314:18;;:::i;:::-;44258:84;44079:269;44028:320;;;:::o;44354:281::-;44437:27;44459:4;44437:27;:::i;:::-;44429:6;44425:40;44567:6;44555:10;44552:22;44531:18;44519:10;44516:34;44513:62;44510:88;;;44578:18;;:::i;:::-;44510:88;44618:10;44614:2;44607:22;44397:238;44354:281;;:::o;44641:233::-;44680:3;44703:24;44721:5;44703:24;:::i;:::-;44694:33;;44749:66;44742:5;44739:77;44736:103;;;44819:18;;:::i;:::-;44736:103;44866:1;44859:5;44855:13;44848:20;;44641:233;;;:::o;44880:100::-;44919:7;44948:26;44968:5;44948:26;:::i;:::-;44937:37;;44880:100;;;:::o;44986:94::-;45025:7;45054:20;45068:5;45054:20;:::i;:::-;45043:31;;44986:94;;;:::o;45086:79::-;45125:7;45154:5;45143:16;;45086:79;;;:::o;45171:176::-;45203:1;45220:20;45238:1;45220:20;:::i;:::-;45215:25;;45254:20;45272:1;45254:20;:::i;:::-;45249:25;;45293:1;45283:35;;45298:18;;:::i;:::-;45283:35;45339:1;45336;45332:9;45327:14;;45171:176;;;;:::o;45353:180::-;45401:77;45398:1;45391:88;45498:4;45495:1;45488:15;45522:4;45519:1;45512:15;45539:180;45587:77;45584:1;45577:88;45684:4;45681:1;45674:15;45708:4;45705:1;45698:15;45725:180;45773:77;45770:1;45763:88;45870:4;45867:1;45860:15;45894:4;45891:1;45884:15;45911:180;45959:77;45956:1;45949:88;46056:4;46053:1;46046:15;46080:4;46077:1;46070:15;46097:180;46145:77;46142:1;46135:88;46242:4;46239:1;46232:15;46266:4;46263:1;46256:15;46283:180;46331:77;46328:1;46321:88;46428:4;46425:1;46418:15;46452:4;46449:1;46442:15;46469:117;46578:1;46575;46568:12;46592:117;46701:1;46698;46691:12;46715:117;46824:1;46821;46814:12;46838:117;46947:1;46944;46937:12;46961:102;47002:6;47053:2;47049:7;47044:2;47037:5;47033:14;47029:28;47019:38;;46961:102;;;:::o;47069:94::-;47102:8;47150:5;47146:2;47142:14;47121:35;;47069:94;;;:::o;47169:221::-;47309:34;47305:1;47297:6;47293:14;47286:58;47378:4;47373:2;47365:6;47361:15;47354:29;47169:221;:::o;47396:220::-;47536:34;47532:1;47524:6;47520:14;47513:58;47605:3;47600:2;47592:6;47588:15;47581:28;47396:220;:::o;47622:237::-;47762:34;47758:1;47750:6;47746:14;47739:58;47831:20;47826:2;47818:6;47814:15;47807:45;47622:237;:::o;47865:225::-;48005:34;48001:1;47993:6;47989:14;47982:58;48074:8;48069:2;48061:6;48057:15;48050:33;47865:225;:::o;48096:::-;48236:34;48232:1;48224:6;48220:14;48213:58;48305:4;48300:2;48292:6;48288:15;48281:29;48096:225;:::o;48331:186::-;48475:30;48471:1;48463:6;48459:14;48452:54;48331:186;:::o;48527:235::-;48671:34;48667:1;48659:6;48655:14;48648:58;48744:6;48739:2;48731:6;48727:15;48720:31;48527:235;:::o;48772:183::-;48916:27;48912:1;48904:6;48900:14;48893:51;48772:183;:::o;48965:173::-;49109:17;49105:1;49097:6;49093:14;49086:41;48965:173;:::o;49148:166::-;49292:10;49288:1;49280:6;49276:14;49269:34;49148:166;:::o;49324:243::-;49468:34;49464:1;49456:6;49452:14;49445:58;49541:14;49536:2;49528:6;49524:15;49517:39;49324:243;:::o;49577:181::-;49721:25;49717:1;49709:6;49705:14;49698:49;49577:181;:::o;49768:255::-;49912:34;49908:1;49900:6;49896:14;49889:58;49985:26;49980:2;49972:6;49968:15;49961:51;49768:255;:::o;50033:241::-;50177:34;50173:1;50165:6;50161:14;50154:58;50250:12;50245:2;50237:6;50233:15;50226:37;50033:241;:::o;50284:179::-;50428:23;50424:1;50416:6;50412:14;50405:47;50284:179;:::o;50473:234::-;50617:34;50613:1;50605:6;50601:14;50594:58;50690:5;50685:2;50677:6;50673:15;50666:30;50473:234;:::o;50717:233::-;50861:34;50857:1;50849:6;50845:14;50838:58;50934:4;50929:2;50921:6;50917:15;50910:29;50717:233;:::o;50960:190::-;51104:34;51100:1;51092:6;51088:14;51081:58;50960:190;:::o;51160:243::-;51304:34;51300:1;51292:6;51288:14;51281:58;51377:14;51372:2;51364:6;51360:15;51353:39;51160:243;:::o;51413:190::-;51557:34;51553:1;51545:6;51541:14;51534:58;51413:190;:::o;51613:240::-;51757:34;51753:1;51745:6;51741:14;51734:58;51830:11;51825:2;51817:6;51813:15;51806:36;51613:240;:::o;51863:246::-;52007:34;52003:1;51995:6;51991:14;51984:58;52080:17;52075:2;52067:6;52063:15;52056:42;51863:246;:::o;52119:232::-;52263:34;52259:1;52251:6;52247:14;52240:58;52336:3;52331:2;52323:6;52319:15;52312:28;52119:232;:::o;52361:180::-;52505:24;52501:1;52493:6;52489:14;52482:48;52361:180;:::o;52551:248::-;52695:34;52691:1;52683:6;52679:14;52672:58;52768:19;52763:2;52755:6;52751:15;52744:44;52551:248;:::o;52809:176::-;52953:20;52949:1;52941:6;52937:14;52930:44;52809:176;:::o;52995:172::-;53139:16;53135:1;53127:6;53123:14;53116:40;52995:172;:::o;53177:184::-;53321:28;53317:1;53309:6;53305:14;53298:52;53177:184;:::o;53371:130::-;53448:24;53466:5;53448:24;:::i;:::-;53441:5;53438:35;53428:63;;53487:1;53484;53477:12;53428:63;53371:130;:::o;53511:124::-;53585:21;53600:5;53585:21;:::i;:::-;53578:5;53575:32;53565:60;;53621:1;53618;53611:12;53565:60;53511:124;:::o;53645:128::-;53721:23;53738:5;53721:23;:::i;:::-;53714:5;53711:34;53701:62;;53759:1;53756;53749:12;53701:62;53645:128;:::o;53783:130::-;53860:24;53878:5;53860:24;:::i;:::-;53853:5;53850:35;53840:63;;53899:1;53896;53889:12;53840:63;53783:130;:::o

Swarm Source

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