ETH Price: $3,415.83 (-0.16%)

Token

Items (I)
 

Overview

Max Total Supply

0 I

Holders

1,293

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
0x8af124f8dc85a0fe43c5a4fde3cb9fbdc03a6dba
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
ItemMainInterface

Compiler Version
v0.8.6+commit.11564f7e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// File: node_modules\@openzeppelin\contracts\utils\introspection\IERC165.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

// File: @openzeppelin\contracts\token\ERC1155\IERC1155.sol

// SPDX_License_Identifier: MIT

pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC1155 compliant contract, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1155[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155 is IERC165 {
    /**
     * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
     */
    event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);

    /**
     * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
     * transfers.
     */
    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] ids,
        uint256[] values
    );

    /**
     * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
     * `approved`.
     */
    event ApprovalForAll(address indexed account, address indexed operator, bool approved);

    /**
     * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
     *
     * If an {URI} event was emitted for `id`, the standard
     * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
     * returned by {IERC1155MetadataURI-uri}.
     */
    event URI(string value, uint256 indexed id);

    /**
     * @dev Returns the amount of tokens of token type `id` owned by `account`.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) external view returns (uint256);

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
        external
        view
        returns (uint256[] memory);

    /**
     * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
     *
     * Emits an {ApprovalForAll} event.
     *
     * Requirements:
     *
     * - `operator` cannot be the caller.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address account, address operator) external view returns (bool);

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes calldata data
    ) external;

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) external;
}

// File: contracts\model\IERC1155Views.sol

// SPDX_License_Identifier: MIT

pragma solidity >=0.7.0;

/**
 * @title IERC1155Views - An optional utility interface to improve the ERC-1155 Standard.
 * @dev This interface introduces some additional capabilities for ERC-1155 Tokens.
 */
interface IERC1155Views {

    /**
     * @dev Returns the total supply of the given token id
     * @param itemId the id of the token whose availability you want to know 
     */
    function totalSupply(uint256 itemId) external view returns (uint256);

    /**
     * @dev Returns the name of the given token id
     * @param itemId the id of the token whose name you want to know 
     */
    function name(uint256 itemId) external view returns (string memory);

    /**
     * @dev Returns the symbol of the given token id
     * @param itemId the id of the token whose symbol you want to know 
     */
    function symbol(uint256 itemId) external view returns (string memory);

    /**
     * @dev Returns the decimals of the given token id
     * @param itemId the id of the token whose decimals you want to know 
     */
    function decimals(uint256 itemId) external view returns (uint256);

    /**
     * @dev Returns the uri of the given token id
     * @param itemId the id of the token whose uri you want to know 
     */
    function uri(uint256 itemId) external view returns (string memory);
}

// File: contracts\model\Item.sol

//SPDX_License_Identifier: MIT

pragma solidity >=0.7.0;
pragma abicoder v2;



struct Header {
    address host;
    string name;
    string symbol;
    string uri;
}

struct CreateItem {
    Header header;
    bytes32 collectionId;
    uint256 id;
    address[] accounts;
    uint256[] amounts;
}

interface Item is IERC1155, IERC1155Views {

    event CollectionItem(bytes32 indexed fromCollectionId, bytes32 indexed toCollectionId, uint256 indexed itemId);

    function name() external view returns(string memory);
    function symbol() external view returns(string memory);

    function burn(address account, uint256 itemId, uint256 amount) external;
    function burnBatch(address account, uint256[] calldata itemIds, uint256[] calldata amounts) external;

    function burn(address account, uint256 itemId, uint256 amount, bytes calldata data) external;
    function burnBatch(address account, uint256[] calldata itemIds, uint256[] calldata amounts, bytes calldata data) external;

    function mintItems(CreateItem[] calldata items) external returns(uint256[] memory itemIds);
    function setItemsCollection(uint256[] calldata itemIds, bytes32[] calldata collectionIds) external returns(bytes32[] memory oldCollectionIds);
    function setItemsMetadata(uint256[] calldata itemIds, Header[] calldata amounts) external returns(Header[] memory oldValues);

    function interoperableOf(uint256 itemId) external view returns(address);
}

// File: node_modules\@ethereansos\swissknife\contracts\generic\model\ILazyInitCapableElement.sol

// SPDX_License_Identifier: MIT
pragma solidity >=0.7.0;


interface ILazyInitCapableElement is IERC165 {

    function lazyInit(bytes calldata lazyInitData) external returns(bytes memory initResponse);
    function initializer() external view returns(address);

    event Host(address indexed from, address indexed to);

    function host() external view returns(address);
    function setHost(address newValue) external returns(address oldValue);

    function subjectIsAuthorizedFor(address subject, address location, bytes4 selector, bytes calldata payload, uint256 value) external view returns(bool);
}

// File: @ethereansos\swissknife\contracts\dynamicMetadata\model\IDynamicMetadataCapableElement.sol

//SPDX_License_Identifier: MIT
pragma solidity >=0.7.0;


interface IDynamicMetadataCapableElement is ILazyInitCapableElement {

    function uri() external view returns(string memory);
    function plainUri() external view returns(string memory);

    function setUri(string calldata newValue) external returns (string memory oldValue);

    function dynamicUriResolver() external view returns(address);
    function setDynamicUriResolver(address newValue) external returns(address oldValue);
}

// File: contracts\model\IItemMainInterface.sol

//SPDX_License_Identifier: MIT
pragma solidity >=0.7.0;



struct ItemData {
    bytes32 collectionId;
    Header header;
    bytes32 domainSeparator;
    uint256 totalSupply;
    mapping(address => uint256) balanceOf;
    mapping(address => mapping(address => uint256)) allowance;
    mapping(address => uint256) nonces;
}

interface IItemMainInterface is Item, IDynamicMetadataCapableElement {

    event Collection(address indexed from, address indexed to, bytes32 indexed collectionId);

    function interoperableInterfaceModel() external view returns(address);

    function collection(bytes32 collectionId) external view returns(address host, string memory name, string memory symbol, string memory uri);
    function collectionUri(bytes32 collectionId) external view returns(string memory);
    function createCollection(Header calldata _collection, CreateItem[] calldata items) external returns(bytes32 collectionId, uint256[] memory itemIds);
    function setCollectionsMetadata(bytes32[] calldata collectionIds, Header[] calldata values) external returns(Header[] memory oldValues);

    function item(uint256 itemId) external view returns(bytes32 collectionId, Header memory header, bytes32 domainSeparator, uint256 totalSupply);

    function mintTransferOrBurn(bool isMulti, bytes calldata data) external;

    function allowance(address account, address spender, uint256 itemId) external view returns(uint256);
    function approve(address account, address spender, uint256 amount, uint256 itemId) external;
    function TYPEHASH_PERMIT() external view returns (bytes32);
    function EIP712_PERMIT_DOMAINSEPARATOR_NAME_AND_VERSION() external view returns(string memory domainSeparatorName, string memory domainSeparatorVersion);
    function permit(uint256 itemId, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external;
    function nonces(address owner, uint256 itemId) external view returns(uint256);
}

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

// SPDX_License_Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

// File: @openzeppelin\contracts\token\ERC20\extensions\IERC20Metadata.sol

// SPDX_License_Identifier: MIT

pragma solidity ^0.8.0;


/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

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

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

// File: @openzeppelin\contracts\token\ERC20\extensions\draft-IERC20Permit.sol

// SPDX_License_Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
 * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
 *
 * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
 * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
 * need to send a transaction, and thus is not required to hold Ether at all.
 */
interface IERC20Permit {
    /**
     * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
     * given ``owner``'s signed approval.
     *
     * IMPORTANT: The same issues {IERC20-approve} has related to transaction
     * ordering also apply here.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `deadline` must be a timestamp in the future.
     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
     * over the EIP712-formatted function arguments.
     * - the signature must use ``owner``'s current nonce (see {nonces}).
     *
     * For more information on the signature format, see the
     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
     * section].
     */
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    /**
     * @dev Returns the current nonce for `owner`. This value must be
     * included whenever a signature is generated for {permit}.
     *
     * Every successful call to {permit} increases ``owner``'s nonce by one. This
     * prevents a signature from being used multiple times.
     */
    function nonces(address owner) external view returns (uint256);

    /**
     * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
     */
    // solhint-disable-next-line func-name-mixedcase
    function DOMAIN_SEPARATOR() external view returns (bytes32);
}

// File: contracts\model\IItemInteroperableInterface.sol

//SPDX_License_Identifier: MIT

pragma solidity >=0.7.0;




interface IItemInteroperableInterface is IERC20, IERC20Metadata, IERC20Permit {

    function init() external;
    function mainInterface() external view returns(address);
    function itemId() external view returns(uint256);
    function emitEvent(bool forApprove, bool isMulti, bytes calldata data) external;
    function burn(uint256 amount) external;
    function EIP712_PERMIT_DOMAINSEPARATOR_NAME_AND_VERSION() external view returns(string memory name, string memory version);
}

// File: node_modules\@ethereansos\swissknife\contracts\dynamicMetadata\model\IDynamicUriResolver.sol

//SPDX_License_Identifier: MIT
pragma solidity >=0.7.0;

interface IDynamicUriResolver {
    function resolve(address subject, string calldata plainUri, bytes calldata inputData, address caller) external view returns(string memory);
}

// File: node_modules\@ethereansos\swissknife\contracts\lib\GeneralUtilities.sol

// SPDX_License_Identifier: MIT
pragma solidity >=0.7.0;

library BehaviorUtilities {

    function randomKey(uint256 i) internal view returns (bytes32) {
        return keccak256(abi.encode(i, block.timestamp, block.number, tx.origin, tx.gasprice, block.coinbase, block.difficulty, msg.sender, blockhash(block.number - 5)));
    }

    function calculateProjectedArraySizeAndLoopUpperBound(uint256 arraySize, uint256 start, uint256 offset) internal pure returns(uint256 projectedArraySize, uint256 projectedArrayLoopUpperBound) {
        if(arraySize != 0 && start < arraySize && offset != 0) {
            uint256 length = start + offset;
            if(start < (length = length > arraySize ? arraySize : length)) {
                projectedArraySize = (projectedArrayLoopUpperBound = length) - start;
            }
        }
    }
}

library ReflectionUtilities {

    function read(address subject, bytes memory inputData) internal view returns(bytes memory returnData) {
        bool result;
        (result, returnData) = subject.staticcall(inputData);
        if(!result) {
            assembly {
                revert(add(returnData, 0x20), mload(returnData))
            }
        }
    }

    function submit(address subject, uint256 value, bytes memory inputData) internal returns(bytes memory returnData) {
        bool result;
        (result, returnData) = subject.call{value : value}(inputData);
        if(!result) {
            assembly {
                revert(add(returnData, 0x20), mload(returnData))
            }
        }
    }

    function isContract(address subject) internal view returns (bool) {
        if(subject == address(0)) {
            return false;
        }
        uint256 codeLength;
        assembly {
            codeLength := extcodesize(subject)
        }
        return codeLength > 0;
    }

    function clone(address originalContract) internal returns(address copyContract) {
        assembly {
            mstore(
                0,
                or(
                    0x5880730000000000000000000000000000000000000000803b80938091923cF3,
                    mul(originalContract, 0x1000000000000000000)
                )
            )
            copyContract := create(0, 0, 32)
            switch extcodesize(copyContract)
                case 0 {
                    invalid()
                }
        }
    }
}

library BytesUtilities {

    bytes private constant ALPHABET = "0123456789abcdef";

    function asAddress(bytes memory b) internal pure returns(address) {
        if(b.length == 0) {
            return address(0);
        }
        if(b.length == 20) {
            address addr;
            assembly {
                addr := mload(add(b, 20))
            }
            return addr;
        }
        return abi.decode(b, (address));
    }

    function asAddressArray(bytes memory b) internal pure returns(address[] memory callResult) {
        if(b.length > 0) {
            return abi.decode(b, (address[]));
        }
    }

    function asBool(bytes memory bs) internal pure returns(bool) {
        return asUint256(bs) != 0;
    }

    function asBoolArray(bytes memory b) internal pure returns(bool[] memory callResult) {
        if(b.length > 0) {
            return abi.decode(b, (bool[]));
        }
    }

    function asBytesArray(bytes memory b) internal pure returns(bytes[] memory callResult) {
        if(b.length > 0) {
            return abi.decode(b, (bytes[]));
        }
    }

    function asString(bytes memory b) internal pure returns(string memory callResult) {
        if(b.length > 0) {
            return abi.decode(b, (string));
        }
    }

    function asStringArray(bytes memory b) internal pure returns(string[] memory callResult) {
        if(b.length > 0) {
            return abi.decode(b, (string[]));
        }
    }

    function asUint256(bytes memory bs) internal pure returns(uint256 x) {
        if (bs.length >= 32) {
            assembly {
                x := mload(add(bs, add(0x20, 0)))
            }
        }
    }

    function asUint256Array(bytes memory b) internal pure returns(uint256[] memory callResult) {
        if(b.length > 0) {
            return abi.decode(b, (uint256[]));
        }
    }

    function toString(bytes memory data) internal pure returns(string memory) {
        bytes memory str = new bytes(2 + data.length * 2);
        str[0] = "0";
        str[1] = "x";
        for (uint i = 0; i < data.length; i++) {
            str[2+i*2] = ALPHABET[uint(uint8(data[i] >> 4))];
            str[3+i*2] = ALPHABET[uint(uint8(data[i] & 0x0f))];
        }
        return string(str);
    }
}

library StringUtilities {

    bytes1 private constant CHAR_0 = bytes1('0');
    bytes1 private constant CHAR_A = bytes1('A');
    bytes1 private constant CHAR_a = bytes1('a');
    bytes1 private constant CHAR_f = bytes1('f');

    function isEmpty(string memory test) internal pure returns (bool) {
        return equals(test, "");
    }

    function equals(string memory a, string memory b) internal pure returns(bool) {
        return keccak256(abi.encodePacked(a)) == keccak256(abi.encodePacked(b));
    }

    function toLowerCase(string memory str) internal pure returns(string memory) {
        bytes memory bStr = bytes(str);
        for (uint i = 0; i < bStr.length; i++) {
            bStr[i] = bStr[i] >= 0x41 && bStr[i] <= 0x5A ? bytes1(uint8(bStr[i]) + 0x20) : bStr[i];
        }
        return string(bStr);
    }

    function asBytes(string calldata str) internal pure returns(bytes memory toDecode) {
        bytes memory data = abi.encodePacked(str);
        if(data.length == 0 || data[0] != "0" || (data[1] != "x" && data[1] != "X")) {
            return "";
        }
        uint256 start = 2;
        toDecode = new bytes((data.length - 2) / 2);

        for(uint256 i = 0; i < toDecode.length; i++) {
            toDecode[i] = bytes1(_fromHexChar(uint8(data[start++])) + _fromHexChar(uint8(data[start++])) * 16);
        }
    }

    function _fromHexChar(uint8 c) private pure returns (uint8) {
        bytes1 charc = bytes1(c);
        return charc < CHAR_0 || charc > CHAR_f ? 0 : (charc < CHAR_A ? 0 : 10) + c - uint8(charc < CHAR_A ? CHAR_0 : charc < CHAR_a ? CHAR_A : CHAR_a);
    }
}

library Uint256Utilities {
    function asSingletonArray(uint256 n) internal pure returns(uint256[] memory array) {
        array = new uint256[](1);
        array[0] = n;
    }

    function toString(uint256 _i) internal pure returns (string memory) {
        return BytesUtilities.toString(abi.encodePacked(_i));
    }
}

library AddressUtilities {
    function asSingletonArray(address a) internal pure returns(address[] memory array) {
        array = new address[](1);
        array[0] = a;
    }

    function toString(address _addr) internal pure returns (string memory) {
        return _addr == address(0) ? "0x0000000000000000000000000000000000000000" : BytesUtilities.toString(abi.encodePacked(_addr));
    }
}

library Bytes32Utilities {

    function asSingletonArray(bytes32 a) internal pure returns(bytes32[] memory array) {
        array = new bytes32[](1);
        array[0] = a;
    }

    function toString(bytes32 bt) internal pure returns (string memory) {
        return bt == bytes32(0) ?  "0x0000000000000000000000000000000000000000000000000000000000000000" : BytesUtilities.toString(abi.encodePacked(bt));
    }
}

// File: node_modules\@ethereansos\swissknife\contracts\generic\impl\LazyInitCapableElement.sol

// SPDX_License_Identifier: MIT
pragma solidity >=0.7.0;



abstract contract LazyInitCapableElement is ILazyInitCapableElement {
    using ReflectionUtilities for address;

    address public override initializer;
    address public override host;

    constructor(bytes memory lazyInitData) {
        if(lazyInitData.length > 0) {
            _privateLazyInit(lazyInitData);
        }
    }

    function lazyInit(bytes calldata lazyInitData) override external returns (bytes memory lazyInitResponse) {
        return _privateLazyInit(lazyInitData);
    }

    function supportsInterface(bytes4 interfaceId) override external view returns(bool) {
        return
            interfaceId == type(IERC165).interfaceId ||
            interfaceId == this.supportsInterface.selector ||
            interfaceId == type(ILazyInitCapableElement).interfaceId ||
            interfaceId == this.lazyInit.selector ||
            interfaceId == this.initializer.selector ||
            interfaceId == this.subjectIsAuthorizedFor.selector ||
            interfaceId == this.host.selector ||
            interfaceId == this.setHost.selector ||
            _supportsInterface(interfaceId);
    }

    function setHost(address newValue) external override authorizedOnly returns(address oldValue) {
        emit Host(oldValue = host, host = newValue);
    }

    function subjectIsAuthorizedFor(address subject, address location, bytes4 selector, bytes calldata payload, uint256 value) public override virtual view returns(bool) {
        (bool chidlElementValidationIsConsistent, bool chidlElementValidationResult) = _subjectIsAuthorizedFor(subject, location, selector, payload, value);
        if(chidlElementValidationIsConsistent) {
            return chidlElementValidationResult;
        }
        if(subject == host) {
            return true;
        }
        if(!host.isContract()) {
            return false;
        }
        (bool result, bytes memory resultData) = host.staticcall(abi.encodeWithSelector(ILazyInitCapableElement(host).subjectIsAuthorizedFor.selector, subject, location, selector, payload, value));
        return result && abi.decode(resultData, (bool));
    }

    function _privateLazyInit(bytes memory lazyInitData) private returns (bytes memory lazyInitResponse) {
        require(initializer == address(0), "init");
        initializer = msg.sender;
        (host, lazyInitResponse) = abi.decode(lazyInitData, (address, bytes));
        emit Host(address(0), host);
        lazyInitResponse = _lazyInit(lazyInitResponse);
    }

    function _lazyInit(bytes memory) internal virtual returns (bytes memory) {
        return "";
    }

    function _supportsInterface(bytes4 selector) internal virtual view returns (bool);

    function _subjectIsAuthorizedFor(address, address, bytes4, bytes calldata, uint256) internal virtual view returns(bool, bool) {
    }

    modifier authorizedOnly {
        require(_authorizedOnly(), "unauthorized");
        _;
    }

    function _authorizedOnly() internal returns(bool) {
        return subjectIsAuthorizedFor(msg.sender, address(this), msg.sig, msg.data, msg.value);
    }
}

// File: @ethereansos\swissknife\contracts\dynamicMetadata\impl\DynamicMetadataCapableElement.sol

//SPDX_License_Identifier: MIT
pragma solidity >=0.7.0;




abstract contract DynamicMetadataCapableElement is IDynamicMetadataCapableElement, LazyInitCapableElement {

    string public override plainUri;
    address public override dynamicUriResolver;

    constructor(bytes memory lazyInitData) LazyInitCapableElement(lazyInitData) {
    }

    function _lazyInit(bytes memory lazyInitData) internal override returns (bytes memory lazyInitResponse) {
        (plainUri, dynamicUriResolver, lazyInitResponse) = abi.decode(lazyInitData, (string, address, bytes));
        lazyInitResponse = _dynamicMetadataElementLazyInit(lazyInitResponse);
    }

    function _supportsInterface(bytes4 interfaceId) internal override view returns(bool) {
        return
            interfaceId == type(IDynamicMetadataCapableElement).interfaceId ||
            interfaceId == this.plainUri.selector ||
            interfaceId == this.uri.selector ||
            interfaceId == this.dynamicUriResolver.selector ||
            interfaceId == this.setUri.selector ||
            interfaceId == this.setDynamicUriResolver.selector ||
            _dynamicMetadataElementSupportsInterface(interfaceId);
    }

    function uri() external override view returns(string memory) {
        return _uri(plainUri, "");
    }

    function setUri(string calldata newValue) external override authorizedOnly returns (string memory oldValue) {
        oldValue = plainUri;
        plainUri = newValue;
    }

    function setDynamicUriResolver(address newValue) external override authorizedOnly returns(address oldValue) {
        oldValue = dynamicUriResolver;
        dynamicUriResolver = newValue;
    }

    function _uri(string memory _plainUri, bytes memory additionalData) internal view returns(string memory) {
        if(dynamicUriResolver == address(0)) {
            return _plainUri;
        }
        return IDynamicUriResolver(dynamicUriResolver).resolve(address(this), _plainUri, additionalData, msg.sender);
    }

    function _dynamicMetadataElementLazyInit(bytes memory lazyInitData) internal virtual returns(bytes memory);

    function _dynamicMetadataElementSupportsInterface(bytes4 interfaceId) internal virtual view returns(bool);
}

// File: @openzeppelin\contracts\token\ERC1155\IERC1155Receiver.sol

// SPDX_License_Identifier: MIT

pragma solidity ^0.8.0;


/**
 * @dev _Available since v3.1._
 */
interface IERC1155Receiver is IERC165 {
    /**
        @dev Handles the receipt of a single ERC1155 token type. This function is
        called at the end of a `safeTransferFrom` after the balance has been updated.
        To accept the transfer, this must return
        `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
        (i.e. 0xf23a6e61, or its own function selector).
        @param operator The address which initiated the transfer (i.e. msg.sender)
        @param from The address which previously owned the token
        @param id The ID of the token being transferred
        @param value The amount of tokens being transferred
        @param data Additional data with no specified format
        @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
    */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external returns (bytes4);

