ETH Price: $3,435.86 (-0.54%)
Gas: 8 Gwei

Token

Gaussian Timepieces by Takens Theorem (GTPTT1)
 

Overview

Max Total Supply

0 GTPTT1

Holders

76

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
3 GTPTT1
0x1e835fe1c20a0bc5d053bac71ee57e02c5b5c5f6
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

"Transitions across stochasticity towards another inevitable block height." Timepieces on chain, assembled by contract.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
GTPTT1

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-09-16
*/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;

/**
 *
 *        -
 *   ___/   \___
 *   Gaussian Timepieces
 *     by Takens Theorem
 *
 *   Coded mostly by someone named 'OpenZeppelin' + some twists by Takens
 * 
 *   Terms, conditions: Experimental, use at your own risk. Each token provided 
 *   as-is and as-available without any and all warranty. By using this contract 
 *   you accept sole responsibility for any and all transactions involving 
 *   Gaussian Timepieces. 
 * 
 * 
 */

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

/**
 * @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;
}

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


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

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

    function _msgData() internal view virtual returns (bytes calldata) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }
}

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Base URI for computing {tokenURI}. Empty by default, can be overriden
     * in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        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 _owners[tokenId] != address(0);
    }

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @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");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

    /**
     * @dev 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;
        }
    }

    /**
     * @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 { }
}

/**
 * @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;
    }
}


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


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

/**
 * @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] = "";
        buffer[1] = "";
        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);
    }
    
    // adapted from tkeber solution: https://ethereum.stackexchange.com/a/8447
    function toAsciiString(address x) internal pure returns (string memory) {
        bytes memory s = new bytes(40);
        for (uint i = 0; i < 20; i++) {
            bytes1 b = bytes1(uint8(uint(uint160(x)) / (2**(8*(19 - i)))));
            bytes1 hi = bytes1(uint8(b) / 16);
            bytes1 lo = bytes1(uint8(b) - 16 * uint8(hi));
            s[2*i] = char(hi);
            s[2*i+1] = char(lo);            
        }
        return string(s);
    }
    
    function char(bytes1 b) internal pure returns (bytes1 c) {
        if (uint8(b) < 10) return bytes1(uint8(b) + 0x30);
        else return bytes1(uint8(b) + 0x57);
    }    
    
    // adapted from t-nicci solution https://ethereum.stackexchange.com/a/31470
    function subString(string memory str, uint startIndex, uint endIndex) internal pure returns (string memory) {
        bytes memory strBytes = bytes(str);
        bytes memory result = new bytes(endIndex-startIndex);
        for(uint i = startIndex; i < endIndex; i++) {
            result[i-startIndex] = strBytes[i];
        }
        return string(result);
    }    
    
    function compareStrings(string memory a, string memory b) internal pure returns (bool) {
        return (keccak256(abi.encodePacked((a))) == keccak256(abi.encodePacked((b))));
    }
    
    // nice solution: https://ethereum.stackexchange.com/questions/56319/how-to-convert-bytes32-to-string
    function toShortString(bytes32 _data) internal pure returns (string memory) {
      bytes memory _bytesContainer = new bytes(32);
      uint256 _charCount = 0;
      // loop through every element in bytes32
      for (uint256 _bytesCounter = 0; _bytesCounter < 32; _bytesCounter++) {
        bytes1 _char = bytes1(bytes32(uint256(_data) * 2 ** (8 * _bytesCounter)));
        if (_char != 0) {
          _bytesContainer[_charCount] = _char;
          _charCount++;
        }
      }
    
      bytes memory _bytesContainerTrimmed = new bytes(_charCount);
    
      for (uint256 _charCounter = 0; _charCounter < _charCount; _charCounter++) {
        _bytesContainerTrimmed[_charCounter] = _bytesContainer[_charCounter];
      }
    
      return string(_bytesContainerTrimmed);
    }    
    
}

contract externalNft {function balanceOf(address owner) external view returns (uint256 balance) {}}

/**
 * @title GTPTT1 contract
 * @dev Extends ERC721 Non-Fungible Token Standard basic implementation
 */
contract GTPTT1 is ERC721, Ownable {
    using Counters for Counters.Counter;
    Counters.Counter private _tokenIds;

    string private constant svg_start = "<?xml version='1.0' encoding='UTF-8'?><svg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' height='1000' width='1000' viewBox='-1000 -1000 2000 2000'><rect x='-1000' y='-1000' width='2000' height='2000' fill='#ffffff' /><style>";

    // attributes json for opensea
    function makeAttributes(uint256 tokenId) private view returns (string memory) {
        (uint256 period, uint256 color, uint256 shape) = getAttributes(tokenId);
        (uint256 totToks, uint256 totProjs) = getNftBalance(ownerOf(tokenId));
        string memory colorNm = color == 0 ? 'Dark' : 'Light';
        string memory shapeNm = shape == 0 ? 'Circles' : 'Blocks';
        string memory content = string(abi.encodePacked(
            '{"trait_type":"Period","value":"', Strings.toString(period), ' blocks"},',
            '{"trait_type":"Theme","value":"', colorNm, '"},',
            '{"trait_type":"Shapes","value":"', shapeNm, '"},',
            '{"trait_type":"On-Chain Items (Owner)","value":', Strings.toString(totToks), '},',
            '{"trait_type":"On-Chain Projects (Owner)","value":', Strings.toString(totProjs), '}'
        ));
        return content; 
    }

    // render one circle svg object
    function makeCircle(uint256 i, uint256 tokenId) private view returns (string memory) {
        string memory sz = Strings.toString((vl(i, tokenId) % 128+10)*10);
        string memory fill = cl(i, tokenId);
        // 0 = filled; else ring
        if (vl(i, tokenId) % 2 == 0) {
            return string(abi.encodePacked(c[0], sz, "px' fill='#",
                    fill, "' id='c", Strings.toString(i), "' />"));        
        } 
        return string(abi.encodePacked(c[0], sz, "px' stroke='#",
                fill, "' fill='none' stroke-width='", Strings.toString(vl(i, tokenId) % 28+4),
                "pt' id='c", Strings.toString(i), "' />"));        
    }
    
    // render one rect svg object
    function makeRect(uint256 i, uint256 tokenId) private view returns (string memory) {
        uint256 sz = (vl(i, tokenId) % 128+10)*10;
        string memory fill = cl(i, tokenId);
        string memory sz_str = Strings.toString(sz);
        string memory sz2_str = Strings.toString(sz*2);
        // 0 = filled; else ring
        if (vl(i,tokenId) % 2 == 0) {
            return string(abi.encodePacked("<rect x='-",
                    sz_str, "px' y='-",
                    sz_str, "px' width='",
                    sz2_str, "px' height='",
                    sz2_str, "px' fill='#",
                    fill, "' id='c", Strings.toString(i), "' />"));        
        } 
        return string(abi.encodePacked("<rect x='-",
                sz_str, "px' y='-",
                sz_str, "px' width='",
                sz2_str, "px' height='",
                sz2_str, "px' fill='none' stroke='#",
                fill, "' stroke-width='", Strings.toString(vl(i, tokenId) % 28+4),
                "pt' id='c", Strings.toString(i), "' />"));       
    }    
    
    // define animation; clunky, but to avoid stack depth issues
    function animDefine(uint256 i, string memory x, string memory y, string memory sign1, 
                                    string memory sign2) private view returns (string memory) {
        
        string memory content = string(abi.encodePacked( // swing of a pendulum, back
            "@keyframes mv", Strings.toString(i), c[1],
            (bytes(sign1).length==0 ? "" : "-"), x, "px,",
            (bytes(sign2).length==0 ? "" : "-"), y, "px",
            ");opacity:0.25;}50%{transform:translate(0px,0px);opacity:1.0;}60%{transform:translate("
        ));
        content = string(abi.encodePacked(content, // and forth
            (bytes(sign1).length==0 ? "-" : ""), x, "px,",
            (bytes(sign2).length==0 ? "-" : ""), y, "px",
            ");opacity:0.25;}100%{transform:translate(0px,0px);opacity:1.0;}}"
        ));
        
        return content;        
    }

    // assign animation
    function animAssign(uint256 i, uint256 tm) private pure returns (string memory) {
        string memory content = string(abi.encodePacked("#c", Strings.toString(i),
            "{animation:mv", Strings.toString(i), " ", Strings.toString(tm), "s infinite ease-in-out;}"));
        return content;
    }
    
    // create style tag content for circle/rects
    function makeStyle(uint256 i, uint256 tokenId) private view returns (string memory) {
        
        (uint256 period,, uint256 shape) = getAttributes(tokenId);
        
        string memory sign1 = vl(i+1, tokenId) % 2==0 ? "-" : "";
        string memory sign2 = vl(i+2, tokenId) % 2==0 ? "-" : "";
        string memory x;
        string memory y;
        uint256 tm = period*26;
        
        if (shape == 0) { // circles
            x = Strings.toString((vl(i, tokenId) % 64)*28);
            y = Strings.toString((vl(i+1, tokenId) % 64)*28);
        } else { // rects
            uint256 f1 = i % 2;
            uint256 f2 = 1 - f1;
            x = Strings.toString(f1*(vl(i, tokenId) % 64)*28);
            y = Strings.toString(f2*(vl(i+1, tokenId) % 64)*28);
        }
        return string(abi.encodePacked(animDefine(i, x, y, sign1, sign2), animAssign(i, tm)));    
    }

    // real time marker
    function realTimeHand(uint256 tokenId, uint256 timeZone) private view returns (string memory) {
        uint256 deg = ((block.timestamp - timeZone*60*60) % 43200)/120;
        string memory content = string(abi.encodePacked("<path d='M -30 -1090 L 0 -940 L 30 -1090' stroke-width='0px' style='transform:rotate(",
            Strings.toString(deg), "deg);' id='clock' fill='#", fcl(tokenId), "' />"));
        return content;
    }

    // real time style tag
    function realTimeAnim(uint256 timeZone) private view returns (string memory) {
        uint256 deg = ((block.timestamp - timeZone*60*60) % 43200)/120;
        string memory content = string(abi.encodePacked("@keyframes clockrot{0%{transorm:rotate(",
            Strings.toString(deg), "deg);}100%{transform:rotate(",
            Strings.toString(deg+360), "deg);}}#clock{animation:clockrot 43200s linear infinite;}"));
        return content;
    }

    // hand, distribution, empirical arc, circle frames...
    function frames(uint256 tokenId) private view returns (string memory) {
        (uint256 period,,) = getAttributes(tokenId);
        
        string memory content = string(abi.encodePacked(
            
            "<circle cx='0px' cy='-", 
                Strings.toString(10+period), "px' r='",
                Strings.toString(1240+period), "px' style='transform:rotate(-",
                Strings.toString(2000/period/period),
                "deg);' id='numerarc' fill='none' stroke='#000000' stroke-width='500pt' />",

            "<circle cx='0px' cy='0px' r='1250px' id='inside' fill='none' stroke='#",
                bcl(3, tokenId), "' stroke-width='500pt' />",
                
            "<circle cx='0px' cy='0px' r='1350px' id='outside' fill='none' stroke='#",
                bcl(5, tokenId), "' stroke-width='400pt' />"
        ));
        
        content = string(abi.encodePacked(content,
        
            ticks(tokenId),
                
            "<circle cx='0px' cy='900px' r='100px' id='hand' fill='#",
                fcl(tokenId), "' />",
                
            "<path d='M-500 961 C -250 961, -250 700, 0 700, 250 700, 250 961, 500 961, A1000 1000 1 0 1 -500 961' id='gauss' fill='#",
                bcl(7, tokenId), "' />"             
                
        ));

        return content;
    }
    
    // attribs determined by tokenId
    function getAttributes(uint256 tokenId) private pure returns (uint256, uint256, uint256) {
        // period / color / shape
        return(
                2**((tokenId - 1) % 5 + 1),
                tokenId % 2 == 0 ? 1 : 0,
                tokenId % 3 == 0 ? 1 : 0
            );
    }
    
    // text adornments; awkward concatenation due to stack depth
    function accessories(uint256 tokenId) private view returns (string memory) {
        (uint256 totToks,) = getNftBalance(ownerOf(tokenId));
        (uint256 period,,) = getAttributes(tokenId);
        
        string memory content = string(abi.encodePacked(
            
            "<text x='-980px' y='920px' font-size='.8em' id='tokenId' fill='#",
                fcl(tokenId), "55'>Timepiece #", Strings.toString(tokenId), "</text>",
            
            "<text x='-980px' y='940px' font-size='.8em' id='ownerCnt' fill='#",
                fcl(tokenId), "55'>Owner on-chain count: ",
                Strings.toString(totToks), "</text>"
                
        ));
        
        content = string(abi.encodePacked(content,
        
            "<text x='-980px' y='960px' font-size='.8em' id='signat' fill='#",
                fcl(tokenId), "55'>takenstheorem 2021 | Gaussian Timepieces</text>",
        
            "<text x='-980px' y='980px' font-size='.8em' id='owner' fill='#",
                fcl(tokenId), "55'>Owner: 0x", Strings.toAsciiString(ownerOf(tokenId)), "</text>"
                
        ));        
        
        content = string(abi.encodePacked(content,
        
            "<text x='0px' y='860px' font-size='5em' fill='#",
                fcl(tokenId), "66' text-anchor='middle' dominant-baseline='central' id='blockPeriod'>+",
                Strings.toString(period), "</text>",
        
            "<text x='0px' y='770px' font-size='2.8em' fill='#",
                fcl(tokenId), "aa' text-anchor='middle' dominant-baseline='central' id='gasPrice'>",
                rep(2, tokenId), "</text>"
                
        ));
        
        content = string(abi.encodePacked(content,
        
            "<text x='-180px' y='940px' font-size='2.1em' fill='#",
                fcl(tokenId), "66' text-anchor='middle' dominant-baseline='central' id='blockSt'>",
                Strings.toString(block.number), "</text>",    
                
            "<text x='+180px' y='940px' font-size='2.1em' fill='#",
                fcl(tokenId), "66' text-anchor='middle' dominant-baseline='central' id='blockEnd'>",
                Strings.toString(block.number+period), "</text>"
            
        ));

        return content;
    }
    
    string ncp = 'WAIT';
    string[] private c = ['', ''];
    function setStr(string memory val) public onlyOwner {
        require(bytes(ncp).length > 0, 'ERROR: Already configured');
        if (bytes(c[0]).length == 0) {
            c[0] = val;
        } else if (bytes(c[1]).length == 0) {
            c[1] = val;
        } else if (bytes(ncp).length > 0) {
            ncp = val;        
        }
    }    
    
    // repeat chars; used for bezel and gas price
    function rep(uint256 char, uint256 tokenId) private view returns (string memory) {
        
        if (char == 2) {
            uint256 gasVal = (block.basefee / 1000000000) / 25;
            if (gasVal > 12) {
                gasVal = 12;
            }
            return Strings.subString("****************", 0, gasVal+1);
        }
        
        (uint256 totToks,uint256 totProjs) = getNftBalance(ownerOf(tokenId));
        if (totToks > 30) {
            totToks = 30;
        }
        
        if (char == 0) { 
            return Strings.subString("|||||||||||||||||||||||||||||||||||", 0, totToks);
        } else {
            return Strings.subString("|||||||||||||||||||||||||||||||||||", 0, 2*totProjs);
        }
    }
    
    // ticks of ownership on-chain on left/right bezel
    function ticks(uint256 tokenId) private view returns (string memory) {
        
        string memory content = string(abi.encodePacked(
            
            "<path d='M400 920 A950 950 180 0 0 -400 -920' stroke='none' fill='none' id='numProjPath' />",
            
            "<text font-size='3em' id='numProjOn' fill='#",
                fcl(tokenId), "'><textPath textLength='2600' href='#numProjPath'>",
                rep(0, tokenId), "</textPath></text>"    
            
        ));
        
        content = string(abi.encodePacked(content,
            
            "<path d='M-400 920 A950 950 -180 1 1 400 -920' stroke='none' fill='none' id='numNftPath' />",
            
            "<text font-size='3em' id='numNftOn' fill='#",
                fcl(tokenId), "' dominant-baseline='hanging' ><textPath textLength='2600' href='#numNftPath'>",
                rep(1, tokenId), "</textPath></text>"
        
        ));
        
        return content;
        
    }

    // compute # of on-chain nfts and # of projects owned
    function getNftBalance(address addr) private view returns (uint256, uint256) { // totTok,totProjs
        uint256[] memory projCounts = new uint256[](15);
        projCounts[0] = externalNft(0x31C70e9a1BAb16f47710E4B302c49998Cfb36ef9).balanceOf(addr); // CryptoSketches
        projCounts[1] = externalNft(0xd4e4078ca3495DE5B1d4dB434BEbc5a986197782).balanceOf(addr); // Autoglyphs
        projCounts[2] = externalNft(0x60F3680350F65Beb2752788cB48aBFCE84a4759E).balanceOf(addr); // Colorglyphs
        projCounts[3] = externalNft(0x91047Abf3cAb8da5A9515c8750Ab33B4f1560a7A).balanceOf(addr); // ChainFaces
        projCounts[4] = externalNft(0xF3E778F839934fC819cFA1040AabaCeCBA01e049).balanceOf(addr); // Avastars
        projCounts[5] = externalNft(0x36F379400DE6c6BCDF4408B282F8b685c56adc60).balanceOf(addr); // Squiggly
        projCounts[6] = externalNft(0xB2D6fb1Dc231F97F8cC89467B52F7C4F78484044).balanceOf(addr); // Neolastics
        projCounts[7] = externalNft(0x46F9A4522666d2476a5F5Cd51ea3E0b5800E7f98).balanceOf(addr); // TinyBoxes
        projCounts[8] = externalNft(0x8FdDE660C3cCAb82756AcC5233687a4CeB4B8f30).balanceOf(addr); // Etherpoems
        projCounts[9] = externalNft(0x8d04a8c79cEB0889Bdd12acdF3Fa9D207eD3Ff63).balanceOf(addr); // Blitmap
        projCounts[10] = externalNft(0xDaCa87395f3b1Bbc46F3FA187e996E03a5dCc985).balanceOf(addr); // Mandala
        projCounts[11] = externalNft(0x5D4683bA64Ee6283bB7FDB8A91252F6aAB32A110).balanceOf(addr); // Genesis [sol]Seedlings
        projCounts[12] = externalNft(0xEA61926B4C8B5f8E2bC6f85C0BD800969dc79fcf).balanceOf(addr); // 512 [sol]Seedlings
        projCounts[13] = externalNft(0xd31fC221D2b0E0321C43E9F6824b26ebfFf01D7D).balanceOf(addr); // Brotchain
        projCounts[14] = externalNft(0xf76c5d925b27a63a3745A6b787664A7f38fA79bd).balanceOf(addr); // the_coin
        
        uint256 totToks = 0;
        uint256 totProjs = 0;
        for (uint256 i = 0; i < 15; i++){
            totToks = totToks + projCounts[i];
            if (projCounts[i] > 0) {
                totProjs = totProjs + 1;    
            }
        }
        
        return(totToks, totProjs);
    }

    // build all style tag contents
    function buildAllStyles(uint256 tokenId, uint256 nEls) private view returns (string memory) {
        string memory content = '';
        for (uint256 i = 0; i < nEls; i++) {
            content = string(abi.encodePacked(content, makeStyle(i,tokenId)));
        }        
        return content;
    }
    
    // build all svg elements
    function buildAllEls(uint256 tokenId, uint256 nEls) private view returns (string memory) {
        (,,uint256 shape) = getAttributes(tokenId);
        string memory content = '';
        uint256 i = nEls;
        while (i != 0) { // decouple colors/locs
            i = i - 1;
            if (shape == 0) {
                content = string(abi.encodePacked(content, makeCircle(i, tokenId)));        
            } else {
                content = string(abi.encodePacked(content, makeRect(i, tokenId)));        
            }
        }        
        return content;
    }
    
    // raw svg
    function reveal(uint256 tokenId, uint256 timeZone) public view returns (string memory) {
        require(bytes(ncp).length == 0, "ERROR: Misconfigured");
        require(_exists(tokenId), "ERC721URIStorage: URI query for nonexistent token");
        (uint256 totToks,) = getNftBalance(ownerOf(tokenId));
        (uint256 period,,) = getAttributes(tokenId);
        
        uint256 nEls = period/2 + ownerOf(tokenId).balance / 1000000000000000000 + totToks;
        if (nEls > 16) {
            nEls = 16;
        }
        
        string memory content = buildAllStyles(tokenId, nEls);

        content = string(abi.encodePacked(content, "@keyframes handrot{0%{transorm:rotate(0deg);}100%{transform:rotate(360deg);}}#hand{animation:handrot ",
             Strings.toString(period*13), "s linear infinite;}", realTimeAnim(timeZone),"</style>"));

        content = string(abi.encodePacked(content, buildAllEls(tokenId, nEls)));

        bytes memory _img = abi.encodePacked(svg_start, content,
                frames(tokenId), accessories(tokenId), realTimeHand(tokenId, timeZone),
                 '</svg>'
             );
        return string(_img);
    }

    function mintNFT_n(uint256 n) public onlyOwner {
        require(_tokenIds.current() < 100,'ERROR: minting complete');
        for (uint i = 0; i < n; i++) {
            if (_tokenIds.current() == 100) { // avoid accidental overring
                break;
            }
            _tokenIds.increment();
            uint256 newItemId = _tokenIds.current();
            _mint(msg.sender, newItemId);
        }
    }

    // to single string
    function ts1(address addr, uint256 i1) private pure returns (string memory) {
        return Strings.subString(Strings.toAsciiString(addr), i1, i1+1); 
    }
    
    // to double string
    function ts2(address addr, uint256 i1) private pure returns (string memory) {
        return Strings.subString(Strings.toAsciiString(addr), i1, i1+2); 
    }
    
    // make random color
    function cl(uint256 i, uint256 tokenId) private view returns (string memory) {
        address baseContent = address(getRandBase(tokenId));
        return Strings.subString(Strings.toAsciiString(baseContent), i, i+6);    
    }
    
    // get bg color byte
    function gbcl(string memory cols, uint256 i, uint256 tokenId) private view returns (string memory) {
        return Strings.subString(cols, vl(i,tokenId)%5, vl(i,tokenId)%5+1);
    }
    
    // get random base for vl and other pseudorandom functions
    function getRandBase(uint256 tokenId) private view returns (bytes20) {
        (uint256 period,,) = getAttributes(tokenId);
        return bytes20(keccak256(abi.encodePacked(ownerOf(tokenId), block.number / period, tokenId)));
    }
    
    // background color
    function bcl(uint256 i, uint256 tokenId) private view returns (string memory) {
        (,uint256 color,) = getAttributes(tokenId);
        address baseContent = address(getRandBase(tokenId));
        string[] memory bgc = new string[](3);
        if (color == 0) { // dark mode
            bgc[0] = gbcl("1234567", i, tokenId); 
            bgc[1] = gbcl("1234567", i+1, tokenId);
            bgc[2] = gbcl("1234567", i+2, tokenId);
            return string(abi.encodePacked(
                bgc[0], ts1(baseContent, i),
                bgc[1], ts1(baseContent, i+2),
                bgc[2], ts1(baseContent, i+4)));
        } else { // light mode
            bgc[0] = gbcl("9abcde", i, tokenId);
            bgc[1] = gbcl("9abcde", i+1, tokenId);
            bgc[2] = gbcl("9abcde", i+2, tokenId);
            return string(abi.encodePacked(
                bgc[0], ts1(baseContent, i),
                bgc[1], ts1(baseContent, i+2),
                bgc[2], ts1(baseContent, i+4)));
        }
    }
    
    // foreground
    function fcl(uint256 tokenId) private pure returns (string memory) {
        (,uint256 color,) = getAttributes(tokenId);
        if (color == 0) {
            return 'ffffff';
        } 
        return '000000';
    }    
    
    // pseudorandom value
    function vl(uint256 i, uint256 tokenId) private view returns (uint256) {
        bytes20 baseContent = getRandBase(tokenId);
        return uint256(uint8(baseContent[i]));
    }
    
    function tokenURI(uint256 tokenId) public view override returns (string memory) {
        require(bytes(ncp).length==0, "ERROR: Misconfigured");
        require(_exists(tokenId), "ERC721URIStorage: URI query for nonexistent token");
        
        bytes memory json = abi.encodePacked('{"name":"', string(abi.encodePacked('Timepiece #', Strings.toString(tokenId))),
                                            '", "description":"Transitions across stochasticity towards another inevitable block height.',
                                            '", "attributes":[', makeAttributes(tokenId),
                                            '], "created_by":"Takens Theorem", "image":"',
            reveal(tokenId, 0), '"}');
        
        return string(abi.encodePacked('data:text/plain,', json));
        
    }
     
    constructor() ERC721("Gaussian Timepieces by Takens Theorem", "GTPTT1") {}    
}

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":[{"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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"n","type":"uint256"}],"name":"mintNFT_n","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"timeZone","type":"uint256"}],"name":"reveal","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","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":"val","type":"string"}],"name":"setStr","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":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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"}]

