Token
Overview ERC-1155
Total Supply:
0 N/A
Holders:
23 addresses
Transfers:
-
Profile Summary
Contract:
[ Download CSV Export ]
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Similar Match Source Code
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0x21c032A2f7fACd745b0D2c2F30f03B3077bcF549
Contract Name:
SynergyOfSerraAssets
Compiler Version
v0.8.14+commit.80d49f37
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-10-19 */ // File: contracts/CardSale/Interfaces/IERC1155.sol // SPDX-License-Identifier: MIT pragma solidity >=0.8.0 <0.9.0; /** @title ERC-1155 Multi Token Standard @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1155.md Note: The ERC-165 identifier for this interface is 0xd9b67a26. */ interface IERC1155 { /* is ERC165 */ /** @dev Either `TransferSingle` or `TransferBatch` MUST emit when tokens are transferred, including zero value transfers as well as minting or burning (see "Safe Transfer Rules" section of the standard). The `_operator` argument MUST be msg.sender. The `_from` argument MUST be the address of the holder whose balance is decreased. The `_to` argument MUST be the address of the recipient whose balance is increased. The `_id` argument MUST be the token type being transferred. The `_value` argument MUST be the number of tokens the holder balance is decreased by and match what the recipient balance is increased by. When minting/creating tokens, the `_from` argument MUST be set to `0x0` (i.e. zero address). When burning/destroying tokens, the `_to` argument MUST be set to `0x0` (i.e. zero address). */ event TransferSingle( address indexed _operator, address indexed _from, address indexed _to, uint256 _id, uint256 _value ); /** @dev Either `TransferSingle` or `TransferBatch` MUST emit when tokens are transferred, including zero value transfers as well as minting or burning (see "Safe Transfer Rules" section of the standard). The `_operator` argument MUST be msg.sender. The `_from` argument MUST be the address of the holder whose balance is decreased. The `_to` argument MUST be the address of the recipient whose balance is increased. The `_ids` argument MUST be the list of tokens being transferred. The `_values` argument MUST be the list of number of tokens (matching the list and order of tokens specified in _ids) the holder balance is decreased by and match what the recipient balance is increased by. When minting/creating tokens, the `_from` argument MUST be set to `0x0` (i.e. zero address). When burning/destroying tokens, the `_to` argument MUST be set to `0x0` (i.e. zero address). */ event TransferBatch( address indexed _operator, address indexed _from, address indexed _to, uint256[] _ids, uint256[] _values ); /** @dev MUST emit when approval for a second party/operator address to manage all tokens for an owner address is enabled or disabled (absense of an event assumes disabled). */ event ApprovalForAll( address indexed _owner, address indexed _operator, bool _approved ); /** @dev MUST emit when the URI is updated for a token ID. URIs are defined in RFC 3986. The URI MUST point a JSON file that conforms to the "ERC-1155 Metadata URI JSON Schema". */ event URI(string _value, uint256 indexed _id); /** @notice Transfers `_value` amount of an `_id` from the `_from` address to the `_to` address specified (with safety call). @dev Caller must be approved to manage the tokens being transferred out of the `_from` account (see "Approval" section of the standard). MUST revert if `_to` is the zero address. MUST revert if balance of holder for token `_id` is lower than the `_value` sent. MUST revert on any other error. MUST emit the `TransferSingle` event to reflect the balance change (see "Safe Transfer Rules" section of the standard). After the above conditions are met, this function MUST check if `_to` is a smart contract (e.g. code size > 0). If so, it MUST call `onERC1155Received` on `_to` and act appropriately (see "Safe Transfer Rules" section of the standard). @param _from Source address @param _to Target address @param _id ID of the token type @param _value Transfer amount @param _data Additional data with no specified format, MUST be sent unaltered in call to `onERC1155Received` on `_to` */ function safeTransferFrom( address _from, address _to, uint256 _id, uint256 _value, bytes calldata _data ) external; /** @notice Transfers `_values` amount(s) of `_ids` from the `_from` address to the `_to` address specified (with safety call). @dev Caller must be approved to manage the tokens being transferred out of the `_from` account (see "Approval" section of the standard). MUST revert if `_to` is the zero address. MUST revert if length of `_ids` is not the same as length of `_values`. MUST revert if any of the balance(s) of the holder(s) for token(s) in `_ids` is lower than the respective amount(s) in `_values` sent to the recipient. MUST revert on any other error. MUST emit `TransferSingle` or `TransferBatch` event(s) such that all the balance changes are reflected (see "Safe Transfer Rules" section of the standard). Balance changes and events MUST follow the ordering of the arrays (_ids[0]/_values[0] before _ids[1]/_values[1], etc). After the above conditions for the transfer(s) in the batch are met, this function MUST check if `_to` is a smart contract (e.g. code size > 0). If so, it MUST call the relevant `ERC1155TokenReceiver` hook(s) on `_to` and act appropriately (see "Safe Transfer Rules" section of the standard). @param _from Source address @param _to Target address @param _ids IDs of each token type (order and length must match _values array) @param _values Transfer amounts per token type (order and length must match _ids array) @param _data Additional data with no specified format, MUST be sent unaltered in call to the `ERC1155TokenReceiver` hook(s) on `_to` */ function safeBatchTransferFrom( address _from, address _to, uint256[] calldata _ids, uint256[] calldata _values, bytes calldata _data ) external; /** @notice Get the balance of an account's Tokens. @param _owner The address of the token holder @param _id ID of the Token @return The _owner's balance of the Token type requested */ function balanceOf(address _owner, uint256 _id) external view returns (uint256); /** @notice Get the balance of multiple account/token pairs @param _owners The addresses of the token holders @param _ids ID of the Tokens @return The _owner's balance of the Token types requested (i.e. balance for each (owner, id) pair) */ function balanceOfBatch(address[] calldata _owners, uint256[] calldata _ids) external view returns (uint256[] memory); /** @notice Enable or disable approval for a third party ("operator") to manage all of the caller's tokens. @dev MUST emit the ApprovalForAll event on success. @param _operator Address to add to the set of authorized operators @param _approved True if the operator is approved, false to revoke approval */ function setApprovalForAll(address _operator, bool _approved) external; /** @notice Queries the approval status of an operator for a given owner. @param _owner The owner of the Tokens @param _operator Address of authorized operator @return True if the operator is approved, false if not */ function isApprovedForAll(address _owner, address _operator) external view returns (bool); } /** @title ERC-1155 Mixed Fungible Token Standard */ interface IERC1155MixedFungible { /** @notice Returns true for non-fungible token id. @dev Returns true for non-fungible token id. @param _id Id of the token @return If a token is non-fungible */ function isNonFungible(uint256 _id) external pure returns (bool); /** @notice Returns true for fungible token id. @dev Returns true for fungible token id. @param _id Id of the token @return If a token is fungible */ function isFungible(uint256 _id) external pure returns (bool); /** @notice Returns the mint# of a token type. @dev Returns the mint# of a token type. @param _id Id of the token @return The mint# of a token type. */ function getNonFungibleIndex(uint256 _id) external pure returns (uint256); /** @notice Returns the base type of a token id. @dev Returns the base type of a token id. @param _id Id of the token @return The base type of a token id. */ function getNonFungibleBaseType(uint256 _id) external pure returns (uint256); /** @notice Returns true if the base type of the token id is a non-fungible base type. @dev Returns true if the base type of the token id is a non-fungible base type. @param _id Id of the token @return The non-fungible base type info as bool */ function isNonFungibleBaseType(uint256 _id) external pure returns (bool); /** @notice Returns true if the base type of the token id is a fungible base type. @dev Returns true if the base type of the token id is a fungible base type. @param _id Id of the token @return The fungible base type info as bool */ function isNonFungibleItem(uint256 _id) external pure returns (bool); /** @notice Returns the owner of a token. @dev Returns the owner of a token. @param _id Id of the token @return The owner address */ function ownerOf(uint256 _id) external view returns (address); } /** @author The Calystral Team @title The ERC1155CalystralMixedFungibleMintable' Interface */ interface IERC1155CalystralMixedFungibleMintable { /** @dev MUST emit when a release timestamp is set or updated. The `typeId` argument MUST be the id of a type. The `timestamp` argument MUST be the timestamp of the release in seconds. */ event OnReleaseTimestamp(uint256 indexed typeId, uint256 timestamp); /** @notice Updates the metadata base URI. @dev Updates the `_metadataBaseURI`. @param uri The metadata base URI */ function updateMetadataBaseURI(string calldata uri) external; /** @notice Creates a non-fungible type. @dev Creates a non-fungible type. This function only creates the type and is not used for minting. The type also has a maxSupply since there can be multiple tokens of the same type, e.g. 100x 'Pikachu'. Reverts if the `maxSupply` is 0 or exceeds the `MAX_TYPE_SUPPLY`. @param maxSupply The maximum amount that can be created of this type, unlimited SHOULD be 2**128 (uint128) as the max. MUST NOT be set to 0 @param releaseTimestamp The timestamp for the release time, SHOULD be set to 1337 for releasing it right away. MUST NOT be set to 0 @return The `typeId` */ function createNonFungibleType(uint256 maxSupply, uint256 releaseTimestamp) external returns (uint256); /** @notice Creates a fungible type. @dev Creates a fungible type. This function only creates the type and is not used for minting. Reverts if the `maxSupply` is 0 or exceeds the `MAX_TYPE_SUPPLY`. @param maxSupply The maximum amount that can be created of this type, unlimited SHOULD be 2**128 (uint128) as the max. MUST NOT be set to 0 @param releaseTimestamp The timestamp for the release time, SHOULD be set to 1337 for releasing it right away. MUST NOT be set to 0 @return The `typeId` */ function createFungibleType(uint256 maxSupply, uint256 releaseTimestamp) external returns (uint256); /** @notice Mints a non-fungible type. @dev Mints a non-fungible type. Reverts if type id is not existing. Reverts if out of stock. Emits the `TransferSingle` event. @param typeId The type which should be minted @param toArr An array of receivers */ function mintNonFungible(uint256 typeId, address[] calldata toArr) external; /** @notice Mints a fungible type. @dev Mints a fungible type. Reverts if array lengths are unequal. Reverts if type id is not existing. Reverts if out of stock. Emits the `TransferSingle` event. @param typeId The type which should be minted @param toArr An array of receivers */ function mintFungible( uint256 typeId, address[] calldata toArr, uint256[] calldata quantitiesArr ) external; /** @notice Transfers `_value` amount of an `_id` from the `_from` address to the `_to` address specified (with safety call). @dev Caller must be approved to manage the tokens being transferred out of the `_from` account (see "Approval" section of the standard). Uses Meta Transactions - transactions are signed by the owner or operator of the owner but are executed by anybody. Reverts if the signature is invalid. Reverts if array lengths are unequal. Reverts if the transaction expired. Reverts if the transaction was executed already. Reverts if the signer is not the asset owner or approved operator of the owner. Reverts if `_to` is the zero address. Reverts if balance of holder for token `_id` is lower than the `_value` sent. MUST emit the `TransferSingle` event to reflect the balance change (see "Safe Transfer Rules" section of the standard). After the above conditions are met, this function MUST check if `_to` is a smart contract (e.g. code size > 0). If so, it MUST call `onERC1155Received` on `_to` and act appropriately (see "Safe Transfer Rules" section of the standard). @param signature The signature of the signing account as proof for execution allowance @param signer The signing account. This SHOULD be the owner of the asset or an approved operator of the owner. @param _to Target address @param _id ID of the token type @param _value Transfer amount @param _data Additional data with no specified format, MUST be sent unaltered in call to `onERC1155Received` on `_to` @param nonce Each sent meta transaction includes a nonce to prevent that a signed transaction is executed multiple times @param maxTimestamp The maximum point in time before the meta transaction expired, thus becoming invalid */ function metaSafeTransferFrom( bytes memory signature, address signer, address _to, uint256 _id, uint256 _value, bytes calldata _data, uint256 nonce, uint256 maxTimestamp ) external; /** @notice Transfers `_values` amount(s) of `_ids` from the `_from` address to the `_to` address specified (with safety call). @dev Caller must be approved to manage the tokens being transferred out of the `_from` account (see "Approval" section of the standard). Uses Meta Transactions - transactions are signed by the owner or operator of the owner but are executed by anybody. Reverts if the signature is invalid. Reverts if array lengths are unequal. Reverts if the transaction expired. Reverts if the transaction was executed already. Reverts if the signer is not the asset owner or approved operator of the owner. Reverts if `_to` is the zero address. Reverts if length of `_ids` is not the same as length of `_values`. Reverts if any of the balance(s) of the holder(s) for token(s) in `_ids` is lower than the respective amount(s) in `_values` sent to the recipient. MUST emit `TransferSingle` or `TransferBatch` event(s) such that all the balance changes are reflected (see "Safe Transfer Rules" section of the standard). Balance changes and events MUST follow the ordering of the arrays (_ids[0]/_values[0] before _ids[1]/_values[1], etc). After the above conditions for the transfer(s) in the batch are met, this function MUST check if `_to` is a smart contract (e.g. code size > 0). If so, it MUST call the relevant `ERC1155TokenReceiver` hook(s) on `_to` and act appropriately (see "Safe Transfer Rules" section of the standard). @param signature The signature of the signing account as proof for execution allowance @param signer The signing account. This SHOULD be the owner of the asset or an approved operator of the owner. @param _to Target address @param _ids IDs of each token type (order and length must match _values array) @param _values Transfer amounts per token type (order and length must match _ids array) @param _data Additional data with no specified format, MUST be sent unaltered in call to the `ERC1155TokenReceiver` hook(s) on `_to` @param nonce Each sent meta transaction includes a nonce to prevent that a signed transaction is executed multiple times @param maxTimestamp The maximum point in time before the meta transaction expired, thus becoming invalid */ function metaSafeBatchTransferFrom( bytes memory signature, address signer, address _to, uint256[] calldata _ids, uint256[] calldata _values, bytes calldata _data, uint256 nonce, uint256 maxTimestamp ) external; /** @notice Burns fungible and/or non-fungible tokens. @dev Sends FTs and/or NFTs to 0x0 address. Uses Meta Transactions - transactions are signed by the owner but are executed by anybody. Reverts if the signature is invalid. Reverts if array lengths are unequal. Reverts if the transaction expired. Reverts if the transaction was executed already. Reverts if the signer is not the asset owner. Emits the `TransferBatch` event where the `to` argument is the 0x0 address. @param signature The signature of the signing account as proof for execution allowance @param signer The signing account. This SHOULD be the owner of the asset @param ids An array of token Ids which should be burned @param values An array of amounts which should be burned. The order matches the order in the ids array @param nonce Each sent meta transaction includes a nonce to prevent that a signed transaction is executed multiple times @param maxTimestamp The maximum point in time before the meta transaction expired, thus becoming invalid */ function metaBatchBurn( bytes memory signature, address signer, uint256[] calldata ids, uint256[] calldata values, uint256 nonce, uint256 maxTimestamp ) external; /** @notice Enable or disable approval for a third party ("operator") to manage all of the caller's tokens. @dev MUST emit the ApprovalForAll event on success. Uses Meta Transactions - transactions are signed by the owner but are executed by anybody. Reverts if the signature is invalid. Reverts if array lengths are unequal. Reverts if the transaction expired. Reverts if the transaction was executed already. Reverts if the signer is not the asset owner. @param signature The signature of the signing account as proof for execution allowance @param signer The signing account. This SHOULD be the owner of the asset @param _operator Address to add to the set of authorized operators @param _approved True if the operator is approved, false to revoke approval @param nonce Each sent meta transaction includes a nonce to prevent that a signed transaction is executed multiple times @param maxTimestamp The maximum point in time before the meta transaction expired, thus becoming invalid */ function metaSetApprovalForAll( bytes memory signature, address signer, address _operator, bool _approved, uint256 nonce, uint256 maxTimestamp ) external; /** @notice Sets a release timestamp. @dev Sets a release timestamp. Reverts if `timestamp` == 0. Reverts if the `typeId` is released already. @param typeId The type which should be set or updated @param timestamp The timestamp for the release time, SHOULD be set to 1337 for releasing it right away. MUST NOT be set to 0 */ function setReleaseTimestamp(uint256 typeId, uint256 timestamp) external; /** @notice Get the release timestamp of a type. @dev Get the release timestamp of a type. @return The release timestamp of a type. */ function getReleaseTimestamp(uint256 typeId) external view returns (uint256); /** @notice Get all existing type Ids. @dev Get all existing type Ids. @return An array of all existing type Ids. */ function getTypeIds() external view returns (uint256[] memory); /** @notice Get a specific type Id. @dev Get a specific type Id. Reverts if `typeNonce` is 0 or if it does not exist. @param typeNonce The type nonce for which the id is requested @return A specific type Id. */ function getTypeId(uint256 typeNonce) external view returns (uint256); /** @notice Get all non-fungible assets for a specific user. @dev Get all non-fungible assets for a specific user. @param owner The address of the requested user @return An array of Ids that are owned by the user */ function getNonFungibleAssets(address owner) external view returns (uint256[] memory); /** @notice Get all fungible assets for a specific user. @dev Get all fungible assets for a specific user. @param owner The address of the requested user @return An array of Ids that are owned by the user An array for the amount owned of each Id */ function getFungibleAssets(address owner) external view returns (uint256[] memory, uint256[] memory); /** @notice Get the type nonce. @dev Get the type nonce. @return The type nonce. */ function getTypeNonce() external view returns (uint256); /** @notice The amount of tokens that have been minted of a specific type. @dev The amount of tokens that have been minted of a specific type. Reverts if the given typeId does not exist. @param typeId The requested type @return The minted amount */ function getMintedSupply(uint256 typeId) external view returns (uint256); /** @notice The amount of tokens that can be minted of a specific type. @dev The amount of tokens that can be minted of a specific type. Reverts if the given typeId does not exist. @param typeId The requested type @return The maximum mintable amount */ function getMaxSupply(uint256 typeId) external view returns (uint256); /** @notice Get the burn nonce of a specific user. @dev Get the burn nonce of a specific user / signer. @param signer The requested signer @return The burn nonce of a specific user */ function getMetaNonce(address signer) external view returns (uint256); } /** * @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); } /** @author The Calystral Team @title The RegistrableContractState's Interface */ interface IRegistrableContractState is IERC165 { /*============================== = EVENTS = ==============================*/ /// @dev MUST emit when the contract is set to an active state. event Activated(); /// @dev MUST emit when the contract is set to an inactive state. event Inactivated(); /*============================== = FUNCTIONS = ==============================*/ /** @notice Sets the contract state to active. @dev Sets the contract state to active. */ function setActive() external; /** @notice Sets the contract state to inactive. @dev Sets the contract state to inactive. */ function setInactive() external; /** @dev Sets the registry contract object. Reverts if the registryAddress doesn't implement the IRegistry interface. @param registryAddress The registry address */ function setRegistry(address registryAddress) external; /** @notice Returns the current contract state. @dev Returns the current contract state. @return The current contract state (true == active; false == inactive) */ function getIsActive() external view returns (bool); /** @notice Returns the Registry address. @dev Returns the Registry address. @return The Registry address */ function getRegistryAddress() external view returns (address); /** @notice Returns the current address associated with `key` identifier. @dev Look-up in the Registry. Returns the current address associated with `key` identifier. @return The key identifier */ function getContractAddress(uint256 key) external view returns (address); } /** @author The Calystral Team @title The Assets' Interface */ interface IAssets is IERC1155, IERC1155MixedFungible, IERC1155CalystralMixedFungibleMintable, IRegistrableContractState { /** @dev MUST emit when any property type is created. The `propertyId` argument MUST be the id of a property. The `name` argument MUST be the name of this specific id. The `propertyType` argument MUST be the property type. */ event OnCreateProperty( uint256 propertyId, string name, PropertyType indexed propertyType ); /** @dev MUST emit when an int type property is updated. The `tokenId` argument MUST be the id of the token of which the property is updated. The `propertyId` argument MUST be the property id which is updated. The `value` argument MUST be the value to which the token's property is updated. */ event OnUpdateIntProperty( uint256 indexed tokenId, uint256 indexed propertyId, int256 value ); /** @dev MUST emit when an string type property is updated. The `tokenId` argument MUST be the id of the token of which the property is updated. The `propertyId` argument MUST be the property id which is updated. The `value` argument MUST be the value to which the token's property is updated. */ event OnUpdateStringProperty( uint256 indexed tokenId, uint256 indexed propertyId, string value ); /** @dev MUST emit when an address type property is updated. The `tokenId` argument MUST be the id of the token of which the property is updated. The `propertyId` argument MUST be the property id which is updated. The `value` argument MUST be the value to which the token's property is updated. */ event OnUpdateAddressProperty( uint256 indexed tokenId, uint256 indexed propertyId, address value ); /** @dev MUST emit when an byte type property is updated. The `tokenId` argument MUST be the id of the token of which the property is updated. The `propertyId` argument MUST be the property id which is updated. The `value` argument MUST be the value to which the token's property is updated. */ event OnUpdateByteProperty( uint256 indexed tokenId, uint256 indexed propertyId, bytes32 value ); /** @dev MUST emit when an int array type property is updated. The `tokenId` argument MUST be the id of the token of which the property is updated. The `propertyId` argument MUST be the property id which is updated. The `value` argument MUST be the value to which the token's property is updated. */ event OnUpdateIntArrayProperty( uint256 indexed tokenId, uint256 indexed propertyId, int256[] value ); /** @dev MUST emit when an address array type property is updated. The `tokenId` argument MUST be the id of the token of which the property is updated. The `propertyId` argument MUST be the property id which is updated. The `value` argument MUST be the value to which the token's property is updated. */ event OnUpdateAddressArrayProperty( uint256 indexed tokenId, uint256 indexed propertyId, address[] value ); /// @dev Enum representing all existing property types that can be used. enum PropertyType { INT, STRING, ADDRESS, BYTE, INTARRAY, ADDRESSARRAY } /** @notice Creates a property of type int. @dev Creates a property of type int. @param name The name for this property @return The property id */ function createIntProperty(string calldata name) external returns (uint256); /** @notice Creates a property of type string. @dev Creates a property of type string. @param name The name for this property @return The property id */ function createStringProperty(string calldata name) external returns (uint256); /** @notice Creates a property of type address. @dev Creates a property of type address. @param name The name for this property @return The property id */ function createAddressProperty(string calldata name) external returns (uint256); /** @notice Creates a property of type byte. @dev Creates a property of type byte. @param name The name for this property @return The property id */ function createByteProperty(string calldata name) external returns (uint256); /** @notice Creates a property of type int array. @dev Creates a property of type int array. @param name The name for this property @return The property id */ function createIntArrayProperty(string calldata name) external returns (uint256); /** @notice Creates a property of type address array. @dev Creates a property of type address array. @param name The name for this property @return The property id */ function createAddressArrayProperty(string calldata name) external returns (uint256); /** @notice Updates an existing int property for the passed value. @dev Updates an existing int property for the passed `value`. @param tokenId The id of the token of which the property is updated @param propertyId The property id which is updated @param value The value to which the token's property is updated */ function updateIntProperty( uint256 tokenId, uint256 propertyId, int256 value ) external; /** @notice Updates an existing string property for the passed value. @dev Updates an existing string property for the passed `value`. @param tokenId The id of the token of which the property is updated @param propertyId The property id which is updated @param value The value to which the token's property is updated */ function updateStringProperty( uint256 tokenId, uint256 propertyId, string calldata value ) external; /** @notice Updates an existing address property for the passed value. @dev Updates an existing address property for the passed `value`. @param tokenId The id of the token of which the property is updated @param propertyId The property id which is updated @param value The value to which the token's property is updated */ function updateAddressProperty( uint256 tokenId, uint256 propertyId, address value ) external; /** @notice Updates an existing byte property for the passed value. @dev Updates an existing byte property for the passed `value`. @param tokenId The id of the token of which the property is updated @param propertyId The property id which is updated @param value The value to which the token's property is updated */ function updateByteProperty( uint256 tokenId, uint256 propertyId, bytes32 value ) external; /** @notice Updates an existing int array property for the passed value. @dev Updates an existing int array property for the passed `value`. @param tokenId The id of the token of which the property is updated @param propertyId The property id which is updated @param value The value to which the token's property is updated */ function updateIntArrayProperty( uint256 tokenId, uint256 propertyId, int256[] calldata value ) external; /** @notice Updates an existing address array property for the passed value. @dev Updates an existing address array property for the passed `value`. @param tokenId The id of the token of which the property is updated @param propertyId The property id which is updated @param value The value to which the token's property is updated */ function updateAddressArrayProperty( uint256 tokenId, uint256 propertyId, address[] calldata value ) external; /** @notice Get the property type of a property. @dev Get the property type of a property. @return The property type */ function getPropertyType(uint256 propertyId) external view returns (PropertyType); /** @notice Get the count of available properties. @dev Get the count of available properties. @return The property count */ function getPropertyCounter() external view returns (uint256); } /** Note: The ERC-165 identifier for this interface is 0x0e89341c. */ interface IERC1155Metadata_URI { /** @notice A distinct Uniform Resource Identifier (URI) for a given token. @dev URIs are defined in RFC 3986. The URI MUST point to a JSON file that conforms to the "ERC-1155 Metadata URI JSON Schema". @return URI string */ function uri(uint256 _id) external view returns (string memory); } /** * @dev Implementation of the {IERC165} interface. * * Contracts may inherit from this and call {_registerInterface} to declare * their support of an interface. */ abstract contract ERC165 is IERC165 { /* * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7 */ bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7; /** * @dev Mapping of interface ids to whether or not it's supported. */ mapping(bytes4 => bool) private _supportedInterfaces; constructor() { // Derived contracts need only register support for their own interfaces, // we register support for ERC165 itself here _registerInterface(_INTERFACE_ID_ERC165); } /** * @dev See {IERC165-supportsInterface}. * * Time complexity O(1), guaranteed to always use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) public view override returns (bool) { return _supportedInterfaces[interfaceId]; } /** * @dev Registers the contract as an implementer of the interface defined by * `interfaceId`. Support of the actual ERC165 interface is automatic and * registering its interface id is not required. * * See {IERC165-supportsInterface}. * * Requirements: * * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`). */ function _registerInterface(bytes4 interfaceId) internal virtual { require(interfaceId != 0xffffffff, "ERC165: invalid interface id"); _supportedInterfaces[interfaceId] = true; } } /** @author The Calystral Team @title The Registry's Interface */ interface IRegistry is IRegistrableContractState { /*============================== = EVENTS = ==============================*/ /** @dev MUST emit when an entry in the Registry is set or updated. The `key` argument MUST be the key of the entry which is set or updated. The `value` argument MUST be the address of the entry which is set or updated. */ event EntrySet(uint256 indexed key, address value); /** @dev MUST emit when an entry in the Registry is removed. The `key` argument MUST be the key of the entry which is removed. The `value` argument MUST be the address of the entry which is removed. */ event EntryRemoved(uint256 indexed key, address value); /*============================== = FUNCTIONS = ==============================*/ /** @notice Sets the MultiSigAdmin contract as Registry entry 1. @dev Sets the MultiSigAdmin contract as Registry entry 1. @param msaAddress The contract address of the MultiSigAdmin */ function initializeMultiSigAdmin(address msaAddress) external; /** @notice Checks if the registry Map contains the key. @dev Returns true if the key is in the registry map. O(1). @param key The key to search for @return The boolean result */ function contains(uint256 key) external view returns (bool); /** @notice Returns the registry map length. @dev Returns the number of key-value pairs in the registry map. O(1). @return The registry map length */ function length() external view returns (uint256); /** @notice Returns the key-value pair stored at position `index` in the registry map. @dev Returns the key-value pair stored at position `index` in the registry map. O(1). Note that there are no guarantees on the ordering of entries inside the array, and it may change when more entries are added or removed. Requirements: - `index` must be strictly less than {length}. @param index The position in the registry map @return The key-value pair as a tuple */ function at(uint256 index) external view returns (uint256, address); /** @notice Tries to return the value associated with `key`. @dev Tries to return the value associated with `key`. O(1). Does not revert if `key` is not in the registry map. @param key The key to search for @return The key-value pair as a tuple */ function tryGet(uint256 key) external view returns (bool, address); /** @notice Returns the value associated with `key`. @dev Returns the value associated with `key`. O(1). Requirements: - `key` must be in the registry map. @param key The key to search for @return The contract address */ function get(uint256 key) external view returns (address); /** @notice Returns all indices, keys, addresses. @dev Returns all indices, keys, addresses as three seperate arrays. @return Indices, keys, addresses */ function getAll() external view returns ( uint256[] memory, uint256[] memory, address[] memory ); /** @notice Adds a key-value pair to a map, or updates the value for an existing key. @dev Adds a key-value pair to the registry map, or updates the value for an existing key. O(1). Returns true if the key was added to the registry map, that is if it was not already present. @param key The key as an identifier @param value The address of the contract @return Success as a bool */ function set(uint256 key, address value) external returns (bool); /** @notice Removes a value from the registry map. @dev Removes a value from the registry map. O(1). Returns true if the key was removed from the registry map, that is if it was present. @param key The key as an identifier @return Success as a bool */ function remove(uint256 key) external returns (bool); /** @notice Sets a contract state to active. @dev Sets a contract state to active. @param key The key as an identifier */ function setContractActiveByKey(uint256 key) external; /** @notice Sets a contract state to active. @dev Sets a contract state to active. @param contractAddress The contract's address */ function setContractActiveByAddress(address contractAddress) external; /** @notice Sets all contracts within the registry to state active. @dev Sets all contracts within the registry to state active. Does NOT revert if any contract doesn't implement the RegistrableContractState interface. Does NOT revert if it is an externally owned user account. */ function setAllContractsActive() external; /** @notice Sets a contract state to inactive. @dev Sets a contract state to inactive. @param key The key as an identifier */ function setContractInactiveByKey(uint256 key) external; /** @notice Sets a contract state to inactive. @dev Sets a contract state to inactive. @param contractAddress The contract's address */ function setContractInactiveByAddress(address contractAddress) external; /** @notice Sets all contracts within the registry to state inactive. @dev Sets all contracts within the registry to state inactive. Does NOT revert if any contract doesn't implement the RegistrableContractState interface. Does NOT revert if it is an externally owned user account. */ function setAllContractsInactive() external; } /** @author The Calystral Team @title A helper parent contract: Pausable & Registry */ contract RegistrableContractState is IRegistrableContractState, ERC165 { /*============================== = CONSTANTS = ==============================*/ /*============================== = STORAGE = ==============================*/ /// @dev Current contract state bool private _isActive; /// @dev Current registry pointer address private _registryAddress; /*============================== = MODIFIERS = ==============================*/ modifier isActive() { _isActiveCheck(); _; } modifier isAuthorizedAdmin() { _isAuthorizedAdmin(); _; } modifier isAuthorizedAdminOrRegistry() { _isAuthorizedAdminOrRegistry(); _; } /*============================== = CONSTRUCTOR = ==============================*/ /** @notice Creates and initializes the contract. @dev Creates and initializes the contract. Registers all implemented interfaces. Inheriting contracts are INACTIVE by default. */ constructor(address registryAddress) { _registryAddress = registryAddress; _registerInterface(type(IRegistrableContractState).interfaceId); } /*============================== = PUBLIC & EXTERNAL = ==============================*/ /*============================== = RESTRICTED = ==============================*/ function setActive() external override isAuthorizedAdminOrRegistry { _isActive = true; emit Activated(); } function setInactive() external override isAuthorizedAdminOrRegistry { _isActive = false; emit Inactivated(); } function setRegistry(address registryAddress) external override isAuthorizedAdmin { _registryAddress = registryAddress; try _registryContract().supportsInterface(type(IRegistry).interfaceId) returns (bool supportsInterface) { require( supportsInterface, "The provided contract does not implement the Registry interface" ); } catch { revert( "The provided contract does not implement the Registry interface" ); } } /*============================== = VIEW & PURE = ==============================*/ function getIsActive() public view override returns (bool) { return _isActive; } function getRegistryAddress() public view override returns (address) { return _registryAddress; } function getContractAddress(uint256 key) public view override returns (address) { return _registryContract().get(key); } /*============================== = INTERNAL & PRIVATE = ==============================*/ /** @dev Returns the target Registry object. @return The target Registry object */ function _registryContract() internal view returns (IRegistry) { return IRegistry(_registryAddress); } /** @dev Checks if the contract is in an active state. Reverts if the contract is INACTIVE. */ function _isActiveCheck() internal view { require(_isActive == true, "The contract is not active"); } /** @dev Checks if the msg.sender is the Admin. Reverts if msg.sender is not the Admin. */ function _isAuthorizedAdmin() internal view { require(msg.sender == getContractAddress(1), "Unauthorized call"); } /** @dev Checks if the msg.sender is the Admin or the Registry. Reverts if msg.sender is not the Admin or the Registry. */ function _isAuthorizedAdminOrRegistry() internal view { require( msg.sender == _registryAddress || msg.sender == getContractAddress(1), "Unauthorized call" ); } } /** Note: Simple contract to use as base for const vals */ contract CommonConstants { bytes4 internal constant ERC1155_ACCEPTED = 0xf23a6e61; // bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)")) bytes4 internal constant ERC1155_BATCH_ACCEPTED = 0xbc197c81; // bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)")) } /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require( address(this).balance >= amount, "Address: insufficient balance" ); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{value: amount}(""); require( success, "Address: unable to send value, recipient may have reverted" ); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue( target, data, value, "Address: low-level call with value failed" ); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require( address(this).balance >= value, "Address: insufficient balance for call" ); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{value: value}( data ); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall( target, data, "Address: low-level static call failed" ); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.3._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall( target, data, "Address: low-level delegate call failed" ); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.3._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) private pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } /* Begin solidity-cborutils https://github.com/smartcontractkit/solidity-cborutils MIT License Copyright (c) 2018 SmartContract ChainLink, Ltd. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ library Strings { function strConcat(string memory _a, string memory _b) internal pure returns (string memory _concatenatedString) { return strConcat(_a, _b, "", "", ""); } function strConcat( string memory _a, string memory _b, string memory _c ) internal pure returns (string memory _concatenatedString) { return strConcat(_a, _b, _c, "", ""); } function strConcat( string memory _a, string memory _b, string memory _c, string memory _d ) internal pure returns (string memory _concatenatedString) { return strConcat(_a, _b, _c, _d, ""); } function strConcat( string memory _a, string memory _b, string memory _c, string memory _d, string memory _e ) internal pure returns (string memory _concatenatedString) { bytes memory _ba = bytes(_a); bytes memory _bb = bytes(_b); bytes memory _bc = bytes(_c); bytes memory _bd = bytes(_d); bytes memory _be = bytes(_e); string memory abcde = new string( _ba.length + _bb.length + _bc.length + _bd.length + _be.length ); bytes memory babcde = bytes(abcde); uint256 k = 0; uint256 i = 0; for (i = 0; i < _ba.length; i++) { babcde[k++] = _ba[i]; } for (i = 0; i < _bb.length; i++) { babcde[k++] = _bb[i]; } for (i = 0; i < _bc.length; i++) { babcde[k++] = _bc[i]; } for (i = 0; i < _bd.length; i++) { babcde[k++] = _bd[i]; } for (i = 0; i < _be.length; i++) { babcde[k++] = _be[i]; } return string(babcde); } function uint2str(uint256 _i) internal pure returns (string memory _uintAsString) { if (_i == 0) { return "0"; } uint256 j = _i; uint256 len; while (j != 0) { len++; j /= 10; } bytes memory bstr = new bytes(len); uint256 k = len; while (_i != 0) { k = k - 1; uint8 temp = (48 + uint8(_i - (_i / 10) * 10)); bytes1 b1 = bytes1(temp); bstr[k] = b1; _i /= 10; } return string(bstr); } } /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { // Check the signature length if (signature.length != 65) { revert("ECDSA: invalid signature length"); } // Divide the signature in r, s and v variables bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. // solhint-disable-next-line no-inline-assembly assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return recover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover-bytes32-bytes-} that receives the `v`, * `r` and `s` signature fields separately. */ function recover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (281): 0 < s < secp256k1n ÷ 2 + 1, and for v in (282): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. require( uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, "ECDSA: invalid signature 's' value" ); require(v == 27 || v == 28, "ECDSA: invalid signature 'v' value"); // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); require(signer != address(0), "ECDSA: invalid signature"); return signer; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * replicates the behavior of the * https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_sign[`eth_sign`] * JSON-RPC method. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256( abi.encodePacked("\x19Ethereum Signed Message:\n32", hash) ); } } /** Note: The ERC-165 identifier for this interface is 0x4e2312e0. */ interface IERC1155TokenReceiver { /** @notice Handle the receipt of a single ERC1155 token type. @dev An ERC1155-compliant smart contract MUST call this function on the token recipient contract, at the end of a `safeTransferFrom` after the balance has been updated. This function MUST return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` (i.e. 0xf23a6e61) if it accepts the transfer. This function MUST revert if it rejects the transfer. Return of any other value than the prescribed keccak256 generated value MUST result in the transaction being reverted by the caller. @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)"))` */ function onERC1155Received( address _operator, address _from, uint256 _id, uint256 _value, bytes calldata _data ) external returns (bytes4); /** @notice Handle the receipt of multiple ERC1155 token types. @dev An ERC1155-compliant smart contract MUST call this function on the token recipient contract, at the end of a `safeBatchTransferFrom` after the balances have been updated. This function MUST return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` (i.e. 0xbc197c81) if it accepts the transfer(s). This function MUST revert if it rejects the transfer(s). Return of any other value than the prescribed keccak256 generated value MUST result in the transaction being reverted by the caller. @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)"))` */ function onERC1155BatchReceived( address _operator, address _from, uint256[] calldata _ids, uint256[] calldata _values, bytes calldata _data ) external returns (bytes4); } /** @author The Calystral Team @title Synergy of Serra Assets (NFTs, FTs, and their arbitrary Properties) */ contract SynergyOfSerraAssets is IAssets, IERC1155Metadata_URI, RegistrableContractState, CommonConstants { using Address for address; using Strings for string; /*============================== = CONSTANTS = ==============================*/ /// @dev The maximum allowed supply for FTs and NFTs, half of uint256 is reserved for type and half for the index. uint256 public constant MAX_TYPE_SUPPLY = 2**128; /// @dev Use a split bit implementation. Store the type in the upper 128 bits.. uint256 public constant TYPE_MASK = uint256(uint128(int128(~0))) << 128; /// @dev ..and the non-fungible index in the lower 128 uint256 public constant NF_INDEX_MASK = uint128(int128(~0)); /// @dev The top bit is a flag to tell if this is a NFI. uint256 public constant TYPE_NF_BIT = 1 << 255; /*============================== = STORAGE = ==============================*/ /// @dev A counter used to create the propertyId where propertyId 0 is not existing / reserved. uint256 public propertyCounter; /// @dev A counter which is used to iterate over all existing type Ids. There is no type for _typeNonce 0. uint256 private _typeNonce; /// @dev Points to the base url of an api to receive meta data. string private _metadataBaseURI; /// @dev property id => property type mapping(uint256 => PropertyType) private _propertyIdToPropertyType; /// @dev type id => minted supply mapping(uint256 => uint256) private _typeToMintedSupply; /// @dev type id => max supply mapping(uint256 => uint256) private _typeToMaxSupply; /// @dev type id => release timestamp mapping(uint256 => uint256) private _tokenTypeToReleaseTimestamp; /// @dev type nonce => type id mapping(uint256 => uint256) private _typeNonceToTypeId; /// @dev signer => burn nonce mapping(address => uint256) private _signerToMetaNonce; /// @dev id => (owner => balance) mapping(uint256 => mapping(address => uint256)) internal balances; /// @dev id => owner mapping(uint256 => address) nfOwners; /// @dev owner => (operator => approved) mapping(address => mapping(address => bool)) internal operatorApproval; /*============================== = MODIFIERS = ==============================*/ modifier isValidToken(uint256 tokenId) { _isValidToken(tokenId); _; } modifier isValidProperty(uint256 propertyId) { _isValidProperty(propertyId); _; } modifier isPropertyType(uint256 propertyId, PropertyType propertyType) { _isPropertyType(propertyId, propertyType); _; } modifier isAuthorizedAssetManager() { _isAuthorizedAssetManager(); _; } modifier isValidTypeId(uint256 typeId) { _isValidTypeId(typeId); _; } /*============================== = CONSTRUCTOR = ==============================*/ /** @notice Creates and initializes the contract. @dev Creates and initializes the contract. Registers all implemented interfaces. Contract is INACTIVE by default. @param registryAddress Address of the Registry */ constructor(address registryAddress) RegistrableContractState(registryAddress) { _registerInterface(type(IAssets).interfaceId); _registerInterface(type(IERC1155).interfaceId); _registerInterface(type(IERC1155Metadata_URI).interfaceId); _registerInterface(type(IERC1155MixedFungible).interfaceId); _registerInterface( type(IERC1155CalystralMixedFungibleMintable).interfaceId ); } /*============================== = PUBLIC & EXTERNAL = ==============================*/ function metaSafeTransferFrom( bytes memory signature, address signer, address _to, uint256 _id, uint256 _value, bytes calldata _data, uint256 nonce, uint256 maxTimestamp ) external override isActive { // Meta Transaction bytes32 dataHash = _getSafeTransferFromDataHash( signer, _to, _id, _value, _data, nonce, maxTimestamp ); address signaturePublicKey = ECDSA.recover( ECDSA.toEthSignedMessageHash(dataHash), signature ); require( signer == signaturePublicKey || operatorApproval[signer][signaturePublicKey] == true, "Need operator approval for 3rd party transfers." ); require( block.timestamp < maxTimestamp, "This transaction is not valid anymore." ); require( _signerToMetaNonce[signer] == nonce, "This transaction was executed already." ); _signerToMetaNonce[signer]++; // Function Logic require(_to != address(0x0), "cannot send to zero address"); if (isNonFungible(_id)) { require(nfOwners[_id] == signer); nfOwners[_id] = _to; // You could keep balance of NF type in base type id like so: // uint256 baseType = getNonFungibleBaseType(_id); // balances[baseType][signer] = balances[baseType][signer] - _value ; // balances[baseType][_to] = balances[baseType][_to] + _value ; } else { balances[_id][signer] -= _value; balances[_id][_to] += _value; } emit TransferSingle(msg.sender, signer, _to, _id, _value); _doSafeTransferAcceptanceCheck( msg.sender, signer, _to, _id, _value, _data ); } function metaSafeBatchTransferFrom( bytes memory signature, address signer, address _to, uint256[] calldata _ids, uint256[] calldata _values, bytes calldata _data, uint256 nonce, uint256 maxTimestamp ) external override isActive { // Meta Transaction address signaturePublicKey = ECDSA.recover( ECDSA.toEthSignedMessageHash( _getSafeBatchTransferFromDataHash( signer, _to, _ids, _values, _data, nonce, maxTimestamp ) ), signature ); require( signer == signaturePublicKey || operatorApproval[signer][signaturePublicKey] == true, "Need operator approval for 3rd party transfers." ); require(_ids.length == _values.length, "Array length must match."); require( block.timestamp < maxTimestamp, "This transaction is not valid anymore." ); require( _signerToMetaNonce[signer] == nonce, "This transaction was executed already." ); _signerToMetaNonce[signer]++; // Function Logic require(_to != address(0x0), "cannot send to zero address"); require(_ids.length == _values.length, "Array length must match"); for (uint256 i = 0; i < _ids.length; ++i) { if (isNonFungible(_ids[i])) { require(nfOwners[_ids[i]] == signer); nfOwners[_ids[i]] = _to; } else { balances[_ids[i]][signer] -= _values[i]; balances[_ids[i]][_to] += _values[i]; } } emit TransferBatch(msg.sender, signer, _to, _ids, _values); _doSafeBatchTransferAcceptanceCheck( msg.sender, signer, _to, _ids, _values, _data ); } function metaSetApprovalForAll( bytes memory signature, address signer, address _operator, bool _approved, uint256 nonce, uint256 maxTimestamp ) external override isActive { // Meta Transaction bytes32 dataHash = _getSetApprovalForAllHash( _operator, _approved, nonce, maxTimestamp ); address signaturePublicKey = ECDSA.recover( ECDSA.toEthSignedMessageHash(dataHash), signature ); require(signaturePublicKey == signer, "Invalid signature."); require( block.timestamp < maxTimestamp, "This transaction is not valid anymore." ); require( _signerToMetaNonce[signer] == nonce, "This transaction was executed already." ); _signerToMetaNonce[signer]++; // Function Logic operatorApproval[signaturePublicKey][_operator] = _approved; emit ApprovalForAll(signaturePublicKey, _operator, _approved); } function setApprovalForAll(address _operator, bool _approved) external override isActive { operatorApproval[msg.sender][_operator] = _approved; emit ApprovalForAll(msg.sender, _operator, _approved); } function safeTransferFrom( address _from, address _to, uint256 _id, uint256 _value, bytes calldata _data ) external override isActive { require(_to != address(0x0), "cannot send to zero address"); require( _from == msg.sender || operatorApproval[_from][msg.sender] == true, "Need operator approval for 3rd party transfers." ); if (isNonFungible(_id)) { require(nfOwners[_id] == _from); nfOwners[_id] = _to; // You could keep balance of NF type in base type id like so: // uint256 baseType = getNonFungibleBaseType(_id); // balances[baseType][_from] = balances[baseType][_from] - _value; // balances[baseType][_to] = balances[baseType][_to] + _value; } else { balances[_id][_from] = balances[_id][_from] - _value; balances[_id][_to] = balances[_id][_to] + _value; } emit TransferSingle(msg.sender, _from, _to, _id, _value); _doSafeTransferAcceptanceCheck( msg.sender, _from, _to, _id, _value, _data ); } function safeBatchTransferFrom( address _from, address _to, uint256[] calldata _ids, uint256[] calldata _values, bytes calldata _data ) external override isActive { require(_to != address(0x0), "cannot send to zero address"); require(_ids.length == _values.length, "Array length must match"); // Only supporting a global operator approval allows us to do only 1 check and not to touch storage to handle allowances. require( _from == msg.sender || operatorApproval[_from][msg.sender] == true, "Need operator approval for 3rd party transfers." ); for (uint256 i = 0; i < _ids.length; ++i) { // Cache value to local variable to reduce read costs. uint256 id = _ids[i]; uint256 value = _values[i]; if (isNonFungible(id)) { require(nfOwners[id] == _from); nfOwners[id] = _to; } else { balances[id][_from] = balances[id][_from] - value; balances[id][_to] = value + balances[id][_to]; } } emit TransferBatch(msg.sender, _from, _to, _ids, _values); _doSafeBatchTransferAcceptanceCheck( msg.sender, _from, _to, _ids, _values, _data ); } /*============================== = RESTRICTED = ==============================*/ function metaBatchBurn( bytes memory signature, address signer, uint256[] calldata ids, uint256[] calldata values, uint256 nonce, uint256 maxTimestamp ) external override isAuthorizedAssetManager { // Meta Transaction bytes32 dataHash = _getBurnDataHash(ids, values, nonce, maxTimestamp); require( ( ECDSA.recover(ECDSA.toEthSignedMessageHash(dataHash), signature) ) == signer, "Invalid signature." ); require(ids.length == values.length, "Array length must match."); require( block.timestamp < maxTimestamp, "This transaction is not valid anymore." ); require( _signerToMetaNonce[signer] == nonce, "This transaction was executed already." ); _signerToMetaNonce[signer]++; // Function Logic for (uint256 i = 0; i < ids.length; ++i) { uint256 id = ids[i]; if (isNonFungible(id)) { require(nfOwners[id] == signer, "You are not the owner."); nfOwners[id] = address(0x0); } else { uint256 value = values[i]; balances[id][signer] -= value; } } emit TransferBatch(msg.sender, signer, address(0x0), ids, values); } function createIntProperty(string calldata name) external override isAuthorizedAssetManager returns (uint256) { return _createProperty(name, PropertyType.INT); } function createStringProperty(string calldata name) external override isAuthorizedAssetManager returns (uint256) { return _createProperty(name, PropertyType.STRING); } function createAddressProperty(string calldata name) external override isAuthorizedAssetManager returns (uint256) { return _createProperty(name, PropertyType.ADDRESS); } function createByteProperty(string calldata name) external override isAuthorizedAssetManager returns (uint256) { return _createProperty(name, PropertyType.BYTE); } function createIntArrayProperty(string calldata name) external override isAuthorizedAssetManager returns (uint256) { return _createProperty(name, PropertyType.INTARRAY); } function createAddressArrayProperty(string calldata name) external override isAuthorizedAssetManager returns (uint256) { return _createProperty(name, PropertyType.ADDRESSARRAY); } function updateIntProperty( uint256 tokenId, uint256 propertyId, int256 value ) external override isAuthorizedAssetManager isValidToken(tokenId) isValidProperty(propertyId) isPropertyType(propertyId, PropertyType.INT) { emit OnUpdateIntProperty(tokenId, propertyId, value); } function updateStringProperty( uint256 tokenId, uint256 propertyId, string calldata value ) external override isAuthorizedAssetManager isValidToken(tokenId) isValidProperty(propertyId) isPropertyType(propertyId, PropertyType.STRING) { emit OnUpdateStringProperty(tokenId, propertyId, value); } function updateAddressProperty( uint256 tokenId, uint256 propertyId, address value ) external override isAuthorizedAssetManager isValidToken(tokenId) isValidProperty(propertyId) isPropertyType(propertyId, PropertyType.ADDRESS) { emit OnUpdateAddressProperty(tokenId, propertyId, value); } function updateByteProperty( uint256 tokenId, uint256 propertyId, bytes32 value ) external override isAuthorizedAssetManager isValidToken(tokenId) isValidProperty(propertyId) isPropertyType(propertyId, PropertyType.BYTE) { emit OnUpdateByteProperty(tokenId, propertyId, value); } function updateIntArrayProperty( uint256 tokenId, uint256 propertyId, int256[] calldata value ) external override isAuthorizedAssetManager isValidToken(tokenId) isValidProperty(propertyId) isPropertyType(propertyId, PropertyType.INTARRAY) { emit OnUpdateIntArrayProperty(tokenId, propertyId, value); } function updateAddressArrayProperty( uint256 tokenId, uint256 propertyId, address[] calldata value ) external override isAuthorizedAssetManager isValidToken(tokenId) isValidProperty(propertyId) isPropertyType(propertyId, PropertyType.ADDRESSARRAY) { emit OnUpdateAddressArrayProperty(tokenId, propertyId, value); } function updateMetadataBaseURI(string calldata baseUri) external override isAuthorizedAssetManager { _metadataBaseURI = baseUri; } function createNonFungibleType(uint256 maxSupply, uint256 releaseTimestamp) external override isAuthorizedAssetManager returns (uint256) { uint256 result = _create(true, maxSupply); _setReleaseTimestamp(result, releaseTimestamp); return result; } function createFungibleType(uint256 maxSupply, uint256 releaseTimestamp) external override isAuthorizedAssetManager returns (uint256) { uint256 result = _create(false, maxSupply); _setReleaseTimestamp(result, releaseTimestamp); return result; } function mintNonFungible(uint256 typeId, address[] calldata toArr) external override isAuthorizedAssetManager isValidTypeId(typeId) { require( isNonFungible(typeId), "This typeId is not a non fungible type." ); // Index are 1-based. uint256 index = _typeToMintedSupply[typeId] + 1; _typeToMintedSupply[typeId] += toArr.length; for (uint256 i = 0; i < toArr.length; ++i) { address to = toArr[i]; uint256 id = typeId | (index + i); nfOwners[id] = to; emit TransferSingle(msg.sender, address(0x0), to, id, 1); _doSafeTransferAcceptanceCheck( msg.sender, msg.sender, to, id, 1, "" ); } require( _typeToMintedSupply[typeId] <= _typeToMaxSupply[typeId], "Out of stock." ); } function mintFungible( uint256 typeId, address[] calldata toArr, uint256[] calldata quantitiesArr ) external override isAuthorizedAssetManager isValidTypeId(typeId) { require(isFungible(typeId), "This typeId is not a fungible type."); require( toArr.length == quantitiesArr.length, "Array length must match." ); for (uint256 i = 0; i < toArr.length; ++i) { address to = toArr[i]; uint256 quantity = quantitiesArr[i]; // Grant the items to the caller balances[typeId][to] += quantity; _typeToMintedSupply[typeId] += quantity; // the 0x0 source address implies a mint // It will also provide the circulating supply info. emit TransferSingle(msg.sender, address(0x0), to, typeId, quantity); _doSafeTransferAcceptanceCheck( msg.sender, msg.sender, to, typeId, quantity, "" ); } require( _typeToMintedSupply[typeId] <= _typeToMaxSupply[typeId], "Out of stock." ); } function setReleaseTimestamp(uint256 typeId, uint256 timestamp) external override isAuthorizedAssetManager isValidTypeId(typeId) { _setReleaseTimestamp(typeId, timestamp); } /*============================== = VIEW & PURE = ==============================*/ function getPropertyType(uint256 propertyId) public view override isValidProperty(propertyId) returns (PropertyType) { return _propertyIdToPropertyType[propertyId]; } function getPropertyCounter() public view override returns (uint256) { return propertyCounter; } function uri(uint256 _id) public view override returns (string memory) { return Strings.strConcat(_metadataBaseURI, Strings.uint2str(_id)); } function getReleaseTimestamp(uint256 typeId) public view override isValidTypeId(typeId) returns (uint256) { return _tokenTypeToReleaseTimestamp[typeId]; } function getTypeIds() public view override returns (uint256[] memory) { uint256[] memory resultIds = new uint256[](_typeNonce); for (uint256 i = 0; i < _typeNonce; i++) { resultIds[i] = getTypeId(i + 1); } return resultIds; } function getTypeId(uint256 typeNonce) public view override returns (uint256) { require( typeNonce <= _typeNonce && typeNonce != 0, "TypeNonce does not exist." ); return _typeNonceToTypeId[typeNonce]; } function getNonFungibleAssets(address owner) public view override returns (uint256[] memory) { uint256 counter; for (uint256 i = 1; i <= _typeNonce; i++) { uint256 typeId = (i << 128) | TYPE_NF_BIT; if (_typeToMaxSupply[typeId] != 0) { for (uint256 j = 1; j <= _typeToMintedSupply[typeId]; j++) { uint256 id = typeId | j; if (nfOwners[id] == owner) { counter++; } } } } uint256[] memory result = new uint256[](counter); counter = 0; for (uint256 i = 1; i <= _typeNonce; i++) { uint256 typeId = (i << 128) | TYPE_NF_BIT; if (_typeToMaxSupply[typeId] != 0) { for (uint256 j = 1; j <= _typeToMintedSupply[typeId]; j++) { uint256 id = typeId | j; if (nfOwners[id] == owner) { result[counter] = id; counter++; } } } } return result; } function getFungibleAssets(address owner) public view override returns (uint256[] memory, uint256[] memory) { uint256 counter; for (uint256 i = 1; i <= _typeNonce; i++) { uint256 typeId = i << 128; if (_typeToMaxSupply[typeId] != 0) { if (balances[typeId][owner] > 0) { counter++; } } } uint256[] memory resultIds = new uint256[](counter); uint256[] memory resultAmounts = new uint256[](counter); counter = 0; for (uint256 i = 1; i <= _typeNonce; i++) { uint256 typeId = i << 128; if (_typeToMaxSupply[typeId] != 0) { if (balances[typeId][owner] > 0) { resultIds[counter] = typeId; resultAmounts[counter] = balances[typeId][owner]; counter++; } } } return (resultIds, resultAmounts); } function getTypeNonce() public view override returns (uint256) { return _typeNonce; } function getMintedSupply(uint256 typeId) public view override isValidTypeId(typeId) returns (uint256) { return _typeToMintedSupply[typeId]; } function getMaxSupply(uint256 typeId) public view override isValidTypeId(typeId) returns (uint256) { return _typeToMaxSupply[typeId]; } function getMetaNonce(address signer) public view override returns (uint256) { return _signerToMetaNonce[signer]; } function isApprovedForAll(address _owner, address _operator) external view override returns (bool) { return operatorApproval[_owner][_operator]; } function isNonFungible(uint256 _id) public pure override returns (bool) { return _id & TYPE_NF_BIT == TYPE_NF_BIT; } function isFungible(uint256 _id) public pure override returns (bool) { return _id & TYPE_NF_BIT == 0; } function getNonFungibleIndex(uint256 _id) public pure override returns (uint256) { return _id & NF_INDEX_MASK; } function getNonFungibleBaseType(uint256 _id) public pure override returns (uint256) { return _id & TYPE_MASK; } function isNonFungibleBaseType(uint256 _id) public pure override returns (bool) { // A base type has the NF bit but does not have an index. return (_id & TYPE_NF_BIT == TYPE_NF_BIT) && (_id & NF_INDEX_MASK == 0); } function isNonFungibleItem(uint256 _id) public pure override returns (bool) { // A base type has the NF bit but does has an index. return (_id & TYPE_NF_BIT == TYPE_NF_BIT) && (_id & NF_INDEX_MASK != 0); } function ownerOf(uint256 _id) public view override returns (address) { return nfOwners[_id]; } function balanceOf(address _owner, uint256 _id) external view override returns (uint256) { if (isNonFungibleItem(_id)) return nfOwners[_id] == _owner ? 1 : 0; return balances[_id][_owner]; } function balanceOfBatch(address[] calldata _owners, uint256[] calldata _ids) external view override returns (uint256[] memory) { require(_owners.length == _ids.length); uint256[] memory balances_ = new uint256[](_owners.length); for (uint256 i = 0; i < _owners.length; ++i) { uint256 id = _ids[i]; if (isNonFungibleItem(id)) { balances_[i] = nfOwners[id] == _owners[i] ? 1 : 0; } else { balances_[i] = balances[id][_owners[i]]; } } return balances_; } /*============================== = INTERNAL & PRIVATE = ==============================*/ /** @dev Checks if the `tokenId` exists: NFs are checked via `nfOwners` mapping. NFTs are checked via `getMaxSupply` function. @param tokenId The tokenId which should be checked */ function _isValidToken(uint256 tokenId) internal view { if (isNonFungible(tokenId)) { require( nfOwners[tokenId] != address(0x0), "TokenId does not exist." ); } else { require(getMaxSupply(tokenId) != 0, "TokenId does not exist."); } } /** @dev Checks if the `propertyId` exists. @param propertyId The propertyId which should be checked */ function _isValidProperty(uint256 propertyId) internal view { require( propertyId <= propertyCounter && propertyId != 0, "Invalid property requested." ); } /** @dev Checks if a given `propertyId` matches the given `propertyType`. @param propertyId The propertyId which should be checked @param propertyType The PropertyType which should be checked against */ function _isPropertyType(uint256 propertyId, PropertyType propertyType) internal view { require( _propertyIdToPropertyType[propertyId] == propertyType, "The given property id does not match the property type." ); } /** @dev Creates a new property. @param name The name of the property @param propertyType The PropertyType of the property @return The propertyId of the property */ function _createProperty(string memory name, PropertyType propertyType) private returns (uint256) { propertyCounter++; // propertyCounter starts with 1 for the first attribute _propertyIdToPropertyType[propertyCounter] = propertyType; emit OnCreateProperty(propertyCounter, name, propertyType); return propertyCounter; } /** @dev Checks if the AssetManager (from the Registry) is the msg.sender. Reverts if the msg.sender is not the correct AssetManager registered in the Registry. */ function _isAuthorizedAssetManager() internal view { require( getContractAddress(3) == msg.sender, "Unauthorized call. Thanks for supporting the network with your ETH." ); } /** @dev Checks if a given `typeId` exists. Reverts if given `typeId` does not exist. @param typeId The typeId which should be checked */ function _isValidTypeId(uint256 typeId) internal view { require(_typeToMaxSupply[typeId] != 0, "TypeId does not exist."); } /** @dev Creates fungible and non-fungible types. This function only creates the type and is not used for minting. NFT types also has a maxSupply since there can be multiple tokens of the same type, e.g. 100x 'Pikachu'. Reverts if the `maxSupply` is 0 or exceeds the `MAX_TYPE_SUPPLY`. @param isNF Flag if the creation should be a non-fungible, false for fungible tokens @param maxSupply The maximum amount that can be created of this type, unlimited SHOULD be 2**128 (uint128) as the max. MUST NOT be set to 0 @return The `typeId` */ function _create(bool isNF, uint256 maxSupply) private returns (uint256) { require( maxSupply != 0 && maxSupply <= MAX_TYPE_SUPPLY, "Minimum 1 and maximum 2**128 tokens of one type can exist." ); // Store the type in the upper 128 bits uint256 typeId = (++_typeNonce << 128); // Set a flag if this is an NFI. if (isNF) typeId = typeId | TYPE_NF_BIT; _typeToMaxSupply[typeId] = maxSupply; _typeNonceToTypeId[_typeNonce] = typeId; // emit a Transfer event with Create semantic to help with discovery. emit TransferSingle(msg.sender, address(0x0), address(0x0), typeId, 0); return typeId; } /** @dev Sets a release timestamp. Reverts if `timestamp` == 0. Reverts if the `typeId` is released already. @param typeId The type which should be set or updated @param timestamp The timestamp for the release time, SHOULD be set to 1337 for releasing it right away. MUST NOT be set to 0 */ function _setReleaseTimestamp(uint256 typeId, uint256 timestamp) private { require( timestamp != 0, "A 0 timestamp is not allowed. For immediate release choose 1337." ); require( _tokenTypeToReleaseTimestamp[typeId] == 0 || _tokenTypeToReleaseTimestamp[typeId] > block.timestamp, "This token is released already." ); _tokenTypeToReleaseTimestamp[typeId] = timestamp; emit OnReleaseTimestamp(typeId, timestamp); } /** @dev Get the data hash required for the meta transaction comparison of burn executions. @param ids An array of token Ids which should be burned @param values An array of amounts which should be burned @param nonce Each sent meta transaction includes a nonce to prevent that a signed transaction is executed multiple times @param maxTimestamp The maximum point in time before the meta transaction expired, thus becoming invalid @return The keccak256 hash of the data input */ function _getBurnDataHash( uint256[] memory ids, uint256[] memory values, uint256 nonce, uint256 maxTimestamp ) private pure returns (bytes32) { return keccak256(abi.encodePacked(ids, values, nonce, maxTimestamp)); } /** @dev Get the data hash required for the meta transaction comparison of transfer executions. @param signer The signer of the transaction @param _to The receiver address @param _id An token id which should be transfered @param _value An amount which should be transfered @param _data Additional data field @param nonce Each sent meta transaction includes a nonce to prevent that a signed transaction is executed multiple times @param maxTimestamp The maximum point in time before the meta transaction expired, thus becoming invalid @return The keccak256 hash of the data input */ function _getSafeTransferFromDataHash( address signer, address _to, uint256 _id, uint256 _value, bytes memory _data, uint256 nonce, uint256 maxTimestamp ) private pure returns (bytes32) { return keccak256( abi.encodePacked( signer, _to, _id, _value, _data, nonce, maxTimestamp ) ); } /** @dev Get the data hash required for the meta transaction comparison of transfer executions. @param signer The signer of the transaction @param _to The receiver address @param _ids An array of token Ids which should be transfered @param _values An array of amounts which should be transfered @param _data Additional data field @param nonce Each sent meta transaction includes a nonce to prevent that a signed transaction is executed multiple times @param maxTimestamp The maximum point in time before the meta transaction expired, thus becoming invalid @return The keccak256 hash of the data input */ function _getSafeBatchTransferFromDataHash( address signer, address _to, uint256[] memory _ids, uint256[] memory _values, bytes memory _data, uint256 nonce, uint256 maxTimestamp ) private pure returns (bytes32) { return keccak256( abi.encodePacked( signer, _to, _ids, _values, _data, nonce, maxTimestamp ) ); } /** @dev Get the data hash required for the meta transaction comparison of transfer executions. @param _operator Address to add to the set of authorized operators @param _approved True if the operator is approved, false to revoke approval @param nonce Each sent meta transaction includes a nonce to prevent that a signed transaction is executed multiple times @param maxTimestamp The maximum point in time before the meta transaction expired, thus becoming invalid @return The keccak256 hash of the data input */ function _getSetApprovalForAllHash( address _operator, bool _approved, uint256 nonce, uint256 maxTimestamp ) private pure returns (bytes32) { return keccak256( abi.encodePacked(_operator, _approved, nonce, maxTimestamp) ); } /** @dev Checks if the contract allows receiving ERC1155 in case the "to" address is a contract. The receiving contract needs to implement IERC1155TokenReceiver. @param operator The operator address @param from The address of the holder whose balance is decreased @param to Target address @param id ID of the token type @param amount Transfer amount @param data Additional data field */ function _doSafeTransferAcceptanceCheck( address operator, address from, address to, uint256 id, uint256 amount, bytes memory data ) internal { if (to.isContract()) { try IERC1155TokenReceiver(to).onERC1155Received( operator, from, id, amount, data ) returns (bytes4 response) { if ( response != IERC1155TokenReceiver(to).onERC1155Received.selector ) { revert("ERC1155: ERC1155TokenReceiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert( "ERC1155: transfer to non ERC1155TokenReceiver implementer" ); } } } /** @dev Checks if the contract allows receiving ERC1155 in case the "to" address is a contract. The receiving contract needs to implement IERC1155TokenReceiver. @param operator The operator address @param from The address of the holder whose balance is decreased @param to Target address @param ids Array of ids of the token types @param amounts Array of amounts of to transfer @param data Additional data field */ function _doSafeBatchTransferAcceptanceCheck( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal { if (to.isContract()) { try IERC1155TokenReceiver(to).onERC1155BatchReceived( operator, from, ids, amounts, data ) returns (bytes4 response) { if ( response != IERC1155TokenReceiver(to).onERC1155BatchReceived.selector ) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non ERC1155Receiver implementer"); } } } }
[{"inputs":[{"internalType":"address","name":"registryAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[],"name":"Activated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":false,"internalType":"bool","name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[],"name":"Inactivated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"propertyId","type":"uint256"},{"indexed":false,"internalType":"string","name":"name","type":"string"},{"indexed":true,"internalType":"enum IAssets.PropertyType","name":"propertyType","type":"uint8"}],"name":"OnCreateProperty","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"typeId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"OnReleaseTimestamp","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"propertyId","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"value","type":"address[]"}],"name":"OnUpdateAddressArrayProperty","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"propertyId","type":"uint256"},{"indexed":false,"internalType":"address","name":"value","type":"address"}],"name":"OnUpdateAddressProperty","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"propertyId","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"value","type":"bytes32"}],"name":"OnUpdateByteProperty","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"propertyId","type":"uint256"},{"indexed":false,"internalType":"int256[]","name":"value","type":"int256[]"}],"name":"OnUpdateIntArrayProperty","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"propertyId","type":"uint256"},{"indexed":false,"internalType":"int256","name":"value","type":"int256"}],"name":"OnUpdateIntProperty","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"propertyId","type":"uint256"},{"indexed":false,"internalType":"string","name":"value","type":"string"}],"name":"OnUpdateStringProperty","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":"MAX_TYPE_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NF_INDEX_MASK","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TYPE_MASK","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TYPE_NF_BIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_owners","type":"address[]"},{"internalType":"uint256[]","name":"_ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"}],"name":"createAddressArrayProperty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"}],"name":"createAddressProperty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"}],"name":"createByteProperty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"uint256","name":"releaseTimestamp","type":"uint256"}],"name":"createFungibleType","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"}],"name":"createIntArrayProperty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"}],"name":"createIntProperty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"uint256","name":"releaseTimestamp","type":"uint256"}],"name":"createNonFungibleType","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"}],"name":"createStringProperty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"key","type":"uint256"}],"name":"getContractAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"getFungibleAssets","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"typeId","type":"uint256"}],"name":"getMaxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"signer","type":"address"}],"name":"getMetaNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"typeId","type":"uint256"}],"name":"getMintedSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"getNonFungibleAssets","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"getNonFungibleBaseType","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"getNonFungibleIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getPropertyCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"propertyId","type":"uint256"}],"name":"getPropertyType","outputs":[{"internalType":"enum IAssets.PropertyType","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRegistryAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"typeId","type":"uint256"}],"name":"getReleaseTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"typeNonce","type":"uint256"}],"name":"getTypeId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTypeIds","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTypeNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"isFungible","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"isNonFungible","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"isNonFungibleBaseType","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"isNonFungibleItem","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"address","name":"signer","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"maxTimestamp","type":"uint256"}],"name":"metaBatchBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"address","name":"signer","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256[]","name":"_ids","type":"uint256[]"},{"internalType":"uint256[]","name":"_values","type":"uint256[]"},{"internalType":"bytes","name":"_data","type":"bytes"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"maxTimestamp","type":"uint256"}],"name":"metaSafeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"address","name":"signer","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"maxTimestamp","type":"uint256"}],"name":"metaSafeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"address","name":"signer","type":"address"},{"internalType":"address","name":"_operator","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"maxTimestamp","type":"uint256"}],"name":"metaSetApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"typeId","type":"uint256"},{"internalType":"address[]","name":"toArr","type":"address[]"},{"internalType":"uint256[]","name":"quantitiesArr","type":"uint256[]"}],"name":"mintFungible","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"typeId","type":"uint256"},{"internalType":"address[]","name":"toArr","type":"address[]"}],"name":"mintNonFungible","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"propertyCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256[]","name":"_ids","type":"uint256[]"},{"internalType":"uint256[]","name":"_values","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":"_id","type":"uint256"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setActive","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":[],"name":"setInactive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"registryAddress","type":"address"}],"name":"setRegistry","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"typeId","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"setReleaseTimestamp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"propertyId","type":"uint256"},{"internalType":"address[]","name":"value","type":"address[]"}],"name":"updateAddressArrayProperty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"propertyId","type":"uint256"},{"internalType":"address","name":"value","type":"address"}],"name":"updateAddressProperty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"propertyId","type":"uint256"},{"internalType":"bytes32","name":"value","type":"bytes32"}],"name":"updateByteProperty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"propertyId","type":"uint256"},{"internalType":"int256[]","name":"value","type":"int256[]"}],"name":"updateIntArrayProperty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"propertyId","type":"uint256"},{"internalType":"int256","name":"value","type":"int256"}],"name":"updateIntProperty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseUri","type":"string"}],"name":"updateMetadataBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"propertyId","type":"uint256"},{"internalType":"string","name":"value","type":"string"}],"name":"updateStringProperty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b50604051620059093803806200590983398101604081905262000034916200015f565b80620000476301ffc9a760e01b620000db565b60018054610100600160a81b0319166101006001600160a01b03841602179055620000796389edd2db60e01b620000db565b506200008c6363dcd68160e11b620000db565b6200009e636cdb3d1360e11b620000db565b620000b06303a24d0760e21b620000db565b620000c2637aa46e1560e11b620000db565b620000d46345bd216f60e01b620000db565b5062000191565b6001600160e01b031980821690036200013a5760405162461bcd60e51b815260206004820152601c60248201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604482015260640160405180910390fd5b6001600160e01b0319166000908152602081905260409020805460ff19166001179055565b6000602082840312156200017257600080fd5b81516001600160a01b03811681146200018a57600080fd5b9392505050565b61576880620001a16000396000f3fe608060405234801561001057600080fd5b50600436106103985760003560e01c80636c27479d116101e9578063adebf6f21161010f578063e44591f0116100ad578063f242432a1161007c578063f242432a146108a0578063f519ca0c146108b3578063f9419088146108c6578063fba7cc79146108d957600080fd5b8063e44591f01461082c578063e985e9c514610846578063f1b9ee2414610882578063f21de1e81461088a57600080fd5b8063ca4708ee116100e9578063ca4708ee146107f2578063d090e47e14610805578063d270acb91461080e578063d905af551461082157600080fd5b8063adebf6f2146107b4578063aefa7d98146107cc578063c55ebe69146107df57600080fd5b80638b3188ce11610187578063a22cb46511610156578063a22cb46514610768578063a6203b631461077b578063a91ee0dc1461078e578063ab7b9a31146107a157600080fd5b80638b3188ce1461070c5780639b6b5b661461071f5780639cca1c64146107325780639f0ab7da1461075557600080fd5b8063760a8c2a116101c3578063760a8c2a146106cb57806378b27221146106d357806378c9adad146106e6578063829dc5f0146106f957600080fd5b80636c27479d146106815780636f969c2d146106945780637269a327146106b857600080fd5b80632f817bf8116102ce5780635a6471551161026c5780636352211e1161023b5780636352211e146106055780636712f55f146106465780636907aa57146106665780636b7dfd721461067957600080fd5b80635a647155146105ae5780635e495d74146105d75780635e81b958146105ea5780635ff66eb7146105fd57600080fd5b806349eae3c5116102a857806349eae3c51461054c5780634a71aa0a146105645780634e1273f41461057757806352fb73991461059757600080fd5b80632f817bf8146105135780633dfbc24714610526578063491078f41461053957600080fd5b80630f94cc501161033b57806319ef07881161031557806319ef0788146104b9578063282a84da146104cc5780632ccd2c84146104ed5780632eb2c2d61461050057600080fd5b80630f94cc501461048657806315ee4ee31461049e57806319daa440146104a657600080fd5b806305a85c2c1161037757806305a85c2c1461042d578063084e6adf1461044057806308f51a84146104535780630e89341c1461046657600080fd5b8062fdd58e1461039d57806301ffc9a7146103c35780630478b6b914610418575b600080fd5b6103b06103ab3660046147f9565b6108e4565b6040519081526020015b60405180910390f35b6104086103d1366004614853565b7fffffffff000000000000000000000000000000000000000000000000000000001660009081526020819052604090205460ff1690565b60405190151581526020016103ba565b61042b610426366004614935565b610954565b005b6103b061043b366004614a05565b610ba6565b6103b061044e366004614a47565b610bf9565b61042b610461366004614a60565b610c1d565b610479610474366004614a47565b610c8a565b6040516103ba9190614ae8565b6103b06fffffffffffffffffffffffffffffffff1981565b6003546103b0565b61042b6104b4366004614afb565b610d28565b6103b06104c7366004614a05565b611157565b6104df6104da366004614bb5565b6111a3565b6040516103ba929190614c0d565b61042b6104fb366004614c32565b611383565b61042b61050e366004614c99565b6113a4565b6103b0610521366004614c32565b611798565b6103b0610534366004614a05565b6117bb565b6103b0610547366004614c32565b611807565b6103b070010000000000000000000000000000000081565b61042b610572366004614a60565b61181e565b61058a610585366004614d58565b61187a565b6040516103ba9190614dc4565b6103b06fffffffffffffffffffffffffffffffff81565b6103b06105bc366004614bb5565b6001600160a01b03166000908152600a602052604090205490565b6103b06105e5366004614a47565b611a0e565b6104086105f8366004614a47565b611a2e565b61058a611a58565b61062e610613366004614a47565b6000908152600c60205260409020546001600160a01b031690565b6040516001600160a01b0390911681526020016103ba565b610659610654366004614a47565b611aed565b6040516103ba9190614ded565b61042b610674366004614e15565b611b10565b6002546103b0565b6103b061068f366004614a05565b611b76565b6103b06106a2366004614a47565b6fffffffffffffffffffffffffffffffff191690565b6104086106c6366004614a47565b611bc2565b61042b611beb565b61042b6106e1366004614e4e565b611c2a565b61042b6106f4366004614a05565b611ea0565b6103b0610707366004614a05565b611eb4565b61042b61071a366004614ec8565b611efd565b6103b061072d366004614a47565b611f59565b6103b0610740366004614a47565b6fffffffffffffffffffffffffffffffff1690565b61058a610763366004614bb5565b611fcb565b61042b610776366004614f0f565b61217b565b6103b0610789366004614a47565b6121ef565b61042b61079c366004614bb5565b61220f565b61042b6107af366004614ec8565b6123ed565b6104086107c2366004614a47565b600160ff1b161590565b61062e6107da366004614a47565b612449565b6103b06107ed366004614a05565b6124d5565b61042b610800366004614f48565b612521565b6103b060025481565b61042b61081c366004614f8f565b61257d565b6103b0600160ff1b81565b61040861083a366004614a47565b600160ff1b9081161490565b610408610854366004615047565b6001600160a01b039182166000908152600d6020908152604080832093909416825291909152205460ff1690565b61042b6129bd565b60015461010090046001600160a01b031661062e565b61042b6108ae366004615075565b6129fa565b61042b6108c13660046150f1565b612c80565b61042b6108d43660046151e7565b613354565b60015460ff16610408565b60006108ef82611a2e565b15610929576000828152600c60205260409020546001600160a01b0384811691161461091c57600061091f565b60015b60ff16905061094e565b506000818152600b602090815260408083206001600160a01b03861684529091529020545b92915050565b61095c613582565b600061096a858585856135da565b905060006109ce6109c8836040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b89613636565b9050866001600160a01b0316816001600160a01b031614610a365760405162461bcd60e51b815260206004820152601260248201527f496e76616c6964207369676e61747572652e000000000000000000000000000060448201526064015b60405180910390fd5b824210610a945760405162461bcd60e51b815260206004820152602660248201527f54686973207472616e73616374696f6e206973206e6f742076616c696420616e6044820152653cb6b7b9329760d11b6064820152608401610a2d565b6001600160a01b0387166000908152600a60205260409020548414610b0a5760405162461bcd60e51b815260206004820152602660248201527f54686973207472616e73616374696f6e2077617320657865637574656420616c6044820152653932b0b23c9760d11b6064820152608401610a2d565b6001600160a01b0387166000908152600a60205260408120805491610b2e83615249565b90915550506001600160a01b038181166000818152600d60209081526040808320948b1680845294825291829020805460ff19168a151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191015b60405180910390a35050505050505050565b6000610bb06136b1565b610bf283838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506003925061375e915050565b9392505050565b600081610c0581613803565b60008381526006602052604090205491505b50919050565b610c256136b1565b82610c2f81613860565b82610c3981613929565b836000610c468282613986565b85877f5eaea1ab442fc547ed0ca77214f10950027909260a85911e2b428c3c0f8cf46787604051610c7991815260200190565b60405180910390a350505050505050565b606061094e60048054610c9c90615262565b80601f0160208091040260200160405190810160405280929190818152602001828054610cc890615262565b8015610d155780601f10610cea57610100808354040283529160200191610d15565b820191906000526020600020905b815481529060010190602001808311610cf857829003601f168201915b5050505050610d2384613a30565b613b78565b610d30613582565b6000610d798989898989898080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508b92508a9150613bb49050565b90506000610ddd610dd7836040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b8c613636565b9050806001600160a01b03168a6001600160a01b03161480610e2957506001600160a01b03808b166000908152600d602090815260408083209385168352929052205460ff1615156001145b610e8d5760405162461bcd60e51b815260206004820152602f60248201527f4e656564206f70657261746f7220617070726f76616c20666f7220337264207060448201526e30b93a3c903a3930b739b332b9399760891b6064820152608401610a2d565b824210610eeb5760405162461bcd60e51b815260206004820152602660248201527f54686973207472616e73616374696f6e206973206e6f742076616c696420616e6044820152653cb6b7b9329760d11b6064820152608401610a2d565b6001600160a01b038a166000908152600a60205260409020548414610f615760405162461bcd60e51b815260206004820152602660248201527f54686973207472616e73616374696f6e2077617320657865637574656420616c6044820152653932b0b23c9760d11b6064820152608401610a2d565b6001600160a01b038a166000908152600a60205260408120805491610f8583615249565b90915550506001600160a01b038916610fe05760405162461bcd60e51b815260206004820152601b60248201527f63616e6e6f742073656e6420746f207a65726f206164647265737300000000006044820152606401610a2d565b600160ff1b8089160361104c576000888152600c60205260409020546001600160a01b038b811691161461101357600080fd5b6000888152600c60205260409020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038b161790556110bb565b6000888152600b602090815260408083206001600160a01b038e1684529091528120805489929061107e908490615296565b90915550506000888152600b602090815260408083206001600160a01b038d168452909152812080548992906110b59084906152ad565b90915550505b60408051898152602081018990526001600160a01b03808c1692908d169133917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a461114a338b8b8b8b8b8b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250613bf692505050565b5050505050505050505050565b60006111616136b1565b610bf283838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506002925061375e915050565b606080600060015b600354811161121657608081901b60008181526007602052604090205415611203576000818152600b602090815260408083206001600160a01b038a1684529091529020541561120357826111ff81615249565b9350505b508061120e81615249565b9150506111ab565b5060008167ffffffffffffffff81111561123257611232614870565b60405190808252806020026020018201604052801561125b578160200160208202803683370190505b50905060008267ffffffffffffffff81111561127957611279614870565b6040519080825280602002602001820160405280156112a2578160200160208202803683370190505b5060009350905060015b600354811161137757608081901b60008181526007602052604090205415611364576000818152600b602090815260408083206001600160a01b038c168452909152902054156113645780848681518110611309576113096152c5565b6020908102919091018101919091526000828152600b825260408082206001600160a01b038c1683529092522054835184908790811061134b5761134b6152c5565b60209081029190910101528461136081615249565b9550505b508061136f81615249565b9150506112ac565b50909590945092505050565b61138b6136b1565b8161139581613803565b61139f8383613dd1565b505050565b6113ac613582565b6001600160a01b0387166114025760405162461bcd60e51b815260206004820152601b60248201527f63616e6e6f742073656e6420746f207a65726f206164647265737300000000006044820152606401610a2d565b8483146114515760405162461bcd60e51b815260206004820152601760248201527f4172726179206c656e677468206d757374206d617463680000000000000000006044820152606401610a2d565b6001600160a01b03881633148061149057506001600160a01b0388166000908152600d6020908152604080832033845290915290205460ff1615156001145b6114f45760405162461bcd60e51b815260206004820152602f60248201527f4e656564206f70657261746f7220617070726f76616c20666f7220337264207060448201526e30b93a3c903a3930b739b332b9399760891b6064820152608401610a2d565b60005b8581101561168e576000878783818110611513576115136152c5565b9050602002013590506000868684818110611530576115306152c5565b90506020020135905061154982600160ff1b9081161490565b156115ad576000828152600c60205260409020546001600160a01b038c811691161461157457600080fd5b6000828152600c60205260409020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038c1617905561167b565b6000828152600b602090815260408083206001600160a01b038f1684529091529020546115db908290615296565b600b600084815260200190815260200160002060008d6001600160a01b03166001600160a01b0316815260200190815260200160002081905550600b600083815260200190815260200160002060008b6001600160a01b03166001600160a01b03168152602001908152602001600020548161165791906152ad565b6000838152600b602090815260408083206001600160a01b038f1684529091529020555b50508061168790615249565b90506114f7565b50866001600160a01b0316886001600160a01b0316336001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb898989896040516116e2949392919061532a565b60405180910390a461178e33898989898080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808d0282810182019093528c82529093508c92508b91829185019084908082843760009201919091525050604080516020601f8c018190048102820181019092528a815292508a9150899081908401838280828437600092019190915250613f0e92505050565b5050505050505050565b60006117a26136b1565b60006117af6001856140c6565b9050610bf28184613dd1565b60006117c56136b1565b610bf283838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506004925061375e915050565b60006118116136b1565b60006117af6000856140c6565b6118266136b1565b8261183081613860565b8261183a81613929565b8360036118478282613986565b85877f43227f67dc2dfb884342caef2f9c7a09a99b9f02ab2c524b6e1cf8bc854a6d6687604051610c7991815260200190565b606083821461188857600080fd5b60008467ffffffffffffffff8111156118a3576118a3614870565b6040519080825280602002602001820160405280156118cc578160200160208202803683370190505b50905060005b85811015611a045760008585838181106118ee576118ee6152c5565b90506020020135905061190081611a2e565b1561197d57878783818110611917576119176152c5565b905060200201602081019061192c9190614bb5565b6000828152600c60205260409020546001600160a01b03908116911614611954576000611957565b60015b60ff1683838151811061196c5761196c6152c5565b6020026020010181815250506119f3565b6000818152600b602052604081209089898581811061199e5761199e6152c5565b90506020020160208101906119b39190614bb5565b6001600160a01b03166001600160a01b03168152602001908152602001600020548383815181106119e6576119e66152c5565b6020026020010181815250505b506119fd81615249565b90506118d2565b5095945050505050565b600081611a1a81613803565b505060009081526007602052604090205490565b6000600160ff1b80831614801561094e5750506fffffffffffffffffffffffffffffffff16151590565b6060600060035467ffffffffffffffff811115611a7757611a77614870565b604051908082528060200260200182016040528015611aa0578160200160208202803683370190505b50905060005b600354811015610c1757611abe61072d8260016152ad565b828281518110611ad057611ad06152c5565b602090810291909101015280611ae581615249565b915050611aa6565b600081611af981613929565b505060009081526005602052604090205460ff1690565b611b186136b1565b82611b2281613860565b82611b2c81613929565b836002611b398282613986565b6040516001600160a01b0386168152869088907fe6fddd529ce511f88c7ea518e8bcd74716a89345a44ceb7a02a63c6319500c1e90602001610c79565b6000611b806136b1565b610bf283838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506001925061375e915050565b6000600160ff1b80831614801561094e5750506fffffffffffffffffffffffffffffffff161590565b611bf36141e7565b6001805460ff1916811790556040517fed1cd0670ee0c0017f550451a038818c696d0b6a9d6ce5b369e44275573cf9b090600090a1565b611c326136b1565b84611c3c81613803565b600160ff1b861615611cb65760405162461bcd60e51b815260206004820152602360248201527f5468697320747970654964206973206e6f7420612066756e6769626c6520747960448201527f70652e00000000000000000000000000000000000000000000000000000000006064820152608401610a2d565b838214611d055760405162461bcd60e51b815260206004820152601860248201527f4172726179206c656e677468206d757374206d617463682e00000000000000006044820152606401610a2d565b60005b84811015611e2e576000868683818110611d2457611d246152c5565b9050602002016020810190611d399190614bb5565b90506000858584818110611d4f57611d4f6152c5565b60008c8152600b602090815260408083206001600160a01b038916845282528220805493909102949094013594508493925090611d8d9084906152ad565b909155505060008981526006602052604081208054839290611db09084906152ad565b9091555050604080518a8152602081018390526001600160a01b0384169160009133917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611e1b3333848c8560405180602001604052806000815250613bf6565b505080611e2790615249565b9050611d08565b506000868152600760209081526040808320546006909252909120541115611e985760405162461bcd60e51b815260206004820152600d60248201527f4f7574206f662073746f636b2e000000000000000000000000000000000000006044820152606401610a2d565b505050505050565b611ea86136b1565b61139f6004838361473b565b6000611ebe6136b1565b610bf283838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920182905250925061375e915050565b611f056136b1565b83611f0f81613860565b83611f1981613929565b846005611f268282613986565b86887fb698dab408fb6e2c5e168a33c150bc87854d0e8eb37bcab3883691019f85b7088888604051610b9492919061535c565b60006003548211158015611f6c57508115155b611fb85760405162461bcd60e51b815260206004820152601960248201527f547970654e6f6e636520646f6573206e6f742065786973742e000000000000006044820152606401610a2d565b5060009081526009602052604090205490565b6060600060015b600354811161206c57608081901b600160ff1b17600081815260076020526040902054156120595760015b6000828152600660205260409020548111612057578181176000818152600c60205260409020546001600160a01b03808916911603612044578461204081615249565b9550505b508061204f81615249565b915050611ffd565b505b508061206481615249565b915050611fd2565b5060008167ffffffffffffffff81111561208857612088614870565b6040519080825280602002602001820160405280156120b1578160200160208202803683370190505b5060009250905060015b600354811161217357608081901b600160ff1b17600081815260076020526040902054156121605760015b600082815260066020526040902054811161215e578181176000818152600c60205260409020546001600160a01b03808a1691160361214b5780858781518110612132576121326152c5565b60209081029190910101528561214781615249565b9650505b508061215681615249565b9150506120e6565b505b508061216b81615249565b9150506120bb565b509392505050565b612183613582565b336000818152600d602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000816121fb81613803565b505060009081526008602052604090205490565b61221761426b565b600180546001600160a01b038316610100027fffffffffffffffffffffff0000000000000000000000000000000000000000ff9091161790556122686001546001600160a01b036101009091041690565b6040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f60e56d110000000000000000000000000000000000000000000000000000000060048201526001600160a01b0391909116906301ffc9a790602401602060405180830381865afa925050508015612303575060408051601f3d908101601f19168201909252612300918101906153aa565b60015b6123755760405162461bcd60e51b815260206004820152603f60248201527f5468652070726f766964656420636f6e747261637420646f6573206e6f74206960448201527f6d706c656d656e742074686520526567697374727920696e74657266616365006064820152608401610a2d565b806123e85760405162461bcd60e51b815260206004820152603f60248201527f5468652070726f766964656420636f6e747261637420646f6573206e6f74206960448201527f6d706c656d656e742074686520526567697374727920696e74657266616365006064820152608401610a2d565b505b50565b6123f56136b1565b836123ff81613860565b8361240981613929565b8460046124168282613986565b86887fbbd005d6024e5cd44017cf21a00d7fa1aaf59e19edb7fc5bb1f04629a8fee4088888604051610b949291906153c7565b6001546040517f9507d39a0000000000000000000000000000000000000000000000000000000081526004810183905260009161010090046001600160a01b031690639507d39a90602401602060405180830381865afa1580156124b1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061094e91906153f8565b60006124df6136b1565b610bf283838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506005925061375e915050565b6125296136b1565b8361253381613860565b8361253d81613929565b84600161254a8282613986565b86887fe27ba0a6870802af6a1f5b15e632c86c1a8c9441586cb5ac1b785527fa3a02d28888604051610b94929190615415565b6125856136b1565b60006125f887878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808b0282810182019093528a82529093508a9250899182918501908490808284376000920191909152508892508791506142759050565b9050876001600160a01b031661266461265e836040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b8b613636565b6001600160a01b0316146126ba5760405162461bcd60e51b815260206004820152601260248201527f496e76616c6964207369676e61747572652e00000000000000000000000000006044820152606401610a2d565b8584146127095760405162461bcd60e51b815260206004820152601860248201527f4172726179206c656e677468206d757374206d617463682e00000000000000006044820152606401610a2d565b8142106127675760405162461bcd60e51b815260206004820152602660248201527f54686973207472616e73616374696f6e206973206e6f742076616c696420616e6044820152653cb6b7b9329760d11b6064820152608401610a2d565b6001600160a01b0388166000908152600a602052604090205483146127dd5760405162461bcd60e51b815260206004820152602660248201527f54686973207472616e73616374696f6e2077617320657865637574656420616c6044820152653932b0b23c9760d11b6064820152608401610a2d565b6001600160a01b0388166000908152600a6020526040812080549161280183615249565b919050555060005b86811015612955576000888883818110612825576128256152c5565b90506020020135905061283e81600160ff1b9081161490565b156128da576000818152600c60205260409020546001600160a01b038b81169116146128ac5760405162461bcd60e51b815260206004820152601660248201527f596f7520617265206e6f7420746865206f776e65722e000000000000000000006044820152606401610a2d565b6000818152600c60205260409020805473ffffffffffffffffffffffffffffffffffffffff19169055612944565b60008787848181106128ee576128ee6152c5565b90506020020135905080600b600084815260200190815260200160002060008d6001600160a01b03166001600160a01b03168152602001908152602001600020600082825461293d9190615296565b9091555050505b5061294e81615249565b9050612809565b5060006001600160a01b0316886001600160a01b0316336001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8a8a8a8a6040516129aa949392919061532a565b60405180910390a4505050505050505050565b6129c56141e7565b6001805460ff191690556040517f83b03c3d41b5de9902c98822951ff375666c0cd7fd69f8993c0267ad087734d190600090a1565b612a02613582565b6001600160a01b038516612a585760405162461bcd60e51b815260206004820152601b60248201527f63616e6e6f742073656e6420746f207a65726f206164647265737300000000006044820152606401610a2d565b6001600160a01b038616331480612a9757506001600160a01b0386166000908152600d6020908152604080832033845290915290205460ff1615156001145b612afb5760405162461bcd60e51b815260206004820152602f60248201527f4e656564206f70657261746f7220617070726f76616c20666f7220337264207060448201526e30b93a3c903a3930b739b332b9399760891b6064820152608401610a2d565b600160ff1b80851603612b67576000848152600c60205260409020546001600160a01b03878116911614612b2e57600080fd5b6000848152600c60205260409020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038716179055612bf1565b6000848152600b602090815260408083206001600160a01b038a168452909152902054612b95908490615296565b6000858152600b602090815260408083206001600160a01b038b81168552925280832093909355871681522054612bcd9084906152ad565b6000858152600b602090815260408083206001600160a01b038a1684529091529020555b60408051858152602081018590526001600160a01b03808816929089169133917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611e98338787878787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250613bf692505050565b612c88613582565b6000612db2612dac612d598d8d8d8d80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508c8c80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508d92508c915061428e9050565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b8d613636565b9050806001600160a01b03168b6001600160a01b03161480612dfe57506001600160a01b03808c166000908152600d602090815260408083209385168352929052205460ff1615156001145b612e625760405162461bcd60e51b815260206004820152602f60248201527f4e656564206f70657261746f7220617070726f76616c20666f7220337264207060448201526e30b93a3c903a3930b739b332b9399760891b6064820152608401610a2d565b878614612eb15760405162461bcd60e51b815260206004820152601860248201527f4172726179206c656e677468206d757374206d617463682e00000000000000006044820152606401610a2d565b814210612f0f5760405162461bcd60e51b815260206004820152602660248201527f54686973207472616e73616374696f6e206973206e6f742076616c696420616e6044820152653cb6b7b9329760d11b6064820152608401610a2d565b6001600160a01b038b166000908152600a60205260409020548314612f855760405162461bcd60e51b815260206004820152602660248201527f54686973207472616e73616374696f6e2077617320657865637574656420616c6044820152653932b0b23c9760d11b6064820152608401610a2d565b6001600160a01b038b166000908152600a60205260408120805491612fa983615249565b90915550506001600160a01b038a166130045760405162461bcd60e51b815260206004820152601b60248201527f63616e6e6f742073656e6420746f207a65726f206164647265737300000000006044820152606401610a2d565b8786146130535760405162461bcd60e51b815260206004820152601760248201527f4172726179206c656e677468206d757374206d617463680000000000000000006044820152606401610a2d565b60005b88811015613235576130868a8a83818110613073576130736152c5565b90506020020135600160ff1b9081161490565b1561312d578b6001600160a01b0316600c60008c8c858181106130ab576130ab6152c5565b60209081029290920135835250810191909152604001600020546001600160a01b0316146130d857600080fd5b8a600c60008c8c858181106130ef576130ef6152c5565b90506020020135815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b03160217905550613225565b87878281811061313f5761313f6152c5565b90506020020135600b60008c8c8581811061315c5761315c6152c5565b90506020020135815260200190815260200160002060008e6001600160a01b03166001600160a01b0316815260200190815260200160002060008282546131a39190615296565b9091555088905087828181106131bb576131bb6152c5565b90506020020135600b60008c8c858181106131d8576131d86152c5565b90506020020135815260200190815260200160002060008d6001600160a01b03166001600160a01b03168152602001908152602001600020600082825461321f91906152ad565b90915550505b61322e81615249565b9050613056565b50896001600160a01b03168b6001600160a01b0316336001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8c8c8c8c604051613289949392919061532a565b60405180910390a4613346338c8c8c8c80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508b8b8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020601f8f018190048102820181019092528d815292508d91508c9081908401838280828437600092019190915250613f0e92505050565b505050505050505050505050565b61335c6136b1565b8261336681613803565b600160ff1b808516146133e15760405162461bcd60e51b815260206004820152602760248201527f5468697320747970654964206973206e6f742061206e6f6e2066756e6769626c60448201527f6520747970652e000000000000000000000000000000000000000000000000006064820152608401610a2d565b6000848152600660205260408120546133fb9060016152ad565b60008681526006602052604081208054929350859290919061341e9084906152ad565b90915550600090505b83811015613511576000858583818110613443576134436152c5565b90506020020160208101906134589190614bb5565b9050600061346683856152ad565b88176000818152600c60209081526040808320805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038816908117909155815185815260019381019390935293945033917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46134fe33338484600160405180602001604052806000815250613bf6565b50508061350a90615249565b9050613427565b50600085815260076020908152604080832054600690925290912054111561357b5760405162461bcd60e51b815260206004820152600d60248201527f4f7574206f662073746f636b2e000000000000000000000000000000000000006044820152606401610a2d565b5050505050565b6001805460ff161515146135d85760405162461bcd60e51b815260206004820152601a60248201527f54686520636f6e7472616374206973206e6f74206163746976650000000000006044820152606401610a2d565b565b6040516bffffffffffffffffffffffff19606086901b16602082015283151560f81b603482015260358101839052605581018290526000906075015b604051602081830303815290604052805190602001209050949350505050565b600081516041146136895760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610a2d565b60208201516040830151606084015160001a6136a7868285856142ad565b9695505050505050565b336136bc6003612449565b6001600160a01b0316146135d85760405162461bcd60e51b815260206004820152604360248201527f556e617574686f72697a65642063616c6c2e205468616e6b7320666f7220737560448201527f70706f7274696e6720746865206e6574776f726b207769746820796f7572204560648201527f54482e0000000000000000000000000000000000000000000000000000000000608482015260a401610a2d565b600280546000918261376f83615249565b909155505060025460009081526005602081905260409091208054849260ff199091169060019084908111156137a7576137a7614dd7565b02179055508160058111156137be576137be614dd7565b7fd5773e0c12c5a7e1b711e66c7b9f3fe7c25cb73e0fdd332614a0a35bed00801b600254856040516137f1929190615444565b60405180910390a25060025492915050565b60008181526007602052604081205490036123ea5760405162461bcd60e51b815260206004820152601660248201527f54797065496420646f6573206e6f742065786973742e000000000000000000006044820152606401610a2d565b600160ff1b808216036138d1576000818152600c60205260409020546001600160a01b03166123ea5760405162461bcd60e51b815260206004820152601760248201527f546f6b656e496420646f6573206e6f742065786973742e0000000000000000006044820152606401610a2d565b6138da81611a0e565b6000036123ea5760405162461bcd60e51b815260206004820152601760248201527f546f6b656e496420646f6573206e6f742065786973742e0000000000000000006044820152606401610a2d565b600254811115801561393a57508015155b6123ea5760405162461bcd60e51b815260206004820152601b60248201527f496e76616c69642070726f7065727479207265717565737465642e00000000006044820152606401610a2d565b80600581111561399857613998614dd7565b60008381526005602081905260409091205460ff16908111156139bd576139bd614dd7565b146123e85760405162461bcd60e51b815260206004820152603760248201527f54686520676976656e2070726f706572747920696420646f6573206e6f74206d60448201527f61746368207468652070726f706572747920747970652e0000000000000000006064820152608401610a2d565b606081600003613a7357505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115613a9d5780613a8781615249565b9150613a969050600a83615465565b9150613a77565b60008167ffffffffffffffff811115613ab857613ab8614870565b6040519080825280601f01601f191660200182016040528015613ae2576020820181803683370190505b509050815b8515613b6f57613af8600182615296565b90506000613b07600a88615465565b613b1290600a615487565b613b1c9088615296565b613b279060306154a6565b905060008160f81b905080848481518110613b4457613b446152c5565b60200101906001600160f81b031916908160001a905350613b66600a89615465565b97505050613ae7565b50949350505050565b6060610bf28383604051806020016040528060008152506040518060200160405280600081525060405180602001604052806000815250614456565b600087878787878787604051602001613bd397969594939291906154cb565b604051602081830303815290604052805190602001209050979650505050505050565b6001600160a01b0384163b15611e985760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190613c3a908990899088908890889060040161552b565b6020604051808303816000875af1925050508015613c75575060408051601f3d908101601f19168201909252613c7291810190615563565b60015b613d2a57613c81615580565b806308c379a003613cba5750613c9561559c565b80613ca05750613cbc565b8060405162461bcd60e51b8152600401610a2d9190614ae8565b505b60405162461bcd60e51b815260206004820152603960248201527f455243313135353a207472616e7366657220746f206e6f6e204552433131353560448201527f546f6b656e526563656976657220696d706c656d656e746572000000000000006064820152608401610a2d565b7fffffffff00000000000000000000000000000000000000000000000000000000811663f23a6e6160e01b14613dc85760405162461bcd60e51b815260206004820152602d60248201527f455243313135353a2045524331313535546f6b656e526563656976657220726560448201527f6a656374656420746f6b656e73000000000000000000000000000000000000006064820152608401610a2d565b50505050505050565b80600003613e49576040805162461bcd60e51b81526020600482015260248101919091527f4120302074696d657374616d70206973206e6f7420616c6c6f7765642e20466f60448201527f7220696d6d6564696174652072656c656173652063686f6f736520313333372e6064820152608401610a2d565b6000828152600860205260409020541580613e71575060008281526008602052604090205442105b613ebd5760405162461bcd60e51b815260206004820152601f60248201527f5468697320746f6b656e2069732072656c656173656420616c72656164792e006044820152606401610a2d565b600082815260086020526040908190208290555182907fbb3d1cf2b9311031fc607cdae1b14e022317b838640f988d4ec0d7cf4e81c61090613f029084815260200190565b60405180910390a25050565b6001600160a01b0384163b15611e985760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190613f529089908990889088908890600401615626565b6020604051808303816000875af1925050508015613f8d575060408051601f3d908101601f19168201909252613f8a91810190615563565b60015b61402857613f99615580565b806308c379a003613fb85750613fad61559c565b80613ca05750613fba565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e204552433131353560448201527f526563656976657220696d706c656d656e7465720000000000000000000000006064820152608401610a2d565b7fffffffff00000000000000000000000000000000000000000000000000000000811663bc197c8160e01b14613dc85760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a6563746560448201527f6420746f6b656e730000000000000000000000000000000000000000000000006064820152608401610a2d565b600081158015906140e857507001000000000000000000000000000000008211155b61415a5760405162461bcd60e51b815260206004820152603a60248201527f4d696e696d756d203120616e64206d6178696d756d20322a2a31323820746f6b60448201527f656e73206f66206f6e6520747970652063616e2065786973742e0000000000006064820152608401610a2d565b6000608060036000815461416d90615249565b9182905550901b9050831561418357600160ff1b175b60008181526007602090815260408083208690556003548352600982528083208490558051848152918201839052829133917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a49392505050565b60015461010090046001600160a01b031633148061421f575061420a6001612449565b6001600160a01b0316336001600160a01b0316145b6135d85760405162461bcd60e51b815260206004820152601160248201527f556e617574686f72697a65642063616c6c0000000000000000000000000000006044820152606401610a2d565b61420a6001612449565b60008484848460405160200161361694939291906156a9565b600087878787878787604051602001613bd397969594939291906156d1565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a082111561432a5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610a2d565b8360ff16601b148061433f57508360ff16601c145b6143965760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610a2d565b6040805160008082526020820180845288905260ff871692820192909252606081018590526080810184905260019060a0016020604051602081039080840390855afa1580156143ea573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661444d5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610a2d565b95945050505050565b805182518451865188516060948a948a948a948a948a9460009490939092909161448091906152ad565b61448a91906152ad565b61449491906152ad565b61449e91906152ad565b67ffffffffffffffff8111156144b6576144b6614870565b6040519080825280601f01601f1916602001820160405280156144e0576020820181803683370190505b509050806000805b885181101561455857888181518110614503576145036152c5565b01602001516001600160f81b031916838361451d81615249565b94508151811061452f5761452f6152c5565b60200101906001600160f81b031916908160001a9053508061455081615249565b9150506144e8565b5060005b87518110156145cc57878181518110614577576145776152c5565b01602001516001600160f81b031916838361459181615249565b9450815181106145a3576145a36152c5565b60200101906001600160f81b031916908160001a905350806145c481615249565b91505061455c565b5060005b8651811015614640578681815181106145eb576145eb6152c5565b01602001516001600160f81b031916838361460581615249565b945081518110614617576146176152c5565b60200101906001600160f81b031916908160001a9053508061463881615249565b9150506145d0565b5060005b85518110156146b45785818151811061465f5761465f6152c5565b01602001516001600160f81b031916838361467981615249565b94508151811061468b5761468b6152c5565b60200101906001600160f81b031916908160001a905350806146ac81615249565b915050614644565b5060005b8451811015614728578481815181106146d3576146d36152c5565b01602001516001600160f81b03191683836146ed81615249565b9450815181106146ff576146ff6152c5565b60200101906001600160f81b031916908160001a9053508061472081615249565b9150506146b8565b50909d9c50505050505050505050505050565b82805461474790615262565b90600052602060002090601f01602090048101928261476957600085556147af565b82601f106147825782800160ff198235161785556147af565b828001600101855582156147af579182015b828111156147af578235825591602001919060010190614794565b506147bb9291506147bf565b5090565b5b808211156147bb57600081556001016147c0565b6001600160a01b03811681146123ea57600080fd5b80356147f4816147d4565b919050565b6000806040838503121561480c57600080fd5b8235614817816147d4565b946020939093013593505050565b7fffffffff00000000000000000000000000000000000000000000000000000000811681146123ea57600080fd5b60006020828403121561486557600080fd5b8135610bf281614825565b634e487b7160e01b600052604160045260246000fd5b601f8201601f1916810167ffffffffffffffff811182821017156148ac576148ac614870565b6040525050565b600082601f8301126148c457600080fd5b813567ffffffffffffffff8111156148de576148de614870565b6040516148f5601f8301601f191660200182614886565b81815284602083860101111561490a57600080fd5b816020850160208301376000918101602001919091529392505050565b80151581146123ea57600080fd5b60008060008060008060c0878903121561494e57600080fd5b863567ffffffffffffffff81111561496557600080fd5b61497189828a016148b3565b9650506020870135614982816147d4565b94506040870135614992816147d4565b935060608701356149a281614927565b9598949750929560808101359460a0909101359350915050565b60008083601f8401126149ce57600080fd5b50813567ffffffffffffffff8111156149e657600080fd5b6020830191508360208285010111156149fe57600080fd5b9250929050565b60008060208385031215614a1857600080fd5b823567ffffffffffffffff811115614a2f57600080fd5b614a3b858286016149bc565b90969095509350505050565b600060208284031215614a5957600080fd5b5035919050565b600080600060608486031215614a7557600080fd5b505081359360208301359350604090920135919050565b60005b83811015614aa7578181015183820152602001614a8f565b83811115614ab6576000848401525b50505050565b60008151808452614ad4816020860160208601614a8c565b601f01601f19169290920160200192915050565b602081526000610bf26020830184614abc565b60008060008060008060008060006101008a8c031215614b1a57600080fd5b893567ffffffffffffffff80821115614b3257600080fd5b614b3e8d838e016148b3565b9a5060208c01359150614b50826147d4565b90985060408b013590614b62826147d4565b90975060608b0135965060808b0135955060a08b01359080821115614b8657600080fd5b50614b938c828d016149bc565b9a9d999c50979a96999598959660c08101359660e09091013595509350505050565b600060208284031215614bc757600080fd5b8135610bf2816147d4565b600081518084526020808501945080840160005b83811015614c0257815187529582019590820190600101614be6565b509495945050505050565b604081526000614c206040830185614bd2565b828103602084015261444d8185614bd2565b60008060408385031215614c4557600080fd5b50508035926020909101359150565b60008083601f840112614c6657600080fd5b50813567ffffffffffffffff811115614c7e57600080fd5b6020830191508360208260051b85010111156149fe57600080fd5b60008060008060008060008060a0898b031215614cb557600080fd5b8835614cc0816147d4565b97506020890135614cd0816147d4565b9650604089013567ffffffffffffffff80821115614ced57600080fd5b614cf98c838d01614c54565b909850965060608b0135915080821115614d1257600080fd5b614d1e8c838d01614c54565b909650945060808b0135915080821115614d3757600080fd5b50614d448b828c016149bc565b999c989b5096995094979396929594505050565b60008060008060408587031215614d6e57600080fd5b843567ffffffffffffffff80821115614d8657600080fd5b614d9288838901614c54565b90965094506020870135915080821115614dab57600080fd5b50614db887828801614c54565b95989497509550505050565b602081526000610bf26020830184614bd2565b634e487b7160e01b600052602160045260246000fd5b6020810160068310614e0f57634e487b7160e01b600052602160045260246000fd5b91905290565b600080600060608486031215614e2a57600080fd5b83359250602084013591506040840135614e43816147d4565b809150509250925092565b600080600080600060608688031215614e6657600080fd5b85359450602086013567ffffffffffffffff80821115614e8557600080fd5b614e9189838a01614c54565b90965094506040880135915080821115614eaa57600080fd5b50614eb788828901614c54565b969995985093965092949392505050565b60008060008060608587031215614ede57600080fd5b8435935060208501359250604085013567ffffffffffffffff811115614f0357600080fd5b614db887828801614c54565b60008060408385031215614f2257600080fd5b8235614f2d816147d4565b91506020830135614f3d81614927565b809150509250929050565b60008060008060608587031215614f5e57600080fd5b8435935060208501359250604085013567ffffffffffffffff811115614f8357600080fd5b614db8878288016149bc565b60008060008060008060008060c0898b031215614fab57600080fd5b883567ffffffffffffffff80821115614fc357600080fd5b614fcf8c838d016148b3565b995060208b01359150614fe1826147d4565b90975060408a01359080821115614ff757600080fd5b6150038c838d01614c54565b909850965060608b013591508082111561501c57600080fd5b506150298b828c01614c54565b999c989b5096999598969760808701359660a0013595509350505050565b6000806040838503121561505a57600080fd5b8235615065816147d4565b91506020830135614f3d816147d4565b60008060008060008060a0878903121561508e57600080fd5b8635615099816147d4565b955060208701356150a9816147d4565b94506040870135935060608701359250608087013567ffffffffffffffff8111156150d357600080fd5b6150df89828a016149bc565b979a9699509497509295939492505050565b60008060008060008060008060008060006101008c8e03121561511357600080fd5b67ffffffffffffffff808d35111561512a57600080fd5b6151378e8e358f016148b3565b9b5061514560208e016147e9565b9a5061515360408e016147e9565b99508060608e0135111561516657600080fd5b6151768e60608f01358f01614c54565b909950975060808d013581101561518c57600080fd5b61519c8e60808f01358f01614c54565b909750955060a08d01358110156151b257600080fd5b506151c38d60a08e01358e016149bc565b9b9e9a9d50989b979a96999598949794969560c08601359560e00135945092505050565b6000806000604084860312156151fc57600080fd5b83359250602084013567ffffffffffffffff81111561521a57600080fd5b61522686828701614c54565b9497909650939450505050565b634e487b7160e01b600052601160045260246000fd5b60006001820161525b5761525b615233565b5060010190565b600181811c9082168061527657607f821691505b602082108103610c1757634e487b7160e01b600052602260045260246000fd5b6000828210156152a8576152a8615233565b500390565b600082198211156152c0576152c0615233565b500190565b634e487b7160e01b600052603260045260246000fd5b81835260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83111561530d57600080fd5b8260051b8083602087013760009401602001938452509192915050565b60408152600061533e6040830186886152db565b82810360208401526153518185876152db565b979650505050505050565b60208082528181018390526000908460408401835b8681101561539f578235615384816147d4565b6001600160a01b031682529183019190830190600101615371565b509695505050505050565b6000602082840312156153bc57600080fd5b8151610bf281614927565b60208082528181018390526000908460408401835b8681101561539f578235825291830191908301906001016153dc565b60006020828403121561540a57600080fd5b8151610bf2816147d4565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b82815260406020820152600061545d6040830184614abc565b949350505050565b60008261548257634e487b7160e01b600052601260045260246000fd5b500490565b60008160001904831182151516156154a1576154a1615233565b500290565b600060ff821660ff84168060ff038211156154c3576154c3615233565b019392505050565b60006bffffffffffffffffffffffff19808a60601b168352808960601b16601484015250866028830152856048830152845161550e816068850160208901614a8c565b909101606881019390935250608882015260a80195945050505050565b60006001600160a01b03808816835280871660208401525084604083015283606083015260a0608083015261535160a0830184614abc565b60006020828403121561557557600080fd5b8151610bf281614825565b600060033d11156155995760046000803e5060005160e01c5b90565b600060443d10156155aa5790565b6040516003193d81016004833e81513d67ffffffffffffffff81602484011181841117156155da57505050505090565b82850191508151818111156155f25750505050505090565b843d870101602082850101111561560c5750505050505090565b61561b60208286010187614886565b509095945050505050565b60006001600160a01b03808816835280871660208401525060a0604083015261565260a0830186614bd2565b82810360608401526156648186614bd2565b905082810360808401526156788185614abc565b98975050505050505050565b80516000906020808401838315614c0257815187529582019590820190600101614be6565b60006156be6156b88388615684565b86615684565b9384525050602082015260400192915050565b60006bffffffffffffffffffffffff19808a60601b168352808960601b1660148401525061570b6157056028840189615684565b87615684565b855161571b818360208a01614a8c565b01938452505060208201526040019594505050505056fea26469706673582212202c6fcdf77fd149f38aa1de58f981c360792199843617d22f495b6fb5c4385e6464736f6c634300080e003300000000000000000000000028ee561d8f0764fd17f1416e2d2ad15a8e0375a9
Deployed ByteCode Sourcemap
69547:40551:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;96484:254;;;;;;:::i;:::-;;:::i;:::-;;;778:25:1;;;766:2;751:18;96484:254:0;;;;;;;;37946:183;;;;;;:::i;:::-;38088:33;;38059:4;38088:33;;;;;;;;;;;;;;37946:183;;;;1411:14:1;;1404:22;1386:41;;1374:2;1359:18;37946:183:0;1246:187:1;77745:1111:0;;;;;;:::i;:::-;;:::i;:::-;;84062:218;;;;;;:::i;:::-;;:::i;94386:205::-;;;;;;:::i;:::-;;:::i;84764:380::-;;;;;;:::i;:::-;;:::i;91039:155::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;70122:71::-;;-1:-1:-1;;70122:71:0;;94279:99;94360:10;;94279:99;;73545:2055;;;;;;:::i;:::-;;:::i;83830:224::-;;;;;;:::i;:::-;;:::i;93227:1044::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;90333:228::-;;;;;;:::i;:::-;;:::i;80389:1432::-;;;;;;:::i;:::-;;:::i;87376:319::-;;;;;;:::i;:::-;;:::i;84288:226::-;;;;;;:::i;:::-;;:::i;87703:317::-;;;;;;:::i;:::-;;:::i;69980:48::-;;70022:6;69980:48;;85959:384;;;;;;:::i;:::-;;:::i;96746:634::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;70262:59::-;;;;;94806:170;;;;;;:::i;:::-;-1:-1:-1;;;;;94942:26:0;94910:7;94942:26;;;:18;:26;;;;;;;94806:170;94599:199;;;;;;:::i;:::-;;:::i;96091:269::-;;;;;;:::i;:::-;;:::i;91428:279::-;;;:::i;96368:108::-;;;;;;:::i;:::-;96428:7;96455:13;;;:8;:13;;;;;;-1:-1:-1;;;;;96455:13:0;;96368:108;;;;-1:-1:-1;;;;;11355:55:1;;;11337:74;;11325:2;11310:18;96368:108:0;11191:226:1;90683:230:0;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;85558:393::-;;;;;;:::i;:::-;;:::i;90921:110::-;91008:15;;90921:110;;83600:222;;;;;;:::i;:::-;;:::i;95631:166::-;;;;;;:::i;:::-;-1:-1:-1;;95774:15:0;;95631:166;95805:278;;;;;;:::i;:::-;;:::i;46640:131::-;;;:::i;89073:1252::-;;;;;;:::i;:::-;;:::i;87192:176::-;;;;;;:::i;:::-;;:::i;83376:216::-;;;;;;:::i;:::-;;:::i;86765:419::-;;;;;;:::i;:::-;;:::i;91715:300::-;;;;;;:::i;:::-;;:::i;95456:167::-;;;;;;:::i;:::-;95602:13;95596:19;;95456:167;92023:1196;;;;;;:::i;:::-;;:::i;78864:255::-;;;;;;:::i;:::-;;:::i;91202:218::-;;;;;;:::i;:::-;;:::i;46923:613::-;;;;;;:::i;:::-;;:::i;86351:406::-;;;;;;:::i;:::-;;:::i;95331:117::-;;;;;;:::i;:::-;-1:-1:-1;;;95418:17:0;:22;;95331:117;47879:175;;;;;;:::i;:::-;;:::i;84522:234::-;;;;;;:::i;:::-;;:::i;85152:398::-;;;;;;:::i;:::-;;:::i;70662:30::-;;;;;;81943:1425;;;;;;:::i;:::-;;:::i;70392:46::-;;-1:-1:-1;;;70392:46:0;;95193:130;;;;;;:::i;:::-;-1:-1:-1;;;95283:17:0;;;:32;;95193:130;94984:201;;;;;;:::i;:::-;-1:-1:-1;;;;;95142:24:0;;;95113:4;95142:24;;;:16;:24;;;;;;;;:35;;;;;;;;;;;;;;;94984:201;46779:136;;;:::i;47760:111::-;47847:16;;;;;-1:-1:-1;;;;;47847:16:0;47760:111;;79127:1254;;;;;;:::i;:::-;;:::i;75608:2129::-;;;;;;:::i;:::-;;:::i;88028:1037::-;;;;;;:::i;:::-;;:::i;47658:94::-;47735:9;;;;47658:94;;96484:254;96600:7;96629:22;96647:3;96629:17;:22::i;:::-;96625:66;;;96660:13;;;;:8;:13;;;;;;-1:-1:-1;;;;;96660:23:0;;;:13;;:23;:31;;96690:1;96660:31;;;96686:1;96660:31;96653:38;;;;;;96625:66;-1:-1:-1;96709:13:0;;;;:8;:13;;;;;;;;-1:-1:-1;;;;;96709:21:0;;;;;;;;;;96484:254;;;;;:::o;77745:1111::-;45656:16;:14;:16::i;:::-;78016::::1;78035:131;78075:9;78099;78123:5;78143:12;78035:25;:131::i;:::-;78016:150;;78177:26;78206:101;78234:38;78263:8;66450:58:::0;;31378:66:1;66450:58:0;;;31366:79:1;31461:12;;;31454:28;;;66281:7:0;;31498:12:1;;66450:58:0;;;;;;;;;;;;66422:101;;;;;;66402:121;;66185:346;;;;78234:38:::1;78287:9;78206:13;:101::i;:::-;78177:130;;78348:6;-1:-1:-1::0;;;;;78326:28:0::1;:18;-1:-1:-1::0;;;;;78326:28:0::1;;78318:59;;;::::0;-1:-1:-1;;;78318:59:0;;20047:2:1;78318:59:0::1;::::0;::::1;20029:21:1::0;20086:2;20066:18;;;20059:30;20125:20;20105:18;;;20098:48;20163:18;;78318:59:0::1;;;;;;;;;78428:12;78410:15;:30;78388:118;;;::::0;-1:-1:-1;;;78388:118:0;;20394:2:1;78388:118:0::1;::::0;::::1;20376:21:1::0;20433:2;20413:18;;;20406:30;20472:34;20452:18;;;20445:62;-1:-1:-1;;;20523:18:1;;;20516:36;20569:19;;78388:118:0::1;20192:402:1::0;78388:118:0::1;-1:-1:-1::0;;;;;78539:26:0;::::1;;::::0;;;:18:::1;:26;::::0;;;;;:35;::::1;78517:123;;;::::0;-1:-1:-1;;;78517:123:0;;20801:2:1;78517:123:0::1;::::0;::::1;20783:21:1::0;20840:2;20820:18;;;20813:30;20879:34;20859:18;;;20852:62;-1:-1:-1;;;20930:18:1;;;20923:36;20976:19;;78517:123:0::1;20599:402:1::0;78517:123:0::1;-1:-1:-1::0;;;;;78651:26:0;::::1;;::::0;;;:18:::1;:26;::::0;;;;:28;;;::::1;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;78717:36:0;;::::1;;::::0;;;:16:::1;:36;::::0;;;;;;;:47;;::::1;::::0;;;;;;;;;;:59;;-1:-1:-1;;78717:59:0::1;::::0;::::1;;::::0;;::::1;::::0;;;78792:56;;1386:41:1;;;78792:56:0::1;::::0;1359:18:1;78792:56:0::1;;;;;;;;77976:880;;77745:1111:::0;;;;;;:::o;84062:218::-;84200:7;72421:27;:25;:27::i;:::-;84232:40:::1;84248:4;;84232:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;84254:17:0::1;::::0;-1:-1:-1;84232:15:0::1;::::0;-1:-1:-1;;84232:40:0:i:1;:::-;84225:47:::0;84062:218;-1:-1:-1;;;84062:218:0:o;94386:205::-;94524:7;94498:6;72526:22;72541:6;72526:14;:22::i;:::-;94556:27:::1;::::0;;;:19:::1;:27;::::0;;;;;;-1:-1:-1;72559:1:0::1;94386:205:::0;;;;:::o;84764:380::-;72421:27;:25;:27::i;:::-;84968:7:::1;72061:22;72075:7;72061:13;:22::i;:::-;85002:10:::2;72167:28;72184:10;72167:16;:28::i;:::-;85038:10:::3;85050:16;72305:41;72321:10;72333:12;72305:15;:41::i;:::-;85118:10:::4;85109:7;85089:47;85130:5;85089:47;;;;778:25:1::0;;766:2;751:18;;632:177;85089:47:0::4;;;;;;;;72206:1:::3;;72094::::2;72459::::1;84764:380:::0;;;:::o;91039:155::-;91095:13;91128:58;91146:16;91128:58;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;91164:21;91181:3;91164:16;:21::i;:::-;91128:17;:58::i;73545:2055::-;45656:16;:14;:16::i;:::-;73862::::1;73881:184;73924:6;73945:3;73963;73981:6;74002:5;;73881:184;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;74022:5:0;;-1:-1:-1;74042:12:0;;-1:-1:-1;73881:28:0::1;::::0;-1:-1:-1;73881:184:0:i:1;:::-;73862:203;;74076:26;74105:101;74133:38;74162:8;66450:58:::0;;31378:66:1;66450:58:0;;;31366:79:1;31461:12;;;31454:28;;;66281:7:0;;31498:12:1;;66450:58:0;;;;;;;;;;;;66422:101;;;;;;66402:121;;66185:346;;;;74133:38:::1;74186:9;74105:13;:101::i;:::-;74076:130;;74249:18;-1:-1:-1::0;;;;;74239:28:0::1;:6;-1:-1:-1::0;;;;;74239:28:0::1;;:101;;;-1:-1:-1::0;;;;;;74288:24:0;;::::1;;::::0;;;:16:::1;:24;::::0;;;;;;;:44;;::::1;::::0;;;;;;;::::1;;:52;;:44:::0;:52:::1;74239:101;74217:198;;;::::0;-1:-1:-1;;;74217:198:0;;22159:2:1;74217:198:0::1;::::0;::::1;22141:21:1::0;22198:2;22178:18;;;22171:30;22237:34;22217:18;;;22210:62;-1:-1:-1;;;22288:18:1;;;22281:45;22343:19;;74217:198:0::1;21957:411:1::0;74217:198:0::1;74466:12;74448:15;:30;74426:118;;;::::0;-1:-1:-1;;;74426:118:0;;20394:2:1;74426:118:0::1;::::0;::::1;20376:21:1::0;20433:2;20413:18;;;20406:30;20472:34;20452:18;;;20445:62;-1:-1:-1;;;20523:18:1;;;20516:36;20569:19;;74426:118:0::1;20192:402:1::0;74426:118:0::1;-1:-1:-1::0;;;;;74577:26:0;::::1;;::::0;;;:18:::1;:26;::::0;;;;;:35;::::1;74555:123;;;::::0;-1:-1:-1;;;74555:123:0;;20801:2:1;74555:123:0::1;::::0;::::1;20783:21:1::0;20840:2;20820:18;;;20813:30;20879:34;20859:18;;;20852:62;-1:-1:-1;;;20930:18:1;;;20923:36;20976:19;;74555:123:0::1;20599:402:1::0;74555:123:0::1;-1:-1:-1::0;;;;;74689:26:0;::::1;;::::0;;;:18:::1;:26;::::0;;;;:28;;;::::1;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;74763:19:0;::::1;74755:59;;;::::0;-1:-1:-1;;;74755:59:0;;22575:2:1;74755:59:0::1;::::0;::::1;22557:21:1::0;22614:2;22594:18;;;22587:30;22653:29;22633:18;;;22626:57;22700:18;;74755:59:0::1;22373:351:1::0;74755:59:0::1;-1:-1:-1::0;;;95283:17:0;;;:32;74825:525:::1;;74872:13;::::0;;;:8:::1;:13;::::0;;;;;-1:-1:-1;;;;;74872:23:0;;::::1;:13:::0;::::1;:23;74864:32;;;::::0;::::1;;74911:13;::::0;;;:8:::1;:13;::::0;;;;:19;;-1:-1:-1;;74911:19:0::1;-1:-1:-1::0;;;;;74911:19:0;::::1;;::::0;;74825:525:::1;;;75264:13;::::0;;;:8:::1;:13;::::0;;;;;;;-1:-1:-1;;;;;75264:21:0;::::1;::::0;;;;;;;:31;;75289:6;;75264:13;:31:::1;::::0;75289:6;;75264:31:::1;:::i;:::-;::::0;;;-1:-1:-1;;75310:13:0::1;::::0;;;:8:::1;:13;::::0;;;;;;;-1:-1:-1;;;;;75310:18:0;::::1;::::0;;;;;;;:28;;75332:6;;75310:13;:28:::1;::::0;75332:6;;75310:28:::1;:::i;:::-;::::0;;;-1:-1:-1;;74825:525:0::1;75365:52;::::0;;23166:25:1;;;23222:2;23207:18;;23200:34;;;-1:-1:-1;;;;;75365:52:0;;::::1;::::0;;;::::1;::::0;75380:10:::1;::::0;75365:52:::1;::::0;23139:18:1;75365:52:0::1;;;;;;;75428:164;75473:10;75498:6;75519:3;75537;75555:6;75576:5;;75428:164;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;75428:30:0::1;::::0;-1:-1:-1;;;75428:164:0:i:1;:::-;73822:1778;;73545:2055:::0;;;;;;;;;:::o;83830:224::-;83971:7;72421:27;:25;:27::i;:::-;84003:43:::1;84019:4;;84003:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;84025:20:0::1;::::0;-1:-1:-1;84003:15:0::1;::::0;-1:-1:-1;;84003:43:0:i:1;93227:1044::-:0;93335:16;;93387:15;93430:1;93413:262;93438:10;;93433:1;:15;93413:262;;93492:3;93487:8;;;93470:14;93514:24;;;:16;:24;;;;;;:29;93510:154;;93594:1;93568:16;;;:8;:16;;;;;;;;-1:-1:-1;;;;;93568:23:0;;;;;;;;;;:27;93564:85;;93620:9;;;;:::i;:::-;;;;93564:85;-1:-1:-1;93450:3:0;;;;:::i;:::-;;;;93413:262;;;;93687:26;93730:7;93716:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;93716:22:0;;93687:51;;93749:30;93796:7;93782:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;93782:22:0;-1:-1:-1;93825:1:0;;-1:-1:-1;93749:55:0;-1:-1:-1;93854:1:0;93837:383;93862:10;;93857:1;:15;93837:383;;93916:3;93911:8;;;93894:14;93938:24;;;:16;:24;;;;;;:29;93934:275;;94018:1;93992:16;;;:8;:16;;;;;;;;-1:-1:-1;;;;;93992:23:0;;;;;;;;;;:27;93988:206;;94065:6;94044:9;94054:7;94044:18;;;;;;;;:::i;:::-;;;;;;;;;;;:27;;;;94119:16;;;;:8;:16;;;;;;-1:-1:-1;;;;;94119:23:0;;;;;;;;;94094:22;;:13;;94108:7;;94094:22;;;;;;:::i;:::-;;;;;;;;;;:48;94165:9;;;;:::i;:::-;;;;93988:206;-1:-1:-1;93874:3:0;;;;:::i;:::-;;;;93837:383;;;-1:-1:-1;94238:9:0;;94249:13;;-1:-1:-1;93227:1044:0;-1:-1:-1;;;93227:1044:0:o;90333:228::-;72421:27;:25;:27::i;:::-;90490:6:::1;72526:22;72541:6;72526:14;:22::i;:::-;90514:39:::2;90535:6;90543:9;90514:20;:39::i;:::-;72459:1:::1;90333:228:::0;;:::o;80389:1432::-;45656:16;:14;:16::i;:::-;-1:-1:-1;;;;;80621:19:0;::::1;80613:59;;;::::0;-1:-1:-1;;;80613:59:0;;22575:2:1;80613:59:0::1;::::0;::::1;22557:21:1::0;22614:2;22594:18;;;22587:30;22653:29;22633:18;;;22626:57;22700:18;;80613:59:0::1;22373:351:1::0;80613:59:0::1;80691:29:::0;;::::1;80683:65;;;::::0;-1:-1:-1;;;80683:65:0;;23636:2:1;80683:65:0::1;::::0;::::1;23618:21:1::0;23675:2;23655:18;;;23648:30;23714:25;23694:18;;;23687:53;23757:18;;80683:65:0::1;23434:347:1::0;80683:65:0::1;-1:-1:-1::0;;;;;80914:19:0;::::1;80923:10;80914:19;::::0;:66:::1;;-1:-1:-1::0;;;;;;80937:23:0;::::1;;::::0;;;:16:::1;:23;::::0;;;;;;;80961:10:::1;80937:35:::0;;;;;;;;::::1;;:43;;:35:::0;:43:::1;80914:66;80892:163;;;::::0;-1:-1:-1;;;80892:163:0;;22159:2:1;80892:163:0::1;::::0;::::1;22141:21:1::0;22198:2;22178:18;;;22171:30;22237:34;22217:18;;;22210:62;-1:-1:-1;;;22288:18:1;;;22281:45;22343:19;;80892:163:0::1;21957:411:1::0;80892:163:0::1;81073:9;81068:493;81088:15:::0;;::::1;81068:493;;;81193:10;81206:4;;81211:1;81206:7;;;;;;;:::i;:::-;;;;;;;81193:20;;81228:13;81244:7;;81252:1;81244:10;;;;;;;:::i;:::-;;;;;;;81228:26;;81275:17;81289:2;-1:-1:-1::0;;;95283:17:0;;;:32;;95193:130;81275:17:::1;81271:279;;;81321:12;::::0;;;:8:::1;:12;::::0;;;;;-1:-1:-1;;;;;81321:21:0;;::::1;:12:::0;::::1;:21;81313:30;;;::::0;::::1;;81362:12;::::0;;;:8:::1;:12;::::0;;;;:18;;-1:-1:-1;;81362:18:0::1;-1:-1:-1::0;;;;;81362:18:0;::::1;;::::0;;81271:279:::1;;;81443:12;::::0;;;:8:::1;:12;::::0;;;;;;;-1:-1:-1;;;;;81443:19:0;::::1;::::0;;;;;;;;:27:::1;::::0;81465:5;;81443:27:::1;:::i;:::-;81421:8;:12;81430:2;81421:12;;;;;;;;;;;:19;81434:5;-1:-1:-1::0;;;;;81421:19:0::1;-1:-1:-1::0;;;;;81421:19:0::1;;;;;;;;;;;;:49;;;;81517:8;:12;81526:2;81517:12;;;;;;;;;;;:17;81530:3;-1:-1:-1::0;;;;;81517:17:0::1;-1:-1:-1::0;;;;;81517:17:0::1;;;;;;;;;;;;;81509:5;:25;;;;:::i;:::-;81489:12;::::0;;;:8:::1;:12;::::0;;;;;;;-1:-1:-1;;;;;81489:17:0;::::1;::::0;;;;;;;:45;81271:279:::1;81110:451;;81105:3;;;;:::i;:::-;;;81068:493;;;;81611:3;-1:-1:-1::0;;;;;81578:52:0::1;81604:5;-1:-1:-1::0;;;;;81578:52:0::1;81592:10;-1:-1:-1::0;;;;;81578:52:0::1;;81616:4;;81622:7;;81578:52;;;;;;;;;:::i;:::-;;;;;;;;81643:170;81693:10;81718:5;81738:3;81756:4;;81643:170;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;81643:170:0::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;-1:-1:-1;81775:7:0;;-1:-1:-1;81775:7:0;;;;81643:170;::::1;::::0;81775:7;;81643:170;81775:7;81643:170;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;;81643:170:0::1;::::0;;::::1;;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;;;-1:-1:-1;81797:5:0;;-1:-1:-1;81797:5:0;;;;81643:170;::::1;81797:5:::0;;;;81643:170;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;81643:35:0::1;::::0;-1:-1:-1;;;81643:170:0:i:1;:::-;80389:1432:::0;;;;;;;;:::o;87376:319::-;87540:7;72421:27;:25;:27::i;:::-;87565:14:::1;87582:24;87590:4;87596:9;87582:7;:24::i;:::-;87565:41;;87617:46;87638:6;87646:16;87617:20;:46::i;84288:226::-:0;84430:7;72421:27;:25;:27::i;:::-;84462:44:::1;84478:4;;84462:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;84484:21:0::1;::::0;-1:-1:-1;84462:15:0::1;::::0;-1:-1:-1;;84462:44:0:i:1;87703:317::-:0;87864:7;72421:27;:25;:27::i;:::-;87889:14:::1;87906:25;87914:5;87921:9;87906:7;:25::i;85959:384::-:0;72421:27;:25;:27::i;:::-;86165:7:::1;72061:22;72075:7;72061:13;:22::i;:::-;86199:10:::2;72167:28;72184:10;72167:16;:28::i;:::-;86235:10:::3;86247:17;72305:41;72321:10;72333:12;72305:15;:41::i;:::-;86317:10:::4;86308:7;86287:48;86329:5;86287:48;;;;778:25:1::0;;766:2;751:18;;632:177;96746:634:0;96891:16;96933:29;;;96925:38;;;;;;96976:26;97019:7;97005:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;97005:29:0;;96976:58;;97052:9;97047:297;97067:18;;;97047:297;;;97107:10;97120:4;;97125:1;97120:7;;;;;;;:::i;:::-;;;;;;;97107:20;;97146:21;97164:2;97146:17;:21::i;:::-;97142:191;;;97219:7;;97227:1;97219:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;97203:12;;;;:8;:12;;;;;;-1:-1:-1;;;;;97203:12:0;;;:26;;;:34;;97236:1;97203:34;;;97232:1;97203:34;97188:49;;:9;97198:1;97188:12;;;;;;;;:::i;:::-;;;;;;:49;;;;;97142:191;;;97293:12;;;;:8;:12;;;;;;97306:7;;97314:1;97306:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;97293:24:0;-1:-1:-1;;;;;97293:24:0;;;;;;;;;;;;;97278:9;97288:1;97278:12;;;;;;;;:::i;:::-;;;;;;:39;;;;;97142:191;-1:-1:-1;97087:3:0;;;:::i;:::-;;;97047:297;;;-1:-1:-1;97363:9:0;96746:634;-1:-1:-1;;;;;96746:634:0:o;94599:199::-;94734:7;94708:6;72526:22;72541:6;72526:14;:22::i;:::-;-1:-1:-1;;94766:24:0::1;::::0;;;:16:::1;:24;::::0;;;;;;94599:199::o;96091:269::-;96197:4;-1:-1:-1;;;70430:8:0;96289:3;:17;:32;96288:64;;;;-1:-1:-1;;96333:13:0;96327:19;:24;;;96091:269::o;91428:279::-;91480:16;91509:26;91552:10;;91538:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;91538:25:0;;91509:54;;91579:9;91574:99;91598:10;;91594:1;:14;91574:99;;;91645:16;91655:5;:1;91659;91655:5;:::i;91645:16::-;91630:9;91640:1;91630:12;;;;;;;;:::i;:::-;;;;;;;;;;:31;91610:3;;;;:::i;:::-;;;;91574:99;;90683:230;90831:12;90801:10;72167:28;72184:10;72167:16;:28::i;:::-;-1:-1:-1;;90868:37:0::1;::::0;;;:25:::1;:37;::::0;;;;;::::1;;::::0;90683:230::o;85558:393::-;72421:27;:25;:27::i;:::-;85767:7:::1;72061:22;72075:7;72061:13;:22::i;:::-;85801:10:::2;72167:28;72184:10;72167:16;:28::i;:::-;85837:10:::3;85849:20;72305:41;72321:10;72333:12;72305:15;:41::i;:::-;85892:51:::4;::::0;-1:-1:-1;;;;;11355:55:1;;11337:74;;85925:10:0;;85916:7;;85892:51:::4;::::0;11325:2:1;11310:18;85892:51:0::4;11191:226:1::0;83600:222:0;83740:7;72421:27;:25;:27::i;:::-;83772:42:::1;83788:4;;83772:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;83794:19:0::1;::::0;-1:-1:-1;83772:15:0::1;::::0;-1:-1:-1;;83772:42:0:i:1;95805:278::-:0;95915:4;-1:-1:-1;;;70430:8:0;96012:3;:17;:32;96011:64;;;;-1:-1:-1;;96056:13:0;96050:19;:24;;95805:278::o;46640:131::-;45838:30;:28;:30::i;:::-;46730:4:::1;46718:16:::0;;-1:-1:-1;;46718:16:0::1;::::0;::::1;::::0;;46752:11:::1;::::0;::::1;::::0;46718:9:::1;::::0;46752:11:::1;46640:131::o:0;89073:1252::-;72421:27;:25;:27::i;:::-;89262:6:::1;72526:22;72541:6;72526:14;:22::i;:::-;-1:-1:-1::0;;;95418:17:0;;:22;89281:66:::2;;;::::0;-1:-1:-1;;;89281:66:0;;25100:2:1;89281:66:0::2;::::0;::::2;25082:21:1::0;25139:2;25119:18;;;25112:30;25178:34;25158:18;;;25151:62;25249:5;25229:18;;;25222:33;25272:19;;89281:66:0::2;24898:399:1::0;89281:66:0::2;89380:36:::0;;::::2;89358:110;;;::::0;-1:-1:-1;;;89358:110:0;;25504:2:1;89358:110:0::2;::::0;::::2;25486:21:1::0;25543:2;25523:18;;;25516:30;25582:26;25562:18;;;25555:54;25626:18;;89358:110:0::2;25302:348:1::0;89358:110:0::2;89486:9;89481:708;89501:16:::0;;::::2;89481:708;;;89539:10;89552:5;;89558:1;89552:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;89539:21;;89575:16;89594:13;;89608:1;89594:16;;;;;;;:::i;:::-;89673;::::0;;;:8:::2;89594:16;89673::::0;;;;;;;-1:-1:-1;;;;;89673:20:0;::::2;::::0;;;;;;:32;;89594:16;;;::::2;::::0;;;::::2;;::::0;-1:-1:-1;89594:16:0;;89673:20;-1:-1:-1;89673:16:0;:32:::2;::::0;89594:16;;89673:32:::2;:::i;:::-;::::0;;;-1:-1:-1;;89720:27:0::2;::::0;;;:19:::2;:27;::::0;;;;:39;;89751:8;;89720:27;:39:::2;::::0;89751:8;;89720:39:::2;:::i;:::-;::::0;;;-1:-1:-1;;89901:62:0::2;::::0;;23166:25:1;;;23222:2;23207:18;;23200:34;;;-1:-1:-1;;;;;89901:62:0;::::2;::::0;89936:3:::2;::::0;89916:10:::2;::::0;89901:62:::2;::::0;23139:18:1;89901:62:0::2;;;;;;;89980:197;90029:10;90058;90087:2;90108:6;90133:8;89980:197;;;;;;;;;;;::::0;:30:::2;:197::i;:::-;89524:665;;89519:3;;;;:::i;:::-;;;89481:708;;;-1:-1:-1::0;90252:24:0::2;::::0;;;:16:::2;:24;::::0;;;;;;;;90221:19:::2;:27:::0;;;;;;;:55:::2;;90199:118;;;::::0;-1:-1:-1;;;90199:118:0;;25857:2:1;90199:118:0::2;::::0;::::2;25839:21:1::0;25896:2;25876:18;;;25869:30;25935:15;25915:18;;;25908:43;25968:18;;90199:118:0::2;25655:337:1::0;90199:118:0::2;72459:1:::1;89073:1252:::0;;;;;:::o;87192:176::-;72421:27;:25;:27::i;:::-;87334:26:::1;:16;87353:7:::0;;87334:26:::1;:::i;83376:216::-:0;83513:7;72421:27;:25;:27::i;:::-;83545:39:::1;83561:4;;83545:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;-1:-1:-1;83545:39:0;-1:-1:-1;83545:15:0::1;::::0;-1:-1:-1;;83545:39:0:i:1;86765:419::-:0;72421:27;:25;:27::i;:::-;86990:7:::1;72061:22;72075:7;72061:13;:22::i;:::-;87024:10:::2;72167:28;72184:10;72167:16;:28::i;:::-;87060:10:::3;87072:25;72305:41;72321:10;72333:12;72305:15;:41::i;:::-;87158:10:::4;87149:7;87120:56;87170:5;;87120:56;;;;;;;:::i;91715:300::-:0;91819:7;91879:10;;91866:9;:23;;:41;;;;-1:-1:-1;91893:14:0;;;91866:41;91844:116;;;;-1:-1:-1;;;91844:116:0;;26932:2:1;91844:116:0;;;26914:21:1;26971:2;26951:18;;;26944:30;27010:27;26990:18;;;26983:55;27055:18;;91844:116:0;26730:349:1;91844:116:0;-1:-1:-1;91978:29:0;;;;:18;:29;;;;;;;91715:300::o;92023:1196::-;92134:16;92168:15;92211:1;92194:427;92219:10;;92214:1;:15;92194:427;;92274:3;92269:8;;;-1:-1:-1;;;92268:24:0;92251:14;92311:24;;;:16;:24;;;;;;:29;92307:303;;92378:1;92361:234;92386:27;;;;:19;:27;;;;;;92381:32;;92361:234;;92456:10;;;92443;92493:12;;;:8;:12;;;;;;-1:-1:-1;;;;;92493:21:0;;;:12;;:21;92489:87;;92543:9;;;;:::i;:::-;;;;92489:87;-1:-1:-1;92415:3:0;;;;:::i;:::-;;;;92361:234;;;;92307:303;-1:-1:-1;92231:3:0;;;;:::i;:::-;;;;92194:427;;;;92633:23;92673:7;92659:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;92659:22:0;-1:-1:-1;92702:1:0;;-1:-1:-1;92633:48:0;-1:-1:-1;92731:1:0;92714:474;92739:10;;92734:1;:15;92714:474;;92794:3;92789:8;;;-1:-1:-1;;;92788:24:0;92771:14;92831:24;;;:16;:24;;;;;;:29;92827:350;;92898:1;92881:281;92906:27;;;;:19;:27;;;;;;92901:32;;92881:281;;92976:10;;;92963;93013:12;;;:8;:12;;;;;;-1:-1:-1;;;;;93013:21:0;;;:12;;:21;93009:134;;93081:2;93063:6;93070:7;93063:15;;;;;;;;:::i;:::-;;;;;;;;;;:20;93110:9;;;;:::i;:::-;;;;93009:134;-1:-1:-1;92935:3:0;;;;:::i;:::-;;;;92881:281;;;;92827:350;-1:-1:-1;92751:3:0;;;;:::i;:::-;;;;92714:474;;;-1:-1:-1;93205:6:0;92023:1196;-1:-1:-1;;;92023:1196:0:o;78864:255::-;45656:16;:14;:16::i;:::-;79013:10:::1;78996:28;::::0;;;:16:::1;:28;::::0;;;;;;;-1:-1:-1;;;;;78996:39:0;::::1;::::0;;;;;;;;;;:51;;-1:-1:-1;;78996:51:0::1;::::0;::::1;;::::0;;::::1;::::0;;;79063:48;;1386:41:1;;;78996:39:0;;79013:10;79063:48:::1;::::0;1359:18:1;79063:48:0::1;;;;;;;78864:255:::0;;:::o;91202:218::-;91344:7;91318:6;72526:22;72541:6;72526:14;:22::i;:::-;-1:-1:-1;;91376:36:0::1;::::0;;;:28:::1;:36;::::0;;;;;;91202:218::o;46923:613::-;45740:20;:18;:20::i;:::-;47048:16:::1;:34:::0;;-1:-1:-1;;;;;47048:34:0;::::1;;;::::0;;;::::1;;::::0;;47112:19:::1;47847:16:::0;;-1:-1:-1;;;;;47847:16:0;;;;;;47760:111;47112:19:::1;:66;::::0;;;;47150:27:::1;47112:66;::::0;::::1;27228:98:1::0;-1:-1:-1;;;;;47112:37:0;;;::::1;::::0;::::1;::::0;27201:18:1;;47112:66:0::1;;;;;;;;;;;;;;;;;;-1:-1:-1::0;47112:66:0::1;::::0;;::::1;;::::0;;::::1;-1:-1:-1::0;;47112:66:0::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;47095:434;;47412:105;::::0;-1:-1:-1;;;47412:105:0;;27789:2:1;47412:105:0::1;::::0;::::1;27771:21:1::0;27828:2;27808:18;;;27801:30;27867:34;27847:18;;;27840:62;27938:33;27918:18;;;27911:61;27989:19;;47412:105:0::1;27587:427:1::0;47095:434:0::1;47262:17;47236:142;;;::::0;-1:-1:-1;;;47236:142:0;;27789:2:1;47236:142:0::1;::::0;::::1;27771:21:1::0;27828:2;27808:18;;;27801:30;27867:34;27847:18;;;27840:62;27938:33;27918:18;;;27911:61;27989:19;;47236:142:0::1;27587:427:1::0;47236:142:0::1;47188:202;47095:434;46923:613:::0;:::o;86351:406::-;72421:27;:25;:27::i;:::-;86571:7:::1;72061:22;72075:7;72061:13;:22::i;:::-;86605:10:::2;72167:28;72184:10;72167:16;:28::i;:::-;86641:10:::3;86653:21;72305:41;72321:10;72333:12;72305:15;:41::i;:::-;86731:10:::4;86722:7;86697:52;86743:5;;86697:52;;;;;;;:::i;47879:175::-:0;47847:16;;48018:28;;;;;;;;778:25:1;;;-1:-1:-1;;47847:16:0;;;-1:-1:-1;;;;;47847:16:0;;48018:23;;751:18:1;;48018:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;84522:234::-;84668:7;72421:27;:25;:27::i;:::-;84700:48:::1;84716:4;;84700:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;84722:25:0::1;::::0;-1:-1:-1;84700:15:0::1;::::0;-1:-1:-1;;84700:48:0:i:1;85152:398::-:0;72421:27;:25;:27::i;:::-;85368:7:::1;72061:22;72075:7;72061:13;:22::i;:::-;85402:10:::2;72167:28;72184:10;72167:16;:28::i;:::-;85438:10:::3;85450:19;72305:41;72321:10;72333:12;72305:15;:41::i;:::-;85524:10:::4;85515:7;85492:50;85536:5;;85492:50;;;;;;;:::i;81943:1425::-:0;72421:27;:25;:27::i;:::-;82238:16:::1;82257:50;82274:3;;82257:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;82257:50:0::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;-1:-1:-1;82279:6:0;;-1:-1:-1;82279:6:0;;;;82257:50;::::1;::::0;82279:6;;82257:50;82279:6;82257:50;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;82287:5:0;;-1:-1:-1;82294:12:0;;-1:-1:-1;82257:16:0::1;::::0;-1:-1:-1;82257:50:0:i:1;:::-;82238:69;;82442:6;-1:-1:-1::0;;;;;82340:108:0::1;82359:64;82373:38;82402:8;66450:58:::0;;31378:66:1;66450:58:0;;;31366:79:1;31461:12;;;31454:28;;;66281:7:0;;31498:12:1;;66450:58:0;;;;;;;;;;;;66422:101;;;;;;66402:121;;66185:346;;;;82373:38:::1;82413:9;82359:13;:64::i;:::-;-1:-1:-1::0;;;;;82340:108:0::1;;82318:176;;;::::0;-1:-1:-1;;;82318:176:0;;20047:2:1;82318:176:0::1;::::0;::::1;20029:21:1::0;20086:2;20066:18;;;20059:30;20125:20;20105:18;;;20098:48;20163:18;;82318:176:0::1;19845:342:1::0;82318:176:0::1;82513:27:::0;;::::1;82505:64;;;::::0;-1:-1:-1;;;82505:64:0;;25504:2:1;82505:64:0::1;::::0;::::1;25486:21:1::0;25543:2;25523:18;;;25516:30;25582:26;25562:18;;;25555:54;25626:18;;82505:64:0::1;25302:348:1::0;82505:64:0::1;82620:12;82602:15;:30;82580:118;;;::::0;-1:-1:-1;;;82580:118:0;;20394:2:1;82580:118:0::1;::::0;::::1;20376:21:1::0;20433:2;20413:18;;;20406:30;20472:34;20452:18;;;20445:62;-1:-1:-1;;;20523:18:1;;;20516:36;20569:19;;82580:118:0::1;20192:402:1::0;82580:118:0::1;-1:-1:-1::0;;;;;82731:26:0;::::1;;::::0;;;:18:::1;:26;::::0;;;;;:35;::::1;82709:123;;;::::0;-1:-1:-1;;;82709:123:0;;20801:2:1;82709:123:0::1;::::0;::::1;20783:21:1::0;20840:2;20820:18;;;20813:30;20879:34;20859:18;;;20852:62;-1:-1:-1;;;20930:18:1;;;20923:36;20976:19;;82709:123:0::1;20599:402:1::0;82709:123:0::1;-1:-1:-1::0;;;;;82843:26:0;::::1;;::::0;;;:18:::1;:26;::::0;;;;:28;;;::::1;::::0;::::1;:::i;:::-;;;;;;82914:9;82909:376;82929:14:::0;;::::1;82909:376;;;82965:10;82978:3;;82982:1;82978:6;;;;;;;:::i;:::-;;;;;;;82965:19;;83003:17;83017:2;-1:-1:-1::0;;;95283:17:0;;;:32;;95193:130;83003:17:::1;82999:275;;;83049:12;::::0;;;:8:::1;:12;::::0;;;;;-1:-1:-1;;;;;83049:22:0;;::::1;:12:::0;::::1;:22;83041:57;;;::::0;-1:-1:-1;;;83041:57:0;;29479:2:1;83041:57:0::1;::::0;::::1;29461:21:1::0;29518:2;29498:18;;;29491:30;29557:24;29537:18;;;29530:52;29599:18;;83041:57:0::1;29277:346:1::0;83041:57:0::1;83140:3;83117:12:::0;;;:8:::1;:12;::::0;;;;:27;;-1:-1:-1;;83117:27:0::1;::::0;;82999:275:::1;;;83185:13;83201:6;;83208:1;83201:9;;;;;;;:::i;:::-;;;;;;;83185:25;;83253:5;83229:8;:12;83238:2;83229:12;;;;;;;;;;;:20;83242:6;-1:-1:-1::0;;;;;83229:20:0::1;-1:-1:-1::0;;;;;83229:20:0::1;;;;;;;;;;;;;:29;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;82999:275:0::1;-1:-1:-1::0;82945:3:0::1;::::0;::::1;:::i;:::-;;;82909:376;;;;83342:3;-1:-1:-1::0;;;;;83300:60:0::1;83326:6;-1:-1:-1::0;;;;;83300:60:0::1;83314:10;-1:-1:-1::0;;;;;83300:60:0::1;;83348:3;;83353:6;;83300:60;;;;;;;;;:::i;:::-;;;;;;;;82198:1170;81943:1425:::0;;;;;;;;:::o;46779:136::-;45838:30;:28;:30::i;:::-;46859:9:::1;:17:::0;;-1:-1:-1;;46859:17:0::1;::::0;;46894:13:::1;::::0;::::1;::::0;46871:5:::1;::::0;46894:13:::1;46779:136::o:0;79127:1254::-;45656:16;:14;:16::i;:::-;-1:-1:-1;;;;;79330:19:0;::::1;79322:59;;;::::0;-1:-1:-1;;;79322:59:0;;22575:2:1;79322:59:0::1;::::0;::::1;22557:21:1::0;22614:2;22594:18;;;22587:30;22653:29;22633:18;;;22626:57;22700:18;;79322:59:0::1;22373:351:1::0;79322:59:0::1;-1:-1:-1::0;;;;;79414:19:0;::::1;79423:10;79414:19;::::0;:66:::1;;-1:-1:-1::0;;;;;;79437:23:0;::::1;;::::0;;;:16:::1;:23;::::0;;;;;;;79461:10:::1;79437:35:::0;;;;;;;;::::1;;:43;;:35:::0;:43:::1;79414:66;79392:163;;;::::0;-1:-1:-1;;;79392:163:0;;22159:2:1;79392:163:0::1;::::0;::::1;22141:21:1::0;22198:2;22178:18;;;22171:30;22237:34;22217:18;;;22210:62;-1:-1:-1;;;22288:18:1;;;22281:45;22343:19;;79392:163:0::1;21957:411:1::0;79392:163:0::1;-1:-1:-1::0;;;95283:17:0;;;:32;79568:561:::1;;79615:13;::::0;;;:8:::1;:13;::::0;;;;;-1:-1:-1;;;;;79615:22:0;;::::1;:13:::0;::::1;:22;79607:31;;;::::0;::::1;;79653:13;::::0;;;:8:::1;:13;::::0;;;;:19;;-1:-1:-1;;79653:19:0::1;-1:-1:-1::0;;;;;79653:19:0;::::1;;::::0;;79568:561:::1;;;80025:13;::::0;;;:8:::1;:13;::::0;;;;;;;-1:-1:-1;;;;;80025:20:0;::::1;::::0;;;;;;;;:29:::1;::::0;80048:6;;80025:29:::1;:::i;:::-;80002:13;::::0;;;:8:::1;:13;::::0;;;;;;;-1:-1:-1;;;;;80002:20:0;;::::1;::::0;;;;;;;:52;;;;80090:18;::::1;::::0;;;;:27:::1;::::0;80111:6;;80090:27:::1;:::i;:::-;80069:13;::::0;;;:8:::1;:13;::::0;;;;;;;-1:-1:-1;;;;;80069:18:0;::::1;::::0;;;;;;;:48;79568:561:::1;80146:51;::::0;;23166:25:1;;;23222:2;23207:18;;23200:34;;;-1:-1:-1;;;;;80146:51:0;;::::1;::::0;;;::::1;::::0;80161:10:::1;::::0;80146:51:::1;::::0;23139:18:1;80146:51:0::1;;;;;;;80210:163;80255:10;80280:5;80300:3;80318;80336:6;80357:5;;80210:163;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;80210:30:0::1;::::0;-1:-1:-1;;;80210:163:0:i:1;75608:2129::-:0;45656:16;:14;:16::i;:::-;75954:26:::1;75983:380;76011:317;76058:255;76114:6;76143:3;76169:4;;76058:255;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76196:7;;76058:255;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76226:5;;76058:255;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;76254:5:0;;-1:-1:-1;76282:12:0;;-1:-1:-1;76058:33:0::1;::::0;-1:-1:-1;76058:255:0:i:1;:::-;66450:58:::0;;31378:66:1;66450:58:0;;;31366:79:1;31461:12;;;31454:28;;;66281:7:0;;31498:12:1;;66450:58:0;;;;;;;;;;;;66422:101;;;;;;66402:121;;66185:346;;;;76011:317:::1;76343:9;75983:13;:380::i;:::-;75954:409;;76406:18;-1:-1:-1::0;;;;;76396:28:0::1;:6;-1:-1:-1::0;;;;;76396:28:0::1;;:101;;;-1:-1:-1::0;;;;;;76445:24:0;;::::1;;::::0;;;:16:::1;:24;::::0;;;;;;;:44;;::::1;::::0;;;;;;;::::1;;:52;;:44:::0;:52:::1;76396:101;76374:198;;;::::0;-1:-1:-1;;;76374:198:0;;22159:2:1;76374:198:0::1;::::0;::::1;22141:21:1::0;22198:2;22178:18;;;22171:30;22237:34;22217:18;;;22210:62;-1:-1:-1;;;22288:18:1;;;22281:45;22343:19;;76374:198:0::1;21957:411:1::0;76374:198:0::1;76591:29:::0;;::::1;76583:66;;;::::0;-1:-1:-1;;;76583:66:0;;25504:2:1;76583:66:0::1;::::0;::::1;25486:21:1::0;25543:2;25523:18;;;25516:30;25582:26;25562:18;;;25555:54;25626:18;;76583:66:0::1;25302:348:1::0;76583:66:0::1;76700:12;76682:15;:30;76660:118;;;::::0;-1:-1:-1;;;76660:118:0;;20394:2:1;76660:118:0::1;::::0;::::1;20376:21:1::0;20433:2;20413:18;;;20406:30;20472:34;20452:18;;;20445:62;-1:-1:-1;;;20523:18:1;;;20516:36;20569:19;;76660:118:0::1;20192:402:1::0;76660:118:0::1;-1:-1:-1::0;;;;;76811:26:0;::::1;;::::0;;;:18:::1;:26;::::0;;;;;:35;::::1;76789:123;;;::::0;-1:-1:-1;;;76789:123:0;;20801:2:1;76789:123:0::1;::::0;::::1;20783:21:1::0;20840:2;20820:18;;;20813:30;20879:34;20859:18;;;20852:62;-1:-1:-1;;;20930:18:1;;;20923:36;20976:19;;76789:123:0::1;20599:402:1::0;76789:123:0::1;-1:-1:-1::0;;;;;76923:26:0;::::1;;::::0;;;:18:::1;:26;::::0;;;;:28;;;::::1;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;76997:19:0;::::1;76989:59;;;::::0;-1:-1:-1;;;76989:59:0;;22575:2:1;76989:59:0::1;::::0;::::1;22557:21:1::0;22614:2;22594:18;;;22587:30;22653:29;22633:18;;;22626:57;22700:18;;76989:59:0::1;22373:351:1::0;76989:59:0::1;77067:29:::0;;::::1;77059:65;;;::::0;-1:-1:-1;;;77059:65:0;;23636:2:1;77059:65:0::1;::::0;::::1;23618:21:1::0;23675:2;23655:18;;;23648:30;23714:25;23694:18;;;23687:53;23757:18;;77059:65:0::1;23434:347:1::0;77059:65:0::1;77140:9;77135:344;77155:15:::0;;::::1;77135:344;;;77196:22;77210:4;;77215:1;77210:7;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;95283:17:0;;;:32;;95193:130;77196:22:::1;77192:276;;;77268:6;-1:-1:-1::0;;;;;77247:27:0::1;:8;:17;77256:4;;77261:1;77256:7;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;::::1;;77247:17:::0;;-1:-1:-1;77247:17:0;::::1;::::0;;;;;;-1:-1:-1;77247:17:0;;-1:-1:-1;;;;;77247:17:0::1;:27;77239:36;;;::::0;::::1;;77314:3;77294:8;:17;77303:4;;77308:1;77303:7;;;;;;;:::i;:::-;;;;;;;77294:17;;;;;;;;;;;;:23;;;;;-1:-1:-1::0;;;;;77294:23:0::1;;;;;-1:-1:-1::0;;;;;77294:23:0::1;;;;;;77192:276;;;77387:7;;77395:1;77387:10;;;;;;;:::i;:::-;;;;;;;77358:8;:17;77367:4;;77372:1;77367:7;;;;;;;:::i;:::-;;;;;;;77358:17;;;;;;;;;;;:25;77376:6;-1:-1:-1::0;;;;;77358:25:0::1;-1:-1:-1::0;;;;;77358:25:0::1;;;;;;;;;;;;;:39;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;77442:7:0;;-1:-1:-1;77442:7:0;77450:1;77442:10;;::::1;;;;;:::i;:::-;;;;;;;77416:8;:17;77425:4;;77430:1;77425:7;;;;;;;:::i;:::-;;;;;;;77416:17;;;;;;;;;;;:22;77434:3;-1:-1:-1::0;;;;;77416:22:0::1;-1:-1:-1::0;;;;;77416:22:0::1;;;;;;;;;;;;;:36;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;77192:276:0::1;77172:3;::::0;::::1;:::i;:::-;;;77135:344;;;;77528:3;-1:-1:-1::0;;;;;77494:53:0::1;77520:6;-1:-1:-1::0;;;;;77494:53:0::1;77508:10;-1:-1:-1::0;;;;;77494:53:0::1;;77533:4;;77539:7;;77494:53;;;;;;;;;:::i;:::-;;;;;;;;77558:171;77608:10;77633:6;77654:3;77672:4;;77558:171;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77691:7;;77558:171;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;77558:171:0::1;::::0;;::::1;;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;;;-1:-1:-1;77713:5:0;;-1:-1:-1;77713:5:0;;;;77558:171;::::1;77713:5:::0;;;;77558:171;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;77558:35:0::1;::::0;-1:-1:-1;;;77558:171:0:i:1;:::-;75914:1823;75608:2129:::0;;;;;;;;;;;:::o;88028:1037::-;72421:27;:25;:27::i;:::-;88188:6:::1;72526:22;72541:6;72526:14;:22::i;:::-;-1:-1:-1::0;;;95283:17:0;;;:32;88212:110:::2;;;::::0;-1:-1:-1;;;88212:110:0;;29830:2:1;88212:110:0::2;::::0;::::2;29812:21:1::0;29869:2;29849:18;;;29842:30;29908:34;29888:18;;;29881:62;29979:9;29959:18;;;29952:37;30006:19;;88212:110:0::2;29628:403:1::0;88212:110:0::2;88366:13;88382:27:::0;;;:19:::2;:27;::::0;;;;;:31:::2;::::0;88412:1:::2;88382:31;:::i;:::-;88424:27;::::0;;;:19:::2;:27;::::0;;;;:43;;88366:47;;-1:-1:-1;88455:5:0;;88424:27;;;:43:::2;::::0;88455:5;;88424:43:::2;:::i;:::-;::::0;;;-1:-1:-1;88485:9:0::2;::::0;-1:-1:-1;88480:449:0::2;88500:16:::0;;::::2;88480:449;;;88538:10;88551:5;;88557:1;88551:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;88538:21:::0;-1:-1:-1;88574:10:0::2;88597:9;88605:1:::0;88597:5;:9:::2;:::i;:::-;88587:20:::0;::::2;88624:12;::::0;;;:8:::2;:12;::::0;;;;;;;:17;;-1:-1:-1;;88624:17:0::2;-1:-1:-1::0;;;;;88624:17:0;::::2;::::0;;::::2;::::0;;;88663:51;;23166:25:1;;;-1:-1:-1;23207:18:1;;;23200:34;;;;88587:20:0;;-1:-1:-1;88678:10:0::2;::::0;88663:51:::2;::::0;23139:18:1;88663:51:0::2;;;;;;;88731:186;88780:10;88809;88838:2;88859;88880:1;88731:186;;;;;;;;;;;::::0;:30:::2;:186::i;:::-;88523:406;;88518:3;;;;:::i;:::-;;;88480:449;;;-1:-1:-1::0;88992:24:0::2;::::0;;;:16:::2;:24;::::0;;;;;;;;88961:19:::2;:27:::0;;;;;;;:55:::2;;88939:118;;;::::0;-1:-1:-1;;;88939:118:0;;25857:2:1;88939:118:0::2;::::0;::::2;25839:21:1::0;25896:2;25876:18;;;25869:30;25935:15;25915:18;;;25908:43;25968:18;;88939:118:0::2;25655:337:1::0;88939:118:0::2;88201:864;72459:1:::1;88028:1037:::0;;;:::o;48534:115::-;48593:9;;;;;:17;;;48585:56;;;;-1:-1:-1;;;48585:56:0;;30499:2:1;48585:56:0;;;30481:21:1;30538:2;30518:18;;;30511:30;30577:28;30557:18;;;30550:56;30623:18;;48585:56:0;30297:350:1;48585:56:0;48534:115::o;106713:322::-;106953:59;;-1:-1:-1;;30879:2:1;30875:15;;;30871:88;106953:59:0;;;30859:101:1;31006:14;;30999:22;30994:3;30990:32;30976:12;;;30969:54;31039:12;;;31032:28;;;31076:12;;;31069:28;;;106885:7:0;;31113:12:1;;106953:59:0;;;;;;;;;;;;;106925:102;;;;;;106905:122;;106713:322;;;;;;:::o;63435:793::-;63540:7;63608:9;:16;63628:2;63608:22;63604:96;;63647:41;;-1:-1:-1;;;63647:41:0;;31723:2:1;63647:41:0;;;31705:21:1;31762:2;31742:18;;;31735:30;31801:33;31781:18;;;31774:61;31852:18;;63647:41:0;31521:355:1;63604:96:0;64061:4;64046:20;;64040:27;64107:4;64092:20;;64086:27;64161:4;64146:20;;64140:27;63769:9;64132:36;64198:22;64206:4;64132:36;64040:27;64086;64198:7;:22::i;:::-;64191:29;63435:793;-1:-1:-1;;;;;;63435:793:0:o;99778:222::-;99887:10;99862:21;99881:1;99862:18;:21::i;:::-;-1:-1:-1;;;;;99862:35:0;;99840:152;;;;-1:-1:-1;;;99840:152:0;;32083:2:1;99840:152:0;;;32065:21:1;32122:2;32102:18;;;32095:30;32161:34;32141:18;;;32134:62;32232:34;32212:18;;;32205:62;32304:5;32283:19;;;32276:34;32327:19;;99840:152:0;31881:471:1;99190:388:0;99322:15;:17;;99297:7;;;99322:17;;;:::i;:::-;;;;-1:-1:-1;;99433:15:0;;99407:42;;;;:25;:42;;;;;;;;:57;;99452:12;;-1:-1:-1;;99407:57:0;;;;;;99452:12;;99407:57;;;;;;;:::i;:::-;;;;;;99522:12;99482:53;;;;;;;;:::i;:::-;;99499:15;;99516:4;99482:53;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;99555:15:0;;99190:388;;;;:::o;100183:137::-;100256:24;;;;:16;:24;;;;;;:29;;100248:64;;;;-1:-1:-1;;;100248:64:0;;32855:2:1;100248:64:0;;;32837:21:1;32894:2;32874:18;;;32867:30;32933:24;32913:18;;;32906:52;32975:18;;100248:64:0;32653:346:1;97730:340:0;-1:-1:-1;;;95283:17:0;;;:32;97795:268;;97893:3;97864:17;;;:8;:17;;;;;;-1:-1:-1;;;;;97864:17:0;97838:118;;;;-1:-1:-1;;;97838:118:0;;33206:2:1;97838:118:0;;;33188:21:1;33245:2;33225:18;;;33218:30;33284:25;33264:18;;;33257:53;33327:18;;97838:118:0;33004:347:1;97795:268:0;97997:21;98010:7;97997:12;:21::i;:::-;98022:1;97997:26;97989:62;;;;-1:-1:-1;;;97989:62:0;;33206:2:1;97989:62:0;;;33188:21:1;33245:2;33225:18;;;33218:30;33284:25;33264:18;;;33257:53;33327:18;;97989:62:0;33004:347:1;98211:204:0;98318:15;;98304:10;:29;;:48;;;;-1:-1:-1;98337:15:0;;;98304:48;98282:125;;;;-1:-1:-1;;;98282:125:0;;33558:2:1;98282:125:0;;;33540:21:1;33597:2;33577:18;;;33570:30;33636:29;33616:18;;;33609:57;33683:18;;98282:125:0;33356:351:1;98665:286:0;98848:12;98807:53;;;;;;;;:::i;:::-;:37;;;;:25;:37;;;;;;;;;;;;:53;;;;;;;:::i;:::-;;98785:158;;;;-1:-1:-1;;;98785:158:0;;33914:2:1;98785:158:0;;;33896:21:1;33953:2;33933:18;;;33926:30;33992:34;33972:18;;;33965:62;34063:25;34043:18;;;34036:53;34106:19;;98785:158:0;33712:419:1;61780:621:0;61860:27;61909:2;61915:1;61909:7;61905:50;;-1:-1:-1;;61933:10:0;;;;;;;;;;;;;;;;;;61780:621::o;61905:50::-;61977:2;61965:9;62012:69;62019:6;;62012:69;;62042:5;;;;:::i;:::-;;-1:-1:-1;62062:7:0;;-1:-1:-1;62067:2:0;62062:7;;:::i;:::-;;;62012:69;;;62091:17;62121:3;62111:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;62111:14:0;-1:-1:-1;62091:34:0;-1:-1:-1;62148:3:0;62162:202;62169:7;;62162:202;;62197:5;62201:1;62197;:5;:::i;:::-;62193:9;-1:-1:-1;62217:10:0;62248:7;62253:2;62248;:7;:::i;:::-;62247:14;;62259:2;62247:14;:::i;:::-;62242:19;;:2;:19;:::i;:::-;62231:31;;:2;:31;:::i;:::-;62217:46;;62278:9;62297:4;62290:12;;62278:24;;62327:2;62317:4;62322:1;62317:7;;;;;;;;:::i;:::-;;;;:12;-1:-1:-1;;;;;62317:12:0;;;;;;;;-1:-1:-1;62344:8:0;62350:2;62344:8;;:::i;:::-;;;62178:186;;62162:202;;;-1:-1:-1;62388:4:0;61780:621;-1:-1:-1;;;;61780:621:0:o;59953:200::-;60058:33;60116:29;60126:2;60130;60116:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:9;:29::i;104175:572::-;104420:7;104527:6;104556:3;104582;104608:6;104637:5;104665;104693:12;104488:236;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;104460:279;;;;;;104440:299;;104175:572;;;;;;;;;:::o;107534:1024::-;-1:-1:-1;;;;;107750:13:0;;51153:20;51201:8;107746:805;;107803:201;;-1:-1:-1;;;107803:201:0;;-1:-1:-1;;;;;107803:43:0;;;;;:201;;107869:8;;107900:4;;107927:2;;107952:6;;107981:4;;107803:201;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;107803:201:0;;;;;;;;-1:-1:-1;;107803:201:0;;;;;;;;;;;;:::i;:::-;;;107782:758;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;108368:6;108361:14;;-1:-1:-1;;;108361:14:0;;;;;;;;:::i;107782:758::-;;;108417:107;;-1:-1:-1;;;108417:107:0;;37524:2:1;108417:107:0;;;37506:21:1;37563:2;37543:18;;;37536:30;37602:34;37582:18;;;37575:62;37673:27;37653:18;;;37646:55;37718:19;;108417:107:0;37322:421:1;107782:758:0;108089:85;;;-1:-1:-1;;;108089:85:0;108063:229;;108217:55;;-1:-1:-1;;;108217:55:0;;37950:2:1;108217:55:0;;;37932:21:1;37989:2;37969:18;;;37962:30;38028:34;38008:18;;;38001:62;38099:15;38079:18;;;38072:43;38132:19;;108217:55:0;37748:409:1;108063:229:0;108018:289;107534:1024;;;;;;:::o;102040:542::-;102146:9;102159:1;102146:14;102124:128;;;;;-1:-1:-1;;;102124:128:0;;38364:2:1;102124:128:0;;;38346:21:1;38383:18;;;38376:30;;;;38442:34;38422:18;;;38415:62;38513:34;38493:18;;;38486:62;38565:19;;102124:128:0;38162:428:1;102124:128:0;102285:36;;;;:28;:36;;;;;;:41;;:116;;-1:-1:-1;102347:36:0;;;;:28;:36;;;;;;102386:15;-1:-1:-1;102285:116:0;102263:197;;;;-1:-1:-1;;;102263:197:0;;38797:2:1;102263:197:0;;;38779:21:1;38836:2;38816:18;;;38809:30;38875:33;38855:18;;;38848:61;38926:18;;102263:197:0;38595:355:1;102263:197:0;102471:36;;;;:28;:36;;;;;;;:48;;;102537:37;102500:6;;102537:37;;;;102510:9;778:25:1;;766:2;751:18;;632:177;102537:37:0;;;;;;;;102040:542;;:::o;109084:1011::-;-1:-1:-1;;;;;109325:13:0;;51153:20;51201:8;109321:767;;109378:208;;-1:-1:-1;;;109378:208:0;;-1:-1:-1;;;;;109378:48:0;;;;;:208;;109449:8;;109480:4;;109507:3;;109533:7;;109563:4;;109378:208;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;109378:208:0;;;;;;;;-1:-1:-1;;109378:208:0;;;;;;;;;;;;:::i;:::-;;;109357:720;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;109999:62;;-1:-1:-1;;;109999:62:0;;40034:2:1;109999:62:0;;;40016:21:1;40073:2;40053:18;;;40046:30;40112:34;40092:18;;;40085:62;40183:22;40163:18;;;40156:50;40223:19;;109999:62:0;39832:416:1;109357:720:0;109671:90;;;-1:-1:-1;;;109671:90:0;109645:229;;109804:50;;-1:-1:-1;;;109804:50:0;;40455:2:1;109804:50:0;;;40437:21:1;40494:2;40474:18;;;40467:30;40533:34;40513:18;;;40506:62;40604:10;40584:18;;;40577:38;40632:19;;109804:50:0;40253:404:1;100950:727:0;101014:7;101056:14;;;;;:46;;;70022:6;101074:9;:28;;101056:46;101034:154;;;;-1:-1:-1;;;101034:154:0;;40864:2:1;101034:154:0;;;40846:21:1;40903:2;40883:18;;;40876:30;40942:34;40922:18;;;40915:62;41013:28;40993:18;;;40986:56;41059:19;;101034:154:0;40662:422:1;101034:154:0;101250:14;101284:3;101270:10;;101268:12;;;;;:::i;:::-;;;;;-1:-1:-1;101268:19:0;;;-1:-1:-1;101343:39:0;;;;-1:-1:-1;;;101362:20:0;101343:39;101395:24;;;;:16;:24;;;;;;;;:36;;;101461:10;;101442:30;;:18;:30;;;;;:39;;;101578:65;;23166:25:1;;;23207:18;;;23200:34;;;101395:24:0;;101593:10;;101578:65;;23139:18:1;101578:65:0;;;;;;;101663:6;100950:727;-1:-1:-1;;;100950:727:0:o;49063:226::-;49164:16;;;;;-1:-1:-1;;;;;49164:16:0;49150:10;:30;;:86;;;49215:21;49234:1;49215:18;:21::i;:::-;-1:-1:-1;;;;;49201:35:0;:10;-1:-1:-1;;;;;49201:35:0;;49150:86;49128:153;;;;-1:-1:-1;;;49128:153:0;;41552:2:1;49128:153:0;;;41534:21:1;41591:2;41571:18;;;41564:30;41630:19;41610:18;;;41603:47;41667:18;;49128:153:0;41350:341:1;48776:128:0;48853:21;48872:1;48853:18;:21::i;103167:271::-;103342:7;103396:3;103401:6;103409:5;103416:12;103379:50;;;;;;;;;;;:::i;105504:599::-;105774:7;105881:6;105910:3;105936:4;105963:7;105993:5;106021;106049:12;105842:238;;;;;;;;;;;;;;:::i;64382:1529::-;64510:7;65466:66;65435:97;;;65413:181;;;;-1:-1:-1;;;65413:181:0;;43761:2:1;65413:181:0;;;43743:21:1;43800:2;43780:18;;;43773:30;43839:34;43819:18;;;43812:62;-1:-1:-1;;;43890:18:1;;;43883:32;43932:19;;65413:181:0;43559:398:1;65413:181:0;65613:1;:7;;65618:2;65613:7;:18;;;;65624:1;:7;;65629:2;65624:7;65613:18;65605:65;;;;-1:-1:-1;;;65605:65:0;;44164:2:1;65605:65:0;;;44146:21:1;44203:2;44183:18;;;44176:30;44242:34;44222:18;;;44215:62;-1:-1:-1;;;44293:18:1;;;44286:32;44335:19;;65605:65:0;43962:398:1;65605:65:0;65785:24;;;65768:14;65785:24;;;;;;;;;44592:25:1;;;44665:4;44653:17;;44633:18;;;44626:45;;;;44687:18;;;44680:34;;;44730:18;;;44723:34;;;65785:24:0;;44564:19:1;;65785:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;65785:24:0;;-1:-1:-1;;65785:24:0;;;-1:-1:-1;;;;;;;65828:20:0;;65820:57;;;;-1:-1:-1;;;65820:57:0;;44970:2:1;65820:57:0;;;44952:21:1;45009:2;44989:18;;;44982:30;45048:26;45028:18;;;45021:54;45092:18;;65820:57:0;44768:348:1;65820:57:0;65897:6;64382:1529;-1:-1:-1;;;;;64382:1529:0:o;60644:1128::-;61168:10;;61155;;61142;;61129;;61116;;60828:33;;60899:2;;60938;;60977;;61016;;61055;;60874:16;;61168:10;;61155;;61142;;61116:23;;61129:10;61116:23;:::i;:::-;:36;;;;:::i;:::-;:49;;;;:::i;:::-;:62;;;;:::i;:::-;61091:98;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61091:98:0;-1:-1:-1;61069:120:0;-1:-1:-1;61069:120:0;61200:19;;61293:80;61309:3;:10;61305:1;:14;61293:80;;;61355:3;61359:1;61355:6;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;61355:6:0;61341;61348:3;;;;:::i;:::-;;;61341:11;;;;;;;;:::i;:::-;;;;:20;-1:-1:-1;;;;;61341:20:0;;;;;;;;-1:-1:-1;61321:3:0;;;;:::i;:::-;;;;61293:80;;;-1:-1:-1;61392:1:0;61383:80;61399:3;:10;61395:1;:14;61383:80;;;61445:3;61449:1;61445:6;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;61445:6:0;61431;61438:3;;;;:::i;:::-;;;61431:11;;;;;;;;:::i;:::-;;;;:20;-1:-1:-1;;;;;61431:20:0;;;;;;;;-1:-1:-1;61411:3:0;;;;:::i;:::-;;;;61383:80;;;-1:-1:-1;61482:1:0;61473:80;61489:3;:10;61485:1;:14;61473:80;;;61535:3;61539:1;61535:6;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;61535:6:0;61521;61528:3;;;;:::i;:::-;;;61521:11;;;;;;;;:::i;:::-;;;;:20;-1:-1:-1;;;;;61521:20:0;;;;;;;;-1:-1:-1;61501:3:0;;;;:::i;:::-;;;;61473:80;;;-1:-1:-1;61572:1:0;61563:80;61579:3;:10;61575:1;:14;61563:80;;;61625:3;61629:1;61625:6;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;61625:6:0;61611;61618:3;;;;:::i;:::-;;;61611:11;;;;;;;;:::i;:::-;;;;:20;-1:-1:-1;;;;;61611:20:0;;;;;;;;-1:-1:-1;61591:3:0;;;;:::i;:::-;;;;61563:80;;;-1:-1:-1;61662:1:0;61653:80;61669:3;:10;61665:1;:14;61653:80;;;61715:3;61719:1;61715:6;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;61715:6:0;61701;61708:3;;;;:::i;:::-;;;61701:11;;;;;;;;:::i;:::-;;;;:20;-1:-1:-1;;;;;61701:20:0;;;;;;;;-1:-1:-1;61681:3:0;;;;:::i;:::-;;;;61653:80;;;-1:-1:-1;61757:6:0;;60644:1128;-1:-1:-1;;;;;;;;;;;;;60644:1128:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:154:1;-1:-1:-1;;;;;93:5:1;89:54;82:5;79:65;69:93;;158:1;155;148:12;173:134;241:20;;270:31;241:20;270:31;:::i;:::-;173:134;;;:::o;312:315::-;380:6;388;441:2;429:9;420:7;416:23;412:32;409:52;;;457:1;454;447:12;409:52;496:9;483:23;515:31;540:5;515:31;:::i;:::-;565:5;617:2;602:18;;;;589:32;;-1:-1:-1;;;312:315:1:o;814:177::-;899:66;892:5;888:78;881:5;878:89;868:117;;981:1;978;971:12;996:245;1054:6;1107:2;1095:9;1086:7;1082:23;1078:32;1075:52;;;1123:1;1120;1113:12;1075:52;1162:9;1149:23;1181:30;1205:5;1181:30;:::i;1438:184::-;-1:-1:-1;;;1487:1:1;1480:88;1587:4;1584:1;1577:15;1611:4;1608:1;1601:15;1627:249;1737:2;1718:13;;-1:-1:-1;;1714:27:1;1702:40;;1772:18;1757:34;;1793:22;;;1754:62;1751:88;;;1819:18;;:::i;:::-;1855:2;1848:22;-1:-1:-1;;1627:249:1:o;1881:555::-;1923:5;1976:3;1969:4;1961:6;1957:17;1953:27;1943:55;;1994:1;1991;1984:12;1943:55;2030:6;2017:20;2056:18;2052:2;2049:26;2046:52;;;2078:18;;:::i;:::-;2127:2;2121:9;2139:67;2194:2;2175:13;;-1:-1:-1;;2171:27:1;2200:4;2167:38;2121:9;2139:67;:::i;:::-;2230:2;2222:6;2215:18;2276:3;2269:4;2264:2;2256:6;2252:15;2248:26;2245:35;2242:55;;;2293:1;2290;2283:12;2242:55;2357:2;2350:4;2342:6;2338:17;2331:4;2323:6;2319:17;2306:54;2404:1;2380:15;;;2397:4;2376:26;2369:37;;;;2384:6;1881:555;-1:-1:-1;;;1881:555:1:o;2441:118::-;2527:5;2520:13;2513:21;2506:5;2503:32;2493:60;;2549:1;2546;2539:12;2564:870;2674:6;2682;2690;2698;2706;2714;2767:3;2755:9;2746:7;2742:23;2738:33;2735:53;;;2784:1;2781;2774:12;2735:53;2824:9;2811:23;2857:18;2849:6;2846:30;2843:50;;;2889:1;2886;2879:12;2843:50;2912:49;2953:7;2944:6;2933:9;2929:22;2912:49;:::i;:::-;2902:59;;;3011:2;3000:9;2996:18;2983:32;3024:31;3049:5;3024:31;:::i;:::-;3074:5;-1:-1:-1;3131:2:1;3116:18;;3103:32;3144:33;3103:32;3144:33;:::i;:::-;3196:7;-1:-1:-1;3255:2:1;3240:18;;3227:32;3268:30;3227:32;3268:30;:::i;:::-;2564:870;;;;-1:-1:-1;2564:870:1;;3371:3;3356:19;;3343:33;;3423:3;3408:19;;;3395:33;;-1:-1:-1;2564:870:1;-1:-1:-1;;2564:870:1:o;3439:348::-;3491:8;3501:6;3555:3;3548:4;3540:6;3536:17;3532:27;3522:55;;3573:1;3570;3563:12;3522:55;-1:-1:-1;3596:20:1;;3639:18;3628:30;;3625:50;;;3671:1;3668;3661:12;3625:50;3708:4;3700:6;3696:17;3684:29;;3760:3;3753:4;3744:6;3736;3732:19;3728:30;3725:39;3722:59;;;3777:1;3774;3767:12;3722:59;3439:348;;;;;:::o;3792:411::-;3863:6;3871;3924:2;3912:9;3903:7;3899:23;3895:32;3892:52;;;3940:1;3937;3930:12;3892:52;3980:9;3967:23;4013:18;4005:6;4002:30;3999:50;;;4045:1;4042;4035:12;3999:50;4084:59;4135:7;4126:6;4115:9;4111:22;4084:59;:::i;:::-;4162:8;;4058:85;;-1:-1:-1;3792:411:1;-1:-1:-1;;;;3792:411:1:o;4208:180::-;4267:6;4320:2;4308:9;4299:7;4295:23;4291:32;4288:52;;;4336:1;4333;4326:12;4288:52;-1:-1:-1;4359:23:1;;4208:180;-1:-1:-1;4208:180:1:o;4393:315::-;4469:6;4477;4485;4538:2;4526:9;4517:7;4513:23;4509:32;4506:52;;;4554:1;4551;4544:12;4506:52;-1:-1:-1;;4577:23:1;;;4647:2;4632:18;;4619:32;;-1:-1:-1;4698:2:1;4683:18;;;4670:32;;4393:315;-1:-1:-1;4393:315:1:o;4713:258::-;4785:1;4795:113;4809:6;4806:1;4803:13;4795:113;;;4885:11;;;4879:18;4866:11;;;4859:39;4831:2;4824:10;4795:113;;;4926:6;4923:1;4920:13;4917:48;;;4961:1;4952:6;4947:3;4943:16;4936:27;4917:48;;4713:258;;;:::o;4976:::-;5018:3;5056:5;5050:12;5083:6;5078:3;5071:19;5099:63;5155:6;5148:4;5143:3;5139:14;5132:4;5125:5;5121:16;5099:63;:::i;:::-;5216:2;5195:15;-1:-1:-1;;5191:29:1;5182:39;;;;5223:4;5178:50;;4976:258;-1:-1:-1;;4976:258:1:o;5239:220::-;5388:2;5377:9;5370:21;5351:4;5408:45;5449:2;5438:9;5434:18;5426:6;5408:45;:::i;5464:1182::-;5606:6;5614;5622;5630;5638;5646;5654;5662;5670;5723:3;5711:9;5702:7;5698:23;5694:33;5691:53;;;5740:1;5737;5730:12;5691:53;5780:9;5767:23;5809:18;5850:2;5842:6;5839:14;5836:34;;;5866:1;5863;5856:12;5836:34;5889:49;5930:7;5921:6;5910:9;5906:22;5889:49;:::i;:::-;5879:59;;5988:2;5977:9;5973:18;5960:32;5947:45;;6001:31;6026:5;6001:31;:::i;:::-;6051:5;;-1:-1:-1;6108:2:1;6093:18;;6080:32;;6121:33;6080:32;6121:33;:::i;:::-;6173:7;;-1:-1:-1;6227:2:1;6212:18;;6199:32;;-1:-1:-1;6278:3:1;6263:19;;6250:33;;-1:-1:-1;6336:3:1;6321:19;;6308:33;;6353:16;;;6350:36;;;6382:1;6379;6372:12;6350:36;;6421:61;6474:7;6463:8;6452:9;6448:24;6421:61;:::i;:::-;5464:1182;;;;-1:-1:-1;5464:1182:1;;;;;;6395:87;;6583:3;6568:19;;6555:33;;6635:3;6620:19;;;6607:33;;-1:-1:-1;5464:1182:1;-1:-1:-1;;;;5464:1182:1:o;6651:247::-;6710:6;6763:2;6751:9;6742:7;6738:23;6734:32;6731:52;;;6779:1;6776;6769:12;6731:52;6818:9;6805:23;6837:31;6862:5;6837:31;:::i;6903:446::-;6967:3;7005:5;6999:12;7032:6;7027:3;7020:19;7058:4;7087:2;7082:3;7078:12;7071:19;;7124:2;7117:5;7113:14;7145:1;7155:169;7169:6;7166:1;7163:13;7155:169;;;7230:13;;7218:26;;7264:12;;;;7299:15;;;;7191:1;7184:9;7155:169;;;-1:-1:-1;7340:3:1;;6903:446;-1:-1:-1;;;;;6903:446:1:o;7354:487::-;7611:2;7600:9;7593:21;7574:4;7637:67;7700:2;7689:9;7685:18;7677:6;7637:67;:::i;:::-;7752:9;7744:6;7740:22;7735:2;7724:9;7720:18;7713:50;7780:55;7828:6;7820;7780:55;:::i;7846:248::-;7914:6;7922;7975:2;7963:9;7954:7;7950:23;7946:32;7943:52;;;7991:1;7988;7981:12;7943:52;-1:-1:-1;;8014:23:1;;;8084:2;8069:18;;;8056:32;;-1:-1:-1;7846:248:1:o;8099:367::-;8162:8;8172:6;8226:3;8219:4;8211:6;8207:17;8203:27;8193:55;;8244:1;8241;8234:12;8193:55;-1:-1:-1;8267:20:1;;8310:18;8299:30;;8296:50;;;8342:1;8339;8332:12;8296:50;8379:4;8371:6;8367:17;8355:29;;8439:3;8432:4;8422:6;8419:1;8415:14;8407:6;8403:27;8399:38;8396:47;8393:67;;;8456:1;8453;8446:12;8471:1339;8631:6;8639;8647;8655;8663;8671;8679;8687;8740:3;8728:9;8719:7;8715:23;8711:33;8708:53;;;8757:1;8754;8747:12;8708:53;8796:9;8783:23;8815:31;8840:5;8815:31;:::i;:::-;8865:5;-1:-1:-1;8922:2:1;8907:18;;8894:32;8935:33;8894:32;8935:33;:::i;:::-;8987:7;-1:-1:-1;9045:2:1;9030:18;;9017:32;9068:18;9098:14;;;9095:34;;;9125:1;9122;9115:12;9095:34;9164:70;9226:7;9217:6;9206:9;9202:22;9164:70;:::i;:::-;9253:8;;-1:-1:-1;9138:96:1;-1:-1:-1;9341:2:1;9326:18;;9313:32;;-1:-1:-1;9357:16:1;;;9354:36;;;9386:1;9383;9376:12;9354:36;9425:72;9489:7;9478:8;9467:9;9463:24;9425:72;:::i;:::-;9516:8;;-1:-1:-1;9399:98:1;-1:-1:-1;9604:3:1;9589:19;;9576:33;;-1:-1:-1;9621:16:1;;;9618:36;;;9650:1;9647;9640:12;9618:36;;9689:61;9742:7;9731:8;9720:9;9716:24;9689:61;:::i;:::-;8471:1339;;;;-1:-1:-1;8471:1339:1;;-1:-1:-1;8471:1339:1;;;;;;9769:8;-1:-1:-1;;;8471:1339:1:o;10136:773::-;10258:6;10266;10274;10282;10335:2;10323:9;10314:7;10310:23;10306:32;10303:52;;;10351:1;10348;10341:12;10303:52;10391:9;10378:23;10420:18;10461:2;10453:6;10450:14;10447:34;;;10477:1;10474;10467:12;10447:34;10516:70;10578:7;10569:6;10558:9;10554:22;10516:70;:::i;:::-;10605:8;;-1:-1:-1;10490:96:1;-1:-1:-1;10693:2:1;10678:18;;10665:32;;-1:-1:-1;10709:16:1;;;10706:36;;;10738:1;10735;10728:12;10706:36;;10777:72;10841:7;10830:8;10819:9;10815:24;10777:72;:::i;:::-;10136:773;;;;-1:-1:-1;10868:8:1;-1:-1:-1;;;;10136:773:1:o;10914:272::-;11093:2;11082:9;11075:21;11056:4;11113:67;11176:2;11165:9;11161:18;11153:6;11113:67;:::i;11422:184::-;-1:-1:-1;;;11471:1:1;11464:88;11571:4;11568:1;11561:15;11595:4;11592:1;11585:15;11611:401;11759:2;11744:18;;11792:1;11781:13;;11771:201;;-1:-1:-1;;;11825:1:1;11818:88;11929:4;11926:1;11919:15;11957:4;11954:1;11947:15;11771:201;11981:25;;;11611:401;:::o;12017:383::-;12094:6;12102;12110;12163:2;12151:9;12142:7;12138:23;12134:32;12131:52;;;12179:1;12176;12169:12;12131:52;12215:9;12202:23;12192:33;;12272:2;12261:9;12257:18;12244:32;12234:42;;12326:2;12315:9;12311:18;12298:32;12339:31;12364:5;12339:31;:::i;:::-;12389:5;12379:15;;;12017:383;;;;;:::o;12405:841::-;12536:6;12544;12552;12560;12568;12621:2;12609:9;12600:7;12596:23;12592:32;12589:52;;;12637:1;12634;12627:12;12589:52;12673:9;12660:23;12650:33;;12734:2;12723:9;12719:18;12706:32;12757:18;12798:2;12790:6;12787:14;12784:34;;;12814:1;12811;12804:12;12784:34;12853:70;12915:7;12906:6;12895:9;12891:22;12853:70;:::i;:::-;12942:8;;-1:-1:-1;12827:96:1;-1:-1:-1;13030:2:1;13015:18;;13002:32;;-1:-1:-1;13046:16:1;;;13043:36;;;13075:1;13072;13065:12;13043:36;;13114:72;13178:7;13167:8;13156:9;13152:24;13114:72;:::i;:::-;12405:841;;;;-1:-1:-1;12405:841:1;;-1:-1:-1;13205:8:1;;13088:98;12405:841;-1:-1:-1;;;12405:841:1:o;13251:573::-;13355:6;13363;13371;13379;13432:2;13420:9;13411:7;13407:23;13403:32;13400:52;;;13448:1;13445;13438:12;13400:52;13484:9;13471:23;13461:33;;13541:2;13530:9;13526:18;13513:32;13503:42;;13596:2;13585:9;13581:18;13568:32;13623:18;13615:6;13612:30;13609:50;;;13655:1;13652;13645:12;13609:50;13694:70;13756:7;13747:6;13736:9;13732:22;13694:70;:::i;13829:382::-;13894:6;13902;13955:2;13943:9;13934:7;13930:23;13926:32;13923:52;;;13971:1;13968;13961:12;13923:52;14010:9;13997:23;14029:31;14054:5;14029:31;:::i;:::-;14079:5;-1:-1:-1;14136:2:1;14121:18;;14108:32;14149:30;14108:32;14149:30;:::i;:::-;14198:7;14188:17;;;13829:382;;;;;:::o;14793:547::-;14882:6;14890;14898;14906;14959:2;14947:9;14938:7;14934:23;14930:32;14927:52;;;14975:1;14972;14965:12;14927:52;15011:9;14998:23;14988:33;;15068:2;15057:9;15053:18;15040:32;15030:42;;15123:2;15112:9;15108:18;15095:32;15150:18;15142:6;15139:30;15136:50;;;15182:1;15179;15172:12;15136:50;15221:59;15272:7;15263:6;15252:9;15248:22;15221:59;:::i;15345:1245::-;15512:6;15520;15528;15536;15544;15552;15560;15568;15621:3;15609:9;15600:7;15596:23;15592:33;15589:53;;;15638:1;15635;15628:12;15589:53;15678:9;15665:23;15707:18;15748:2;15740:6;15737:14;15734:34;;;15764:1;15761;15754:12;15734:34;15787:49;15828:7;15819:6;15808:9;15804:22;15787:49;:::i;:::-;15777:59;;15886:2;15875:9;15871:18;15858:32;15845:45;;15899:31;15924:5;15899:31;:::i;:::-;15949:5;;-1:-1:-1;16007:2:1;15992:18;;15979:32;;16023:16;;;16020:36;;;16052:1;16049;16042:12;16020:36;16091:72;16155:7;16144:8;16133:9;16129:24;16091:72;:::i;:::-;16182:8;;-1:-1:-1;16065:98:1;-1:-1:-1;16270:2:1;16255:18;;16242:32;;-1:-1:-1;16286:16:1;;;16283:36;;;16315:1;16312;16305:12;16283:36;;16354:72;16418:7;16407:8;16396:9;16392:24;16354:72;:::i;:::-;15345:1245;;;;-1:-1:-1;15345:1245:1;;;;16445:8;;16527:3;16512:19;;16499:33;;16579:3;16564:19;16551:33;;-1:-1:-1;15345:1245:1;-1:-1:-1;;;;15345:1245:1:o;16595:388::-;16663:6;16671;16724:2;16712:9;16703:7;16699:23;16695:32;16692:52;;;16740:1;16737;16730:12;16692:52;16779:9;16766:23;16798:31;16823:5;16798:31;:::i;:::-;16848:5;-1:-1:-1;16905:2:1;16890:18;;16877:32;16918:33;16877:32;16918:33;:::i;16988:824::-;17094:6;17102;17110;17118;17126;17134;17187:3;17175:9;17166:7;17162:23;17158:33;17155:53;;;17204:1;17201;17194:12;17155:53;17243:9;17230:23;17262:31;17287:5;17262:31;:::i;:::-;17312:5;-1:-1:-1;17369:2:1;17354:18;;17341:32;17382:33;17341:32;17382:33;:::i;:::-;17434:7;-1:-1:-1;17488:2:1;17473:18;;17460:32;;-1:-1:-1;17539:2:1;17524:18;;17511:32;;-1:-1:-1;17594:3:1;17579:19;;17566:33;17622:18;17611:30;;17608:50;;;17654:1;17651;17644:12;17608:50;17693:59;17744:7;17735:6;17724:9;17720:22;17693:59;:::i;:::-;16988:824;;;;-1:-1:-1;16988:824:1;;-1:-1:-1;16988:824:1;;17771:8;;16988:824;-1:-1:-1;;;16988:824:1:o;17817:1513::-;18013:6;18021;18029;18037;18045;18053;18061;18069;18077;18085;18093:7;18147:3;18135:9;18126:7;18122:23;18118:33;18115:53;;;18164:1;18161;18154:12;18115:53;18187:18;18245:2;18233:9;18220:23;18217:31;18214:51;;;18261:1;18258;18251:12;18214:51;18284:66;18342:7;18329:9;18316:23;18305:9;18301:39;18284:66;:::i;:::-;18274:76;;18369:38;18403:2;18392:9;18388:18;18369:38;:::i;:::-;18359:48;;18426:38;18460:2;18449:9;18445:18;18426:38;:::i;:::-;18416:48;;18513:2;18507;18496:9;18492:18;18479:32;18476:40;18473:60;;;18529:1;18526;18519:12;18473:60;18568:96;18656:7;18649:2;18638:9;18634:18;18621:32;18610:9;18606:48;18568:96;:::i;:::-;18683:8;;-1:-1:-1;18710:8:1;-1:-1:-1;18761:3:1;18746:19;;18733:33;18730:41;-1:-1:-1;18727:61:1;;;18784:1;18781;18774:12;18727:61;18823:97;18912:7;18904:3;18893:9;18889:19;18876:33;18865:9;18861:49;18823:97;:::i;:::-;18939:8;;-1:-1:-1;18966:8:1;-1:-1:-1;19017:3:1;19002:19;;18989:33;18986:41;-1:-1:-1;18983:61:1;;;19040:1;19037;19030:12;18983:61;;19079:86;19157:7;19149:3;19138:9;19134:19;19121:33;19110:9;19106:49;19079:86;:::i;:::-;17817:1513;;;;-1:-1:-1;17817:1513:1;;;;;;;;;;19184:8;;19211;19266:3;19251:19;;19238:33;;19319:3;19304:19;19291:33;;-1:-1:-1;17817:1513:1;-1:-1:-1;;;17817:1513:1:o;19335:505::-;19430:6;19438;19446;19499:2;19487:9;19478:7;19474:23;19470:32;19467:52;;;19515:1;19512;19505:12;19467:52;19551:9;19538:23;19528:33;;19612:2;19601:9;19597:18;19584:32;19639:18;19631:6;19628:30;19625:50;;;19671:1;19668;19661:12;19625:50;19710:70;19772:7;19763:6;19752:9;19748:22;19710:70;:::i;:::-;19335:505;;19799:8;;-1:-1:-1;19684:96:1;;-1:-1:-1;;;;19335:505:1:o;21006:184::-;-1:-1:-1;;;21055:1:1;21048:88;21155:4;21152:1;21145:15;21179:4;21176:1;21169:15;21195:135;21234:3;21255:17;;;21252:43;;21275:18;;:::i;:::-;-1:-1:-1;21322:1:1;21311:13;;21195:135::o;21515:437::-;21594:1;21590:12;;;;21637;;;21658:61;;21712:4;21704:6;21700:17;21690:27;;21658:61;21765:2;21757:6;21754:14;21734:18;21731:38;21728:218;;-1:-1:-1;;;21799:1:1;21792:88;21903:4;21900:1;21893:15;21931:4;21928:1;21921:15;22729:125;22769:4;22797:1;22794;22791:8;22788:34;;;22802:18;;:::i;:::-;-1:-1:-1;22839:9:1;;22729:125::o;22859:128::-;22899:3;22930:1;22926:6;22923:1;22920:13;22917:39;;;22936:18;;:::i;:::-;-1:-1:-1;22972:9:1;;22859:128::o;23245:184::-;-1:-1:-1;;;23294:1:1;23287:88;23394:4;23391:1;23384:15;23418:4;23415:1;23408:15;23786:401;23886:6;23881:3;23874:19;23856:3;23916:66;23908:6;23905:78;23902:98;;;23996:1;23993;23986:12;23902:98;24032:6;24029:1;24025:14;24084:8;24077:5;24070:4;24065:3;24061:14;24048:45;24161:1;24116:18;;24136:4;24112:29;24150:13;;;-1:-1:-1;24112:29:1;;23786:401;-1:-1:-1;;23786:401:1:o;24192:519::-;24469:2;24458:9;24451:21;24432:4;24495:73;24564:2;24553:9;24549:18;24541:6;24533;24495:73;:::i;:::-;24616:9;24608:6;24604:22;24599:2;24588:9;24584:18;24577:50;24644:61;24698:6;24690;24682;24644:61;:::i;:::-;24636:69;24192:519;-1:-1:-1;;;;;;;24192:519:1:o;25997:728::-;26178:2;26230:21;;;26203:18;;;26286:22;;;26149:4;;26365:6;26339:2;26324:18;;26149:4;26399:300;26413:6;26410:1;26407:13;26399:300;;;26488:6;26475:20;26508:31;26533:5;26508:31;:::i;:::-;-1:-1:-1;;;;;26564:54:1;26552:67;;26674:15;;;;26639:12;;;;26435:1;26428:9;26399:300;;;-1:-1:-1;26716:3:1;25997:728;-1:-1:-1;;;;;;25997:728:1:o;27337:245::-;27404:6;27457:2;27445:9;27436:7;27432:23;27428:32;27425:52;;;27473:1;27470;27463:12;27425:52;27505:9;27499:16;27524:28;27546:5;27524:28;:::i;28019:602::-;28198:2;28250:21;;;28223:18;;;28306:22;;;28169:4;;28385:6;28359:2;28344:18;;28169:4;28419:176;28433:6;28430:1;28427:13;28419:176;;;28494:20;;28482:33;;28570:15;;;;28535:12;;;;28455:1;28448:9;28419:176;;28626:251;28696:6;28749:2;28737:9;28728:7;28724:23;28720:32;28717:52;;;28765:1;28762;28755:12;28717:52;28797:9;28791:16;28816:31;28841:5;28816:31;:::i;28882:390::-;29041:2;29030:9;29023:21;29080:6;29075:2;29064:9;29060:18;29053:34;29137:6;29129;29124:2;29113:9;29109:18;29096:48;29193:1;29164:22;;;29188:2;29160:31;;;29153:42;;;;29256:2;29235:15;;;-1:-1:-1;;29231:29:1;29216:45;29212:54;;28882:390;-1:-1:-1;28882:390:1:o;32357:291::-;32534:6;32523:9;32516:25;32577:2;32572;32561:9;32557:18;32550:30;32497:4;32597:45;32638:2;32627:9;32623:18;32615:6;32597:45;:::i;:::-;32589:53;32357:291;-1:-1:-1;;;;32357:291:1:o;34136:274::-;34176:1;34202;34192:189;;-1:-1:-1;;;34234:1:1;34227:88;34338:4;34335:1;34328:15;34366:4;34363:1;34356:15;34192:189;-1:-1:-1;34395:9:1;;34136:274::o;34415:168::-;34455:7;34521:1;34517;34513:6;34509:14;34506:1;34503:21;34498:1;34491:9;34484:17;34480:45;34477:71;;;34528:18;;:::i;:::-;-1:-1:-1;34568:9:1;;34415:168::o;34588:204::-;34626:3;34662:4;34659:1;34655:12;34694:4;34691:1;34687:12;34729:3;34723:4;34719:14;34714:3;34711:23;34708:49;;;34737:18;;:::i;:::-;34773:13;;34588:204;-1:-1:-1;;;34588:204:1:o;34797:817::-;35094:3;-1:-1:-1;;35230:2:1;35221:6;35217:2;35213:15;35209:24;35204:3;35197:37;35285:2;35276:6;35272:2;35268:15;35264:24;35259:2;35254:3;35250:12;35243:46;;35319:6;35314:2;35309:3;35305:12;35298:28;35356:6;35351:2;35346:3;35342:12;35335:28;35392:6;35386:13;35408:63;35464:6;35458:3;35453;35449:13;35442:4;35434:6;35430:17;35408:63;:::i;:::-;35490:16;;;35530:3;35522:12;;35515:28;;;;-1:-1:-1;35567:3:1;35559:12;;35552:28;35604:3;35596:12;;;-1:-1:-1;;;;;34797:817:1:o;35619:584::-;35841:4;-1:-1:-1;;;;;35951:2:1;35943:6;35939:15;35928:9;35921:34;36003:2;35995:6;35991:15;35986:2;35975:9;35971:18;35964:43;;36043:6;36038:2;36027:9;36023:18;36016:34;36086:6;36081:2;36070:9;36066:18;36059:34;36130:3;36124;36113:9;36109:19;36102:32;36151:46;36192:3;36181:9;36177:19;36169:6;36151:46;:::i;36208:249::-;36277:6;36330:2;36318:9;36309:7;36305:23;36301:32;36298:52;;;36346:1;36343;36336:12;36298:52;36378:9;36372:16;36397:30;36421:5;36397:30;:::i;36462:179::-;36497:3;36539:1;36521:16;36518:23;36515:120;;;36585:1;36582;36579;36564:23;-1:-1:-1;36622:1:1;36616:8;36611:3;36607:18;36515:120;36462:179;:::o;36646:671::-;36685:3;36727:4;36709:16;36706:26;36703:39;;;36646:671;:::o;36703:39::-;36769:2;36763:9;-1:-1:-1;;36834:16:1;36830:25;;36827:1;36763:9;36806:50;36885:4;36879:11;36909:16;36944:18;37015:2;37008:4;37000:6;36996:17;36993:25;36988:2;36980:6;36977:14;36974:45;36971:58;;;37022:5;;;;;36646:671;:::o;36971:58::-;37059:6;37053:4;37049:17;37038:28;;37095:3;37089:10;37122:2;37114:6;37111:14;37108:27;;;37128:5;;;;;;36646:671;:::o;37108:27::-;37212:2;37193:16;37187:4;37183:27;37179:36;37172:4;37163:6;37158:3;37154:16;37150:27;37147:69;37144:82;;;37219:5;;;;;;36646:671;:::o;37144:82::-;37235:57;37286:4;37277:6;37269;37265:19;37261:30;37255:4;37235:57;:::i;:::-;-1:-1:-1;37308:3:1;;36646:671;-1:-1:-1;;;;;36646:671:1:o;38955:872::-;39277:4;-1:-1:-1;;;;;39387:2:1;39379:6;39375:15;39364:9;39357:34;39439:2;39431:6;39427:15;39422:2;39411:9;39407:18;39400:43;;39479:3;39474:2;39463:9;39459:18;39452:31;39506:68;39569:3;39558:9;39554:19;39546:6;39506:68;:::i;:::-;39622:9;39614:6;39610:22;39605:2;39594:9;39590:18;39583:50;39656:55;39704:6;39696;39656:55;:::i;:::-;39642:69;;39760:9;39752:6;39748:22;39742:3;39731:9;39727:19;39720:51;39788:33;39814:6;39806;39788:33;:::i;:::-;39780:41;38955:872;-1:-1:-1;;;;;;;;38955:872:1:o;41696:398::-;41781:12;;41749:3;;41831:4;41858:14;;;41749:3;41908:13;;41900:169;;41975:13;;41963:26;;42009:12;;;;42044:15;;;;41936:1;41929:9;41900:169;;42099:510;42394:3;42425:79;42462:41;42499:3;42491:6;42462:41;:::i;:::-;42454:6;42425:79;:::i;:::-;42513:21;;;-1:-1:-1;;42561:2:1;42550:14;;42543:30;42600:2;42589:14;;42099:510;-1:-1:-1;;42099:510:1:o;42614:940::-;43011:3;-1:-1:-1;;43147:2:1;43138:6;43134:2;43130:15;43126:24;43121:3;43114:37;43202:2;43193:6;43189:2;43185:15;43181:24;43176:2;43171:3;43167:12;43160:46;;43225:88;43262:50;43308:2;43303:3;43299:12;43291:6;43262:50;:::i;:::-;43254:6;43225:88;:::i;:::-;43342:6;43336:13;43358:52;43403:6;43399:2;43392:4;43384:6;43380:17;43358:52;:::i;:::-;43432:15;43456:21;;;-1:-1:-1;;43504:4:1;43493:16;;43486:32;43545:2;43534:14;;42614:940;-1:-1:-1;;;;;42614:940:1:o
Swarm Source
ipfs://2c6fcdf77fd149f38aa1de58f981c360792199843617d22f495b6fb5c4385e64