    /**
        @dev Handles the receipt of a multiple ERC1155 token types. This function
        is called at the end of a `safeBatchTransferFrom` after the balances have
        been updated. To accept the transfer(s), this must return
        `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
        (i.e. 0xbc197c81, or its own function selector).
        @param operator The address which initiated the batch transfer (i.e. msg.sender)
        @param from The address which previously owned the token
        @param ids An array containing ids of each token being transferred (order and length must match values array)
        @param values An array containing amounts of each token being transferred (order and length must match ids array)
        @param data Additional data with no specified format
        @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
    */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external returns (bytes4);
}

// File: contracts\util\ERC1155CommonLibrary.sol

//SPDX_License_Identifier: MIT
pragma solidity >=0.7.0;



library ERC1155CommonLibrary {
    using ReflectionUtilities for address;

    function doSafeTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes calldata data
    ) internal {
        if (to.isContract()) {
            try
                IERC1155Receiver(to).onERC1155Received(
                    operator,
                    from,
                    id,
                    amount,
                    data
                )
            returns (bytes4 response) {
                if (
                    response != IERC1155Receiver(to).onERC1155Received.selector
                ) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function doSafeBatchTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) internal {
        if (to.isContract()) {
            try
                IERC1155Receiver(to).onERC1155BatchReceived(
                    operator,
                    from,
                    ids,
                    amounts,
                    data
                )
            returns (bytes4 response) {
                if (
                    response !=
                    IERC1155Receiver(to).onERC1155BatchReceived.selector
                ) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }
}

// File: contracts\impl\ItemMainInterface.sol

//SPDX_License_Identifier: MIT

pragma solidity >=0.7.0;
//pragma abicoder v2;






contract ItemMainInterface is IItemMainInterface, DynamicMetadataCapableElement {
    using ReflectionUtilities for address;

    bytes32 override public constant TYPEHASH_PERMIT = keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");

    address override public interoperableInterfaceModel;
    address private _itemMainInterfaceSupportsInterfaceImplementer;

    mapping(bytes32 => Header) override public collection;
    mapping(uint256 => ItemData) override public item;
    mapping(address => mapping(address => bool)) public override isApprovedForAll;

    uint256 private _keyIndex;

    mapping(uint256 => uint256[]) private _items;
    uint256 private _itemsLength;
    mapping(uint256 => uint256) private _itemsIndexes;

    mapping(bytes32 => uint256[]) private _batchItems;
    mapping(bytes32 => mapping(uint256 => uint256)) private _batchAmounts;
    bytes32[] private _batchKeys;

    constructor(bytes memory lazyInitData) DynamicMetadataCapableElement(lazyInitData) {
    }

    function _dynamicMetadataElementLazyInit(bytes memory lazyInitData) internal override returns(bytes memory) {
        (interoperableInterfaceModel, _itemMainInterfaceSupportsInterfaceImplementer) = abi.decode(lazyInitData, (address, address));
        return "";
    }

    function _dynamicMetadataElementSupportsInterface(bytes4 interfaceId) internal override view returns (bool) {
        return IERC165(_itemMainInterfaceSupportsInterfaceImplementer).supportsInterface(interfaceId);
        /*return 
            interfaceId == type(IERC1155).interfaceId ||
            interfaceId == IItemMainInterface(address(0)).balanceOf.selector ||
            interfaceId == IItemMainInterface(address(0)).balanceOfBatch.selector ||
            interfaceId == IItemMainInterface(address(0)).setApprovalForAll.selector ||
            interfaceId == IItemMainInterface(address(0)).isApprovedForAll.selector ||
            interfaceId == IItemMainInterface(address(0)).safeTransferFrom.selector ||
            interfaceId == IItemMainInterface(address(0)).safeBatchTransferFrom.selector ||
            interfaceId == 0xd9b67a26 ||//OpenSea Standard
            interfaceId == type(IERC1155Views).interfaceId ||
            interfaceId == IItemMainInterface(address(0)).totalSupply.selector ||
            interfaceId == 0x00ad800c ||//name(uint256)
            interfaceId == 0x4e41a1fb ||//symbol(uint256)
            interfaceId == IItemMainInterface(address(0)).decimals.selector ||
            interfaceId == 0x0e89341c ||//uri(uint256)
            interfaceId == type(Item).interfaceId ||
            interfaceId == 0x06fdde03 ||//name()
            interfaceId == 0x95d89b41 ||//symbol()
            interfaceId == 0xf5298aca ||//burn(address,uint256,uint256)
            interfaceId == 0x6b20c454 ||//burnBatch(address,uint256[],uint256[])
            interfaceId == 0x8a94b05f ||//burn(address,uint256,uint256,bytes)
            interfaceId == 0x5473422e ||//burnBatch(address,uint256[],uint256[],bytes)
            interfaceId == IItemMainInterface(address(0)).mintItems.selector ||
            interfaceId == IItemMainInterface(address(0)).setItemsCollection.selector ||
            interfaceId == IItemMainInterface(address(0)).setItemsMetadata.selector ||
            interfaceId == IItemMainInterface(address(0)).interoperableOf.selector ||
            interfaceId == type(IItemMainInterface).interfaceId ||
            interfaceId == IItemMainInterface(address(0)).interoperableInterfaceModel.selector ||
            interfaceId == IItemMainInterface(address(0)).setInteroperableInterfaceModel.selector ||
            interfaceId == IItemMainInterface(address(0)).collection.selector ||
            interfaceId == IItemMainInterface(address(0)).collectionUri.selector ||
            interfaceId == IItemMainInterface(address(0)).createCollection.selector ||
            interfaceId == IItemMainInterface(address(0)).setCollectionsMetadata.selector ||
            interfaceId == IItemMainInterface(address(0)).item.selector ||
            interfaceId == IItemMainInterface(address(0)).mintTransferOrBurn.selector ||
            interfaceId == IItemMainInterface(address(0)).allowance.selector ||
            interfaceId == IItemMainInterface(address(0)).approve.selector ||
            interfaceId == IItemMainInterface(address(0)).TYPEHASH_PERMIT.selector ||
            interfaceId == IItemMainInterface(address(0)).EIP712_PERMIT_DOMAINSEPARATOR_NAME_AND_VERSION.selector ||
            interfaceId == IItemMainInterface(address(0)).permit.selector ||
            interfaceId == IItemMainInterface(address(0)).nonces.selector;*/
    }

    function name() override external pure returns(string memory) {
        return "Items";
    }

    function name(uint256 itemId) override external view returns(string memory) {
        return item[itemId].header.name;
    }

    function symbol() override external pure returns(string memory) {
        return "I";
    }

    function symbol(uint256 itemId) override external view returns(string memory) {
        return item[itemId].header.symbol;
    }

    function decimals(uint256) override external pure returns(uint256) {
        return 18;
    }

    function collectionUri(bytes32 collectionId) override external view returns(string memory) {
        return _uri(collection[collectionId].uri, abi.encode(collectionId, 0));
    }

    function uri(uint256 itemId) override external view returns(string memory) {
        ItemData storage itemData = item[itemId];
        return _uri(itemData.header.uri, abi.encode(itemData.collectionId, itemId));
    }

    function setCollectionsMetadata(bytes32[] calldata collectionIds, Header[] calldata values) override external returns(Header[] memory oldValues) {
        oldValues = new Header[](values.length);
        for(uint256 i = 0; i < values.length; i++) {
            Header storage oldValue = collection[collectionIds[i]];
            require((oldValues[i] = oldValue).host == msg.sender, "Unauthorized");
            address newHost = (collection[collectionIds[i]] = _validateHeader(values[i], bytes32(0))).host;
            if(newHost != oldValues[i].host) {
                emit Collection(oldValues[i].host, newHost, collectionIds[i]);
            }
        }
    }

    function setItemsCollection(uint256[] calldata itemIds, bytes32[] calldata collectionIds) override external returns(bytes32[] memory oldCollectionIds) {
        oldCollectionIds = new bytes32[](itemIds.length);
        for(uint256 i = 0; i < itemIds.length; i++) {
            ItemData storage itemData = item[itemIds[i]];
            require(collection[oldCollectionIds[i] = itemData.collectionId].host == msg.sender, "Unauthorized");
            require(!_stringIsEmpty(collection[itemData.collectionId = collectionIds[i]].name), "collection");
            emit CollectionItem(oldCollectionIds[i], collectionIds[i], itemIds[i]);
        }
    }

    function setItemsMetadata(uint256[] calldata itemIds, Header[] calldata values) override external returns(Header[] memory oldValues) {
        oldValues = new Header[](values.length);
        for(uint256 i = 0; i < values.length; i++) {
            ItemData storage itemData = item[itemIds[i]];
            oldValues[i] = itemData.header;
            require(collection[itemData.collectionId].host == msg.sender, "Unauthorized");
            itemData.header = _validateHeader(values[i], itemData.collectionId);
            if(keccak256(bytes(itemData.header.uri)) != keccak256(bytes(oldValues[i].uri))) {
                emit URI(itemData.header.uri, itemIds[i]);
            }
        }
    }

    function totalSupply(uint256 itemId) override external view returns(uint256) {
        return item[itemId].totalSupply;
    }

    function balanceOf(address account, uint256 id) override external view returns (uint256) {
        return item[id].balanceOf[account];
    }

    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) override external view returns (uint256[] memory balances) {
        balances = new uint256[](ids.length);
        for(uint256 i = 0; i < balances.length; i++) {
            balances[i] = item[ids[i]].balanceOf[accounts[i]];
        }
    }

    function allowance(address owner, address spender, uint256 itemId) override external view returns (uint256) {
        return isApprovedForAll[owner][spender] ? 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff : item[itemId].allowance[owner][spender];
    }

    function setApprovalForAll(address operator, bool approved) override external {
        isApprovedForAll[msg.sender][operator] = approved;
        emit ApprovalForAll(msg.sender, operator, approved);
    }

    function interoperableOf(uint256 itemId) override external view returns(address) {
        return item[itemId].collectionId == bytes32(0) ? address(0) : address(uint160(itemId));
    }

    function safeTransferFrom(address from, address to, uint256 itemId, uint256 amount, bytes calldata data) override external {
        _mintTransferOrBurn(item[itemId], msg.sender, from, to, itemId, amount, true);
        ERC1155CommonLibrary.doSafeTransferAcceptanceCheck(msg.sender, from, to, itemId, amount, data);
    }

    function safeBatchTransferFrom(address from, address to, uint256[] calldata itemIds, uint256[] calldata amounts, bytes calldata data) override external {
        _mintTransferOrBurn(msg.sender, from, to, itemIds, amounts, false, true);
        ERC1155CommonLibrary.doSafeBatchTransferAcceptanceCheck(msg.sender, from, to, itemIds, amounts, data);
    }

    function burn(address account, uint256 itemId, uint256 amount) override external {
        burn(account, itemId, amount, "");
    }

    function burnBatch(address account, uint256[] calldata itemIds, uint256[] calldata amounts) override external {
        burnBatch(account, itemIds, amounts, "");
    }

    function burn(address account, uint256 itemId, uint256 amount, bytes memory) override public {
        _mintTransferOrBurn(item[itemId], msg.sender, account, address(0), itemId, amount, true);
    }

    function burnBatch(address account, uint256[] calldata itemIds, uint256[] calldata amounts, bytes memory) override public {
        _mintTransferOrBurn(msg.sender, account, address(0), itemIds, amounts, false, true);
    }

    function createCollection(Header calldata _collection, CreateItem[] calldata items) override external returns(bytes32 collectionId, uint256[] memory itemIds) {
        Header storage storageCollection = (collection[collectionId = BehaviorUtilities.randomKey(_keyIndex++)] = _validateHeader(_collection, bytes32(0)));
        require(storageCollection.host != address(0) || items.length > 0, "Empty");
        emit Collection(address(0), storageCollection.host, collectionId);
        itemIds = _createOrMintItems(collectionId, items);
    }

    function mintItems(CreateItem[] calldata items) override external returns(uint256[] memory) {
        return _createOrMintItems(bytes32(0), items);
    }

    function approve(address account, address spender, uint256 amount, uint256 itemId) override external {
        ItemData storage itemData = msg.sender == account ? item[itemId] : _checkItemPermissionAndRetrieveData(itemId);
        require(spender != address(0), "approve to the zero address");
        itemData.allowance[account][spender] = amount;
        if(msg.sender != address(uint160(itemId))) {
            IItemInteroperableInterface(address(uint160(itemId))).emitEvent(true, false, abi.encode(account, spender, amount));
        }
    }

    function mintTransferOrBurn(bool isMulti, bytes calldata data) override external {
        if(isMulti) {
            _mintTransferOrBurn(data);
            return;
        }
        (address operator, address sender, address recipient, uint256 itemId, uint256 amount) = abi.decode(data, (address, address, address, uint256, uint256));
        _mintTransferOrBurn(_checkItemPermissionAndRetrieveData(itemId), operator, sender, recipient, itemId, amount, true);
    }

    function permit(uint256 itemId, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) override external {
        require(block.timestamp <= deadline, "ERC20Permit: expired deadline");
        ItemData storage itemData = item[itemId];
        bytes32 digest = keccak256(
            abi.encodePacked(
                '\x19\x01',
                itemData.domainSeparator,
                keccak256(abi.encode(TYPEHASH_PERMIT, owner, spender, value, itemData.nonces[owner]++, deadline))
            )
        );
        address recoveredAddress = ecrecover(digest, v, r, s);
        require(recoveredAddress != address(0) && recoveredAddress == owner, 'INVALID_SIGNATURE');
        itemData.allowance[owner][spender] = value;
        if(msg.sender != address(uint160(itemId))) {
            IItemInteroperableInterface(address(uint160(itemId))).emitEvent(true, false, abi.encode(owner, spender, value));
        }
    }

    function nonces(address owner, uint256 itemId) external override view returns(uint256) {
        return item[itemId].nonces[owner];
    }

    function EIP712_PERMIT_DOMAINSEPARATOR_NAME_AND_VERSION() public override pure returns(string memory, string memory) {
        return ("Item", "1");
    }

    function _validateHeader(Header memory header, bytes32 collectionId) private view returns(Header memory) {
        require(!_stringIsEmpty(header.name = _stringIsEmpty(header.name) && collectionId != bytes32(0) ? collection[collectionId].name : header.name), "name");
        require(!_stringIsEmpty(header.symbol = _stringIsEmpty(header.symbol) && collectionId != bytes32(0) ? collection[collectionId].symbol : header.symbol), "symbol");
        require(!_stringIsEmpty(header.uri = _stringIsEmpty(header.uri) && collectionId != bytes32(0) ? collection[collectionId].uri : header.uri), "uri");
        header.host = collectionId != bytes32(0) ? address(0) : header.host;
        return header;
    }

    function _createOrMintItems(bytes32 createdCollectionId, CreateItem[] calldata items) private returns(uint256[] memory itemIds) {
        itemIds = new uint256[](items.length);
        for(uint256 i = 0; i < items.length; i++) {
            CreateItem memory itemToCreate = items[i];
            itemIds[i] = createdCollectionId != bytes32(0) ? 0 : itemToCreate.id;
            itemToCreate.collectionId = createdCollectionId != bytes32(0) ? createdCollectionId : itemToCreate.id != 0 ? item[itemToCreate.id].collectionId : itemToCreate.collectionId;
            require(createdCollectionId != bytes32(0) || (itemToCreate.collectionId != bytes32(0) && msg.sender == collection[itemToCreate.collectionId].host), "Unauthorized");
            if(itemIds[i] == 0) {
                address interoperableInterfaceAddress = interoperableInterfaceModel.clone();
                IItemInteroperableInterface(interoperableInterfaceAddress).init();
                ItemData storage newItem = item[itemIds[i] = uint160(interoperableInterfaceAddress)];
                newItem.collectionId = itemToCreate.collectionId;
                newItem.header = _validateHeader(itemToCreate.header, itemToCreate.collectionId);
                (string memory domainSeparatorName, string memory domainSeparatorVersion) = EIP712_PERMIT_DOMAINSEPARATOR_NAME_AND_VERSION();
                newItem.domainSeparator = keccak256(
                    abi.encode(
                        keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
                        keccak256(bytes(domainSeparatorName)),
                        keccak256(bytes(domainSeparatorVersion)),
                        block.chainid,
                        address(uint160(itemIds[i]))
                    )
                );
                emit CollectionItem(bytes32(0), newItem.collectionId, itemIds[i]);
                emit URI(newItem.header.uri, itemIds[i]);
            }
            _mint(itemIds[i], itemToCreate.accounts, itemToCreate.amounts);
        }
    }

    function _mint(uint256 itemId, address[] memory accounts, uint256[] memory amounts) private {
        for(uint256 i = 0; i < accounts.length; i++) {
            require(accounts[i] != address(0), "mint to the zero address");
            _mintTransferOrBurn(address(0), address(0), accounts[i], itemId, amounts[i], false);
        }
        _emitMultiEventsAndClear();
    }

    function _mintTransferOrBurn(bytes memory data) private {
        bool batch;
        (batch, data) = abi.decode(data, (bool, bytes));
        if(batch) {
            _mintTransferOrBurnBatch(data);
        } else {
            (address[] memory origins, address[] memory senders, address[] memory recipients, uint256[] memory itemIds, uint256[] memory amounts) = abi.decode(data, (address[], address[], address[], uint256[], uint256[]));
            for(uint256 i = 0; i < itemIds.length; i++) {
                _mintTransferOrBurn(origins[i], senders[i], recipients[i], itemIds[i], amounts[i], true);
            }
        }
        _emitMultiEventsAndClear();
    }

    function _mintTransferOrBurnBatch(bytes memory data) private {
        bytes[] memory batches = abi.decode(data, (bytes[]));
        for(uint256 i = 0; i < batches.length; i++) {
            (address operator, address sender, address recipient, uint256[] memory itemIds, uint256[] memory amounts) = abi.decode(batches[i], (address, address, address, uint256[], uint256[]));
            _mintTransferOrBurn(operator, sender, recipient, itemIds, amounts, true, false);
        }
    }

    function _mintTransferOrBurn(address operator, address sender, address recipient, uint256[] memory itemIds, uint256[] memory amounts, bool check, bool launchEvents) private {
        for(uint256 i = 0; i < itemIds.length; i++) {
            _mintTransferOrBurn(operator, sender, recipient, itemIds[i], amounts[i], check);
        }
        if(launchEvents) {
            _emitMultiEventsAndClear();
        }
    }

    function _mintTransferOrBurn(address operator, address sender, address recipient, uint256 itemId, uint256 amount, bool check) private {
        if(amount == 0) {
            return;
        }
        uint256 tokenIndex = _itemsIndexes[itemId];
        uint256[] storage items = _items[tokenIndex];
        if(items.length == 0 || items[0] != itemId) {
            items = _items[tokenIndex = _itemsIndexes[itemId] = _itemsLength++];
            items.push(itemId);
        }
        items.push(uint160(sender));
        items.push(uint160(recipient));
        items.push(amount);

        bytes32 key = keccak256(abi.encodePacked(operator, sender, recipient));
        items = _batchItems[key];
        if(items.length == 0) {
            _batchKeys.push(key);
            items.push(uint160(operator));
            items.push(uint160(sender));
            items.push(uint160(recipient));
        }
        if(_batchAmounts[key][itemId] == 0) {
            items.push(itemId);
        }
        _batchAmounts[key][itemId] += amount;
        _mintTransferOrBurn(check ? _checkItemPermissionAndRetrieveData(itemId) : item[itemId], operator, sender, recipient, itemId, amount, false);
    }

    function _mintTransferOrBurn(ItemData storage itemData, address operator, address sender, address recipient, uint256 itemId, uint256 amount, bool launchEvent) private {
        if(sender != address(0)) {
            if(operator != sender) {
                require(itemData.allowance[sender][operator] >= amount || isApprovedForAll[sender][operator], "amount exceeds allowance");
                if(itemData.allowance[sender][operator] >= amount) {
                    itemData.allowance[sender][operator] -= amount;
                } else {
                    delete itemData.allowance[sender][operator];
                }
            }
            require(itemData.balanceOf[sender] >= amount, "amount exceeds balance");
            itemData.balanceOf[sender] -= amount;
        } else {
            itemData.totalSupply += amount;
        }
        if(recipient != address(0)) {
            itemData.balanceOf[recipient] += amount;
        } else {
            itemData.totalSupply -= amount;
        }
        if(launchEvent) {
            emit TransferSingle(operator, sender, recipient, itemId, amount);
            if(itemId != uint160(msg.sender)) {
                IItemInteroperableInterface(address(uint160(itemId))).emitEvent(false, false, abi.encode(sender, recipient, amount));
            }
        }
    }

    function _checkItemPermissionAndRetrieveData(uint256 itemId) private view returns (ItemData storage itemData) {
        require(collection[(itemData = item[itemId]).collectionId].host == msg.sender || uint160(msg.sender) == itemId, "Unauthorized");
    }

    function _stringIsEmpty(string memory test) private pure returns(bool) {
        return keccak256(bytes(test)) == keccak256("");
    }

    function _emitMultiEventsAndClear() private {
        for(uint256 i = 0; i < _itemsLength; i++) {
            uint256[] storage items = _items[i];
            uint256 itemId = items[0];
            delete items[0];
            uint256 length = (items.length - 1) / 3;
            address[] memory senders = new address[](length);
            address[] memory receivers = new address[](length);
            uint256[] memory amounts = new uint256[](length);
            uint256 inc = 0;
            for(uint256 z = 1; z < items.length; z += 3) {
                senders[inc] = address(uint160(items[z]));
                delete items[z];
                receivers[inc] = address(uint160(items[z + 1]));
                delete items[z + 1];
                amounts[inc++] = items[z + 2];
                delete items[z + 2];
            }
            IItemInteroperableInterface(address(uint160(itemId))).emitEvent(false, true, abi.encode(senders, receivers, amounts));
            delete _itemsIndexes[itemId];
            delete _items[i];
        }
        delete _itemsLength;
        _emitMultiEventsAndClearBatch();
    }

    function _emitMultiEventsAndClearBatch() private {
        for(uint256 i = 0; i < _batchKeys.length; i++) {
            bytes32 key = _batchKeys[i];
            uint256[] storage items = _batchItems[key];
            uint256 length = items.length - 3;
            address operator = address(uint160(items[0]));
            delete items[0];
            address sender = address(uint160(items[1]));
            delete items[1];
            address receiver = address(uint160(items[2]));
            delete items[2];
            uint256 inc = 0;
            uint256[] memory itemIds = new uint256[](length);
            uint256[] memory amounts = new uint256[](length);
            for(uint256 z = 3; z < items.length; z++) {
                amounts[inc] = _batchAmounts[key][itemIds[inc] = items[z]];
                delete items[z];
                delete _batchAmounts[key][inc++];
            }
            emit TransferBatch(operator, sender, receiver, itemIds, amounts);
            delete _batchItems[key];
        }
        delete _batchKeys;
    }

    function _subjectIsAuthorizedFor(address, address location, bytes4 selector, bytes calldata, uint256) internal virtual override view returns(bool, bool) {
        if(location == address(this) && selector == this.setDynamicUriResolver.selector) {
            return (true, false);
        }
        return (false, false);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"bytes","name":"lazyInitData","type":"bytes"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"bytes32","name":"collectionId","type":"bytes32"}],"name":"Collection","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"fromCollectionId","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"toCollectionId","type":"bytes32"},{"indexed":true,"internalType":"uint256","name":"itemId","type":"uint256"}],"name":"CollectionItem","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"Host","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[],"name":"EIP712_PERMIT_DOMAINSEPARATOR_NAME_AND_VERSION","outputs":[{"internalType":"string","name":"","type":"string"},{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"TYPEHASH_PERMIT","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"itemId","type":"uint256"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"itemId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"balances","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"itemId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"itemId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"itemIds","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"burnBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"itemIds","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"burnBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"collection","outputs":[{"internalType":"address","name":"host","type":"address"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"uri","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"collectionId","type":"bytes32"}],"name":"collectionUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"host","type":"address"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"uri","type":"string"}],"internalType":"struct Header","name":"_collection","type":"tuple"},{"components":[{"components":[{"internalType":"address","name":"host","type":"address"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"uri","type":"string"}],"internalType":"struct Header","name":"header","type":"tuple"},{"internalType":"bytes32","name":"collectionId","type":"bytes32"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"internalType":"struct CreateItem[]","name":"items","type":"tuple[]"}],"name":"createCollection","outputs":[{"internalType":"bytes32","name":"collectionId","type":"bytes32"},{"internalType":"uint256[]","name":"itemIds","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"dynamicUriResolver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"host","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initializer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"interoperableInterfaceModel","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"itemId","type":"uint256"}],"name":"interoperableOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"item","outputs":[{"internalType":"bytes32","name":"collectionId","type":"bytes32"},{"components":[{"internalType":"address","name":"host","type":"address"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"uri","type":"string"}],"internalType":"struct Header","name":"header","type":"tuple"},{"internalType":"bytes32","name":"domainSeparator","type":"bytes32"},{"internalType":"uint256","name":"totalSupply","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"lazyInitData","type":"bytes"}],"name":"lazyInit","outputs":[{"internalType":"bytes","name":"lazyInitResponse","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"components":[{"internalType":"address","name":"host","type":"address"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"uri","type":"string"}],"internalType":"struct Header","name":"header","type":"tuple"},{"internalType":"bytes32","name":"collectionId","type":"bytes32"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"internalType":"struct CreateItem[]","name":"items","type":"tuple[]"}],"name":"mintItems","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isMulti","type":"bool"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"mintTransferOrBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"itemId","type":"uint256"}],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"itemId","type":"uint256"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"itemId","type":"uint256"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"plainUri","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":"itemIds","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"itemId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"collectionIds","type":"bytes32[]"},{"components":[{"internalType":"address","name":"host","type":"address"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"uri","type":"string"}],"internalType":"struct Header[]","name":"values","type":"tuple[]"}],"name":"setCollectionsMetadata","outputs":[{"components":[{"internalType":"address","name":"host","type":"address"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"uri","type":"string"}],"internalType":"struct Header[]","name":"oldValues","type":"tuple[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newValue","type":"address"}],"name":"setDynamicUriResolver","outputs":[{"internalType":"address","name":"oldValue","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newValue","type":"address"}],"name":"setHost","outputs":[{"internalType":"address","name":"oldValue","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"itemIds","type":"uint256[]"},{"internalType":"bytes32[]","name":"collectionIds","type":"bytes32[]"}],"name":"setItemsCollection","outputs":[{"internalType":"bytes32[]","name":"oldCollectionIds","type":"bytes32[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"itemIds","type":"uint256[]"},{"components":[{"internalType":"address","name":"host","type":"address"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"uri","type":"string"}],"internalType":"struct Header[]","name":"values","type":"tuple[]"}],"name":"setItemsMetadata","outputs":[{"components":[{"internalType":"address","name":"host","type":"address"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"uri","type":"string"}],"internalType":"struct Header[]","name":"oldValues","type":"tuple[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newValue","type":"string"}],"name":"setUri","outputs":[{"internalType":"string","name":"oldValue","type":"string"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"subject","type":"address"},{"internalType":"address","name":"location","type":"address"},{"internalType":"bytes4","name":"selector","type":"bytes4"},{"internalType":"bytes","name":"payload","type":"bytes"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"subjectIsAuthorizedFor","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"itemId","type":"uint256"}],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"itemId","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"itemId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b50604051620064f6380380620064f6833981016040819052620000349162000408565b80806000815111156200004e576200004c8162000057565b505b5050506200052f565b6000546060906001600160a01b031615620000a75760405162461bcd60e51b81526004016200009e906020808252600490820152631a5b9a5d60e21b604082015260600190565b60405180910390fd5b600080546001600160a01b031916331790558151620000d09083016020908101908401620003b4565b600180546001600160a01b039093166001600160a01b0319909316831790556040519092506000907fe2302c6b581cf0c2edec4248d3a7af323db67692e29b6dc37a7d9736bf5e4369908290a362000128816200012e565b92915050565b60608180602001905181019062000146919062000448565b600380546001600160a01b0319166001600160a01b038416179055825190935083906200017b906002906020860190620001eb565b5050505062000128816200019060201b60201c565b606081806020019051810190620001a891906200037c565b600580546001600160a01b039283166001600160a01b03199182161790915560048054939092169216919091179055505060408051602081019091526000815290565b828054620001f990620004dc565b90600052602060002090601f0160209004810192826200021d576000855562000268565b82601f106200023857805160ff191683800117855562000268565b8280016001018555821562000268579182015b82811115620002685782518255916020019190600101906200024b565b50620002769291506200027a565b5090565b5b808211156200027657600081556001016200027b565b60006001600160401b0380841115620002ae57620002ae62000519565b604051601f8501601f19908116603f01168101908282118183101715620002d957620002d962000519565b81604052809350858152868686011115620002f357600080fd5b600092505b8583101562000318578285015160208483010152602083019250620002f8565b858311156200032b576000602087830101525b5050509392505050565b80516001600160a01b03811681146200034d57600080fd5b919050565b600082601f8301126200036457600080fd5b620003758383516020850162000291565b9392505050565b600080604083850312156200039057600080fd5b6200039b8362000335565b9150620003ab6020840162000335565b90509250929050565b60008060408385031215620003c857600080fd5b620003d38362000335565b60208401519092506001600160401b03811115620003f057600080fd5b620003fe8582860162000352565b9150509250929050565b6000602082840312156200041b57600080fd5b81516001600160401b038111156200043257600080fd5b620004408482850162000352565b949350505050565b6000806000606084860312156200045e57600080fd5b83516001600160401b03808211156200047657600080fd5b818601915086601f8301126200048b57600080fd5b6200049c8783516020850162000291565b9450620004ac6020870162000335565b93506040860151915080821115620004c357600080fd5b50620004d28682870162000352565b9150509250925092565b600181811c90821680620004f157607f821691505b602082108114156200051357634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b615fb7806200053f6000396000f3fe608060405234801561001057600080fd5b506004361061027d5760003560e01c80636b20c4541161015c578063c1854355116100ce578063e6daf92411610087578063e6daf92414610662578063e985e9c514610678578063eac989f8146106a6578063f242432a146106ae578063f437bc59146106c1578063f5298aca146106d457600080fd5b8063c1854355146105e7578063c71bf12d146105fa578063c85e0be214610602578063ccfec2fb14610615578063cd6e1d7c14610628578063da95dccf1461063b57600080fd5b80639485fe72116101205780639485fe721461055b57806395d89b411461056e5780639b642de11461058b5780639ce110d71461059e578063a22cb465146105b1578063bd85b039146105c457600080fd5b80636b20c454146104df5780637f7eeb86146104f2578063843d32d914610512578063898e6219146105255780638a94b05f1461054857600080fd5b80633f47e662116101f55780634e41a1fb116101b95780634e41a1fb14610439578063502e1a161461044c5780635473422e146104855780635611d4e914610498578063598af9e7146104b957806359ded0fe146104cc57600080fd5b80633f47e662146103cc57806341607140146103e0578063457f4bcc146104005780634dc5ecb3146104135780634e1273f41461042657600080fd5b80630a193026116102475780630a1930261461033b5780630c32d758146103505780630e89341c146103705780632d7f1d2b146103835780632eb2c2d61461039657806336a6802f146103a957600080fd5b8062ad800c14610282578062fdd58e146102ab57806301ffc9a7146102cc57806303fbd7fd146102ef57806306fdde031461031a575b600080fd5b6102956102903660046153b4565b6106e7565b6040516102a29190615ac8565b60405180910390f35b6102be6102b9366004615060565b61078c565b6040519081526020016102a2565b6102df6102da3660046153cd565b6107b8565b60405190151581526020016102a2565b6103026102fd366004614afb565b61089a565b6040516001600160a01b0390911681526020016102a2565b6040805180820190915260058152644974656d7360d81b6020820152610295565b61034e610349366004615342565b6108ec565b005b61036361035e366004615123565b610974565b6040516102a291906159c6565b61029561037e3660046153b4565b610dda565b600454610302906001600160a01b031681565b61034e6103a4366004614cc9565b610eb6565b6103bc6103b73660046153b4565b610f3a565b6040516102a294939291906158f4565b6102be6103da3660046153b4565b50601290565b6103f36103ee3660046152e4565b611105565b6040516102a29190615a28565b61029561040e366004615407565b611113565b61034e610421366004614e4b565b611154565b6103f3610434366004615123565b6112a4565b6102956104473660046153b4565b61139d565b6102be61045a366004615060565b60009081526007602090815260408083206001600160a01b0394909416835260099093019052205490565b61034e610493366004614f8e565b6113bd565b6104ab6104a63660046154e6565b611439565b6040516102a2929190615a83565b6102be6104c7366004614e0a565b611590565b61034e6104da366004615549565b611603565b61034e6104ed366004614f0c565b6118e1565b610505610500366004615123565b6118fe565b6040516102a29190615982565b6102956105203660046153b4565b611b72565b6105386105333660046153b4565b611c33565b6040516102a29493929190615a9c565b61034e6105563660046150c1565b611e31565b610363610569366004615123565b611e56565b6040805180820190915260018152604960f81b6020820152610295565b610295610599366004615407565b612291565b600054610302906001600160a01b031681565b61034e6105bf366004615032565b61235c565b6102be6105d23660046153b4565b60009081526007602052604090206006015490565b6103026105f53660046153b4565b6123c8565b6102956123ea565b610302610610366004614afb565b612478565b600354610302906001600160a01b031681565b6102df610636366004614d87565b6124ef565b6102be7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b61066a612642565b6040516102a2929190615adb565b6102df610686366004614c9b565b600860209081526000928352604080842090915290825290205460ff1681565b610295612678565b61034e6106bc366004614e91565b612722565b600154610302906001600160a01b031681565b61034e6106e236600461508c565b61274f565b600081815260076020526040902060020180546060919061070790615de5565b80601f016020809104026020016040519081016040528092919081815260200182805461073390615de5565b80156107805780601f1061075557610100808354040283529160200191610780565b820191906000526020600020905b81548152906001019060200180831161076357829003601f168201915b50505050509050919050565b60008181526007602081815260408084206001600160a01b038716855290920190529020545b92915050565b60006001600160e01b031982166301ffc9a760e01b14806107e957506001600160e01b031982166301ffc9a760e01b145b8061080457506001600160e01b03198216630a267c7760e21b145b8061081f57506001600160e01b0319821663115fd2f360e21b145b8061083a57506001600160e01b03198216639ce110d760e01b145b8061085557506001600160e01b0319821663335b875f60e21b145b8061087057506001600160e01b0319821663f437bc5960e01b145b8061088b57506001600160e01b0319821663642f05f160e11b145b806107b257506107b28261276a565b60006108a4612816565b6108c95760405162461bcd60e51b81526004016108c090615bf3565b60405180910390fd5b50600380546001600160a01b039283166001600160a01b03198216179091551690565b82156109365761093182828080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061283392505050565b505050565b60008080808061094886880188614bf0565b9450945094509450945061096a61095e83612944565b86868686866001612998565b5050505050505050565b6060816001600160401b0381111561098e5761098e615e8d565b6040519080825280602002602001820160405280156109c757816020015b6109b46145cb565b8152602001906001900390816109ac5790505b50905060005b82811015610dd1576000600660008888858181106109ed576109ed615e77565b6020908102929092013583525081810192909252604090810160002081516080810190925280546001600160a01b03168252600181018054919450339385929084019190610a3a90615de5565b80601f0160208091040260200160405190810160405280929190818152602001828054610a6690615de5565b8015610ab35780601f10610a8857610100808354040283529160200191610ab3565b820191906000526020600020905b815481529060010190602001808311610a9657829003601f168201915b50505050508152602001600282018054610acc90615de5565b80601f0160208091040260200160405190810160405280929190818152602001828054610af890615de5565b8015610b455780601f10610b1a57610100808354040283529160200191610b45565b820191906000526020600020905b815481529060010190602001808311610b2857829003601f168201915b50505050508152602001600382018054610b5e90615de5565b80601f0160208091040260200160405190810160405280929190818152602001828054610b8a90615de5565b8015610bd75780601f10610bac57610100808354040283529160200191610bd7565b820191906000526020600020905b815481529060010190602001808311610bba57829003601f168201915b505050505081525050848481518110610bf257610bf2615e77565b60200260200101819052600001516001600160a01b031614610c265760405162461bcd60e51b81526004016108c090615bcd565b6000610c5f868685818110610c3d57610c3d615e77565b9050602002810190610c4f9190615c2f565b610c5890615dad565b6000612d13565b600660008a8a87818110610c7557610c75615e77565b6020908102929092013583525081810192909252604001600020825181546001600160a01b0319166001600160a01b039091161781558282015180519192610cc5926001850192909101906145fc565b5060408201518051610ce19160028401916020909101906145fc565b5060608201518051610cfd9160038401916020909101906145fc565b505485516001600160a01b03909116925085915084908110610d2157610d21615e77565b6020026020010151600001516001600160a01b0316816001600160a01b031614610dbc57878784818110610d5757610d57615e77565b90506020020135816001600160a01b0316858581518110610d7a57610d7a615e77565b6020026020010151600001516001600160a01b03167ffc158a4d7a7dcc14997766b113bc2e03e03ffaf192565fc0766361b53f57a8ae60405160405180910390a45b50508080610dc990615e46565b9150506109cd565b50949350505050565b600081815260076020526040902060048101805460609291610eaf91610dff90615de5565b80601f0160208091040260200160405190810160405280929190818152602001828054610e2b90615de5565b8015610e785780601f10610e4d57610100808354040283529160200191610e78565b820191906000526020600020905b815481529060010190602001808311610e5b57829003601f168201915b50508554604051610e9b9450909250889150602001918252602082015260400190565b60405160208183030381529060405261304b565b9392505050565b610f2933898989898080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808d0282810182019093528c82529093508c92508b91829185019084908082843760009201829052509250600191506130ef9050565b61096a33898989898989898961315c565b600660205260009081526040902080546001820180546001600160a01b039092169291610f6690615de5565b80601f0160208091040260200160405190810160405280929190818152602001828054610f9290615de5565b8015610fdf5780601f10610fb457610100808354040283529160200191610fdf565b820191906000526020600020905b815481529060010190602001808311610fc257829003601f168201915b505050505090806002018054610ff490615de5565b80601f016020809104026020016040519081016040528092919081815260200182805461102090615de5565b801561106d5780601f106110425761010080835404028352916020019161106d565b820191906000526020600020905b81548152906001019060200180831161105057829003601f168201915b50505050509080600301805461108290615de5565b80601f01602080910402602001604051908101604052809291908181526020018280546110ae90615de5565b80156110fb5780601f106110d0576101008083540402835291602001916110fb565b820191906000526020600020905b8154815290600101906020018083116110de57829003601f168201915b5050505050905084565b6060610eaf600084846132e0565b6060610eaf83838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061371e92505050565b6000336001600160a01b038616146111745761116f82612944565b611183565b60008281526007602052604090205b90506001600160a01b0384166111db5760405162461bcd60e51b815260206004820152601b60248201527f617070726f766520746f20746865207a65726f2061646472657373000000000060448201526064016108c0565b6001600160a01b0385811660009081526008830160209081526040808320888516845290915290208490558216331461129d57604080516001600160a01b038781166020830152868116828401526060808301879052835180840390910181526080830193849052636952b02f60e11b90935284169163d2a5605e9161126a9160019160009190608401615a60565b600060405180830381600087803b15801561128457600080fd5b505af1158015611298573d6000803e3d6000fd5b505050505b5050505050565b6060816001600160401b038111156112be576112be615e8d565b6040519080825280602002602001820160405280156112e7578160200160208202803683370190505b50905060005b8151811015610dd1576007600085858481811061130c5761130c615e77565b905060200201358152602001908152602001600020600701600087878481811061133857611338615e77565b905060200201602081019061134d9190614afb565b6001600160a01b03166001600160a01b031681526020019081526020016000205482828151811061138057611380615e77565b60209081029190910101528061139581615e46565b9150506112ed565b600081815260076020526040902060030180546060919061070790615de5565b6114313387600088888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808c0282810182019093528b82529093508b92508a91829185019084908082843760009201829052509250600191506130ef9050565b505050505050565b600060608161144a610c5887615dad565b6009805460069160009161146b918361146283615e46565b919050556137e0565b8082526020808301939093526040909101600020835181546001600160a01b0319166001600160a01b0390911617815583830151805192975090926114b8926001850192909101906145fc565b50604082015180516114d49160028401916020909101906145fc565b50606082015180516114f09160038401916020909101906145fc565b5080549092506001600160a01b0316151590508061150d57508315155b6115415760405162461bcd60e51b8152602060048201526005602482015264456d70747960d81b60448201526064016108c0565b805460405184916001600160a01b0316906000907ffc158a4d7a7dcc14997766b113bc2e03e03ffaf192565fc0766361b53f57a8ae908290a46115858386866132e0565b915050935093915050565b6001600160a01b03808416600090815260086020908152604080832093861683529290529081205460ff166115f75760008281526007602090815260408083206001600160a01b0380891685526008909101835281842090871684529091529020546115fb565b6000195b949350505050565b834211156116535760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e6500000060448201526064016108c0565b600088815260076020908152604080832060058101546001600160a01b038c168552600982019093529083208054919392917f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918c918c918c9190876116b883615e46565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810188905260e0016040516020818303038152906040528051906020012060405160200161173192919061190160f01b81526002810192909252602282015260420190565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa15801561179c573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906117d25750896001600160a01b0316816001600160a01b0316145b6118125760405162461bcd60e51b8152602060048201526011602482015270494e56414c49445f5349474e415455524560781b60448201526064016108c0565b6001600160a01b038a8116600090815260088501602090815260408083208d8516845290915290208990558b1633146118d457604080516001600160a01b038c811660208301528b81168284015260608083018c9052835180840390910181526080830193849052636952b02f60e11b9093528d169163d2a5605e916118a19160019160009190608401615a60565b600060405180830381600087803b1580156118bb57600080fd5b505af11580156118cf573d6000803e3d6000fd5b505050505b5050505050505050505050565b61129d8585858585604051806020016040528060008152506113bd565b6060836001600160401b0381111561191857611918615e8d565b604051908082528060200260200182016040528015611941578160200160208202803683370190505b50905060005b84811015610dd15760006007600088888581811061196757611967615e77565b9050602002013581526020019081526020016000209050336001600160a01b03166006600083600001548686815181106119a3576119a3615e77565b6020908102919091018101829052908252810191909152604001600020546001600160a01b0316146119e75760405162461bcd60e51b81526004016108c090615bcd565b611aad60066000878786818110611a0057611a00615e77565b905060200201358460000181905581526020019081526020016000206001018054611a2a90615de5565b80601f0160208091040260200160405190810160405280929190818152602001828054611a5690615de5565b8015611aa35780601f10611a7857610100808354040283529160200191611aa3565b820191906000526020600020905b815481529060010190602001808311611a8657829003601f168201915b5050505050613862565b15611ae75760405162461bcd60e51b815260206004820152600a60248201526931b7b63632b1ba34b7b760b11b60448201526064016108c0565b868683818110611af957611af9615e77565b90506020020135858584818110611b1257611b12615e77565b90506020020135848481518110611b2b57611b2b615e77565b60200260200101517f362b9f3b1459f7eb09b6b87f74b6ea9edc74332819c66c2d2a95b3fa6195211a60405160405180910390a45080611b6a81615e46565b915050611947565b600081815260066020526040902060030180546060916107b291611b9590615de5565b80601f0160208091040260200160405190810160405280929190818152602001828054611bc190615de5565b8015611c0e5780601f10611be357610100808354040283529160200191611c0e565b820191906000526020600020905b815481529060010190602001808311611bf157829003601f168201915b5050505050836000604051602001610e9b92919091825260ff16602082015260400190565b60076020908152600091825260409182902080548351608081019094526001820180546001600160a01b0316855260028301805492959394919291840191611c7a90615de5565b80601f0160208091040260200160405190810160405280929190818152602001828054611ca690615de5565b8015611cf35780601f10611cc857610100808354040283529160200191611cf3565b820191906000526020600020905b815481529060010190602001808311611cd657829003601f168201915b50505050508152602001600282018054611d0c90615de5565b80601f0160208091040260200160405190810160405280929190818152602001828054611d3890615de5565b8015611d855780601f10611d5a57610100808354040283529160200191611d85565b820191906000526020600020905b815481529060010190602001808311611d6857829003601f168201915b50505050508152602001600382018054611d9e90615de5565b80601f0160208091040260200160405190810160405280929190818152602001828054611dca90615de5565b8015611e175780601f10611dec57610100808354040283529160200191611e17565b820191906000526020600020905b815481529060010190602001808311611dfa57829003601f168201915b505050505081525050908060050154908060060154905084565b6000838152600760205260408120611e50913390879087876001612998565b50505050565b6060816001600160401b03811115611e7057611e70615e8d565b604051908082528060200260200182016040528015611ea957816020015b611e966145cb565b815260200190600190039081611e8e5790505b50905060005b82811015610dd157600060076000888885818110611ecf57611ecf615e77565b9050602002013581526020019081526020016000209050806001016040518060800160405290816000820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b03168152602001600182018054611f3490615de5565b80601f0160208091040260200160405190810160405280929190818152602001828054611f6090615de5565b8015611fad5780601f10611f8257610100808354040283529160200191611fad565b820191906000526020600020905b815481529060010190602001808311611f9057829003601f168201915b50505050508152602001600282018054611fc690615de5565b80601f0160208091040260200160405190810160405280929190818152602001828054611ff290615de5565b801561203f5780601f106120145761010080835404028352916020019161203f565b820191906000526020600020905b81548152906001019060200180831161202257829003601f168201915b5050505050815260200160038201805461205890615de5565b80601f016020809104026020016040519081016040528092919081815260200182805461208490615de5565b80156120d15780601f106120a6576101008083540402835291602001916120d1565b820191906000526020600020905b8154815290600101906020018083116120b457829003601f168201915b5050505050815250508383815181106120ec576120ec615e77565b60209081029190910181019190915281546000908152600690915260409020546001600160a01b031633146121335760405162461bcd60e51b81526004016108c090615bcd565b61216a85858481811061214857612148615e77565b905060200281019061215a9190615c2f565b61216390615dad565b8254612d13565b80516001830180546001600160a01b0319166001600160a01b0390921691909117815560208083015180516121a592600287019201906145fc565b50604082015180516121c19160028401916020909101906145fc565b50606082015180516121dd9160038401916020909101906145fc565b509050508282815181106121f3576121f3615e77565b602002602001015160600151805190602001208160010160030160405161221a919061573e565b60405180910390201461227e5786868381811061223957612239615e77565b905060200201357f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b826001016003016040516122759190615b00565b60405180910390a25b508061228981615e46565b915050611eaf565b606061229b612816565b6122b75760405162461bcd60e51b81526004016108c090615bf3565b600280546122c490615de5565b80601f01602080910402602001604051908101604052809291908181526020018280546122f090615de5565b801561233d5780601f106123125761010080835404028352916020019161233d565b820191906000526020600020905b81548152906001019060200180831161232057829003601f168201915b50505050509050828260029190612355929190614680565b5092915050565b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600081815260076020526040812054156123e257816107b2565b600092915050565b600280546123f790615de5565b80601f016020809104026020016040519081016040528092919081815260200182805461242390615de5565b80156124705780601f1061244557610100808354040283529160200191612470565b820191906000526020600020905b81548152906001019060200180831161245357829003601f168201915b505050505081565b6000612482612816565b61249e5760405162461bcd60e51b81526004016108c090615bf3565b50600180546001600160a01b0319166001600160a01b038316908117909155604051819081907fe2302c6b581cf0c2edec4248d3a7af323db67692e29b6dc37a7d9736bf5e436990600090a3919050565b600080600061250289898989898961388f565b9150915081156125155791506126389050565b6001546001600160a01b038a81169116141561253657600192505050612638565b60015461254b906001600160a01b03166138dd565b61255a57600092505050612638565b60015460405160009182916001600160a01b039091169063335b875f60e21b90612592908e908e908e908e908e908e90602401615814565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516125d09190615722565b600060405180830381855afa9150503d806000811461260b576040519150601f19603f3d011682016040523d82523d6000602084013e612610565b606091505b50915091508180156126315750808060200190518101906126319190615325565b9450505050505b9695505050505050565b60408051808201825260048152634974656d60e01b602080830191909152825180840190935260018352603160f81b9083015291565b606061271d6002805461268a90615de5565b80601f01602080910402602001604051908101604052809291908181526020018280546126b690615de5565b80156127035780601f106126d857610100808354040283529160200191612703565b820191906000526020600020905b8154815290600101906020018083116126e657829003601f168201915b50505050506040518060200160405280600081525061304b565b905090565b60008481526007602052604090206127409033888888886001612998565b611431338787878787876138fc565b61093183838360405180602001604052806000815250611e31565b60006001600160e01b03198216633cd9a01960e11b148061279b57506001600160e01b0319821663c71bf12d60e01b145b806127b657506001600160e01b03198216631d59313f60e31b145b806127d157506001600160e01b0319821663ccfec2fb60e01b145b806127ec57506001600160e01b03198216639b642de160e01b145b8061280757506001600160e01b031982166303fbd7fd60e01b145b806107b257506107b2826139cf565b600061271d33306000356001600160e01b031916600036346124ef565b6000818060200190518101906128499190615396565b9250905080156128615761285c82613a55565b612938565b60008060008060008680602001905181019061287d919061518e565b9450945094509450945060005b82518110156129315761291f8682815181106128a8576128a8615e77565b60200260200101518683815181106128c2576128c2615e77565b60200260200101518684815181106128dc576128dc615e77565b60200260200101518685815181106128f6576128f6615e77565b602002602001015186868151811061291057612910615e77565b60200260200101516001613ae1565b8061292981615e46565b91505061288a565b5050505050505b612940613d2e565b5050565b6000818152600760209081526040808320805484526006909252909120546001600160a01b031633148061297757503382145b6129935760405162461bcd60e51b81526004016108c090615bcd565b919050565b6001600160a01b03851615612b9c57846001600160a01b0316866001600160a01b031614612b04576001600160a01b0380861660009081526008890160209081526040808320938a168352929052205482111580612a1b57506001600160a01b038086166000908152600860209081526040808320938a168352929052205460ff165b612a675760405162461bcd60e51b815260206004820152601860248201527f616d6f756e74206578636565647320616c6c6f77616e6365000000000000000060448201526064016108c0565b6001600160a01b0380861660009081526008890160209081526040808320938a16835292905220548211612ad9576001600160a01b0380861660009081526008890160209081526040808320938a1683529290529081208054849290612ace908490615cf1565b90915550612b049050565b6001600160a01b0380861660009081526008890160209081526040808320938a168352929052908120555b6001600160a01b0385166000908152600788016020526040902054821115612b675760405162461bcd60e51b8152602060048201526016602482015275616d6f756e7420657863656564732062616c616e636560501b60448201526064016108c0565b6001600160a01b038516600090815260078801602052604081208054849290612b91908490615cf1565b90915550612bb69050565b81876006016000828254612bb09190615cb7565b90915550505b6001600160a01b03841615612bfa576001600160a01b038416600090815260078801602052604081208054849290612bef908490615cb7565b90915550612c149050565b81876006016000828254612c0e9190615cf1565b90915550505b8015612d0a57836001600160a01b0316856001600160a01b0316876001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628686604051612c72929190918252602082015260400190565b60405180910390a4338314612d0a57604080516001600160a01b038781166020830152868116828401526060808301869052835180840390910181526080830193849052636952b02f60e11b90935285169163d2a5605e91612cdc91600091829190608401615a60565b600060405180830381600087803b158015612cf657600080fd5b505af11580156118d4573d6000803e3d6000fd5b50505050505050565b612d1b6145cb565b612deb612d2b8460200151613862565b8015612d3657508215155b612d44578360200151612ddf565b60008381526006602052604090206001018054612d6090615de5565b80601f0160208091040260200160405190810160405280929190818152602001828054612d8c90615de5565b8015612dd95780601f10612dae57610100808354040283529160200191612dd9565b820191906000526020600020905b815481529060010190602001808311612dbc57829003601f168201915b50505050505b84602001819052613862565b15612e215760405162461bcd60e51b81526004016108c0906020808252600490820152636e616d6560e01b604082015260600190565b612ef1612e318460400151613862565b8015612e3c57508215155b612e4a578360400151612ee5565b60008381526006602052604090206002018054612e6690615de5565b80601f0160208091040260200160405190810160405280929190818152602001828054612e9290615de5565b8015612edf5780601f10612eb457610100808354040283529160200191612edf565b820191906000526020600020905b815481529060010190602001808311612ec257829003601f168201915b50505050505b84604001819052613862565b15612f275760405162461bcd60e51b81526020600482015260066024820152651cde5b589bdb60d21b60448201526064016108c0565b612ff7612f378460600151613862565b8015612f4257508215155b612f50578360600151612feb565b60008381526006602052604090206003018054612f6c90615de5565b80601f0160208091040260200160405190810160405280929190818152602001828054612f9890615de5565b8015612fe55780601f10612fba57610100808354040283529160200191612fe5565b820191906000526020600020905b815481529060010190602001808311612fc857829003601f168201915b50505050505b84606001819052613862565b1561302a5760405162461bcd60e51b815260206004820152600360248201526275726960e81b60448201526064016108c0565b81613036578251613039565b60005b6001600160a01b031683525090919050565b6003546060906001600160a01b03166130655750816107b2565b60035460405163f709c9b760e01b81526001600160a01b039091169063f709c9b79061309b9030908790879033906004016158ab565b60006040518083038186803b1580156130b357600080fd5b505afa1580156130c7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610eaf919081019061543c565b60005b845181101561314d5761313b88888888858151811061311357613113615e77565b602002602001015188868151811061312d5761312d615e77565b602002602001015188613ae1565b8061314581615e46565b9150506130f2565b508015612d0a57612d0a613d2e565b61316e876001600160a01b03166138dd565b156112985760405163bc197c8160e01b81526001600160a01b0388169063bc197c81906131ad908c908c908b908b908b908b908b908b906004016157b0565b602060405180830381600087803b1580156131c757600080fd5b505af19250505080156131f7575060408051601f3d908101601f191682019092526131f4918101906153ea565b60015b6132a457613203615ea3565b806308c379a0141561323d5750613218615ebf565b80613223575061323f565b8060405162461bcd60e51b81526004016108c09190615ac8565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b60648201526084016108c0565b6001600160e01b0319811663bc197c8160e01b146132d45760405162461bcd60e51b81526004016108c090615b85565b50505050505050505050565b6060816001600160401b038111156132fa576132fa615e8d565b604051908082528060200260200182016040528015613323578160200160208202803683370190505b50905060005b8281101561371657600084848381811061334557613345615e77565b90506020028101906133579190615c19565b61336090615d08565b905085613371578060400151613374565b60005b83838151811061338657613386615e77565b6020908102919091010152856133c05760408101516133a95780602001516133c2565b6040808201516000908152600760205220546133c2565b855b6020820152851515806133ff57506020810151158015906133ff57506020818101516000908152600690915260409020546001600160a01b031633145b61341b5760405162461bcd60e51b81526004016108c090615bcd565b82828151811061342d5761342d615e77565b6020026020010151600014156136d757600454600090613455906001600160a01b03166140cf565b9050806001600160a01b031663e1c7392a6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561349257600080fd5b505af11580156134a6573d6000803e3d6000fd5b50505050600060076000836001600160a01b03168787815181106134cc576134cc615e77565b6020026020010181815250815260200190815260200160002090508260200151816000018190555061350683600001518460200151612d13565b80516001830180546001600160a01b0319166001600160a01b03909216919091178155602080830151805161354192600287019201906145fc565b506040820151805161355d9160028401916020909101906145fc565b50606082015180516135799160038401916020909101906145fc565b50905050600080613588612642565b915091507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f82805190602001208280519060200120468a8a815181106135d0576135d0615e77565b60200260200101516040516020016136139594939291909485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b60405160208183030381529060405280519060200120836005018190555086868151811061364357613643615e77565b602090810291909101015183546040516000907f362b9f3b1459f7eb09b6b87f74b6ea9edc74332819c66c2d2a95b3fa6195211a908290a486868151811061368d5761368d615e77565b60200260200101517f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b846001016003016040516136ca9190615b00565b60405180910390a2505050505b6137038383815181106136ec576136ec615e77565b602002602001015182606001518360800151614111565b508061370e81615e46565b915050613329565b509392505050565b6000546060906001600160a01b0316156137635760405162461bcd60e51b81526004016108c0906020808252600490820152631a5b9a5d60e21b604082015260600190565b600080546001600160a01b03191633179055815161378a9083016020908101908401614c4b565b600180546001600160a01b039093166001600160a01b0319909316831790556040519092506000907fe2302c6b581cf0c2edec4248d3a7af323db67692e29b6dc37a7d9736bf5e4369908290a36107b2816141f6565b6000814243323a4144336137f5600587615cf1565b60408051602081019a909a5289019790975260608801959095526001600160a01b03938416608088015260a0870192909252821660c086015260e0850152166101008301524061012082015261014001604051602081830303815290604052805190602001209050919050565b80516020909101207fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4701490565b6000806001600160a01b038716301480156138ba57506001600160e01b031986166303fbd7fd60e01b145b156138cb57506001905060006138d2565b5060009050805b965096945050505050565b60006001600160a01b0382166138f557506000919050565b503b151590565b61390e856001600160a01b03166138dd565b15612d0a5760405163f23a6e6160e01b81526001600160a01b0386169063f23a6e6190613949908a908a908990899089908990600401615864565b602060405180830381600087803b15801561396357600080fd5b505af1925050508015613993575060408051601f3d908101601f19168201909252613990918101906153ea565b60015b61399f57613203615ea3565b6001600160e01b0319811663f23a6e6160e01b1461096a5760405162461bcd60e51b81526004016108c090615b85565b6005546040516301ffc9a760e01b81526001600160e01b0319831660048201526000916001600160a01b0316906301ffc9a79060240160206040518083038186803b158015613a1d57600080fd5b505afa158015613a31573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107b29190615325565b600081806020019051810190613a6b9190615223565b905060005b8151811015610931576000806000806000868681518110613a9357613a93615e77565b6020026020010151806020019051810190613aae9190614b52565b94509450945094509450613ac98585858585600160006130ef565b50505050508080613ad990615e46565b915050613a70565b81613aeb57611431565b6000838152600c6020908152604080832054808452600a90925290912080541580613b3357508481600081548110613b2557613b25615e77565b906000526020600020015414155b15613b8f57600b8054600a916000919082613b4d83615e46565b909155506000888152600c6020908152604080832084905583855284820195909552929093018320805460018101825581855292909320909101879055925090505b805460018082018355600083815260208082206001600160a01b038c81169582019590955585548085018755948b169481019490945584549283019094559101859055604080516bffffffffffffffffffffffff1960608c811b8216838701528b811b821660348401528a901b1660488201528151808203603c018152605c9091018252805190840120808352600d90935290208054909190613c9b57600f805460018181019092557f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac80201829055825480820184556000848152602090206001600160a01b03808d1692820192909255845480840186558b831690820155845492830185559089169101555b6000818152600e60209081526040808320898452909152902054613ccf578154600181018355600083815260209020018690555b6000818152600e6020908152604080832089845290915281208054879290613cf8908490615cb7565b90915550611298905084613d19576000878152600760205260409020613d22565b613d2287612944565b8a8a8a8a8a6000612998565b60005b600b548110156140bf576000818152600a60205260408120805490919082908290613d5e57613d5e615e77565b9060005260206000200154905081600081548110613d7e57613d7e615e77565b600091825260208220018190558254600390613d9c90600190615cf1565b613da69190615ccf565b90506000816001600160401b03811115613dc257613dc2615e8d565b604051908082528060200260200182016040528015613deb578160200160208202803683370190505b5090506000826001600160401b03811115613e0857613e08615e8d565b604051908082528060200260200182016040528015613e31578160200160208202803683370190505b5090506000836001600160401b03811115613e4e57613e4e615e8d565b604051908082528060200260200182016040528015613e77578160200160208202803683370190505b509050600060015b8754811015613ff557878181548110613e9a57613e9a615e77565b9060005260206000200154858381518110613eb757613eb7615e77565b60200260200101906001600160a01b031690816001600160a01b031681525050878181548110613ee957613ee9615e77565b600091825260208220015587613f00826001615cb7565b81548110613f1057613f10615e77565b9060005260206000200154848381518110613f2d57613f2d615e77565b6001600160a01b039092166020928302919091019091015287613f51826001615cb7565b81548110613f6157613f61615e77565b600091825260208220015587613f78826002615cb7565b81548110613f8857613f88615e77565b9060005260206000200154838380613f9f90615e46565b945081518110613fb157613fb1615e77565b602090810291909101015287613fc8826002615cb7565b81548110613fd857613fd8615e77565b6000918252602082200155613fee600382615cb7565b9050613e7f565b50856001600160a01b031663d2a5605e6000600187878760405160200161401e93929190615949565b6040516020818303038152906040526040518463ffffffff1660e01b815260040161404b93929190615a60565b600060405180830381600087803b15801561406557600080fd5b505af1158015614079573d6000803e3d6000fd5b5050506000878152600c602090815260408083208390558b8352600a90915281206140a59250906146f4565b5050505050505080806140b790615e46565b915050613d31565b506000600b556140cd61424c565b565b60006901000000000000000000820268803b80938091923cf36258807360e81b01176000526020600080f09050803b80156141095761410b565bfe5b50919050565b60005b82518110156141ed5760006001600160a01b031683828151811061413a5761413a615e77565b60200260200101516001600160a01b031614156141995760405162461bcd60e51b815260206004820152601860248201527f6d696e7420746f20746865207a65726f2061646472657373000000000000000060448201526064016108c0565b6141db6000808584815181106141b1576141b1615e77565b6020026020010151878686815181106141cc576141cc615e77565b60200260200101516000613ae1565b806141e581615e46565b915050614114565b50610931613d2e565b60608180602001905181019061420c9190615470565b600380546001600160a01b0319166001600160a01b0384161790558251909350839061423f9060029060208601906145fc565b505050506107b281614572565b60005b600f54811015614565576000600f828154811061426e5761426e615e77565b6000918252602080832090910154808352600d909152604082208054919350919061429b90600390615cf1565b90506000826000815481106142b2576142b2615e77565b90600052602060002001549050826000815481106142d2576142d2615e77565b90600052602060002001600090556000836001815481106142f5576142f5615e77565b906000526020600020015490508360018154811061431557614315615e77565b906000526020600020016000905560008460028154811061433857614338615e77565b906000526020600020015490508460028154811061435857614358615e77565b9060005260206000200160009055600080856001600160401b0381111561438157614381615e8d565b6040519080825280602002602001820160405280156143aa578160200160208202803683370190505b5090506000866001600160401b038111156143c7576143c7615e8d565b6040519080825280602002602001820160405280156143f0578160200160208202803683370190505b50905060035b88548110156144da57600e60008b815260200190815260200160002060008a838154811061442657614426615e77565b906000526020600020015485878151811061444357614443615e77565b602002602001018181525081526020019081526020016000205482858151811061446f5761446f615e77565b60200260200101818152505088818154811061448d5761448d615e77565b600091825260208083209091018290558b8252600e90526040812090856144b381615e46565b965081526020019081526020016000206000905580806144d290615e46565b9150506143f6565b50836001600160a01b0316856001600160a01b0316876001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb858560405161452a929190615a3b565b60405180910390a46000898152600d60205260408120614549916146f4565b505050505050505050808061455d90615e46565b91505061424f565b506140cd600f60006146f4565b6060818060200190518101906145889190614b18565b600580546001600160a01b039283166001600160a01b03199182161790915560048054939092169216919091179055505060408051602081019091526000815290565b604051806080016040528060006001600160a01b031681526020016060815260200160608152602001606081525090565b82805461460890615de5565b90600052602060002090601f01602090048101928261462a5760008555614670565b82601f1061464357805160ff1916838001178555614670565b82800160010185558215614670579182015b82811115614670578251825591602001919060010190614655565b5061467c929150614715565b5090565b82805461468c90615de5565b90600052602060002090601f0160209004810192826146ae5760008555614670565b82601f106146c75782800160ff19823516178555614670565b82800160010185558215614670579182015b828111156146705782358255916020019190600101906146d9565b50805460008255906000526020600020908101906147129190614715565b50565b5b8082111561467c5760008155600101614716565b803561299381615f48565b60008083601f84011261474757600080fd5b5081356001600160401b0381111561475e57600080fd5b6020830191508360208260051b850101111561477957600080fd5b9250929050565b600082601f83011261479157600080fd5b8135602061479e82615c6d565b6040516147ab8282615e1a565b8381528281019150858301600585901b870184018810156147cb57600080fd5b60005b858110156147f35781356147e181615f48565b845292840192908401906001016147ce565b5090979650505050505050565b600082601f83011261481157600080fd5b8151602061481e82615c6d565b60405161482b8282615e1a565b8381528281019150858301600585901b8701840188101561484b57600080fd5b60005b858110156147f357815161486181615f48565b8452928401929084019060010161484e565b600082601f83011261488457600080fd5b8135602061489182615c6d565b60405161489e8282615e1a565b8381528281019150858301600585901b870184018810156148be57600080fd5b60005b858110156147f3578135845292840192908401906001016148c1565b600082601f8301126148ee57600080fd5b815160206148fb82615c6d565b6040516149088282615e1a565b8381528281019150858301600585901b8701840188101561492857600080fd5b60005b858110156147f35781518452928401929084019060010161492b565b60008083601f84011261495957600080fd5b5081356001600160401b0381111561497057600080fd5b60208301915083602082850101111561477957600080fd5b600082601f83011261499957600080fd5b81356149a481615c90565b6040516149b18282615e1a565b8281528560208487010111156149c657600080fd5b82602086016020830137600092810160200192909252509392505050565b600082601f8301126149f557600080fd5b8151614a0081615c90565b604051614a0d8282615e1a565b828152856020848701011115614a2257600080fd5b614a33836020830160208801615db9565b95945050505050565b600060808284031215614a4e57600080fd5b604051608081016001600160401b038282108183111715614a7157614a71615e8d565b81604052829350614a818561472a565b83526020850135915080821115614a9757600080fd5b614aa386838701614988565b60208401526040850135915080821115614abc57600080fd5b614ac886838701614988565b60408401526060850135915080821115614ae157600080fd5b50614aee85828601614988565b6060830152505092915050565b600060208284031215614b0d57600080fd5b8135610eaf81615f48565b60008060408385031215614b2b57600080fd5b8251614b3681615f48565b6020840151909250614b4781615f48565b809150509250929050565b600080600080600060a08688031215614b6a57600080fd5b8551614b7581615f48565b6020870151909550614b8681615f48565b6040870151909450614b9781615f48565b60608701519093506001600160401b0380821115614bb457600080fd5b614bc089838a016148dd565b93506080880151915080821115614bd657600080fd5b50614be3888289016148dd565b9150509295509295909350565b600080600080600060a08688031215614c0857600080fd5b8535614c1381615f48565b94506020860135614c2381615f48565b93506040860135614c3381615f48565b94979396509394606081013594506080013592915050565b60008060408385031215614c5e57600080fd5b8251614c6981615f48565b60208401519092506001600160401b03811115614c8557600080fd5b614c91858286016149e4565b9150509250929050565b60008060408385031215614cae57600080fd5b8235614cb981615f48565b91506020830135614b4781615f48565b60008060008060008060008060a0898b031215614ce557600080fd5b8835614cf081615f48565b97506020890135614d0081615f48565b965060408901356001600160401b0380821115614d1c57600080fd5b614d288c838d01614735565b909850965060608b0135915080821115614d4157600080fd5b614d4d8c838d01614735565b909650945060808b0135915080821115614d6657600080fd5b50614d738b828c01614947565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215614da057600080fd5b8635614dab81615f48565b95506020870135614dbb81615f48565b94506040870135614dcb81615f6b565b935060608701356001600160401b03811115614de657600080fd5b614df289828a01614947565b979a9699509497949695608090950135949350505050565b600080600060608486031215614e1f57600080fd5b8335614e2a81615f48565b92506020840135614e3a81615f48565b929592945050506040919091013590565b60008060008060808587031215614e6157600080fd5b8435614e6c81615f48565b93506020850135614e7c81615f48565b93969395505050506040820135916060013590565b60008060008060008060a08789031215614eaa57600080fd5b8635614eb581615f48565b95506020870135614ec581615f48565b9450604087013593506060870135925060808701356001600160401b03811115614eee57600080fd5b614efa89828a01614947565b979a9699509497509295939492505050565b600080600080600060608688031215614f2457600080fd5b8535614f2f81615f48565b945060208601356001600160401b0380821115614f4b57600080fd5b614f5789838a01614735565b90965094506040880135915080821115614f7057600080fd5b50614f7d88828901614735565b969995985093965092949392505050565b60008060008060008060808789031215614fa757600080fd5b8635614fb281615f48565b955060208701356001600160401b0380821115614fce57600080fd5b614fda8a838b01614735565b90975095506040890135915080821115614ff357600080fd5b614fff8a838b01614735565b9095509350606089013591508082111561501857600080fd5b5061502589828a01614988565b9150509295509295509295565b6000806040838503121561504557600080fd5b823561505081615f48565b91506020830135614b4781615f5d565b6000806040838503121561507357600080fd5b823561507e81615f48565b946020939093013593505050565b6000806000606084860312156150a157600080fd5b83356150ac81615f48565b95602085013595506040909401359392505050565b600080600080608085870312156150d757600080fd5b84356150e281615f48565b9350602085013592506040850135915060608501356001600160401b0381111561510b57600080fd5b61511787828801614988565b91505092959194509250565b6000806000806040858703121561513957600080fd5b84356001600160401b038082111561515057600080fd5b61515c88838901614735565b9096509450602087013591508082111561517557600080fd5b5061518287828801614735565b95989497509550505050565b600080600080600060a086880312156151a657600080fd5b85516001600160401b03808211156151bd57600080fd5b6151c989838a01614800565b965060208801519150808211156151df57600080fd5b6151eb89838a01614800565b9550604088015191508082111561520157600080fd5b61520d89838a01614800565b94506060880151915080821115614bb457600080fd5b6000602080838503121561523657600080fd5b82516001600160401b038082111561524d57600080fd5b818501915085601f83011261526157600080fd5b815161526c81615c6d565b6040516152798282615e1a565b8281528581019150848601600584901b860187018a101561529957600080fd5b6000805b858110156152d4578251878111156152b3578283fd5b6152c18d8b838c01016149e4565b865250938801939188019160010161529d565b50919a9950505050505050505050565b600080602083850312156152f757600080fd5b82356001600160401b0381111561530d57600080fd5b61531985828601614735565b90969095509350505050565b60006020828403121561533757600080fd5b8151610eaf81615f5d565b60008060006040848603121561535757600080fd5b833561536281615f5d565b925060208401356001600160401b0381111561537d57600080fd5b61538986828701614947565b9497909650939450505050565b600080604083850312156153a957600080fd5b8251614c6981615f5d565b6000602082840312156153c657600080fd5b5035919050565b6000602082840312156153df57600080fd5b8135610eaf81615f6b565b6000602082840312156153fc57600080fd5b8151610eaf81615f6b565b6000806020838503121561541a57600080fd5b82356001600160401b0381111561543057600080fd5b61531985828601614947565b60006020828403121561544e57600080fd5b81516001600160401b0381111561546457600080fd5b6115fb848285016149e4565b60008060006060848603121561548557600080fd5b83516001600160401b038082111561549c57600080fd5b6154a8878388016149e4565b9450602086015191506154ba82615f48565b6040860151919350808211156154cf57600080fd5b506154dc868287016149e4565b9150509250925092565b6000806000604084860312156154fb57600080fd5b83356001600160401b038082111561551257600080fd5b908501906080828803121561552657600080fd5b9093506020850135908082111561553c57600080fd5b5061538986828701614735565b600080600080600080600080610100898b03121561556657600080fd5b88359750602089013561557881615f48565b9650604089013561558881615f48565b9550606089013594506080890135935060a089013560ff811681146155ac57600080fd5b979a969950949793969295929450505060c08201359160e0013590565b600081518084526020808501945080840160005b838110156156025781516001600160a01b0316875295820195908201906001016155dd565b509495945050505050565b81835260006001600160fb1b0383111561562657600080fd5b8260051b8083602087013760009401602001938452509192915050565b600081518084526020808501945080840160005b8381101561560257815187529582019590820190600101615657565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b600081518084526156b4816020860160208601615db9565b601f01601f19169290920160200192915050565b60018060a01b03815116825260006020820151608060208501526156ef608085018261569c565b905060408301518482036040860152615708828261569c565b91505060608301518482036060860152614a33828261569c565b60008251615734818460208701615db9565b9190910192915050565b600080835461574c81615de5565b600182811680156157645760018114615775576157a4565b60ff198416875282870194506157a4565b8760005260208060002060005b8581101561579b5781548a820152908401908201615782565b50505082870194505b50929695505050505050565b6001600160a01b0389811682528816602082015260a0604082018190526000906157dd908301888a61560d565b82810360608401526157f081878961560d565b90508281036080840152615805818587615673565b9b9a5050505050505050505050565b6001600160a01b038781168252861660208201526001600160e01b03198516604082015260a0606082018190526000906158519083018587615673565b9050826080830152979650505050505050565b6001600160a01b03878116825286166020820152604081018590526060810184905260a06080820181905260009061589f9083018486615673565b98975050505050505050565b600060018060a01b038087168352608060208401526158cd608084018761569c565b83810360408501526158df818761569c565b92505080841660608401525095945050505050565b6001600160a01b03851681526080602082018190526000906159189083018661569c565b828103604084015261592a818661569c565b9050828103606084015261593e818561569c565b979650505050505050565b60608152600061595c60608301866155c9565b828103602084015261596e81866155c9565b905082810360408401526126388185615643565b6020808252825182820181905260009190848201906040850190845b818110156159ba5783518352928401929184019160010161599e565b50909695505050505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015615a1b57603f19888603018452615a098583516156c8565b945092850192908501906001016159ed565b5092979650505050505050565b602081526000610eaf6020830184615643565b604081526000615a4e6040830185615643565b8281036020840152614a338185615643565b83151581528215156020820152606060408201526000614a33606083018461569c565b8281526040602082015260006115fb6040830184615643565b848152608060208201526000615ab560808301866156c8565b6040830194909452506060015292915050565b602081526000610eaf602083018461569c565b604081526000615aee604083018561569c565b8281036020840152614a33818561569c565b6000602080835260008454615b1481615de5565b80848701526040600180841660008114615b355760018114615b4957615b77565b60ff19851689840152606089019550615b77565b896000528660002060005b85811015615b6f5781548b8201860152908301908801615b54565b8a0184019650505b509398975050505050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6020808252600c908201526b155b985d5d1a1bdc9a5e995960a21b604082015260600190565b6020808252600c908201526b1d5b985d5d1a1bdc9a5e995960a21b604082015260600190565b60008235609e1983360301811261573457600080fd5b60008235607e1983360301811261573457600080fd5b60405160a081016001600160401b0381118282101715615c6757615c67615e8d565b60405290565b60006001600160401b03821115615c8657615c86615e8d565b5060051b60200190565b60006001600160401b03821115615ca957615ca9615e8d565b50601f01601f191660200190565b60008219821115615cca57615cca615e61565b500190565b600082615cec57634e487b7160e01b600052601260045260246000fd5b500490565b600082821015615d0357615d03615e61565b500390565b600060a08236031215615d1a57600080fd5b615d22615c45565b82356001600160401b0380821115615d3957600080fd5b615d4536838701614a3c565b835260208501356020840152604085013560408401526060850135915080821115615d6f57600080fd5b615d7b36838701614780565b60608401526080850135915080821115615d9457600080fd5b50615da136828601614873565b60808301525092915050565b60006107b23683614a3c565b60005b83811015615dd4578181015183820152602001615dbc565b83811115611e505750506000910152565b600181811c90821680615df957607f821691505b6020821081141561410b57634e487b7160e01b600052602260045260246000fd5b601f8201601f191681016001600160401b0381118282101715615e3f57615e3f615e8d565b6040525050565b6000600019821415615e5a57615e5a615e61565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600060033d1115615ebc5760046000803e5060005160e01c5b90565b600060443d1015615ecd5790565b6040516003193d81016004833e81513d6001600160401b038160248401118184111715615efc57505050505090565b8285019150815181811115615f145750505050505090565b843d8701016020828501011115615f2e5750505050505090565b615f3d60208286010187615e1a565b509095945050505050565b6001600160a01b038116811461471257600080fd5b801515811461471257600080fd5b6001600160e01b03198116811461471257600080fdfea2646970667358221220fad2fb7153eda02e6c43744615766b767dc0efc5caebd9d4d300000cb28e3aeb64736f6c6343000806003300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000180000000000000000000000000c5c85480ac2e36a680bd0d53084dbad0cee9c29a0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000600000000000000000000000003ff777884412c7ce8a1da679b4b0cd54f720ab2e00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000003a697066733a2f2f697066732f516d64375736396d417779794d755634584333595167534a366b5156436e537846714b4b46655258335341736a4a000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000055bbab8bbefc49996507b84cccb92c74a0c2be3f000000000000000000000000e4cd064c93fe94c21884670b3708a7a57dd2afe3

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061027d5760003560e01c80636b20c4541161015c578063c1854355116100ce578063e6daf92411610087578063e6daf92414610662578063e985e9c514610678578063eac989f8146106a6578063f242432a146106ae578063f437bc59146106c1578063f5298aca146106d457600080fd5b8063c1854355146105e7578063c71bf12d146105fa578063c85e0be214610602578063ccfec2fb14610615578063cd6e1d7c14610628578063da95dccf1461063b57600080fd5b80639485fe72116101205780639485fe721461055b57806395d89b411461056e5780639b642de11461058b5780639ce110d71461059e578063a22cb465146105b1578063bd85b039146105c457600080fd5b80636b20c454146104df5780637f7eeb86146104f2578063843d32d914610512578063898e6219146105255780638a94b05f1461054857600080fd5b80633f47e662116101f55780634e41a1fb116101b95780634e41a1fb14610439578063502e1a161461044c5780635473422e146104855780635611d4e914610498578063598af9e7146104b957806359ded0fe146104cc57600080fd5b80633f47e662146103cc57806341607140146103e0578063457f4bcc146104005780634dc5ecb3146104135780634e1273f41461042657600080fd5b80630a193026116102475780630a1930261461033b5780630c32d758146103505780630e89341c146103705780632d7f1d2b146103835780632eb2c2d61461039657806336a6802f146103a957600080fd5b8062ad800c14610282578062fdd58e146102ab57806301ffc9a7146102cc57806303fbd7fd146102ef57806306fdde031461031a575b600080fd5b6102956102903660046153b4565b6106e7565b6040516102a29190615ac8565b60405180910390f35b6102be6102b9366004615060565b61078c565b6040519081526020016102a2565b6102df6102da3660046153cd565b6107b8565b60405190151581526020016102a2565b6103026102fd366004614afb565b61089a565b6040516001600160a01b0390911681526020016102a2565b6040805180820190915260058152644974656d7360d81b6020820152610295565b61034e610349366004615342565b6108ec565b005b61036361035e366004615123565b610974565b6040516102a291906159c6565b61029561037e3660046153b4565b610dda565b600454610302906001600160a01b031681565b61034e6103a4366004614cc9565b610eb6565b6103bc6103b73660046153b4565b610f3a565b6040516102a294939291906158f4565b6102be6103da3660046153b4565b50601290565b6103f36103ee3660046152e4565b611105565b6040516102a29190615a28565b61029561040e366004615407565b611113565b61034e610421366004614e4b565b611154565b6103f3610434366004615123565b6112a4565b6102956104473660046153b4565b61139d565b6102be61045a366004615060565b60009081526007602090815260408083206001600160a01b0394909416835260099093019052205490565b61034e610493366004614f8e565b6113bd565b6104ab6104a63660046154e6565b611439565b6040516102a2929190615a83565b6102be6104c7366004614e0a565b611590565b61034e6104da366004615549565b611603565b61034e6104ed366004614f0c565b6118e1565b610505610500366004615123565b6118fe565b6040516102a29190615982565b6102956105203660046153b4565b611b72565b6105386105333660046153b4565b611c33565b6040516102a29493929190615a9c565b61034e6105563660046150c1565b611e31565b610363610569366004615123565b611e56565b6040805180820190915260018152604960f81b6020820152610295565b610295610599366004615407565b612291565b600054610302906001600160a01b031681565b61034e6105bf366004615032565b61235c565b6102be6105d23660046153b4565b60009081526007602052604090206006015490565b6103026105f53660046153b4565b6123c8565b6102956123ea565b610302610610366004614afb565b612478565b600354610302906001600160a01b031681565b6102df610636366004614d87565b6124ef565b6102be7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b61066a612642565b6040516102a2929190615adb565b6102df610686366004614c9b565b600860209081526000928352604080842090915290825290205460ff1681565b610295612678565b61034e6106bc366004614e91565b612722565b600154610302906001600160a01b031681565b61034e6106e236600461508c565b61274f565b600081815260076020526040902060020180546060919061070790615de5565b80601f016020809104026020016040519081016040528092919081815260200182805461073390615de5565b80156107805780601f1061075557610100808354040283529160200191610780565b820191906000526020600020905b81548152906001019060200180831161076357829003601f168201915b50505050509050919050565b60008181526007602081815260408084206001600160a01b038716855290920190529020545b92915050565b60006001600160e01b031982166301ffc9a760e01b14806107e957506001600160e01b031982166301ffc9a760e01b145b8061080457506001600160e01b03198216630a267c7760e21b145b8061081f57506001600160e01b0319821663115fd2f360e21b145b8061083a57506001600160e01b03198216639ce110d760e01b145b8061085557506001600160e01b0319821663335b875f60e21b145b8061087057506001600160e01b0319821663f437bc5960e01b145b8061088b57506001600160e01b0319821663642f05f160e11b145b806107b257506107b28261276a565b60006108a4612816565b6108c95760405162461bcd60e51b81526004016108c090615bf3565b60405180910390fd5b50600380546001600160a01b039283166001600160a01b03198216179091551690565b82156109365761093182828080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061283392505050565b505050565b60008080808061094886880188614bf0565b9450945094509450945061096a61095e83612944565b86868686866001612998565b5050505050505050565b6060816001600160401b0381111561098e5761098e615e8d565b6040519080825280602002602001820160405280156109c757816020015b6109b46145cb565b8152602001906001900390816109ac5790505b50905060005b82811015610dd1576000600660008888858181106109ed576109ed615e77565b6020908102929092013583525081810192909252604090810160002081516080810190925280546001600160a01b03168252600181018054919450339385929084019190610a3a90615de5565b80601f0160208091040260200160405190810160405280929190818152602001828054610a6690615de5565b8015610ab35780601f10610a8857610100808354040283529160200191610ab3565b820191906000526020600020905b815481529060010190602001808311610a9657829003601f168201915b50505050508152602001600282018054610acc90615de5565b80601f0160208091040260200160405190810160405280929190818152602001828054610af890615de5565b8015610b455780601f10610b1a57610100808354040283529160200191610b45565b820191906000526020600020905b815481529060010190602001808311610b2857829003601f168201915b50505050508152602001600382018054610b5e90615de5565b80601f0160208091040260200160405190810160405280929190818152602001828054610b8a90615de5565b8015610bd75780601f10610bac57610100808354040283529160200191610bd7565b820191906000526020600020905b815481529060010190602001808311610bba57829003601f168201915b505050505081525050848481518110610bf257610bf2615e77565b60200260200101819052600001516001600160a01b031614610c265760405162461bcd60e51b81526004016108c090615bcd565b6000610c5f868685818110610c3d57610c3d615e77565b9050602002810190610c4f9190615c2f565b610c5890615dad565b6000612d13565b600660008a8a87818110610c7557610c75615e77565b6020908102929092013583525081810192909252604001600020825181546001600160a01b0319166001600160a01b039091161781558282015180519192610cc5926001850192909101906145fc565b5060408201518051610ce19160028401916020909101906145fc565b5060608201518051610cfd9160038401916020909101906145fc565b505485516001600160a01b03909116925085915084908110610d2157610d21615e77565b6020026020010151600001516001600160a01b0316816001600160a01b031614610dbc57878784818110610d5757610d57615e77565b90506020020135816001600160a01b0316858581518110610d7a57610d7a615e77565b6020026020010151600001516001600160a01b03167ffc158a4d7a7dcc14997766b113bc2e03e03ffaf192565fc0766361b53f57a8ae60405160405180910390a45b50508080610dc990615e46565b9150506109cd565b50949350505050565b600081815260076020526040902060048101805460609291610eaf91610dff90615de5565b80601f0160208091040260200160405190810160405280929190818152602001828054610e2b90615de5565b8015610e785780601f10610e4d57610100808354040283529160200191610e78565b820191906000526020600020905b815481529060010190602001808311610e5b57829003601f168201915b50508554604051610e9b9450909250889150602001918252602082015260400190565b60405160208183030381529060405261304b565b9392505050565b610f2933898989898080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808d0282810182019093528c82529093508c92508b91829185019084908082843760009201829052509250600191506130ef9050565b61096a33898989898989898961315c565b600660205260009081526040902080546001820180546001600160a01b039092169291610f6690615de5565b80601f0160208091040260200160405190810160405280929190818152602001828054610f9290615de5565b8015610fdf5780601f10610fb457610100808354040283529160200191610fdf565b820191906000526020600020905b815481529060010190602001808311610fc257829003601f168201915b505050505090806002018054610ff490615de5565b80601f016020809104026020016040519081016040528092919081815260200182805461102090615de5565b801561106d5780601f106110425761010080835404028352916020019161106d565b820191906000526020600020905b81548152906001019060200180831161105057829003601f168201915b50505050509080600301805461108290615de5565b80601f01602080910402602001604051908101604052809291908181526020018280546110ae90615de5565b80156110fb5780601f106110d0576101008083540402835291602001916110fb565b820191906000526020600020905b8154815290600101906020018083116110de57829003601f168201915b5050505050905084565b6060610eaf600084846132e0565b6060610eaf83838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061371e92505050565b6000336001600160a01b038616146111745761116f82612944565b611183565b60008281526007602052604090205b90506001600160a01b0384166111db5760405162461bcd60e51b815260206004820152601b60248201527f617070726f766520746f20746865207a65726f2061646472657373000000000060448201526064016108c0565b6001600160a01b0385811660009081526008830160209081526040808320888516845290915290208490558216331461129d57604080516001600160a01b038781166020830152868116828401526060808301879052835180840390910181526080830193849052636952b02f60e11b90935284169163d2a5605e9161126a9160019160009190608401615a60565b600060405180830381600087803b15801561128457600080fd5b505af1158015611298573d6000803e3d6000fd5b505050505b5050505050565b6060816001600160401b038111156112be576112be615e8d565b6040519080825280602002602001820160405280156112e7578160200160208202803683370190505b50905060005b8151811015610dd1576007600085858481811061130c5761130c615e77565b905060200201358152602001908152602001600020600701600087878481811061133857611338615e77565b905060200201602081019061134d9190614afb565b6001600160a01b03166001600160a01b031681526020019081526020016000205482828151811061138057611380615e77565b60209081029190910101528061139581615e46565b9150506112ed565b600081815260076020526040902060030180546060919061070790615de5565b6114313387600088888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808c0282810182019093528b82529093508b92508a91829185019084908082843760009201829052509250600191506130ef9050565b505050505050565b600060608161144a610c5887615dad565b6009805460069160009161146b918361146283615e46565b919050556137e0565b8082526020808301939093526040909101600020835181546001600160a01b0319166001600160a01b0390911617815583830151805192975090926114b8926001850192909101906145fc565b50604082015180516114d49160028401916020909101906145fc565b50606082015180516114f09160038401916020909101906145fc565b5080549092506001600160a01b0316151590508061150d57508315155b6115415760405162461bcd60e51b8152602060048201526005602482015264456d70747960d81b60448201526064016108c0565b805460405184916001600160a01b0316906000907ffc158a4d7a7dcc14997766b113bc2e03e03ffaf192565fc0766361b53f57a8ae908290a46115858386866132e0565b915050935093915050565b6001600160a01b03808416600090815260086020908152604080832093861683529290529081205460ff166115f75760008281526007602090815260408083206001600160a01b0380891685526008909101835281842090871684529091529020546115fb565b6000195b949350505050565b834211156116535760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e6500000060448201526064016108c0565b600088815260076020908152604080832060058101546001600160a01b038c168552600982019093529083208054919392917f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918c918c918c9190876116b883615e46565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810188905260e0016040516020818303038152906040528051906020012060405160200161173192919061190160f01b81526002810192909252602282015260420190565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa15801561179c573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906117d25750896001600160a01b0316816001600160a01b0316145b6118125760405162461bcd60e51b8152602060048201526011602482015270494e56414c49445f5349474e415455524560781b60448201526064016108c0565b6001600160a01b038a8116600090815260088501602090815260408083208d8516845290915290208990558b1633146118d457604080516001600160a01b038c811660208301528b81168284015260608083018c9052835180840390910181526080830193849052636952b02f60e11b9093528d169163d2a5605e916118a19160019160009190608401615a60565b600060405180830381600087803b1580156118bb57600080fd5b505af11580156118cf573d6000803e3d6000fd5b505050505b5050505050505050505050565b61129d8585858585604051806020016040528060008152506113bd565b6060836001600160401b0381111561191857611918615e8d565b604051908082528060200260200182016040528015611941578160200160208202803683370190505b50905060005b84811015610dd15760006007600088888581811061196757611967615e77565b9050602002013581526020019081526020016000209050336001600160a01b03166006600083600001548686815181106119a3576119a3615e77565b6020908102919091018101829052908252810191909152604001600020546001600160a01b0316146119e75760405162461bcd60e51b81526004016108c090615bcd565b611aad60066000878786818110611a0057611a00615e77565b905060200201358460000181905581526020019081526020016000206001018054611a2a90615de5565b80601f0160208091040260200160405190810160405280929190818152602001828054611a5690615de5565b8015611aa35780601f10611a7857610100808354040283529160200191611aa3565b820191906000526020600020905b815481529060010190602001808311611a8657829003601f168201915b5050505050613862565b15611ae75760405162461bcd60e51b815260206004820152600a60248201526931b7b63632b1ba34b7b760b11b60448201526064016108c0565b868683818110611af957611af9615e77565b90506020020135858584818110611b1257611b12615e77565b90506020020135848481518110611b2b57611b2b615e77565b60200260200101517f362b9f3b1459f7eb09b6b87f74b6ea9edc74332819c66c2d2a95b3fa6195211a60405160405180910390a45080611b6a81615e46565b915050611947565b600081815260066020526040902060030180546060916107b291611b9590615de5565b80601f0160208091040260200160405190810160405280929190818152602001828054611bc190615de5565b8015611c0e5780601f10611be357610100808354040283529160200191611c0e565b820191906000526020600020905b815481529060010190602001808311611bf157829003601f168201915b5050505050836000604051602001610e9b92919091825260ff16602082015260400190565b60076020908152600091825260409182902080548351608081019094526001820180546001600160a01b0316855260028301805492959394919291840191611c7a90615de5565b80601f0160208091040260200160405190810160405280929190818152602001828054611ca690615de5565b8015611cf35780601f10611cc857610100808354040283529160200191611cf3565b820191906000526020600020905b815481529060010190602001808311611cd657829003601f168201915b50505050508152602001600282018054611d0c90615de5565b80601f0160208091040260200160405190810160405280929190818152602001828054611d3890615de5565b8015611d855780601f10611d5a57610100808354040283529160200191611d85565b820191906000526020600020905b815481529060010190602001808311611d6857829003601f168201915b50505050508152602001600382018054611d9e90615de5565b80601f0160208091040260200160405190810160405280929190818152602001828054611dca90615de5565b8015611e175780601f10611dec57610100808354040283529160200191611e17565b820191906000526020600020905b815481529060010190602001808311611dfa57829003601f168201915b505050505081525050908060050154908060060154905084565b6000838152600760205260408120611e50913390879087876001612998565b50505050565b6060816001600160401b03811115611e7057611e70615e8d565b604051908082528060200260200182016040528015611ea957816020015b611e966145cb565b815260200190600190039081611e8e5790505b50905060005b82811015610dd157600060076000888885818110611ecf57611ecf615e77565b9050602002013581526020019081526020016000209050806001016040518060800160405290816000820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b03168152602001600182018054611f3490615de5565b80601f0160208091040260200160405190810160405280929190818152602001828054611f6090615de5565b8015611fad5780601f10611f8257610100808354040283529160200191611fad565b820191906000526020600020905b815481529060010190602001808311611f9057829003601f168201915b50505050508152602001600282018054611fc690615de5565b80601f0160208091040260200160405190810160405280929190818152602001828054611ff290615de5565b801561203f5780601f106120145761010080835404028352916020019161203f565b820191906000526020600020905b81548152906001019060200180831161202257829003601f168201915b5050505050815260200160038201805461205890615de5565b80601f016020809104026020016040519081016040528092919081815260200182805461208490615de5565b80156120d15780601f106120a6576101008083540402835291602001916120d1565b820191906000526020600020905b8154815290600101906020018083116120b457829003601f168201915b5050505050815250508383815181106120ec576120ec615e77565b60209081029190910181019190915281546000908152600690915260409020546001600160a01b031633146121335760405162461bcd60e51b81526004016108c090615bcd565b61216a85858481811061214857612148615e77565b905060200281019061215a9190615c2f565b61216390615dad565b8254612d13565b80516001830180546001600160a01b0319166001600160a01b0390921691909117815560208083015180516121a592600287019201906145fc565b50604082015180516121c19160028401916020909101906145fc565b50606082015180516121dd9160038401916020909101906145fc565b509050508282815181106121f3576121f3615e77565b602002602001015160600151805190602001208160010160030160405161221a919061573e565b60405180910390201461227e5786868381811061223957612239615e77565b905060200201357f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b826001016003016040516122759190615b00565b60405180910390a25b508061228981615e46565b915050611eaf565b606061229b612816565b6122b75760405162461bcd60e51b81526004016108c090615bf3565b600280546122c490615de5565b80601f01602080910402602001604051908101604052809291908181526020018280546122f090615de5565b801561233d5780601f106123125761010080835404028352916020019161233d565b820191906000526020600020905b81548152906001019060200180831161232057829003601f168201915b50505050509050828260029190612355929190614680565b5092915050565b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600081815260076020526040812054156123e257816107b2565b600092915050565b600280546123f790615de5565b80601f016020809104026020016040519081016040528092919081815260200182805461242390615de5565b80156124705780601f1061244557610100808354040283529160200191612470565b820191906000526020600020905b81548152906001019060200180831161245357829003601f168201915b505050505081565b6000612482612816565b61249e5760405162461bcd60e51b81526004016108c090615bf3565b50600180546001600160a01b0319166001600160a01b038316908117909155604051819081907fe2302c6b581cf0c2edec4248d3a7af323db67692e29b6dc37a7d9736bf5e436990600090a3919050565b600080600061250289898989898961388f565b9150915081156125155791506126389050565b6001546001600160a01b038a81169116141561253657600192505050612638565b60015461254b906001600160a01b03166138dd565b61255a57600092505050612638565b60015460405160009182916001600160a01b039091169063335b875f60e21b90612592908e908e908e908e908e908e90602401615814565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516125d09190615722565b600060405180830381855afa9150503d806000811461260b576040519150601f19603f3d011682016040523d82523d6000602084013e612610565b606091505b50915091508180156126315750808060200190518101906126319190615325565b9450505050505b9695505050505050565b60408051808201825260048152634974656d60e01b602080830191909152825180840190935260018352603160f81b9083015291565b606061271d6002805461268a90615de5565b80601f01602080910402602001604051908101604052809291908181526020018280546126b690615de5565b80156127035780601f106126d857610100808354040283529160200191612703565b820191906000526020600020905b8154815290600101906020018083116126e657829003601f168201915b50505050506040518060200160405280600081525061304b565b905090565b60008481526007602052604090206127409033888888886001612998565b611431338787878787876138fc565b61093183838360405180602001604052806000815250611e31565b60006001600160e01b03198216633cd9a01960e11b148061279b57506001600160e01b0319821663c71bf12d60e01b145b806127b657506001600160e01b03198216631d59313f60e31b145b806127d157506001600160e01b0319821663ccfec2fb60e01b145b806127ec57506001600160e01b03198216639b642de160e01b145b8061280757506001600160e01b031982166303fbd7fd60e01b145b806107b257506107b2826139cf565b600061271d33306000356001600160e01b031916600036346124ef565b6000818060200190518101906128499190615396565b9250905080156128615761285c82613a55565b612938565b60008060008060008680602001905181019061287d919061518e565b9450945094509450945060005b82518110156129315761291f8682815181106128a8576128a8615e77565b60200260200101518683815181106128c2576128c2615e77565b60200260200101518684815181106128dc576128dc615e77565b60200260200101518685815181106128f6576128f6615e77565b602002602001015186868151811061291057612910615e77565b60200260200101516001613ae1565b8061292981615e46565b91505061288a565b5050505050505b612940613d2e565b5050565b6000818152600760209081526040808320805484526006909252909120546001600160a01b031633148061297757503382145b6129935760405162461bcd60e51b81526004016108c090615bcd565b919050565b6001600160a01b03851615612b9c57846001600160a01b0316866001600160a01b031614612b04576001600160a01b0380861660009081526008890160209081526040808320938a168352929052205482111580612a1b57506001600160a01b038086166000908152600860209081526040808320938a168352929052205460ff165b612a675760405162461bcd60e51b815260206004820152601860248201527f616d6f756e74206578636565647320616c6c6f77616e6365000000000000000060448201526064016108c0565b6001600160a01b0380861660009081526008890160209081526040808320938a16835292905220548211612ad9576001600160a01b0380861660009081526008890160209081526040808320938a1683529290529081208054849290612ace908490615cf1565b90915550612b049050565b6001600160a01b0380861660009081526008890160209081526040808320938a168352929052908120555b6001600160a01b0385166000908152600788016020526040902054821115612b675760405162461bcd60e51b8152602060048201526016602482015275616d6f756e7420657863656564732062616c616e636560501b60448201526064016108c0565b6001600160a01b038516600090815260078801602052604081208054849290612b91908490615cf1565b90915550612bb69050565b81876006016000828254612bb09190615cb7565b90915550505b6001600160a01b03841615612bfa576001600160a01b038416600090815260078801602052604081208054849290612bef908490615cb7565b90915550612c149050565b81876006016000828254612c0e9190615cf1565b90915550505b8015612d0a57836001600160a01b0316856001600160a01b0316876001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628686604051612c72929190918252602082015260400190565b60405180910390a4338314612d0a57604080516001600160a01b038781166020830152868116828401526060808301869052835180840390910181526080830193849052636952b02f60e11b90935285169163d2a5605e91612cdc91600091829190608401615a60565b600060405180830381600087803b158015612cf657600080fd5b505af11580156118d4573d6000803e3d6000fd5b50505050505050565b612d1b6145cb565b612deb612d2b8460200151613862565b8015612d3657508215155b612d44578360200151612ddf565b60008381526006602052604090206001018054612d6090615de5565b80601f0160208091040260200160405190810160405280929190818152602001828054612d8c90615de5565b8015612dd95780601f10612dae57610100808354040283529160200191612dd9565b820191906000526020600020905b815481529060010190602001808311612dbc57829003601f168201915b50505050505b84602001819052613862565b15612e215760405162461bcd60e51b81526004016108c0906020808252600490820152636e616d6560e01b604082015260600190565b612ef1612e318460400151613862565b8015612e3c57508215155b612e4a578360400151612ee5565b60008381526006602052604090206002018054612e6690615de5565b80601f0160208091040260200160405190810160405280929190818152602001828054612e9290615de5565b8015612edf5780601f10612eb457610100808354040283529160200191612edf565b820191906000526020600020905b815481529060010190602001808311612ec257829003601f168201915b50505050505b84604001819052613862565b15612f275760405162461bcd60e51b81526020600482015260066024820152651cde5b589bdb60d21b60448201526064016108c0565b612ff7612f378460600151613862565b8015612f4257508215155b612f50578360600151612feb565b60008381526006602052604090206003018054612f6c90615de5565b80601f0160208091040260200160405190810160405280929190818152602001828054612f9890615de5565b8015612fe55780601f10612fba57610100808354040283529160200191612fe5565b820191906000526020600020905b815481529060010190602001808311612fc857829003601f168201915b50505050505b84606001819052613862565b1561302a5760405162461bcd60e51b815260206004820152600360248201526275726960e81b60448201526064016108c0565b81613036578251613039565b60005b6001600160a01b031683525090919050565b6003546060906001600160a01b03166130655750816107b2565b60035460405163f709c9b760e01b81526001600160a01b039091169063f709c9b79061309b9030908790879033906004016158ab565b60006040518083038186803b1580156130b357600080fd5b505afa1580156130c7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610eaf919081019061543c565b60005b845181101561314d5761313b88888888858151811061311357613113615e77565b602002602001015188868151811061312d5761312d615e77565b602002602001015188613ae1565b8061314581615e46565b9150506130f2565b508015612d0a57612d0a613d2e565b61316e876001600160a01b03166138dd565b156112985760405163bc197c8160e01b81526001600160a01b0388169063bc197c81906131ad908c908c908b908b908b908b908b908b906004016157b0565b602060405180830381600087803b1580156131c757600080fd5b505af19250505080156131f7575060408051601f3d908101601f191682019092526131f4918101906153ea565b60015b6132a457613203615ea3565b806308c379a0141561323d5750613218615ebf565b80613223575061323f565b8060405162461bcd60e51b81526004016108c09190615ac8565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b60648201526084016108c0565b6001600160e01b0319811663bc197c8160e01b146132d45760405162461bcd60e51b81526004016108c090615b85565b50505050505050505050565b6060816001600160401b038111156132fa576132fa615e8d565b604051908082528060200260200182016040528015613323578160200160208202803683370190505b50905060005b8281101561371657600084848381811061334557613345615e77565b90506020028101906133579190615c19565b61336090615d08565b905085613371578060400151613374565b60005b83838151811061338657613386615e77565b6020908102919091010152856133c05760408101516133a95780602001516133c2565b6040808201516000908152600760205220546133c2565b855b6020820152851515806133ff57506020810151158015906133ff57506020818101516000908152600690915260409020546001600160a01b031633145b61341b5760405162461bcd60e51b81526004016108c090615bcd565b82828151811061342d5761342d615e77565b6020026020010151600014156136d757600454600090613455906001600160a01b03166140cf565b9050806001600160a01b031663e1c7392a6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561349257600080fd5b505af11580156134a6573d6000803e3d6000fd5b50505050600060076000836001600160a01b03168787815181106134cc576134cc615e77565b6020026020010181815250815260200190815260200160002090508260200151816000018190555061350683600001518460200151612d13565b80516001830180546001600160a01b0319166001600160a01b03909216919091178155602080830151805161354192600287019201906145fc565b506040820151805161355d9160028401916020909101906145fc565b50606082015180516135799160038401916020909101906145fc565b50905050600080613588612642565b915091507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f82805190602001208280519060200120468a8a815181106135d0576135d0615e77565b60200260200101516040516020016136139594939291909485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b60405160208183030381529060405280519060200120836005018190555086868151811061364357613643615e77565b602090810291909101015183546040516000907f362b9f3b1459f7eb09b6b87f74b6ea9edc74332819c66c2d2a95b3fa6195211a908290a486868151811061368d5761368d615e77565b60200260200101517f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b846001016003016040516136ca9190615b00565b60405180910390a2505050505b6137038383815181106136ec576136ec615e77565b602002602001015182606001518360800151614111565b508061370e81615e46565b915050613329565b509392505050565b6000546060906001600160a01b0316156137635760405162461bcd60e51b81526004016108c0906020808252600490820152631a5b9a5d60e21b604082015260600190565b600080546001600160a01b03191633179055815161378a9083016020908101908401614c4b565b600180546001600160a01b039093166001600160a01b0319909316831790556040519092506000907fe2302c6b581cf0c2edec4248d3a7af323db67692e29b6dc37a7d9736bf5e4369908290a36107b2816141f6565b6000814243323a4144336137f5600587615cf1565b60408051602081019a909a5289019790975260608801959095526001600160a01b03938416608088015260a0870192909252821660c086015260e0850152166101008301524061012082015261014001604051602081830303815290604052805190602001209050919050565b80516020909101207fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4701490565b6000806001600160a01b038716301480156138ba57506001600160e01b031986166303fbd7fd60e01b145b156138cb57506001905060006138d2565b5060009050805b965096945050505050565b60006001600160a01b0382166138f557506000919050565b503b151590565b61390e856001600160a01b03166138dd565b15612d0a5760405163f23a6e6160e01b81526001600160a01b0386169063f23a6e6190613949908a908a908990899089908990600401615864565b602060405180830381600087803b15801561396357600080fd5b505af1925050508015613993575060408051601f3d908101601f19168201909252613990918101906153ea565b60015b61399f57613203615ea3565b6001600160e01b0319811663f23a6e6160e01b1461096a5760405162461bcd60e51b81526004016108c090615b85565b6005546040516301ffc9a760e01b81526001600160e01b0319831660048201526000916001600160a01b0316906301ffc9a79060240160206040518083038186803b158015613a1d57600080fd5b505afa158015613a31573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107b29190615325565b600081806020019051810190613a6b9190615223565b905060005b8151811015610931576000806000806000868681518110613a9357613a93615e77565b6020026020010151806020019051810190613aae9190614b52565b94509450945094509450613ac98585858585600160006130ef565b50505050508080613ad990615e46565b915050613a70565b81613aeb57611431565b6000838152600c6020908152604080832054808452600a90925290912080541580613b3357508481600081548110613b2557613b25615e77565b906000526020600020015414155b15613b8f57600b8054600a916000919082613b4d83615e46565b909155506000888152600c6020908152604080832084905583855284820195909552929093018320805460018101825581855292909320909101879055925090505b805460018082018355600083815260208082206001600160a01b038c81169582019590955585548085018755948b169481019490945584549283019094559101859055604080516bffffffffffffffffffffffff1960608c811b8216838701528b811b821660348401528a901b1660488201528151808203603c018152605c9091018252805190840120808352600d90935290208054909190613c9b57600f805460018181019092557f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac80201829055825480820184556000848152602090206001600160a01b03808d1692820192909255845480840186558b831690820155845492830185559089169101555b6000818152600e60209081526040808320898452909152902054613ccf578154600181018355600083815260209020018690555b6000818152600e6020908152604080832089845290915281208054879290613cf8908490615cb7565b90915550611298905084613d19576000878152600760205260409020613d22565b613d2287612944565b8a8a8a8a8a6000612998565b60005b600b548110156140bf576000818152600a60205260408120805490919082908290613d5e57613d5e615e77565b9060005260206000200154905081600081548110613d7e57613d7e615e77565b600091825260208220018190558254600390613d9c90600190615cf1565b613da69190615ccf565b90506000816001600160401b03811115613dc257613dc2615e8d565b604051908082528060200260200182016040528015613deb578160200160208202803683370190505b5090506000826001600160401b03811115613e0857613e08615e8d565b604051908082528060200260200182016040528015613e31578160200160208202803683370190505b5090506000836001600160401b03811115613e4e57613e4e615e8d565b604051908082528060200260200182016040528015613e77578160200160208202803683370190505b509050600060015b8754811015613ff557878181548110613e9a57613e9a615e77565b9060005260206000200154858381518110613eb757613eb7615e77565b60200260200101906001600160a01b031690816001600160a01b031681525050878181548110613ee957613ee9615e77565b600091825260208220015587613f00826001615cb7565b81548110613f1057613f10615e77565b9060005260206000200154848381518110613f2d57613f2d615e77565b6001600160a01b039092166020928302919091019091015287613f51826001615cb7565b81548110613f6157613f61615e77565b600091825260208220015587613f78826002615cb7565b81548110613f8857613f88615e77565b9060005260206000200154838380613f9f90615e46565b945081518110613fb157613fb1615e77565b602090810291909101015287613fc8826002615cb7565b81548110613fd857613fd8615e77565b6000918252602082200155613fee600382615cb7565b9050613e7f565b50856001600160a01b031663d2a5605e6000600187878760405160200161401e93929190615949565b6040516020818303038152906040526040518463ffffffff1660e01b815260040161404b93929190615a60565b600060405180830381600087803b15801561406557600080fd5b505af1158015614079573d6000803e3d6000fd5b5050506000878152600c602090815260408083208390558b8352600a90915281206140a59250906146f4565b5050505050505080806140b790615e46565b915050613d31565b506000600b556140cd61424c565b565b60006901000000000000000000820268803b80938091923cf36258807360e81b01176000526020600080f09050803b80156141095761410b565bfe5b50919050565b60005b82518110156141ed5760006001600160a01b031683828151811061413a5761413a615e77565b60200260200101516001600160a01b031614156141995760405162461bcd60e51b815260206004820152601860248201527f6d696e7420746f20746865207a65726f2061646472657373000000000000000060448201526064016108c0565b6141db6000808584815181106141b1576141b1615e77565b6020026020010151878686815181106141cc576141cc615e77565b60200260200101516000613ae1565b806141e581615e46565b915050614114565b50610931613d2e565b60608180602001905181019061420c9190615470565b600380546001600160a01b0319166001600160a01b0384161790558251909350839061423f9060029060208601906145fc565b505050506107b281614572565b60005b600f54811015614565576000600f828154811061426e5761426e615e77565b6000918252602080832090910154808352600d909152604082208054919350919061429b90600390615cf1565b90506000826000815481106142b2576142b2615e77565b90600052602060002001549050826000815481106142d2576142d2615e77565b90600052602060002001600090556000836001815481106142f5576142f5615e77565b906000526020600020015490508360018154811061431557614315615e77565b906000526020600020016000905560008460028154811061433857614338615e77565b906000526020600020015490508460028154811061435857614358615e77565b9060005260206000200160009055600080856001600160401b0381111561438157614381615e8d565b6040519080825280602002602001820160405280156143aa578160200160208202803683370190505b5090506000866001600160401b038111156143c7576143c7615e8d565b6040519080825280602002602001820160405280156143f0578160200160208202803683370190505b50905060035b88548110156144da57600e60008b815260200190815260200160002060008a838154811061442657614426615e77565b906000526020600020015485878151811061444357614443615e77565b602002602001018181525081526020019081526020016000205482858151811061446f5761446f615e77565b60200260200101818152505088818154811061448d5761448d615e77565b600091825260208083209091018290558b8252600e90526040812090856144b381615e46565b965081526020019081526020016000206000905580806144d290615e46565b9150506143f6565b50836001600160a01b0316856001600160a01b0316876001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb858560405161452a929190615a3b565b60405180910390a46000898152600d60205260408120614549916146f4565b505050505050505050808061455d90615e46565b91505061424f565b506140cd600f60006146f4565b6060818060200190518101906145889190614b18565b600580546001600160a01b039283166001600160a01b03199182161790915560048054939092169216919091179055505060408051602081019091526000815290565b604051806080016040528060006001600160a01b031681526020016060815260200160608152602001606081525090565b82805461460890615de5565b90600052602060002090601f01602090048101928261462a5760008555614670565b82601f1061464357805160ff1916838001178555614670565b82800160010185558215614670579182015b82811115614670578251825591602001919060010190614655565b5061467c929150614715565b5090565b82805461468c90615de5565b90600052602060002090601f0160209004810192826146ae5760008555614670565b82601f106146c75782800160ff19823516178555614670565b82800160010185558215614670579182015b828111156146705782358255916020019190600101906146d9565b50805460008255906000526020600020908101906147129190614715565b50565b5b8082111561467c5760008155600101614716565b803561299381615f48565b60008083601f84011261474757600080fd5b5081356001600160401b0381111561475e57600080fd5b6020830191508360208260051b850101111561477957600080fd5b9250929050565b600082601f83011261479157600080fd5b8135602061479e82615c6d565b6040516147ab8282615e1a565b8381528281019150858301600585901b870184018810156147cb57600080fd5b60005b858110156147f35781356147e181615f48565b845292840192908401906001016147ce565b5090979650505050505050565b600082601f83011261481157600080fd5b8151602061481e82615c6d565b60405161482b8282615e1a565b8381528281019150858301600585901b8701840188101561484b57600080fd5b60005b858110156147f357815161486181615f48565b8452928401929084019060010161484e565b600082601f83011261488457600080fd5b8135602061489182615c6d565b60405161489e8282615e1a565b8381528281019150858301600585901b870184018810156148be57600080fd5b60005b858110156147f3578135845292840192908401906001016148c1565b600082601f8301126148ee57600080fd5b815160206148fb82615c6d565b6040516149088282615e1a565b8381528281019150858301600585901b8701840188101561492857600080fd5b60005b858110156147f35781518452928401929084019060010161492b565b60008083601f84011261495957600080fd5b5081356001600160401b0381111561497057600080fd5b60208301915083602082850101111561477957600080fd5b600082601f83011261499957600080fd5b81356149a481615c90565b6040516149b18282615e1a565b8281528560208487010111156149c657600080fd5b82602086016020830137600092810160200192909252509392505050565b600082601f8301126149f557600080fd5b8151614a0081615c90565b604051614a0d8282615e1a565b828152856020848701011115614a2257600080fd5b614a33836020830160208801615db9565b95945050505050565b600060808284031215614a4e57600080fd5b604051608081016001600160401b038282108183111715614a7157614a71615e8d565b81604052829350614a818561472a565b83526020850135915080821115614a9757600080fd5b614aa386838701614988565b60208401526040850135915080821115614abc57600080fd5b614ac886838701614988565b60408401526060850135915080821115614ae157600080fd5b50614aee85828601614988565b6060830152505092915050565b600060208284031215614b0d57600080fd5b8135610eaf81615f48565b60008060408385031215614b2b57600080fd5b8251614b3681615f48565b6020840151909250614b4781615f48565b809150509250929050565b600080600080600060a08688031215614b6a57600080fd5b8551614b7581615f48565b6020870151909550614b8681615f48565b6040870151909450614b9781615f48565b60608701519093506001600160401b0380821115614bb457600080fd5b614bc089838a016148dd565b93506080880151915080821115614bd657600080fd5b50614be3888289016148dd565b9150509295509295909350565b600080600080600060a08688031215614c0857600080fd5b8535614c1381615f48565b94506020860135614c2381615f48565b93506040860135614c3381615f48565b94979396509394606081013594506080013592915050565b60008060408385031215614c5e57600080fd5b8251614c6981615f48565b60208401519092506001600160401b03811115614c8557600080fd5b614c91858286016149e4565b9150509250929050565b60008060408385031215614cae57600080fd5b8235614cb981615f48565b91506020830135614b4781615f48565b60008060008060008060008060a0898b031215614ce557600080fd5b8835614cf081615f48565b97506020890135614d0081615f48565b965060408901356001600160401b0380821115614d1c57600080fd5b614d288c838d01614735565b909850965060608b0135915080821115614d4157600080fd5b614d4d8c838d01614735565b909650945060808b0135915080821115614d6657600080fd5b50614d738b828c01614947565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215614da057600080fd5b8635614dab81615f48565b95506020870135614dbb81615f48565b94506040870135614dcb81615f6b565b935060608701356001600160401b03811115614de657600080fd5b614df289828a01614947565b979a9699509497949695608090950135949350505050565b600080600060608486031215614e1f57600080fd5b8335614e2a81615f48565b92506020840135614e3a81615f48565b929592945050506040919091013590565b60008060008060808587031215614e6157600080fd5b8435614e6c81615f48565b93506020850135614e7c81615f48565b93969395505050506040820135916060013590565b60008060008060008060a08789031215614eaa57600080fd5b8635614eb581615f48565b95506020870135614ec581615f48565b9450604087013593506060870135925060808701356001600160401b03811115614eee57600080fd5b614efa89828a01614947565b979a9699509497509295939492505050565b600080600080600060608688031215614f2457600080fd5b8535614f2f81615f48565b945060208601356001600160401b0380821115614f4b57600080fd5b614f5789838a01614735565b90965094506040880135915080821115614f7057600080fd5b50614f7d88828901614735565b969995985093965092949392505050565b60008060008060008060808789031215614fa757600080fd5b8635614fb281615f48565b955060208701356001600160401b0380821115614fce57600080fd5b614fda8a838b01614735565b90975095506040890135915080821115614ff357600080fd5b614fff8a838b01614735565b9095509350606089013591508082111561501857600080fd5b5061502589828a01614988565b9150509295509295509295565b6000806040838503121561504557600080fd5b823561505081615f48565b91506020830135614b4781615f5d565b6000806040838503121561507357600080fd5b823561507e81615f48565b946020939093013593505050565b6000806000606084860312156150a157600080fd5b83356150ac81615f48565b95602085013595506040909401359392505050565b600080600080608085870312156150d757600080fd5b84356150e281615f48565b9350602085013592506040850135915060608501356001600160401b0381111561510b57600080fd5b61511787828801614988565b91505092959194509250565b6000806000806040858703121561513957600080fd5b84356001600160401b038082111561515057600080fd5b61515c88838901614735565b9096509450602087013591508082111561517557600080fd5b5061518287828801614735565b95989497509550505050565b600080600080600060a086880312156151a657600080fd5b85516001600160401b03808211156151bd57600080fd5b6151c989838a01614800565b965060208801519150808211156151df57600080fd5b6151eb89838a01614800565b9550604088015191508082111561520157600080fd5b61520d89838a01614800565b94506060880151915080821115614bb457600080fd5b6000602080838503121561523657600080fd5b82516001600160401b038082111561524d57600080fd5b818501915085601f83011261526157600080fd5b815161526c81615c6d565b6040516152798282615e1a565b8281528581019150848601600584901b860187018a101561529957600080fd5b6000805b858110156152d4578251878111156152b3578283fd5b6152c18d8b838c01016149e4565b865250938801939188019160010161529d565b50919a9950505050505050505050565b600080602083850312156152f757600080fd5b82356001600160401b0381111561530d57600080fd5b61531985828601614735565b90969095509350505050565b60006020828403121561533757600080fd5b8151610eaf81615f5d565b60008060006040848603121561535757600080fd5b833561536281615f5d565b925060208401356001600160401b0381111561537d57600080fd5b61538986828701614947565b9497909650939450505050565b600080604083850312156153a957600080fd5b8251614c6981615f5d565b6000602082840312156153c657600080fd5b5035919050565b6000602082840312156153df57600080fd5b8135610eaf81615f6b565b6000602082840312156153fc57600080fd5b8151610eaf81615f6b565b6000806020838503121561541a57600080fd5b82356001600160401b0381111561543057600080fd5b61531985828601614947565b60006020828403121561544e57600080fd5b81516001600160401b0381111561546457600080fd5b6115fb848285016149e4565b60008060006060848603121561548557600080fd5b83516001600160401b038082111561549c57600080fd5b6154a8878388016149e4565b9450602086015191506154ba82615f48565b6040860151919350808211156154cf57600080fd5b506154dc868287016149e4565b9150509250925092565b6000806000604084860312156154fb57600080fd5b83356001600160401b038082111561551257600080fd5b908501906080828803121561552657600080fd5b9093506020850135908082111561553c57600080fd5b5061538986828701614735565b600080600080600080600080610100898b03121561556657600080fd5b88359750602089013561557881615f48565b9650604089013561558881615f48565b9550606089013594506080890135935060a089013560ff811681146155ac57600080fd5b979a969950949793969295929450505060c08201359160e0013590565b600081518084526020808501945080840160005b838110156156025781516001600160a01b0316875295820195908201906001016155dd565b509495945050505050565b81835260006001600160fb1b0383111561562657600080fd5b8260051b8083602087013760009401602001938452509192915050565b600081518084526020808501945080840160005b8381101561560257815187529582019590820190600101615657565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b600081518084526156b4816020860160208601615db9565b601f01601f19169290920160200192915050565b60018060a01b03815116825260006020820151608060208501526156ef608085018261569c565b905060408301518482036040860152615708828261569c565b91505060608301518482036060860152614a33828261569c565b60008251615734818460208701615db9565b9190910192915050565b600080835461574c81615de5565b600182811680156157645760018114615775576157a4565b60ff198416875282870194506157a4565b8760005260208060002060005b8581101561579b5781548a820152908401908201615782565b50505082870194505b50929695505050505050565b6001600160a01b0389811682528816602082015260a0604082018190526000906157dd908301888a61560d565b82810360608401526157f081878961560d565b90508281036080840152615805818587615673565b9b9a5050505050505050505050565b6001600160a01b038781168252861660208201526001600160e01b03198516604082015260a0606082018190526000906158519083018587615673565b9050826080830152979650505050505050565b6001600160a01b03878116825286166020820152604081018590526060810184905260a06080820181905260009061589f9083018486615673565b98975050505050505050565b600060018060a01b038087168352608060208401526158cd608084018761569c565b83810360408501526158df818761569c565b92505080841660608401525095945050505050565b6001600160a01b03851681526080602082018190526000906159189083018661569c565b828103604084015261592a818661569c565b9050828103606084015261593e818561569c565b979650505050505050565b60608152600061595c60608301866155c9565b828103602084015261596e81866155c9565b905082810360408401526126388185615643565b6020808252825182820181905260009190848201906040850190845b818110156159ba5783518352928401929184019160010161599e565b50909695505050505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015615a1b57603f19888603018452615a098583516156c8565b945092850192908501906001016159ed565b5092979650505050505050565b602081526000610eaf6020830184615643565b604081526000615a4e6040830185615643565b8281036020840152614a338185615643565b83151581528215156020820152606060408201526000614a33606083018461569c565b8281526040602082015260006115fb6040830184615643565b848152608060208201526000615ab560808301866156c8565b6040830194909452506060015292915050565b602081526000610eaf602083018461569c565b604081526000615aee604083018561569c565b8281036020840152614a33818561569c565b6000602080835260008454615b1481615de5565b80848701526040600180841660008114615b355760018114615b4957615b77565b60ff19851689840152606089019550615b77565b896000528660002060005b85811015615b6f5781548b8201860152908301908801615b54565b8a0184019650505b509398975050505050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6020808252600c908201526b155b985d5d1a1bdc9a5e995960a21b604082015260600190565b6020808252600c908201526b1d5b985d5d1a1bdc9a5e995960a21b604082015260600190565b60008235609e1983360301811261573457600080fd5b60008235607e1983360301811261573457600080fd5b60405160a081016001600160401b0381118282101715615c6757615c67615e8d565b60405290565b60006001600160401b03821115615c8657615c86615e8d565b5060051b60200190565b60006001600160401b03821115615ca957615ca9615e8d565b50601f01601f191660200190565b60008219821115615cca57615cca615e61565b500190565b600082615cec57634e487b7160e01b600052601260045260246000fd5b500490565b600082821015615d0357615d03615e61565b500390565b600060a08236031215615d1a57600080fd5b615d22615c45565b82356001600160401b0380821115615d3957600080fd5b615d4536838701614a3c565b835260208501356020840152604085013560408401526060850135915080821115615d6f57600080fd5b615d7b36838701614780565b60608401526080850135915080821115615d9457600080fd5b50615da136828601614873565b60808301525092915050565b60006107b23683614a3c565b60005b83811015615dd4578181015183820152602001615dbc565b83811115611e505750506000910152565b600181811c90821680615df957607f821691505b6020821081141561410b57634e487b7160e01b600052602260045260246000fd5b601f8201601f191681016001600160401b0381118282101715615e3f57615e3f615e8d565b6040525050565b6000600019821415615e5a57615e5a615e61565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600060033d1115615ebc5760046000803e5060005160e01c5b90565b600060443d1015615ecd5790565b6040516003193d81016004833e81513d6001600160401b038160248401118184111715615efc57505050505090565b8285019150815181811115615f145750505050505090565b843d8701016020828501011115615f2e5750505050505090565b615f3d60208286010187615e1a565b509095945050505050565b6001600160a01b038116811461471257600080fd5b801515811461471257600080fd5b6001600160e01b03198116811461471257600080fdfea2646970667358221220fad2fb7153eda02e6c43744615766b767dc0efc5caebd9d4d300000cb28e3aeb64736f6c63430008060033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000180000000000000000000000000c5c85480ac2e36a680bd0d53084dbad0cee9c29a0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000600000000000000000000000003ff777884412c7ce8a1da679b4b0cd54f720ab2e00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000003a697066733a2f2f697066732f516d64375736396d417779794d755634584333595167534a366b5156436e537846714b4b46655258335341736a4a000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000055bbab8bbefc49996507b84cccb92c74a0c2be3f000000000000000000000000e4cd064c93fe94c21884670b3708a7a57dd2afe3

-----Decoded View---------------
Arg [0] : lazyInitData (bytes): 0x000000000000000000000000c5c85480ac2e36a680bd0d53084dbad0cee9c29a0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000600000000000000000000000003ff777884412c7ce8a1da679b4b0cd54f720ab2e00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000003a697066733a2f2f697066732f516d64375736396d417779794d755634584333595167534a366b5156436e537846714b4b46655258335341736a4a000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000055bbab8bbefc49996507b84cccb92c74a0c2be3f000000000000000000000000e4cd064c93fe94c21884670b3708a7a57dd2afe3

-----Encoded View---------------
14 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000180
Arg [2] : 000000000000000000000000c5c85480ac2e36a680bd0d53084dbad0cee9c29a
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [6] : 0000000000000000000000003ff777884412c7ce8a1da679b4b0cd54f720ab2e
Arg [7] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [8] : 000000000000000000000000000000000000000000000000000000000000003a
Arg [9] : 697066733a2f2f697066732f516d64375736396d417779794d75563458433359
Arg [10] : 5167534a366b5156436e537846714b4b46655258335341736a4a000000000000
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [12] : 00000000000000000000000055bbab8bbefc49996507b84cccb92c74a0c2be3f
Arg [13] : 000000000000000000000000e4cd064c93fe94c21884670b3708a7a57dd2afe3


Deployed Bytecode Sourcemap

36417:23993:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41281:126;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44363:142;;;;;;:::i;:::-;;:::i;:::-;;;40635:25:1;;;40623:2;40608:18;44363:142:0;40590:76:1;26623:629:0;;;;;;:::i;:::-;;:::i;:::-;;;40078:14:1;;40071:22;40053:41;;40041:2;40026:18;26623:629:0;40008:92:1;30882:196:0;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;33249:32:1;;;33231:51;;33219:2;33204:18;30882:196:0;33186:102:1;41178:95:0;41251:14;;;;;;;;;;;;-1:-1:-1;;;41251:14:0;;;;41178:95;;48266:472;;;;;;:::i;:::-;;:::i;:::-;;42173:673;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;41945:220::-;;;;;;:::i;:::-;;:::i;36705:51::-;;;;;-1:-1:-1;;;;;36705:51:0;;;45869:355;;;;;;:::i;:::-;;:::i;36834:53::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;41654:95::-;;;;;;:::i;:::-;-1:-1:-1;41739:2:0;;41654:95;47543:155;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;26454:161::-;;;;;;:::i;:::-;;:::i;47706:552::-;;;;;;:::i;:::-;;:::i;44513:322::-;;;;;;:::i;:::-;;:::i;41516:130::-;;;;;;:::i;:::-;;:::i;49729:139::-;;;;;;:::i;:::-;49807:7;49834:12;;;:4;:12;;;;;;;;-1:-1:-1;;;;;49834:26:0;;;;;;:19;;;;:26;;;;;49729:139;46758:224;;;;;;:::i;:::-;;:::i;46990:545::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;44843:276::-;;;;;;:::i;:::-;;:::i;48746:975::-;;;;;;:::i;:::-;;:::i;46373:169::-;;;;;;:::i;:::-;;:::i;42854:654::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;41757:180::-;;;;;;:::i;:::-;;:::i;36894:49::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;46550:200::-;;;;;;:::i;:::-;;:::i;43516:704::-;;;;;;:::i;:::-;;:::i;41415:93::-;41490:10;;;;;;;;;;;;-1:-1:-1;;;41490:10:0;;;;41415:93;;30698:176;;;;;;:::i;:::-;;:::i;26225:35::-;;;;;-1:-1:-1;;;;;26225:35:0;;;45127:208;;;;;;:::i;:::-;;:::i;44228:127::-;;;;;;:::i;:::-;44296:7;44323:12;;;:4;:12;;;;;:24;;;;44228:127;45343:186;;;;;;:::i;:::-;;:::i;29542:31::-;;;:::i;27260:156::-;;;;;;:::i;:::-;;:::i;29580:42::-;;;;;-1:-1:-1;;;;;29580:42:0;;;27424:840;;;;;;:::i;:::-;;:::i;36550:146::-;;36601:95;36550:146;;49876:156;;;:::i;:::-;;;;;;;;:::i;36950:77::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;30585:105;;;:::i;45537:324::-;;;;;;:::i;:::-;;:::i;26267:28::-;;;;;-1:-1:-1;;;;;26267:28:0;;;46232:133;;;;;;:::i;:::-;;:::i;41281:126::-;41375:12;;;;:4;:12;;;;;:24;;41368:31;;41342:13;;41375:24;41368:31;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41281:126;;;:::o;44363:142::-;44443:7;44470:8;;;:4;:8;;;;;;;;-1:-1:-1;;;;;44470:27:0;;;;:18;;;:27;;;;;44363:142;;;;;:::o;26623:629::-;26701:4;-1:-1:-1;;;;;;26738:40:0;;-1:-1:-1;;;26738:40:0;;:103;;-1:-1:-1;;;;;;;26795:46:0;;-1:-1:-1;;;26795:46:0;26738:103;:176;;;-1:-1:-1;;;;;;;26858:56:0;;-1:-1:-1;;;26858:56:0;26738:176;:230;;;-1:-1:-1;;;;;;;26931:37:0;;-1:-1:-1;;;26931:37:0;26738:230;:287;;;-1:-1:-1;;;;;;;26985:40:0;;-1:-1:-1;;;26985:40:0;26738:287;:355;;;-1:-1:-1;;;;;;;27042:51:0;;-1:-1:-1;;;27042:51:0;26738:355;:405;;;-1:-1:-1;;;;;;;27110:33:0;;-1:-1:-1;;;27110:33:0;26738:405;:458;;;-1:-1:-1;;;;;;;27160:36:0;;-1:-1:-1;;;27160:36:0;26738:458;:506;;;;27213:31;27232:11;27213:18;:31::i;30882:196::-;30972:16;29036:17;:15;:17::i;:::-;29028:42;;;;-1:-1:-1;;;29028:42:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;31012:18:0::1;::::0;;-1:-1:-1;;;;;31041:29:0;;::::1;-1:-1:-1::0;;;;;;31041:29:0;::::1;;::::0;;;31012:18:::1;::::0;30882:196::o;48266:472::-;48361:7;48358:85;;;48385:25;48405:4;;48385:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48385:19:0;;-1:-1:-1;;;48385:25:0:i;:::-;48266:472;;;:::o;48358:85::-;48454:16;;;;;48541:63;;;;48552:4;48541:63;:::i;:::-;48453:151;;;;;;;;;;48615:115;48635:43;48671:6;48635:35;:43::i;:::-;48680:8;48690:6;48698:9;48709:6;48717;48725:4;48615:19;:115::i;:::-;48347:391;;;;;48266:472;;;:::o;42173:673::-;42291:25;42354:6;-1:-1:-1;;;;;42341:27:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;42329:39;;42383:9;42379:460;42398:17;;;42379:460;;;42437:23;42463:10;:28;42474:13;;42488:1;42474:16;;;;;;;:::i;:::-;;;;;;;;;;42463:28;;-1:-1:-1;42463:28:0;;;;;;;;;;;-1:-1:-1;42463:28:0;42515:23;;;;;;;;;;-1:-1:-1;;;;;42515:23:0;;;;;;;;42463:28;;-1:-1:-1;42548:10:0;;42463:28;;42515:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:9;42525:1;42515:12;;;;;;;;:::i;:::-;;;;;;:23;;;42514:30;;;-1:-1:-1;;;;;42514:44:0;;42506:69;;;;-1:-1:-1;;;42506:69:0;;;;;;;:::i;:::-;42590:15;42640:38;42656:6;;42663:1;42656:9;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;42640:38;;;:::i;:::-;42675:1;42640:15;:38::i;:::-;42609:10;:28;42620:13;;42634:1;42620:16;;;;;;;:::i;:::-;;;;;;;;;;42609:28;;-1:-1:-1;42609:28:0;;;;;;;;;-1:-1:-1;42609:28:0;:69;;;;-1:-1:-1;;;;;;42609:69:0;-1:-1:-1;;;;;42609:69:0;;;;;;;;;;;;:28;;:69;;-1:-1:-1;42609:69:0;;;;;;;;:::i;:::-;-1:-1:-1;42609:69:0;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;42609:69:0;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;42608:76:0;42713:12;;-1:-1:-1;;;;;42608:76:0;;;;-1:-1:-1;42713:9:0;;-1:-1:-1;42723:1:0;;42713:12;;;;;;:::i;:::-;;;;;;;:17;;;-1:-1:-1;;;;;42702:28:0;:7;-1:-1:-1;;;;;42702:28:0;;42699:129;;42795:13;;42809:1;42795:16;;;;;;;:::i;:::-;;;;;;;42786:7;-1:-1:-1;;;;;42756:56:0;42767:9;42777:1;42767:12;;;;;;;;:::i;:::-;;;;;;;:17;;;-1:-1:-1;;;;;42756:56:0;;;;;;;;;;;42699:129;42422:417;;42417:3;;;;;:::i;:::-;;;;42379:460;;;;42173:673;;;;;;:::o;41945:220::-;42031:25;42059:12;;;:4;:12;;;;;42094:19;;;42089:68;;42005:13;;42059:12;42089:68;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;42126:21:0;;42115:41;;;;-1:-1:-1;42126:21:0;;-1:-1:-1;42149:6:0;;-1:-1:-1;42115:41:0;;43015:25:1;;;43071:2;43056:18;;43049:34;43003:2;42988:18;;42970:119;42115:41:0;;;;;;;;;;;;;42089:4;:68::i;:::-;42082:75;41945:220;-1:-1:-1;;;41945:220:0:o;45869:355::-;46032:72;46052:10;46064:4;46070:2;46074:7;;46032:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;46032:72:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46083:7:0;;-1:-1:-1;46083:7:0;;;;46032:72;;;46083:7;;46032:72;46083:7;46032:72;;;;;;;;-1:-1:-1;46032:72:0;-1:-1:-1;46099:4:0;;-1:-1:-1;46032:19:0;;-1:-1:-1;46032:72:0:i;:::-;46115:101;46171:10;46183:4;46189:2;46193:7;;46202;;46211:4;;46115:55;:101::i;36834:53::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;36834:53:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;47543:155::-;47617:16;47653:37;47680:1;47684:5;;47653:18;:37::i;26454:161::-;26528:29;26577:30;26594:12;;26577:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26577:16:0;;-1:-1:-1;;;26577:30:0:i;47706:552::-;47818:25;47846:10;-1:-1:-1;;;;;47846:21:0;;;:82;;47885:43;47921:6;47885:35;:43::i;:::-;47846:82;;;47870:12;;;;:4;:12;;;;;47846:82;47818:110;-1:-1:-1;;;;;;47947:21:0;;47939:61;;;;-1:-1:-1;;;47939:61:0;;46850:2:1;47939:61:0;;;46832:21:1;46889:2;46869:18;;;46862:30;46928:29;46908:18;;;46901:57;46975:18;;47939:61:0;46822:177:1;47939:61:0;-1:-1:-1;;;;;48011:27:0;;;;;;;:18;;;:27;;;;;;;;:36;;;;;;;;;;:45;;;48070:38;;:10;:38;48067:184;;48202:36;;;-1:-1:-1;;;;;35080:15:1;;;48202:36:0;;;35062:34:1;35132:15;;;35112:18;;;35105:43;35164:18;;;;35157:34;;;48202:36:0;;;;;;;;;;34997:18:1;;;48202:36:0;;;;-1:-1:-1;;;48125:114:0;;;:63;;;;;:114;;48189:4;;-1:-1:-1;;48202:36:0;48125:114;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48067:184;47807:451;47706:552;;;;:::o;44513:322::-;44622:25;44685:3;-1:-1:-1;;;;;44671:25:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44671:25:0;;44660:36;;44711:9;44707:121;44730:8;:15;44726:1;:19;44707:121;;;44781:4;:12;44786:3;;44790:1;44786:6;;;;;;;:::i;:::-;;;;;;;44781:12;;;;;;;;;;;:22;;:35;44804:8;;44813:1;44804:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;44781:35:0;-1:-1:-1;;;;;44781:35:0;;;;;;;;;;;;;44767:8;44776:1;44767:11;;;;;;;;:::i;:::-;;;;;;;;;;:49;44747:3;;;;:::i;:::-;;;;44707:121;;41516:130;41612:12;;;;:4;:12;;;;;:26;;41605:33;;41579:13;;41612:26;41605:33;;;:::i;46758:224::-;46891:83;46911:10;46923:7;46940:1;46944:7;;46891:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;46891:83:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46953:7:0;;-1:-1:-1;46953:7:0;;;;46891:83;;;46953:7;;46891:83;46953:7;46891:83;;;;;;;;-1:-1:-1;46891:83:0;-1:-1:-1;46969:4:0;;-1:-1:-1;46891:19:0;;-1:-1:-1;46891:83:0:i;:::-;46758:224;;;;;;:::o;46990:545::-;47100:20;47122:24;47100:20;47265:40;;47281:11;47265:40;:::i;:::-;47249:9;:11;;47195:10;;:67;;47221:40;;47195:67;47249:11;;;:::i;:::-;;;;;47221:27;:40::i;:::-;47195:67;;;;;;;;;;;;;;;-1:-1:-1;47195:67:0;:110;;;;-1:-1:-1;;;;;;47195:110:0;-1:-1:-1;;;;;47195:110:0;;;;;;;;;;;;:67;;-1:-1:-1;47195:67:0;;:110;;-1:-1:-1;47195:110:0;;;;;;;;:::i;:::-;-1:-1:-1;47195:110:0;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;47195:110:0;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;47325:22:0;;47195:110;;-1:-1:-1;;;;;;47325:22:0;:36;;;-1:-1:-1;47325:36:0;:56;;-1:-1:-1;47365:16:0;;;47325:56;47317:74;;;;-1:-1:-1;;;47317:74:0;;50613:2:1;47317:74:0;;;50595:21:1;50652:1;50632:18;;;50625:29;-1:-1:-1;;;50670:18:1;;;50663:35;50715:18;;47317:74:0;50585:154:1;47317:74:0;47430:22;;47407:60;;47454:12;;-1:-1:-1;;;;;47430:22:0;;;;47407:60;;47430:22;;47407:60;47488:39;47507:12;47521:5;;47488:18;:39::i;:::-;47478:49;;47148:387;46990:545;;;;;;:::o;44843:276::-;-1:-1:-1;;;;;44969:23:0;;;44942:7;44969:23;;;:16;:23;;;;;;;;:32;;;;;;;;;;;;;;:142;;45073:12;;;;:4;:12;;;;;;;;-1:-1:-1;;;;;45073:29:0;;;;;:22;;;;:29;;;;;:38;;;;;;;;;;;44969:142;;;-1:-1:-1;;44969:142:0;44962:149;44843:276;-1:-1:-1;;;;44843:276:0:o;48746:975::-;48930:8;48911:15;:27;;48903:69;;;;-1:-1:-1;;;48903:69:0;;48232:2:1;48903:69:0;;;48214:21:1;48271:2;48251:18;;;48244:30;48310:31;48290:18;;;48283:59;48359:18;;48903:69:0;48204:179:1;48903:69:0;48983:25;49011:12;;;:4;:12;;;;;;;;49139:24;;;;-1:-1:-1;;;;;49243:22:0;;;;:15;;;:22;;;;;;:24;;49011:12;;48983:25;49139:24;36601:95;;49220:5;;49227:7;;49236:5;;49243:24;48983:25;49243:24;;;:::i;:::-;;;;-1:-1:-1;49192:86:0;;;;;;40958:25:1;;;;-1:-1:-1;;;;;41057:15:1;;;41037:18;;;41030:43;41109:15;;;;41089:18;;;41082:43;41141:18;;;41134:34;41184:19;;;41177:35;41228:19;;;41221:35;;;40930:19;;49192:86:0;;;;;;;;;;;;49182:97;;;;;;49075:219;;;;;;;;-1:-1:-1;;;32946:27:1;;32998:1;32989:11;;32982:27;;;;33034:2;33025:12;;33018:28;33071:2;33062:12;;32936:144;49075:219:0;;;;-1:-1:-1;;49075:219:0;;;;;;;;;49051:254;;49075:219;49051:254;;;;49316:24;49343:26;;;;;;;;;43321:25:1;;;43394:4;43382:17;;43362:18;;;43355:45;;;;43416:18;;;43409:34;;;43459:18;;;43452:34;;;49051:254:0;;-1:-1:-1;49316:24:0;49343:26;;43293:19:1;;49343:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;49343:26:0;;-1:-1:-1;;49343:26:0;;;-1:-1:-1;;;;;;;49388:30:0;;;;;;:59;;;49442:5;-1:-1:-1;;;;;49422:25:0;:16;-1:-1:-1;;;;;49422:25:0;;49388:59;49380:89;;;;-1:-1:-1;;;49380:89:0;;48590:2:1;49380:89:0;;;48572:21:1;48629:2;48609:18;;;48602:30;-1:-1:-1;;;48648:18:1;;;48641:47;48705:18;;49380:89:0;48562:167:1;49380:89:0;-1:-1:-1;;;;;49480:25:0;;;;;;;:18;;;:25;;;;;;;;:34;;;;;;;;;;:42;;;49536:38;;:10;:38;49533:181;;49668:33;;;-1:-1:-1;;;;;35080:15:1;;;49668:33:0;;;35062:34:1;35132:15;;;35112:18;;;35105:43;35164:18;;;;35157:34;;;49668:33:0;;;;;;;;;;34997:18:1;;;49668:33:0;;;;-1:-1:-1;;;49591:111:0;;;:63;;;;;:111;;49655:4;;-1:-1:-1;;49668:33:0;49591:111;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49533:181;48892:829;;;48746:975;;;;;;;;:::o;46373:169::-;46494:40;46504:7;46513;;46522;;46494:40;;;;;;;;;;;;:9;:40::i;42854:654::-;42970:33;43049:7;-1:-1:-1;;;;;43035:29:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43035:29:0;;43016:48;;43079:9;43075:426;43094:18;;;43075:426;;;43134:25;43162:4;:16;43167:7;;43175:1;43167:10;;;;;;;:::i;:::-;;;;;;;43162:16;;;;;;;;;;;43134:44;;43265:10;-1:-1:-1;;;;;43201:74:0;:10;:55;43234:8;:21;;;43212:16;43229:1;43212:19;;;;;;;;:::i;:::-;;;;;;;;;;;:43;;;43201:55;;;;;;;;;;;-1:-1:-1;43201:55:0;:60;-1:-1:-1;;;;;43201:60:0;:74;43193:99;;;;-1:-1:-1;;;43193:99:0;;;;;;;:::i;:::-;43316:73;43331:10;:52;43366:13;;43380:1;43366:16;;;;;;;:::i;:::-;;;;;;;43342:8;:21;;:40;;;43331:52;;;;;;;;;;;:57;;43316:73;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:14;:73::i;:::-;43315:74;43307:97;;;;-1:-1:-1;;;43307:97:0;;49940:2:1;43307:97:0;;;49922:21:1;49979:2;49959:18;;;49952:30;-1:-1:-1;;;49998:18:1;;;49991:40;50048:18;;43307:97:0;49912:160:1;43307:97:0;43478:7;;43486:1;43478:10;;;;;;;:::i;:::-;;;;;;;43460:13;;43474:1;43460:16;;;;;;;:::i;:::-;;;;;;;43439;43456:1;43439:19;;;;;;;;:::i;:::-;;;;;;;43424:65;;;;;;;;;;-1:-1:-1;43114:3:0;;;;:::i;:::-;;;;43075:426;;41757:180;41871:24;;;;:10;:24;;;;;:28;;41866:63;;41833:13;;41866:63;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41912:12;41926:1;41901:27;;;;;;;;42278:25:1;;;42351:4;42339:17;42334:2;42319:18;;42312:45;42266:2;42251:18;;42233:130;36894:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;36894:49:0;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;46550:200::-;46674:12;;;;:4;:12;;;;;46654:88;;46688:10;;46700:7;;46679:6;46729;46737:4;46654:19;:88::i;:::-;46550:200;;;;:::o;43516:704::-;43622:25;43685:6;-1:-1:-1;;;;;43672:27:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;43660:39;;43714:9;43710:503;43729:17;;;43710:503;;;43768:25;43796:4;:16;43801:7;;43809:1;43801:10;;;;;;;:::i;:::-;;;;;;;43796:16;;;;;;;;;;;43768:44;;43842:8;:15;;43827:30;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;43827:30:0;-1:-1:-1;;;;;43827:30:0;-1:-1:-1;;;;;43827:30:0;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:9;43837:1;43827:12;;;;;;;;:::i;:::-;;;;;;;;;;;:30;;;;43891:21;;43880:33;;;;:10;:33;;;;;;:38;-1:-1:-1;;;;;43880:38:0;43922:10;43880:52;43872:77;;;;-1:-1:-1;;;43872:77:0;;;;;;;:::i;:::-;43982:49;43998:6;;44005:1;43998:9;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;43982:49;;;:::i;:::-;44009:21;;43982:15;:49::i;:::-;43964:67;;:15;;;:67;;-1:-1:-1;;;;;;43964:67:0;-1:-1:-1;;;;;43964:67:0;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;43964:67:0;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;43964:67:0;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;44106:9;44116:1;44106:12;;;;;;;;:::i;:::-;;;;;;;:16;;;44090:34;;;;;;44065:8;:15;;:19;;44049:37;;;;;;:::i;:::-;;;;;;;;:75;44046:156;;44175:7;;44183:1;44175:10;;;;;;;:::i;:::-;;;;;;;44150:36;44154:8;:15;;:19;;44150:36;;;;;;:::i;:::-;;;;;;;;44046:156;-1:-1:-1;43748:3:0;;;;:::i;:::-;;;;43710:503;;30698:176;30782:22;29036:17;:15;:17::i;:::-;29028:42;;;;-1:-1:-1;;;29028:42:0;;;;;;;:::i;:::-;30828:8:::1;30817:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30858:8;;30847;:19;;;;;;;:::i;:::-;;30698:176:::0;;;;:::o;45127:208::-;45233:10;45216:28;;;;:16;:28;;;;;;;;-1:-1:-1;;;;;45216:38:0;;;;;;;;;;;;:49;;-1:-1:-1;;45216:49:0;;;;;;;;;;45281:46;;40053:41:1;;;45216:38:0;;45233:10;45281:46;;40026:18:1;45281:46:0;;;;;;;45127:208;;:::o;45343:186::-;45415:7;45442:12;;;:4;:12;;;;;:25;:39;:79;;45513:6;45442:79;;;45492:1;45435:86;45343:186;-1:-1:-1;;45343:186:0:o;29542:31::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;27260:156::-;27336:16;29036:17;:15;:17::i;:::-;29028:42;;;;-1:-1:-1;;;29028:42:0;;;;;;;:::i;:::-;-1:-1:-1;27392:4:0::1;:15:::0;;-1:-1:-1;;;;;;27392:15:0::1;-1:-1:-1::0;;;;;27392:15:0;::::1;::::0;;::::1;::::0;;;27370:38:::1;::::0;27392:15;;;;27370:38:::1;::::0;-1:-1:-1;;27370:38:0::1;27260:156:::0;;;:::o;27424:840::-;27584:4;27602:39;27643:33;27680:68;27704:7;27713:8;27723;27733:7;;27742:5;27680:23;:68::i;:::-;27601:147;;;;27762:34;27759:101;;;27820:28;-1:-1:-1;27813:35:0;;-1:-1:-1;27813:35:0;27759:101;27884:4;;-1:-1:-1;;;;;27873:15:0;;;27884:4;;27873:15;27870:58;;;27912:4;27905:11;;;;;;27870:58;27942:4;;:17;;-1:-1:-1;;;;;27942:4:0;:15;:17::i;:::-;27938:62;;27983:5;27976:12;;;;;;27938:62;28051:4;;28067:130;;28011:11;;;;-1:-1:-1;;;;;28051:4:0;;;;-1:-1:-1;;;28090:61:0;28067:130;;28153:7;;28162:8;;28172;;28182:7;;;;28191:5;;28067:130;;;:::i;:::-;;;;-1:-1:-1;;28067:130:0;;;;;;;;;;;;;;-1:-1:-1;;;;;28067:130:0;-1:-1:-1;;;;;;28067:130:0;;;;;;;;;;28051:147;;;;28067:130;28051:147;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28010:188;;;;28216:6;:40;;;;;28237:10;28226:30;;;;;;;;;;;;:::i;:::-;28209:47;;;;;;27424:840;;;;;;;;;:::o;49876:156::-;50004:20;;;;;;;;;;;-1:-1:-1;;;50004:20:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;50004:20:0;;;;;49876:156::o;30585:105::-;30631:13;30664:18;30669:8;30664:18;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:4;:18::i;:::-;30657:25;;30585:105;:::o;45537:324::-;45691:12;;;;:4;:12;;;;;45671:77;;45705:10;45717:4;45723:2;45696:6;45735;45743:4;45671:19;:77::i;:::-;45759:94;45810:10;45822:4;45828:2;45832:6;45840;45848:4;;45759:50;:94::i;46232:133::-;46324:33;46329:7;46338:6;46346;46324:33;;;;;;;;;;;;:4;:33::i;30034:543::-;30113:4;-1:-1:-1;;;;;;30150:63:0;;-1:-1:-1;;;30150:63:0;;:117;;-1:-1:-1;;;;;;;30230:37:0;;-1:-1:-1;;;30230:37:0;30150:117;:166;;;-1:-1:-1;;;;;;;30284:32:0;;-1:-1:-1;;;30284:32:0;30150:166;:230;;;-1:-1:-1;;;;;;;30333:47:0;;-1:-1:-1;;;30333:47:0;30150:230;:282;;;-1:-1:-1;;;;;;;30397:35:0;;-1:-1:-1;;;30397:35:0;30150:282;:349;;;-1:-1:-1;;;;;;;30449:50:0;;-1:-1:-1;;;30449:50:0;30150:349;:419;;;;30516:53;30557:11;30516:40;:53::i;29098:155::-;29142:4;29166:79;29189:10;29209:4;29216:7;;-1:-1:-1;;;;;;29216:7:0;29225:8;;29235:9;29166:22;:79::i;53237:680::-;53304:10;53352:4;53341:31;;;;;;;;;;;;:::i;:::-;53325:47;-1:-1:-1;53325:47:0;-1:-1:-1;53383:490:0;;;;53408:30;53433:4;53408:24;:30::i;:::-;53383:490;;;53472:24;53498;53524:27;53553:24;53579;53618:4;53607:73;;;;;;;;;;;;:::i;:::-;53471:209;;;;;;;;;;53699:9;53695:167;53718:7;:14;53714:1;:18;53695:167;;;53758:88;53778:7;53786:1;53778:10;;;;;;;;:::i;:::-;;;;;;;53790:7;53798:1;53790:10;;;;;;;;:::i;:::-;;;;;;;53802;53813:1;53802:13;;;;;;;;:::i;:::-;;;;;;;53817:7;53825:1;53817:10;;;;;;;;:::i;:::-;;;;;;;53829:7;53837:1;53829:10;;;;;;;;:::i;:::-;;;;;;;53841:4;53758:19;:88::i;:::-;53734:3;;;;:::i;:::-;;;;53695:167;;;;53456:417;;;;;53383:490;53883:26;:24;:26::i;:::-;53293:624;53237:680;:::o;57428:256::-;57511:25;57580:12;;;:4;:12;;;;;;;;57568:38;;57557:50;;:10;:50;;;;;;:55;-1:-1:-1;;;;;57557:55:0;57616:10;57557:69;;:102;;-1:-1:-1;57638:10:0;57630:29;;57557:102;57549:127;;;;-1:-1:-1;;;57549:127:0;;;;;;;:::i;:::-;57428:256;;;:::o;56072:1348::-;-1:-1:-1;;;;;56253:20:0;;;56250:680;;56305:6;-1:-1:-1;;;;;56293:18:0;:8;-1:-1:-1;;;;;56293:18:0;;56290:429;;-1:-1:-1;;;;;56340:26:0;;;;;;;:18;;;:26;;;;;;;;:36;;;;;;;;;;:46;-1:-1:-1;56340:46:0;;:84;;-1:-1:-1;;;;;;56390:24:0;;;;;;;:16;:24;;;;;;;;:34;;;;;;;;;;;;56340:84;56332:121;;;;-1:-1:-1;;;56332:121:0;;47879:2:1;56332:121:0;;;47861:21:1;47918:2;47898:18;;;47891:30;47957:26;47937:18;;;47930:54;48001:18;;56332:121:0;47851:174:1;56332:121:0;-1:-1:-1;;;;;56475:26:0;;;;;;;:18;;;:26;;;;;;;;:36;;;;;;;;;;:46;-1:-1:-1;56472:232:0;;-1:-1:-1;;;;;56546:26:0;;;;;;;:18;;;:26;;;;;;;;:36;;;;;;;;;;;:46;;56586:6;;56546:26;:46;;56586:6;;56546:46;:::i;:::-;;;;-1:-1:-1;56472:232:0;;-1:-1:-1;56472:232:0;;-1:-1:-1;;;;;56648:26:0;;;;;;;:18;;;:26;;;;;;;;:36;;;;;;;;;;;56641:43;56472:232;-1:-1:-1;;;;;56741:26:0;;;;;;:18;;;:26;;;;;;:36;-1:-1:-1;56741:36:0;56733:71;;;;-1:-1:-1;;;56733:71:0;;46499:2:1;56733:71:0;;;46481:21:1;46538:2;46518:18;;;46511:30;-1:-1:-1;;;46557:18:1;;;46550:52;46619:18;;56733:71:0;46471:172:1;56733:71:0;-1:-1:-1;;;;;56819:26:0;;;;;;:18;;;:26;;;;;:36;;56849:6;;56819:26;:36;;56849:6;;56819:36;:::i;:::-;;;;-1:-1:-1;56250:680:0;;-1:-1:-1;56250:680:0;;56912:6;56888:8;:20;;;:30;;;;;;;:::i;:::-;;;;-1:-1:-1;;56250:680:0;-1:-1:-1;;;;;56943:23:0;;;56940:157;;-1:-1:-1;;;;;56983:29:0;;;;;;:18;;;:29;;;;;:39;;57016:6;;56983:29;:39;;57016:6;;56983:39;:::i;:::-;;;;-1:-1:-1;56940:157:0;;-1:-1:-1;56940:157:0;;57079:6;57055:8;:20;;;:30;;;;;;;:::i;:::-;;;;-1:-1:-1;;56940:157:0;57110:11;57107:306;;;57176:9;-1:-1:-1;;;;;57143:59:0;57168:6;-1:-1:-1;;;;;57143:59:0;57158:8;-1:-1:-1;;;;;57143:59:0;;57187:6;57195;57143:59;;;;;;43015:25:1;;;43071:2;43056:18;;43049:34;43003:2;42988:18;;42970:119;57143:59:0;;;;;;;;57238:10;57220:29;;57217:185;;57348:37;;;-1:-1:-1;;;;;35080:15:1;;;57348:37:0;;;35062:34:1;35132:15;;;35112:18;;;35105:43;35164:18;;;;35157:34;;;57348:37:0;;;;;;;;;;34997:18:1;;;57348:37:0;;;;-1:-1:-1;;;57270:116:0;;;:63;;;;;:116;;-1:-1:-1;;;;57348:37:0;57270:116;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57217:185;56072:1348;;;;;;;:::o;50040:706::-;50130:13;;:::i;:::-;50165:133;50194:27;50209:6;:11;;;50194:14;:27::i;:::-;:57;;;;-1:-1:-1;50225:26:0;;;50194:57;:103;;50286:6;:11;;;50194:103;;;50254:24;;;;:10;:24;;;;;:29;;50194:103;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50180:6;:11;;:117;;;50165:14;:133::i;:::-;50164:134;50156:151;;;;-1:-1:-1;;;50156:151:0;;;;;;47547:2:1;47529:21;;;47586:1;47566:18;;;47559:29;-1:-1:-1;;;47619:2:1;47604:18;;47597:34;47663:2;47648:18;;47519:153;50156:151:0;50327:141;50358:29;50373:6;:13;;;50358:14;:29::i;:::-;:59;;;;-1:-1:-1;50391:26:0;;;50358:59;:109;;50454:6;:13;;;50358:109;;;50420:24;;;;:10;:24;;;;;:31;;50358:109;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50342:6;:13;;:125;;;50327:14;:141::i;:::-;50326:142;50318:161;;;;-1:-1:-1;;;50318:161:0;;50279:2:1;50318:161:0;;;50261:21:1;50318:1;50298:18;;;50291:29;-1:-1:-1;;;50336:18:1;;;50329:36;50382:18;;50318:161:0;50251:155:1;50318:161:0;50499:129;50527:26;50542:6;:10;;;50527:14;:26::i;:::-;:56;;;;-1:-1:-1;50557:26:0;;;50527:56;:100;;50617:6;:10;;;50527:100;;;50586:24;;;;:10;:24;;;;;:28;;50527:100;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50514:6;:10;;:113;;;50499:14;:129::i;:::-;50498:130;50490:146;;;;-1:-1:-1;;;50490:146:0;;49277:2:1;50490:146:0;;;49259:21:1;49316:1;49296:18;;;49289:29;-1:-1:-1;;;49334:18:1;;;49327:33;49377:18;;50490:146:0;49249:152:1;50490:146:0;50661:26;:53;;50703:11;;50661:53;;;50698:1;50661:53;-1:-1:-1;;;;;50647:67:0;;;-1:-1:-1;50647:67:0;;50040:706;-1:-1:-1;50040:706:0:o;31086:322::-;31205:18;;31176:13;;-1:-1:-1;;;;;31205:18:0;31202:80;;-1:-1:-1;31261:9:0;31254:16;;31202:80;31319:18;;31299:101;;-1:-1:-1;;;31299:101:0;;-1:-1:-1;;;;;31319:18:0;;;;31299:47;;:101;;31355:4;;31362:9;;31373:14;;31389:10;;31299:101;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;31299:101:0;;;;;;;;;;;;:::i;54421:421::-;54609:9;54605:150;54628:7;:14;54624:1;:18;54605:150;;;54664:79;54684:8;54694:6;54702:9;54713:7;54721:1;54713:10;;;;;;;;:::i;:::-;;;;;;;54725:7;54733:1;54725:10;;;;;;;;:::i;:::-;;;;;;;54737:5;54664:19;:79::i;:::-;54644:3;;;;:::i;:::-;;;;54605:150;;;;54768:12;54765:70;;;54797:26;:24;:26::i;35260:1006::-;35506:15;:2;-1:-1:-1;;;;;35506:13:0;;:15::i;:::-;35502:757;;;35559:203;;-1:-1:-1;;;35559:203:0;;-1:-1:-1;;;;;35559:43:0;;;;;:203;;35625:8;;35656:4;;35683:3;;;;35709:7;;;;35739:4;;;;35559:203;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35559:203:0;;;;;;;;-1:-1:-1;;35559:203:0;;;;;;;;;;;;:::i;:::-;;;35538:710;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;36121:6;36114:14;;-1:-1:-1;;;36114:14:0;;;;;;;;:::i;35538:710::-;;;36170:62;;-1:-1:-1;;;36170:62:0;;45669:2:1;36170:62:0;;;45651:21:1;45708:2;45688:18;;;45681:30;45747:34;45727:18;;;45720:62;-1:-1:-1;;;45798:18:1;;;45791:50;45858:19;;36170:62:0;45641:242:1;35538:710:0;-1:-1:-1;;;;;;35847:85:0;;-1:-1:-1;;;35847:85:0;35821:224;;35975:50;;-1:-1:-1;;;35975:50:0;;;;;;;:::i;35821:224::-;35776:284;35260:1006;;;;;;;;;:::o;50754:2088::-;50856:24;50917:5;-1:-1:-1;;;;;50903:27:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50903:27:0;;50893:37;;50945:9;50941:1894;50960:16;;;50941:1894;;;50998:30;51031:5;;51037:1;51031:8;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;50998:41;;;:::i;:::-;;-1:-1:-1;51067:33:0;:55;;51107:12;:15;;;51067:55;;;51103:1;51067:55;51054:7;51062:1;51054:10;;;;;;;;:::i;:::-;;;;;;;;;;:68;51165:33;:143;;51223:15;;;;:85;;51283:12;:25;;;51165:143;;51223:85;51251:15;;;;;51246:21;;;;:4;:21;;;:34;51165:143;;;51201:19;51165:143;51137:25;;;:171;51331:33;;;;:138;;-1:-1:-1;51369:25:0;;;;:39;;;;:99;;-1:-1:-1;51437:25:0;;;;;51426:37;;;;:10;:37;;;;;;:42;-1:-1:-1;;;;;51426:42:0;51412:10;:56;51369:99;51323:163;;;;-1:-1:-1;;;51323:163:0;;;;;;;:::i;:::-;51504:7;51512:1;51504:10;;;;;;;;:::i;:::-;;;;;;;51518:1;51504:15;51501:1246;;;51580:27;;51540:37;;51580:35;;-1:-1:-1;;;;;51580:27:0;:33;:35::i;:::-;51540:75;;51662:29;-1:-1:-1;;;;;51634:63:0;;:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51718:24;51745:4;:57;51771:29;-1:-1:-1;;;;;51750:51:0;:7;51758:1;51750:10;;;;;;;;:::i;:::-;;;;;;:51;;;;51745:57;;;;;;;;;;;51718:84;;51844:12;:25;;;51821:7;:20;;:48;;;;51905:63;51921:12;:19;;;51942:12;:25;;;51905:15;:63::i;:::-;51888:80;;:14;;;:80;;-1:-1:-1;;;;;;51888:80:0;-1:-1:-1;;;;;51888:80:0;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;51888:80:0;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;51888:80:0;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;51988:33;52023:36;52063:48;:46;:48::i;:::-;51987:124;;;;52225:95;52363:19;52347:37;;;;;;52427:22;52411:40;;;;;;52478:13;52534:7;52542:1;52534:10;;;;;;;;:::i;:::-;;;;;;;52188:381;;;;;;;;;;;41863:25:1;;;41919:2;41904:18;;41897:34;;;;41962:2;41947:18;;41940:34;;;;42005:2;41990:18;;41983:34;-1:-1:-1;;;;;42054:32:1;42048:3;42033:19;;42026:61;41850:3;41835:19;;41817:276;52188:381:0;;;;;;;;;;;;;52156:432;;;;;;52130:7;:23;;:458;;;;52661:7;52669:1;52661:10;;;;;;;;:::i;:::-;;;;;;;;;;;52639:20;;52612:60;;52639:20;;52612:60;;52639:20;;52612:60;52720:7;52728:1;52720:10;;;;;;;;:::i;:::-;;;;;;;52696:35;52700:7;:14;;:18;;52696:35;;;;;;:::i;:::-;;;;;;;;51521:1226;;;;51501:1246;52761:62;52767:7;52775:1;52767:10;;;;;;;;:::i;:::-;;;;;;;52779:12;:21;;;52802:12;:20;;;52761:5;:62::i;:::-;-1:-1:-1;50978:3:0;;;;:::i;:::-;;;;50941:1894;;;;50754:2088;;;;;:::o;28272:372::-;28415:1;28392:11;28342:29;;-1:-1:-1;;;;;28392:11:0;:25;28384:42;;;;-1:-1:-1;;;28384:42:0;;;;;;49608:2:1;49590:21;;;49647:1;49627:18;;;49620:29;-1:-1:-1;;;49680:2:1;49665:18;;49658:34;49724:2;49709:18;;49580:153;28384:42:0;28437:11;:24;;-1:-1:-1;;;;;;28437:24:0;28451:10;28437:24;;;28499:42;;;;;;;;;;;;;;:::i;:::-;28473:4;28472:69;;-1:-1:-1;;;;;28472:69:0;;;-1:-1:-1;;;;;;28472:69:0;;;;;;;28557:22;;28472:69;;-1:-1:-1;28473:4:0;;28557:22;;28473:4;;28557:22;28609:27;28619:16;28609:9;:27::i;18421:242::-;18474:7;18522:1;18525:15;18542:12;18556:9;18567:11;18580:14;18596:16;18614:10;18636:16;18651:1;18542:12;18636:16;:::i;:::-;18511:143;;;;;;51919:25:1;;;;51960:18;;51953:34;;;;52003:18;;;51996:34;;;;-1:-1:-1;;;;;52104:15:1;;;52084:18;;;52077:43;52136:19;;;52129:35;;;;52201:15;;52180:19;;;52173:44;52233:19;;;52226:35;52298:15;52277:19;;;52270:44;18626:27:0;52330:19:1;;;52323:35;51891:19;;18511:143:0;;;;;;;;;;;;18501:154;;;;;;18494:161;;18421:242;;;:::o;57692:136::-;57781:22;;;;;;;57807:13;57781:39;;57692:136::o;60076:331::-;60217:4;;-1:-1:-1;;;;;60243:25:0;;60263:4;60243:25;:76;;;;-1:-1:-1;;;;;;;60272:47:0;;-1:-1:-1;;;60272:47:0;60243:76;60240:128;;;-1:-1:-1;60344:4:0;;-1:-1:-1;60350:5:0;60336:20;;60240:128;-1:-1:-1;60386:5:0;;-1:-1:-1;60386:5:0;60076:331;;;;;;;;;;:::o;19923:289::-;19983:4;-1:-1:-1;;;;;20003:21:0;;20000:65;;-1:-1:-1;20048:5:0;;19923:289;-1:-1:-1;19923:289:0:o;20000:65::-;-1:-1:-1;20142:20:0;20190:14;;;19923:289::o;34308:944::-;34525:15;:2;-1:-1:-1;;;;;34525:13:0;;:15::i;:::-;34521:724;;;34578:196;;-1:-1:-1;;;34578:196:0;;-1:-1:-1;;;;;34578:38:0;;;;;:196;;34639:8;;34670:4;;34697:2;;34722:6;;34751:4;;;;34578:196;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34578:196:0;;;;;;;;-1:-1:-1;;34578:196:0;;;;;;;;;;;;:::i;:::-;;;34557:677;;;;:::i;:::-;-1:-1:-1;;;;;;34859:59:0;;-1:-1:-1;;;34859:59:0;34833:198;;34961:50;;-1:-1:-1;;;34961:50:0;;;;;;;:::i;37761:3409::-;37895:46;;37887:86;;-1:-1:-1;;;37887:86:0;;-1:-1:-1;;;;;;43659:33:1;;37887:86:0;;;43641:52:1;37863:4:0;;-1:-1:-1;;;;;37895:46:0;;37887:73;;43614:18:1;;37887:86:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;53925:488::-;53997:22;54033:4;54022:27;;;;;;;;;;;;:::i;:::-;53997:52;;54064:9;54060:346;54083:7;:14;54079:1;:18;54060:346;;;54120:16;54138:14;54154:17;54173:24;54199;54238:7;54246:1;54238:10;;;;;;;;:::i;:::-;;;;;;;54227:73;;;;;;;;;;;;:::i;:::-;54119:181;;;;;;;;;;54315:79;54335:8;54345:6;54353:9;54364:7;54373;54382:4;54388:5;54315:19;:79::i;:::-;54104:302;;;;;54099:3;;;;;:::i;:::-;;;;54060:346;;54850:1214;54998:11;54995:49;;55026:7;;54995:49;55054:18;55075:21;;;:13;:21;;;;;;;;;55133:18;;;:6;:18;;;;;;55165:12;;:17;;:39;;;55198:6;55186:5;55192:1;55186:8;;;;;;;;:::i;:::-;;;;;;;;;:18;;55165:39;55162:171;;;55273:12;:14;;55229:6;;:59;;55273:14;55229:59;55273:14;;;:::i;:::-;;;;-1:-1:-1;55249:21:0;;;;:13;:21;;;;;;;;:38;;;55229:59;;;;;;;;;;;;;;;;55303:18;;;;;;;;;;;;;;;;;;;;55249:38;-1:-1:-1;55229:59:0;-1:-1:-1;55162:171:0;55343:27;;;;;;;;-1:-1:-1;55343:27:0;;;;;;;-1:-1:-1;;;;;55343:27:0;;;;;;;;;;55381:30;;;;;;;;;;;;;;;;;55422:18;;;;;;;;;;;;;55477:45;;;-1:-1:-1;;31423:2:1;31419:15;;;31415:24;;55477:45:0;;;31403:37:1;31474:15;;;31470:24;;31456:12;;;31449:46;31529:15;;;31525:24;31511:12;;;31504:46;55477:45:0;;;;;;;;;31566:12:1;;;;55477:45:0;;55467:56;;;;;;55542:16;;;:11;:16;;;;;55572:12;;55542:16;;55467:56;55569:200;;55606:10;:20;;;;;;;;;;;;;;55641:29;;;;;;;-1:-1:-1;55641:29:0;;;55606:20;55641:29;;-1:-1:-1;;;;;55641:29:0;;;;;;;;;;55685:27;;;;;;;;;;;;;;55727:30;;;;;;;;;;;;;55569:200;55782:18;;;;:13;:18;;;;;;;;:26;;;;;;;;;55779:81;;55830:18;;;;;;;-1:-1:-1;55830:18:0;;;;;;;;;;55779:81;55870:18;;;;:13;:18;;;;;;;;:26;;;;;;;;:36;;55900:6;;55870:18;:36;;55900:6;;55870:36;:::i;:::-;;;;-1:-1:-1;55917:139:0;;-1:-1:-1;55937:5:0;:66;;55991:12;;;;:4;:12;;;;;55937:66;;;55945:43;55981:6;55945:35;:43::i;:::-;56005:8;56015:6;56023:9;56034:6;56042;56050:5;55917:19;:139::i;57836:1148::-;57895:9;57891:1014;57914:12;;57910:1;:16;57891:1014;;;57948:23;57974:9;;;:6;:9;;;;;58015:8;;57974:9;;57948:23;57974:9;;57948:23;;58015:8;;;;:::i;:::-;;;;;;;;;57998:25;;58045:5;58051:1;58045:8;;;;;;;;:::i;:::-;;;;;;;;;58038:15;;;58086:12;;58106:1;;58086:16;;58101:1;;58086:16;:::i;:::-;58085:22;;;;:::i;:::-;58068:39;;58122:24;58163:6;-1:-1:-1;;;;;58149:21:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58149:21:0;;58122:48;;58185:26;58228:6;-1:-1:-1;;;;;58214:21:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58214:21:0;;58185:50;;58250:24;58291:6;-1:-1:-1;;;;;58277:21:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58277:21:0;-1:-1:-1;58250:48:0;-1:-1:-1;58313:11:0;58359:1;58343:345;58366:12;;58362:16;;58343:345;;;58438:5;58444:1;58438:8;;;;;;;;:::i;:::-;;;;;;;;;58407:7;58415:3;58407:12;;;;;;;;:::i;:::-;;;;;;:41;-1:-1:-1;;;;;58407:41:0;;;-1:-1:-1;;;;;58407:41:0;;;;;58474:5;58480:1;58474:8;;;;;;;;:::i;:::-;;;;;;;;;58467:15;58534:5;58540;:1;58544;58540:5;:::i;:::-;58534:12;;;;;;;;:::i;:::-;;;;;;;;;58501:9;58511:3;58501:14;;;;;;;;:::i;:::-;-1:-1:-1;;;;;58501:47:0;;;:14;;;;;;;;;;;:47;58574:5;58580;:1;58584;58580:5;:::i;:::-;58574:12;;;;;;;;:::i;:::-;;;;;;;;;58567:19;58622:5;58628;:1;58632;58628:5;:::i;:::-;58622:12;;;;;;;;:::i;:::-;;;;;;;;;58605:7;58613:5;;;;;:::i;:::-;;;58605:14;;;;;;;;:::i;:::-;;;;;;;;;;:29;58660:5;58666;:1;58670;58666:5;:::i;:::-;58660:12;;;;;;;;:::i;:::-;;;;;;;;;58653:19;58380:6;58385:1;58380:6;;:::i;:::-;;;58343:345;;;;58746:6;-1:-1:-1;;;;;58702:63:0;;58766:5;58773:4;58790:7;58799:9;58810:7;58779:39;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58702:117;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;58841:21:0;;;;:13;:21;;;;;;;;58834:28;;;58884:9;;;:6;:9;;;;;58877:16;;-1:-1:-1;58884:9:0;58877:16;:::i;:::-;57933:972;;;;;;;57928:3;;;;;:::i;:::-;;;;57891:1014;;;-1:-1:-1;58915:19:0;58922:12;58915:19;58945:31;:29;:31::i;:::-;57836:1148::o;20220:538::-;20278:20;20516:21;20498:16;20494:44;-1:-1:-1;;;;;20380:177:0;20360:1;20335:237;20615:2;20612:1;20609;20602:16;20586:32;-1:-1:-1;20639:25:0;;20682:58;;;;20632:108;;20682:58;20712:9;20632:108;;20220:538;;;:::o;52850:379::-;52957:9;52953:232;52976:8;:15;52972:1;:19;52953:232;;;53044:1;-1:-1:-1;;;;;53021:25:0;:8;53030:1;53021:11;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;53021:25:0;;;53013:62;;;;-1:-1:-1;;;53013:62:0;;50946:2:1;53013:62:0;;;50928:21:1;50985:2;50965:18;;;50958:30;51024:26;51004:18;;;50997:54;51068:18;;53013:62:0;50918:174:1;53013:62:0;53090:83;53118:1;53130;53134:8;53143:1;53134:11;;;;;;;;:::i;:::-;;;;;;;53147:6;53155:7;53163:1;53155:10;;;;;;;;:::i;:::-;;;;;;;53167:5;53090:19;:83::i;:::-;52993:3;;;;:::i;:::-;;;;52953:232;;;;53195:26;:24;:26::i;29723:303::-;29796:29;29900:12;29889:50;;;;;;;;;;;;:::i;:::-;29849:18;29838:101;;-1:-1:-1;;;;;;29838:101:0;-1:-1:-1;;;;;29838:101:0;;;;;;;;;-1:-1:-1;29838:101:0;;;;29839:8;;29838:101;;;;;:::i;:::-;;;;;29969:49;30001:16;29969:31;:49::i;58992:1076::-;59056:9;59052:981;59075:10;:17;59071:21;;59052:981;;;59114:11;59128:10;59139:1;59128:13;;;;;;;;:::i;:::-;;;;;;;;;;;;;59182:16;;;:11;:16;;;;;;59230:12;;59128:13;;-1:-1:-1;59182:16:0;59128:13;59230:16;;59245:1;;59230:16;:::i;:::-;59213:33;;59261:16;59296:5;59302:1;59296:8;;;;;;;;:::i;:::-;;;;;;;;;59261:45;;59328:5;59334:1;59328:8;;;;;;;;:::i;:::-;;;;;;;;59321:15;;;59351:14;59384:5;59390:1;59384:8;;;;;;;;:::i;:::-;;;;;;;;;59351:43;;59416:5;59422:1;59416:8;;;;;;;;:::i;:::-;;;;;;;;59409:15;;;59439:16;59474:5;59480:1;59474:8;;;;;;;;:::i;:::-;;;;;;;;;59439:45;;59506:5;59512:1;59506:8;;;;;;;;:::i;:::-;;;;;;;;59499:15;;;59529:11;59559:24;59600:6;-1:-1:-1;;;;;59586:21:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59586:21:0;;59559:48;;59622:24;59663:6;-1:-1:-1;;;;;59649:21:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59649:21:0;-1:-1:-1;59622:48:0;-1:-1:-1;59701:1:0;59685:220;59708:12;;59704:16;;59685:220;;;59761:13;:18;59775:3;59761:18;;;;;;;;;;;:43;59795:5;59801:1;59795:8;;;;;;;;:::i;:::-;;;;;;;;;59780:7;59788:3;59780:12;;;;;;;;:::i;:::-;;;;;;:23;;;;59761:43;;;;;;;;;;;;59746:7;59754:3;59746:12;;;;;;;;:::i;:::-;;;;;;:58;;;;;59830:5;59836:1;59830:8;;;;;;;;:::i;:::-;;;;;;;;;;;;59823:15;;;59864:18;;;:13;:18;;;;;;59883:5;;;;:::i;:::-;;;59864:25;;;;;;;;;;;59857:32;;;59722:3;;;;;:::i;:::-;;;;59685:220;;;;59956:8;-1:-1:-1;;;;;59924:59:0;59948:6;-1:-1:-1;;;;;59924:59:0;59938:8;-1:-1:-1;;;;;59924:59:0;;59966:7;59975;59924:59;;;;;;;:::i;:::-;;;;;;;;60005:16;;;;:11;:16;;;;;59998:23;;;:::i;:::-;59099:934;;;;;;;;;59094:3;;;;;:::i;:::-;;;;59052:981;;;-1:-1:-1;60043:17:0;60050:10;;60043:17;:::i;37482:271::-;37576:12;37692;37681:44;;;;;;;;;;;;:::i;:::-;37631:46;37601:124;;-1:-1:-1;;;;;37601:124:0;;;-1:-1:-1;;;;;;37601:124:0;;;;;;;37602:27;37601:124;;;;;;;;;;;;;;-1:-1:-1;;37736:9:0;;;;;;;;;37602:27;37736:9;;;37482:271::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;14:134:1;82:20;;111:31;82:20;111:31;:::i;153:367::-;216:8;226:6;280:3;273:4;265:6;261:17;257:27;247:2;;298:1;295;288:12;247:2;-1:-1:-1;321:20:1;;-1:-1:-1;;;;;353:30:1;;350:2;;;396:1;393;386:12;350:2;433:4;425:6;421:17;409:29;;493:3;486:4;476:6;473:1;469:14;461:6;457:27;453:38;450:47;447:2;;;510:1;507;500:12;447:2;237:283;;;;;:::o;525:810::-;579:5;632:3;625:4;617:6;613:17;609:27;599:2;;650:1;647;640:12;599:2;686:6;673:20;712:4;735:43;775:2;735:43;:::i;:::-;807:2;801:9;819:31;847:2;839:6;819:31;:::i;:::-;885:18;;;919:15;;;;-1:-1:-1;954:15:1;;;1004:1;1000:10;;;988:23;;984:32;;981:41;-1:-1:-1;978:2:1;;;1035:1;1032;1025:12;978:2;1057:1;1067:238;1081:2;1078:1;1075:9;1067:238;;;1152:3;1139:17;1169:31;1194:5;1169:31;:::i;:::-;1213:18;;1251:12;;;;1283;;;;1099:1;1092:9;1067:238;;;-1:-1:-1;1323:6:1;;589:746;-1:-1:-1;;;;;;;589:746:1:o;1340:807::-;1405:5;1458:3;1451:4;1443:6;1439:17;1435:27;1425:2;;1476:1;1473;1466:12;1425:2;1505:6;1499:13;1531:4;1554:43;1594:2;1554:43;:::i;:::-;1626:2;1620:9;1638:31;1666:2;1658:6;1638:31;:::i;:::-;1704:18;;;1738:15;;;;-1:-1:-1;1773:15:1;;;1823:1;1819:10;;;1807:23;;1803:32;;1800:41;-1:-1:-1;1797:2:1;;;1854:1;1851;1844:12;1797:2;1876:1;1886:231;1900:2;1897:1;1894:9;1886:231;;;1964:3;1958:10;1981:31;2006:5;1981:31;:::i;:::-;2025:18;;2063:12;;;;2095;;;;1918:1;1911:9;1886:231;;2152:735;2206:5;2259:3;2252:4;2244:6;2240:17;2236:27;2226:2;;2277:1;2274;2267:12;2226:2;2313:6;2300:20;2339:4;2362:43;2402:2;2362:43;:::i;:::-;2434:2;2428:9;2446:31;2474:2;2466:6;2446:31;:::i;:::-;2512:18;;;2546:15;;;;-1:-1:-1;2581:15:1;;;2631:1;2627:10;;;2615:23;;2611:32;;2608:41;-1:-1:-1;2605:2:1;;;2662:1;2659;2652:12;2605:2;2684:1;2694:163;2708:2;2705:1;2702:9;2694:163;;;2765:17;;2753:30;;2803:12;;;;2835;;;;2726:1;2719:9;2694:163;;2892:732;2957:5;3010:3;3003:4;2995:6;2991:17;2987:27;2977:2;;3028:1;3025;3018:12;2977:2;3057:6;3051:13;3083:4;3106:43;3146:2;3106:43;:::i;:::-;3178:2;3172:9;3190:31;3218:2;3210:6;3190:31;:::i;:::-;3256:18;;;3290:15;;;;-1:-1:-1;3325:15:1;;;3375:1;3371:10;;;3359:23;;3355:32;;3352:41;-1:-1:-1;3349:2:1;;;3406:1;3403;3396:12;3349:2;3428:1;3438:156;3452:2;3449:1;3446:9;3438:156;;;3509:10;;3497:23;;3540:12;;;;3572;;;;3470:1;3463:9;3438:156;;3629:347;3680:8;3690:6;3744:3;3737:4;3729:6;3725:17;3721:27;3711:2;;3762:1;3759;3752:12;3711:2;-1:-1:-1;3785:20:1;;-1:-1:-1;;;;;3817:30:1;;3814:2;;;3860:1;3857;3850:12;3814:2;3897:4;3889:6;3885:17;3873:29;;3949:3;3942:4;3933:6;3925;3921:19;3917:30;3914:39;3911:2;;;3966:1;3963;3956:12;3981:508;4023:5;4076:3;4069:4;4061:6;4057:17;4053:27;4043:2;;4094:1;4091;4084:12;4043:2;4130:6;4117:20;4156:31;4184:2;4156:31;:::i;:::-;4216:2;4210:9;4228:31;4256:2;4248:6;4228:31;:::i;:::-;4283:2;4275:6;4268:18;4329:3;4322:4;4317:2;4309:6;4305:15;4301:26;4298:35;4295:2;;;4346:1;4343;4336:12;4295:2;4410;4403:4;4395:6;4391:17;4384:4;4376:6;4372:17;4359:54;4457:1;4433:15;;;4450:4;4429:26;4422:37;;;;-1:-1:-1;4437:6:1;4033:456;-1:-1:-1;;;4033:456:1:o;4494:475::-;4547:5;4600:3;4593:4;4585:6;4581:17;4577:27;4567:2;;4618:1;4615;4608:12;4567:2;4647:6;4641:13;4673:31;4701:2;4673:31;:::i;:::-;4733:2;4727:9;4745:31;4773:2;4765:6;4745:31;:::i;:::-;4800:2;4792:6;4785:18;4846:3;4839:4;4834:2;4826:6;4822:15;4818:26;4815:35;4812:2;;;4863:1;4860;4853:12;4812:2;4876:63;4936:2;4929:4;4921:6;4917:17;4910:4;4902:6;4898:17;4876:63;:::i;:::-;4957:6;4557:412;-1:-1:-1;;;;;4557:412:1:o;4974:975::-;5027:5;5075:4;5063:9;5058:3;5054:19;5050:30;5047:2;;;5093:1;5090;5083:12;5047:2;5126;5120:9;5168:4;5160:6;5156:17;-1:-1:-1;;;;;5260:6:1;5248:10;5245:22;5240:2;5228:10;5225:18;5222:46;5219:2;;;5271:18;;:::i;:::-;5311:10;5307:2;5300:22;5340:6;5331:15;;5370:29;5389:9;5370:29;:::i;:::-;5362:6;5355:45;5451:2;5440:9;5436:18;5423:32;5409:46;;5478:2;5470:6;5467:14;5464:2;;;5494:1;5491;5484:12;5464:2;5531:45;5572:3;5563:6;5552:9;5548:22;5531:45;:::i;:::-;5526:2;5518:6;5514:15;5507:70;5630:2;5619:9;5615:18;5602:32;5586:48;;5659:2;5649:8;5646:16;5643:2;;;5675:1;5672;5665:12;5643:2;5712:47;5755:3;5744:8;5733:9;5729:24;5712:47;:::i;:::-;5707:2;5699:6;5695:15;5688:72;5813:2;5802:9;5798:18;5785:32;5769:48;;5842:2;5832:8;5829:16;5826:2;;;5858:1;5855;5848:12;5826:2;;5895:47;5938:3;5927:8;5916:9;5912:24;5895:47;:::i;:::-;5890:2;5882:6;5878:15;5871:72;;;5037:912;;;;:::o;5954:247::-;6013:6;6066:2;6054:9;6045:7;6041:23;6037:32;6034:2;;;6082:1;6079;6072:12;6034:2;6121:9;6108:23;6140:31;6165:5;6140:31;:::i;6206:401::-;6301:6;6309;6362:2;6350:9;6341:7;6337:23;6333:32;6330:2;;;6378:1;6375;6368:12;6330:2;6410:9;6404:16;6429:31;6454:5;6429:31;:::i;:::-;6529:2;6514:18;;6508:25;6479:5;;-1:-1:-1;6542:33:1;6508:25;6542:33;:::i;:::-;6594:7;6584:17;;;6320:287;;;;;:::o;6612:1036::-;6792:6;6800;6808;6816;6824;6877:3;6865:9;6856:7;6852:23;6848:33;6845:2;;;6894:1;6891;6884:12;6845:2;6926:9;6920:16;6945:31;6970:5;6945:31;:::i;:::-;7045:2;7030:18;;7024:25;6995:5;;-1:-1:-1;7058:33:1;7024:25;7058:33;:::i;:::-;7162:2;7147:18;;7141:25;7110:7;;-1:-1:-1;7175:33:1;7141:25;7175:33;:::i;:::-;7278:2;7263:18;;7257:25;7227:7;;-1:-1:-1;;;;;;7331:14:1;;;7328:2;;;7358:1;7355;7348:12;7328:2;7381:72;7445:7;7436:6;7425:9;7421:22;7381:72;:::i;:::-;7371:82;;7499:3;7488:9;7484:19;7478:26;7462:42;;7529:2;7519:8;7516:16;7513:2;;;7545:1;7542;7535:12;7513:2;;7568:74;7634:7;7623:8;7612:9;7608:24;7568:74;:::i;:::-;7558:84;;;6835:813;;;;;;;;:::o;7653:691::-;7772:6;7780;7788;7796;7804;7857:3;7845:9;7836:7;7832:23;7828:33;7825:2;;;7874:1;7871;7864:12;7825:2;7913:9;7900:23;7932:31;7957:5;7932:31;:::i;:::-;7982:5;-1:-1:-1;8039:2:1;8024:18;;8011:32;8052:33;8011:32;8052:33;:::i;:::-;8104:7;-1:-1:-1;8163:2:1;8148:18;;8135:32;8176:33;8135:32;8176:33;:::i;:::-;7815:529;;;;-1:-1:-1;8228:7:1;;8282:2;8267:18;;8254:32;;-1:-1:-1;8333:3:1;8318:19;8305:33;;7815:529;-1:-1:-1;;7815:529:1:o;8349:471::-;8445:6;8453;8506:2;8494:9;8485:7;8481:23;8477:32;8474:2;;;8522:1;8519;8512:12;8474:2;8554:9;8548:16;8573:31;8598:5;8573:31;:::i;:::-;8672:2;8657:18;;8651:25;8623:5;;-1:-1:-1;;;;;;8688:30:1;;8685:2;;;8731:1;8728;8721:12;8685:2;8754:60;8806:7;8797:6;8786:9;8782:22;8754:60;:::i;:::-;8744:70;;;8464:356;;;;;:::o;8825:388::-;8893:6;8901;8954:2;8942:9;8933:7;8929:23;8925:32;8922:2;;;8970:1;8967;8960:12;8922:2;9009:9;8996:23;9028:31;9053:5;9028:31;:::i;:::-;9078:5;-1:-1:-1;9135:2:1;9120:18;;9107:32;9148:33;9107:32;9148:33;:::i;9218:1338::-;9378:6;9386;9394;9402;9410;9418;9426;9434;9487:3;9475:9;9466:7;9462:23;9458:33;9455:2;;;9504:1;9501;9494:12;9455:2;9543:9;9530:23;9562:31;9587:5;9562:31;:::i;:::-;9612:5;-1:-1:-1;9669:2:1;9654:18;;9641:32;9682:33;9641:32;9682:33;:::i;:::-;9734:7;-1:-1:-1;9792:2:1;9777:18;;9764:32;-1:-1:-1;;;;;9845:14:1;;;9842:2;;;9872:1;9869;9862:12;9842:2;9911:70;9973:7;9964:6;9953:9;9949:22;9911:70;:::i;:::-;10000:8;;-1:-1:-1;9885:96:1;-1:-1:-1;10088:2:1;10073:18;;10060:32;;-1:-1:-1;10104:16:1;;;10101:2;;;10133:1;10130;10123:12;10101:2;10172:72;10236:7;10225:8;10214:9;10210:24;10172:72;:::i;:::-;10263:8;;-1:-1:-1;10146:98:1;-1:-1:-1;10351:3:1;10336:19;;10323:33;;-1:-1:-1;10368:16:1;;;10365:2;;;10397:1;10394;10387:12;10365:2;;10436:60;10488:7;10477:8;10466:9;10462:24;10436:60;:::i;:::-;9445:1111;;;;-1:-1:-1;9445:1111:1;;-1:-1:-1;9445:1111:1;;;;;;10515:8;-1:-1:-1;;;9445:1111:1:o;10561:894::-;10666:6;10674;10682;10690;10698;10706;10759:3;10747:9;10738:7;10734:23;10730:33;10727:2;;;10776:1;10773;10766:12;10727:2;10815:9;10802:23;10834:31;10859:5;10834:31;:::i;:::-;10884:5;-1:-1:-1;10941:2:1;10926:18;;10913:32;10954:33;10913:32;10954:33;:::i;:::-;11006:7;-1:-1:-1;11065:2:1;11050:18;;11037:32;11078;11037;11078;:::i;:::-;11129:7;-1:-1:-1;11187:2:1;11172:18;;11159:32;-1:-1:-1;;;;;11203:30:1;;11200:2;;;11246:1;11243;11236:12;11200:2;11285:58;11335:7;11326:6;11315:9;11311:22;11285:58;:::i;:::-;10717:738;;;;-1:-1:-1;10717:738:1;;;;;11444:3;11429:19;;;11416:33;;10717:738;-1:-1:-1;;;;10717:738:1:o;11460:456::-;11537:6;11545;11553;11606:2;11594:9;11585:7;11581:23;11577:32;11574:2;;;11622:1;11619;11612:12;11574:2;11661:9;11648:23;11680:31;11705:5;11680:31;:::i;:::-;11730:5;-1:-1:-1;11787:2:1;11772:18;;11759:32;11800:33;11759:32;11800:33;:::i;:::-;11564:352;;11852:7;;-1:-1:-1;;;11906:2:1;11891:18;;;;11878:32;;11564:352::o;11921:525::-;12007:6;12015;12023;12031;12084:3;12072:9;12063:7;12059:23;12055:33;12052:2;;;12101:1;12098;12091:12;12052:2;12140:9;12127:23;12159:31;12184:5;12159:31;:::i;:::-;12209:5;-1:-1:-1;12266:2:1;12251:18;;12238:32;12279:33;12238:32;12279:33;:::i;:::-;12042:404;;12331:7;;-1:-1:-1;;;;12385:2:1;12370:18;;12357:32;;12436:2;12421:18;12408:32;;12042:404::o;12451:823::-;12557:6;12565;12573;12581;12589;12597;12650:3;12638:9;12629:7;12625:23;12621:33;12618:2;;;12667:1;12664;12657:12;12618:2;12706:9;12693:23;12725:31;12750:5;12725:31;:::i;:::-;12775:5;-1:-1:-1;12832:2:1;12817:18;;12804:32;12845:33;12804:32;12845:33;:::i;:::-;12897:7;-1:-1:-1;12951:2:1;12936:18;;12923:32;;-1:-1:-1;13002:2:1;12987:18;;12974:32;;-1:-1:-1;13057:3:1;13042:19;;13029:33;-1:-1:-1;;;;;13074:30:1;;13071:2;;;13117:1;13114;13107:12;13071:2;13156:58;13206:7;13197:6;13186:9;13182:22;13156:58;:::i;:::-;12608:666;;;;-1:-1:-1;12608:666:1;;-1:-1:-1;12608:666:1;;13233:8;;12608:666;-1:-1:-1;;;12608:666:1:o;13279:908::-;13410:6;13418;13426;13434;13442;13495:2;13483:9;13474:7;13470:23;13466:32;13463:2;;;13511:1;13508;13501:12;13463:2;13550:9;13537:23;13569:31;13594:5;13569:31;:::i;:::-;13619:5;-1:-1:-1;13675:2:1;13660:18;;13647:32;-1:-1:-1;;;;;13728:14:1;;;13725:2;;;13755:1;13752;13745:12;13725:2;13794:70;13856:7;13847:6;13836:9;13832:22;13794:70;:::i;:::-;13883:8;;-1:-1:-1;13768:96:1;-1:-1:-1;13971:2:1;13956:18;;13943:32;;-1:-1:-1;13987:16:1;;;13984:2;;;14016:1;14013;14006:12;13984:2;;14055:72;14119:7;14108:8;14097:9;14093:24;14055:72;:::i;:::-;13453:734;;;;-1:-1:-1;13453:734:1;;-1:-1:-1;14146:8:1;;14029:98;13453:734;-1:-1:-1;;;13453:734:1:o;14192:1107::-;14341:6;14349;14357;14365;14373;14381;14434:3;14422:9;14413:7;14409:23;14405:33;14402:2;;;14451:1;14448;14441:12;14402:2;14490:9;14477:23;14509:31;14534:5;14509:31;:::i;:::-;14559:5;-1:-1:-1;14615:2:1;14600:18;;14587:32;-1:-1:-1;;;;;14668:14:1;;;14665:2;;;14695:1;14692;14685:12;14665:2;14734:70;14796:7;14787:6;14776:9;14772:22;14734:70;:::i;:::-;14823:8;;-1:-1:-1;14708:96:1;-1:-1:-1;14911:2:1;14896:18;;14883:32;;-1:-1:-1;14927:16:1;;;14924:2;;;14956:1;14953;14946:12;14924:2;14995:72;15059:7;15048:8;15037:9;15033:24;14995:72;:::i;:::-;15086:8;;-1:-1:-1;14969:98:1;-1:-1:-1;15174:2:1;15159:18;;15146:32;;-1:-1:-1;15190:16:1;;;15187:2;;;15219:1;15216;15209:12;15187:2;;15242:51;15285:7;15274:8;15263:9;15259:24;15242:51;:::i;:::-;15232:61;;;14392:907;;;;;;;;:::o;15304:382::-;15369:6;15377;15430:2;15418:9;15409:7;15405:23;15401:32;15398:2;;;15446:1;15443;15436:12;15398:2;15485:9;15472:23;15504:31;15529:5;15504:31;:::i;:::-;15554:5;-1:-1:-1;15611:2:1;15596:18;;15583:32;15624:30;15583:32;15624:30;:::i;15691:315::-;15759:6;15767;15820:2;15808:9;15799:7;15795:23;15791:32;15788:2;;;15836:1;15833;15826:12;15788:2;15875:9;15862:23;15894:31;15919:5;15894:31;:::i;:::-;15944:5;15996:2;15981:18;;;;15968:32;;-1:-1:-1;;;15778:228:1:o;16011:383::-;16088:6;16096;16104;16157:2;16145:9;16136:7;16132:23;16128:32;16125:2;;;16173:1;16170;16163:12;16125:2;16212:9;16199:23;16231:31;16256:5;16231:31;:::i;:::-;16281:5;16333:2;16318:18;;16305:32;;-1:-1:-1;16384:2:1;16369:18;;;16356:32;;16115:279;-1:-1:-1;;;16115:279:1:o;16399:592::-;16494:6;16502;16510;16518;16571:3;16559:9;16550:7;16546:23;16542:33;16539:2;;;16588:1;16585;16578:12;16539:2;16627:9;16614:23;16646:31;16671:5;16646:31;:::i;:::-;16696:5;-1:-1:-1;16748:2:1;16733:18;;16720:32;;-1:-1:-1;16799:2:1;16784:18;;16771:32;;-1:-1:-1;16854:2:1;16839:18;;16826:32;-1:-1:-1;;;;;16870:30:1;;16867:2;;;16913:1;16910;16903:12;16867:2;16936:49;16977:7;16968:6;16957:9;16953:22;16936:49;:::i;:::-;16926:59;;;16529:462;;;;;;;:::o;16996:773::-;17118:6;17126;17134;17142;17195:2;17183:9;17174:7;17170:23;17166:32;17163:2;;;17211:1;17208;17201:12;17163:2;17251:9;17238:23;-1:-1:-1;;;;;17321:2:1;17313:6;17310:14;17307:2;;;17337:1;17334;17327:12;17307:2;17376:70;17438:7;17429:6;17418:9;17414:22;17376:70;:::i;:::-;17465:8;;-1:-1:-1;17350:96:1;-1:-1:-1;17553:2:1;17538:18;;17525:32;;-1:-1:-1;17569:16:1;;;17566:2;;;17598:1;17595;17588:12;17566:2;;17637:72;17701:7;17690:8;17679:9;17675:24;17637:72;:::i;:::-;17153:616;;;;-1:-1:-1;17728:8:1;-1:-1:-1;;;;17153:616:1:o;17774:1306::-;18005:6;18013;18021;18029;18037;18090:3;18078:9;18069:7;18065:23;18061:33;18058:2;;;18107:1;18104;18097:12;18058:2;18140:9;18134:16;-1:-1:-1;;;;;18210:2:1;18202:6;18199:14;18196:2;;;18226:1;18223;18216:12;18196:2;18249:72;18313:7;18304:6;18293:9;18289:22;18249:72;:::i;:::-;18239:82;;18367:2;18356:9;18352:18;18346:25;18330:41;;18396:2;18386:8;18383:16;18380:2;;;18412:1;18409;18402:12;18380:2;18435:74;18501:7;18490:8;18479:9;18475:24;18435:74;:::i;:::-;18425:84;;18555:2;18544:9;18540:18;18534:25;18518:41;;18584:2;18574:8;18571:16;18568:2;;;18600:1;18597;18590:12;18568:2;18623:74;18689:7;18678:8;18667:9;18663:24;18623:74;:::i;:::-;18613:84;;18743:2;18732:9;18728:18;18722:25;18706:41;;18772:2;18762:8;18759:16;18756:2;;;18788:1;18785;18778:12;19888:1162;19992:6;20023:2;20066;20054:9;20045:7;20041:23;20037:32;20034:2;;;20082:1;20079;20072:12;20034:2;20115:9;20109:16;-1:-1:-1;;;;;20185:2:1;20177:6;20174:14;20171:2;;;20201:1;20198;20191:12;20171:2;20239:6;20228:9;20224:22;20214:32;;20284:7;20277:4;20273:2;20269:13;20265:27;20255:2;;20306:1;20303;20296:12;20255:2;20335;20329:9;20357:43;20397:2;20357:43;:::i;:::-;20429:2;20423:9;20441:31;20469:2;20461:6;20441:31;:::i;:::-;20507:18;;;20541:15;;;;-1:-1:-1;20576:11:1;;;20618:1;20614:10;;;20606:19;;20602:28;;20599:41;-1:-1:-1;20596:2:1;;;20653:1;20650;20643:12;20596:2;20675:1;20696;20706:313;20722:2;20717:3;20714:11;20706:313;;;20796:3;20790:10;20832:2;20819:11;20816:19;20813:2;;;20848:1;20845;20838:12;20813:2;20877:67;20936:7;20931:2;20917:11;20913:2;20909:20;20905:29;20877:67;:::i;:::-;20865:80;;-1:-1:-1;20965:12:1;;;;20997;;;;20744:1;20735:11;20706:313;;;-1:-1:-1;21038:6:1;;20003:1047;-1:-1:-1;;;;;;;;;;20003:1047:1:o;21055:466::-;21170:6;21178;21231:2;21219:9;21210:7;21206:23;21202:32;21199:2;;;21247:1;21244;21237:12;21199:2;21287:9;21274:23;-1:-1:-1;;;;;21312:6:1;21309:30;21306:2;;;21352:1;21349;21342:12;21306:2;21391:70;21453:7;21444:6;21433:9;21429:22;21391:70;:::i;:::-;21480:8;;21365:96;;-1:-1:-1;21189:332:1;-1:-1:-1;;;;21189:332:1:o;23107:245::-;23174:6;23227:2;23215:9;23206:7;23202:23;23198:32;23195:2;;;23243:1;23240;23233:12;23195:2;23275:9;23269:16;23294:28;23316:5;23294:28;:::i;23357:538::-;23433:6;23441;23449;23502:2;23490:9;23481:7;23477:23;23473:32;23470:2;;;23518:1;23515;23508:12;23470:2;23557:9;23544:23;23576:28;23598:5;23576:28;:::i;:::-;23623:5;-1:-1:-1;23679:2:1;23664:18;;23651:32;-1:-1:-1;;;;;23695:30:1;;23692:2;;;23738:1;23735;23728:12;23692:2;23777:58;23827:7;23818:6;23807:9;23803:22;23777:58;:::i;:::-;23460:435;;23854:8;;-1:-1:-1;23751:84:1;;-1:-1:-1;;;;23460:435:1:o;23900:457::-;23985:6;23993;24046:2;24034:9;24025:7;24021:23;24017:32;24014:2;;;24062:1;24059;24052:12;24014:2;24094:9;24088:16;24113:28;24135:5;24113:28;:::i;24362:180::-;24421:6;24474:2;24462:9;24453:7;24449:23;24445:32;24442:2;;;24490:1;24487;24480:12;24442:2;-1:-1:-1;24513:23:1;;24432:110;-1:-1:-1;24432:110:1:o;24547:245::-;24605:6;24658:2;24646:9;24637:7;24633:23;24629:32;24626:2;;;24674:1;24671;24664:12;24626:2;24713:9;24700:23;24732:30;24756:5;24732:30;:::i;24797:249::-;24866:6;24919:2;24907:9;24898:7;24894:23;24890:32;24887:2;;;24935:1;24932;24925:12;24887:2;24967:9;24961:16;24986:30;25010:5;24986:30;:::i;25051:409::-;25121:6;25129;25182:2;25170:9;25161:7;25157:23;25153:32;25150:2;;;25198:1;25195;25188:12;25150:2;25238:9;25225:23;-1:-1:-1;;;;;25263:6:1;25260:30;25257:2;;;25303:1;25300;25293:12;25257:2;25342:58;25392:7;25383:6;25372:9;25368:22;25342:58;:::i;25880:336::-;25960:6;26013:2;26001:9;25992:7;25988:23;25984:32;25981:2;;;26029:1;26026;26019:12;25981:2;26062:9;26056:16;-1:-1:-1;;;;;26087:6:1;26084:30;26081:2;;;26127:1;26124;26117:12;26081:2;26150:60;26202:7;26193:6;26182:9;26178:22;26150:60;:::i;26221:695::-;26336:6;26344;26352;26405:2;26393:9;26384:7;26380:23;26376:32;26373:2;;;26421:1;26418;26411:12;26373:2;26454:9;26448:16;-1:-1:-1;;;;;26524:2:1;26516:6;26513:14;26510:2;;;26540:1;26537;26530:12;26510:2;26563:60;26615:7;26606:6;26595:9;26591:22;26563:60;:::i;:::-;26553:70;;26666:2;26655:9;26651:18;26645:25;26632:38;;26679:31;26704:5;26679:31;:::i;:::-;26780:2;26765:18;;26759:25;26729:5;;-1:-1:-1;26796:16:1;;;26793:2;;;26825:1;26822;26815:12;26793:2;;26848:62;26902:7;26891:8;26880:9;26876:24;26848:62;:::i;:::-;26838:72;;;26363:553;;;;;:::o;26921:750::-;27070:6;27078;27086;27139:2;27127:9;27118:7;27114:23;27110:32;27107:2;;;27155:1;27152;27145:12;27107:2;27195:9;27182:23;-1:-1:-1;;;;;27265:2:1;27257:6;27254:14;27251:2;;;27281:1;27278;27271:12;27251:2;27304:22;;;;27360:3;27342:16;;;27338:26;27335:2;;;27377:1;27374;27367:12;27335:2;27400;;-1:-1:-1;27455:2:1;27440:18;;27427:32;;27471:16;;;27468:2;;;27500:1;27497;27490:12;27468:2;;27539:72;27603:7;27592:8;27581:9;27577:24;27539:72;:::i;27861:898::-;27981:6;27989;27997;28005;28013;28021;28029;28037;28090:3;28078:9;28069:7;28065:23;28061:33;28058:2;;;28107:1;28104;28097:12;28058:2;28143:9;28130:23;28120:33;;28203:2;28192:9;28188:18;28175:32;28216:31;28241:5;28216:31;:::i;:::-;28266:5;-1:-1:-1;28323:2:1;28308:18;;28295:32;28336:33;28295:32;28336:33;:::i;:::-;28388:7;-1:-1:-1;28442:2:1;28427:18;;28414:32;;-1:-1:-1;28493:3:1;28478:19;;28465:33;;-1:-1:-1;28550:3:1;28535:19;;28522:33;28599:4;28586:18;;28574:31;;28564:2;;28619:1;28616;28609:12;28564:2;28048:711;;;;-1:-1:-1;28048:711:1;;;;;;28642:7;;-1:-1:-1;;;28696:3:1;28681:19;;28668:33;;28748:3;28733:19;28720:33;;28048:711::o;28764:461::-;28817:3;28855:5;28849:12;28882:6;28877:3;28870:19;28908:4;28937:2;28932:3;28928:12;28921:19;;28974:2;28967:5;28963:14;28995:1;29005:195;29019:6;29016:1;29013:13;29005:195;;;29084:13;;-1:-1:-1;;;;;29080:39:1;29068:52;;29140:12;;;;29175:15;;;;29116:1;29034:9;29005:195;;;-1:-1:-1;29216:3:1;;28825:400;-1:-1:-1;;;;;28825:400:1:o;29230:354::-;29318:19;;;29300:3;-1:-1:-1;;;;;29349:31:1;;29346:2;;;29393:1;29390;29383:12;29346:2;29429:6;29426:1;29422:14;29481:8;29474:5;29467:4;29462:3;29458:14;29445:45;29558:1;29513:18;;29533:4;29509:29;29547:13;;;-1:-1:-1;29509:29:1;;29308:276;-1:-1:-1;;29308:276:1:o;29589:435::-;29642:3;29680:5;29674:12;29707:6;29702:3;29695:19;29733:4;29762:2;29757:3;29753:12;29746:19;;29799:2;29792:5;29788:14;29820:1;29830:169;29844:6;29841:1;29838:13;29830:169;;;29905:13;;29893:26;;29939:12;;;;29974:15;;;;29866:1;29859:9;29830:169;;30029:266;30117:6;30112:3;30105:19;30169:6;30162:5;30155:4;30150:3;30146:14;30133:43;-1:-1:-1;30221:1:1;30196:16;;;30214:4;30192:27;;;30185:38;;;;30277:2;30256:15;;;-1:-1:-1;;30252:29:1;30243:39;;;30239:50;;30095:200::o;30300:257::-;30341:3;30379:5;30373:12;30406:6;30401:3;30394:19;30422:63;30478:6;30471:4;30466:3;30462:14;30455:4;30448:5;30444:16;30422:63;:::i;:::-;30539:2;30518:15;-1:-1:-1;;30514:29:1;30505:39;;;;30546:4;30501:50;;30349:208;-1:-1:-1;;30349:208:1:o;30562:601::-;30676:1;30672;30667:3;30663:11;30659:19;30651:5;30645:12;30641:38;30636:3;30629:51;30611:3;30726:4;30719:5;30715:16;30709:23;30764:4;30757;30752:3;30748:14;30741:28;30790:46;30830:4;30825:3;30821:14;30807:12;30790:46;:::i;:::-;30778:58;;30884:4;30877:5;30873:16;30867:23;30932:3;30926:4;30922:14;30915:4;30910:3;30906:14;30899:38;30960;30993:4;30977:14;30960:38;:::i;:::-;30946:52;;;31046:4;31039:5;31035:16;31029:23;31096:3;31088:6;31084:16;31077:4;31072:3;31068:14;31061:40;31117;31150:6;31134:14;31117:40;:::i;31589:274::-;31718:3;31756:6;31750:13;31772:53;31818:6;31813:3;31806:4;31798:6;31794:17;31772:53;:::i;:::-;31841:16;;;;;31726:137;-1:-1:-1;;31726:137:1:o;31868:815::-;31998:3;32027:1;32060:6;32054:13;32090:36;32116:9;32090:36;:::i;:::-;32145:1;32162:18;;;32189:104;;;;32307:1;32302:356;;;;32155:503;;32189:104;-1:-1:-1;;32222:24:1;;32210:37;;32267:16;;;;-1:-1:-1;32189:104:1;;32302:356;32333:6;32330:1;32323:17;32363:4;32408:2;32405:1;32395:16;32433:1;32447:165;32461:6;32458:1;32455:13;32447:165;;;32539:14;;32526:11;;;32519:35;32582:16;;;;32476:10;;32447:165;;;32451:3;;;32641:6;32636:3;32632:16;32625:23;;32155:503;-1:-1:-1;32674:3:1;;32006:677;-1:-1:-1;;;;;;32006:677:1:o;33293:907::-;-1:-1:-1;;;;;33720:15:1;;;33702:34;;33772:15;;33767:2;33752:18;;33745:43;33682:3;33819:2;33804:18;;33797:31;;;33645:4;;33851:74;;33905:19;;33897:6;33889;33851:74;:::i;:::-;33973:9;33965:6;33961:22;33956:2;33945:9;33941:18;33934:50;34007:61;34061:6;34053;34045;34007:61;:::i;:::-;33993:75;;34117:9;34109:6;34105:22;34099:3;34088:9;34084:19;34077:51;34145:49;34187:6;34179;34171;34145:49;:::i;:::-;34137:57;33654:546;-1:-1:-1;;;;;;;;;;;33654:546:1:o;34205:612::-;-1:-1:-1;;;;;34510:15:1;;;34492:34;;34562:15;;34557:2;34542:18;;34535:43;-1:-1:-1;;;;;;34614:33:1;;34609:2;34594:18;;34587:61;34472:3;34679:2;34664:18;;34657:31;;;34435:4;;34705:62;;34747:19;;34739:6;34731;34705:62;:::i;:::-;34697:70;;34804:6;34798:3;34787:9;34783:19;34776:35;34444:373;;;;;;;;;:::o;35202:587::-;-1:-1:-1;;;;;35509:15:1;;;35491:34;;35561:15;;35556:2;35541:18;;35534:43;35608:2;35593:18;;35586:34;;;35651:2;35636:18;;35629:34;;;35471:3;35694;35679:19;;35672:32;;;35434:4;;35721:62;;35763:19;;35755:6;35747;35721:62;:::i;:::-;35713:70;35443:346;-1:-1:-1;;;;;;;;35443:346:1:o;35794:579::-;36008:4;36054:1;36050;36045:3;36041:11;36037:19;36095:2;36087:6;36083:15;36072:9;36065:34;36135:3;36130:2;36119:9;36115:18;36108:31;36162:45;36202:3;36191:9;36187:19;36179:6;36162:45;:::i;:::-;36255:9;36247:6;36243:22;36238:2;36227:9;36223:18;36216:50;36283:32;36308:6;36300;36283:32;:::i;:::-;36275:40;;;36363:2;36355:6;36351:15;36346:2;36335:9;36331:18;36324:43;;36017:356;;;;;;;:::o;36378:642::-;-1:-1:-1;;;;;36651:32:1;;36633:51;;36720:3;36715:2;36700:18;;36693:31;;;-1:-1:-1;;36747:45:1;;36772:19;;36764:6;36747:45;:::i;:::-;36840:9;36832:6;36828:22;36823:2;36812:9;36808:18;36801:50;36874:32;36899:6;36891;36874:32;:::i;:::-;36860:46;;36954:9;36946:6;36942:22;36937:2;36926:9;36922:18;36915:50;36982:32;37007:6;36999;36982:32;:::i;:::-;36974:40;36623:397;-1:-1:-1;;;;;;;36623:397:1:o;37025:669::-;37360:2;37349:9;37342:21;37323:4;37386:56;37438:2;37427:9;37423:18;37415:6;37386:56;:::i;:::-;37490:9;37482:6;37478:22;37473:2;37462:9;37458:18;37451:50;37524:44;37561:6;37553;37524:44;:::i;:::-;37510:58;;37616:9;37608:6;37604:22;37599:2;37588:9;37584:18;37577:50;37644:44;37681:6;37673;37644:44;:::i;37699:632::-;37870:2;37922:21;;;37992:13;;37895:18;;;38014:22;;;37841:4;;37870:2;38093:15;;;;38067:2;38052:18;;;37841:4;38136:169;38150:6;38147:1;38144:13;38136:169;;;38211:13;;38199:26;;38280:15;;;;38245:12;;;;38172:1;38165:9;38136:169;;;-1:-1:-1;38322:3:1;;37850:481;-1:-1:-1;;;;;;37850:481:1:o;38336:836::-;38524:4;38553:2;38593;38582:9;38578:18;38623:2;38612:9;38605:21;38646:6;38681;38675:13;38712:6;38704;38697:22;38750:2;38739:9;38735:18;38728:25;;38812:2;38802:6;38799:1;38795:14;38784:9;38780:30;38776:39;38762:53;;38850:2;38842:6;38838:15;38871:1;38881:262;38895:6;38892:1;38889:13;38881:262;;;38988:2;38984:7;38972:9;38964:6;38960:22;38956:36;38951:3;38944:49;39016:47;39056:6;39047;39041:13;39016:47;:::i;:::-;39006:57;-1:-1:-1;39121:12:1;;;;39086:15;;;;38917:1;38910:9;38881:262;;;-1:-1:-1;39160:6:1;;38533:639;-1:-1:-1;;;;;;;38533:639:1:o;39177:261::-;39356:2;39345:9;39338:21;39319:4;39376:56;39428:2;39417:9;39413:18;39405:6;39376:56;:::i;39443:465::-;39700:2;39689:9;39682:21;39663:4;39726:56;39778:2;39767:9;39763:18;39755:6;39726:56;:::i;:::-;39830:9;39822:6;39818:22;39813:2;39802:9;39798:18;39791:50;39858:44;39895:6;39887;39858:44;:::i;40105:379::-;40310:6;40303:14;40296:22;40285:9;40278:41;40369:6;40362:14;40355:22;40350:2;40339:9;40335:18;40328:50;40414:2;40409;40398:9;40394:18;40387:30;40259:4;40434:44;40474:2;40463:9;40459:18;40451:6;40434:44;:::i;41267:332::-;41474:6;41463:9;41456:25;41517:2;41512;41501:9;41497:18;41490:30;41437:4;41537:56;41589:2;41578:9;41574:18;41566:6;41537:56;:::i;42368:468::-;42627:6;42616:9;42609:25;42670:3;42665:2;42654:9;42650:18;42643:31;42590:4;42691:53;42739:3;42728:9;42724:19;42716:6;42691:53;:::i;:::-;42775:2;42760:18;;42753:34;;;;-1:-1:-1;42818:2:1;42803:18;42796:34;42683:61;42599:237;-1:-1:-1;;42599:237:1:o;43704:217::-;43851:2;43840:9;43833:21;43814:4;43871:44;43911:2;43900:9;43896:18;43888:6;43871:44;:::i;44150:381::-;44347:2;44336:9;44329:21;44310:4;44373:44;44413:2;44402:9;44398:18;44390:6;44373:44;:::i;:::-;44465:9;44457:6;44453:22;44448:2;44437:9;44433:18;44426:50;44493:32;44518:6;44510;44493:32;:::i;44536:926::-;44645:4;44674:2;44703;44692:9;44685:21;44726:1;44759:6;44753:13;44789:36;44815:9;44789:36;:::i;:::-;44861:6;44856:2;44845:9;44841:18;44834:34;44887:2;44908:1;44940:2;44929:9;44925:18;44957:1;44952:121;;;;45087:1;45082:354;;;;44918:518;;44952:121;-1:-1:-1;;45000:24:1;;44980:18;;;44973:52;45060:2;45045:18;;;-1:-1:-1;44952:121:1;;45082:354;45113:6;45110:1;45103:17;45161:2;45158:1;45148:16;45186:1;45200:180;45214:6;45211:1;45208:13;45200:180;;;45307:14;;45283:17;;;45279:26;;45272:50;45350:16;;;;45229:10;;45200:180;;;45404:17;;45400:26;;;-1:-1:-1;;44918:518:1;-1:-1:-1;45453:3:1;;44654:808;-1:-1:-1;;;;;;;;44654:808:1:o;45888:404::-;46090:2;46072:21;;;46129:2;46109:18;;;46102:30;46168:34;46163:2;46148:18;;46141:62;-1:-1:-1;;;46234:2:1;46219:18;;46212:38;46282:3;46267:19;;46062:230::o;47004:336::-;47206:2;47188:21;;;47245:2;47225:18;;;47218:30;-1:-1:-1;;;47279:2:1;47264:18;;47257:42;47331:2;47316:18;;47178:162::o;48734:336::-;48936:2;48918:21;;;48975:2;48955:18;;;48948:30;-1:-1:-1;;;49009:2:1;48994:18;;48987:42;49061:2;49046:18;;48908:162::o;52369:327::-;52464:4;52522:11;52509:25;52616:3;52612:8;52601;52585:14;52581:29;52577:44;52557:18;52553:69;52543:2;;52636:1;52633;52626:12;52701:323;52792:4;52850:11;52837:25;52944:3;52940:8;52929;52913:14;52909:29;52905:44;52885:18;52881:69;52871:2;;52964:1;52961;52954:12;53029:248;53096:2;53090:9;53138:4;53126:17;;-1:-1:-1;;;;;53158:34:1;;53194:22;;;53155:62;53152:2;;;53220:18;;:::i;:::-;53256:2;53249:22;53070:207;:::o;53282:183::-;53342:4;-1:-1:-1;;;;;53367:6:1;53364:30;53361:2;;;53397:18;;:::i;:::-;-1:-1:-1;53442:1:1;53438:14;53454:4;53434:25;;53351:114::o;53470:186::-;53518:4;-1:-1:-1;;;;;53543:6:1;53540:30;53537:2;;;53573:18;;:::i;:::-;-1:-1:-1;53639:2:1;53618:15;-1:-1:-1;;53614:29:1;53645:4;53610:40;;53527:129::o;53661:128::-;53701:3;53732:1;53728:6;53725:1;53722:13;53719:2;;;53738:18;;:::i;:::-;-1:-1:-1;53774:9:1;;53709:80::o;53794:217::-;53834:1;53860;53850:2;;53904:10;53899:3;53895:20;53892:1;53885:31;53939:4;53936:1;53929:15;53967:4;53964:1;53957:15;53850:2;-1:-1:-1;53996:9:1;;53840:171::o;54016:125::-;54056:4;54084:1;54081;54078:8;54075:2;;;54089:18;;:::i;:::-;-1:-1:-1;54126:9:1;;54065:76::o;54146:997::-;54252:9;54311:4;54303:5;54287:14;54283:26;54279:37;54276:2;;;54329:1;54326;54319:12;54276:2;54357:17;;:::i;:::-;54410:5;54397:19;-1:-1:-1;;;;;54476:2:1;54468:6;54465:14;54462:2;;;54492:1;54489;54482:12;54462:2;54521:60;54566:14;54557:6;54550:5;54546:18;54521:60;:::i;:::-;54512:7;54505:77;54640:2;54633:5;54629:14;54616:28;54611:2;54602:7;54598:16;54591:54;54703:2;54696:5;54692:14;54679:28;54674:2;54665:7;54661:16;54654:54;54757:2;54750:5;54746:14;54733:28;54717:44;;54786:2;54776:8;54773:16;54770:2;;;54802:1;54799;54792:12;54770:2;54840:66;54891:14;54880:8;54873:5;54869:20;54840:66;:::i;:::-;54835:2;54826:7;54822:16;54815:92;54956:3;54949:5;54945:15;54932:29;54916:45;;54986:2;54976:8;54973:16;54970:2;;;55002:1;54999;54992:12;54970:2;;55041:66;55092:14;55081:8;55074:5;55070:20;55041:66;:::i;:::-;55035:3;55022:17;;55015:93;-1:-1:-1;55026:7:1;54266:877;-1:-1:-1;;54266:877:1:o;55148:188::-;55246:9;55283:47;55315:14;55308:5;55283:47;:::i;55341:258::-;55413:1;55423:113;55437:6;55434:1;55431:13;55423:113;;;55513:11;;;55507:18;55494:11;;;55487:39;55459:2;55452:10;55423:113;;;55554:6;55551:1;55548:13;55545:2;;;-1:-1:-1;;55589:1:1;55571:16;;55564:27;55394:205::o;55604:380::-;55683:1;55679:12;;;;55726;;;55747:2;;55801:4;55793:6;55789:17;55779:27;;55747:2;55854;55846:6;55843:14;55823:18;55820:38;55817:2;;;55900:10;55895:3;55891:20;55888:1;55881:31;55935:4;55932:1;55925:15;55963:4;55960:1;55953:15;55989:249;56099:2;56080:13;;-1:-1:-1;;56076:27:1;56064:40;;-1:-1:-1;;;;;56119:34:1;;56155:22;;;56116:62;56113:2;;;56181:18;;:::i;:::-;56217:2;56210:22;-1:-1:-1;;56036:202:1:o;56243:135::-;56282:3;-1:-1:-1;;56303:17:1;;56300:2;;;56323:18;;:::i;:::-;-1:-1:-1;56370:1:1;56359:13;;56290:88::o;56383:127::-;56444:10;56439:3;56435:20;56432:1;56425:31;56475:4;56472:1;56465:15;56499:4;56496:1;56489:15;56515:127;56576:10;56571:3;56567:20;56564:1;56557:31;56607:4;56604:1;56597:15;56631:4;56628:1;56621:15;56647:127;56708:10;56703:3;56699:20;56696:1;56689:31;56739:4;56736:1;56729:15;56763:4;56760:1;56753:15;56779:179;56814:3;56856:1;56838:16;56835:23;56832:2;;;56902:1;56899;56896;56881:23;-1:-1:-1;56939:1:1;56933:8;56928:3;56924:18;56832:2;56822:136;:::o;56963:671::-;57002:3;57044:4;57026:16;57023:26;57020:2;;;57010:624;:::o;57020:2::-;57086;57080:9;-1:-1:-1;;57151:16:1;57147:25;;57144:1;57080:9;57123:50;57202:4;57196:11;57226:16;-1:-1:-1;;;;;57332:2:1;57325:4;57317:6;57313:17;57310:25;57305:2;57297:6;57294:14;57291:45;57288:2;;;57339:5;;;;;57010:624;:::o;57288:2::-;57376:6;57370:4;57366:17;57355:28;;57412:3;57406:10;57439:2;57431:6;57428:14;57425:2;;;57445:5;;;;;;57010:624;:::o;57425:2::-;57529;57510:16;57504:4;57500:27;57496:36;57489:4;57480:6;57475:3;57471:16;57467:27;57464:69;57461:2;;;57536:5;;;;;;57010:624;:::o;57461:2::-;57552:57;57603:4;57594:6;57586;57582:19;57578:30;57572:4;57552:57;:::i;:::-;-1:-1:-1;57625:3:1;;57010:624;-1:-1:-1;;;;;57010:624:1:o;57639:131::-;-1:-1:-1;;;;;57714:31:1;;57704:42;;57694:2;;57760:1;57757;57750:12;57775:118;57861:5;57854:13;57847:21;57840:5;57837:32;57827:2;;57883:1;57880;57873:12;57898:131;-1:-1:-1;;;;;;57972:32:1;;57962:43;;57952:2;;58019:1;58016;58009:12

Swarm Source

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