60c0604052600460808190526315d0525560e21b60a090815262000027916008919062000143565b506040805160608101825260008183018181528252825160208181019094529081529181019190915262000060906009906002620001d2565b503480156200006e57600080fd5b5060405180606001604052806025815260200162005903602591396040518060400160405280600681526020016547545054543160d01b8152508160009080519060200190620000c092919062000143565b508051620000d690600190602084019062000143565b5050506000620000eb6200013f60201b60201c565b600680546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350620002e9565b3390565b8280546200015190620002ac565b90600052602060002090601f016020900481019282620001755760008555620001c0565b82601f106200019057805160ff1916838001178555620001c0565b82800160010185558215620001c0579182015b82811115620001c0578251825591602001919060010190620001a3565b50620001ce92915062000232565b5090565b82805482825590600052602060002090810192821562000224579160200282015b828111156200022457825180516200021391849160209091019062000143565b5091602001919060010190620001f3565b50620001ce92915062000249565b5b80821115620001ce576000815560010162000233565b80821115620001ce5760006200026082826200026a565b5060010162000249565b5080546200027890620002ac565b6000825580601f1062000289575050565b601f016020900490600052602060002090810190620002a9919062000232565b50565b600181811c90821680620002c157607f821691505b60208210811415620002e357634e487b7160e01b600052602260045260246000fd5b50919050565b61560a80620002f96000396000f3fe608060405234801561001057600080fd5b50600436106101215760003560e01c806370a08231116100ad578063a22cb46511610071578063a22cb46514610257578063b88d4fde1461026a578063c87b56dd1461027d578063e985e9c514610290578063f2fde38b146102cc57600080fd5b806370a0823114610202578063715018a6146102235780638da5cb5b1461022b5780639348cef71461023c57806395d89b411461024f57600080fd5b8063191347df116100f4578063191347df146101a357806323b872dd146101b657806342842e0e146101c95780636352211e146101dc57806365921e3a146101ef57600080fd5b806301ffc9a71461012657806306fdde031461014e578063081812fc14610163578063095ea7b31461018e575b600080fd5b610139610134366004613534565b6102df565b60405190151581526020015b60405180910390f35b610156610331565b6040516101459190615098565b6101766101713660046135b7565b6103c3565b6040516001600160a01b039091168152602001610145565b6101a161019c36600461350a565b61045d565b005b6101a16101b136600461356e565b610573565b6101a16101c4366004613416565b6106d5565b6101a16101d7366004613416565b610706565b6101766101ea3660046135b7565b610721565b6101a16101fd3660046135b7565b610798565b6102156102103660046133c8565b61086c565b604051908152602001610145565b6101a16108f3565b6006546001600160a01b0316610176565b61015661024a3660046135e9565b610967565b610156610b4d565b6101a16102653660046134ce565b610b5c565b6101a1610278366004613452565b610c21565b61015661028b3660046135b7565b610c59565b61013961029e3660046133e3565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b6101a16102da3660046133c8565b610d6b565b60006001600160e01b031982166380ac58cd60e01b148061031057506001600160e01b03198216635b5e139f60e01b145b8061032b57506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060008054610340906153d8565b80601f016020809104026020016040519081016040528092919081815260200182805461036c906153d8565b80156103b95780601f1061038e576101008083540402835291602001916103b9565b820191906000526020600020905b81548152906001019060200180831161039c57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166104415760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061046882610721565b9050806001600160a01b0316836001600160a01b031614156104d65760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610438565b336001600160a01b03821614806104f257506104f2813361029e565b6105645760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610438565b61056e8383610e56565b505050565b6006546001600160a01b0316331461059d5760405162461bcd60e51b81526004016104389061514e565b6000600880546105ac906153d8565b9050116105fb5760405162461bcd60e51b815260206004820152601960248201527f4552524f523a20416c726561647920636f6e66696775726564000000000000006044820152606401610438565b600960008154811061060f5761060f61546e565b906000526020600020018054610624906153d8565b15159050610662578060096000815481106106415761064161546e565b90600052602060002001908051906020019061065e9291906132a2565b5050565b60096001815481106106765761067661546e565b90600052602060002001805461068b906153d8565b151590506106a8578060096001815481106106415761064161546e565b6000600880546106b7906153d8565b905011156106d257805161065e9060089060208401906132a2565b50565b6106df3382610ec4565b6106fb5760405162461bcd60e51b815260040161043890615183565b61056e838383610fbb565b61056e83838360405180602001604052806000815250610c21565b6000818152600260205260408120546001600160a01b03168061032b5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610438565b6006546001600160a01b031633146107c25760405162461bcd60e51b81526004016104389061514e565b60646107cd60075490565b1061081a5760405162461bcd60e51b815260206004820152601760248201527f4552524f523a206d696e74696e6720636f6d706c6574650000000000000000006044820152606401610438565b60005b8181101561065e5760075460641415610834575050565b610842600780546001019055565b600061084d60075490565b9050610859338261115b565b508061086481615413565b91505061081d565b60006001600160a01b0382166108d75760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610438565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b0316331461091d5760405162461bcd60e51b81526004016104389061514e565b6006546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600680546001600160a01b0319169055565b606060088054610976906153d8565b1590506109bc5760405162461bcd60e51b815260206004820152601460248201527311549493d48e88135a5cd8dbdb999a59dd5c995960621b6044820152606401610438565b6000838152600260205260409020546001600160a01b03166109f05760405162461bcd60e51b8152600401610438906150fd565b6000610a036109fe85610721565b61129d565b5090506000610a1185611d33565b50509050600082670de0b6b3a7640000610a2a88610721565b6001600160a01b031631610a3e9190615211565b610a49600285615211565b610a5391906151d4565b610a5d91906151d4565b90506010811115610a6c575060105b6000610a788783611daa565b905080610a8e610a8985600d615332565b611e0f565b610a9788611f0d565b604051602001610aa993929190613ee0565b604051602081830303815290604052905080610ac58884611f8f565b604051602001610ad69291906136ed565b60408051601f198184030181526101408301909152610101808352909250600091906154b1602083013982610b0a8a612012565b610b138b6120ca565b610b1d8c8c612220565b604051602001610b3195949392919061379b565b60408051808303601f1901815291905298975050505050505050565b606060018054610340906153d8565b6001600160a01b038216331415610bb55760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610438565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610c2b3383610ec4565b610c475760405162461bcd60e51b815260040161043890615183565b610c538484848461229d565b50505050565b606060088054610c68906153d8565b159050610cae5760405162461bcd60e51b815260206004820152601460248201527311549493d48e88135a5cd8dbdb999a59dd5c995960621b6044820152606401610438565b6000828152600260205260409020546001600160a01b0316610ce25760405162461bcd60e51b8152600401610438906150fd565b6000610ced83611e0f565b604051602001610cfd9190614ee5565b604051602081830303815290604052610d15846122d0565b610d20856000610967565b604051602001610d32939291906144f1565b604051602081830303815290604052905080604051602001610d54919061495a565b604051602081830303815290604052915050919050565b6006546001600160a01b03163314610d955760405162461bcd60e51b81526004016104389061514e565b6001600160a01b038116610dfa5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610438565b6006546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600680546001600160a01b0319166001600160a01b0392909216919091179055565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610e8b82610721565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316610f3d5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610438565b6000610f4883610721565b9050806001600160a01b0316846001600160a01b03161480610f835750836001600160a01b0316610f78846103c3565b6001600160a01b0316145b80610fb357506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316610fce82610721565b6001600160a01b0316146110365760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610438565b6001600160a01b0382166110985760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610438565b6110a3600082610e56565b6001600160a01b03831660009081526003602052604081208054600192906110cc908490615372565b90915550506001600160a01b03821660009081526003602052604081208054600192906110fa9084906151d4565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6001600160a01b0382166111b15760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610438565b6000818152600260205260409020546001600160a01b0316156112165760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610438565b6001600160a01b038216600090815260036020526040812080546001929061123f9084906151d4565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60408051600f808252610200820190925260009182918291602082016101e080368337019050506040516370a0823160e01b81526001600160a01b03861660048201529091507331c70e9a1bab16f47710e4b302c49998cfb36ef9906370a082319060240160206040518083038186803b15801561131a57600080fd5b505afa15801561132e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061135291906135d0565b816000815181106113655761136561546e565b60209081029190910101526040516370a0823160e01b81526001600160a01b038516600482015273d4e4078ca3495de5b1d4db434bebc5a986197782906370a082319060240160206040518083038186803b1580156113c357600080fd5b505afa1580156113d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113fb91906135d0565b8160018151811061140e5761140e61546e565b60209081029190910101526040516370a0823160e01b81526001600160a01b03851660048201527360f3680350f65beb2752788cb48abfce84a4759e906370a082319060240160206040518083038186803b15801561146c57600080fd5b505afa158015611480573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114a491906135d0565b816002815181106114b7576114b761546e565b60209081029190910101526040516370a0823160e01b81526001600160a01b03851660048201527391047abf3cab8da5a9515c8750ab33b4f1560a7a906370a082319060240160206040518083038186803b15801561151557600080fd5b505afa158015611529573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061154d91906135d0565b816003815181106115605761156061546e565b60209081029190910101526040516370a0823160e01b81526001600160a01b038516600482015273f3e778f839934fc819cfa1040aabacecba01e049906370a082319060240160206040518083038186803b1580156115be57600080fd5b505afa1580156115d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115f691906135d0565b816004815181106116095761160961546e565b60209081029190910101526040516370a0823160e01b81526001600160a01b03851660048201527336f379400de6c6bcdf4408b282f8b685c56adc60906370a082319060240160206040518083038186803b15801561166757600080fd5b505afa15801561167b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061169f91906135d0565b816005815181106116b2576116b261546e565b60209081029190910101526040516370a0823160e01b81526001600160a01b038516600482015273b2d6fb1dc231f97f8cc89467b52f7c4f78484044906370a082319060240160206040518083038186803b15801561171057600080fd5b505afa158015611724573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061174891906135d0565b8160068151811061175b5761175b61546e565b60209081029190910101526040516370a0823160e01b81526001600160a01b03851660048201527346f9a4522666d2476a5f5cd51ea3e0b5800e7f98906370a082319060240160206040518083038186803b1580156117b957600080fd5b505afa1580156117cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117f191906135d0565b816007815181106118045761180461546e565b60209081029190910101526040516370a0823160e01b81526001600160a01b0385166004820152738fdde660c3ccab82756acc5233687a4ceb4b8f30906370a082319060240160206040518083038186803b15801561186257600080fd5b505afa158015611876573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061189a91906135d0565b816008815181106118ad576118ad61546e565b60209081029190910101526040516370a0823160e01b81526001600160a01b0385166004820152738d04a8c79ceb0889bdd12acdf3fa9d207ed3ff63906370a082319060240160206040518083038186803b15801561190b57600080fd5b505afa15801561191f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061194391906135d0565b816009815181106119565761195661546e565b60209081029190910101526040516370a0823160e01b81526001600160a01b038516600482015273daca87395f3b1bbc46f3fa187e996e03a5dcc985906370a082319060240160206040518083038186803b1580156119b457600080fd5b505afa1580156119c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119ec91906135d0565b81600a815181106119ff576119ff61546e565b60209081029190910101526040516370a0823160e01b81526001600160a01b0385166004820152735d4683ba64ee6283bb7fdb8a91252f6aab32a110906370a082319060240160206040518083038186803b158015611a5d57600080fd5b505afa158015611a71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a9591906135d0565b81600b81518110611aa857611aa861546e565b60209081029190910101526040516370a0823160e01b81526001600160a01b038516600482015273ea61926b4c8b5f8e2bc6f85c0bd800969dc79fcf906370a082319060240160206040518083038186803b158015611b0657600080fd5b505afa158015611b1a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b3e91906135d0565b81600c81518110611b5157611b5161546e565b60209081029190910101526040516370a0823160e01b81526001600160a01b038516600482015273d31fc221d2b0e0321c43e9f6824b26ebfff01d7d906370a082319060240160206040518083038186803b158015611baf57600080fd5b505afa158015611bc3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611be791906135d0565b81600d81518110611bfa57611bfa61546e565b60209081029190910101526040516370a0823160e01b81526001600160a01b038516600482015273f76c5d925b27a63a3745a6b787664a7f38fa79bd906370a082319060240160206040518083038186803b158015611c5857600080fd5b505afa158015611c6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c9091906135d0565b81600e81518110611ca357611ca361546e565b60200260200101818152505060008060005b600f811015611d2757838181518110611cd057611cd061546e565b602002602001015183611ce391906151d4565b92506000848281518110611cf957611cf961546e565b60200260200101511115611d1557611d128260016151d4565b91505b80611d1f81615413565b915050611cb5565b50909590945092505050565b600080806005611d44600186615372565b611d4e919061542e565b611d599060016151d4565b611d6490600261528a565b611d6f60028661542e565b15611d7b576000611d7e565b60015b611d8960038761542e565b15611d95576000611d98565b60015b919660ff918216965091169350915050565b60408051602081019091526000808252606091905b83811015611e075781611dd282876123e6565b604051602001611de39291906136ed565b60405160208183030381529060405291508080611dff90615413565b915050611dbf565b509392505050565b606081611e335750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611e5d5780611e4781615413565b9150611e569050600a83615211565b9150611e37565b60008167ffffffffffffffff811115611e7857611e78615484565b6040519080825280601f01601f191660200182016040528015611ea2576020820181803683370190505b5090505b8415610fb357611eb7600183615372565b9150611ec4600a8661542e565b611ecf9060306151d4565b60f81b818381518110611ee457611ee461546e565b60200101906001600160f81b031916908160001a905350611f06600a86615211565b9450611ea6565b60606000607861a8c0611f2185603c615332565b611f2c90603c615332565b611f369042615372565b611f40919061542e565b611f4a9190615211565b90506000611f5782611e0f565b611f66610a89846101686151d4565b604051602001611f77929190614992565b60408051601f19818403018152919052949350505050565b60606000611f9c84611d33565b60408051602081019091526000815290935091508490505b801561200957611fc5600182615372565b905082611ffe5781611fd782886125c4565b604051602001611fe89291906136ed565b6040516020818303038152906040529150611fb4565b81611fd782886126ef565b50949350505050565b6060600061201f83611d33565b50509050600061203582600a610a8991906151d4565b612044610a89846104d86151d4565b61205e84612054816107d0615211565b610a899190615211565b6120696003886127f3565b6120746005896127f3565b6040516020016120889594939291906142d3565b6040516020818303038152906040529050806120a385612aa9565b6120ac86612b21565b6120b76007886127f3565b604051602001611f7794939291906138ef565b606060006120da6109fe84610721565b50905060006120e884611d33565b5050905060006120f785612b21565b61210086611e0f565b61210987612b21565b61211286611e0f565b6040516020016121259493929190614f18565b60405160208183030381529060405290508061214086612b21565b61214987612b21565b61215a61215589610721565b612b7f565b60405160200161216d9493929190613d7d565b60405160208183030381529060405290508061218886612b21565b61219184611e0f565b61219a88612b21565b6121a560028a612cc6565b6040516020016121b9959493929190613fdd565b6040516020818303038152906040529050806121d486612b21565b6121dd43611e0f565b6121e688612b21565b6121f3610a8987436151d4565b604051602001612207959493929190613a59565b60408051601f1981840301815291905295945050505050565b60606000607861a8c061223485603c615332565b61223f90603c615332565b6122499042615372565b612253919061542e565b61225d9190615211565b9050600061226a82611e0f565b61227386612b21565b604051602001612284929190614884565b60408051808303601f1901815291905295945050505050565b6122a8848484610fbb565b6122b484848484612dbd565b610c535760405162461bcd60e51b8152600401610438906150ab565b606060008060006122e085611d33565b9250925092506000806122f56109fe88610721565b915091506000846000146123265760405180604001604052806005815260200164131a59da1d60da1b815250612344565b604051806040016040528060048152602001634461726b60e01b8152505b9050600084156123725760405180604001604052806006815260200165426c6f636b7360d01b815250612393565b60405180604001604052806007815260200166436972636c657360c81b8152505b905060006123a088611e0f565b83836123ab88611e0f565b6123b488611e0f565b6040516020016123c8959493929190614a73565b60408051601f198184030181529190529a9950505050505050505050565b60606000806123f484611d33565b92505091506000600261241387600161240d91906151d4565b87612eca565b61241d919061542e565b156124375760405180602001604052806000815250612452565b604051806040016040528060018152602001602d60f81b8152505b90506000600261246b61246589836151d4565b88612eca565b612475919061542e565b1561248f57604051806020016040528060008152506124aa565b604051806040016040528060018152602001602d60f81b8152505b905060608060006124bc87601a615332565b905085612509576124e760406124d28c8c612eca565b6124dc919061542e565b610a8990601c615332565b925061250260406124d26124fc8d60016151d4565b8c612eca565b915061257e565b600061251660028c61542e565b90506000612525826001615372565b905061254a60406125368e8e612eca565b612540919061542e565b6124dc9084615332565b9450612579604061256561255f8f60016151d4565b8e612eca565b61256f919061542e565b6124dc9083615332565b935050505b61258b8a84848888612ef3565b6125958b8361305c565b6040516020016125a69291906136ed565b60405160208183030381529060405297505050505050505092915050565b606060006125f760806125d78686612eca565b6125e1919061542e565b6125ec90600a6151d4565b610a8990600a615332565b9050600061260585856130a5565b905060026126138686612eca565b61261d919061542e565b6126755760096000815481106126355761263561546e565b90600052602060002001828261264a88611e0f565b60405160200161265d9493929190614249565b6040516020818303038152906040529250505061032b565b60096000815481106126895761268961546e565b9060005260206000200182826126b9601c6126a48a8a612eca565b6126ae919061542e565b610a899060046151d4565b6126c289611e0f565b6040516020016126d695949392919061417c565b6040516020818303038152906040529250505092915050565b6060600060806126ff8585612eca565b612709919061542e565b61271490600a6151d4565b61271f90600a615332565b9050600061272d85856130a5565b9050600061273a83611e0f565b9050600061274c610a89856002615332565b9050600261275a8888612eca565b612764919061542e565b6127a55781828283866127768c611e0f565b60405160200161278b96959493929190614deb565b60405160208183030381529060405294505050505061032b565b81828283866127b9601c6126a48e8e612eca565b6127c28d611e0f565b6040516020016127d89796959493929190614ca9565b60405160208183030381529060405294505050505092915050565b6060600061280083611d33565b50915050600061280f846130cf565b6040805160038082526080820190925260609290921c925060009190816020015b6060815260200190600190039081612830579050509050826129e657612876604051806040016040528060078152602001663132333435363760c81b815250878761313c565b816000815181106128895761288961546e565b60200260200101819052506128ca604051806040016040528060078152602001663132333435363760c81b8152508760016128c491906151d4565b8761313c565b816001815181106128dd576128dd61546e565b6020026020010181905250612918604051806040016040528060078152602001663132333435363760c81b8152508760026128c491906151d4565b8160028151811061292b5761292b61546e565b6020026020010181905250806000815181106129495761294961546e565b602002602001015161295b8388613179565b8260018151811061296e5761296e61546e565b602002602001015161298c858a600261298791906151d4565b613179565b8460028151811061299f5761299f61546e565b60200260200101516129b8878c600461298791906151d4565b6040516020016129cd9695949392919061371c565b604051602081830303815290604052935050505061032b565b612a0f6040518060400160405280600681526020016539616263646560d01b815250878761313c565b81600081518110612a2257612a2261546e565b6020026020010181905250612a5c6040518060400160405280600681526020016539616263646560d01b8152508760016128c491906151d4565b81600181518110612a6f57612a6f61546e565b60200260200101819052506129186040518060400160405280600681526020016539616263646560d01b8152508760026128c491906151d4565b60606000612ab683612b21565b612ac1600085612cc6565b604051602001612ad2929190614627565b604051602081830303815290604052905080612aed84612b21565b612af8600186612cc6565b604051602001612b0a93929190613bfd565b60408051601f198184030181529190529392505050565b60606000612b2e83611d33565b5091505080612b5b57505060408051808201909152600681526533333333333360d11b6020820152919050565b505060408051808201909152600681526503030303030360d41b6020820152919050565b60408051602880825260608281019093526000919060208201818036833701905050905060005b6014811015612cbf576000612bbc826013615372565b612bc7906008615332565b612bd290600261528a565b612be5906001600160a01b038716615211565b60f81b9050600060108260f81c612bfc9190615225565b60f81b905060008160f81c6010612c139190615351565b8360f81c612c219190615389565b60f81b9050612c2f8261319a565b85612c3b866002615332565b81518110612c4b57612c4b61546e565b60200101906001600160f81b031916908160001a905350612c6b8161319a565b85612c77866002615332565b612c829060016151d4565b81518110612c9257612c9261546e565b60200101906001600160f81b031916908160001a9053505050508080612cb790615413565b915050612ba6565b5092915050565b60608260021415612d415760006019612ce3633b9aca0048615211565b612ced9190615211565b9050600c811115612cfc5750600c5b60408051808201909152601081526f1515151515151515151515151515151560811b6020820152612d39906000612d348460016151d4565b6131d5565b91505061032b565b600080612d506109fe85610721565b91509150601e821115612d6257601e91505b84612d9457612d8b6040518060600160405280602381526020016155b2602391396000846131d5565b9250505061032b565b612d8b6040518060600160405280602381526020016155b2602391396000612d34846002615332565b60006001600160a01b0384163b15612ebf57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612e0190339089908890889060040161505b565b602060405180830381600087803b158015612e1b57600080fd5b505af1925050508015612e4b575060408051601f3d908101601f19168201909252612e4891810190613551565b60015b612ea5573d808015612e79576040519150601f19603f3d011682016040523d82523d6000602084013e612e7e565b606091505b508051612e9d5760405162461bcd60e51b8152600401610438906150ab565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610fb3565b506001949350505050565b600080612ed6836130cf565b9050808460148110612eea57612eea61546e565b1a949350505050565b60606000612f0087611e0f565b6009600181548110612f1457612f1461546e565b906000526020600020018551600014612f4657604051806040016040528060018152602001602d60f81b815250612f57565b604051806020016040528060008152505b888651600014612f8057604051806040016040528060018152602001602d60f81b815250612f91565b604051806020016040528060008152505b89604051602001612fa796959493929190614769565b6040516020818303038152906040529050808451600014612fd75760405180602001604052806000815250612ff2565b604051806040016040528060018152602001602d60f81b8152505b878551600014613011576040518060200160405280600081525061302c565b604051806040016040528060018152602001602d60f81b8152505b88604051602001613041959493929190613817565b60408051808303601f19018152919052979650505050505050565b6060600061306984611e0f565b61307285611e0f565b61307b85611e0f565b60405160200161308d93929190614c06565b60408051808303601f19018152919052949350505050565b606060006130b2836130cf565b60601c9050610fb36130c382612b7f565b85612d348160066151d4565b6000806130db83611d33565b505090506130e883610721565b6130f28243615211565b60405160609290921b6bffffffffffffffffffffffff1916602083015260348201526054810184905260740160405160208183030381529060405280519060200120915050919050565b6060610fb384600561314e8686612eca565b613158919061542e565b60056131648787612eca565b61316e919061542e565b612d349060016151d4565b606061319361318784612b7f565b83612d348160016151d4565b9392505050565b6000600a60f883901c10156131c1576131b860f883901c60306151ec565b60f81b92915050565b6131b860f883901c60576151ec565b919050565b60608360006131e48585615372565b67ffffffffffffffff8111156131fc576131fc615484565b6040519080825280601f01601f191660200182016040528015613226576020820181803683370190505b509050845b84811015613298578281815181106132455761324561546e565b01602001516001600160f81b0319168261325f8884615372565b8151811061326f5761326f61546e565b60200101906001600160f81b031916908160001a9053508061329081615413565b91505061322b565b5095945050505050565b8280546132ae906153d8565b90600052602060002090601f0160209004810192826132d05760008555613316565b82601f106132e957805160ff1916838001178555613316565b82800160010185558215613316579182015b828111156133165782518255916020019190600101906132fb565b50613322929150613326565b5090565b5b808211156133225760008155600101613327565b600067ffffffffffffffff8084111561335657613356615484565b604051601f8501601f19908116603f0116810190828211818310171561337e5761337e615484565b8160405280935085815286868601111561339757600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b03811681146131d057600080fd5b6000602082840312156133da57600080fd5b613193826133b1565b600080604083850312156133f657600080fd5b6133ff836133b1565b915061340d602084016133b1565b90509250929050565b60008060006060848603121561342b57600080fd5b613434846133b1565b9250613442602085016133b1565b9150604084013590509250925092565b6000806000806080858703121561346857600080fd5b613471856133b1565b935061347f602086016133b1565b925060408501359150606085013567ffffffffffffffff8111156134a257600080fd5b8501601f810187136134b357600080fd5b6134c28782356020840161333b565b91505092959194509250565b600080604083850312156134e157600080fd5b6134ea836133b1565b9150602083013580151581146134ff57600080fd5b809150509250929050565b6000806040838503121561351d57600080fd5b613526836133b1565b946020939093013593505050565b60006020828403121561354657600080fd5b81356131938161549a565b60006020828403121561356357600080fd5b81516131938161549a565b60006020828403121561358057600080fd5b813567ffffffffffffffff81111561359757600080fd5b8201601f810184136135a857600080fd5b610fb38482356020840161333b565b6000602082840312156135c957600080fd5b5035919050565b6000602082840312156135e257600080fd5b5051919050565b600080604083850312156135fc57600080fd5b50508035926020909101359150565b600081518084526136238160208601602086016153ac565b601f01601f19169290920160200192915050565b600081516136498185602086016153ac565b9290920192915050565b8054600090600181811c908083168061366d57607f831692505b602080841082141561368f57634e487b7160e01b600052602260045260246000fd5b8180156136a357600181146136b4576136e1565b60ff198616895284890196506136e1565b60008881526020902060005b868110156136d95781548b8201529085019083016136c0565b505084890196505b50505050505092915050565b600083516136ff8184602088016153ac565b8351908301906137138183602088016153ac565b01949350505050565b60008751602061372f8285838d016153ac565b8851918401916137428184848d016153ac565b88519201916137548184848c016153ac565b87519201916137668184848b016153ac565b86519201916137788184848a016153ac565b855192019161378a81848489016153ac565b919091019998505050505050505050565b600086516137ad818460208b016153ac565b8651908301906137c1818360208b016153ac565b86519101906137d4818360208a016153ac565b85519101906137e78183602089016153ac565b84519101906137fa8183602088016153ac565b651e17b9bb339f60d11b9101908152600601979650505050505050565b60008651613829818460208b016153ac565b86519083019061383d818360208b016153ac565b8651910190613850818360208a016153ac565b621c1e0b60ea1b9101908152845161386f8160038401602089016153ac565b84519101906138858160038401602088016153ac565b610e0f60f31b600392909101918201527f293b6f7061636974793a302e32353b7d313030257b7472616e73666f726d3a7460058201527f72616e736c617465283070782c307078293b6f7061636974793a312e303b7d7d6025820152604501979650505050505050565b60008551613901818460208a016153ac565b855190830190613915818360208a016153ac565b8082019150507f3c636972636c652063783d27307078272063793d2739303070782720723d273181527f30307078272069643d2768616e64272066696c6c3d2723000000000000000000602082015284516139778160378401602089016153ac565b631390179f60e11b603792909101918201527f3c7061746820643d274d2d353030203936312043202d323530203936312c202d603b8201527f323530203730302c2030203730302c20323530203730302c2032353020393631605b8201527f2c20353030203936312c2041313030302031303030203120302031202d353030607b8201527f20393631272069643d276761757373272066696c6c3d27230000000000000000609b8201528351613a348160b38401602088016153ac565b613a4d60b382840101631390179f60e11b815260040190565b98975050505050505050565b60008651613a6b818460208b016153ac565b80830190507f3c7465787420783d272d31383070782720793d2739343070782720666f6e742d81527373697a653d27322e31656d272066696c6c3d272360601b8060208301528751613ac4816034850160208c016153ac565b7f36362720746578742d616e63686f723d276d6964646c652720646f6d696e616e603493909101928301527f742d626173656c696e653d2763656e7472616c272069643d27626c6f636b5374605483015261139f60f11b60748301528651613b33816076850160208b016153ac565b661e17ba32bc3a1f60c91b607693909101928301527f3c7465787420783d272b31383070782720793d2739343070782720666f6e742d607d830152609d820152613a4d613bea613be4613b8960b1850189613637565b7f36362720746578742d616e63686f723d276d6964646c652720646f6d696e616e81527f742d626173656c696e653d2763656e7472616c272069643d27626c6f636b456e60208201526232139f60e91b604082015260430190565b86613637565b661e17ba32bc3a1f60c91b815260070190565b60008451613c0f8184602089016153ac565b80830190507f3c7061746820643d274d2d34303020393230204139353020393530202d31383081527f2031203120343030202d39323027207374726f6b653d276e6f6e65272066696c60208201527f6c3d276e6f6e65272069643d276e756d4e66745061746827202f3e000000000060408201527f3c7465787420666f6e742d73697a653d2733656d272069643d276e756d4e6674605b8201526a4f6e272066696c6c3d272360a81b607b8201528451613cd08160868401602089016153ac565b7f2720646f6d696e616e742d626173656c696e653d2768616e67696e6727203e3c608692909101918201527f746578745061746820746578744c656e6774683d27323630302720687265663d60a68201526d1391b73ab6a7333a2830ba34139f60911b60c68201528351613d4b8160d48401602088016153ac565b613d7260d482840101711e17ba32bc3a2830ba341f1e17ba32bc3a1f60711b815260120190565b979650505050505050565b60008551613d8f818460208a016153ac565b80830190507f3c7465787420783d272d39383070782720793d2739363070782720666f6e742d81527f73697a653d272e38656d272069643d277369676e6174272066696c6c3d27230060208201528551613df081603f840160208a016153ac565b7f3535273e74616b656e737468656f72656d2032303231207c2047617573736961603f92909101918201527237102a34b6b2b834b2b1b2b99e17ba32bc3a1f60691b605f8201527f3c7465787420783d272d39383070782720793d2739383070782720666f6e742d60728201527f73697a653d272e38656d272069643d276f776e6572272066696c6c3d2723000060928201528451613e968160b08401602089016153ac565b6c06a6a4e7c9eeedccae4744060f609b1b60b092909101918201528351613ec48160bd8401602088016153ac565b613a4d60bd82840101661e17ba32bc3a1f60c91b815260070190565b60008451613ef28184602089016153ac565b80830190507f406b65796672616d65732068616e64726f747b30257b7472616e736f726d3a7281527f6f746174652830646567293b7d313030257b7472616e73666f726d3a726f746160208201527f746528333630646567293b7d7d2368616e647b616e696d6174696f6e3a68616e6040820152640323937ba160dd1b60608201528451613f878160658401602089016153ac565b7273206c696e65617220696e66696e6974653b7d60681b606592909101918201528351613fbb8160788401602088016153ac565b671e17b9ba3cb6329f60c11b6078929091019182015260800195945050505050565b60008651613fef818460208b016153ac565b80830190507f3c7465787420783d273070782720793d2738363070782720666f6e742d73697a81526e653d2735656d272066696c6c3d272360881b6020820152865161404281602f840160208b016153ac565b7f36362720746578742d616e63686f723d276d6964646c652720646f6d696e616e602f92909101918201527f742d626173656c696e653d2763656e7472616c272069643d27626c6f636b5065604f8201526672696f64273e2b60c81b606f82015285516140b6816076840160208a016153ac565b661e17ba32bc3a1f60c91b607692909101918201527f3c7465787420783d273070782720793d2737373070782720666f6e742d73697a607d82015270653d27322e38656d272066696c6c3d272360781b609d820152613a4d613bea613be461412160ae850189613637565b7f61612720746578742d616e63686f723d276d6964646c652720646f6d696e616e81527f742d626173656c696e653d2763656e7472616c272069643d276761735072696360208201526232939f60e91b604082015260430190565b60006141888288613653565b8651614198818360208b016153ac565b6c707827207374726f6b653d272360981b910190815285516141c181600d840160208a016153ac565b7f272066696c6c3d276e6f6e6527207374726f6b652d77696474683d2700000000600d929091019182015284516141ff8160298401602089016153ac565b687074272069643d276360b81b6029929091019182015283516142298160328401602088016153ac565b631390179f60e11b60329290910191820152603601979650505050505050565b60006142558287613653565b8551614265818360208a016153ac565b6a7078272066696c6c3d272360a81b9101908152845161428c81600b8401602089016153ac565b66272069643d276360c81b600b929091019182015283516142b48160128401602088016153ac565b631390179f60e11b601292909101918201526016019695505050505050565b753c636972636c652063783d27307078272063793d272d60501b815260008651614304816016850160208b016153ac565b6670782720723d2760c81b601691840191820152865161432b81601d840160208b016153ac565b7f707827207374796c653d277472616e73666f726d3a726f74617465282d000000601d9290910191820152855161436981603a840160208a016153ac565b7f646567293b272069643d276e756d6572617263272066696c6c3d276e6f6e65279101603a8101919091527f207374726f6b653d272330303030303027207374726f6b652d77696474683d27605a820152681a9818383a1390179f60b91b607a8201527f3c636972636c652063783d27307078272063793d273070782720723d2731323560838201527f307078272069643d27696e73696465272066696c6c3d276e6f6e65272073747260a3820152656f6b653d272360d01b60c3820152613a4d6144c8613be461446961444060c986018a613637565b7f27207374726f6b652d77696474683d27353030707427202f3e00000000000000815260190190565b7f3c636972636c652063783d27307078272063793d273070782720723d2731333581527f307078272069643d276f757473696465272066696c6c3d276e6f6e6527207374602082015266726f6b653d272360c81b604082015260470190565b7f27207374726f6b652d77696474683d27343030707427202f3e00000000000000815260190190565b683d913730b6b2911d1160b91b815283516000906145168160098501602089016153ac565b7f222c20226465736372697074696f6e223a225472616e736974696f6e732061636009918401918201527f726f73732073746f6368617374696369747920746f776172647320616e6f746860298201527f657220696e6576697461626c6520626c6f636b206865696768742e0000000000604982015270222c202261747472696275746573223a5b60781b606482015284516145b98160758401602089016153ac565b7f5d2c2022637265617465645f6279223a2254616b656e73205468656f72656d22607592909101918201526a16101134b6b0b3b2911d1160a91b6095820152835161460b8160a08401602088016153ac565b61227d60f01b60a0929091019182015260a20195945050505050565b7f3c7061746820643d274d3430302039323020413935302039353020313830203081527f2030202d343030202d39323027207374726f6b653d276e6f6e65272066696c6c60208201527f3d276e6f6e65272069643d276e756d50726f6a5061746827202f3e000000000060408201527f3c7465787420666f6e742d73697a653d2733656d272069643d276e756d50726f605b8201526b6a4f6e272066696c6c3d272360a01b607b820152600083516146e68160878501602088016153ac565b7f273e3c746578745061746820746578744c656e6774683d2732363030272068726087918401918201527132b31e9391b73ab6a83937b52830ba34139f60711b60a7820152835161473e8160b98401602088016153ac565b711e17ba32bc3a2830ba341f1e17ba32bc3a1f60711b60b9929091019182015260cb01949350505050565b6c2035b2bcb33930b6b2b99036bb60991b81526000875161479181600d850160208c016153ac565b6147a0600d8285010189613653565b905086516147b2818360208b016153ac565b86519101906147c5818360208a016153ac565b621c1e0b60ea1b910190815284516147e48160038401602089016153ac565b84519101906147fa8160038401602088016153ac565b610e0f60f31b600392909101918201527f293b6f7061636974793a302e32353b7d3530257b7472616e73666f726d3a747260058201527f616e736c617465283070782c307078293b6f7061636974793a312e303b7d363060258201527504af6e8e4c2dce6ccdee4da74e8e4c2dce6d8c2e8ca560531b6045820152605b0198975050505050505050565b7f3c7061746820643d274d202d3330202d31303930204c2030202d393430204c2081527f3330202d3130393027207374726f6b652d77696474683d2730707827207374796020820152740d8ca7a4ee8e4c2dce6ccdee4da74e4dee8c2e8ca5605b1b6040820152600083516149008160558501602088016153ac565b7f646567293b272069643d27636c6f636b272066696c6c3d272300000000000000605591840191820152835161493d81606e8401602088016153ac565b631390179f60e11b606e9290910191820152607201949350505050565b6f19185d184e9d195e1d0bdc1b185a5b8b60821b8152600082516149858160108501602087016153ac565b9190910160100192915050565b7f406b65796672616d657320636c6f636b726f747b30257b7472616e736f726d3a8152660e4dee8c2e8ca560cb1b6020820152600083516149da8160278501602088016153ac565b7f646567293b7d313030257b7472616e73666f726d3a726f7461746528000000006027918401918201528351614a178160438401602088016153ac565b7f646567293b7d7d23636c6f636b7b616e696d6174696f6e3a636c6f636b726f74604392909101918201527f20343332303073206c696e65617220696e66696e6974653b7d000000000000006063820152607c01949350505050565b7f7b2274726169745f74797065223a22506572696f64222c2276616c7565223a22815260008651614aab816020850160208b016153ac565b80830190506908189b1bd8dadcc89f4b60b21b60208201527f7b2274726169745f74797065223a225468656d65222c2276616c7565223a2200602a8201528651614afc816049840160208b016153ac565b62089f4b60ea1b6049929091019182018190527f7b2274726169745f74797065223a22536861706573222c2276616c7565223a22604c8301528651614b4881606c850160208b016153ac565b606c9201918201527f7b2274726169745f74797065223a224f6e2d436861696e204974656d7320284f606f8201526e3bb732b9149116113b30b63ab2911d60891b608f820152613a4d614bf9613be4614bb5614ba7609e86018a613637565b611f4b60f21b815260020190565b7f7b2274726169745f74797065223a224f6e2d436861696e2050726f6a65637473815271101427bbb732b9149116113b30b63ab2911d60711b602082015260320190565b607d60f81b815260010190565b61236360f01b815260008451614c238160028501602089016153ac565b6c3db0b734b6b0ba34b7b71d36bb60991b6002918401918201528451614c5081600f8401602089016153ac565b600160fd1b600f92909101918201528351614c728160108401602088016153ac565b7f7320696e66696e69746520656173652d696e2d6f75743b7d00000000000000006010929091019182015260280195945050505050565b693c7265637420783d272d60b01b815260008851614cce81600a850160208d016153ac565b6770782720793d272d60c01b600a918401918201528851614cf6816012840160208d016153ac565b6a7078272077696474683d2760a81b601292909101918201528751614d2281601d840160208c016153ac565b6b707827206865696768743d2760a01b601d92909101918201528651614d4f816029840160208b016153ac565b7f7078272066696c6c3d276e6f6e6527207374726f6b653d27230000000000000060299290910191820152614ddd614dcd613be4614db8614db2614d96604287018c613637565b6f27207374726f6b652d77696474683d2760801b815260100190565b89613637565b687074272069643d276360b81b815260090190565b631390179f60e11b815260040190565b9a9950505050505050505050565b693c7265637420783d272d60b01b815260008751614e1081600a850160208c016153ac565b6770782720793d272d60c01b600a918401918201528751614e38816012840160208c016153ac565b6a7078272077696474683d2760a81b601292909101918201528651614e6481601d840160208b016153ac565b6b707827206865696768743d2760a01b601d92909101918201528551614e91816029840160208a016153ac565b6a7078272066696c6c3d272360a81b602992909101918201528451614ebd8160348401602089016153ac565b614ddd614dcd614edf60348486010166272069643d276360c81b815260070190565b87613637565b6a54696d657069656365202360a81b815260008251614f0b81600b8501602087016153ac565b91909101600b0192915050565b7f3c7465787420783d272d39383070782720793d2739323070782720666f6e742d81527f73697a653d272e38656d272069643d27746f6b656e4964272066696c6c3d2723602082015260008551614f76816040850160208a016153ac565b6e3535273e54696d657069656365202360881b6040918401918201528551614fa581604f840160208a016153ac565b661e17ba32bc3a1f60c91b604f92909101918201527f3c7465787420783d272d39383070782720793d2739343070782720666f6e742d60568201527f73697a653d272e38656d272069643d276f776e6572436e74272066696c6c3d276076820152602360f81b609682015284516150238160978401602089016153ac565b613a4d613bea614edf6097848601017f3535273e4f776e6572206f6e2d636861696e20636f756e743a200000000000008152601a0190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061508e9083018461360b565b9695505050505050565b602081526000613193602083018461360b565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526031908201527f45524337323155524953746f726167653a2055524920717565727920666f72206040820152703737b732bc34b9ba32b73a103a37b5b2b760791b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b600082198211156151e7576151e7615442565b500190565b600060ff821660ff84168060ff0382111561520957615209615442565b019392505050565b60008261522057615220615458565b500490565b600060ff83168061523857615238615458565b8060ff84160491505092915050565b600181815b8085111561528257816000190482111561526857615268615442565b8085161561527557918102915b93841c939080029061524c565b509250929050565b600061319383836000826152a05750600161032b565b816152ad5750600061032b565b81600181146152c357600281146152cd576152e9565b600191505061032b565b60ff8411156152de576152de615442565b50506001821b61032b565b5060208310610133831016604e8410600b841016171561530c575081810a61032b565b6153168383615247565b806000190482111561532a5761532a615442565b029392505050565b600081600019048311821515161561534c5761534c615442565b500290565b600060ff821660ff84168160ff048111821515161561532a5761532a615442565b60008282101561538457615384615442565b500390565b600060ff821660ff8416808210156153a3576153a3615442565b90039392505050565b60005b838110156153c75781810151838201526020016153af565b83811115610c535750506000910152565b600181811c908216806153ec57607f821691505b6020821081141561540d57634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561542757615427615442565b5060010190565b60008261543d5761543d615458565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146106d257600080fdfe3c3f786d6c2076657273696f6e3d27312e302720656e636f64696e673d275554462d38273f3e3c73766720786d6c6e733d27687474703a2f2f7777772e77332e6f72672f323030302f7376672720786d6c6e733a786c696e6b3d27687474703a2f2f7777772e77332e6f72672f313939392f786c696e6b27206865696768743d2731303030272077696474683d2731303030272076696577426f783d272d31303030202d3130303020323030302032303030273e3c7265637420783d272d313030302720793d272d31303030272077696474683d273230303027206865696768743d2732303030272066696c6c3d272366666666666627202f3e3c7374796c653e7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7ca2646970667358221220e2c8e4d3ed5b9398be13969b645ccc02f1f276a5b4b820c63191f8d6473108da64736f6c63430008070033476175737369616e2054696d657069656365732062792054616b656e73205468656f72656d

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101215760003560e01c806370a08231116100ad578063a22cb46511610071578063a22cb46514610257578063b88d4fde1461026a578063c87b56dd1461027d578063e985e9c514610290578063f2fde38b146102cc57600080fd5b806370a0823114610202578063715018a6146102235780638da5cb5b1461022b5780639348cef71461023c57806395d89b411461024f57600080fd5b8063191347df116100f4578063191347df146101a357806323b872dd146101b657806342842e0e146101c95780636352211e146101dc57806365921e3a146101ef57600080fd5b806301ffc9a71461012657806306fdde031461014e578063081812fc14610163578063095ea7b31461018e575b600080fd5b610139610134366004613534565b6102df565b60405190151581526020015b60405180910390f35b610156610331565b6040516101459190615098565b6101766101713660046135b7565b6103c3565b6040516001600160a01b039091168152602001610145565b6101a161019c36600461350a565b61045d565b005b6101a16101b136600461356e565b610573565b6101a16101c4366004613416565b6106d5565b6101a16101d7366004613416565b610706565b6101766101ea3660046135b7565b610721565b6101a16101fd3660046135b7565b610798565b6102156102103660046133c8565b61086c565b604051908152602001610145565b6101a16108f3565b6006546001600160a01b0316610176565b61015661024a3660046135e9565b610967565b610156610b4d565b6101a16102653660046134ce565b610b5c565b6101a1610278366004613452565b610c21565b61015661028b3660046135b7565b610c59565b61013961029e3660046133e3565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b6101a16102da3660046133c8565b610d6b565b60006001600160e01b031982166380ac58cd60e01b148061031057506001600160e01b03198216635b5e139f60e01b145b8061032b57506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060008054610340906153d8565b80601f016020809104026020016040519081016040528092919081815260200182805461036c906153d8565b80156103b95780601f1061038e576101008083540402835291602001916103b9565b820191906000526020600020905b81548152906001019060200180831161039c57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166104415760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061046882610721565b9050806001600160a01b0316836001600160a01b031614156104d65760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610438565b336001600160a01b03821614806104f257506104f2813361029e565b6105645760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610438565b61056e8383610e56565b505050565b6006546001600160a01b0316331461059d5760405162461bcd60e51b81526004016104389061514e565b6000600880546105ac906153d8565b9050116105fb5760405162461bcd60e51b815260206004820152601960248201527f4552524f523a20416c726561647920636f6e66696775726564000000000000006044820152606401610438565b600960008154811061060f5761060f61546e565b906000526020600020018054610624906153d8565b15159050610662578060096000815481106106415761064161546e565b90600052602060002001908051906020019061065e9291906132a2565b5050565b60096001815481106106765761067661546e565b90600052602060002001805461068b906153d8565b151590506106a8578060096001815481106106415761064161546e565b6000600880546106b7906153d8565b905011156106d257805161065e9060089060208401906132a2565b50565b6106df3382610ec4565b6106fb5760405162461bcd60e51b815260040161043890615183565b61056e838383610fbb565b61056e83838360405180602001604052806000815250610c21565b6000818152600260205260408120546001600160a01b03168061032b5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610438565b6006546001600160a01b031633146107c25760405162461bcd60e51b81526004016104389061514e565b60646107cd60075490565b1061081a5760405162461bcd60e51b815260206004820152601760248201527f4552524f523a206d696e74696e6720636f6d706c6574650000000000000000006044820152606401610438565b60005b8181101561065e5760075460641415610834575050565b610842600780546001019055565b600061084d60075490565b9050610859338261115b565b508061086481615413565b91505061081d565b60006001600160a01b0382166108d75760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610438565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b0316331461091d5760405162461bcd60e51b81526004016104389061514e565b6006546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600680546001600160a01b0319169055565b606060088054610976906153d8565b1590506109bc5760405162461bcd60e51b815260206004820152601460248201527311549493d48e88135a5cd8dbdb999a59dd5c995960621b6044820152606401610438565b6000838152600260205260409020546001600160a01b03166109f05760405162461bcd60e51b8152600401610438906150fd565b6000610a036109fe85610721565b61129d565b5090506000610a1185611d33565b50509050600082670de0b6b3a7640000610a2a88610721565b6001600160a01b031631610a3e9190615211565b610a49600285615211565b610a5391906151d4565b610a5d91906151d4565b90506010811115610a6c575060105b6000610a788783611daa565b905080610a8e610a8985600d615332565b611e0f565b610a9788611f0d565b604051602001610aa993929190613ee0565b604051602081830303815290604052905080610ac58884611f8f565b604051602001610ad69291906136ed565b60408051601f198184030181526101408301909152610101808352909250600091906154b1602083013982610b0a8a612012565b610b138b6120ca565b610b1d8c8c612220565b604051602001610b3195949392919061379b565b60408051808303601f1901815291905298975050505050505050565b606060018054610340906153d8565b6001600160a01b038216331415610bb55760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610438565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610c2b3383610ec4565b610c475760405162461bcd60e51b815260040161043890615183565b610c538484848461229d565b50505050565b606060088054610c68906153d8565b159050610cae5760405162461bcd60e51b815260206004820152601460248201527311549493d48e88135a5cd8dbdb999a59dd5c995960621b6044820152606401610438565b6000828152600260205260409020546001600160a01b0316610ce25760405162461bcd60e51b8152600401610438906150fd565b6000610ced83611e0f565b604051602001610cfd9190614ee5565b604051602081830303815290604052610d15846122d0565b610d20856000610967565b604051602001610d32939291906144f1565b604051602081830303815290604052905080604051602001610d54919061495a565b604051602081830303815290604052915050919050565b6006546001600160a01b03163314610d955760405162461bcd60e51b81526004016104389061514e565b6001600160a01b038116610dfa5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610438565b6006546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600680546001600160a01b0319166001600160a01b0392909216919091179055565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610e8b82610721565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316610f3d5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610438565b6000610f4883610721565b9050806001600160a01b0316846001600160a01b03161480610f835750836001600160a01b0316610f78846103c3565b6001600160a01b0316145b80610fb357506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316610fce82610721565b6001600160a01b0316146110365760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610438565b6001600160a01b0382166110985760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610438565b6110a3600082610e56565b6001600160a01b03831660009081526003602052604081208054600192906110cc908490615372565b90915550506001600160a01b03821660009081526003602052604081208054600192906110fa9084906151d4565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6001600160a01b0382166111b15760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610438565b6000818152600260205260409020546001600160a01b0316156112165760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610438565b6001600160a01b038216600090815260036020526040812080546001929061123f9084906151d4565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60408051600f808252610200820190925260009182918291602082016101e080368337019050506040516370a0823160e01b81526001600160a01b03861660048201529091507331c70e9a1bab16f47710e4b302c49998cfb36ef9906370a082319060240160206040518083038186803b15801561131a57600080fd5b505afa15801561132e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061135291906135d0565b816000815181106113655761136561546e565b60209081029190910101526040516370a0823160e01b81526001600160a01b038516600482015273d4e4078ca3495de5b1d4db434bebc5a986197782906370a082319060240160206040518083038186803b1580156113c357600080fd5b505afa1580156113d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113fb91906135d0565b8160018151811061140e5761140e61546e565b60209081029190910101526040516370a0823160e01b81526001600160a01b03851660048201527360f3680350f65beb2752788cb48abfce84a4759e906370a082319060240160206040518083038186803b15801561146c57600080fd5b505afa158015611480573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114a491906135d0565b816002815181106114b7576114b761546e565b60209081029190910101526040516370a0823160e01b81526001600160a01b03851660048201527391047abf3cab8da5a9515c8750ab33b4f1560a7a906370a082319060240160206040518083038186803b15801561151557600080fd5b505afa158015611529573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061154d91906135d0565b816003815181106115605761156061546e565b60209081029190910101526040516370a0823160e01b81526001600160a01b038516600482015273f3e778f839934fc819cfa1040aabacecba01e049906370a082319060240160206040518083038186803b1580156115be57600080fd5b505afa1580156115d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115f691906135d0565b816004815181106116095761160961546e565b60209081029190910101526040516370a0823160e01b81526001600160a01b03851660048201527336f379400de6c6bcdf4408b282f8b685c56adc60906370a082319060240160206040518083038186803b15801561166757600080fd5b505afa15801561167b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061169f91906135d0565b816005815181106116b2576116b261546e565b60209081029190910101526040516370a0823160e01b81526001600160a01b038516600482015273b2d6fb1dc231f97f8cc89467b52f7c4f78484044906370a082319060240160206040518083038186803b15801561171057600080fd5b505afa158015611724573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061174891906135d0565b8160068151811061175b5761175b61546e565b60209081029190910101526040516370a0823160e01b81526001600160a01b03851660048201527346f9a4522666d2476a5f5cd51ea3e0b5800e7f98906370a082319060240160206040518083038186803b1580156117b957600080fd5b505afa1580156117cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117f191906135d0565b816007815181106118045761180461546e565b60209081029190910101526040516370a0823160e01b81526001600160a01b0385166004820152738fdde660c3ccab82756acc5233687a4ceb4b8f30906370a082319060240160206040518083038186803b15801561186257600080fd5b505afa158015611876573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061189a91906135d0565b816008815181106118ad576118ad61546e565b60209081029190910101526040516370a0823160e01b81526001600160a01b0385166004820152738d04a8c79ceb0889bdd12acdf3fa9d207ed3ff63906370a082319060240160206040518083038186803b15801561190b57600080fd5b505afa15801561191f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061194391906135d0565b816009815181106119565761195661546e565b60209081029190910101526040516370a0823160e01b81526001600160a01b038516600482015273daca87395f3b1bbc46f3fa187e996e03a5dcc985906370a082319060240160206040518083038186803b1580156119b457600080fd5b505afa1580156119c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119ec91906135d0565b81600a815181106119ff576119ff61546e565b60209081029190910101526040516370a0823160e01b81526001600160a01b0385166004820152735d4683ba64ee6283bb7fdb8a91252f6aab32a110906370a082319060240160206040518083038186803b158015611a5d57600080fd5b505afa158015611a71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a9591906135d0565b81600b81518110611aa857611aa861546e565b60209081029190910101526040516370a0823160e01b81526001600160a01b038516600482015273ea61926b4c8b5f8e2bc6f85c0bd800969dc79fcf906370a082319060240160206040518083038186803b158015611b0657600080fd5b505afa158015611b1a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b3e91906135d0565b81600c81518110611b5157611b5161546e565b60209081029190910101526040516370a0823160e01b81526001600160a01b038516600482015273d31fc221d2b0e0321c43e9f6824b26ebfff01d7d906370a082319060240160206040518083038186803b158015611baf57600080fd5b505afa158015611bc3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611be791906135d0565b81600d81518110611bfa57611bfa61546e565b60209081029190910101526040516370a0823160e01b81526001600160a01b038516600482015273f76c5d925b27a63a3745a6b787664a7f38fa79bd906370a082319060240160206040518083038186803b158015611c5857600080fd5b505afa158015611c6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c9091906135d0565b81600e81518110611ca357611ca361546e565b60200260200101818152505060008060005b600f811015611d2757838181518110611cd057611cd061546e565b602002602001015183611ce391906151d4565b92506000848281518110611cf957611cf961546e565b60200260200101511115611d1557611d128260016151d4565b91505b80611d1f81615413565b915050611cb5565b50909590945092505050565b600080806005611d44600186615372565b611d4e919061542e565b611d599060016151d4565b611d6490600261528a565b611d6f60028661542e565b15611d7b576000611d7e565b60015b611d8960038761542e565b15611d95576000611d98565b60015b919660ff918216965091169350915050565b60408051602081019091526000808252606091905b83811015611e075781611dd282876123e6565b604051602001611de39291906136ed565b60405160208183030381529060405291508080611dff90615413565b915050611dbf565b509392505050565b606081611e335750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611e5d5780611e4781615413565b9150611e569050600a83615211565b9150611e37565b60008167ffffffffffffffff811115611e7857611e78615484565b6040519080825280601f01601f191660200182016040528015611ea2576020820181803683370190505b5090505b8415610fb357611eb7600183615372565b9150611ec4600a8661542e565b611ecf9060306151d4565b60f81b818381518110611ee457611ee461546e565b60200101906001600160f81b031916908160001a905350611f06600a86615211565b9450611ea6565b60606000607861a8c0611f2185603c615332565b611f2c90603c615332565b611f369042615372565b611f40919061542e565b611f4a9190615211565b90506000611f5782611e0f565b611f66610a89846101686151d4565b604051602001611f77929190614992565b60408051601f19818403018152919052949350505050565b60606000611f9c84611d33565b60408051602081019091526000815290935091508490505b801561200957611fc5600182615372565b905082611ffe5781611fd782886125c4565b604051602001611fe89291906136ed565b6040516020818303038152906040529150611fb4565b81611fd782886126ef565b50949350505050565b6060600061201f83611d33565b50509050600061203582600a610a8991906151d4565b612044610a89846104d86151d4565b61205e84612054816107d0615211565b610a899190615211565b6120696003886127f3565b6120746005896127f3565b6040516020016120889594939291906142d3565b6040516020818303038152906040529050806120a385612aa9565b6120ac86612b21565b6120b76007886127f3565b604051602001611f7794939291906138ef565b606060006120da6109fe84610721565b50905060006120e884611d33565b5050905060006120f785612b21565b61210086611e0f565b61210987612b21565b61211286611e0f565b6040516020016121259493929190614f18565b60405160208183030381529060405290508061214086612b21565b61214987612b21565b61215a61215589610721565b612b7f565b60405160200161216d9493929190613d7d565b60405160208183030381529060405290508061218886612b21565b61219184611e0f565b61219a88612b21565b6121a560028a612cc6565b6040516020016121b9959493929190613fdd565b6040516020818303038152906040529050806121d486612b21565b6121dd43611e0f565b6121e688612b21565b6121f3610a8987436151d4565b604051602001612207959493929190613a59565b60408051601f1981840301815291905295945050505050565b60606000607861a8c061223485603c615332565b61223f90603c615332565b6122499042615372565b612253919061542e565b61225d9190615211565b9050600061226a82611e0f565b61227386612b21565b604051602001612284929190614884565b60408051808303601f1901815291905295945050505050565b6122a8848484610fbb565b6122b484848484612dbd565b610c535760405162461bcd60e51b8152600401610438906150ab565b606060008060006122e085611d33565b9250925092506000806122f56109fe88610721565b915091506000846000146123265760405180604001604052806005815260200164131a59da1d60da1b815250612344565b604051806040016040528060048152602001634461726b60e01b8152505b9050600084156123725760405180604001604052806006815260200165426c6f636b7360d01b815250612393565b60405180604001604052806007815260200166436972636c657360c81b8152505b905060006123a088611e0f565b83836123ab88611e0f565b6123b488611e0f565b6040516020016123c8959493929190614a73565b60408051601f198184030181529190529a9950505050505050505050565b60606000806123f484611d33565b92505091506000600261241387600161240d91906151d4565b87612eca565b61241d919061542e565b156124375760405180602001604052806000815250612452565b604051806040016040528060018152602001602d60f81b8152505b90506000600261246b61246589836151d4565b88612eca565b612475919061542e565b1561248f57604051806020016040528060008152506124aa565b604051806040016040528060018152602001602d60f81b8152505b905060608060006124bc87601a615332565b905085612509576124e760406124d28c8c612eca565b6124dc919061542e565b610a8990601c615332565b925061250260406124d26124fc8d60016151d4565b8c612eca565b915061257e565b600061251660028c61542e565b90506000612525826001615372565b905061254a60406125368e8e612eca565b612540919061542e565b6124dc9084615332565b9450612579604061256561255f8f60016151d4565b8e612eca565b61256f919061542e565b6124dc9083615332565b935050505b61258b8a84848888612ef3565b6125958b8361305c565b6040516020016125a69291906136ed565b60405160208183030381529060405297505050505050505092915050565b606060006125f760806125d78686612eca565b6125e1919061542e565b6125ec90600a6151d4565b610a8990600a615332565b9050600061260585856130a5565b905060026126138686612eca565b61261d919061542e565b6126755760096000815481106126355761263561546e565b90600052602060002001828261264a88611e0f565b60405160200161265d9493929190614249565b6040516020818303038152906040529250505061032b565b60096000815481106126895761268961546e565b9060005260206000200182826126b9601c6126a48a8a612eca565b6126ae919061542e565b610a899060046151d4565b6126c289611e0f565b6040516020016126d695949392919061417c565b6040516020818303038152906040529250505092915050565b6060600060806126ff8585612eca565b612709919061542e565b61271490600a6151d4565b61271f90600a615332565b9050600061272d85856130a5565b9050600061273a83611e0f565b9050600061274c610a89856002615332565b9050600261275a8888612eca565b612764919061542e565b6127a55781828283866127768c611e0f565b60405160200161278b96959493929190614deb565b60405160208183030381529060405294505050505061032b565b81828283866127b9601c6126a48e8e612eca565b6127c28d611e0f565b6040516020016127d89796959493929190614ca9565b60405160208183030381529060405294505050505092915050565b6060600061280083611d33565b50915050600061280f846130cf565b6040805160038082526080820190925260609290921c925060009190816020015b6060815260200190600190039081612830579050509050826129e657612876604051806040016040528060078152602001663132333435363760c81b815250878761313c565b816000815181106128895761288961546e565b60200260200101819052506128ca604051806040016040528060078152602001663132333435363760c81b8152508760016128c491906151d4565b8761313c565b816001815181106128dd576128dd61546e565b6020026020010181905250612918604051806040016040528060078152602001663132333435363760c81b8152508760026128c491906151d4565b8160028151811061292b5761292b61546e565b6020026020010181905250806000815181106129495761294961546e565b602002602001015161295b8388613179565b8260018151811061296e5761296e61546e565b602002602001015161298c858a600261298791906151d4565b613179565b8460028151811061299f5761299f61546e565b60200260200101516129b8878c600461298791906151d4565b6040516020016129cd9695949392919061371c565b604051602081830303815290604052935050505061032b565b612a0f6040518060400160405280600681526020016539616263646560d01b815250878761313c565b81600081518110612a2257612a2261546e565b6020026020010181905250612a5c6040518060400160405280600681526020016539616263646560d01b8152508760016128c491906151d4565b81600181518110612a6f57612a6f61546e565b60200260200101819052506129186040518060400160405280600681526020016539616263646560d01b8152508760026128c491906151d4565b60606000612ab683612b21565b612ac1600085612cc6565b604051602001612ad2929190614627565b604051602081830303815290604052905080612aed84612b21565b612af8600186612cc6565b604051602001612b0a93929190613bfd565b60408051601f198184030181529190529392505050565b60606000612b2e83611d33565b5091505080612b5b57505060408051808201909152600681526533333333333360d11b6020820152919050565b505060408051808201909152600681526503030303030360d41b6020820152919050565b60408051602880825260608281019093526000919060208201818036833701905050905060005b6014811015612cbf576000612bbc826013615372565b612bc7906008615332565b612bd290600261528a565b612be5906001600160a01b038716615211565b60f81b9050600060108260f81c612bfc9190615225565b60f81b905060008160f81c6010612c139190615351565b8360f81c612c219190615389565b60f81b9050612c2f8261319a565b85612c3b866002615332565b81518110612c4b57612c4b61546e565b60200101906001600160f81b031916908160001a905350612c6b8161319a565b85612c77866002615332565b612c829060016151d4565b81518110612c9257612c9261546e565b60200101906001600160f81b031916908160001a9053505050508080612cb790615413565b915050612ba6565b5092915050565b60608260021415612d415760006019612ce3633b9aca0048615211565b612ced9190615211565b9050600c811115612cfc5750600c5b60408051808201909152601081526f1515151515151515151515151515151560811b6020820152612d39906000612d348460016151d4565b6131d5565b91505061032b565b600080612d506109fe85610721565b91509150601e821115612d6257601e91505b84612d9457612d8b6040518060600160405280602381526020016155b2602391396000846131d5565b9250505061032b565b612d8b6040518060600160405280602381526020016155b2602391396000612d34846002615332565b60006001600160a01b0384163b15612ebf57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612e0190339089908890889060040161505b565b602060405180830381600087803b158015612e1b57600080fd5b505af1925050508015612e4b575060408051601f3d908101601f19168201909252612e4891810190613551565b60015b612ea5573d808015612e79576040519150601f19603f3d011682016040523d82523d6000602084013e612e7e565b606091505b508051612e9d5760405162461bcd60e51b8152600401610438906150ab565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610fb3565b506001949350505050565b600080612ed6836130cf565b9050808460148110612eea57612eea61546e565b1a949350505050565b60606000612f0087611e0f565b6009600181548110612f1457612f1461546e565b906000526020600020018551600014612f4657604051806040016040528060018152602001602d60f81b815250612f57565b604051806020016040528060008152505b888651600014612f8057604051806040016040528060018152602001602d60f81b815250612f91565b604051806020016040528060008152505b89604051602001612fa796959493929190614769565b6040516020818303038152906040529050808451600014612fd75760405180602001604052806000815250612ff2565b604051806040016040528060018152602001602d60f81b8152505b878551600014613011576040518060200160405280600081525061302c565b604051806040016040528060018152602001602d60f81b8152505b88604051602001613041959493929190613817565b60408051808303601f19018152919052979650505050505050565b6060600061306984611e0f565b61307285611e0f565b61307b85611e0f565b60405160200161308d93929190614c06565b60408051808303601f19018152919052949350505050565b606060006130b2836130cf565b60601c9050610fb36130c382612b7f565b85612d348160066151d4565b6000806130db83611d33565b505090506130e883610721565b6130f28243615211565b60405160609290921b6bffffffffffffffffffffffff1916602083015260348201526054810184905260740160405160208183030381529060405280519060200120915050919050565b6060610fb384600561314e8686612eca565b613158919061542e565b60056131648787612eca565b61316e919061542e565b612d349060016151d4565b606061319361318784612b7f565b83612d348160016151d4565b9392505050565b6000600a60f883901c10156131c1576131b860f883901c60306151ec565b60f81b92915050565b6131b860f883901c60576151ec565b919050565b60608360006131e48585615372565b67ffffffffffffffff8111156131fc576131fc615484565b6040519080825280601f01601f191660200182016040528015613226576020820181803683370190505b509050845b84811015613298578281815181106132455761324561546e565b01602001516001600160f81b0319168261325f8884615372565b8151811061326f5761326f61546e565b60200101906001600160f81b031916908160001a9053508061329081615413565b91505061322b565b5095945050505050565b8280546132ae906153d8565b90600052602060002090601f0160209004810192826132d05760008555613316565b82601f106132e957805160ff1916838001178555613316565b82800160010185558215613316579182015b828111156133165782518255916020019190600101906132fb565b50613322929150613326565b5090565b5b808211156133225760008155600101613327565b600067ffffffffffffffff8084111561335657613356615484565b604051601f8501601f19908116603f0116810190828211818310171561337e5761337e615484565b8160405280935085815286868601111561339757600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b03811681146131d057600080fd5b6000602082840312156133da57600080fd5b613193826133b1565b600080604083850312156133f657600080fd5b6133ff836133b1565b915061340d602084016133b1565b90509250929050565b60008060006060848603121561342b57600080fd5b613434846133b1565b9250613442602085016133b1565b9150604084013590509250925092565b6000806000806080858703121561346857600080fd5b613471856133b1565b935061347f602086016133b1565b925060408501359150606085013567ffffffffffffffff8111156134a257600080fd5b8501601f810187136134b357600080fd5b6134c28782356020840161333b565b91505092959194509250565b600080604083850312156134e157600080fd5b6134ea836133b1565b9150602083013580151581146134ff57600080fd5b809150509250929050565b6000806040838503121561351d57600080fd5b613526836133b1565b946020939093013593505050565b60006020828403121561354657600080fd5b81356131938161549a565b60006020828403121561356357600080fd5b81516131938161549a565b60006020828403121561358057600080fd5b813567ffffffffffffffff81111561359757600080fd5b8201601f810184136135a857600080fd5b610fb38482356020840161333b565b6000602082840312156135c957600080fd5b5035919050565b6000602082840312156135e257600080fd5b5051919050565b600080604083850312156135fc57600080fd5b50508035926020909101359150565b600081518084526136238160208601602086016153ac565b601f01601f19169290920160200192915050565b600081516136498185602086016153ac565b9290920192915050565b8054600090600181811c908083168061366d57607f831692505b602080841082141561368f57634e487b7160e01b600052602260045260246000fd5b8180156136a357600181146136b4576136e1565b60ff198616895284890196506136e1565b60008881526020902060005b868110156136d95781548b8201529085019083016136c0565b505084890196505b50505050505092915050565b600083516136ff8184602088016153ac565b8351908301906137138183602088016153ac565b01949350505050565b60008751602061372f8285838d016153ac565b8851918401916137428184848d016153ac565b88519201916137548184848c016153ac565b87519201916137668184848b016153ac565b86519201916137788184848a016153ac565b855192019161378a81848489016153ac565b919091019998505050505050505050565b600086516137ad818460208b016153ac565b8651908301906137c1818360208b016153ac565b86519101906137d4818360208a016153ac565b85519101906137e78183602089016153ac565b84519101906137fa8183602088016153ac565b651e17b9bb339f60d11b9101908152600601979650505050505050565b60008651613829818460208b016153ac565b86519083019061383d818360208b016153ac565b8651910190613850818360208a016153ac565b621c1e0b60ea1b9101908152845161386f8160038401602089016153ac565b84519101906138858160038401602088016153ac565b610e0f60f31b600392909101918201527f293b6f7061636974793a302e32353b7d313030257b7472616e73666f726d3a7460058201527f72616e736c617465283070782c307078293b6f7061636974793a312e303b7d7d6025820152604501979650505050505050565b60008551613901818460208a016153ac565b855190830190613915818360208a016153ac565b8082019150507f3c636972636c652063783d27307078272063793d2739303070782720723d273181527f30307078272069643d2768616e64272066696c6c3d2723000000000000000000602082015284516139778160378401602089016153ac565b631390179f60e11b603792909101918201527f3c7061746820643d274d2d353030203936312043202d323530203936312c202d603b8201527f323530203730302c2030203730302c20323530203730302c2032353020393631605b8201527f2c20353030203936312c2041313030302031303030203120302031202d353030607b8201527f20393631272069643d276761757373272066696c6c3d27230000000000000000609b8201528351613a348160b38401602088016153ac565b613a4d60b382840101631390179f60e11b815260040190565b98975050505050505050565b60008651613a6b818460208b016153ac565b80830190507f3c7465787420783d272d31383070782720793d2739343070782720666f6e742d81527373697a653d27322e31656d272066696c6c3d272360601b8060208301528751613ac4816034850160208c016153ac565b7f36362720746578742d616e63686f723d276d6964646c652720646f6d696e616e603493909101928301527f742d626173656c696e653d2763656e7472616c272069643d27626c6f636b5374605483015261139f60f11b60748301528651613b33816076850160208b016153ac565b661e17ba32bc3a1f60c91b607693909101928301527f3c7465787420783d272b31383070782720793d2739343070782720666f6e742d607d830152609d820152613a4d613bea613be4613b8960b1850189613637565b7f36362720746578742d616e63686f723d276d6964646c652720646f6d696e616e81527f742d626173656c696e653d2763656e7472616c272069643d27626c6f636b456e60208201526232139f60e91b604082015260430190565b86613637565b661e17ba32bc3a1f60c91b815260070190565b60008451613c0f8184602089016153ac565b80830190507f3c7061746820643d274d2d34303020393230204139353020393530202d31383081527f2031203120343030202d39323027207374726f6b653d276e6f6e65272066696c60208201527f6c3d276e6f6e65272069643d276e756d4e66745061746827202f3e000000000060408201527f3c7465787420666f6e742d73697a653d2733656d272069643d276e756d4e6674605b8201526a4f6e272066696c6c3d272360a81b607b8201528451613cd08160868401602089016153ac565b7f2720646f6d696e616e742d626173656c696e653d2768616e67696e6727203e3c608692909101918201527f746578745061746820746578744c656e6774683d27323630302720687265663d60a68201526d1391b73ab6a7333a2830ba34139f60911b60c68201528351613d4b8160d48401602088016153ac565b613d7260d482840101711e17ba32bc3a2830ba341f1e17ba32bc3a1f60711b815260120190565b979650505050505050565b60008551613d8f818460208a016153ac565b80830190507f3c7465787420783d272d39383070782720793d2739363070782720666f6e742d81527f73697a653d272e38656d272069643d277369676e6174272066696c6c3d27230060208201528551613df081603f840160208a016153ac565b7f3535273e74616b656e737468656f72656d2032303231207c2047617573736961603f92909101918201527237102a34b6b2b834b2b1b2b99e17ba32bc3a1f60691b605f8201527f3c7465787420783d272d39383070782720793d2739383070782720666f6e742d60728201527f73697a653d272e38656d272069643d276f776e6572272066696c6c3d2723000060928201528451613e968160b08401602089016153ac565b6c06a6a4e7c9eeedccae4744060f609b1b60b092909101918201528351613ec48160bd8401602088016153ac565b613a4d60bd82840101661e17ba32bc3a1f60c91b815260070190565b60008451613ef28184602089016153ac565b80830190507f406b65796672616d65732068616e64726f747b30257b7472616e736f726d3a7281527f6f746174652830646567293b7d313030257b7472616e73666f726d3a726f746160208201527f746528333630646567293b7d7d2368616e647b616e696d6174696f6e3a68616e6040820152640323937ba160dd1b60608201528451613f878160658401602089016153ac565b7273206c696e65617220696e66696e6974653b7d60681b606592909101918201528351613fbb8160788401602088016153ac565b671e17b9ba3cb6329f60c11b6078929091019182015260800195945050505050565b60008651613fef818460208b016153ac565b80830190507f3c7465787420783d273070782720793d2738363070782720666f6e742d73697a81526e653d2735656d272066696c6c3d272360881b6020820152865161404281602f840160208b016153ac565b7f36362720746578742d616e63686f723d276d6964646c652720646f6d696e616e602f92909101918201527f742d626173656c696e653d2763656e7472616c272069643d27626c6f636b5065604f8201526672696f64273e2b60c81b606f82015285516140b6816076840160208a016153ac565b661e17ba32bc3a1f60c91b607692909101918201527f3c7465787420783d273070782720793d2737373070782720666f6e742d73697a607d82015270653d27322e38656d272066696c6c3d272360781b609d820152613a4d613bea613be461412160ae850189613637565b7f61612720746578742d616e63686f723d276d6964646c652720646f6d696e616e81527f742d626173656c696e653d2763656e7472616c272069643d276761735072696360208201526232939f60e91b604082015260430190565b60006141888288613653565b8651614198818360208b016153ac565b6c707827207374726f6b653d272360981b910190815285516141c181600d840160208a016153ac565b7f272066696c6c3d276e6f6e6527207374726f6b652d77696474683d2700000000600d929091019182015284516141ff8160298401602089016153ac565b687074272069643d276360b81b6029929091019182015283516142298160328401602088016153ac565b631390179f60e11b60329290910191820152603601979650505050505050565b60006142558287613653565b8551614265818360208a016153ac565b6a7078272066696c6c3d272360a81b9101908152845161428c81600b8401602089016153ac565b66272069643d276360c81b600b929091019182015283516142b48160128401602088016153ac565b631390179f60e11b601292909101918201526016019695505050505050565b753c636972636c652063783d27307078272063793d272d60501b815260008651614304816016850160208b016153ac565b6670782720723d2760c81b601691840191820152865161432b81601d840160208b016153ac565b7f707827207374796c653d277472616e73666f726d3a726f74617465282d000000601d9290910191820152855161436981603a840160208a016153ac565b7f646567293b272069643d276e756d6572617263272066696c6c3d276e6f6e65279101603a8101919091527f207374726f6b653d272330303030303027207374726f6b652d77696474683d27605a820152681a9818383a1390179f60b91b607a8201527f3c636972636c652063783d27307078272063793d273070782720723d2731323560838201527f307078272069643d27696e73696465272066696c6c3d276e6f6e65272073747260a3820152656f6b653d272360d01b60c3820152613a4d6144c8613be461446961444060c986018a613637565b7f27207374726f6b652d77696474683d27353030707427202f3e00000000000000815260190190565b7f3c636972636c652063783d27307078272063793d273070782720723d2731333581527f307078272069643d276f757473696465272066696c6c3d276e6f6e6527207374602082015266726f6b653d272360c81b604082015260470190565b7f27207374726f6b652d77696474683d27343030707427202f3e00000000000000815260190190565b683d913730b6b2911d1160b91b815283516000906145168160098501602089016153ac565b7f222c20226465736372697074696f6e223a225472616e736974696f6e732061636009918401918201527f726f73732073746f6368617374696369747920746f776172647320616e6f746860298201527f657220696e6576697461626c6520626c6f636b206865696768742e0000000000604982015270222c202261747472696275746573223a5b60781b606482015284516145b98160758401602089016153ac565b7f5d2c2022637265617465645f6279223a2254616b656e73205468656f72656d22607592909101918201526a16101134b6b0b3b2911d1160a91b6095820152835161460b8160a08401602088016153ac565b61227d60f01b60a0929091019182015260a20195945050505050565b7f3c7061746820643d274d3430302039323020413935302039353020313830203081527f2030202d343030202d39323027207374726f6b653d276e6f6e65272066696c6c60208201527f3d276e6f6e65272069643d276e756d50726f6a5061746827202f3e000000000060408201527f3c7465787420666f6e742d73697a653d2733656d272069643d276e756d50726f605b8201526b6a4f6e272066696c6c3d272360a01b607b820152600083516146e68160878501602088016153ac565b7f273e3c746578745061746820746578744c656e6774683d2732363030272068726087918401918201527132b31e9391b73ab6a83937b52830ba34139f60711b60a7820152835161473e8160b98401602088016153ac565b711e17ba32bc3a2830ba341f1e17ba32bc3a1f60711b60b9929091019182015260cb01949350505050565b6c2035b2bcb33930b6b2b99036bb60991b81526000875161479181600d850160208c016153ac565b6147a0600d8285010189613653565b905086516147b2818360208b016153ac565b86519101906147c5818360208a016153ac565b621c1e0b60ea1b910190815284516147e48160038401602089016153ac565b84519101906147fa8160038401602088016153ac565b610e0f60f31b600392909101918201527f293b6f7061636974793a302e32353b7d3530257b7472616e73666f726d3a747260058201527f616e736c617465283070782c307078293b6f7061636974793a312e303b7d363060258201527504af6e8e4c2dce6ccdee4da74e8e4c2dce6d8c2e8ca560531b6045820152605b0198975050505050505050565b7f3c7061746820643d274d202d3330202d31303930204c2030202d393430204c2081527f3330202d3130393027207374726f6b652d77696474683d2730707827207374796020820152740d8ca7a4ee8e4c2dce6ccdee4da74e4dee8c2e8ca5605b1b6040820152600083516149008160558501602088016153ac565b7f646567293b272069643d27636c6f636b272066696c6c3d272300000000000000605591840191820152835161493d81606e8401602088016153ac565b631390179f60e11b606e9290910191820152607201949350505050565b6f19185d184e9d195e1d0bdc1b185a5b8b60821b8152600082516149858160108501602087016153ac565b9190910160100192915050565b7f406b65796672616d657320636c6f636b726f747b30257b7472616e736f726d3a8152660e4dee8c2e8ca560cb1b6020820152600083516149da8160278501602088016153ac565b7f646567293b7d313030257b7472616e73666f726d3a726f7461746528000000006027918401918201528351614a178160438401602088016153ac565b7f646567293b7d7d23636c6f636b7b616e696d6174696f6e3a636c6f636b726f74604392909101918201527f20343332303073206c696e65617220696e66696e6974653b7d000000000000006063820152607c01949350505050565b7f7b2274726169745f74797065223a22506572696f64222c2276616c7565223a22815260008651614aab816020850160208b016153ac565b80830190506908189b1bd8dadcc89f4b60b21b60208201527f7b2274726169745f74797065223a225468656d65222c2276616c7565223a2200602a8201528651614afc816049840160208b016153ac565b62089f4b60ea1b6049929091019182018190527f7b2274726169745f74797065223a22536861706573222c2276616c7565223a22604c8301528651614b4881606c850160208b016153ac565b606c9201918201527f7b2274726169745f74797065223a224f6e2d436861696e204974656d7320284f606f8201526e3bb732b9149116113b30b63ab2911d60891b608f820152613a4d614bf9613be4614bb5614ba7609e86018a613637565b611f4b60f21b815260020190565b7f7b2274726169745f74797065223a224f6e2d436861696e2050726f6a65637473815271101427bbb732b9149116113b30b63ab2911d60711b602082015260320190565b607d60f81b815260010190565b61236360f01b815260008451614c238160028501602089016153ac565b6c3db0b734b6b0ba34b7b71d36bb60991b6002918401918201528451614c5081600f8401602089016153ac565b600160fd1b600f92909101918201528351614c728160108401602088016153ac565b7f7320696e66696e69746520656173652d696e2d6f75743b7d00000000000000006010929091019182015260280195945050505050565b693c7265637420783d272d60b01b815260008851614cce81600a850160208d016153ac565b6770782720793d272d60c01b600a918401918201528851614cf6816012840160208d016153ac565b6a7078272077696474683d2760a81b601292909101918201528751614d2281601d840160208c016153ac565b6b707827206865696768743d2760a01b601d92909101918201528651614d4f816029840160208b016153ac565b7f7078272066696c6c3d276e6f6e6527207374726f6b653d27230000000000000060299290910191820152614ddd614dcd613be4614db8614db2614d96604287018c613637565b6f27207374726f6b652d77696474683d2760801b815260100190565b89613637565b687074272069643d276360b81b815260090190565b631390179f60e11b815260040190565b9a9950505050505050505050565b693c7265637420783d272d60b01b815260008751614e1081600a850160208c016153ac565b6770782720793d272d60c01b600a918401918201528751614e38816012840160208c016153ac565b6a7078272077696474683d2760a81b601292909101918201528651614e6481601d840160208b016153ac565b6b707827206865696768743d2760a01b601d92909101918201528551614e91816029840160208a016153ac565b6a7078272066696c6c3d272360a81b602992909101918201528451614ebd8160348401602089016153ac565b614ddd614dcd614edf60348486010166272069643d276360c81b815260070190565b87613637565b6a54696d657069656365202360a81b815260008251614f0b81600b8501602087016153ac565b91909101600b0192915050565b7f3c7465787420783d272d39383070782720793d2739323070782720666f6e742d81527f73697a653d272e38656d272069643d27746f6b656e4964272066696c6c3d2723602082015260008551614f76816040850160208a016153ac565b6e3535273e54696d657069656365202360881b6040918401918201528551614fa581604f840160208a016153ac565b661e17ba32bc3a1f60c91b604f92909101918201527f3c7465787420783d272d39383070782720793d2739343070782720666f6e742d60568201527f73697a653d272e38656d272069643d276f776e6572436e74272066696c6c3d276076820152602360f81b609682015284516150238160978401602089016153ac565b613a4d613bea614edf6097848601017f3535273e4f776e6572206f6e2d636861696e20636f756e743a200000000000008152601a0190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061508e9083018461360b565b9695505050505050565b602081526000613193602083018461360b565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526031908201527f45524337323155524953746f726167653a2055524920717565727920666f72206040820152703737b732bc34b9ba32b73a103a37b5b2b760791b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b600082198211156151e7576151e7615442565b500190565b600060ff821660ff84168060ff0382111561520957615209615442565b019392505050565b60008261522057615220615458565b500490565b600060ff83168061523857615238615458565b8060ff84160491505092915050565b600181815b8085111561528257816000190482111561526857615268615442565b8085161561527557918102915b93841c939080029061524c565b509250929050565b600061319383836000826152a05750600161032b565b816152ad5750600061032b565b81600181146152c357600281146152cd576152e9565b600191505061032b565b60ff8411156152de576152de615442565b50506001821b61032b565b5060208310610133831016604e8410600b841016171561530c575081810a61032b565b6153168383615247565b806000190482111561532a5761532a615442565b029392505050565b600081600019048311821515161561534c5761534c615442565b500290565b600060ff821660ff84168160ff048111821515161561532a5761532a615442565b60008282101561538457615384615442565b500390565b600060ff821660ff8416808210156153a3576153a3615442565b90039392505050565b60005b838110156153c75781810151838201526020016153af565b83811115610c535750506000910152565b600181811c908216806153ec57607f821691505b6020821081141561540d57634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561542757615427615442565b5060010190565b60008261543d5761543d615458565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146106d257600080fdfe3c3f786d6c2076657273696f6e3d27312e302720656e636f64696e673d275554462d38273f3e3c73766720786d6c6e733d27687474703a2f2f7777772e77332e6f72672f323030302f7376672720786d6c6e733a786c696e6b3d27687474703a2f2f7777772e77332e6f72672f313939392f786c696e6b27206865696768743d2731303030272077696474683d2731303030272076696577426f783d272d31303030202d3130303020323030302032303030273e3c7265637420783d272d313030302720793d272d31303030272077696474683d273230303027206865696768743d2732303030272066696c6c3d272366666666666627202f3e3c7374796c653e7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7ca2646970667358221220e2c8e4d3ed5b9398be13969b645ccc02f1f276a5b4b820c63191f8d6473108da64736f6c63430008070033

Deployed Bytecode Sourcemap

38029:21486:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10717:292;;;;;;:::i;:::-;;:::i;:::-;;;47816:14:1;;47809:22;47791:41;;47779:2;47764:18;10717:292:0;;;;;;;;11649:100;;;:::i;:::-;;;;;;;:::i;13109:221::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;47103:32:1;;;47085:51;;47073:2;47058:18;13109:221:0;46939:203:1;12646:397:0;;;;;;:::i;:::-;;:::i;:::-;;48736:355;;;;;;:::i;:::-;;:::i;13999:305::-;;;;;;:::i;:::-;;:::i;14375:151::-;;;;;;:::i;:::-;;:::i;11343:239::-;;;;;;:::i;:::-;;:::i;55430:425::-;;;;;;:::i;:::-;;:::i;11073:208::-;;;;;;:::i;:::-;;:::i;:::-;;;55663:25:1;;;55651:2;55636:18;11073:208:0;55517:177:1;24188:148:0;;;:::i;23537:87::-;23610:6;;-1:-1:-1;;;;;23610:6:0;23537:87;;54240:1182;;;;;;:::i;:::-;;:::i;11818:104::-;;;:::i;13402:295::-;;;;;;:::i;:::-;;:::i;14597:285::-;;;;;;:::i;:::-;;:::i;58592:829::-;;;;;;:::i;:::-;;:::i;13768:164::-;;;;;;:::i;:::-;-1:-1:-1;;;;;13889:25:0;;;13865:4;13889:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;13768:164;24491:244;;;;;;:::i;:::-;;:::i;10717:292::-;10819:4;-1:-1:-1;;;;;;10843:40:0;;-1:-1:-1;;;10843:40:0;;:105;;-1:-1:-1;;;;;;;10900:48:0;;-1:-1:-1;;;10900:48:0;10843:105;:158;;;-1:-1:-1;;;;;;;;;;7312:40:0;;;10965:36;10836:165;10717:292;-1:-1:-1;;10717:292:0:o;11649:100::-;11703:13;11736:5;11729:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11649:100;:::o;13109:221::-;13185:7;16438:16;;;:7;:16;;;;;;-1:-1:-1;;;;;16438:16:0;13205:73;;;;-1:-1:-1;;;13205:73:0;;53361:2:1;13205:73:0;;;53343:21:1;53400:2;53380:18;;;53373:30;53439:34;53419:18;;;53412:62;-1:-1:-1;;;53490:18:1;;;53483:42;53542:19;;13205:73:0;;;;;;;;;-1:-1:-1;13298:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;13298:24:0;;13109:221::o;12646:397::-;12727:13;12743:23;12758:7;12743:14;:23::i;:::-;12727:39;;12791:5;-1:-1:-1;;;;;12785:11:0;:2;-1:-1:-1;;;;;12785:11:0;;;12777:57;;;;-1:-1:-1;;;12777:57:0;;54545:2:1;12777:57:0;;;54527:21:1;54584:2;54564:18;;;54557:30;54623:34;54603:18;;;54596:62;-1:-1:-1;;;54674:18:1;;;54667:31;54715:19;;12777:57:0;54343:397:1;12777:57:0;7986:10;-1:-1:-1;;;;;12855:21:0;;;;:62;;-1:-1:-1;12880:37:0;12897:5;7986:10;13768:164;:::i;12880:37::-;12847:154;;;;-1:-1:-1;;;12847:154:0;;50987:2:1;12847:154:0;;;50969:21:1;51026:2;51006:18;;;50999:30;51065:34;51045:18;;;51038:62;51136:26;51116:18;;;51109:54;51180:19;;12847:154:0;50785:420:1;12847:154:0;13014:21;13023:2;13027:7;13014:8;:21::i;:::-;12716:327;12646:397;;:::o;48736:355::-;23610:6;;-1:-1:-1;;;;;23610:6:0;7986:10;23757:23;23749:68;;;;-1:-1:-1;;;23749:68:0;;;;;;;:::i;:::-;48827:1:::1;48813:3;48807:17;;;;;:::i;:::-;;;:21;48799:59;;;::::0;-1:-1:-1;;;48799:59:0;;55365:2:1;48799:59:0::1;::::0;::::1;55347:21:1::0;55404:2;55384:18;;;55377:30;55443:27;55423:18;;;55416:55;55488:18;;48799:59:0::1;55163:349:1::0;48799:59:0::1;48879:1;48881;48879:4;;;;;;;;:::i;:::-;;;;;;;;48873:18;;;;;:::i;:::-;:23:::0;48869:215:::1;::::0;-1:-1:-1;48869:215:0::1;;48920:3;48913:1;48915;48913:4;;;;;;;;:::i;:::-;;;;;;;;:10;;;;;;;;;;;;:::i;:::-;;48736:355:::0;:::o;48869:215::-:1;48951:1;48953;48951:4;;;;;;;;:::i;:::-;;;;;;;;48945:18;;;;;:::i;:::-;:23:::0;48941:143:::1;::::0;-1:-1:-1;48941:143:0::1;;48992:3;48985:1;48987;48985:4;;;;;;;;:::i;48941:143::-;49037:1;49023:3;49017:17;;;;;:::i;:::-;;;:21;49013:71;;;49055:9:::0;;::::1;::::0;:3:::1;::::0;:9:::1;::::0;::::1;::::0;::::1;:::i;49013:71::-;48736:355:::0;:::o;13999:305::-;14160:41;7986:10;14193:7;14160:18;:41::i;:::-;14152:103;;;;-1:-1:-1;;;14152:103:0;;;;;;;:::i;:::-;14268:28;14278:4;14284:2;14288:7;14268:9;:28::i;14375:151::-;14479:39;14496:4;14502:2;14506:7;14479:39;;;;;;;;;;;;:16;:39::i;11343:239::-;11415:7;11451:16;;;:7;:16;;;;;;-1:-1:-1;;;;;11451:16:0;11486:19;11478:73;;;;-1:-1:-1;;;11478:73:0;;52172:2:1;11478:73:0;;;52154:21:1;52211:2;52191:18;;;52184:30;52250:34;52230:18;;;52223:62;-1:-1:-1;;;52301:18:1;;;52294:39;52350:19;;11478:73:0;51970:405:1;55430:425:0;23610:6;;-1:-1:-1;;;;;23610:6:0;7986:10;23757:23;23749:68;;;;-1:-1:-1;;;23749:68:0;;;;;;;:::i;:::-;55518:3:::1;55496:19;:9;9077:14:::0;;8985:114;55496:19:::1;:25;55488:60;;;::::0;-1:-1:-1;;;55488:60:0;;49463:2:1;55488:60:0::1;::::0;::::1;49445:21:1::0;49502:2;49482:18;;;49475:30;49541:25;49521:18;;;49514:53;49584:18;;55488:60:0::1;49261:347:1::0;55488:60:0::1;55564:6;55559:289;55580:1;55576;:5;55559:289;;;55607:9;9077:14:::0;55630:3:::1;55607:26;55603:101;;;48913:10;48736:355:::0;:::o;55603:101::-:1;55718:21;:9;9196:19:::0;;9214:1;9196:19;;;9107:127;55718:21:::1;55754:17;55774:19;:9;9077:14:::0;;8985:114;55774:19:::1;55754:39;;55808:28;55814:10;55826:9;55808:5;:28::i;:::-;-1:-1:-1::0;55583:3:0;::::1;::::0;::::1;:::i;:::-;;;;55559:289;;11073:208:::0;11145:7;-1:-1:-1;;;;;11173:19:0;;11165:74;;;;-1:-1:-1;;;11165:74:0;;51761:2:1;11165:74:0;;;51743:21:1;51800:2;51780:18;;;51773:30;51839:34;51819:18;;;51812:62;-1:-1:-1;;;51890:18:1;;;51883:40;51940:19;;11165:74:0;51559:406:1;11165:74:0;-1:-1:-1;;;;;;11257:16:0;;;;;:9;:16;;;;;;;11073:208::o;24188:148::-;23610:6;;-1:-1:-1;;;;;23610:6:0;7986:10;23757:23;23749:68;;;;-1:-1:-1;;;23749:68:0;;;;;;;:::i;:::-;24279:6:::1;::::0;24258:40:::1;::::0;24295:1:::1;::::0;-1:-1:-1;;;;;24279:6:0::1;::::0;24258:40:::1;::::0;24295:1;;24258:40:::1;24309:6;:19:::0;;-1:-1:-1;;;;;;24309:19:0::1;::::0;;24188:148::o;54240:1182::-;54312:13;54352:3;54346:17;;;;;:::i;:::-;:22;;-1:-1:-1;54338:55:0;;;;-1:-1:-1;;;54338:55:0;;51412:2:1;54338:55:0;;;51394:21:1;51451:2;51431:18;;;51424:30;-1:-1:-1;;;51470:18:1;;;51463:50;51530:18;;54338:55:0;51210:344:1;54338:55:0;16414:4;16438:16;;;:7;:16;;;;;;-1:-1:-1;;;;;16438:16:0;54404:78;;;;-1:-1:-1;;;54404:78:0;;;;;;;:::i;:::-;54494:15;54514:31;54528:16;54536:7;54528;:16::i;:::-;54514:13;:31::i;:::-;54493:52;;;54557:14;54577:22;54591:7;54577:13;:22::i;:::-;54556:43;;;;54620:12;54695:7;54673:19;54646:16;54654:7;54646;:16::i;:::-;-1:-1:-1;;;;;54646:24:0;;:46;;;;:::i;:::-;54635:8;54642:1;54635:6;:8;:::i;:::-;:57;;;;:::i;:::-;:67;;;;:::i;:::-;54620:82;;54724:2;54717:4;:9;54713:51;;;-1:-1:-1;54750:2:0;54713:51;54784:21;54808:29;54823:7;54832:4;54808:14;:29::i;:::-;54784:53;-1:-1:-1;54784:53:0;55012:27;55029:9;:6;55036:2;55029:9;:::i;:::-;55012:16;:27::i;:::-;55064:22;55077:8;55064:12;:22::i;:::-;54867:231;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54850:249;;55146:7;55155:26;55167:7;55176:4;55155:11;:26::i;:::-;55129:53;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;55129:53:0;;;;;;55233:9;;;;;;;;;;55129:53;;-1:-1:-1;55196:17:0;;55129:53;55233:9;55129:53;55233:9;;;55244:7;55270:15;55277:7;55270:6;:15::i;:::-;55287:20;55299:7;55287:11;:20::i;:::-;55309:31;55322:7;55331:8;55309:12;:31::i;:::-;55216:168;;;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;55216:168:0;;;;;;;54240:1182;-1:-1:-1;;;;;;;;54240:1182:0:o;11818:104::-;11874:13;11907:7;11900:14;;;;;:::i;13402:295::-;-1:-1:-1;;;;;13505:24:0;;7986:10;13505:24;;13497:62;;;;-1:-1:-1;;;13497:62:0;;50220:2:1;13497:62:0;;;50202:21:1;50259:2;50239:18;;;50232:30;50298:27;50278:18;;;50271:55;50343:18;;13497:62:0;50018:349:1;13497:62:0;7986:10;13572:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;13572:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;13572:53:0;;;;;;;;;;13641:48;;47791:41:1;;;13572:42:0;;7986:10;13641:48;;47764:18:1;13641:48:0;;;;;;;13402:295;;:::o;14597:285::-;14729:41;7986:10;14762:7;14729:18;:41::i;:::-;14721:103;;;;-1:-1:-1;;;14721:103:0;;;;;;;:::i;:::-;14835:39;14849:4;14855:2;14859:7;14868:5;14835:13;:39::i;:::-;14597:285;;;;:::o;58592:829::-;58657:13;58697:3;58691:17;;;;;:::i;:::-;:20;;-1:-1:-1;58683:53:0;;;;-1:-1:-1;;;58683:53:0;;51412:2:1;58683:53:0;;;51394:21:1;51451:2;51431:18;;;51424:30;-1:-1:-1;;;51470:18:1;;;51463:50;51530:18;;58683:53:0;51210:344:1;58683:53:0;16414:4;16438:16;;;:7;:16;;;;;;-1:-1:-1;;;;;16438:16:0;58747:78;;;;-1:-1:-1;;;58747:78:0;;;;;;;:::i;:::-;58846:17;58935:25;58952:7;58935:16;:25::i;:::-;58903:58;;;;;;;;:::i;:::-;;;;;;;;;;;;;59170:23;59185:7;59170:14;:23::i;:::-;59300:18;59307:7;59316:1;59300:6;:18::i;:::-;58866:459;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58846:479;;59397:4;59360:42;;;;;;;;:::i;:::-;;;;;;;;;;;;;59346:57;;;58592:829;;;:::o;24491:244::-;23610:6;;-1:-1:-1;;;;;23610:6:0;7986:10;23757:23;23749:68;;;;-1:-1:-1;;;23749:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;24580:22:0;::::1;24572:73;;;::::0;-1:-1:-1;;;24572:73:0;;48699:2:1;24572:73:0::1;::::0;::::1;48681:21:1::0;48738:2;48718:18;;;48711:30;48777:34;48757:18;;;48750:62;-1:-1:-1;;;48828:18:1;;;48821:36;48874:19;;24572:73:0::1;48497:402:1::0;24572:73:0::1;24682:6;::::0;24661:38:::1;::::0;-1:-1:-1;;;;;24661:38:0;;::::1;::::0;24682:6:::1;::::0;24661:38:::1;::::0;24682:6:::1;::::0;24661:38:::1;24710:6;:17:::0;;-1:-1:-1;;;;;;24710:17:0::1;-1:-1:-1::0;;;;;24710:17:0;;;::::1;::::0;;;::::1;::::0;;24491:244::o;20234:174::-;20309:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;20309:29:0;-1:-1:-1;;;;;20309:29:0;;;;;;;;:24;;20363:23;20309:24;20363:14;:23::i;:::-;-1:-1:-1;;;;;20354:46:0;;;;;;;;;;;20234:174;;:::o;16643:348::-;16736:4;16438:16;;;:7;:16;;;;;;-1:-1:-1;;;;;16438:16:0;16753:73;;;;-1:-1:-1;;;16753:73:0;;50574:2:1;16753:73:0;;;50556:21:1;50613:2;50593:18;;;50586:30;50652:34;50632:18;;;50625:62;-1:-1:-1;;;50703:18:1;;;50696:42;50755:19;;16753:73:0;50372:408:1;16753:73:0;16837:13;16853:23;16868:7;16853:14;:23::i;:::-;16837:39;;16906:5;-1:-1:-1;;;;;16895:16:0;:7;-1:-1:-1;;;;;16895:16:0;;:51;;;;16939:7;-1:-1:-1;;;;;16915:31:0;:20;16927:7;16915:11;:20::i;:::-;-1:-1:-1;;;;;16915:31:0;;16895:51;:87;;;-1:-1:-1;;;;;;13889:25:0;;;13865:4;13889:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;16950:32;16887:96;16643:348;-1:-1:-1;;;;16643:348:0:o;19572:544::-;19697:4;-1:-1:-1;;;;;19670:31:0;:23;19685:7;19670:14;:23::i;:::-;-1:-1:-1;;;;;19670:31:0;;19662:85;;;;-1:-1:-1;;;19662:85:0;;54135:2:1;19662:85:0;;;54117:21:1;54174:2;54154:18;;;54147:30;54213:34;54193:18;;;54186:62;-1:-1:-1;;;54264:18:1;;;54257:39;54313:19;;19662:85:0;53933:405:1;19662:85:0;-1:-1:-1;;;;;19766:16:0;;19758:65;;;;-1:-1:-1;;;19758:65:0;;49815:2:1;19758:65:0;;;49797:21:1;49854:2;49834:18;;;49827:30;49893:34;49873:18;;;49866:62;-1:-1:-1;;;49944:18:1;;;49937:34;49988:19;;19758:65:0;49613:400:1;19758:65:0;19940:29;19957:1;19961:7;19940:8;:29::i;:::-;-1:-1:-1;;;;;19982:15:0;;;;;;:9;:15;;;;;:20;;20001:1;;19982:15;:20;;20001:1;;19982:20;:::i;:::-;;;;-1:-1:-1;;;;;;;20013:13:0;;;;;;:9;:13;;;;;:18;;20030:1;;20013:13;:18;;20030:1;;20013:18;:::i;:::-;;;;-1:-1:-1;;20042:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;20042:21:0;-1:-1:-1;;;;;20042:21:0;;;;;;;;;20081:27;;20042:16;;20081:27;;;;;;;19572:544;;;:::o;18264:382::-;-1:-1:-1;;;;;18344:16:0;;18336:61;;;;-1:-1:-1;;;18336:61:0;;52582:2:1;18336:61:0;;;52564:21:1;;;52601:18;;;52594:30;52660:34;52640:18;;;52633:62;52712:18;;18336:61:0;52380:356:1;18336:61:0;16414:4;16438:16;;;:7;:16;;;;;;-1:-1:-1;;;;;16438:16:0;:30;18408:58;;;;-1:-1:-1;;;18408:58:0;;49106:2:1;18408:58:0;;;49088:21:1;49145:2;49125:18;;;49118:30;49184;49164:18;;;49157:58;49232:18;;18408:58:0;48904:352:1;18408:58:0;-1:-1:-1;;;;;18537:13:0;;;;;;:9;:13;;;;;:18;;18554:1;;18537:13;:18;;18554:1;;18537:18;:::i;:::-;;;;-1:-1:-1;;18566:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;18566:21:0;-1:-1:-1;;;;;18566:21:0;;;;;;;;18605:33;;18566:16;;;18605:33;;18566:16;;18605:33;18264:382;;:::o;51055:2176::-;51192:17;;;51206:2;51192:17;;;;;;;;;51114:7;;;;;;51192:17;;;;;;;;;;-1:-1:-1;;51236:71:0;;-1:-1:-1;;;51236:71:0;;-1:-1:-1;;;;;47103:32:1;;51236:71:0;;;47085:51:1;51162:47:0;;-1:-1:-1;51248:42:0;;51236:65;;47058:18:1;;51236:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51220:10;51231:1;51220:13;;;;;;;;:::i;:::-;;;;;;;;;;:87;51352:71;;-1:-1:-1;;;51352:71:0;;-1:-1:-1;;;;;47103:32:1;;51352:71:0;;;47085:51:1;51364:42:0;;51352:65;;47058:18:1;;51352:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51336:10;51347:1;51336:13;;;;;;;;:::i;:::-;;;;;;;;;;:87;51464:71;;-1:-1:-1;;;51464:71:0;;-1:-1:-1;;;;;47103:32:1;;51464:71:0;;;47085:51:1;51476:42:0;;51464:65;;47058:18:1;;51464:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51448:10;51459:1;51448:13;;;;;;;;:::i;:::-;;;;;;;;;;:87;51577:71;;-1:-1:-1;;;51577:71:0;;-1:-1:-1;;;;;47103:32:1;;51577:71:0;;;47085:51:1;51589:42:0;;51577:65;;47058:18:1;;51577:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51561:10;51572:1;51561:13;;;;;;;;:::i;:::-;;;;;;;;;;:87;51689:71;;-1:-1:-1;;;51689:71:0;;-1:-1:-1;;;;;47103:32:1;;51689:71:0;;;47085:51:1;51701:42:0;;51689:65;;47058:18:1;;51689:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51673:10;51684:1;51673:13;;;;;;;;:::i;:::-;;;;;;;;;;:87;51799:71;;-1:-1:-1;;;51799:71:0;;-1:-1:-1;;;;;47103:32:1;;51799:71:0;;;47085:51:1;51811:42:0;;51799:65;;47058:18:1;;51799:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51783:10;51794:1;51783:13;;;;;;;;:::i;:::-;;;;;;;;;;:87;51909:71;;-1:-1:-1;;;51909:71:0;;-1:-1:-1;;;;;47103:32:1;;51909:71:0;;;47085:51:1;51921:42:0;;51909:65;;47058:18:1;;51909:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51893:10;51904:1;51893:13;;;;;;;;:::i;:::-;;;;;;;;;;:87;52021:71;;-1:-1:-1;;;52021:71:0;;-1:-1:-1;;;;;47103:32:1;;52021:71:0;;;47085:51:1;52033:42:0;;52021:65;;47058:18:1;;52021:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52005:10;52016:1;52005:13;;;;;;;;:::i;:::-;;;;;;;;;;:87;52132:71;;-1:-1:-1;;;52132:71:0;;-1:-1:-1;;;;;47103:32:1;;52132:71:0;;;47085:51:1;52144:42:0;;52132:65;;47058:18:1;;52132:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52116:10;52127:1;52116:13;;;;;;;;:::i;:::-;;;;;;;;;;:87;52244:71;;-1:-1:-1;;;52244:71:0;;-1:-1:-1;;;;;47103:32:1;;52244:71:0;;;47085:51:1;52256:42:0;;52244:65;;47058:18:1;;52244:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52228:10;52239:1;52228:13;;;;;;;;:::i;:::-;;;;;;;;;;:87;52354:71;;-1:-1:-1;;;52354:71:0;;-1:-1:-1;;;;;47103:32:1;;52354:71:0;;;47085:51:1;52366:42:0;;52354:65;;47058:18:1;;52354:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52337:10;52348:2;52337:14;;;;;;;;:::i;:::-;;;;;;;;;;:88;52464:71;;-1:-1:-1;;;52464:71:0;;-1:-1:-1;;;;;47103:32:1;;52464:71:0;;;47085:51:1;52476:42:0;;52464:65;;47058:18:1;;52464:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52447:10;52458:2;52447:14;;;;;;;;:::i;:::-;;;;;;;;;;:88;52589:71;;-1:-1:-1;;;52589:71:0;;-1:-1:-1;;;;;47103:32:1;;52589:71:0;;;47085:51:1;52601:42:0;;52589:65;;47058:18:1;;52589:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52572:10;52583:2;52572:14;;;;;;;;:::i;:::-;;;;;;;;;;:88;52710:71;;-1:-1:-1;;;52710:71:0;;-1:-1:-1;;;;;47103:32:1;;52710:71:0;;;47085:51:1;52722:42:0;;52710:65;;47058:18:1;;52710:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52693:10;52704:2;52693:14;;;;;;;;:::i;:::-;;;;;;;;;;:88;52822:71;;-1:-1:-1;;;52822:71:0;;-1:-1:-1;;;;;47103:32:1;;52822:71:0;;;47085:51:1;52834:42:0;;52822:65;;47058:18:1;;52822:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52805:10;52816:2;52805:14;;;;;;;;:::i;:::-;;;;;;:88;;;;;52926:15;52956:16;52992:9;52987:191;53011:2;53007:1;:6;52987:191;;;53054:10;53065:1;53054:13;;;;;;;;:::i;:::-;;;;;;;53044:7;:23;;;;:::i;:::-;53034:33;;53102:1;53086:10;53097:1;53086:13;;;;;;;;:::i;:::-;;;;;;;:17;53082:85;;;53135:12;:8;53146:1;53135:12;:::i;:::-;53124:23;;53082:85;53015:3;;;;:::i;:::-;;;;52987:191;;;-1:-1:-1;53205:7:0;;53214:8;;-1:-1:-1;51055:2176:0;-1:-1:-1;;;51055:2176:0:o;45967:295::-;46029:7;;;46147:1;46132:11;46142:1;46132:7;:11;:::i;:::-;46131:17;;;;:::i;:::-;:21;;46151:1;46131:21;:::i;:::-;46127:26;;:1;:26;:::i;:::-;46172:11;46182:1;46172:7;:11;:::i;:::-;:16;:24;;46195:1;46172:24;;;46191:1;46172:24;46215:11;46225:1;46215:7;:11;:::i;:::-;:16;:24;;46238:1;46215:24;;;46234:1;46215:24;46102:152;;;;;;;-1:-1:-1;46102:152:0;;;-1:-1:-1;45967:295:0;-1:-1:-1;;45967:295:0:o;53276:307::-;53379:26;;;;;;;;;:21;:26;;;53353:13;;53379:26;53416:127;53440:4;53436:1;:8;53416:127;;;53500:7;53509:20;53519:1;53521:7;53509:9;:20::i;:::-;53483:47;;;;;;;;;:::i;:::-;;;;;;;;;;;;;53466:65;;53446:3;;;;;:::i;:::-;;;;53416:127;;;-1:-1:-1;53568:7:0;53276:307;-1:-1:-1;;;53276:307:0:o;33727:723::-;33783:13;34004:10;34000:53;;-1:-1:-1;;34031:10:0;;;;;;;;;;;;-1:-1:-1;;;34031:10:0;;;;;33727:723::o;34000:53::-;34078:5;34063:12;34119:78;34126:9;;34119:78;;34152:8;;;;:::i;:::-;;-1:-1:-1;34175:10:0;;-1:-1:-1;34183:2:0;34175:10;;:::i;:::-;;;34119:78;;;34207:19;34239:6;34229:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34229:17:0;;34207:39;;34257:154;34264:10;;34257:154;;34291:11;34301:1;34291:11;;:::i;:::-;;-1:-1:-1;34360:10:0;34368:2;34360:5;:10;:::i;:::-;34347:24;;:2;:24;:::i;:::-;34334:39;;34317:6;34324;34317:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;34317:56:0;;;;;;;;-1:-1:-1;34388:11:0;34397:2;34388:11;;:::i;:::-;;;34257:154;;44024:454;44086:13;44112:11;44171:3;44164:5;44146:11;:8;44155:2;44146:11;:::i;:::-;:14;;44158:2;44146:14;:::i;:::-;44128:32;;:15;:32;:::i;:::-;44127:42;;;;:::i;:::-;44126:48;;;;:::i;:::-;44112:62;;44185:21;44289;44306:3;44289:16;:21::i;:::-;44357:25;44374:7;:3;44378;44374:7;:::i;44357:25::-;44216:228;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;44216:228:0;;;;;;;;;;44024:454;-1:-1:-1;;;;44024:454:0:o;53626:586::-;53700:13;53729;53746:22;53760:7;53746:13;:22::i;:::-;53779:26;;;;;;;;;:21;:26;;53726:42;;-1:-1:-1;53779:26:0;-1:-1:-1;53828:4:0;;-1:-1:-1;53843:329:0;53850:6;;53843:329;;53901:5;53905:1;53901;:5;:::i;:::-;53897:9;-1:-1:-1;53925:10:0;53921:240;;53990:7;53999:22;54010:1;54013:7;53999:10;:22::i;:::-;53973:49;;;;;;;;;:::i;:::-;;;;;;;;;;;;;53956:67;;53843:329;;53921:240;54106:7;54115:20;54124:1;54127:7;54115:8;:20::i;53843:329::-;-1:-1:-1;54197:7:0;53626:586;-1:-1:-1;;;;53626:586:0:o;44546:1371::-;44601:13;44628:14;44648:22;44662:7;44648:13;:22::i;:::-;44627:43;;;;44691:21;44811:27;44831:6;44828:2;:9;;;;:::i;44811:27::-;44868:29;44885:11;44890:6;44885:4;:11;:::i;44868:29::-;44949:36;44978:6;44966:11;44978:6;44966:4;:11;:::i;:::-;:18;;;;:::i;44949:36::-;45187:15;45191:1;45194:7;45187:3;:15::i;:::-;45356;45360:1;45363:7;45356:3;:15::i;:::-;44722:689;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;44691:721;;45467:7;45499:14;45505:7;45499:5;:14::i;:::-;45622:12;45626:7;45622:3;:12::i;:::-;45816:15;45820:1;45823:7;45816:3;:15::i;:::-;45450:431;;;;;;;;;;;:::i;46340:2322::-;46400:13;46427:15;46447:31;46461:16;46469:7;46461;:16::i;46447:31::-;46426:52;;;46490:14;46510:22;46524:7;46510:13;:22::i;:::-;46489:43;;;;46553:21;46714:12;46718:7;46714:3;:12::i;:::-;46747:25;46764:7;46747:16;:25::i;:::-;46898:12;46902:7;46898:3;:12::i;:::-;46959:25;46976:7;46959:16;:25::i;:::-;46584:440;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;46553:472;;47080:7;47196:12;47200:7;47196:3;:12::i;:::-;47371;47375:7;47371:3;:12::i;:::-;47402:39;47424:16;47432:7;47424;:16::i;:::-;47402:21;:39::i;:::-;47063:418;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47046:436;;47545:7;47645:12;47649:7;47645:3;:12::i;:::-;47751:24;47768:6;47751:16;:24::i;:::-;47881:12;47885:7;47881:3;:12::i;:::-;47983:15;47987:1;47990:7;47983:3;:15::i;:::-;47528:510;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47511:528;;48094:7;48199:12;48203:7;48199:3;:12::i;:::-;48300:30;48317:12;48300:16;:30::i;:::-;48451:12;48455:7;48451:3;:12::i;:::-;48553:37;48570:19;48583:6;48570:12;:19;:::i;48553:37::-;48077:549;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;48077:549:0;;;;;;;;;;46340:2322;-1:-1:-1;;;;;46340:2322:0:o;43553:435::-;43632:13;43658:11;43717:3;43710:5;43692:11;:8;43701:2;43692:11;:::i;:::-;:14;;43704:2;43692:14;:::i;:::-;43674:32;;:15;:32;:::i;:::-;43673:42;;;;:::i;:::-;43672:48;;;;:::i;:::-;43658:62;;43731:21;43881;43898:3;43881:16;:21::i;:::-;43933:12;43937:7;43933:3;:12::i;:::-;43762:192;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;43762:192:0;;;;;;;43553:435;-1:-1:-1;;;;;43553:435:0:o;15764:272::-;15878:28;15888:4;15894:2;15898:7;15878:9;:28::i;:::-;15925:48;15948:4;15954:2;15958:7;15967:5;15925:22;:48::i;:::-;15917:111;;;;-1:-1:-1;;;15917:111:0;;;;;;;:::i;38496:891::-;38559:13;38586:14;38602:13;38617;38634:22;38648:7;38634:13;:22::i;:::-;38585:71;;;;;;38668:15;38685:16;38705:31;38719:16;38727:7;38719;:16::i;38705:31::-;38667:69;;;;38747:21;38771:5;38780:1;38771:10;:29;;;;;;;;;;;;;;;-1:-1:-1;;;38771:29:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;38771:29:0;;;;38747:53;-1:-1:-1;38811:21:0;38835:10;;:33;;;;;;;;;;;;;;;-1:-1:-1;;;38835:33:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;38835:33:0;;;;38811:57;;38879:21;38977:24;38994:6;38977:16;:24::i;:::-;39065:7;39130;39210:25;39227:7;39210:16;:25::i;:::-;39310:26;39327:8;39310:16;:26::i;:::-;38910:442;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;38910:442:0;;;;;;;;;;38496:891;-1:-1:-1;;;;;;;;;;38496:891:0:o;42614:906::-;42683:13;42720:14;42737:13;42754:22;42768:7;42754:13;:22::i;:::-;42719:57;;;;;42797:19;42838:1;42819:16;42822:1;42824;42822:3;;;;:::i;:::-;42827:7;42819:2;:16::i;:::-;:20;;;;:::i;:::-;:23;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42819:34:0;;;;42797:56;-1:-1:-1;42864:19:0;42905:1;42886:16;42889:3;:1;42905;42889:3;:::i;:::-;42894:7;42886:2;:16::i;:::-;:20;;;;:::i;:::-;:23;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42886:34:0;;;;42864:56;-1:-1:-1;42931:15:0;;42983:10;42996:9;:6;43003:2;42996:9;:::i;:::-;42983:22;-1:-1:-1;43030:10:0;43026:387;;43072:42;43107:2;43090:14;43093:1;43096:7;43090:2;:14::i;:::-;:19;;;;:::i;:::-;43089:24;;43111:2;43089:24;:::i;43072:42::-;43068:46;-1:-1:-1;43133:44:0;43170:2;43151:16;43154:3;:1;43156;43154:3;:::i;:::-;43159:7;43151:2;:16::i;43133:44::-;43129:48;;43026:387;;;43219:10;43232:5;43236:1;43232;:5;:::i;:::-;43219:18;-1:-1:-1;43252:10:0;43265:6;43219:18;43265:1;:6;:::i;:::-;43252:19;;43290:45;43328:2;43311:14;43314:1;43317:7;43311:2;:14::i;:::-;:19;;;;:::i;:::-;43307:24;;:2;:24;:::i;43290:45::-;43286:49;-1:-1:-1;43354:47:0;43394:2;43375:16;43378:3;:1;43380;43378:3;:::i;:::-;43383:7;43375:2;:16::i;:::-;:21;;;;:::i;:::-;43371:26;;:2;:26;:::i;43354:47::-;43350:51;;43195:218;;43026:387;43454:33;43465:1;43468;43471;43474:5;43481;43454:10;:33::i;:::-;43489:17;43500:1;43503:2;43489:10;:17::i;:::-;43437:70;;;;;;;;;:::i;:::-;;;;;;;;;;;;;43423:85;;;;;;;;;42614:906;;;;:::o;39432:679::-;39502:13;39528:16;39547:46;39582:3;39565:14;39568:1;39571:7;39565:2;:14::i;:::-;:20;;;;:::i;:::-;:23;;39586:2;39565:23;:::i;:::-;39564:28;;39590:2;39564:28;:::i;39547:46::-;39528:65;;39604:18;39625:14;39628:1;39631:7;39625:2;:14::i;:::-;39604:35;;39705:1;39688:14;39691:1;39694:7;39688:2;:14::i;:::-;:18;;;;:::i;:::-;39684:187;;39759:1;39761;39759:4;;;;;;;;:::i;:::-;;;;;;;;39765:2;39805:4;39822:19;39839:1;39822:16;:19::i;:::-;39742:108;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;39728:123;;;;;;39684:187;39913:1;39915;39913:4;;;;;;;;:::i;:::-;;;;;;;;39919:2;39957:4;39995:39;40029:2;40012:14;40015:1;40018:7;40012:2;:14::i;:::-;:19;;;;:::i;:::-;:21;;40032:1;40012:21;:::i;39995:39::-;40066:19;40083:1;40066:16;:19::i;:::-;39896:198;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;39882:213;;;;39432:679;;;;:::o;40158:1076::-;40226:13;40252:10;40283:3;40266:14;40269:1;40272:7;40266:2;:14::i;:::-;:20;;;;:::i;:::-;:23;;40287:2;40266:23;:::i;:::-;40265:28;;40291:2;40265:28;:::i;:::-;40252:41;;40304:18;40325:14;40328:1;40331:7;40325:2;:14::i;:::-;40304:35;;40350:20;40373;40390:2;40373:16;:20::i;:::-;40350:43;-1:-1:-1;40404:21:0;40428:22;40445:4;:2;40448:1;40445:4;:::i;40428:22::-;40404:46;;40515:1;40499:13;40502:1;40504:7;40499:2;:13::i;:::-;:17;;;;:::i;:::-;40495:351;;40604:6;40645;40689:7;40735;40780:4;40797:19;40814:1;40797:16;:19::i;:::-;40552:273;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;40538:288;;;;;;;;40495:351;40919:6;40956;40996:7;41038;41093:4;41119:39;41153:2;41136:14;41139:1;41142:7;41136:2;:14::i;41119:39::-;41190:19;41207:1;41190:16;:19::i;:::-;40871:347;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;40857:362;;;;;;40158:1076;;;;:::o;57081:1022::-;57144:13;57172;57190:22;57204:7;57190:13;:22::i;:::-;57170:42;;;;57223:19;57253:20;57265:7;57253:11;:20::i;:::-;57307:15;;;57320:1;57307:15;;;;;;;;;57245:29;;;;;;-1:-1:-1;57285:19:0;;57307:15;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57285:37:0;-1:-1:-1;57337:10:0;57333:763;;57386:27;;;;;;;;;;;;;;-1:-1:-1;;;57386:27:0;;;57402:1;57405:7;57386:4;:27::i;:::-;57377:3;57381:1;57377:6;;;;;;;;:::i;:::-;;;;;;:36;;;;57438:29;;;;;;;;;;;;;;-1:-1:-1;;;57438:29:0;;;57454:1;57456;57454:3;;;;:::i;:::-;57459:7;57438:4;:29::i;:::-;57429:3;57433:1;57429:6;;;;;;;;:::i;:::-;;;;;;:38;;;;57491:29;;;;;;;;;;;;;;-1:-1:-1;;;57491:29:0;;;57507:1;57509;57507:3;;;;:::i;57491:29::-;57482:3;57486:1;57482:6;;;;;;;;:::i;:::-;;;;;;:38;;;;57584:3;57588:1;57584:6;;;;;;;;:::i;:::-;;;;;;;57592:19;57596:11;57609:1;57592:3;:19::i;:::-;57630:3;57634:1;57630:6;;;;;;;;:::i;:::-;;;;;;;57638:21;57642:11;57655:1;57657;57655:3;;;;:::i;:::-;57638;:21::i;:::-;57678:3;57682:1;57678:6;;;;;;;;:::i;:::-;;;;;;;57686:21;57690:11;57703:1;57705;57703:3;;;;:::i;57686:21::-;57549:159;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57535:174;;;;;;;57333:763;57765:26;;;;;;;;;;;;;;-1:-1:-1;;;57765:26:0;;;57780:1;57783:7;57765:4;:26::i;:::-;57756:3;57760:1;57756:6;;;;;;;;:::i;:::-;;;;;;:35;;;;57815:28;;;;;;;;;;;;;;-1:-1:-1;;;57815:28:0;;;57830:1;57832;57830:3;;;;:::i;57815:28::-;57806:3;57810:1;57806:6;;;;;;;;:::i;:::-;;;;;;:37;;;;57867:28;;;;;;;;;;;;;;-1:-1:-1;;;57867:28:0;;;57882:1;57884;57882:3;;;;:::i;49981:1007::-;50035:13;50071:21;50334:12;50338:7;50334:3;:12::i;:::-;50419:15;50423:1;50426:7;50419:3;:15::i;:::-;50102:383;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50071:415;;50541:7;50763:12;50767:7;50763:3;:12::i;:::-;50876:15;50880:1;50883:7;50876:3;:15::i;:::-;50524:410;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;50524:410:0;;;;;;;;;;49981:1007;-1:-1:-1;;;49981:1007:0:o;58134:223::-;58186:13;58214;58232:22;58246:7;58232:13;:22::i;:::-;-1:-1:-1;58212:42:0;-1:-1:-1;;58269:10:0;58265:58;;-1:-1:-1;;58296:15:0;;;;;;;;;;;;-1:-1:-1;;;58296:15:0;;;;;58134:223;-1:-1:-1;58134:223:0:o;58265:58::-;-1:-1:-1;;58334:15:0;;;;;;;;;;;;-1:-1:-1;;;58334:15:0;;;;;58134:223;-1:-1:-1;58134:223:0:o;35566:463::-;35666:13;;;35676:2;35666:13;;;35623;35666;;;;;;35649:14;;35666:13;;;;;;;;;;;-1:-1:-1;35666:13:0;35649:30;;35695:6;35690:305;35711:2;35707:1;:6;35690:305;;;35735:8;35786:6;35791:1;35786:2;:6;:::i;:::-;35783:10;;:1;:10;:::i;:::-;35779:15;;:1;:15;:::i;:::-;35759:36;;-1:-1:-1;;;;;35759:16:0;;:36;:::i;:::-;35746:51;;35735:62;;35812:9;35842:2;35837:1;35831:8;;:13;;;;:::i;:::-;35824:21;;35812:33;;35860:9;35901:2;35895:9;;35890:2;:14;;;;:::i;:::-;35885:1;35879:8;;:25;;;;:::i;:::-;35872:33;;35860:45;;35929:8;35934:2;35929:4;:8::i;:::-;35920:1;35922:3;35924:1;35922;:3;:::i;:::-;35920:6;;;;;;;;:::i;:::-;;;;:17;-1:-1:-1;;;;;35920:17:0;;;;;;;;;35963:8;35968:2;35963:4;:8::i;:::-;35952:1;35954:3;35956:1;35954;:3;:::i;:::-;:5;;35958:1;35954:5;:::i;:::-;35952:8;;;;;;;;:::i;:::-;;;;:19;-1:-1:-1;;;;;35952:19:0;;;;;;;;;35720:275;;;35715:3;;;;;:::i;:::-;;;;35690:305;;;-1:-1:-1;36019:1:0;35566:463;-1:-1:-1;;35566:463:0:o;49158:755::-;49224:13;49264:4;49272:1;49264:9;49260:241;;;49290:14;49338:2;49308:26;49324:10;49308:13;:26;:::i;:::-;49307:33;;;;:::i;:::-;49290:50;;49368:2;49359:6;:11;49355:63;;;-1:-1:-1;49400:2:0;49355:63;49439:50;;;;;;;;;;;;-1:-1:-1;;;49439:50:0;;;;;;-1:-1:-1;49480:8:0;:6;49487:1;49480:8;:::i;:::-;49439:17;:50::i;:::-;49432:57;;;;;49260:241;49522:15;49538:16;49558:31;49572:16;49580:7;49572;:16::i;49558:31::-;49521:68;;;;49614:2;49604:7;:12;49600:57;;;49643:2;49633:12;;49600:57;49681:9;49677:229;;49715:68;;;;;;;;;;;;;;;;;;49772:1;49775:7;49715:17;:68::i;:::-;49708:75;;;;;;49677:229;49823:71;;;;;;;;;;;;;;;;;;49880:1;49883:10;49885:8;49883:1;:10;:::i;20973:843::-;21094:4;-1:-1:-1;;;;;21120:13:0;;26613:20;26652:8;21116:693;;21156:72;;-1:-1:-1;;;21156:72:0;;-1:-1:-1;;;;;21156:36:0;;;;;:72;;7986:10;;21207:4;;21213:7;;21222:5;;21156:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21156:72:0;;;;;;;;-1:-1:-1;;21156:72:0;;;;;;;;;;;;:::i;:::-;;;21152:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21402:13:0;;21398:341;;21445:60;;-1:-1:-1;;;21445:60:0;;;;;;;:::i;21398:341::-;21689:6;21683:13;21674:6;21670:2;21666:15;21659:38;21152:602;-1:-1:-1;;;;;;21279:55:0;-1:-1:-1;;;21279:55:0;;-1:-1:-1;21272:62:0;;21116:693;-1:-1:-1;21793:4:0;20973:843;;;;;;:::o;58400:180::-;58462:7;58482:19;58504:20;58516:7;58504:11;:20::i;:::-;58482:42;;58556:11;58568:1;58556:14;;;;;;;:::i;:::-;;;58400:180;-1:-1:-1;;;;58400:180:0:o;41316:898::-;41483:13;41519:21;41627:19;41644:1;41627:16;:19::i;:::-;41648:1;41650;41648:4;;;;;;;;:::i;:::-;;;;;;;;41674:5;41668:19;41689:1;41668:22;:33;;;;;;;;;;;;;;;-1:-1:-1;;;41668:33:0;;;;;;;;;;;;;;;;;;;41704:1;41734:5;41728:19;41749:1;41728:22;:33;;;;;;;;;;;;;;;-1:-1:-1;;;41728:33:0;;;;;;;;;;;;;;;;;;;41764:1;41550:335;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;41519:367;;41931:7;41973:5;41967:19;41988:1;41967:22;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;41967:33:0;;;;42003:1;42033:5;42027:19;42048:1;42027:22;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42027:33:0;;;;42063:1;41914:248;;;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;41914:248:0;;;;;;;41316:898;-1:-1:-1;;;;;;;41316:898:0:o;42247:305::-;42312:13;42338:21;42392:19;42409:1;42392:16;:19::i;:::-;42443;42460:1;42443:16;:19::i;:::-;42469:20;42486:2;42469:16;:20::i;:::-;42369:149;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;42369:149:0;;;;;;;42247:305;-1:-1:-1;;;;42247:305:0:o;56281:230::-;56343:13;56369:19;56399:20;56411:7;56399:11;:20::i;:::-;56391:29;;56369:51;;56438:61;56456:34;56478:11;56456:21;:34::i;:::-;56492:1;56495:3;56492:1;56497;56495:3;:::i;56809:235::-;56869:7;56890:14;56910:22;56924:7;56910:13;:22::i;:::-;56889:43;;;;56985:16;56993:7;56985;:16::i;:::-;57003:21;57018:6;57003:12;:21;:::i;:::-;56968:66;;8845:2:1;8841:15;;;;-1:-1:-1;;8837:53:1;56968:66:0;;;8825::1;8907:12;;;8900:28;8944:12;;;8937:28;;;8981:12;;56968:66:0;;;;;;;;;;;;56958:77;;;;;;56943:93;;;56809:235;;;:::o;56549:184::-;56633:13;56666:59;56684:4;56704:1;56690:13;56693:1;56695:7;56690:2;:13::i;:::-;:15;;;;:::i;:::-;56721:1;56707:13;56710:1;56712:7;56707:2;:13::i;:::-;:15;;;;:::i;:::-;:17;;56723:1;56707:17;:::i;55888:159::-;55949:13;55982:56;56000:27;56022:4;56000:21;:27::i;:::-;56029:2;56033:4;56029:2;56036:1;56033:4;:::i;55982:56::-;55975:63;55888:159;-1:-1:-1;;;55888:159:0:o;36041:171::-;36088:8;36124:2;36113:8;;;;:13;36109:95;;;36142:15;:8;;;;36153:4;36142:15;:::i;:::-;36135:23;;;36041:171;-1:-1:-1;;36041:171:0:o;36109:95::-;36188:15;:8;;;;36199:4;36188:15;:::i;36109:95::-;36041:171;;;:::o;36309:371::-;36402:13;36458:3;36428:21;36505:19;36514:10;36505:8;:19;:::i;:::-;36495:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36495:30:0;-1:-1:-1;36473:52:0;-1:-1:-1;36549:10:0;36536:105;36565:8;36561:1;:12;36536:105;;;36618:8;36627:1;36618:11;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;36618:11:0;36595:6;36602:12;36604:10;36602:1;:12;:::i;:::-;36595:20;;;;;;;;:::i;:::-;;;;:34;-1:-1:-1;;;;;36595:34:0;;;;;;;;-1:-1:-1;36575:3:0;;;;:::i;:::-;;;;36536:105;;;-1:-1:-1;36665:6:0;36309:371;-1:-1:-1;;;;;36309:371:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:631:1;78:5;108:18;149:2;141:6;138:14;135:40;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:72;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:45;;;532:1;529;522:12;491:45;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;14:631;;;;;:::o;650:173::-;718:20;;-1:-1:-1;;;;;767:31:1;;757:42;;747:70;;813:1;810;803:12;828:186;887:6;940:2;928:9;919:7;915:23;911:32;908:52;;;956:1;953;946:12;908:52;979:29;998:9;979:29;:::i;1019:260::-;1087:6;1095;1148:2;1136:9;1127:7;1123:23;1119:32;1116:52;;;1164:1;1161;1154:12;1116:52;1187:29;1206:9;1187:29;:::i;:::-;1177:39;;1235:38;1269:2;1258:9;1254:18;1235:38;:::i;:::-;1225:48;;1019:260;;;;;:::o;1284:328::-;1361:6;1369;1377;1430:2;1418:9;1409:7;1405:23;1401:32;1398:52;;;1446:1;1443;1436:12;1398:52;1469:29;1488:9;1469:29;:::i;:::-;1459:39;;1517:38;1551:2;1540:9;1536:18;1517:38;:::i;:::-;1507:48;;1602:2;1591:9;1587:18;1574:32;1564:42;;1284:328;;;;;:::o;1617:666::-;1712:6;1720;1728;1736;1789:3;1777:9;1768:7;1764:23;1760:33;1757:53;;;1806:1;1803;1796:12;1757:53;1829:29;1848:9;1829:29;:::i;:::-;1819:39;;1877:38;1911:2;1900:9;1896:18;1877:38;:::i;:::-;1867:48;;1962:2;1951:9;1947:18;1934:32;1924:42;;2017:2;2006:9;2002:18;1989:32;2044:18;2036:6;2033:30;2030:50;;;2076:1;2073;2066:12;2030:50;2099:22;;2152:4;2144:13;;2140:27;-1:-1:-1;2130:55:1;;2181:1;2178;2171:12;2130:55;2204:73;2269:7;2264:2;2251:16;2246:2;2242;2238:11;2204:73;:::i;:::-;2194:83;;;1617:666;;;;;;;:::o;2288:347::-;2353:6;2361;2414:2;2402:9;2393:7;2389:23;2385:32;2382:52;;;2430:1;2427;2420:12;2382:52;2453:29;2472:9;2453:29;:::i;:::-;2443:39;;2532:2;2521:9;2517:18;2504:32;2579:5;2572:13;2565:21;2558:5;2555:32;2545:60;;2601:1;2598;2591:12;2545:60;2624:5;2614:15;;;2288:347;;;;;:::o;2640:254::-;2708:6;2716;2769:2;2757:9;2748:7;2744:23;2740:32;2737:52;;;2785:1;2782;2775:12;2737:52;2808:29;2827:9;2808:29;:::i;:::-;2798:39;2884:2;2869:18;;;;2856:32;;-1:-1:-1;;;2640:254:1:o;2899:245::-;2957:6;3010:2;2998:9;2989:7;2985:23;2981:32;2978:52;;;3026:1;3023;3016:12;2978:52;3065:9;3052:23;3084:30;3108:5;3084:30;:::i;3149:249::-;3218:6;3271:2;3259:9;3250:7;3246:23;3242:32;3239:52;;;3287:1;3284;3277:12;3239:52;3319:9;3313:16;3338:30;3362:5;3338:30;:::i;3403:450::-;3472:6;3525:2;3513:9;3504:7;3500:23;3496:32;3493:52;;;3541:1;3538;3531:12;3493:52;3581:9;3568:23;3614:18;3606:6;3603:30;3600:50;;;3646:1;3643;3636:12;3600:50;3669:22;;3722:4;3714:13;;3710:27;-1:-1:-1;3700:55:1;;3751:1;3748;3741:12;3700:55;3774:73;3839:7;3834:2;3821:16;3816:2;3812;3808:11;3774:73;:::i;3858:180::-;3917:6;3970:2;3958:9;3949:7;3945:23;3941:32;3938:52;;;3986:1;3983;3976:12;3938:52;-1:-1:-1;4009:23:1;;3858:180;-1:-1:-1;3858:180:1:o;4043:184::-;4113:6;4166:2;4154:9;4145:7;4141:23;4137:32;4134:52;;;4182:1;4179;4172:12;4134:52;-1:-1:-1;4205:16:1;;4043:184;-1:-1:-1;4043:184:1:o;4232:248::-;4300:6;4308;4361:2;4349:9;4340:7;4336:23;4332:32;4329:52;;;4377:1;4374;4367:12;4329:52;-1:-1:-1;;4400:23:1;;;4470:2;4455:18;;;4442:32;;-1:-1:-1;4232:248:1:o;4485:268::-;4537:3;4575:5;4569:12;4602:6;4597:3;4590:19;4618:63;4674:6;4667:4;4662:3;4658:14;4651:4;4644:5;4640:16;4618:63;:::i;:::-;4735:2;4714:15;-1:-1:-1;;4710:29:1;4701:39;;;;4742:4;4697:50;;4485:268;-1:-1:-1;;4485:268:1:o;4758:184::-;4799:3;4837:5;4831:12;4852:52;4897:6;4892:3;4885:4;4878:5;4874:16;4852:52;:::i;:::-;4920:16;;;;;4758:184;-1:-1:-1;;4758:184:1:o;4947:973::-;5032:12;;4997:3;;5087:1;5107:18;;;;5160;;;;5187:61;;5241:4;5233:6;5229:17;5219:27;;5187:61;5267:2;5315;5307:6;5304:14;5284:18;5281:38;5278:161;;;5361:10;5356:3;5352:20;5349:1;5342:31;5396:4;5393:1;5386:15;5424:4;5421:1;5414:15;5278:161;5455:18;5482:104;;;;5600:1;5595:319;;;;5448:466;;5482:104;-1:-1:-1;;5515:24:1;;5503:37;;5560:16;;;;-1:-1:-1;5482:104:1;;5595:319;55772:1;55765:14;;;55809:4;55796:18;;5689:1;5703:165;5717:6;5714:1;5711:13;5703:165;;;5795:14;;5782:11;;;5775:35;5838:16;;;;5732:10;;5703:165;;;5707:3;;5897:6;5892:3;5888:16;5881:23;;5448:466;;;;;;;4947:973;;;;:::o;9004:470::-;9183:3;9221:6;9215:13;9237:53;9283:6;9278:3;9271:4;9263:6;9259:17;9237:53;:::i;:::-;9353:13;;9312:16;;;;9375:57;9353:13;9312:16;9409:4;9397:17;;9375:57;:::i;:::-;9448:20;;9004:470;-1:-1:-1;;;;9004:470:1:o;9479:1257::-;9850:3;9888:6;9882:13;9914:4;9927:51;9971:6;9966:3;9961:2;9953:6;9949:15;9927:51;:::i;:::-;10041:13;;10000:16;;;;10063:55;10041:13;10000:16;10085:15;;;10063:55;:::i;:::-;10185:13;;10140:20;;;10207:55;10185:13;10140:20;10229:15;;;10207:55;:::i;:::-;10329:13;;10284:20;;;10351:55;10329:13;10284:20;10373:15;;;10351:55;:::i;:::-;10473:13;;10428:20;;;10495:55;10473:13;10428:20;10517:15;;;10495:55;:::i;:::-;10617:13;;10572:20;;;10639:55;10617:13;10572:20;10661:15;;;10639:55;:::i;:::-;10710:20;;;;;9479:1257;-1:-1:-1;;;;;;;;;9479:1257:1:o;10741:1220::-;11165:3;11203:6;11197:13;11219:53;11265:6;11260:3;11253:4;11245:6;11241:17;11219:53;:::i;:::-;11335:13;;11294:16;;;;11357:57;11335:13;11294:16;11391:4;11379:17;;11357:57;:::i;:::-;11481:13;;11436:20;;;11503:57;11481:13;11436:20;11537:4;11525:17;;11503:57;:::i;:::-;11627:13;;11582:20;;;11649:57;11627:13;11582:20;11683:4;11671:17;;11649:57;:::i;:::-;11773:13;;11728:20;;;11795:57;11773:13;11728:20;11829:4;11817:17;;11795:57;:::i;:::-;-1:-1:-1;;;11874:20:1;;11903:23;;;11953:1;11942:13;;10741:1220;-1:-1:-1;;;;;;;10741:1220:1:o;11966:1581::-;12592:3;12630:6;12624:13;12646:53;12692:6;12687:3;12680:4;12672:6;12668:17;12646:53;:::i;:::-;12762:13;;12721:16;;;;12784:57;12762:13;12721:16;12818:4;12806:17;;12784:57;:::i;:::-;12908:13;;12863:20;;;12930:57;12908:13;12863:20;12964:4;12952:17;;12930:57;:::i;:::-;-1:-1:-1;;;13009:20:1;;13038;;;13083:13;;13105:65;13083:13;13157:1;13146:13;;13139:4;13127:17;;13105:65;:::i;:::-;13234:13;;13189:20;;;13256:62;13234:13;13305:1;13297:10;;13290:4;13278:17;;13256:62;:::i;:::-;-1:-1:-1;;;13378:1:1;13337:17;;;;13370:10;;;13363:24;13415:34;13411:1;13403:10;;13396:54;13479:34;13474:2;13466:11;;13459:55;13538:2;13530:11;;11966:1581;-1:-1:-1;;;;;;;11966:1581:1:o;13552:1717::-;14231:3;14269:6;14263:13;14285:53;14331:6;14326:3;14319:4;14311:6;14307:17;14285:53;:::i;:::-;14401:13;;14360:16;;;;14423:57;14401:13;14360:16;14457:4;14445:17;;14423:57;:::i;:::-;14513:8;14506:5;14502:20;14489:33;;;14545:34;14538:5;14531:49;14614:25;14607:4;14600:5;14596:16;14589:51;14671:6;14665:13;14687:66;14744:8;14739:2;14732:5;14728:14;14721:4;14713:6;14709:17;14687:66;:::i;:::-;-1:-1:-1;;;14816:2:1;14772:20;;;;14808:11;;;14801:27;14857:34;14852:2;14844:11;;14837:55;14921:34;14916:2;14908:11;;14901:55;14986:34;14980:3;14972:12;;14965:56;15051:26;15045:3;15037:12;;15030:48;15103:13;;15125:64;15103:13;15174:3;15166:12;;15159:4;15147:17;;15125:64;:::i;:::-;15205:58;15258:3;15247:8;15243:2;15239:17;15235:27;-1:-1:-1;;;8058:19:1;;8102:1;8093:11;;7993:117;15205:58;15198:65;13552:1717;-1:-1:-1;;;;;;;;13552:1717:1:o;15274:1958::-;16203:3;16241:6;16235:13;16257:53;16303:6;16298:3;16291:4;16283:6;16279:17;16257:53;:::i;:::-;16341:6;16336:3;16332:16;16319:29;;16371:34;16364:5;16357:49;-1:-1:-1;;;16481:2:1;16474:4;16467:5;16463:16;16456:28;16515:6;16509:13;16531:66;16588:8;16583:2;16576:5;16572:14;16565:4;16557:6;16553:17;16531:66;:::i;:::-;16665:34;16660:2;16616:20;;;;16652:11;;;16645:55;16729:34;16724:2;16716:11;;16709:55;-1:-1:-1;;;16788:3:1;16780:12;;16773:26;16824:13;;16846:64;16824:13;16895:3;16887:12;;16880:4;16868:17;;16846:64;:::i;:::-;-1:-1:-1;;;16970:3:1;16929:17;;;;16962:12;;;16955:31;17016:34;17010:3;17002:12;;16995:56;17075:3;17067:12;;17060:24;17100:126;17130:95;17155:69;17185:38;17218:3;17210:12;;17202:6;17185:38;:::i;:::-;7674:34;7662:47;;7739:34;7734:2;7725:12;;7718:56;-1:-1:-1;;;7799:2:1;7790:12;;7783:27;7835:2;7826:12;;7597:247;17155:69;17147:6;17130:95;:::i;:::-;-1:-1:-1;;;7291:22:1;;7338:1;7329:11;;7226:120;17237:1600;17868:3;17906:6;17900:13;17922:53;17968:6;17963:3;17956:4;17948:6;17944:17;17922:53;:::i;:::-;18006:6;18001:3;17997:16;17984:29;;18036:34;18029:5;18022:49;18105:34;18098:4;18091:5;18087:16;18080:60;18172:29;18167:2;18160:5;18156:14;18149:53;18234:34;18229:2;18222:5;18218:14;18211:58;-1:-1:-1;;;18296:3:1;18289:5;18285:15;18278:38;18347:6;18341:13;18363:67;18421:8;18415:3;18408:5;18404:15;18397:4;18389:6;18385:17;18363:67;:::i;:::-;18499:34;18493:3;18449:20;;;;18485:12;;;18478:56;18564:34;18558:3;18550:12;;18543:56;-1:-1:-1;;;18623:3:1;18615:12;;18608:38;18671:13;;18693:64;18671:13;18742:3;18734:12;;18727:4;18715:17;;18693:64;:::i;:::-;18773:58;18826:3;18815:8;18811:2;18807:17;18803:27;-1:-1:-1;;;6245:33:1;;6303:2;6294:12;;6180:132;18773:58;18766:65;17237:1600;-1:-1:-1;;;;;;;17237:1600:1:o;18842:1830::-;19622:3;19660:6;19654:13;19676:53;19722:6;19717:3;19710:4;19702:6;19698:17;19676:53;:::i;:::-;19760:6;19755:3;19751:16;19738:29;;19790:34;19783:5;19776:49;19859:33;19852:4;19845:5;19841:16;19834:59;19924:6;19918:13;19940:66;19997:8;19992:2;19985:5;19981:14;19974:4;19966:6;19962:17;19940:66;:::i;:::-;20074:34;20069:2;20025:20;;;;20061:11;;;20054:55;-1:-1:-1;;;20133:2:1;20125:11;;20118:42;20190:34;20184:3;20176:12;;20169:56;20255:32;20249:3;20241:12;;20234:54;20313:13;;20335:64;20313:13;20384:3;20376:12;;20369:4;20357:17;;20335:64;:::i;:::-;-1:-1:-1;;;20459:3:1;20418:17;;;;20451:12;;;20444:37;20506:13;;20528:64;20506:13;20577:3;20569:12;;20562:4;20550:17;;20528:64;:::i;:::-;20608:58;20661:3;20650:8;20646:2;20642:17;20638:27;-1:-1:-1;;;7291:22:1;;7338:1;7329:11;;7226:120;20677:1336;21207:3;21245:6;21239:13;21261:53;21307:6;21302:3;21295:4;21287:6;21283:17;21261:53;:::i;:::-;21345:6;21340:3;21336:16;21323:29;;21375:34;21368:5;21361:49;21444:34;21437:4;21430:5;21426:16;21419:60;21511:34;21506:2;21499:5;21495:14;21488:58;-1:-1:-1;;;21573:2:1;21566:5;21562:14;21555:31;21617:6;21611:13;21633:67;21691:8;21685:3;21678:5;21674:15;21667:4;21659:6;21655:17;21633:67;:::i;:::-;-1:-1:-1;;;21763:3:1;21719:20;;;;21755:12;;;21748:43;21816:13;;21838:64;21816:13;21887:3;21879:12;;21872:4;21860:17;;21838:64;:::i;:::-;-1:-1:-1;;;21962:3:1;21921:17;;;;21954:12;;;21947:32;22003:3;21995:12;;20677:1336;-1:-1:-1;;;;;20677:1336:1:o;22018:1954::-;22947:3;22985:6;22979:13;23001:53;23047:6;23042:3;23035:4;23027:6;23023:17;23001:53;:::i;:::-;23085:6;23080:3;23076:16;23063:29;;23115:34;23108:5;23101:49;-1:-1:-1;;;23177:4:1;23170:5;23166:16;23159:43;23233:6;23227:13;23249:66;23306:8;23301:2;23294:5;23290:14;23283:4;23275:6;23271:17;23249:66;:::i;:::-;23383:34;23378:2;23334:20;;;;23370:11;;;23363:55;23447:34;23442:2;23434:11;;23427:55;-1:-1:-1;;;23506:3:1;23498:12;;23491:31;23547:13;;23569:64;23547:13;23618:3;23610:12;;23603:4;23591:17;;23569:64;:::i;:::-;-1:-1:-1;;;23693:3:1;23652:17;;;;23685:12;;;23678:31;23739:34;23733:3;23725:12;;23718:56;-1:-1:-1;;;23798:3:1;23790:12;;23783:41;23840:126;23870:95;23895:69;23925:38;23958:3;23950:12;;23942:6;23925:38;:::i;:::-;6394:34;6382:47;;6459:34;6454:2;6445:12;;6438:56;-1:-1:-1;;;6519:2:1;6510:12;;6503:27;6555:2;6546:12;;6317:247;23977:1577;24701:3;24729:38;24763:3;24755:6;24729:38;:::i;:::-;24796:6;24790:13;24812:52;24857:6;24853:2;24846:4;24838:6;24834:17;24812:52;:::i;:::-;-1:-1:-1;;;24886:15:1;;24910:30;;;24965:13;;24987:66;24965:13;25039:2;25028:14;;25021:4;25009:17;;24987:66;:::i;:::-;25121:30;25116:2;25072:20;;;;25108:11;;;25101:51;25177:13;;25199:63;25177:13;25248:2;25240:11;;25233:4;25221:17;;25199:63;:::i;:::-;-1:-1:-1;;;25322:2:1;25281:17;;;;25314:11;;;25307:32;25364:13;;25386:63;25364:13;25435:2;25427:11;;25420:4;25408:17;;25386:63;:::i;:::-;-1:-1:-1;;;25509:2:1;25468:17;;;;25501:11;;;25494:27;25545:2;25537:11;;23977:1577;-1:-1:-1;;;;;;;23977:1577:1:o;25559:1218::-;26134:3;26162:38;26196:3;26188:6;26162:38;:::i;:::-;26229:6;26223:13;26245:52;26290:6;26286:2;26279:4;26271:6;26267:17;26245:52;:::i;:::-;-1:-1:-1;;;26319:15:1;;26343:28;;;26396:13;;26418:66;26396:13;26470:2;26459:14;;26452:4;26440:17;;26418:66;:::i;:::-;-1:-1:-1;;;26547:2:1;26503:20;;;;26539:11;;;26532:30;26587:13;;26609:63;26587:13;26658:2;26650:11;;26643:4;26631:17;;26609:63;:::i;:::-;-1:-1:-1;;;26732:2:1;26691:17;;;;26724:11;;;26717:27;26768:2;26760:11;;25559:1218;-1:-1:-1;;;;;;25559:1218:1:o;26782:2100::-;-1:-1:-1;;;27938:3:1;27931:37;27913:3;27997:6;27991:13;28013:62;28068:6;28063:2;28058:3;28054:12;28047:4;28039:6;28035:17;28013:62;:::i;:::-;-1:-1:-1;;;28134:2:1;28094:16;;;28126:11;;;28119:30;28174:13;;28196:63;28174:13;28245:2;28237:11;;28230:4;28218:17;;28196:63;:::i;:::-;28324:31;28319:2;28278:17;;;;28311:11;;;28304:52;28381:13;;28403:63;28381:13;28452:2;28444:11;;28437:4;28425:17;;28403:63;:::i;:::-;28531:34;28485:17;;28526:2;28518:11;;28511:55;;;;28595:34;28590:2;28582:11;;28575:55;-1:-1:-1;;;28654:3:1;28646:12;;28639:33;6646:34;28866:3;28858:12;;6634:47;6711:34;6697:12;;;6690:56;-1:-1:-1;;;6762:12:1;;;6755:30;28688:188;28718:157;28743:131;28773:100;28803:69;6801:12;;;28820:6;28803:69;:::i;:::-;7926:27;7914:40;;7979:2;7970:12;;7849:139;28773:100;8336:34;8324:47;;8401:34;8396:2;8387:12;;8380:56;-1:-1:-1;;;8461:2:1;8452:12;;8445:31;8501:2;8492:12;;8259:251;28718:157;8192:27;8180:40;;8245:2;8236:12;;8115:139;28887:1764;-1:-1:-1;;;29637:43:1;;29703:13;;29619:3;;29725:61;29703:13;29775:1;29766:11;;29759:4;29747:17;;29725:61;:::i;:::-;29849:66;29845:1;29805:16;;;29837:10;;;29830:86;29945:34;29940:2;29932:11;;29925:55;30009:29;30004:2;29996:11;;29989:50;-1:-1:-1;;;30063:3:1;30055:12;;30048:68;30141:13;;30163:64;30141:13;30212:3;30204:12;;30197:4;30185:17;;30163:64;:::i;:::-;30293:66;30287:3;30246:17;;;;30279:12;;;30272:88;-1:-1:-1;;;30384:3:1;30376:12;;30369:56;30450:13;;30472:64;30450:13;30521:3;30513:12;;30506:4;30494:17;;30472:64;:::i;:::-;-1:-1:-1;;;30596:3:1;30555:17;;;;30588:12;;;30581:36;30641:3;30633:12;;28887:1764;-1:-1:-1;;;;;28887:1764:1:o;30656:1371::-;31269:34;31264:3;31257:47;31334:34;31329:2;31324:3;31320:12;31313:56;31399:29;31394:2;31389:3;31385:12;31378:51;31459:34;31454:2;31449:3;31445:12;31438:56;-1:-1:-1;;;31519:3:1;31514;31510:13;31503:37;31239:3;31569:6;31563:13;31585:61;31639:6;31633:3;31628;31624:13;31619:2;31611:6;31607:15;31585:61;:::i;:::-;31711:34;31705:3;31665:16;;;31697:12;;;31690:56;-1:-1:-1;;;31770:3:1;31762:12;;31755:42;31822:13;;31844:62;31822:13;31891:3;31883:12;;31878:2;31866:15;;31844:62;:::i;:::-;-1:-1:-1;;;31966:3:1;31925:17;;;;31958:12;;;31951:42;32017:3;32009:12;;30656:1371;-1:-1:-1;;;;30656:1371:1:o;32032:1862::-;-1:-1:-1;;;32829:3:1;32822:28;32804:3;32879:6;32873:13;32895:62;32950:6;32945:2;32940:3;32936:12;32929:4;32921:6;32917:17;32895:62;:::i;:::-;32976:60;33032:2;33023:6;33018:3;33014:16;33010:25;33002:6;32976:60;:::i;:::-;32966:70;;33067:6;33061:13;33083:54;33128:8;33124:2;33117:4;33109:6;33105:17;33083:54;:::i;:::-;33201:13;;33159:17;;;33223:57;33201:13;33159:17;33257:4;33245:17;;33223:57;:::i;:::-;-1:-1:-1;;;33302:20:1;;33331;;;33376:13;;33398:65;33376:13;33450:1;33439:13;;33432:4;33420:17;;33398:65;:::i;:::-;33527:13;;33482:20;;;33549:62;33527:13;33598:1;33590:10;;33583:4;33571:17;;33549:62;:::i;:::-;-1:-1:-1;;;33671:1:1;33630:17;;;;33663:10;;;33656:24;33708:34;33704:1;33696:10;;33689:54;33772:34;33767:2;33759:11;;33752:55;-1:-1:-1;;;33831:2:1;33823:11;;33816:45;33885:2;33877:11;;32032:1862;-1:-1:-1;;;;;;;;32032:1862:1:o;33899:1079::-;34411:34;34406:3;34399:47;34476:34;34471:2;34466:3;34462:12;34455:56;-1:-1:-1;;;34536:2:1;34531:3;34527:12;34520:45;34381:3;34594:6;34588:13;34610:60;34663:6;34658:2;34653:3;34649:12;34644:2;34636:6;34632:15;34610:60;:::i;:::-;34734:27;34729:2;34689:16;;;34721:11;;;34714:48;34787:13;;34809:62;34787:13;34856:3;34848:12;;34843:2;34831:15;;34809:62;:::i;:::-;-1:-1:-1;;;34931:3:1;34890:17;;;;34923:12;;;34916:28;34968:3;34960:12;;33899:1079;-1:-1:-1;;;;33899:1079:1:o;34983:433::-;-1:-1:-1;;;35238:3:1;35231:31;35213:3;35291:6;35285:13;35307:62;35362:6;35357:2;35352:3;35348:12;35341:4;35333:6;35329:17;35307:62;:::i;:::-;35389:16;;;;35407:2;35385:25;;34983:433;-1:-1:-1;;34983:433:1:o;35421:1086::-;35933:34;35928:3;35921:47;-1:-1:-1;;;35993:2:1;35988:3;35984:12;35977:31;35903:3;36037:6;36031:13;36053:60;36106:6;36101:2;36096:3;36092:12;36087:2;36079:6;36075:15;36053:60;:::i;:::-;36177:30;36172:2;36132:16;;;36164:11;;;36157:51;36233:13;;36255:61;36233:13;36302:2;36294:11;;36289:2;36277:15;;36255:61;:::i;:::-;36381:34;36376:2;36335:17;;;;36368:11;;;36361:55;36445:27;36440:2;36432:11;;36425:48;36497:3;36489:12;;35421:1086;-1:-1:-1;;;;35421:1086:1:o;36512:2562::-;37875:66;37870:3;37863:79;37845:3;37971:6;37965:13;37987:60;38040:6;38035:2;38030:3;38026:12;38021:2;38013:6;38009:15;37987:60;:::i;:::-;38075:6;38070:3;38066:16;38056:26;;38120:22;38115:3;38111:32;38106:2;38102;38098:11;38091:53;38173:66;38168:2;38164;38160:11;38153:87;38271:6;38265:13;38287:61;38339:8;38334:2;38330;38326:11;38321:2;38313:6;38309:15;38287:61;:::i;:::-;-1:-1:-1;;;38443:2:1;38367:17;;;;38435:11;;;38428:23;;;38480:66;38475:2;38467:11;;38460:87;38572:13;;38594:62;38572:13;38641:3;38633:12;;38628:2;38616:15;;38594:62;:::i;:::-;38716:3;38675:17;;38708:12;;;38701:24;38755:66;38749:3;38741:12;;38734:88;-1:-1:-1;;;38846:3:1;38838:12;;38831:64;38911:157;38941:126;38966:100;38996:69;39026:38;39059:3;39051:12;;39043:6;39026:38;:::i;:::-;-1:-1:-1;;;5990:17:1;;6032:1;6023:11;;5925:115;38996:69;7041:66;7029:79;;-1:-1:-1;;;7133:2:1;7124:12;;7117:70;7212:2;7203:12;;6964:257;38941:126;-1:-1:-1;;;7416:16:1;;7457:1;7448:11;;7351:114;39079:1265;-1:-1:-1;;;39735:3:1;39728:17;39710:3;39774:6;39768:13;39790:61;39844:6;39840:1;39835:3;39831:11;39824:4;39816:6;39812:17;39790:61;:::i;:::-;-1:-1:-1;;;39910:1:1;39870:16;;;39902:10;;;39895:35;39955:13;;39977:63;39955:13;40026:2;40018:11;;40011:4;39999:17;;39977:63;:::i;:::-;-1:-1:-1;;;40100:2:1;40059:17;;;;40092:11;;;40085:24;40134:13;;40156:63;40134:13;40205:2;40197:11;;40190:4;40178:17;;40156:63;:::i;:::-;40284:26;40279:2;40238:17;;;;40271:11;;;40264:47;40335:2;40327:11;;39079:1265;-1:-1:-1;;;;;39079:1265:1:o;40349:2238::-;-1:-1:-1;;;41601:3:1;41594:25;41576:3;41648:6;41642:13;41664:62;41719:6;41714:2;41709:3;41705:12;41698:4;41690:6;41686:17;41664:62;:::i;:::-;-1:-1:-1;;;41785:2:1;41745:16;;;41777:11;;;41770:31;41826:13;;41848:63;41826:13;41897:2;41889:11;;41882:4;41870:17;;41848:63;:::i;:::-;-1:-1:-1;;;41971:2:1;41930:17;;;;41963:11;;;41956:34;42015:13;;42037:63;42015:13;42086:2;42078:11;;42071:4;42059:17;;42037:63;:::i;:::-;-1:-1:-1;;;42160:2:1;42119:17;;;;42152:11;;;42145:35;42205:13;;42227:63;42205:13;42276:2;42268:11;;42261:4;42249:17;;42227:63;:::i;:::-;42355:27;42350:2;42309:17;;;;42342:11;;;42335:48;42399:182;42429:151;42454:125;42484:94;42509:68;42539:37;42572:2;42564:11;;42556:6;42539:37;:::i;:::-;-1:-1:-1;;;6110:31:1;;6166:2;6157:12;;6045:130;42509:68;42501:6;42484:94;:::i;:::-;-1:-1:-1;;;7535:24:1;;7584:1;7575:11;;7470:122;42429:151;-1:-1:-1;;;8058:19:1;;8102:1;8093:11;;7993:117;42399:182;42392:189;40349:2238;-1:-1:-1;;;;;;;;;;40349:2238:1:o;42592:2117::-;-1:-1:-1;;;43695:3:1;43688:25;43670:3;43742:6;43736:13;43758:62;43813:6;43808:2;43803:3;43799:12;43792:4;43784:6;43780:17;43758:62;:::i;:::-;-1:-1:-1;;;43879:2:1;43839:16;;;43871:11;;;43864:31;43920:13;;43942:63;43920:13;43991:2;43983:11;;43976:4;43964:17;;43942:63;:::i;:::-;-1:-1:-1;;;44065:2:1;44024:17;;;;44057:11;;;44050:34;44109:13;;44131:63;44109:13;44180:2;44172:11;;44165:4;44153:17;;44131:63;:::i;:::-;-1:-1:-1;;;44254:2:1;44213:17;;;;44246:11;;;44239:35;44299:13;;44321:63;44299:13;44370:2;44362:11;;44355:4;44343:17;;44321:63;:::i;:::-;-1:-1:-1;;;44444:2:1;44403:17;;;;44436:11;;;44429:34;44488:13;;44510:63;44488:13;44559:2;44551:11;;44544:4;44532:17;;44510:63;:::i;:::-;44589:114;44619:83;44644:57;44697:2;44686:8;44682:2;44678:17;44674:26;-1:-1:-1;;;8580:22:1;;8627:1;8618:11;;8515:120;44644:57;44636:6;44619:83;:::i;44714:430::-;-1:-1:-1;;;44971:3:1;44964:26;44946:3;45019:6;45013:13;45035:62;45090:6;45085:2;45080:3;45076:12;45069:4;45061:6;45057:17;45035:62;:::i;:::-;45117:16;;;;45135:2;45113:25;;44714:430;-1:-1:-1;;44714:430:1:o;45149:1785::-;46060:34;46055:3;46048:47;46125:34;46120:2;46115:3;46111:12;46104:56;46030:3;46189:6;46183:13;46205:60;46258:6;46253:2;46248:3;46244:12;46239:2;46231:6;46227:15;46205:60;:::i;:::-;-1:-1:-1;;;46324:2:1;46284:16;;;46316:11;;;46309:38;46372:13;;46394:61;46372:13;46441:2;46433:11;;46428:2;46416:15;;46394:61;:::i;:::-;-1:-1:-1;;;46515:2:1;46474:17;;;;46507:11;;;46500:30;46559:34;46554:2;46546:11;;46539:55;46624:34;46618:3;46610:12;;46603:56;-1:-1:-1;;;46683:3:1;46675:12;;46668:25;46718:13;;46740:62;46718:13;46787:3;46779:12;;46774:2;46762:15;;46740:62;:::i;:::-;46818:110;46848:79;46873:53;46921:3;46910:8;46906:2;46902:17;46898:27;6896:28;6884:41;;6950:2;6941:12;;6824:135;47147:499;-1:-1:-1;;;;;47416:15:1;;;47398:34;;47468:15;;47463:2;47448:18;;47441:43;47515:2;47500:18;;47493:34;;;47563:3;47558:2;47543:18;;47536:31;;;47341:4;;47584:56;;47620:19;;47612:6;47584:56;:::i;:::-;47576:64;47147:499;-1:-1:-1;;;;;;47147:499:1:o;47843:230::-;47992:2;47981:9;47974:21;47955:4;48012:55;48063:2;48052:9;48048:18;48040:6;48012:55;:::i;48078:414::-;48280:2;48262:21;;;48319:2;48299:18;;;48292:30;48358:34;48353:2;48338:18;;48331:62;-1:-1:-1;;;48424:2:1;48409:18;;48402:48;48482:3;48467:19;;48078:414::o;52741:413::-;52943:2;52925:21;;;52982:2;52962:18;;;52955:30;53021:34;53016:2;53001:18;;52994:62;-1:-1:-1;;;53087:2:1;53072:18;;53065:47;53144:3;53129:19;;52741:413::o;53572:356::-;53774:2;53756:21;;;53793:18;;;53786:30;53852:34;53847:2;53832:18;;53825:62;53919:2;53904:18;;53572:356::o;54745:413::-;54947:2;54929:21;;;54986:2;54966:18;;;54959:30;55025:34;55020:2;55005:18;;54998:62;-1:-1:-1;;;55091:2:1;55076:18;;55069:47;55148:3;55133:19;;54745:413::o;55825:128::-;55865:3;55896:1;55892:6;55889:1;55886:13;55883:39;;;55902:18;;:::i;:::-;-1:-1:-1;55938:9:1;;55825:128::o;55958:204::-;55996:3;56032:4;56029:1;56025:12;56064:4;56061:1;56057:12;56099:3;56093:4;56089:14;56084:3;56081:23;56078:49;;;56107:18;;:::i;:::-;56143:13;;55958:204;-1:-1:-1;;;55958:204:1:o;56167:120::-;56207:1;56233;56223:35;;56238:18;;:::i;:::-;-1:-1:-1;56272:9:1;;56167:120::o;56292:165::-;56330:1;56364:4;56361:1;56357:12;56388:3;56378:37;;56395:18;;:::i;:::-;56447:3;56440:4;56437:1;56433:12;56429:22;56424:27;;;56292:165;;;;:::o;56462:422::-;56551:1;56594:5;56551:1;56608:270;56629:7;56619:8;56616:21;56608:270;;;56688:4;56684:1;56680:6;56676:17;56670:4;56667:27;56664:53;;;56697:18;;:::i;:::-;56747:7;56737:8;56733:22;56730:55;;;56767:16;;;;56730:55;56846:22;;;;56806:15;;;;56608:270;;;56612:3;56462:422;;;;;:::o;56889:131::-;56949:5;56978:36;57005:8;56999:4;57074:5;57104:8;57094:80;;-1:-1:-1;57145:1:1;57159:5;;57094:80;57193:4;57183:76;;-1:-1:-1;57230:1:1;57244:5;;57183:76;57275:4;57293:1;57288:59;;;;57361:1;57356:130;;;;57268:218;;57288:59;57318:1;57309:10;;57332:5;;;57356:130;57393:3;57383:8;57380:17;57377:43;;;57400:18;;:::i;:::-;-1:-1:-1;;57456:1:1;57442:16;;57471:5;;57268:218;;57570:2;57560:8;57557:16;57551:3;57545:4;57542:13;57538:36;57532:2;57522:8;57519:16;57514:2;57508:4;57505:12;57501:35;57498:77;57495:159;;;-1:-1:-1;57607:19:1;;;57639:5;;57495:159;57686:34;57711:8;57705:4;57686:34;:::i;:::-;57756:6;57752:1;57748:6;57744:19;57735:7;57732:32;57729:58;;;57767:18;;:::i;:::-;57805:20;;57025:806;-1:-1:-1;;;57025:806:1:o;57836:168::-;57876:7;57942:1;57938;57934:6;57930:14;57927:1;57924:21;57919:1;57912:9;57905:17;57901:45;57898:71;;;57949:18;;:::i;:::-;-1:-1:-1;57989:9:1;;57836:168::o;58009:238::-;58047:7;58087:4;58084:1;58080:12;58119:4;58116:1;58112:12;58179:3;58173:4;58169:14;58164:3;58161:23;58154:3;58147:11;58140:19;58136:49;58133:75;;;58188:18;;:::i;58252:125::-;58292:4;58320:1;58317;58314:8;58311:34;;;58325:18;;:::i;:::-;-1:-1:-1;58362:9:1;;58252:125::o;58382:195::-;58420:4;58457;58454:1;58450:12;58489:4;58486:1;58482:12;58514:3;58509;58506:12;58503:38;;;58521:18;;:::i;:::-;58558:13;;;58382:195;-1:-1:-1;;;58382:195:1:o;58582:258::-;58654:1;58664:113;58678:6;58675:1;58672:13;58664:113;;;58754:11;;;58748:18;58735:11;;;58728:39;58700:2;58693:10;58664:113;;;58795:6;58792:1;58789:13;58786:48;;;-1:-1:-1;;58830:1:1;58812:16;;58805:27;58582:258::o;58845:380::-;58924:1;58920:12;;;;58967;;;58988:61;;59042:4;59034:6;59030:17;59020:27;;58988:61;59095:2;59087:6;59084:14;59064:18;59061:38;59058:161;;;59141:10;59136:3;59132:20;59129:1;59122:31;59176:4;59173:1;59166:15;59204:4;59201:1;59194:15;59058:161;;58845:380;;;:::o;59230:135::-;59269:3;-1:-1:-1;;59290:17:1;;59287:43;;;59310:18;;:::i;:::-;-1:-1:-1;59357:1:1;59346:13;;59230:135::o;59370:112::-;59402:1;59428;59418:35;;59433:18;;:::i;:::-;-1:-1:-1;59467:9:1;;59370:112::o;59487:127::-;59548:10;59543:3;59539:20;59536:1;59529:31;59579:4;59576:1;59569:15;59603:4;59600:1;59593:15;59619:127;59680:10;59675:3;59671:20;59668:1;59661:31;59711:4;59708:1;59701:15;59735:4;59732:1;59725:15;59751:127;59812:10;59807:3;59803:20;59800:1;59793:31;59843:4;59840:1;59833:15;59867:4;59864:1;59857:15;59883:127;59944:10;59939:3;59935:20;59932:1;59925:31;59975:4;59972:1;59965:15;59999:4;59996:1;59989:15;60015:131;-1:-1:-1;;;;;;60089:32:1;;60079:43;;60069:71;;60136:1;60133;60126:12

Swarm Source

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